[Bf-blender-cvs] [623141f339d] master: Code refactor: add DecomposedTransform.

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


Commit: 623141f339d5066ed6b96ad70ab45fb294e3e612
Author: Brecht Van Lommel
Date:   Thu Mar 8 06:19:17 2018 +0100
Branches: master
https://developer.blender.org/rB623141f339d5066ed6b96ad70ab45fb294e3e612

Code refactor: add DecomposedTransform.

This is in preparation of making Transform affine only, and also gives us
a little extra type safety so we don't accidentally treat it as a regular
4x4 matrix.

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

M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/geom/geom_primitive.h
M	intern/cycles/kernel/kernel_camera.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/camera.cpp
M	intern/cycles/render/object.cpp
M	intern/cycles/util/util_projection.h
M	intern/cycles/util/util_transform.cpp
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 3fbceded261..cd330308e07 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -96,7 +96,7 @@ 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)
 {
-	const ccl_global MotionTransform *motion = &kernel_tex_fetch(__objects, object).tfm;
+	const ccl_global DecomposedMotionTransform *motion = &kernel_tex_fetch(__objects, object).tfm;
 
 	Transform tfm;
 	transform_motion_interpolate(&tfm, motion, time);
diff --git a/intern/cycles/kernel/geom/geom_primitive.h b/intern/cycles/kernel/geom/geom_primitive.h
index 6a8ea793ff0..4e84446bae0 100644
--- a/intern/cycles/kernel/geom/geom_primitive.h
+++ b/intern/cycles/kernel/geom/geom_primitive.h
@@ -220,13 +220,13 @@ ccl_device_inline float4 primitive_motion_vector(KernelGlobals *kg, ShaderData *
 		motion_center.x *= kernel_data.cam.width;
 		motion_center.y *= kernel_data.cam.height;
 
-		tfm = kernel_data.cam.motion.pre;
+		tfm = kernel_data.cam.pass_motion.pre;
 		motion_pre = normalize(transform_point(&tfm, motion_pre));
 		motion_pre = float2_to_float3(direction_to_panorama(&kernel_data.cam, motion_pre));
 		motion_pre.x *= kernel_data.cam.width;
 		motion_pre.y *= kernel_data.cam.height;
 
-		tfm = kernel_data.cam.motion.post;
+		tfm = kernel_data.cam.pass_motion.post;
 		motion_post = normalize(transform_point(&tfm, motion_post));
 		motion_post = float2_to_float3(direction_to_panorama(&kernel_data.cam, motion_post));
 		motion_post.x *= kernel_data.cam.width;
diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h
index 5b102eabb93..755c3472072 100644
--- a/intern/cycles/kernel/kernel_camera.h
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -92,7 +92,7 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, float raster_x, flo
 
 #ifdef __CAMERA_MOTION__
 	if(kernel_data.cam.have_motion) {
-		ccl_constant MotionTransform *motion = &kernel_data.cam.motion;
+		ccl_constant DecomposedMotionTransform *motion = &kernel_data.cam.motion;
 		transform_motion_interpolate_constant(&cameratoworld,
 		                                      motion,
 		                                      ray->time);
@@ -198,7 +198,7 @@ ccl_device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, fl
 
 #ifdef __CAMERA_MOTION__
 	if(kernel_data.cam.have_motion) {
-		ccl_constant MotionTransform *motion = &kernel_data.cam.motion;
+		ccl_constant DecomposedMotionTransform *motion = &kernel_data.cam.motion;
 		transform_motion_interpolate_constant(&cameratoworld,
 		                                      motion,
 		                                      ray->time);
@@ -270,7 +270,7 @@ ccl_device_inline void camera_sample_panorama(ccl_constant KernelCamera *cam,
 
 #ifdef __CAMERA_MOTION__
 	if(cam->have_motion) {
-		ccl_constant MotionTransform *motion = &cam->motion;
+		ccl_constant DecomposedMotionTransform *motion = &cam->motion;
 		transform_motion_interpolate_constant(&cameratoworld,
 		                                      motion,
 		                                      ray->time);
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 87faa0d0e53..5934ff53f57 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1201,12 +1201,15 @@ typedef struct KernelCamera {
 	ProjectionTransform worldtondc;
 	Transform worldtocamera;
 
-	MotionTransform motion;
+	DecomposedMotionTransform motion;
 
 	/* Stores changes in the projeciton matrix. Use for camera zoom motion
 	 * blur and motion pass output for perspective camera. */
 	PerspectiveMotionTransform perspective_motion;
 
+	/* Transforms for motion pass. */
+	MotionTransform pass_motion;
+
 	int shutter_table_offset;
 
 	/* Rolling shutter */
@@ -1430,7 +1433,7 @@ static_assert_align(KernelData, 16);
 /* Kernel data structures. */
 
 typedef struct KernelObject {
-	MotionTransform tfm;
+	DecomposedMotionTransform tfm;
 
 	float surface_area;
 	float pass_id;
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index e6585b2de55..5e8c5db6c0e 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -341,12 +341,12 @@ void Camera::update(Scene *scene)
 		/* TODO(sergey): Support perspective (zoom, fov) motion. */
 		if(type == CAMERA_PANORAMA) {
 			if(use_motion) {
-				kcam->motion.pre = transform_inverse(motion.pre);
-				kcam->motion.post = transform_inverse(motion.post);
+				kcam->pass_motion.pre = transform_inverse(motion.pre);
+				kcam->pass_motion.post = transform_inverse(motion.post);
 			}
 			else {
-				kcam->motion.pre = kcam->worldtocamera;
-				kcam->motion.post = kcam->worldtocamera;
+				kcam->pass_motion.pre = kcam->worldtocamera;
+				kcam->pass_motion.post = kcam->worldtocamera;
 			}
 		}
 		else {
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index c992469cb39..f632f7c4a53 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -97,7 +97,7 @@ void Object::compute_bounds(bool motion_blur)
 			mtfm.post = tfm;
 		}
 
-		MotionTransform decomp;
+		DecomposedMotionTransform decomp;
 		transform_motion_decompose(&decomp, &mtfm, &tfm);
 
 		bounds = BoundBox::empty;
@@ -401,7 +401,7 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
 	else if(state->need_motion == Scene::MOTION_BLUR) {
 		if(ob->use_motion) {
 			/* decompose transformations for interpolation. */
-			MotionTransform decomp;
+			DecomposedMotionTransform decomp;
 
 			transform_motion_decompose(&decomp, &ob->motion, &ob->tfm);
 			kobject.tfm = decomp;
diff --git a/intern/cycles/util/util_projection.h b/intern/cycles/util/util_projection.h
index 0b8ff032120..8073568046d 100644
--- a/intern/cycles/util/util_projection.h
+++ b/intern/cycles/util/util_projection.h
@@ -21,7 +21,7 @@
 
 CCL_NAMESPACE_BEGIN
 
-/* Data Types */
+/* 4x4 projection matrix, perspective or orthographic. */
 
 typedef struct ProjectionTransform {
 	float4 x, y, z, w; /* rows */
diff --git a/intern/cycles/util/util_transform.cpp b/intern/cycles/util/util_transform.cpp
index c1270545339..edb53cc06b7 100644
--- a/intern/cycles/util/util_transform.cpp
+++ b/intern/cycles/util/util_transform.cpp
@@ -202,7 +202,7 @@ float4 transform_to_quat(const Transform& tfm)
 	return qt;
 }
 
-static void transform_decompose(Transform *decomp, const Transform *tfm)
+static void transform_decompose(DecomposedTransform *decomp, const Transform *tfm)
 {
 	/* extract translation */
 	decomp->y = make_float4(tfm->x.w, tfm->y.w, tfm->z.w, 0.0f);
@@ -247,7 +247,7 @@ static void transform_decompose(Transform *decomp, const Transform *tfm)
 	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, const Transform *mid)
+void transform_motion_decompose(DecomposedMotionTransform *decomp, const MotionTransform *motion, const Transform *mid)
 {
 	transform_decompose(&decomp->pre, &motion->pre);
 	transform_decompose(&decomp->mid, mid);
diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h
index 52022292d0b..65166e325e8 100644
--- a/intern/cycles/util/util_transform.h
+++ b/intern/cycles/util/util_transform.h
@@ -37,16 +37,26 @@ typedef struct Transform {
 #endif
 } Transform;
 
-/* transform decomposed in rotation/translation/scale. we use the same data
- * structure as Transform, and tightly pack decomposition into it. first the
- * rotation (4), then translation (3), then 3x3 scale matrix (9). */
-
 typedef struct ccl_may_alias MotionTransform {
 	Transform pre;
 	Transform mid;
 	Transform post;
 } MotionTransform;
 
+/* Transform decomposed in rotation/translation/scale. we use the same data
+ * structure as Transform, and tightly pack decomposition into it. first the
+ * rotation (4), then translation (3), then 3x3 scale matrix (9). */
+
+typedef struct DecomposedTransform {
+	float4 x, y, z, w;
+} DecomposedTransform;
+
+typedef struct ccl_may_alias DecomposedMotionTransform {
+	DecomposedTransform pre;
+	DecomposedTransform mid;
+	DecomposedTransform post;
+} DecomposedMotionTransform;
+
 /* Functions */
 
 ccl_device_inline float3 transform_point(const Transform *t, const float3 a)
@@ -384,7 +394,7 @@ ccl_device_inline Transform transform_quick_inverse(Transform M)
 	return R;
 }
 
-ccl_device_inline void transform_compose(Transform *tfm, const Transform *decomp)
+ccl_device_inline void transform_compose(Transform *tfm, const DecomposedTransform *decomp)
 {
 	/* rotation */
 	float q0, q1, q2, q3, qda, qdb, qdc, qaa, qab, qac, qbb, qbc, qcc;
@@ -420,9 +430,9 @@ ccl_device_inline void transform_compose(Transform *tfm, const Transform *decomp
 	tfm->w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
 }
 
-ccl_device void transform_motion_interpolate(Transform *tfm, const ccl_global MotionTransform *motion, float t)
+ccl_device void transform_motion_interpolate(Transform *tfm, const ccl_global DecomposedMotionTransform *motion, float t)
 {
-	Transform decomp;
+	DecomposedTransform decomp;
 
 	/* linear interpolation for rotation and scale */
 	if(t < 0.5f) {
@@ -446,12 +456,12 @@ ccl_device void transform_motion_interpolate(Transform *tfm, const ccl_global Mo
 	transform_compose(tfm, &decomp);
 }
 
-ccl_device void transform_motion_interpolate_constant(Transform *tfm, ccl_constant MotionTransform *motion, float t)
+ccl_device void transform_motion_interpolate_constant(Transform *tfm, ccl_constant DecomposedMotionTransform *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;
+	DecomposedTransform decomp;
 
 	/* linear interpolation for rotation and scale */
 	if(t < 0.5f) {
@@ -479,13 +489,18 @@ ccl_device void transform_motion_interpolate_constant(Transform *tfm, ccl_consta
 
 class Bo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list