[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46200] trunk/blender: Cycles: add Ray Length output to Light Path node.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed May 2 19:03:46 CEST 2012


Revision: 46200
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46200
Author:   blendix
Date:     2012-05-02 17:03:46 +0000 (Wed, 02 May 2012)
Log Message:
-----------
Cycles: add Ray Length output to Light Path node. This gives the distance travelled
by the last light ray. One use case for this might be to do absorption.

Patch #31232 by Agustin benavidez, see this blog post for details:
http://agus3d.blogspot.com.ar/2012/05/blender-cycles-ray-length-node-output.html

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_emission.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/svm/svm_light_path.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_light_path.c

Modified: trunk/blender/intern/cycles/kernel/kernel_emission.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_emission.h	2012-05-02 17:01:48 UTC (rev 46199)
+++ trunk/blender/intern/cycles/kernel/kernel_emission.h	2012-05-02 17:03:46 UTC (rev 46200)
@@ -21,7 +21,7 @@
 /* Direction Emission */
 
 __device float3 direct_emissive_eval(KernelGlobals *kg, float rando,
-	LightSample *ls, float u, float v, float3 I, float time)
+	LightSample *ls, float u, float v, float3 I, float t, float time)
 {
 	/* setup shading at emitter */
 	ShaderData sd;
@@ -40,7 +40,7 @@
 	else
 #endif
 	{
-		shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, time);
+		shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time);
 		ls->Ng = sd.Ng;
 
 		/* no path flag, we're evaluating this for all closures. that's weak but
@@ -87,7 +87,7 @@
 		return false;
 
 	/* evaluate closure */
-	float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, sd->time);
+	float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, ls.t, sd->time);
 
 	if(is_zero(light_eval))
 		return false;

Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-05-02 17:01:48 UTC (rev 46199)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-05-02 17:03:46 UTC (rev 46200)
@@ -77,6 +77,7 @@
 	sd->N = Ng;
 	sd->I = -ray->D;
 	sd->shader = shader;
+	sd->ray_length = isect->t;
 
 	/* smooth normal */
 	if(sd->shader & SHADER_SMOOTH_NORMAL)
@@ -127,7 +128,7 @@
 
 __device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
 	const float3 P, const float3 Ng, const float3 I,
-	int shader, int object, int prim, float u, float v, float time)
+	int shader, int object, int prim, float u, float v, float t, float time)
 {
 	/* vectors */
 	sd->P = P;
@@ -145,6 +146,7 @@
 	sd->u = u;
 	sd->v = v;
 #endif
+	sd->ray_length = t;
 
 	/* detect instancing, for non-instanced the object index is -object-1 */
 #ifdef __INSTANCING__
@@ -242,7 +244,7 @@
 
 	/* watch out: no instance transform currently */
 
-	shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v, TIME_INVALID);
+	shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v, 0.0f, TIME_INVALID);
 }
 
 /* ShaderData setup from ray into background */
@@ -259,6 +261,7 @@
 #ifdef __MOTION__
 	sd->time = ray->time;
 #endif
+	sd->ray_length = 0.0f;
 
 #ifdef __INSTANCING__
 	sd->object = ~0;

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-05-02 17:01:48 UTC (rev 46199)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-05-02 17:03:46 UTC (rev 46200)
@@ -401,6 +401,9 @@
 
 	/* motion blur sample time */
 	float time;
+	
+	/* length of the ray being shaded */
+	float ray_length;
 
 #ifdef __MOTION__
 	/* object <-> world space transformations, cached to avoid

Modified: trunk/blender/intern/cycles/kernel/svm/svm_light_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_light_path.h	2012-05-02 17:01:48 UTC (rev 46199)
+++ trunk/blender/intern/cycles/kernel/svm/svm_light_path.h	2012-05-02 17:03:46 UTC (rev 46200)
@@ -33,6 +33,7 @@
 		case NODE_LP_reflection: info = (path_flag & PATH_RAY_REFLECT)? 1.0f: 0.0f; break;
 		case NODE_LP_transmission: info = (path_flag & PATH_RAY_TRANSMIT)? 1.0f: 0.0f; break;
 		case NODE_LP_backfacing: info = (sd->flag & SD_BACKFACING)? 1.0f: 0.0f; break;
+		case NODE_LP_ray_length: info = sd->ray_length; break;
 	}
 
 	stack_store_float(stack, out_offset, info);

Modified: trunk/blender/intern/cycles/kernel/svm/svm_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_types.h	2012-05-02 17:01:48 UTC (rev 46199)
+++ trunk/blender/intern/cycles/kernel/svm/svm_types.h	2012-05-02 17:03:46 UTC (rev 46200)
@@ -115,7 +115,8 @@
 	NODE_LP_singular,
 	NODE_LP_reflection,
 	NODE_LP_transmission,
-	NODE_LP_backfacing
+	NODE_LP_backfacing,
+	NODE_LP_ray_length
 } NodeLightPath;
 
 typedef enum NodeTexCoord {

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-05-02 17:01:48 UTC (rev 46199)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-05-02 17:03:46 UTC (rev 46200)
@@ -1623,6 +1623,7 @@
 	add_output("Is Singular Ray", SHADER_SOCKET_FLOAT);
 	add_output("Is Reflection Ray", SHADER_SOCKET_FLOAT);
 	add_output("Is Transmission Ray", SHADER_SOCKET_FLOAT);
+	add_output("Ray Length", SHADER_SOCKET_FLOAT);
 }
 
 void LightPathNode::compile(SVMCompiler& compiler)
@@ -1671,6 +1672,13 @@
 		compiler.stack_assign(out);
 		compiler.add_node(NODE_LIGHT_PATH, NODE_LP_transmission, out->stack_offset);
 	}
+	
+	out = output("Ray Length");
+	if(!out->links.empty()) {
+		compiler.stack_assign(out);
+		compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_length, out->stack_offset);
+	}
+
 }
 
 void LightPathNode::compile(OSLCompiler& compiler)

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_light_path.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_light_path.c	2012-05-02 17:01:48 UTC (rev 46199)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_light_path.c	2012-05-02 17:03:46 UTC (rev 46200)
@@ -37,6 +37,7 @@
 	{	SOCK_FLOAT, 0, "Is Singular Ray",		0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
 	{	SOCK_FLOAT, 0, "Is Reflection Ray",		0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
 	{	SOCK_FLOAT, 0, "Is Transmission Ray",	0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+	{	SOCK_FLOAT, 0, "Ray Length",			0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
 	{	-1, 0, ""	}
 };
 




More information about the Bf-blender-cvs mailing list