Blender V5.0
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 dual<T> point_attribute(KernelGlobals kg,
26 const ccl_private ShaderData *sd,
27 const AttributeDescriptor desc,
28 const bool /* dx */ = false,
29 const bool /* dy */ = false)
30{
31 if (desc.element == ATTR_ELEMENT_VERTEX) {
32 return dual<T>(attribute_data_fetch<T>(kg, desc.offset + sd->prim));
33 }
34 return make_zero<dual<T>>();
35}
36
37/* Point position */
38
39ccl_device float3 point_position(KernelGlobals kg, const ccl_private ShaderData *sd)
40{
41 if (sd->type & PRIMITIVE_POINT) {
42 /* World space center. */
43 float3 P = (sd->type & PRIMITIVE_MOTION) ?
44 make_float3(motion_point(kg, sd->object, sd->prim, sd->time)) :
45 make_float3(kernel_data_fetch(points, sd->prim));
46
47 if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
49 }
50
51 return P;
52 }
53
54 return zero_float3();
55}
56
57/* Point radius */
58
59ccl_device float point_radius(KernelGlobals kg, const ccl_private ShaderData *sd)
60{
61 if (sd->type & PRIMITIVE_POINT) {
62 /* World space radius. */
63 const float r = kernel_data_fetch(points, sd->prim).w;
64
65 if (sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED) {
66 return r;
67 }
68
69 const float normalized_r = r * (1.0f / M_SQRT3_F);
70 float3 dir = make_float3(normalized_r, normalized_r, normalized_r);
71 object_dir_transform(kg, sd, &dir);
72 return len(dir);
73 }
74
75 return 0.0f;
76}
77
78/* Point random */
79
80ccl_device float point_random(KernelGlobals kg, const ccl_private ShaderData *sd)
81{
82 if (sd->type & PRIMITIVE_POINT) {
84 return (desc.offset != ATTR_STD_NOT_FOUND) ? point_attribute<float>(kg, sd, desc).val : 0.0f;
85 }
86 return 0.0f;
87}
88
89/* Point location for motion pass, linear interpolation between keys and
90 * ignoring radius because we do the same for the motion keys */
91
92ccl_device float3 point_motion_center_location(KernelGlobals kg, const ccl_private ShaderData *sd)
93{
94 return make_float3(kernel_data_fetch(points, sd->prim));
95}
96
97#endif /* __POINTCLOUD__ */
98
#define kernel_data_fetch(name, index)
#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 T *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()
Definition math_dual.h:17
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
Definition math_float3.h:17
#define ccl_device
static bool find_attribute(const std::string &attributes, const char *search_attribute)
AttributeElement element
uint len