[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51364] trunk/blender/intern/cycles/kernel /osl: Fix for (camera) motion blur changes in Cycles OSL.

Lukas Toenne lukas.toenne at googlemail.com
Tue Oct 16 12:59:38 CEST 2012


Revision: 51364
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51364
Author:   lukastoenne
Date:     2012-10-16 10:59:35 +0000 (Tue, 16 Oct 2012)
Log Message:
-----------
Fix for (camera) motion blur changes in Cycles OSL. Compilation was broken due to changed object transform functions. Also added a few missing renderer service implementations for matrix callbacks.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_services.h

Modified: trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_services.cpp	2012-10-16 10:48:19 UTC (rev 51363)
+++ trunk/blender/intern/cycles/kernel/osl/osl_services.cpp	2012-10-16 10:59:35 UTC (rev 51364)
@@ -72,7 +72,11 @@
 		int object = sd->object;
 
 		if (object != ~0) {
-			Transform tfm = object_fetch_transform(kg, object, time, OBJECT_TRANSFORM);
+#ifdef __OBJECT_MOTION__
+			Transform tfm = object_fetch_transform_motion(kg, object, time, NULL);
+#else
+			Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+#endif
 			tfm = transform_transpose(tfm);
 			result = TO_MATRIX44(tfm);
 
@@ -93,9 +97,14 @@
 		int object = sd->object;
 
 		if (object != ~0) {
-			Transform tfm = object_fetch_transform(kg, object, time, OBJECT_INVERSE_TRANSFORM);
-			tfm = transform_transpose(tfm);
-			result = TO_MATRIX44(tfm);
+#ifdef __OBJECT_MOTION__
+			Transform itfm;
+			object_fetch_transform_motion(kg, object, time, &itfm);
+#else
+			Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
+#endif
+			itfm = transform_transpose(itfm);
+			result = TO_MATRIX44(itfm);
 
 			return true;
 		}
@@ -162,16 +171,110 @@
 
 bool OSLRenderServices::get_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform)
 {
-	// XXX implementation
-	return true;
+	/* 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. */
+	if (xform) {
+		KernelGlobals *kg = kernel_globals;
+		const ShaderData *sd = (const ShaderData *)xform;
+		int object = sd->object;
+
+		if (object != ~0) {
+#ifdef __OBJECT_MOTION__
+			Transform tfm = sd->ob_tfm;
+#else
+			Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+#endif
+			tfm = transform_transpose(tfm);
+			result = TO_MATRIX44(tfm);
+
+			return true;
+		}
+	}
+
+	return false;
 }
 
+bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform)
+{
+	/* 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. */
+	if (xform) {
+		KernelGlobals *kg = kernel_globals;
+		const ShaderData *sd = (const ShaderData *)xform;
+		int object = sd->object;
+
+		if (object != ~0) {
+#ifdef __OBJECT_MOTION__
+			Transform tfm = sd->ob_itfm;
+#else
+			Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
+#endif
+			tfm = transform_transpose(tfm);
+			result = TO_MATRIX44(tfm);
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
 bool OSLRenderServices::get_matrix(OSL::Matrix44 &result, ustring from)
 {
-	// XXX implementation
-	return true;
+	KernelGlobals *kg = kernel_globals;
+
+	if (from == u_ndc) {
+		Transform tfm = transform_transpose(kernel_data.cam.ndctoworld);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+	else if (from == u_raster) {
+		Transform tfm = transform_transpose(kernel_data.cam.rastertoworld);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+	else if (from == u_screen) {
+		Transform tfm = transform_transpose(kernel_data.cam.screentoworld);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+	else if (from == u_camera) {
+		Transform tfm = transform_transpose(kernel_data.cam.cameratoworld);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+
+	return false;
 }
 
+bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, ustring to)
+{
+	KernelGlobals *kg = kernel_globals;
+	
+	if (to == u_ndc) {
+		Transform tfm = transform_transpose(kernel_data.cam.worldtondc);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+	else if (to == u_raster) {
+		Transform tfm = transform_transpose(kernel_data.cam.worldtoraster);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+	else if (to == u_screen) {
+		Transform tfm = transform_transpose(kernel_data.cam.worldtoscreen);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+	else if (to == u_camera) {
+		Transform tfm = transform_transpose(kernel_data.cam.worldtocamera);
+		result = TO_MATRIX44(tfm);
+		return true;
+	}
+	
+	return false;
+}
+
 bool OSLRenderServices::get_array_attribute(void *renderstate, bool derivatives, 
                                             ustring object, TypeDesc type, ustring name,
                                             int index, void *val)

Modified: trunk/blender/intern/cycles/kernel/osl/osl_services.h
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_services.h	2012-10-16 10:48:19 UTC (rev 51363)
+++ trunk/blender/intern/cycles/kernel/osl/osl_services.h	2012-10-16 10:59:35 UTC (rev 51364)
@@ -54,7 +54,10 @@
 	bool get_inverse_matrix(OSL::Matrix44 &result, ustring to, float time);
 	
 	bool get_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform);
+	bool get_inverse_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform);
+	
 	bool get_matrix(OSL::Matrix44 &result, ustring from);
+	bool get_inverse_matrix(OSL::Matrix44 &result, ustring from);
 
 	bool get_array_attribute(void *renderstate, bool derivatives,
 	                         ustring object, TypeDesc type, ustring name,




More information about the Bf-blender-cvs mailing list