[Bf-blender-cvs] [cd15d87bfcb] master: Code refactor: avoid motion transform copy, remove unused curved code.

Brecht Van Lommel noreply at git.blender.org
Sat Mar 10 06:43:55 CET 2018


Commit: cd15d87bfcb4aafb0d4f13dcc902a135f472c9df
Author: Brecht Van Lommel
Date:   Wed Mar 7 23:52:26 2018 +0100
Branches: master
https://developer.blender.org/rBcd15d87bfcb4aafb0d4f13dcc902a135f472c9df

Code refactor: avoid motion transform copy, remove unused curved code.

The purpose of the previous code refactoring is to make the code more readable,
but combined with this change benchmarks also render about 2-3% faster with an
NVIDIA Titan Xp.

===================================================================

M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/kernel_camera.h
M	intern/cycles/util/util_transform.h

===================================================================

diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index 0b410f448c8..3fbceded261 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -96,10 +96,10 @@ ccl_device_inline Transform object_fetch_vector_transform(KernelGlobals *kg, int
 #ifdef __OBJECT_MOTION__
 ccl_device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int object, float time)
 {
-	MotionTransform motion = kernel_tex_fetch(__objects, object).tfm;
+	const ccl_global MotionTransform *motion = &kernel_tex_fetch(__objects, object).tfm;
 
 	Transform tfm;
-	transform_motion_interpolate(&tfm, &motion, time);
+	transform_motion_interpolate(&tfm, motion, time);
 
 	return tfm;
 }
diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h
index 96cdb04d955..66ed9f5fc0f 100644
--- a/intern/cycles/kernel/kernel_camera.h
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -92,16 +92,10 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, float raster_x, flo
 
 #ifdef __CAMERA_MOTION__
 	if(kernel_data.cam.have_motion) {
-#  ifdef __KERNEL_OPENCL__
-		const MotionTransform tfm = kernel_data.cam.motion;
-		transform_motion_interpolate(&cameratoworld,
-									 &tfm,
-		                             ray->time);
-#  else
-		transform_motion_interpolate(&cameratoworld,
-		                             &kernel_data.cam.motion,
-		                             ray->time);
-#  endif
+		ccl_constant MotionTransform *motion = &kernel_data.cam.motion;
+		transform_motion_interpolate_constant(&cameratoworld,
+		                                      motion,
+		                                      ray->time);
 	}
 #endif
 
@@ -204,16 +198,10 @@ ccl_device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, fl
 
 #ifdef __CAMERA_MOTION__
 	if(kernel_data.cam.have_motion) {
-#  ifdef __KERNEL_OPENCL__
-		const MotionTransform tfm = kernel_data.cam.motion;
-		transform_motion_interpolate(&cameratoworld,
-		                             &tfm,
-		                             ray->time);
-#  else
-		transform_motion_interpolate(&cameratoworld,
-		                             &kernel_data.cam.motion,
-		                             ray->time);
-#  endif
+		ccl_constant MotionTransform *motion = &kernel_data.cam.motion;
+		transform_motion_interpolate_constant(&cameratoworld,
+		                                      motion,
+		                                      ray->time);
 	}
 #endif
 
@@ -282,16 +270,10 @@ ccl_device_inline void camera_sample_panorama(ccl_constant KernelCamera *cam,
 
 #ifdef __CAMERA_MOTION__
 	if(cam->have_motion) {
-#  ifdef __KERNEL_OPENCL__
-		const MotionTransform tfm = cam->motion;
-		transform_motion_interpolate(&cameratoworld,
-		                             &tfm,
-		                             ray->time);
-#  else
-		transform_motion_interpolate(&cameratoworld,
-		                             &cam->motion,
-		                             ray->time);
-#  endif
+		ccl_constant MotionTransform *motion = &cam->motion;
+		transform_motion_interpolate_constant(&cameratoworld,
+		                                      motion,
+		                                      ray->time);
 	}
 #endif
 
diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h
index ac0804a7227..1efe001f6a8 100644
--- a/intern/cycles/util/util_transform.h
+++ b/intern/cycles/util/util_transform.h
@@ -455,40 +455,45 @@ ccl_device_inline void transform_compose(Transform *tfm, const Transform *decomp
 	tfm->w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
 }
 
-/* Disabled for now, need arc-length parametrization for constant speed motion.
- * #define CURVED_MOTION_INTERPOLATE */
+ccl_device void transform_motion_interpolate(Transform *tfm, const ccl_global MotionTransform *motion, float t)
+{
+	Transform decomp;
+
+	/* 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 = (1.0f - t)*motion->pre.y + t*motion->mid.y;
+		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 = (1.0f - t)*motion->mid.y + t*motion->post.y;
+		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);
+}
 
-ccl_device void transform_motion_interpolate(Transform *tfm, const MotionTransform *motion, float t)
+ccl_device void transform_motion_interpolate_constant(Transform *tfm, ccl_constant MotionTransform *motion, float t)
 {
 	/* possible optimization: is it worth it adding a check to skip scaling?
 	 * it's probably quite uncommon to have scaling objects. or can we skip
 	 * just shearing perhaps? */
 	Transform decomp;
 
-#ifdef CURVED_MOTION_INTERPOLATE
-	/* 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;
-#endif
-
 	/* linear interpolation for rotation and scale */
 	if(t < 0.5f) {
 		t *= 2.0f;
 
 		decomp.x = quat_interpolate(motion->pre.x, motion->mid.x, t);
-#ifdef CURVED_MOTION_INTERPOLATE
-		decomp.y.w = (1.0f - t)*motion->pre.y.w + t*motion->mid.y.w;
-#else
 		decomp.y = (1.0f - t)*motion->pre.y + t*motion->mid.y;
-#endif
 		decomp.z = (1.0f - t)*motion->pre.z + t*motion->mid.z;
 		decomp.w = (1.0f - t)*motion->pre.w + t*motion->mid.w;
 	}
@@ -496,11 +501,7 @@ ccl_device void transform_motion_interpolate(Transform *tfm, const MotionTransfo
 		t = (t - 0.5f)*2.0f;
 
 		decomp.x = quat_interpolate(motion->mid.x, motion->post.x, t);
-#ifdef CURVED_MOTION_INTERPOLATE
-		decomp.y.w = (1.0f - t)*motion->mid.y.w + t*motion->post.y.w;
-#else
 		decomp.y = (1.0f - t)*motion->mid.y + t*motion->post.y;
-#endif
 		decomp.z = (1.0f - t)*motion->mid.z + t*motion->post.z;
 		decomp.w = (1.0f - t)*motion->mid.w + t*motion->post.w;
 	}



More information about the Bf-blender-cvs mailing list