Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/cycles/kernel/geom/geom_object.h4
-rw-r--r--intern/cycles/kernel/kernel_camera.h42
-rw-r--r--intern/cycles/util/util_transform.h51
3 files changed, 40 insertions, 57 deletions
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;
}