Blender V4.5
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
5#pragma once
6
7#include "kernel/globals.h"
8
11#include "kernel/geom/object.h"
12
14
15/* Point Primitive
16 *
17 * Point primitive for rendering point clouds.
18 */
19
20#ifdef __POINTCLOUD__
21
22/* Reading attributes on various point elements */
23
24template<typename T>
25ccl_device T point_attribute(KernelGlobals kg,
26 const ccl_private ShaderData *sd,
27 const AttributeDescriptor desc,
28 ccl_private T *dx,
29 ccl_private T *dy)
30{
31# ifdef __RAY_DIFFERENTIALS__
32 if (dx) {
33 *dx = make_zero<T>();
34 }
35 if (dy) {
36 *dy = make_zero<T>();
37 }
38# endif
39
40 if (desc.element == ATTR_ELEMENT_VERTEX) {
41 return attribute_data_fetch<T>(kg, desc.offset + sd->prim);
42 }
43 return make_zero<T>();
44}
45
46/* Point position */
47
48ccl_device float3 point_position(KernelGlobals kg, const ccl_private ShaderData *sd)
49{
50 if (sd->type & PRIMITIVE_POINT) {
51 /* World space center. */
52 float3 P = (sd->type & PRIMITIVE_MOTION) ?
53 make_float3(motion_point(kg, sd->object, sd->prim, sd->time)) :
54 make_float3(kernel_data_fetch(points, sd->prim));
55
56 if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
58 }
59
60 return P;
61 }
62
63 return zero_float3();
64}
65
66/* Point radius */
67
68ccl_device float point_radius(KernelGlobals kg, const ccl_private ShaderData *sd)
69{
70 if (sd->type & PRIMITIVE_POINT) {
71 /* World space radius. */
72 const float r = kernel_data_fetch(points, sd->prim).w;
73
74 if (sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED) {
75 return r;
76 }
77
78 const float normalized_r = r * (1.0f / M_SQRT3_F);
79 float3 dir = make_float3(normalized_r, normalized_r, normalized_r);
80 object_dir_transform(kg, sd, &dir);
81 return len(dir);
82 }
83
84 return 0.0f;
85}
86
87/* Point random */
88
89ccl_device float point_random(KernelGlobals kg, const ccl_private ShaderData *sd)
90{
91 if (sd->type & PRIMITIVE_POINT) {
93 return (desc.offset != ATTR_STD_NOT_FOUND) ?
94 point_attribute<float>(kg, sd, desc, nullptr, nullptr) :
95 0.0f;
96 }
97 return 0.0f;
98}
99
100/* Point location for motion pass, linear interpolation between keys and
101 * ignoring radius because we do the same for the motion keys */
102
103ccl_device float3 point_motion_center_location(KernelGlobals kg, const ccl_private ShaderData *sd)
104{
105 return make_float3(kernel_data_fetch(points, sd->prim));
106}
107
108#endif /* __POINTCLOUD__ */
109
#define kernel_data_fetch(name, index)
#define ccl_device
#define ccl_private
const ThreadKernelGlobalsCPU * KernelGlobals
#define M_SQRT3_F
#define CCL_NAMESPACE_END
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
ccl_device_inline T attribute_data_fetch(KernelGlobals kg, int offset)
ccl_device_inline void object_dir_transform(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private float3 *D)
ccl_device_inline void object_position_transform(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private float3 *P)
@ PRIMITIVE_MOTION
@ PRIMITIVE_POINT
@ ATTR_STD_NOT_FOUND
@ ATTR_STD_POINT_RANDOM
@ SD_OBJECT_TRANSFORM_APPLIED
@ ATTR_ELEMENT_VERTEX
ccl_device_inline T make_zero()
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
Definition math_float3.h:15
#define T
static bool find_attribute(const std::string &attributes, const char *search_attribute)
AttributeElement element
uint len