Blender V4.3
geom/point.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
6
7/* Point Primitive
8 *
9 * Point primitive for rendering point clouds.
10 */
11
12#ifdef __POINTCLOUD__
13
14/* Reading attributes on various point elements */
15
16ccl_device float point_attribute_float(KernelGlobals kg,
17 ccl_private const ShaderData *sd,
18 const AttributeDescriptor desc,
19 ccl_private float *dx,
20 ccl_private float *dy)
21{
22# ifdef __RAY_DIFFERENTIALS__
23 if (dx)
24 *dx = 0.0f;
25 if (dy)
26 *dy = 0.0f;
27# endif
28
29 if (desc.element == ATTR_ELEMENT_VERTEX) {
30 return kernel_data_fetch(attributes_float, desc.offset + sd->prim);
31 }
32 else {
33 return 0.0f;
34 }
35}
36
37ccl_device float2 point_attribute_float2(KernelGlobals kg,
38 ccl_private const ShaderData *sd,
39 const AttributeDescriptor desc,
42{
43# ifdef __RAY_DIFFERENTIALS__
44 if (dx)
45 *dx = make_float2(0.0f, 0.0f);
46 if (dy)
47 *dy = make_float2(0.0f, 0.0f);
48# endif
49
50 if (desc.element == ATTR_ELEMENT_VERTEX) {
51 return kernel_data_fetch(attributes_float2, desc.offset + sd->prim);
52 }
53 else {
54 return make_float2(0.0f, 0.0f);
55 }
56}
57
58ccl_device float3 point_attribute_float3(KernelGlobals kg,
59 ccl_private const ShaderData *sd,
60 const AttributeDescriptor desc,
63{
64# ifdef __RAY_DIFFERENTIALS__
65 if (dx)
66 *dx = make_float3(0.0f, 0.0f, 0.0f);
67 if (dy)
68 *dy = make_float3(0.0f, 0.0f, 0.0f);
69# endif
70
71 if (desc.element == ATTR_ELEMENT_VERTEX) {
72 return kernel_data_fetch(attributes_float3, desc.offset + sd->prim);
73 }
74 else {
75 return make_float3(0.0f, 0.0f, 0.0f);
76 }
77}
78
79ccl_device float4 point_attribute_float4(KernelGlobals kg,
80 ccl_private const ShaderData *sd,
81 const AttributeDescriptor desc,
82 ccl_private float4 *dx,
83 ccl_private float4 *dy)
84{
85# ifdef __RAY_DIFFERENTIALS__
86 if (dx)
87 *dx = zero_float4();
88 if (dy)
89 *dy = zero_float4();
90# endif
91
92 if (desc.element == ATTR_ELEMENT_VERTEX) {
93 return kernel_data_fetch(attributes_float4, desc.offset + sd->prim);
94 }
95 else {
96 return zero_float4();
97 }
98}
99
100/* Point position */
101
102ccl_device float3 point_position(KernelGlobals kg, ccl_private const ShaderData *sd)
103{
104 if (sd->type & PRIMITIVE_POINT) {
105 /* World space center. */
106 float3 P = (sd->type & PRIMITIVE_MOTION) ?
107 float4_to_float3(motion_point(kg, sd->object, sd->prim, sd->time)) :
108 float4_to_float3(kernel_data_fetch(points, sd->prim));
109
110 if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
112 }
113
114 return P;
115 }
116
117 return zero_float3();
118}
119
120/* Point radius */
121
122ccl_device float point_radius(KernelGlobals kg, ccl_private const ShaderData *sd)
123{
124 if (sd->type & PRIMITIVE_POINT) {
125 /* World space radius. */
126 const float r = kernel_data_fetch(points, sd->prim).w;
127
128 if (sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED) {
129 return r;
130 }
131 else {
132 const float normalized_r = r * (1.0f / M_SQRT3_F);
133 float3 dir = make_float3(normalized_r, normalized_r, normalized_r);
134 object_dir_transform(kg, sd, &dir);
135 return len(dir);
136 }
137 }
138
139 return 0.0f;
140}
141
142/* Point random */
143
144ccl_device float point_random(KernelGlobals kg, ccl_private const ShaderData *sd)
145{
146 if (sd->type & PRIMITIVE_POINT) {
148 return (desc.offset != ATTR_STD_NOT_FOUND) ? point_attribute_float(kg, sd, desc, NULL, NULL) :
149 0.0f;
150 }
151 return 0.0f;
152}
153
154/* Point location for motion pass, linear interpolation between keys and
155 * ignoring radius because we do the same for the motion keys */
156
157ccl_device float3 point_motion_center_location(KernelGlobals kg, ccl_private const ShaderData *sd)
158{
159 return float4_to_float3(kernel_data_fetch(points, sd->prim));
160}
161
162#endif /* __POINTCLOUD__ */
163
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device
#define ccl_private
#define CCL_NAMESPACE_END
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
#define NULL
ccl_device_forceinline float2 make_float2(const float x, const float y)
int len
ccl_device_inline void object_position_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *P)
ccl_device_inline void object_dir_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *D)
@ PRIMITIVE_MOTION
@ PRIMITIVE_POINT
@ ATTR_STD_NOT_FOUND
@ ATTR_STD_POINT_RANDOM
ShaderData
@ SD_OBJECT_TRANSFORM_APPLIED
@ ATTR_ELEMENT_VERTEX
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
Definition math_float3.h:15
CCL_NAMESPACE_BEGIN ccl_device_inline float4 zero_float4()
Definition math_float4.h:15
VecBase< float, 4 > float4
static bool find_attribute(const std::string &attributes, const char *search_attribute)
AttributeElement element
ccl_device_inline float3 float4_to_float3(const float4 a)
Definition util/math.h:535