Blender  V3.3
hair.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #ifndef __HAIR_H__
5 #define __HAIR_H__
6 
7 #include "scene/geometry.h"
8 
10 
11 struct KernelCurveSegment;
12 
13 class Hair : public Geometry {
14  public:
16 
17  /* Hair Curve */
18  struct Curve {
19  int first_key;
20  int num_keys;
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(float4 keys[4], BoundBox &bounds) const;
32  void bounds_grow(const int k,
33  const float3 *curve_keys,
34  const float *curve_radius,
35  const Transform &aligned_space,
36  BoundBox &bounds) const;
37 
38  void motion_keys(const float3 *curve_keys,
39  const float *curve_radius,
40  const float3 *key_steps,
41  size_t num_curve_keys,
42  size_t num_steps,
43  float time,
44  size_t k0,
45  size_t k1,
46  float4 r_keys[2]) const;
47  void cardinal_motion_keys(const float3 *curve_keys,
48  const float *curve_radius,
49  const float3 *key_steps,
50  size_t num_curve_keys,
51  size_t num_steps,
52  float time,
53  size_t k0,
54  size_t k1,
55  size_t k2,
56  size_t k3,
57  float4 r_keys[4]) const;
58 
59  void keys_for_step(const float3 *curve_keys,
60  const float *curve_radius,
61  const float3 *key_steps,
62  size_t num_curve_keys,
63  size_t num_steps,
64  size_t step,
65  size_t k0,
66  size_t k1,
67  float4 r_keys[2]) const;
68  void cardinal_keys_for_step(const float3 *curve_keys,
69  const float *curve_radius,
70  const float3 *key_steps,
71  size_t num_curve_keys,
72  size_t num_steps,
73  size_t step,
74  size_t k0,
75  size_t k1,
76  size_t k2,
77  size_t k3,
78  float4 r_keys[4]) const;
79  };
80 
82  NODE_SOCKET_API_ARRAY(array<float>, curve_radius)
83  NODE_SOCKET_API_ARRAY(array<int>, curve_first_key)
84  NODE_SOCKET_API_ARRAY(array<int>, curve_shader)
85 
86  /* BVH */
90 
91  /* Constructor/Destructor */
92  Hair();
93  ~Hair();
94 
95  /* Geometry */
96  void clear(bool preserve_shaders = false) override;
97 
98  void resize_curves(int numcurves, int numkeys);
99  void reserve_curves(int numcurves, int numkeys);
100  void add_curve_key(float3 loc, float radius);
101  void add_curve(int first_key, int shader);
102 
103  void copy_center_to_motion_step(const int motion_step);
104 
105  void compute_bounds() override;
106  void apply_transform(const Transform &tfm, const bool apply_to_motion) override;
107 
108  /* Curves */
109  Curve get_curve(size_t i) const
110  {
111  int first = curve_first_key[i];
112  int next_first = (i + 1 < curve_first_key.size()) ? curve_first_key[i + 1] : curve_keys.size();
113 
114  Curve curve = {first, next_first - first};
115  return curve;
116  }
117 
118  size_t num_keys() const
119  {
120  return curve_keys.size();
121  }
122 
123  size_t num_curves() const
124  {
125  return curve_first_key.size();
126  }
127 
128  size_t num_segments() const
129  {
130  return curve_keys.size() - curve_first_key.size();
131  }
132 
133  /* UDIM */
134  void get_uv_tiles(ustring map, unordered_set<int> &tiles) override;
135 
136  /* BVH */
137  void pack_curves(Scene *scene,
138  float4 *curve_key_co,
140  KernelCurveSegment *curve_segments);
141 
142  PrimitiveType primitive_type() const override;
143 
144  /* Attributes */
146  bool update_shadow_transparency(Device *device, Scene *scene, Progress &progress);
147 };
148 
150 
151 #endif /* __HAIR_H__ */
float float4[4]
BoundBox bounds
int motion_step(float time) const
Definition: hair.h:13
void resize_curves(int numcurves, int numkeys)
Definition: hair.cpp:299
void add_curve(int first_key, int shader)
Definition: hair.cpp:340
Curve get_curve(size_t i) const
Definition: hair.h:109
bool need_shadow_transparency()
Definition: hair.cpp:554
void compute_bounds() override
Definition: hair.cpp:375
size_t curve_key_offset
Definition: hair.h:87
void reserve_curves(int numcurves, int numkeys)
Definition: hair.cpp:309
size_t curve_segment_offset
Definition: hair.h:88
size_t num_curves() const
Definition: hair.h:123
bool update_shadow_transparency(Device *device, Scene *scene, Progress &progress)
Definition: hair.cpp:566
void get_uv_tiles(ustring map, unordered_set< int > &tiles) override
Definition: hair.cpp:359
void copy_center_to_motion_step(const int motion_step)
Definition: hair.cpp:349
void pack_curves(Scene *scene, float4 *curve_key_co, KernelCurve *curve, KernelCurveSegment *curve_segments)
Definition: hair.cpp:459
size_t num_segments() const
Definition: hair.h:128
CurveShapeType curve_shape
Definition: hair.h:89
void clear(bool preserve_shaders=false) override
Definition: hair.cpp:319
size_t num_keys() const
Definition: hair.h:118
void apply_transform(const Transform &tfm, const bool apply_to_motion) override
Definition: hair.cpp:418
PrimitiveType primitive_type() const override
Definition: hair.cpp:501
void add_curve_key(float3 loc, float radius)
Definition: hair.cpp:331
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
double time
Scene scene
Curve curve
#define NODE_SOCKET_API_ARRAY(type_, name)
Definition: graph/node.h:62
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
PrimitiveType
Definition: kernel/types.h:549
CurveShapeType
Definition: kernel/types.h:581
SocketIndexByIdentifierMap * map
#define NODE_DECLARE
Definition: node_type.h:135
int first_key
Definition: hair.h:19
void keys_for_step(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, size_t step, size_t k0, size_t k1, float4 r_keys[2]) const
Definition: hair.cpp:171
void cardinal_motion_keys(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, float time, size_t k0, size_t k1, size_t k2, size_t k3, float4 r_keys[4]) const
Definition: hair.cpp:123
int num_segments() const
Definition: hair.h:22
void cardinal_keys_for_step(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, size_t step, size_t k0, size_t k1, size_t k2, size_t k3, float4 r_keys[4]) const
Definition: hair.cpp:215
int num_keys
Definition: hair.h:20
void motion_keys(const float3 *curve_keys, const float *curve_radius, const float3 *key_steps, size_t num_curve_keys, size_t num_steps, float time, size_t k0, size_t k1, float4 r_keys[2]) const
Definition: hair.cpp:97
void bounds_grow(const int k, const float3 *curve_keys, const float *curve_radius, BoundBox &bounds) const
Definition: hair.cpp:19
bool override
Definition: wm_files.c:1022