diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-05-02 13:33:45 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-05-02 13:33:45 +0400 |
commit | 1e2afcddd3f1fd7b82fc0ea78fec2d80021fe844 (patch) | |
tree | 8bec6696a9a624affbb56ae9531fc6598f631d81 /intern/cycles/kernel/kernel_object.h | |
parent | 5d4fd04f05fc20d1a15817e5de4f1e2b776ab2b6 (diff) |
Fix #31168: cycles mask layer should only affect objects for camera rays.
Fix: texture coordinate normal output was not correct, still changed under
object transform.
Diffstat (limited to 'intern/cycles/kernel/kernel_object.h')
-rw-r--r-- | intern/cycles/kernel/kernel_object.h | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h index 262ca848f28..4a3ef55e8cb 100644 --- a/intern/cycles/kernel/kernel_object.h +++ b/intern/cycles/kernel/kernel_object.h @@ -32,34 +32,28 @@ __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, #ifdef __MOTION__ /* if we do motion blur */ - if(time != TIME_INVALID) { - int offset = object*OBJECT_SIZE + (int)OBJECT_TRANSFORM_MOTION_PRE; - float4 have_motion = kernel_tex_fetch(__objects, offset + 0); - - /* if this object have motion */ - if(have_motion.x != FLT_MAX) { - /* fetch motion transforms */ - MotionTransform motion; - - motion.pre.x = have_motion; - motion.pre.y = kernel_tex_fetch(__objects, offset + 1); - motion.pre.z = kernel_tex_fetch(__objects, offset + 2); - motion.pre.w = kernel_tex_fetch(__objects, offset + 3); - - 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); - - /* interpolate (todo: do only once per object) */ - transform_motion_interpolate(&tfm, &motion, time); - - /* invert */ - if(type == OBJECT_INVERSE_TRANSFORM) - tfm = transform_quick_inverse(tfm); - - return tfm; - } + if(sd->flag & SD_OBJECT_MOTION) { + /* fetch motion transforms */ + MotionTransform motion; + + motion.pre.x = have_motion; + motion.pre.y = kernel_tex_fetch(__objects, offset + 1); + motion.pre.z = kernel_tex_fetch(__objects, offset + 2); + motion.pre.w = kernel_tex_fetch(__objects, offset + 3); + + 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); + + /* interpolate (todo: do only once per object) */ + transform_motion_interpolate(&tfm, &motion, time); + + /* invert */ + if(type == OBJECT_INVERSE_TRANSFORM) + tfm = transform_quick_inverse(tfm); + + return tfm; } #endif @@ -83,6 +77,16 @@ __device_inline void object_position_transform(KernelGlobals *kg, ShaderData *sd #endif } +__device_inline void object_inverse_normal_transform(KernelGlobals *kg, ShaderData *sd, float3 *N) +{ +#ifdef __MOTION__ + *N = normalize(transform_direction_transposed(&sd->ob_tfm, *N)); +#else + Transform tfm = object_fetch_transform(kg, sd->object, TIME_INVALID, OBJECT_TRANSFORM); + *N = normalize(transform_direction_transposed(&tfm, *N)); +#endif +} + __device_inline void object_normal_transform(KernelGlobals *kg, ShaderData *sd, float3 *N) { #ifdef __MOTION__ |