Tomato Cycles: fix for vector pass gives wrong result in some circumstances
authorSergey Sharybin <sergey.vfx@gmail.com>
Sun, 5 Aug 2012 17:24:10 +0000 (17:24 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sun, 5 Aug 2012 17:24:10 +0000 (17:24 +0000)
Issue was caused by wrong camera motion stored in device in cases
when first render layer does not have vector pass enabled.

Solved by forcing device camera update in cases when scene's motion
changed since previous device camera update.

intern/cycles/render/camera.cpp
intern/cycles/render/camera.h

index 55a0f23f8d0d866883fccedef09c884eaf5c9be7..272ddb89b0c3d50d77ab3b681183c5b9fb47fb8a 100644 (file)
@@ -75,6 +75,7 @@ Camera::Camera()
 
        need_update = true;
        need_device_update = true;
+       previous_motion = -1;
 }
 
 Camera::~Camera()
@@ -140,8 +141,19 @@ void Camera::update()
 
 void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
 {
+       Scene::MotionType need_motion = scene->need_motion();
+
        update();
 
+       if (previous_motion != need_motion) {
+               /* scene's motion model could have been changed since
+                * previous device camera update
+                * this could happen for example in case when one render
+                * layer has got motion pass and another not
+                */
+               need_device_update = true;
+       }
+
        if(!need_device_update)
                return;
        
@@ -159,7 +171,6 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
        kcam->worldtocamera = transform_inverse(cameratoworld);
 
        /* camera motion */
-       Scene::MotionType need_motion = scene->need_motion();
        kcam->have_motion = 0;
 
        if(need_motion == Scene::MOTION_PASS) {
@@ -226,6 +237,7 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
        kcam->cliplength = (farclip == FLT_MAX)? FLT_MAX: farclip - nearclip;
 
        need_device_update = false;
+       previous_motion = need_motion;
 }
 
 void Camera::device_free(Device *device, DeviceScene *dscene)
index d2a3cce181708980bec5a55e86b7c5a3191371b1..a539510029f7d26ffbcbb1fc8e940b575ea54261 100644 (file)
@@ -91,6 +91,7 @@ public:
        /* update */
        bool need_update;
        bool need_device_update;
+       int previous_motion;
 
        /* functions */
        Camera();