Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/osl/osl_services.cpp
| Show First 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, | ||||
| OSL::Matrix44 &result, | OSL::Matrix44 &result, | ||||
| OSL::TransformationPtr xform, | OSL::TransformationPtr xform, | ||||
| float time) | float time) | ||||
| { | { | ||||
| /* this is only used for shader and object space, we don't really have | /* this is only used for shader and object space, we don't really have | ||||
| * a concept of shader space, so we just use object space for both. */ | * a concept of shader space, so we just use object space for both. */ | ||||
| if (xform) { | if (xform) { | ||||
| const ShaderData *sd = (const ShaderData *)xform; | const ShaderData *sd = (const ShaderData *)xform; | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| int object = sd->object; | int object = sd->object; | ||||
| if (object != OBJECT_NONE) { | if (object != OBJECT_NONE) { | ||||
| #ifdef __OBJECT_MOTION__ | #ifdef __OBJECT_MOTION__ | ||||
| Transform tfm; | Transform tfm; | ||||
| if (time == sd->time) | if (time == sd->time) | ||||
| tfm = object_get_transform(kg, sd); | tfm = object_get_transform(kg, sd); | ||||
| Show All 21 Lines | bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, | ||||
| OSL::Matrix44 &result, | OSL::Matrix44 &result, | ||||
| OSL::TransformationPtr xform, | OSL::TransformationPtr xform, | ||||
| float time) | float time) | ||||
| { | { | ||||
| /* this is only used for shader and object space, we don't really have | /* this is only used for shader and object space, we don't really have | ||||
| * a concept of shader space, so we just use object space for both. */ | * a concept of shader space, so we just use object space for both. */ | ||||
| if (xform) { | if (xform) { | ||||
| const ShaderData *sd = (const ShaderData *)xform; | const ShaderData *sd = (const ShaderData *)xform; | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| int object = sd->object; | int object = sd->object; | ||||
| if (object != OBJECT_NONE) { | if (object != OBJECT_NONE) { | ||||
| #ifdef __OBJECT_MOTION__ | #ifdef __OBJECT_MOTION__ | ||||
| Transform itfm; | Transform itfm; | ||||
| if (time == sd->time) | if (time == sd->time) | ||||
| itfm = object_get_inverse_transform(kg, sd); | itfm = object_get_inverse_transform(kg, sd); | ||||
| Show All 18 Lines | |||||
| } | } | ||||
| bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, | bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, | ||||
| OSL::Matrix44 &result, | OSL::Matrix44 &result, | ||||
| ustring from, | ustring from, | ||||
| float time) | float time) | ||||
| { | { | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| if (from == u_ndc) { | if (from == u_ndc) { | ||||
| copy_matrix(result, kernel_data.cam.ndctoworld); | copy_matrix(result, kernel_data.cam.ndctoworld); | ||||
| return true; | return true; | ||||
| } | } | ||||
| else if (from == u_raster) { | else if (from == u_raster) { | ||||
| copy_matrix(result, kernel_data.cam.rastertoworld); | copy_matrix(result, kernel_data.cam.rastertoworld); | ||||
| return true; | return true; | ||||
| Show All 15 Lines | |||||
| } | } | ||||
| bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, | bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, | ||||
| OSL::Matrix44 &result, | OSL::Matrix44 &result, | ||||
| ustring to, | ustring to, | ||||
| float time) | float time) | ||||
| { | { | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| if (to == u_ndc) { | if (to == u_ndc) { | ||||
| copy_matrix(result, kernel_data.cam.worldtondc); | copy_matrix(result, kernel_data.cam.worldtondc); | ||||
| return true; | return true; | ||||
| } | } | ||||
| else if (to == u_raster) { | else if (to == u_raster) { | ||||
| copy_matrix(result, kernel_data.cam.worldtoraster); | copy_matrix(result, kernel_data.cam.worldtoraster); | ||||
| return true; | return true; | ||||
| Show All 17 Lines | |||||
| bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, | bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, | ||||
| OSL::Matrix44 &result, | OSL::Matrix44 &result, | ||||
| OSL::TransformationPtr xform) | OSL::TransformationPtr xform) | ||||
| { | { | ||||
| /* this is only used for shader and object space, we don't really have | /* this is only used for shader and object space, we don't really have | ||||
| * a concept of shader space, so we just use object space for both. */ | * a concept of shader space, so we just use object space for both. */ | ||||
| if (xform) { | if (xform) { | ||||
| const ShaderData *sd = (const ShaderData *)xform; | const ShaderData *sd = (const ShaderData *)xform; | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| int object = sd->object; | int object = sd->object; | ||||
| if (object != OBJECT_NONE) { | if (object != OBJECT_NONE) { | ||||
| const Transform tfm = object_get_transform(kg, sd); | const Transform tfm = object_get_transform(kg, sd); | ||||
| copy_matrix(result, tfm); | copy_matrix(result, tfm); | ||||
| return true; | return true; | ||||
| } | } | ||||
| Show All 11 Lines | |||||
| bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, | bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, | ||||
| OSL::Matrix44 &result, | OSL::Matrix44 &result, | ||||
| OSL::TransformationPtr xform) | OSL::TransformationPtr xform) | ||||
| { | { | ||||
| /* this is only used for shader and object space, we don't really have | /* this is only used for shader and object space, we don't really have | ||||
| * a concept of shader space, so we just use object space for both. */ | * a concept of shader space, so we just use object space for both. */ | ||||
| if (xform) { | if (xform) { | ||||
| const ShaderData *sd = (const ShaderData *)xform; | const ShaderData *sd = (const ShaderData *)xform; | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| int object = sd->object; | int object = sd->object; | ||||
| if (object != OBJECT_NONE) { | if (object != OBJECT_NONE) { | ||||
| const Transform tfm = object_get_inverse_transform(kg, sd); | const Transform tfm = object_get_inverse_transform(kg, sd); | ||||
| copy_matrix(result, tfm); | copy_matrix(result, tfm); | ||||
| return true; | return true; | ||||
| } | } | ||||
| else if (sd->type == PRIMITIVE_LAMP) { | else if (sd->type == PRIMITIVE_LAMP) { | ||||
| const Transform itfm = lamp_fetch_transform(kg, sd->lamp, true); | const Transform itfm = lamp_fetch_transform(kg, sd->lamp, true); | ||||
| copy_matrix(result, itfm); | copy_matrix(result, itfm); | ||||
| return true; | return true; | ||||
| } | } | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, OSL::Matrix44 &result, ustring from) | bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, OSL::Matrix44 &result, ustring from) | ||||
| { | { | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| if (from == u_ndc) { | if (from == u_ndc) { | ||||
| copy_matrix(result, kernel_data.cam.ndctoworld); | copy_matrix(result, kernel_data.cam.ndctoworld); | ||||
| return true; | return true; | ||||
| } | } | ||||
| else if (from == u_raster) { | else if (from == u_raster) { | ||||
| copy_matrix(result, kernel_data.cam.rastertoworld); | copy_matrix(result, kernel_data.cam.rastertoworld); | ||||
| return true; | return true; | ||||
| Show All 10 Lines | bool OSLRenderServices::get_matrix(OSL::ShaderGlobals *sg, OSL::Matrix44 &result, ustring from) | ||||
| return false; | return false; | ||||
| } | } | ||||
| bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, | bool OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, | ||||
| OSL::Matrix44 &result, | OSL::Matrix44 &result, | ||||
| ustring to) | ustring to) | ||||
| { | { | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| if (to == u_ndc) { | if (to == u_ndc) { | ||||
| copy_matrix(result, kernel_data.cam.worldtondc); | copy_matrix(result, kernel_data.cam.worldtondc); | ||||
| return true; | return true; | ||||
| } | } | ||||
| else if (to == u_raster) { | else if (to == u_raster) { | ||||
| copy_matrix(result, kernel_data.cam.worldtoraster); | copy_matrix(result, kernel_data.cam.worldtoraster); | ||||
| return true; | return true; | ||||
| ▲ Show 20 Lines • Show All 362 Lines • ▼ Show 20 Lines | static bool set_attribute_matrix(const Transform &tfm, TypeDesc type, void *val) | ||||
| if (type == TypeDesc::TypeMatrix) { | if (type == TypeDesc::TypeMatrix) { | ||||
| copy_matrix(*(OSL::Matrix44 *)val, tfm); | copy_matrix(*(OSL::Matrix44 *)val, tfm); | ||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| static bool get_primitive_attribute(const KernelGlobals *kg, | static bool get_primitive_attribute(const KernelGlobalsCPU *kg, | ||||
| const ShaderData *sd, | const ShaderData *sd, | ||||
| const OSLGlobals::Attribute &attr, | const OSLGlobals::Attribute &attr, | ||||
| const TypeDesc &type, | const TypeDesc &type, | ||||
| bool derivatives, | bool derivatives, | ||||
| void *val) | void *val) | ||||
| { | { | ||||
| if (attr.type == TypeDesc::TypePoint || attr.type == TypeDesc::TypeVector || | if (attr.type == TypeDesc::TypePoint || attr.type == TypeDesc::TypeVector || | ||||
| attr.type == TypeDesc::TypeNormal || attr.type == TypeDesc::TypeColor) { | attr.type == TypeDesc::TypeNormal || attr.type == TypeDesc::TypeColor) { | ||||
| ▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | else if (attr.type == TypeDesc::TypeFloat4 || attr.type == TypeRGBA) { | ||||
| } | } | ||||
| return set_attribute_float4(fval, type, derivatives, val); | return set_attribute_float4(fval, type, derivatives, val); | ||||
| } | } | ||||
| else { | else { | ||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| static bool get_mesh_attribute(const KernelGlobals *kg, | static bool get_mesh_attribute(const KernelGlobalsCPU *kg, | ||||
| const ShaderData *sd, | const ShaderData *sd, | ||||
| const OSLGlobals::Attribute &attr, | const OSLGlobals::Attribute &attr, | ||||
| const TypeDesc &type, | const TypeDesc &type, | ||||
| bool derivatives, | bool derivatives, | ||||
| void *val) | void *val) | ||||
| { | { | ||||
| if (attr.type == TypeDesc::TypeMatrix) { | if (attr.type == TypeDesc::TypeMatrix) { | ||||
| Transform tfm = primitive_attribute_matrix(kg, sd, attr.desc); | Transform tfm = primitive_attribute_matrix(kg, sd, attr.desc); | ||||
| Show All 32 Lines | else if (attr.type == type) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| else { | else { | ||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| bool OSLRenderServices::get_object_standard_attribute(const KernelGlobals *kg, | bool OSLRenderServices::get_object_standard_attribute(const KernelGlobalsCPU *kg, | ||||
| ShaderData *sd, | ShaderData *sd, | ||||
| ustring name, | ustring name, | ||||
| TypeDesc type, | TypeDesc type, | ||||
| bool derivatives, | bool derivatives, | ||||
| void *val) | void *val) | ||||
| { | { | ||||
| /* todo: turn this into hash table? */ | /* todo: turn this into hash table? */ | ||||
| ▲ Show 20 Lines • Show All 128 Lines • ▼ Show 20 Lines | else { | ||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| bool OSLRenderServices::get_background_attribute(const KernelGlobals *kg, | bool OSLRenderServices::get_background_attribute(const KernelGlobalsCPU *kg, | ||||
| ShaderData *sd, | ShaderData *sd, | ||||
| ustring name, | ustring name, | ||||
| TypeDesc type, | TypeDesc type, | ||||
| bool derivatives, | bool derivatives, | ||||
| void *val) | void *val) | ||||
| { | { | ||||
| if (name == u_path_ray_length) { | if (name == u_path_ray_length) { | ||||
| /* Ray Length */ | /* Ray Length */ | ||||
| ▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | bool OSLRenderServices::get_attribute(OSL::ShaderGlobals *sg, | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| return get_attribute(sd, derivatives, object_name, type, name, val); | return get_attribute(sd, derivatives, object_name, type, name, val); | ||||
| } | } | ||||
| bool OSLRenderServices::get_attribute( | bool OSLRenderServices::get_attribute( | ||||
| ShaderData *sd, bool derivatives, ustring object_name, TypeDesc type, ustring name, void *val) | ShaderData *sd, bool derivatives, ustring object_name, TypeDesc type, ustring name, void *val) | ||||
| { | { | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| int prim_type = 0; | int prim_type = 0; | ||||
| int object; | int object; | ||||
| /* lookup of attribute on another object */ | /* lookup of attribute on another object */ | ||||
| if (object_name != u_empty) { | if (object_name != u_empty) { | ||||
| OSLGlobals::ObjectNameMap::iterator it = kg->osl->object_name_map.find(object_name); | OSLGlobals::ObjectNameMap::iterator it = kg->osl->object_name_map.find(object_name); | ||||
| if (it == kg->osl->object_name_map.end()) | if (it == kg->osl->object_name_map.end()) | ||||
| ▲ Show 20 Lines • Show All 112 Lines • ▼ Show 20 Lines | bool OSLRenderServices::texture(ustring filename, | ||||
| float *result, | float *result, | ||||
| float *dresultds, | float *dresultds, | ||||
| float *dresultdt, | float *dresultdt, | ||||
| ustring *errormessage) | ustring *errormessage) | ||||
| { | { | ||||
| OSLTextureHandle *handle = (OSLTextureHandle *)texture_handle; | OSLTextureHandle *handle = (OSLTextureHandle *)texture_handle; | ||||
| OSLTextureHandle::Type texture_type = (handle) ? handle->type : OSLTextureHandle::OIIO; | OSLTextureHandle::Type texture_type = (handle) ? handle->type : OSLTextureHandle::OIIO; | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kernel_globals = sd->osl_globals; | KernelGlobals kernel_globals = sd->osl_globals; | ||||
| bool status = false; | bool status = false; | ||||
| switch (texture_type) { | switch (texture_type) { | ||||
| case OSLTextureHandle::BEVEL: { | case OSLTextureHandle::BEVEL: { | ||||
| /* Bevel shader hack. */ | /* Bevel shader hack. */ | ||||
| if (nchannels >= 3) { | if (nchannels >= 3) { | ||||
| const IntegratorStateCPU *state = sd->osl_path_state; | const IntegratorStateCPU *state = sd->osl_path_state; | ||||
| int num_samples = (int)s; | int num_samples = (int)s; | ||||
| ▲ Show 20 Lines • Show All 130 Lines • ▼ Show 20 Lines | bool OSLRenderServices::texture3d(ustring filename, | ||||
| OSLTextureHandle *handle = (OSLTextureHandle *)texture_handle; | OSLTextureHandle *handle = (OSLTextureHandle *)texture_handle; | ||||
| OSLTextureHandle::Type texture_type = (handle) ? handle->type : OSLTextureHandle::OIIO; | OSLTextureHandle::Type texture_type = (handle) ? handle->type : OSLTextureHandle::OIIO; | ||||
| bool status = false; | bool status = false; | ||||
| switch (texture_type) { | switch (texture_type) { | ||||
| case OSLTextureHandle::SVM: { | case OSLTextureHandle::SVM: { | ||||
| /* Packed texture. */ | /* Packed texture. */ | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kernel_globals = sd->osl_globals; | KernelGlobals kernel_globals = sd->osl_globals; | ||||
| int slot = handle->svm_slot; | int slot = handle->svm_slot; | ||||
| float3 P_float3 = make_float3(P.x, P.y, P.z); | float3 P_float3 = make_float3(P.x, P.y, P.z); | ||||
| float4 rgba = kernel_tex_image_interp_3d(kernel_globals, slot, P_float3, INTERPOLATION_NONE); | float4 rgba = kernel_tex_image_interp_3d(kernel_globals, slot, P_float3, INTERPOLATION_NONE); | ||||
| result[0] = rgba[0]; | result[0] = rgba[0]; | ||||
| if (nchannels > 1) | if (nchannels > 1) | ||||
| result[1] = rgba[1]; | result[1] = rgba[1]; | ||||
| if (nchannels > 2) | if (nchannels > 2) | ||||
| result[2] = rgba[2]; | result[2] = rgba[2]; | ||||
| if (nchannels > 3) | if (nchannels > 3) | ||||
| result[3] = rgba[3]; | result[3] = rgba[3]; | ||||
| status = true; | status = true; | ||||
| break; | break; | ||||
| } | } | ||||
| case OSLTextureHandle::OIIO: { | case OSLTextureHandle::OIIO: { | ||||
| /* OpenImageIO texture cache. */ | /* OpenImageIO texture cache. */ | ||||
| OSL::TextureSystem *ts = texture_system; | OSL::TextureSystem *ts = texture_system; | ||||
| if (handle && handle->oiio_handle) { | if (handle && handle->oiio_handle) { | ||||
| if (texture_thread_info == NULL) { | if (texture_thread_info == NULL) { | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kernel_globals = sd->osl_globals; | KernelGlobals kernel_globals = sd->osl_globals; | ||||
| OSLThreadData *tdata = kernel_globals->osl_tdata; | OSLThreadData *tdata = kernel_globals->osl_tdata; | ||||
| texture_thread_info = tdata->oiio_thread_info; | texture_thread_info = tdata->oiio_thread_info; | ||||
| } | } | ||||
| status = ts->texture3d(handle->oiio_handle, | status = ts->texture3d(handle->oiio_handle, | ||||
| texture_thread_info, | texture_thread_info, | ||||
| options, | options, | ||||
| P, | P, | ||||
| ▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| OSLTextureHandle *handle = (OSLTextureHandle *)texture_handle; | OSLTextureHandle *handle = (OSLTextureHandle *)texture_handle; | ||||
| OSL::TextureSystem *ts = texture_system; | OSL::TextureSystem *ts = texture_system; | ||||
| bool status = false; | bool status = false; | ||||
| if (handle && handle->oiio_handle) { | if (handle && handle->oiio_handle) { | ||||
| if (thread_info == NULL) { | if (thread_info == NULL) { | ||||
| ShaderData *sd = (ShaderData *)(sg->renderstate); | ShaderData *sd = (ShaderData *)(sg->renderstate); | ||||
| const KernelGlobals *kernel_globals = sd->osl_globals; | KernelGlobals kernel_globals = sd->osl_globals; | ||||
| OSLThreadData *tdata = kernel_globals->osl_tdata; | OSLThreadData *tdata = kernel_globals->osl_tdata; | ||||
| thread_info = tdata->oiio_thread_info; | thread_info = tdata->oiio_thread_info; | ||||
| } | } | ||||
| status = ts->environment(handle->oiio_handle, | status = ts->environment(handle->oiio_handle, | ||||
| thread_info, | thread_info, | ||||
| options, | options, | ||||
| R, | R, | ||||
| ▲ Show 20 Lines • Show All 138 Lines • ▼ Show 20 Lines | bool OSLRenderServices::trace(TraceOpt &options, | ||||
| /* allocate trace data */ | /* allocate trace data */ | ||||
| OSLTraceData *tracedata = (OSLTraceData *)sg->tracedata; | OSLTraceData *tracedata = (OSLTraceData *)sg->tracedata; | ||||
| tracedata->ray = ray; | tracedata->ray = ray; | ||||
| tracedata->setup = false; | tracedata->setup = false; | ||||
| tracedata->init = true; | tracedata->init = true; | ||||
| tracedata->hit = false; | tracedata->hit = false; | ||||
| tracedata->sd.osl_globals = sd->osl_globals; | tracedata->sd.osl_globals = sd->osl_globals; | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| /* Can't raytrace from shaders like displacement, before BVH exists. */ | /* Can't raytrace from shaders like displacement, before BVH exists. */ | ||||
| if (kernel_data.bvh.bvh_layout == BVH_LAYOUT_NONE) { | if (kernel_data.bvh.bvh_layout == BVH_LAYOUT_NONE) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| /* Raytrace, leaving out shadow opaque to avoid early exit. */ | /* Raytrace, leaving out shadow opaque to avoid early exit. */ | ||||
| uint visibility = PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE; | uint visibility = PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE; | ||||
| Show All 16 Lines | if (source == u_trace && tracedata->init) { | ||||
| } | } | ||||
| else if (tracedata->hit) { | else if (tracedata->hit) { | ||||
| if (name == u_hitdist) { | if (name == u_hitdist) { | ||||
| float f[3] = {tracedata->isect.t, 0.0f, 0.0f}; | float f[3] = {tracedata->isect.t, 0.0f, 0.0f}; | ||||
| return set_attribute_float(f, type, derivatives, val); | return set_attribute_float(f, type, derivatives, val); | ||||
| } | } | ||||
| else { | else { | ||||
| ShaderData *sd = &tracedata->sd; | ShaderData *sd = &tracedata->sd; | ||||
| const KernelGlobals *kg = sd->osl_globals; | const KernelGlobalsCPU *kg = sd->osl_globals; | ||||
| if (!tracedata->setup) { | if (!tracedata->setup) { | ||||
| /* lazy shader data setup */ | /* lazy shader data setup */ | ||||
| shader_setup_from_ray(kg, sd, &tracedata->ray, &tracedata->isect); | shader_setup_from_ray(kg, sd, &tracedata->ray, &tracedata->isect); | ||||
| tracedata->setup = true; | tracedata->setup = true; | ||||
| } | } | ||||
| if (name == u_N) { | if (name == u_N) { | ||||
| Show All 31 Lines | |||||