From db333d9ea4881d9f48e3cc4b1ec59b4dafb27cc0 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 8 Mar 2018 04:04:52 +0100 Subject: Cycles: support arbitrary number of motion blur steps for objects. --- intern/cycles/kernel/geom/geom_object.h | 16 ++++++---------- intern/cycles/kernel/kernel_light.h | 3 ++- intern/cycles/kernel/kernel_textures.h | 1 + intern/cycles/kernel/kernel_types.h | 6 ++++-- 4 files changed, 13 insertions(+), 13 deletions(-) (limited to 'intern/cycles/kernel') diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h index 67d039e1bc7..800649abf38 100644 --- a/intern/cycles/kernel/geom/geom_object.h +++ b/intern/cycles/kernel/geom/geom_object.h @@ -40,18 +40,12 @@ enum ObjectVectorTransform { ccl_device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type) { - Transform tfm; if(type == OBJECT_INVERSE_TRANSFORM) { - tfm.x = kernel_tex_fetch(__objects, object).tfm.mid.x; - tfm.y = kernel_tex_fetch(__objects, object).tfm.mid.y; - tfm.z = kernel_tex_fetch(__objects, object).tfm.mid.z; + return kernel_tex_fetch(__objects, object).itfm; } else { - tfm.x = kernel_tex_fetch(__objects, object).tfm.pre.x; - tfm.y = kernel_tex_fetch(__objects, object).tfm.pre.y; - tfm.z = kernel_tex_fetch(__objects, object).tfm.pre.z; + return kernel_tex_fetch(__objects, object).tfm; } - return tfm; } /* Lamp to world space transformation */ @@ -79,10 +73,12 @@ ccl_device_inline Transform object_fetch_motion_pass_transform(KernelGlobals *kg #ifdef __OBJECT_MOTION__ ccl_device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int object, float time) { - const ccl_global DecomposedMotionTransform *motion = &kernel_tex_fetch(__objects, object).tfm; + const uint motion_offset = kernel_tex_fetch(__objects, object).motion_offset; + const ccl_global DecomposedTransform *motion = &kernel_tex_fetch(__object_motion, motion_offset); + const uint num_steps = kernel_tex_fetch(__objects, object).numsteps * 2 + 1; Transform tfm; - transform_motion_array_interpolate(&tfm, &motion->pre, 3, time); + transform_motion_array_interpolate(&tfm, motion, num_steps, time); return tfm; } diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index aaf7a7abdd4..efab69ee37d 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -792,7 +792,8 @@ ccl_device_inline bool triangle_world_space_vertices(KernelGlobals *kg, int obje #ifdef __INSTANCING__ if(!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) { # ifdef __OBJECT_MOTION__ - Transform tfm = object_fetch_transform_motion_test(kg, object, time, NULL); + float object_time = (time >= 0.0f) ? time : 0.5f; + Transform tfm = object_fetch_transform_motion_test(kg, object, object_time, NULL); # else Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM); # endif diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h index 56de5b27605..9047b93a0b2 100644 --- a/intern/cycles/kernel/kernel_textures.h +++ b/intern/cycles/kernel/kernel_textures.h @@ -33,6 +33,7 @@ KERNEL_TEX(float2, __prim_time) /* objects */ KERNEL_TEX(KernelObject, __objects) KERNEL_TEX(Transform, __object_motion_pass) +KERNEL_TEX(DecomposedTransform, __object_motion) KERNEL_TEX(uint, __object_flag) /* cameras */ diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 2c3b7ba29a4..977ceac12ea 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -1433,7 +1433,8 @@ static_assert_align(KernelData, 16); /* Kernel data structures. */ typedef struct KernelObject { - DecomposedMotionTransform tfm; + Transform tfm; + Transform itfm; float surface_area; float pass_id; @@ -1449,7 +1450,8 @@ typedef struct KernelObject { uint patch_map_offset; uint attribute_map_offset; - uint pad1, pad2; + uint motion_offset; + uint pad; } KernelObject;; static_assert_align(KernelObject, 16); -- cgit v1.2.3