8#include <OSL/genclosure.h>
9#include <OSL/oslclosure.h>
27#define TO_VEC3(v) OSL::Vec3(v.x, v.y, v.z)
28#define TO_FLOAT3(v) make_float3(v[0], v[1], v[2])
32static_assert(
sizeof(
OSLClosure) ==
sizeof(OSL::ClosureColor) &&
33 sizeof(OSLClosureAdd) ==
sizeof(OSL::ClosureAdd) &&
34 sizeof(OSLClosureMul) ==
sizeof(OSL::ClosureMul) &&
35 sizeof(OSLClosureComponent) ==
sizeof(OSL::ClosureComponent));
36static_assert(
sizeof(
ShaderGlobals) >=
sizeof(OSL::ShaderGlobals) &&
41#define OSL_CLOSURE_STRUCT_BEGIN(Upper, lower) \
42 static OSL::ClosureParam *osl_closure_##lower##_params() \
44 static OSL::ClosureParam params[] = {
45#define OSL_CLOSURE_STRUCT_END(Upper, lower) \
46 CLOSURE_STRING_KEYPARAM(Upper##Closure, label, "label"), CLOSURE_FINISH_PARAM(Upper##Closure) \
51#define OSL_CLOSURE_STRUCT_MEMBER(Upper, TYPE, type, name, key) \
52 CLOSURE_##TYPE##_KEYPARAM(Upper##Closure, name, key),
53#define OSL_CLOSURE_STRUCT_ARRAY_MEMBER(Upper, TYPE, type, name, key, size) \
54 CLOSURE_##TYPE##_ARRAY_PARAM(Upper##Closure, name, size),
60 static OSL::ClosureParam
params[] = {CLOSURE_CLOSURE_PARAM(LayerClosure,
top),
61 CLOSURE_CLOSURE_PARAM(LayerClosure, base),
62 CLOSURE_FINISH_PARAM(LayerClosure)};
68#define OSL_CLOSURE_STRUCT_BEGIN(Upper, lower) \
69 ss->register_closure( \
70 #lower, OSL_CLOSURE_##Upper##_ID, osl_closure_##lower##_params(), nullptr, nullptr);
83 const uint32_t path_flag)
89 kg->osl.tracedata.init =
false;
92 kg->osl.shader_globals.kg = kg;
94 kg->osl.shader_globals.path_state =
nullptr;
99 kg->osl.shader_globals.shadow_path_state =
nullptr;
103 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
104 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
105 OSL::ShadingContext *octx = kg->osl.context;
110 if (kg->osl.globals->background_state) {
112 *(kg->osl.globals->background_state),
113 kg->osl.thread_index,
122 if (kg->osl.globals->bump_state[shader]) {
125 const float dP = sd->dP;
126 const OSL::Vec3 dPdx = globals->dPdx;
127 const OSL::Vec3 dPdy = globals->dPdy;
132 const bool found = kg->osl.globals->services->get_attribute(
160 *(kg->osl.globals->bump_state[shader]),
161 kg->osl.thread_index,
180 if (kg->osl.globals->surface_state[shader]) {
182 *(kg->osl.globals->surface_state[shader]),
183 kg->osl.thread_index,
192 if (kg->osl.shader_globals.Ci) {
203 const uint32_t path_flag)
209 kg->osl.tracedata.init =
false;
212 kg->osl.shader_globals.kg = kg;
214 kg->osl.shader_globals.path_state =
nullptr;
219 kg->osl.shader_globals.shadow_path_state =
nullptr;
223 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
224 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
225 OSL::ShadingContext *octx = kg->osl.context;
228 if (kg->osl.globals->volume_state[shader]) {
230 *(kg->osl.globals->volume_state[shader]),
231 kg->osl.thread_index,
239 if (kg->osl.shader_globals.Ci) {
250 const uint32_t path_flag)
256 kg->osl.tracedata.init =
false;
259 kg->osl.shader_globals.kg = kg;
261 kg->osl.shader_globals.shadow_path_state =
nullptr;
264 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
265 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
266 OSL::ShadingContext *octx = kg->osl.context;
269 if (kg->osl.globals->displacement_state[shader]) {
271 *(kg->osl.globals->displacement_state[shader]),
272 kg->osl.thread_index,
297 if (!kg->osl.globals->camera_state) {
305 kg->osl.tracedata.init =
false;
308 kg->osl.shader_globals.kg = kg;
311 OSL::ShadingSystem *ss = (OSL::ShadingSystem *)kg->osl.ss;
312 OSL::ShaderGlobals *globals =
reinterpret_cast<OSL::ShaderGlobals *
>(&kg->osl.shader_globals);
313 OSL::ShadingContext *octx = kg->osl.context;
315 float output[21] = {0.0f};
318 *octx, *kg->osl.globals->camera_state, kg->osl.thread_index, 0, *globals,
nullptr,
output);
BMesh const char void * data
static ustring u_geom_undisplaced
static void register_closures(OSL::ShadingSystem *ss)
packed_float3 osl_eval_camera(const ThreadKernelGlobalsCPU *kg, const packed_float3 sensor, const packed_float3 dSdx, const packed_float3 dSdy, const float2 rand_lens, packed_float3 &P, packed_float3 &dPdx, packed_float3 &dPdy, packed_float3 &D, packed_float3 &dDdx, packed_float3 &dDdy)
void osl_eval_nodes< SHADER_TYPE_DISPLACEMENT >(const ThreadKernelGlobalsCPU *kg, const void *state, ShaderData *sd, const uint32_t path_flag)
void osl_eval_nodes< SHADER_TYPE_VOLUME >(const ThreadKernelGlobalsCPU *kg, const void *state, ShaderData *sd, const uint32_t path_flag)
void osl_eval_nodes< SHADER_TYPE_SURFACE >(const ThreadKernelGlobalsCPU *kg, const void *state, ShaderData *sd, const uint32_t path_flag)
static OSL::ClosureParam * osl_closure_layer_params()
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_make_compact(const float dD)
#define assert(assertion)
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)
CCL_NAMESPACE_BEGIN ccl_device_inline void cameradata_to_shaderglobals(const packed_float3 sensor, const packed_float3 dSdx, const packed_float3 dSdy, const float2 rand_lens, ccl_private ShaderGlobals *globals)
ccl_device void flatten_closure_tree(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const ccl_private OSLClosure *closure)
CCL_NAMESPACE_BEGIN ccl_device_inline void shaderdata_to_shaderglobals(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, ccl_private ShaderGlobals *globals)