Blender  V3.3
point.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Licensed under the Apache License, Version 2.0 (the "License"); */
3 
5 
6 /* Point Primitive
7  *
8  * Point primitive for rendering point clouds.
9  */
10 
11 #ifdef __POINTCLOUD__
12 
13 /* Reading attributes on various point elements */
14 
15 ccl_device float point_attribute_float(KernelGlobals kg,
16  ccl_private const ShaderData *sd,
17  const AttributeDescriptor desc,
18  ccl_private float *dx,
19  ccl_private float *dy)
20 {
21 # ifdef __RAY_DIFFERENTIALS__
22  if (dx)
23  *dx = 0.0f;
24  if (dy)
25  *dy = 0.0f;
26 # endif
27 
28  if (desc.element == ATTR_ELEMENT_VERTEX) {
29  return kernel_data_fetch(attributes_float, desc.offset + sd->prim);
30  }
31  else {
32  return 0.0f;
33  }
34 }
35 
36 ccl_device float2 point_attribute_float2(KernelGlobals kg,
37  ccl_private const ShaderData *sd,
38  const AttributeDescriptor desc,
39  ccl_private float2 *dx,
40  ccl_private float2 *dy)
41 {
42 # ifdef __RAY_DIFFERENTIALS__
43  if (dx)
44  *dx = make_float2(0.0f, 0.0f);
45  if (dy)
46  *dy = make_float2(0.0f, 0.0f);
47 # endif
48 
49  if (desc.element == ATTR_ELEMENT_VERTEX) {
50  return kernel_data_fetch(attributes_float2, desc.offset + sd->prim);
51  }
52  else {
53  return make_float2(0.0f, 0.0f);
54  }
55 }
56 
57 ccl_device float3 point_attribute_float3(KernelGlobals kg,
58  ccl_private const ShaderData *sd,
59  const AttributeDescriptor desc,
60  ccl_private float3 *dx,
61  ccl_private float3 *dy)
62 {
63 # ifdef __RAY_DIFFERENTIALS__
64  if (dx)
65  *dx = make_float3(0.0f, 0.0f, 0.0f);
66  if (dy)
67  *dy = make_float3(0.0f, 0.0f, 0.0f);
68 # endif
69 
70  if (desc.element == ATTR_ELEMENT_VERTEX) {
71  return kernel_data_fetch(attributes_float3, desc.offset + sd->prim);
72  }
73  else {
74  return make_float3(0.0f, 0.0f, 0.0f);
75  }
76 }
77 
78 ccl_device float4 point_attribute_float4(KernelGlobals kg,
79  ccl_private const ShaderData *sd,
80  const AttributeDescriptor desc,
81  ccl_private float4 *dx,
82  ccl_private float4 *dy)
83 {
84 # ifdef __RAY_DIFFERENTIALS__
85  if (dx)
86  *dx = zero_float4();
87  if (dy)
88  *dy = zero_float4();
89 # endif
90 
91  if (desc.element == ATTR_ELEMENT_VERTEX) {
92  return kernel_data_fetch(attributes_float4, desc.offset + sd->prim);
93  }
94  else {
95  return zero_float4();
96  }
97 }
98 
99 /* Point position */
100 
101 ccl_device float3 point_position(KernelGlobals kg, ccl_private const ShaderData *sd)
102 {
103  if (sd->type & PRIMITIVE_POINT) {
104  /* World space center. */
105  float3 P = (sd->type & PRIMITIVE_MOTION) ?
106  float4_to_float3(motion_point(kg, sd->object, sd->prim, sd->time)) :
107  float4_to_float3(kernel_data_fetch(points, sd->prim));
108 
109  if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
110  object_position_transform(kg, sd, &P);
111  }
112 
113  return P;
114  }
115 
116  return zero_float3();
117 }
118 
119 /* Point radius */
120 
121 ccl_device float point_radius(KernelGlobals kg, ccl_private const ShaderData *sd)
122 {
123  if (sd->type & PRIMITIVE_POINT) {
124  /* World space radius. */
125  const float r = kernel_data_fetch(points, sd->prim).w;
126 
127  if (sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED) {
128  return r;
129  }
130  else {
131  const float normalized_r = r * (1.0f / M_SQRT3_F);
132  float3 dir = make_float3(normalized_r, normalized_r, normalized_r);
133  object_dir_transform(kg, sd, &dir);
134  return len(dir);
135  }
136  }
137 
138  return 0.0f;
139 }
140 
141 /* Point random */
142 
143 ccl_device float point_random(KernelGlobals kg, ccl_private const ShaderData *sd)
144 {
145  if (sd->type & PRIMITIVE_POINT) {
147  return (desc.offset != ATTR_STD_NOT_FOUND) ? point_attribute_float(kg, sd, desc, NULL, NULL) :
148  0.0f;
149  }
150  return 0.0f;
151 }
152 
153 /* Point location for motion pass, linear interpolation between keys and
154  * ignoring radius because we do the same for the motion keys */
155 
156 ccl_device float3 point_motion_center_location(KernelGlobals kg, ccl_private const ShaderData *sd)
157 {
158  return float4_to_float3(kernel_data_fetch(points, sd->prim));
159 }
160 
161 #endif /* __POINTCLOUD__ */
162 
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
float float4[4]
#define ccl_device
Definition: cuda/compat.h:32
#define ccl_private
Definition: cuda/compat.h:48
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
int len
Definition: draw_manager.c:108
ccl_device_inline AttributeDescriptor find_attribute(KernelGlobals kg, ccl_private const ShaderData *sd, uint id)
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
Definition: kernel/types.h:558
@ PRIMITIVE_POINT
Definition: kernel/types.h:554
@ ATTR_STD_NOT_FOUND
Definition: kernel/types.h:647
@ ATTR_STD_POINT_RANDOM
Definition: kernel/types.h:630
ShaderData
Definition: kernel/types.h:925
@ SD_OBJECT_TRANSFORM_APPLIED
Definition: kernel/types.h:808
@ ATTR_ELEMENT_VERTEX
Definition: kernel/types.h:602
ccl_device_inline float3 zero_float3()
Definition: math_float3.h:80
ccl_device_inline float4 zero_float4()
Definition: math_float4.h:92
static float P(float k)
Definition: math_interp.c:25
#define make_float2(x, y)
Definition: metal/compat.h:203
#define make_float3(x, y, z)
Definition: metal/compat.h:204
AttributeElement element
Definition: kernel/types.h:656
#define M_SQRT3_F
Definition: util/math.h:71
ccl_device_inline float3 float4_to_float3(const float4 a)
Definition: util/math.h:500