[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57918] branches/soc-2013-dingto/intern/ cycles/kernel: Cycles / Vector Transform Node:

Thomas Dinges blender at dingto.org
Tue Jul 2 00:56:57 CEST 2013


Revision: 57918
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57918
Author:   dingto
Date:     2013-07-01 22:56:56 +0000 (Mon, 01 Jul 2013)
Log Message:
-----------
Cycles / Vector Transform Node:
* Implementation of the node for SVM. This covers all possible transformations: World <> Object <> Camera space.
As far as I can tell, it also works fine with Motion Blur enabled.

ToDo:
* SVM differs from OSL, when the node is used on the world. 

Modified Paths:
--------------
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_object.h
    branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h

Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_object.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_object.h	2013-07-01 22:33:42 UTC (rev 57917)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_object.h	2013-07-01 22:56:56 UTC (rev 57918)
@@ -154,6 +154,16 @@
 #endif
 }
 
+__device_inline void object_inverse_dir_transform(KernelGlobals *kg, ShaderData *sd, float3 *D)
+{
+#ifdef __OBJECT_MOTION__
+	*D = transform_direction(&sd->ob_itfm, *D);
+#else
+	Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
+	*D = transform_direction(&tfm, *D);
+#endif
+}
+
 __device_inline float3 object_location(KernelGlobals *kg, ShaderData *sd)
 {
 	if(sd->object == ~0)

Modified: branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h	2013-07-01 22:33:42 UTC (rev 57917)
+++ branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_vector_transform.h	2013-07-01 22:56:56 UTC (rev 57918)
@@ -18,6 +18,11 @@
 
 CCL_NAMESPACE_BEGIN
 
+/* ToDo
+* if (object != ~0) null check?
+* differs from OSL when used for the world
+*/
+
 /* Vector Transform */
 
 __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
@@ -25,19 +30,72 @@
 	uint itype, ifrom, ito;
 	uint vector_in, vector_out;
 	
-	float3 out = make_float3(0.0f, 0.0f, 0.0f);
-	
 	decode_node_uchar4(node.y, &itype, &ifrom, &ito, NULL);
 	decode_node_uchar4(node.z, &vector_in, &vector_out, NULL, NULL);
 	
+	float3 in = stack_load_float3(stack, vector_in);
+	
 	NodeVectorTransformType type = (NodeVectorTransformType)itype;
 	NodeVectorTransformConvertFrom from = (NodeVectorTransformConvertFrom)ifrom;
 	NodeVectorTransformConvertTo to = (NodeVectorTransformConvertTo)ito;
 	
-	float3 vec_in = stack_load_float3(stack, vector_in);
+	Transform tfm;
 	
-	if(stack_valid(vector_out))
-		stack_store_float3(stack, vector_out, out);
+	/* From world */
+	if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD) {
+		if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) {
+			tfm = kernel_data.cam.worldtocamera;
+			if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+				in = transform_direction(&tfm, in);
+			else
+				in = transform_point(&tfm, in);
+		}
+		else if (to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT) {
+			if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+				object_inverse_dir_transform(kg, sd, &in);
+			else
+				object_inverse_position_transform(kg, sd, &in);
+		}
+	}
+	
+	/* From camera */
+	else if (from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_CAMERA) {
+		if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT) {
+			tfm = kernel_data.cam.cameratoworld;
+			if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+				in = transform_direction(&tfm, in);
+			else
+				in = transform_point(&tfm, in);
+		}
+		if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT) {
+			if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+				object_inverse_dir_transform(kg, sd, &in);
+			else
+				object_inverse_position_transform(kg, sd, &in);
+		}
+	}
+	
+	/* From object */
+	else if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT) {
+		if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) {
+			if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+				object_dir_transform(kg, sd, &in);
+			else
+				object_position_transform(kg, sd, &in);
+		}
+		if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) {
+			tfm = kernel_data.cam.worldtocamera;
+			if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+				in = transform_direction(&tfm, in);
+			else
+				in = transform_point(&tfm, in);
+		}
+	}
+	
+	/* Output */	
+	if(stack_valid(vector_out)) {
+			stack_store_float3(stack, vector_out, in);
+	}
 }
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list