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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-08 06:04:52 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-10 08:27:19 +0300
commitdb333d9ea4881d9f48e3cc4b1ec59b4dafb27cc0 (patch)
tree6ac02ba4a284e6196ed345be775cbad6436f5d7f /intern/cycles/kernel
parent78c2063685cb6e0d0bcb895cf4eb70686455d596 (diff)
Cycles: support arbitrary number of motion blur steps for objects.
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r--intern/cycles/kernel/geom/geom_object.h16
-rw-r--r--intern/cycles/kernel/kernel_light.h3
-rw-r--r--intern/cycles/kernel/kernel_textures.h1
-rw-r--r--intern/cycles/kernel/kernel_types.h6
4 files changed, 13 insertions, 13 deletions
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);