Blender V5.0
nodes.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
6#include "kernel/globals.h"
7
9
10// TODO(sergey): Look into avoid use of full Transform and use 3x3 matrix and
11// 3-vector which might be faster.
13 const int node_addr,
14 const int child)
15{
16 Transform space;
17 const int child_addr = node_addr + child * 3;
18 space.x = kernel_data_fetch(bvh_nodes, child_addr + 1);
19 space.y = kernel_data_fetch(bvh_nodes, child_addr + 2);
20 space.z = kernel_data_fetch(bvh_nodes, child_addr + 3);
21 return space;
22}
23
25 const float3 P,
26 const float3 idir,
27 const float tmin,
28 const float tmax,
29 const int node_addr,
30 const uint visibility,
31 float dist[2])
32{
33
34 /* fetch node data */
35#ifdef __VISIBILITY_FLAG__
36 float4 cnodes = kernel_data_fetch(bvh_nodes, node_addr + 0);
37#endif
38 float4 node0 = kernel_data_fetch(bvh_nodes, node_addr + 1);
39 float4 node1 = kernel_data_fetch(bvh_nodes, node_addr + 2);
40 float4 node2 = kernel_data_fetch(bvh_nodes, node_addr + 3);
41
42 /* intersect ray against child nodes */
43 float c0lox = (node0.x - P.x) * idir.x;
44 float c0hix = (node0.z - P.x) * idir.x;
45 float c0loy = (node1.x - P.y) * idir.y;
46 float c0hiy = (node1.z - P.y) * idir.y;
47 float c0loz = (node2.x - P.z) * idir.z;
48 float c0hiz = (node2.z - P.z) * idir.z;
49 float c0min = max4(tmin, min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz));
50 float c0max = min4(tmax, max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz));
51
52 float c1lox = (node0.y - P.x) * idir.x;
53 float c1hix = (node0.w - P.x) * idir.x;
54 float c1loy = (node1.y - P.y) * idir.y;
55 float c1hiy = (node1.w - P.y) * idir.y;
56 float c1loz = (node2.y - P.z) * idir.z;
57 float c1hiz = (node2.w - P.z) * idir.z;
58 float c1min = max4(tmin, min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz));
59 float c1max = min4(tmax, max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz));
60
61 dist[0] = c0min;
62 dist[1] = c1min;
63
64#ifdef __VISIBILITY_FLAG__
65 /* this visibility test gives a 5% performance hit, how to solve? */
66 return (((c0max >= c0min) && (__float_as_uint(cnodes.x) & visibility)) ? 1 : 0) |
67 (((c1max >= c1min) && (__float_as_uint(cnodes.y) & visibility)) ? 2 : 0);
68#else
69 return ((c0max >= c0min) ? 1 : 0) | ((c1max >= c1min) ? 2 : 0);
70#endif
71}
72
74 const float3 P,
75 const float3 dir,
76 const float tmin,
77 const float tmax,
78 const int node_addr,
79 const int child,
80 float dist[2])
81{
82 Transform space = bvh_unaligned_node_fetch_space(kg, node_addr, child);
83 float3 aligned_dir = transform_direction(&space, dir);
84 float3 aligned_P = transform_point(&space, P);
85 float3 nrdir = -bvh_inverse_direction(aligned_dir);
86 float3 lower_xyz = aligned_P * nrdir;
87 float3 upper_xyz = lower_xyz - nrdir;
88 const float near_x = min(lower_xyz.x, upper_xyz.x);
89 const float near_y = min(lower_xyz.y, upper_xyz.y);
90 const float near_z = min(lower_xyz.z, upper_xyz.z);
91 const float far_x = max(lower_xyz.x, upper_xyz.x);
92 const float far_y = max(lower_xyz.y, upper_xyz.y);
93 const float far_z = max(lower_xyz.z, upper_xyz.z);
94 const float tnear = max4(tmin, near_x, near_y, near_z);
95 const float tfar = min4(tmax, far_x, far_y, far_z);
96 *dist = tnear;
97 return tnear <= tfar;
98}
99
101 const float3 P,
102 const float3 dir,
103 const float tmin,
104 const float tmax,
105 const int node_addr,
106 const uint visibility,
107 float dist[2])
108{
109 int mask = 0;
110#ifdef __VISIBILITY_FLAG__
111 float4 cnodes = kernel_data_fetch(bvh_nodes, node_addr + 0);
112#endif
113 if (bvh_unaligned_node_intersect_child(kg, P, dir, tmin, tmax, node_addr, 0, &dist[0])) {
114#ifdef __VISIBILITY_FLAG__
115 if ((__float_as_uint(cnodes.x) & visibility))
116#endif
117 {
118 mask |= 1;
119 }
120 }
121 if (bvh_unaligned_node_intersect_child(kg, P, dir, tmin, tmax, node_addr, 1, &dist[1])) {
122#ifdef __VISIBILITY_FLAG__
123 if ((__float_as_uint(cnodes.y) & visibility))
124#endif
125 {
126 mask |= 2;
127 }
128 }
129 return mask;
130}
131
133 const float3 P,
134 const float3 dir,
135 const float3 idir,
136 const float tmin,
137 const float tmax,
138 const int node_addr,
139 const uint visibility,
140 float dist[2])
141{
142 float4 node = kernel_data_fetch(bvh_nodes, node_addr);
144 return bvh_unaligned_node_intersect(kg, P, dir, tmin, tmax, node_addr, visibility, dist);
145 }
146 return bvh_aligned_node_intersect(kg, P, idir, tmin, tmax, node_addr, visibility, dist);
147}
148
unsigned int uint
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
const ThreadKernelGlobalsCPU * KernelGlobals
#define CCL_NAMESPACE_END
#define __float_as_uint(x)
ccl_device_inline float3 bvh_inverse_direction(const float3 dir)
@ PATH_RAY_NODE_UNALIGNED
ccl_device_inline T min4(const T &a, const T &b, const T &c, const T &d)
Definition math_base.h:195
ccl_device_inline T max4(const T &a, const T &b, const T &c, const T &d)
Definition math_base.h:200
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
ccl_device_forceinline int bvh_unaligned_node_intersect(KernelGlobals kg, const float3 P, const float3 dir, const float tmin, const float tmax, const int node_addr, const uint visibility, float dist[2])
Definition nodes.h:100
ccl_device_forceinline int bvh_aligned_node_intersect(KernelGlobals kg, const float3 P, const float3 idir, const float tmin, const float tmax, const int node_addr, const uint visibility, float dist[2])
Definition nodes.h:24
ccl_device_forceinline int bvh_node_intersect(KernelGlobals kg, const float3 P, const float3 dir, const float3 idir, const float tmin, const float tmax, const int node_addr, const uint visibility, float dist[2])
Definition nodes.h:132
ccl_device_forceinline bool bvh_unaligned_node_intersect_child(KernelGlobals kg, const float3 P, const float3 dir, const float tmin, const float tmax, const int node_addr, const int child, float dist[2])
Definition nodes.h:73
CCL_NAMESPACE_BEGIN ccl_device_forceinline Transform bvh_unaligned_node_fetch_space(KernelGlobals kg, const int node_addr, const int child)
Definition nodes.h:12
#define min(a, b)
Definition sort.cc:36
float4 y
Definition transform.h:23
float4 x
Definition transform.h:23
float4 z
Definition transform.h:23
float z
Definition sky_math.h:136
float y
Definition sky_math.h:136
float x
Definition sky_math.h:136
float y
Definition sky_math.h:225
float z
Definition sky_math.h:225
float x
Definition sky_math.h:225
float w
Definition sky_math.h:225
max
Definition text_draw.cc:251
ccl_device_inline float3 transform_direction(const ccl_private Transform *t, const float3 a)
Definition transform.h:127
ccl_device_inline float3 transform_point(const ccl_private Transform *t, const float3 a)
Definition transform.h:56