diff options
Diffstat (limited to 'intern/cycles/util')
-rw-r--r-- | intern/cycles/util/util_transform.h | 51 |
1 files changed, 26 insertions, 25 deletions
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; } |