Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/osl/osl_services.cpp
| Show First 20 Lines • Show All 1,475 Lines • ▼ Show 20 Lines | bool OSLRenderServices::trace(TraceOpt &options, | ||||
| ray.dD.dx = TO_FLOAT3(dRdx); | ray.dD.dx = TO_FLOAT3(dRdx); | ||||
| ray.dD.dy = TO_FLOAT3(dRdy); | ray.dD.dy = TO_FLOAT3(dRdy); | ||||
| /* 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->sd.osl_globals = sd->osl_globals; | tracedata->sd.osl_globals = sd->osl_globals; | ||||
| KernelGlobals *kg = sd->osl_globals; | KernelGlobals *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; | ||||
| return scene_intersect(kg, &ray, visibility, &tracedata->isect); | tracedata->hit = scene_intersect(kg, &ray, visibility, &tracedata->isect); | ||||
| return tracedata->hit; | |||||
| } | } | ||||
| bool OSLRenderServices::getmessage(OSL::ShaderGlobals *sg, | bool OSLRenderServices::getmessage(OSL::ShaderGlobals *sg, | ||||
| ustring source, | ustring source, | ||||
| ustring name, | ustring name, | ||||
| TypeDesc type, | TypeDesc type, | ||||
| void *val, | void *val, | ||||
| bool derivatives) | bool derivatives) | ||||
| { | { | ||||
| OSLTraceData *tracedata = (OSLTraceData *)sg->tracedata; | OSLTraceData *tracedata = (OSLTraceData *)sg->tracedata; | ||||
| if (source == u_trace && tracedata->init) { | if (source == u_trace && tracedata->init) { | ||||
| if (name == u_hit) { | if (name == u_hit) { | ||||
| return set_attribute_int((tracedata->isect.prim != PRIM_NONE), type, derivatives, val); | return set_attribute_int(tracedata->hit, type, derivatives, val); | ||||
| } | } | ||||
| else if (tracedata->isect.prim != PRIM_NONE) { | 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; | ||||
| KernelGlobals *kg = sd->osl_globals; | KernelGlobals *kg = sd->osl_globals; | ||||
| Show All 38 Lines | |||||