diff --git a/intern/cycles/kernel/osl/nodes/node_light_path.osl b/intern/cycles/kernel/osl/nodes/node_light_path.osl index 0ead20bf2bb..ca92a5e6553 100644 --- a/intern/cycles/kernel/osl/nodes/node_light_path.osl +++ b/intern/cycles/kernel/osl/nodes/node_light_path.osl @@ -25,7 +25,8 @@ shader node_light_path( output float IsGlossyRay = 0.0, output float IsSingularRay = 0.0, output float IsReflectionRay = 0.0, - output float IsTransmissionRay = 0.0) + output float IsTransmissionRay = 0.0, + output float RayLength = 0.0) { IsCameraRay = raytype("camera"); IsShadowRay = raytype("shadow"); @@ -34,5 +35,7 @@ shader node_light_path( IsSingularRay = raytype("singular"); IsReflectionRay = raytype("reflection"); IsTransmissionRay = raytype("refraction"); + + getattribute("std::ray_length", RayLength); } diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index 6393412855b..be5273b9ad3 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -459,6 +459,15 @@ static bool get_object_standard_attribute(KernelGlobals *kg, ShaderData *sd, ust set_attribute_float3(fval, type, derivatives, val); return true; } + + /* Ray Length */ + else if (name == "std::ray_length") { + float fval[3]; + fval[0] = sd->ray_length; + fval[1] = fval[2] = 0.0; /* derivates set to 0 */ + set_attribute_float(fval, type, derivatives, val); + return true; + } else return false;