[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51384] trunk/blender/intern/cycles: Cycles: motion blur is now curved and passes exactly through the midpoint.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Oct 17 14:55:25 CEST 2012


Revision: 51384
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51384
Author:   blendix
Date:     2012-10-17 12:55:23 +0000 (Wed, 17 Oct 2012)
Log Message:
-----------
Cycles: motion blur is now curved and passes exactly through the midpoint.

Previously it would only interpolate between the previous and next frame,
which meant it might not hit the current frame position.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/render/camera.cpp
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/util/util_transform.cpp
    trunk/blender/intern/cycles/util/util_transform.h

Modified: trunk/blender/intern/cycles/kernel/kernel_object.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_object.h	2012-10-17 12:17:17 UTC (rev 51383)
+++ trunk/blender/intern/cycles/kernel/kernel_object.h	2012-10-17 12:55:23 UTC (rev 51384)
@@ -23,8 +23,9 @@
 	OBJECT_INVERSE_TRANSFORM = 3,
 	OBJECT_PROPERTIES = 6,
 	OBJECT_TRANSFORM_MOTION_PRE = 8,
-	OBJECT_TRANSFORM_MOTION_POST = 12,
-	OBJECT_DUPLI = 16
+	OBJECT_TRANSFORM_MOTION_MID = 12,
+	OBJECT_TRANSFORM_MOTION_POST = 16,
+	OBJECT_DUPLI = 18
 };
 
 __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type)
@@ -59,11 +60,15 @@
 		motion.pre.z = kernel_tex_fetch(__objects, offset + 2);
 		motion.pre.w = kernel_tex_fetch(__objects, offset + 3);
 
+		motion.mid.x = kernel_tex_fetch(__objects, offset + 4);
+		motion.mid.y = kernel_tex_fetch(__objects, offset + 5);
+		motion.mid.z = kernel_tex_fetch(__objects, offset + 6);
+		motion.mid.w = kernel_tex_fetch(__objects, offset + 7);
 
-		motion.post.x = kernel_tex_fetch(__objects, offset + 4);
-		motion.post.y = kernel_tex_fetch(__objects, offset + 5);
-		motion.post.z = kernel_tex_fetch(__objects, offset + 6);
-		motion.post.w = kernel_tex_fetch(__objects, offset + 7);
+		motion.post.x = kernel_tex_fetch(__objects, offset + 8);
+		motion.post.y = kernel_tex_fetch(__objects, offset + 9);
+		motion.post.z = kernel_tex_fetch(__objects, offset + 10);
+		motion.post.w = kernel_tex_fetch(__objects, offset + 11);
 
 		transform_motion_interpolate(&tfm, &motion, time);
 

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-17 12:17:17 UTC (rev 51383)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-17 12:55:23 UTC (rev 51384)
@@ -29,7 +29,7 @@
 CCL_NAMESPACE_BEGIN
 
 /* constants */
-#define OBJECT_SIZE 		18
+#define OBJECT_SIZE 		22
 #define LIGHT_SIZE			4
 #define FILTER_TABLE_SIZE	256
 #define RAMP_TABLE_SIZE		256

Modified: trunk/blender/intern/cycles/render/camera.cpp
===================================================================
--- trunk/blender/intern/cycles/render/camera.cpp	2012-10-17 12:17:17 UTC (rev 51383)
+++ trunk/blender/intern/cycles/render/camera.cpp	2012-10-17 12:55:23 UTC (rev 51384)
@@ -197,9 +197,8 @@
 	}
 #ifdef __CAMERA_MOTION__
 	else if(need_motion == Scene::MOTION_BLUR) {
-		/* todo: exact camera position will not be hit this way */
 		if(use_motion) {
-			transform_motion_decompose(&kcam->motion, &motion);
+			transform_motion_decompose(&kcam->motion, &motion, &matrix);
 			kcam->have_motion = 1;
 		}
 	}

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-10-17 12:17:17 UTC (rev 51383)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-10-17 12:55:23 UTC (rev 51384)
@@ -1254,8 +1254,6 @@
 
 void WardBsdfNode::compile(SVMCompiler& compiler)
 {
-	ShaderInput *tangent_in = input("Tangent");
-
 	BsdfNode::compile(compiler, input("Roughness U"), input("Roughness V"));
 }
 

Modified: trunk/blender/intern/cycles/render/object.cpp
===================================================================
--- trunk/blender/intern/cycles/render/object.cpp	2012-10-17 12:17:17 UTC (rev 51383)
+++ trunk/blender/intern/cycles/render/object.cpp	2012-10-17 12:55:23 UTC (rev 51384)
@@ -57,7 +57,7 @@
 
 	if(motion_blur && use_motion) {
 		MotionTransform decomp;
-		transform_motion_decompose(&decomp, &motion);
+		transform_motion_decompose(&decomp, &motion, &tfm);
 
 		bounds = BoundBox::empty;
 
@@ -219,7 +219,7 @@
 				mtfm_post = mtfm_post * itfm;
 
 			memcpy(&objects[offset+8], &mtfm_pre, sizeof(float4)*4);
-			memcpy(&objects[offset+12], &mtfm_post, sizeof(float4)*4);
+			memcpy(&objects[offset+16], &mtfm_post, sizeof(float4)*4);
 		}
 #ifdef __OBJECT_MOTION__
 		else if(need_motion == Scene::MOTION_BLUR) {
@@ -227,21 +227,21 @@
 				/* decompose transformations for interpolation */
 				MotionTransform decomp;
 
-				transform_motion_decompose(&decomp, &ob->motion);
-				memcpy(&objects[offset+8], &decomp, sizeof(float4)*8);
+				transform_motion_decompose(&decomp, &ob->motion, &ob->tfm);
+				memcpy(&objects[offset+8], &decomp, sizeof(float4)*12);
 				flag |= SD_OBJECT_MOTION;
 				have_motion = true;
 			}
 			else {
 				float4 no_motion = make_float4(FLT_MAX);
-				memcpy(&objects[offset+8], &no_motion, sizeof(float4));
+				memcpy(&objects[offset+8], &no_motion, sizeof(float4)*12);
 			}
 		}
 #endif
 
 		/* dupli object coords */
-		objects[offset+16] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], 0.0f);
-		objects[offset+17] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], 0.0f, 0.0f);
+		objects[offset+20] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], 0.0f);
+		objects[offset+21] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], 0.0f, 0.0f);
 
 		/* object flag */
 		if(ob->use_holdout)

Modified: trunk/blender/intern/cycles/util/util_transform.cpp
===================================================================
--- trunk/blender/intern/cycles/util/util_transform.cpp	2012-10-17 12:17:17 UTC (rev 51383)
+++ trunk/blender/intern/cycles/util/util_transform.cpp	2012-10-17 12:55:23 UTC (rev 51384)
@@ -246,9 +246,10 @@
 	decomp->w = make_float4(scale.y.z, scale.z.x, scale.z.y, scale.z.z);
 }
 
-void transform_motion_decompose(MotionTransform *decomp, const MotionTransform *motion)
+void transform_motion_decompose(MotionTransform *decomp, const MotionTransform *motion, const Transform *mid)
 {
 	transform_decompose(&decomp->pre, &motion->pre);
+	transform_decompose(&decomp->mid, mid);
 	transform_decompose(&decomp->post, &motion->post);
 }
 

Modified: trunk/blender/intern/cycles/util/util_transform.h
===================================================================
--- trunk/blender/intern/cycles/util/util_transform.h	2012-10-17 12:17:17 UTC (rev 51383)
+++ trunk/blender/intern/cycles/util/util_transform.h	2012-10-17 12:55:23 UTC (rev 51384)
@@ -41,6 +41,7 @@
 
 typedef struct MotionTransform {
 	Transform pre;
+	Transform mid;
 	Transform post;
 } MotionTransform;
 
@@ -383,11 +384,37 @@
 {
 	Transform decomp;
 
-	decomp.x = quat_interpolate(motion->pre.x, motion->post.x, t);
-	decomp.y = (1.0f - t)*motion->pre.y + t*motion->post.y;
-	decomp.z = (1.0f - t)*motion->pre.z + t*motion->post.z;
-	decomp.w = (1.0f - t)*motion->pre.w + t*motion->post.w;
+	/* 3 point bezier curve interpolation for position */
+	float3 Ppre = float4_to_float3(motion->pre.y);
+	float3 Pmid = float4_to_float3(motion->mid.y);
+	float3 Ppost = float4_to_float3(motion->post.y);
 
+	float3 Pcontrol = 2.0f*Pmid - 0.5f*(Ppre + Ppost);
+	float3 P = Ppre*t*t + Pcontrol*2.0f*t*(1.0f - t) + Ppost*(1.0f - t)*(1.0f - t);
+
+	decomp.y.x = P.x;
+	decomp.y.y = P.y;
+	decomp.y.z = P.z;
+
+	/* linear interpolation for rotation and scale */
+	if(t < 0.5f) {
+		t *= 2.0f;
+
+		decomp.x = quat_interpolate(motion->pre.x, motion->mid.x, t);
+		decomp.y.w = (1.0f - t)*motion->pre.y.w + t*motion->mid.y.w;
+		decomp.z = (1.0f - t)*motion->pre.z + t*motion->mid.z;
+		decomp.w = (1.0f - t)*motion->pre.w + t*motion->mid.w;
+	}
+	else {
+		t = (t - 0.5f)*2.0f;
+
+		decomp.x = quat_interpolate(motion->mid.x, motion->post.x, t);
+		decomp.y.w = (1.0f - t)*motion->mid.y.w + t*motion->post.y.w;
+		decomp.z = (1.0f - t)*motion->mid.z + t*motion->post.z;
+		decomp.w = (1.0f - t)*motion->mid.w + t*motion->post.w;
+	}
+
+	/* compose rotation, translation, scale into matrix */
 	transform_compose(tfm, &decomp);
 }
 
@@ -398,7 +425,7 @@
 	return (A.pre == B.pre && A.post == B.post);
 }
 
-void transform_motion_decompose(MotionTransform *decomp, const MotionTransform *motion);
+void transform_motion_decompose(MotionTransform *decomp, const MotionTransform *motion, const Transform *mid);
 
 #endif
 




More information about the Bf-blender-cvs mailing list