Blender V5.0
hair.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include "scene/geometry.h"
8
10
12
13class Hair : public Geometry {
14 public:
16
17 /* Hair Curve */
18 struct Curve {
21
22 int num_segments() const
23 {
24 return num_keys - 1;
25 }
26
27 void bounds_grow(const int k,
28 const float3 *curve_keys,
29 const float *curve_radius,
30 BoundBox &bounds) const;
31 void bounds_grow(const int k, const float4 *keys, BoundBox &bounds) const;
32 void bounds_grow(const float4 keys[4], BoundBox &bounds) const;
33 void bounds_grow(const float3 keys[4], BoundBox &bounds) const;
34 void bounds_grow(const int k,
35 const float3 *curve_keys,
36 const float *curve_radius,
37 const Transform &aligned_space,
38 BoundBox &bounds) const;
39
40 void motion_keys(const float3 *curve_keys,
41 const float *curve_radius,
42 const float4 *key_steps,
43 const size_t num_curve_keys,
44 const size_t num_steps,
45 const float time,
46 size_t k0,
47 size_t k1,
48 float4 r_keys[2]) const;
49 void cardinal_motion_keys(const float3 *curve_keys,
50 const float *curve_radius,
51 const float4 *key_steps,
52 const size_t num_curve_keys,
53 const size_t num_steps,
54 const float time,
55 size_t k0,
56 size_t k1,
57 size_t k2,
58 size_t k3,
59 float4 r_keys[4]) const;
60
61 void keys_for_step(const float3 *curve_keys,
62 const float *curve_radius,
63 const float4 *key_steps,
64 const size_t num_curve_keys,
65 const size_t num_steps,
66 const size_t step,
67 size_t k0,
68 size_t k1,
69 float4 r_keys[2]) const;
70 void cardinal_keys_for_step(const float3 *curve_keys,
71 const float *curve_radius,
72 const float4 *key_steps,
73 const size_t num_curve_keys,
74 const size_t num_steps,
75 const size_t step,
76 size_t k0,
77 size_t k1,
78 size_t k2,
79 size_t k3,
80 float4 r_keys[4]) const;
81 };
82
85 NODE_SOCKET_API_ARRAY(array<int>, curve_first_key)
87
88 /* BVH */
92
93 /* Constructor/Destructor */
94 Hair();
96
97 /* Geometry */
98 void clear(bool preserve_shaders = false) override;
99
100 void resize_curves(const int numcurves, const int numkeys);
101 void reserve_curves(const int numcurves, const int numkeys);
102 void add_curve_key(const float3 co, const float radius);
103 void add_curve(const int first_key, const int shader);
104
106
108 void apply_transform(const Transform &tfm, const bool apply_to_motion) override;
109
110 /* Curves */
111 Curve get_curve(const size_t i) const
112 {
113 const int first = curve_first_key[i];
114 const int next_first = (i + 1 < curve_first_key.size()) ? curve_first_key[i + 1] :
115 curve_keys.size();
116
117 Curve curve = {first, next_first - first};
118 return curve;
119 }
120
121 size_t num_keys() const
122 {
123 return curve_keys.size();
124 }
125
126 size_t num_curves() const
127 {
128 return curve_first_key.size();
129 }
130
131 size_t num_segments() const
132 {
133 return curve_keys.size() - curve_first_key.size();
134 }
135
136 bool is_traceable() const
137 {
138 return num_segments() > 0;
139 }
140
141 /* UDIM */
142 void get_uv_tiles(ustring map, unordered_set<int> &tiles) override;
143
144 /* BVH */
145 void pack_curves(Scene *scene,
146 float4 *curve_key_co,
147 KernelCurve *curve,
148 KernelCurveSegment *curve_segments);
149
150 PrimitiveType primitive_type() const override;
151
152 /* Attributes */
154 bool update_shadow_transparency(Device *device, Scene *scene, Progress &progress);
155};
156
int motion_step(const float time) const
BoundBox bounds
Geometry(const NodeType *node_type, const Type type)
bool is_traceable() const
Definition hair.h:136
void add_curve_key(const float3 co, const float radius)
Definition hair.cpp:333
bool need_shadow_transparency()
Definition hair.cpp:585
Curve get_curve(const size_t i) const
Definition hair.h:111
void compute_bounds() override
Definition hair.cpp:377
size_t curve_key_offset
Definition hair.h:89
size_t curve_segment_offset
Definition hair.h:90
void add_curve(const int first_key, const int shader)
Definition hair.cpp:342
size_t num_curves() const
Definition hair.h:126
bool update_shadow_transparency(Device *device, Scene *scene, Progress &progress)
Definition hair.cpp:601
void get_uv_tiles(ustring map, unordered_set< int > &tiles) override
Definition hair.cpp:361
void copy_center_to_motion_step(const int motion_step)
Definition hair.cpp:351
void resize_curves(const int numcurves, const int numkeys)
Definition hair.cpp:301
void pack_curves(Scene *scene, float4 *curve_key_co, KernelCurve *curve, KernelCurveSegment *curve_segments)
Definition hair.cpp:486
size_t num_segments() const
Definition hair.h:131
CurveShapeType curve_shape
Definition hair.h:91
void clear(bool preserve_shaders=false) override
Definition hair.cpp:321
size_t num_keys() const
Definition hair.h:121
void apply_transform(const Transform &tfm, const bool apply_to_motion) override
Definition hair.cpp:445
PrimitiveType primitive_type() const override
Definition hair.cpp:529
Hair()
Definition hair.cpp:292
void reserve_curves(const int numcurves, const int numkeys)
Definition hair.cpp:311
#define CCL_NAMESPACE_END
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
#define NODE_SOCKET_API_ARRAY(type_, name)
Definition graph/node.h:63
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
PrimitiveType
CurveShapeType
#define NODE_DECLARE
Definition node_type.h:145
void bounds_grow(const int k, const float3 *curve_keys, const float *curve_radius, BoundBox &bounds) const
Definition hair.cpp:44
void cardinal_motion_keys(const float3 *curve_keys, const float *curve_radius, const float4 *key_steps, const size_t num_curve_keys, const size_t num_steps, const float time, size_t k0, size_t k1, size_t k2, size_t k3, float4 r_keys[4]) const
Definition hair.cpp:148
void bounds_grow(const float3 keys[4], BoundBox &bounds) const
void cardinal_keys_for_step(const float3 *curve_keys, const float *curve_radius, const float4 *key_steps, const size_t num_curve_keys, const size_t num_steps, const size_t step, size_t k0, size_t k1, size_t k2, size_t k3, float4 r_keys[4]) const
Definition hair.cpp:231
int first_key
Definition hair.h:19
void motion_keys(const float3 *curve_keys, const float *curve_radius, const float4 *key_steps, const size_t num_curve_keys, const size_t num_steps, const float time, size_t k0, size_t k1, float4 r_keys[2]) const
Definition hair.cpp:122
void keys_for_step(const float3 *curve_keys, const float *curve_radius, const float4 *key_steps, const size_t num_curve_keys, const size_t num_steps, const size_t step, size_t k0, size_t k1, float4 r_keys[2]) const
Definition hair.cpp:196
int num_segments() const
Definition hair.h:22
int num_keys
Definition hair.h:20
i
Definition text_draw.cc:230
bool override
Definition wm_files.cc:1192