Blender V5.0
services_shared.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5/* Shared functions between OSL on CPU and GPU. */
6
7#pragma once
8
11
13
14#ifdef __KERNEL_OPTIX__
15typedef long long TypeDesc;
16#endif
17
18template<typename T>
20 const TypeDesc type,
21 bool derivatives,
22 ccl_private void *val);
23
24ccl_device_inline void set_data_float(const dual1 data, bool derivatives, ccl_private void *val)
25{
26 ccl_private float *fval = static_cast<ccl_private float *>(val);
27 fval[0] = data.val;
28 if (derivatives) {
29 fval[1] = data.dx;
30 fval[2] = data.dy;
31 }
32}
33
34ccl_device_inline void set_data_float3(const dual3 data, bool derivatives, ccl_private void *val)
35{
36 ccl_private float *fval = static_cast<ccl_private float *>(val);
37 copy_v3_v3(fval, data.val);
38 if (derivatives) {
39 copy_v3_v3(fval + 3, data.dx);
40 copy_v3_v3(fval + 6, data.dy);
41 }
42}
43
44ccl_device_inline void set_data_float4(const dual4 data, bool derivatives, ccl_private void *val)
45{
46 ccl_private float *fval = static_cast<ccl_private float *>(val);
47 copy_v4_v4(fval, data.val);
48 if (derivatives) {
49 copy_v4_v4(fval + 4, data.dx);
50 copy_v4_v4(fval + 8, data.dy);
51 }
52}
53
55 ccl_private const ShaderData *sd,
57{
58 if (!(sd->type & PRIMITIVE_TRIANGLE) || !(sd->shader & SHADER_SMOOTH_NORMAL)) {
59 /* TODO: implement for curve. */
60 return false;
61 }
62
63 const bool backfacing = (sd->flag & SD_BACKFACING);
64
65 /* Fallback when the smooth normal is zero. */
66 float3 Ng = backfacing ? -sd->Ng : sd->Ng;
68
69 if (sd->type == PRIMITIVE_TRIANGLE) {
70 f.val = triangle_smooth_normal(kg, Ng, sd->prim, sd->u, sd->v, sd->du, sd->dv, f.dx, f.dy);
71 }
72 else {
75 kg, Ng, sd->object, sd->prim, sd->time, sd->u, sd->v, sd->du, sd->dv, f.dx, f.dy);
76 }
77
78 if (sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED) {
79 /* Transform to local space. */
80 object_inverse_normal_transform(kg, sd, &f.val);
83 }
84
85 if (backfacing) {
86 f = -f;
87 }
88
89 f.dx -= f.val;
90 f.dy -= f.val;
91
92 return true;
93}
94
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define ccl_private
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_inline float3 triangle_smooth_normal(KernelGlobals kg, const float3 Ng, const int prim, const float u, float v)
#define assert(assertion)
ccl_device_inline void object_inverse_normal_transform(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private float3 *N)
@ SD_BACKFACING
@ PRIMITIVE_MOTION_TRIANGLE
@ PRIMITIVE_TRIANGLE
@ SHADER_SMOOTH_NORMAL
@ SD_OBJECT_TRANSFORM_APPLIED
ccl_device_inline float3 motion_triangle_smooth_normal(KernelGlobals kg, const float3 Ng, const int object, const uint3 tri_vindex, const int numsteps, const int step, const float t, const float u, const float v)
#define ccl_device
ccl_device_inline void set_data_float3(const dual3 data, bool derivatives, ccl_private void *val)
ccl_device bool attribute_bump_map_normal(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private dual3 &f)
ccl_device_inline void set_data_float4(const dual4 data, bool derivatives, ccl_private void *val)
ccl_device_inline void set_data_float(const dual1 data, bool derivatives, ccl_private void *val)
CCL_NAMESPACE_BEGIN ccl_device_inline bool set_attribute(const dual< T > v, const TypeDesc type, bool derivatives, ccl_private void *val)
dual< float4 > dual4
Definition types_dual.h:59
dual< float3 > dual3
Definition types_dual.h:58
dual< float > dual1
Definition types_dual.h:56