Commit: 78c2063685cb6e0d0bcb895cf4eb70686455d596
Author: Brecht Van Lommel
Date:   Sat Mar 10 01:36:09 2018 +0100
Branches: master
https://developer.blender.org/rB78c2063685cb6e0d0bcb895cf4eb70686455d596

Cycles: support arbitrary number of motion blur steps for cameras.

===================================================================

M       intern/cycles/blender/addon/ui.py
M       intern/cycles/blender/blender_camera.cpp
M       intern/cycles/kernel/geom/geom_object.h
M       intern/cycles/kernel/kernel_camera.h
M       intern/cycles/kernel/kernel_compat_cpu.h
M       intern/cycles/kernel/kernel_compat_cuda.h
M       intern/cycles/kernel/kernel_compat_opencl.h
M       intern/cycles/kernel/kernel_textures.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/render/camera.cpp
M       intern/cycles/render/camera.h
M       intern/cycles/render/object.cpp
M       intern/cycles/render/scene.cpp
M       intern/cycles/render/scene.h
M       intern/cycles/render/session.cpp
M       intern/cycles/util/util_transform.cpp
M       intern/cycles/util/util_transform.h
M       intern/cycles/util/util_vector.h

===================================================================

diff --git a/intern/cycles/blender/addon/ui.py 
b/intern/cycles/blender/addon/ui.py
index e3076a8ec2c..707f8756f6f 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -809,7 +809,7 @@ class CYCLES_OBJECT_PT_motion_blur(CyclesButtonsPanel, 
Panel):
     def poll(cls, context):
         ob = context.object
         if CyclesButtonsPanel.poll(context) and ob:
-            if ob.type in {'MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 
'META'}:
+            if ob.type in {'MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 
'META', 'CAMERA'}:
                 return True
             if ob.dupli_type == 'GROUP' and ob.dupli_group:
                 return True
@@ -841,11 +841,9 @@ class CYCLES_OBJECT_PT_motion_blur(CyclesButtonsPanel, 
Panel):
         layout.active = (rd.use_motion_blur and cob.use_motion_blur)
 
         row = layout.row()
-        row.prop(cob, "use_deform_motion", text="Deformation")
-
-        sub = row.row()
-        sub.active = cob.use_deform_motion
-        sub.prop(cob, "motion_steps", text="Steps")
+        if ob.type != 'CAMERA':
+            row.prop(cob, "use_deform_motion", text="Deformation")
+        row.prop(cob, "motion_steps", text="Steps")
 
 
 class CYCLES_OBJECT_PT_cycles_settings(CyclesButtonsPanel, Panel):
diff --git a/intern/cycles/blender/blender_camera.cpp 
b/intern/cycles/blender/blender_camera.cpp
index e5f885c0012..909db8d9449 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -83,6 +83,8 @@ struct BlenderCamera {
        Transform matrix;
 
        float offscreen_dicing_scale;
+
+       int motion_steps;
 };
 
 static void blender_camera_init(BlenderCamera *bcam,
@@ -226,6 +228,10 @@ static void blender_camera_from_object(BlenderCamera *bcam,
                        bcam->sensor_fit = BlenderCamera::HORIZONTAL;
                else
                        bcam->sensor_fit = BlenderCamera::VERTICAL;
+
+               if(object_use_motion(b_ob, b_ob)) {
+                       bcam->motion_steps = object_motion_steps(b_ob);
+               }
        }
        else {
                /* from lamp not implemented yet */
@@ -453,9 +459,7 @@ static void blender_camera_sync(Camera *cam,
        cam->matrix = blender_camera_matrix(bcam->matrix,
                                            bcam->type,
                                            bcam->panorama_type);
-       cam->motion.pre = cam->matrix;
-       cam->motion.post = cam->matrix;
-       cam->use_motion = false;
+       cam->motion.resize(bcam->motion_steps, cam->matrix);
        cam->use_perspective_motion = false;
        cam->shuttertime = bcam->shuttertime;
        cam->fov_pre = cam->fov;
@@ -564,20 +568,15 @@ void BlenderSync::sync_camera_motion(BL::RenderSettings& 
b_render,
        Transform tfm = get_transform(b_ob_matrix);
        tfm = blender_camera_matrix(tfm, cam->type, cam->panorama_type);
 
-       if(tfm != cam->matrix) {
-               VLOG(1) << "Camera " << b_ob.name() << " motion detected.";
-               if(motion_time == 0.0f) {
-                       /* When motion blur is not centered in frame, 
cam->matrix gets reset. */
-                       cam->matrix = tfm;
-               }
-               else if(motion_time == -1.0f) {
-                       cam->motion.pre = tfm;
-                       cam->use_motion = true;
-               }
-               else if(motion_time == 1.0f) {
-                       cam->motion.post = tfm;
-                       cam->use_motion = true;
-               }
+       if(motion_time == 0.0f) {
+               /* When motion blur is not centered in frame, cam->matrix gets 
reset. */
+               cam->matrix = tfm;
+       }
+
+       /* Set transform in motion array. */
+       int motion_step = cam->motion_step(motion_time);
+       if(motion_step >= 0) {
+               cam->motion[motion_step] = tfm;
        }
 
        if(cam->type == CAMERA_PERSPECTIVE) {
diff --git a/intern/cycles/kernel/geom/geom_object.h 
b/intern/cycles/kernel/geom/geom_object.h
index a7191c50e97..67d039e1bc7 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -82,7 +82,7 @@ ccl_device_inline Transform 
object_fetch_transform_motion(KernelGlobals *kg, int
        const ccl_global DecomposedMotionTransform *motion = 
&kernel_tex_fetch(__objects, object).tfm;
 
        Transform tfm;
-       transform_motion_interpolate(&tfm, motion, time);
+       transform_motion_array_interpolate(&tfm, &motion->pre, 3, time);
 
        return tfm;
 }
diff --git a/intern/cycles/kernel/kernel_camera.h 
b/intern/cycles/kernel/kernel_camera.h
index a0be0ba6454..b73ad47dad3 100644
--- a/intern/cycles/kernel/kernel_camera.h
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -91,11 +91,12 @@ ccl_device void camera_sample_perspective(KernelGlobals 
*kg, float raster_x, flo
        Transform cameratoworld = kernel_data.cam.cameratoworld;
 
 #ifdef __CAMERA_MOTION__
-       if(kernel_data.cam.have_motion) {
-               ccl_constant DecomposedMotionTransform *motion = 
&kernel_data.cam.motion;
-               transform_motion_interpolate_constant(&cameratoworld,
-                                                     motion,
-                                                     ray->time);
+       if(kernel_data.cam.num_motion_steps) {
+               transform_motion_array_interpolate(
+                       &cameratoworld,
+                       kernel_tex_array(__camera_motion),
+                       kernel_data.cam.num_motion_steps,
+                       ray->time);
        }
 #endif
 
@@ -197,11 +198,12 @@ ccl_device void camera_sample_orthographic(KernelGlobals 
*kg, float raster_x, fl
        Transform cameratoworld = kernel_data.cam.cameratoworld;
 
 #ifdef __CAMERA_MOTION__
-       if(kernel_data.cam.have_motion) {
-               ccl_constant DecomposedMotionTransform *motion = 
&kernel_data.cam.motion;
-               transform_motion_interpolate_constant(&cameratoworld,
-                                                     motion,
-                                                     ray->time);
+       if(kernel_data.cam.num_motion_steps) {
+               transform_motion_array_interpolate(
+                       &cameratoworld,
+                       kernel_tex_array(__camera_motion),
+                       kernel_data.cam.num_motion_steps,
+                       ray->time);
        }
 #endif
 
@@ -227,6 +229,7 @@ ccl_device void camera_sample_orthographic(KernelGlobals 
*kg, float raster_x, fl
 /* Panorama Camera */
 
 ccl_device_inline void camera_sample_panorama(ccl_constant KernelCamera *cam,
+                                              const ccl_global 
DecomposedTransform *cam_motion,
                                               float raster_x, float raster_y,
                                               float lens_u, float lens_v,
                                               ccl_addr_space Ray *ray)
@@ -269,11 +272,12 @@ ccl_device_inline void 
camera_sample_panorama(ccl_constant KernelCamera *cam,
        Transform cameratoworld = cam->cameratoworld;
 
 #ifdef __CAMERA_MOTION__
-       if(cam->have_motion) {
-               ccl_constant DecomposedMotionTransform *motion = &cam->motion;
-               transform_motion_interpolate_constant(&cameratoworld,
-                                                     motion,
-                                                     ray->time);
+       if(cam->num_motion_steps) {
+               transform_motion_array_interpolate(
+                       &cameratoworld,
+                       cam_motion,
+                       cam->num_motion_steps,
+                       ray->time);
        }
 #endif
 
@@ -392,12 +396,16 @@ ccl_device_inline void camera_sample(KernelGlobals *kg,
 #endif
 
        /* sample */
-       if(kernel_data.cam.type == CAMERA_PERSPECTIVE)
+       if(kernel_data.cam.type == CAMERA_PERSPECTIVE) {
                camera_sample_perspective(kg, raster_x, raster_y, lens_u, 
lens_v, ray);
-       else if(kernel_data.cam.type == CAMERA_ORTHOGRAPHIC)
+       }
+       else if(kernel_data.cam.type == CAMERA_ORTHOGRAPHIC) {
                camera_sample_orthographic(kg, raster_x, raster_y, lens_u, 
lens_v, ray);
-       else
-               camera_sample_panorama(&kernel_data.cam, raster_x, raster_y, 
lens_u, lens_v, ray);
+       }
+       else {
+               const ccl_global DecomposedTransform *cam_motion = 
kernel_tex_array(__camera_motion);
+               camera_sample_panorama(&kernel_data.cam, cam_motion, raster_x, 
raster_y, lens_u, lens_v, ray);
+       }
 }
 
 /* Utilities */
diff --git a/intern/cycles/kernel/kernel_compat_cpu.h 
b/intern/cycles/kernel/kernel_compat_cpu.h
index 61cd90e9d2a..d26b668cb11 100644
--- a/intern/cycles/kernel/kernel_compat_cpu.h
+++ b/intern/cycles/kernel/kernel_compat_cpu.h
@@ -118,6 +118,7 @@ template<typename T> struct texture  {
 #define kernel_tex_fetch_ssef(tex, index) (kg->tex.fetch_ssef(index))
 #define kernel_tex_fetch_ssei(tex, index) (kg->tex.fetch_ssei(index))
 #define kernel_tex_lookup(tex, t, offset, size) (kg->tex.lookup(t, offset, 
size))
+#define kernel_tex_array(tex) (kg->tex.data)
 
 #define kernel_data (kg->__data)
 
diff --git a/intern/cycles/kernel/kernel_compat_cuda.h 
b/intern/cycles/kernel/kernel_compat_cuda.h
index 9bd7a572f5f..ac63bcf7ac9 100644
--- a/intern/cycles/kernel/kernel_compat_cuda.h
+++ b/intern/cycles/kernel/kernel_compat_cuda.h
@@ -137,6 +137,7 @@ ccl_device_inline uint ccl_num_groups(uint d)
 
 /* Use arrays for regular data. */
 #define kernel_tex_fetch(t, index) t[(index)]
+#define kernel_tex_array(t) (t)
 
 #define kernel_data __data
 
diff --git a/intern/cycles/kernel/kernel_compat_opencl.h 
b/intern/cycles/kernel/kernel_compat_opencl.h
index b02e3bc576d..671c47e2225 100644
--- a/intern/cycles/kernel/kernel_compat_opencl.h
+++ b/intern/cycles/kernel/kernel_compat_opencl.h
@@ -144,7 +144,8 @@
 
 /* data lookup defines */
 #define kernel_data (*kg->data)
-#define kernel_tex_fetch(tex, index) ((const ccl_global 
tex##_t*)(kg->buffers[kg->tex.cl_buffer] + kg->tex.data))[(index)]
+#define kernel_tex_array(tex) ((const ccl_global 
tex##_t*)(kg->buffers[kg->tex.cl_buffer] + kg->tex.data))
+#define kernel_tex_fetch(tex, index) kernel_tex_array(tex)[(index)]
 
 /* define NULL */
 #define NULL 0
diff --git a/intern/cycles/kernel/kernel_textures.h 
b/intern/cycles/kernel/kernel_textures.h
index 564b3f0f79c..56de5b27605 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -35,6 +35,9 @@ KERNEL_TEX(KernelObject, __objects)
 KERNEL_TEX(Transform, __object_motion_pass)
 KERNEL_TEX(uint, __object_flag)
 
+/* cameras */
+KERNEL_TEX(DecomposedTransform, __camera_motion)
+
 /* triangles */
 KERNEL_TEX(uint, __tri_shader)
 KERNEL_TEX(float4, __tri_vnormal)
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index 6743cc62894..2c3b7ba29a4 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1173,7 +1173,7 @@ typedef struct KernelCamera {
 
        /* motion blur */
        float shuttertime;
-       int have_motion, have_perspective_motion;
+       int num_motion_steps, have_perspective_motion;
 
        /* clipping */
        float nearclip;
@@ -1201,8 +1201,6 @@ typedef struct KernelCamera {
        ProjectionTransform worldtondc;
        Transform worldt

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to