Revision: 52417
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52417
Author:   blendix
Date:     2012-11-21 01:00:03 +0000 (Wed, 21 Nov 2012)
Log Message:
-----------
Fix #33158: motion vector pass wrong in cycles in some scenes, wrong vectors
due to float precision problem in matrix inverse.

Modified Paths:
--------------
    trunk/blender/intern/cycles/device/device_cuda.cpp
    trunk/blender/intern/cycles/render/camera.cpp
    trunk/blender/intern/cycles/render/camera.h

Modified: trunk/blender/intern/cycles/device/device_cuda.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cuda.cpp  2012-11-21 00:31:47 UTC 
(rev 52416)
+++ trunk/blender/intern/cycles/device/device_cuda.cpp  2012-11-21 01:00:03 UTC 
(rev 52417)
@@ -60,7 +60,7 @@
                return (CUdeviceptr)mem;
        }
 
-       const char *cuda_error_string(CUresult result)
+       static const char *cuda_error_string(CUresult result)
        {
                switch(result) {
                        case CUDA_SUCCESS: return "No errors";
@@ -915,12 +915,21 @@
 
 void device_cuda_info(vector<DeviceInfo>& devices)
 {
+       CUresult result;
        int count = 0;
 
-       if(cuInit(0) != CUDA_SUCCESS)
+       result = cuInit(0);
+       if(result != CUDA_SUCCESS) {
+               if(result != CUDA_ERROR_NO_DEVICE)
+                       fprintf(stderr, "CUDA cuInit: %s\n", 
CUDADevice::cuda_error_string(result));
                return;
-       if(cuDeviceGetCount(&count) != CUDA_SUCCESS)
+       }
+
+       result = cuDeviceGetCount(&count);
+       if(result != CUDA_SUCCESS) {
+               fprintf(stderr, "CUDA cuDeviceGetCount: %s\n", 
CUDADevice::cuda_error_string(result));
                return;
+       }
        
        vector<DeviceInfo> display_devices;
        

Modified: trunk/blender/intern/cycles/render/camera.cpp
===================================================================
--- trunk/blender/intern/cycles/render/camera.cpp       2012-11-21 00:31:47 UTC 
(rev 52416)
+++ trunk/blender/intern/cycles/render/camera.cpp       2012-11-21 01:00:03 UTC 
(rev 52417)
@@ -89,13 +89,12 @@
        Transform ndctoraster = transform_scale(width, height, 1.0f);
 
        /* raster to screen */
-       Transform screentoraster = ndctoraster;
-
-       screentoraster = ndctoraster *
+       Transform screentondc = 
                transform_scale(1.0f/(viewplane.right - viewplane.left),
                                1.0f/(viewplane.top - viewplane.bottom), 1.0f) *
                transform_translate(-viewplane.left, -viewplane.bottom, 0.0f);
 
+       Transform screentoraster = ndctoraster * screentondc;
        Transform rastertoscreen = transform_inverse(screentoraster);
 
        /* screen to camera */
@@ -105,15 +104,25 @@
                screentocamera = 
transform_inverse(transform_orthographic(nearclip, farclip));
        else
                screentocamera = transform_identity();
+       
+       Transform cameratoscreen = transform_inverse(screentocamera);
 
        rastertocamera = screentocamera * rastertoscreen;
+       cameratoraster = screentoraster * cameratoscreen;
 
        cameratoworld = matrix;
        screentoworld = cameratoworld * screentocamera;
        rastertoworld = cameratoworld * rastertocamera;
        ndctoworld = rastertoworld * ndctoraster;
-       worldtoraster = transform_inverse(rastertoworld);
 
+       /* note we recompose matrices instead of taking inverses of the above, 
this
+        * is needed to avoid inverting near degenerate matrices that happen 
due to
+        * precision issues with large scenes */
+       worldtocamera = transform_inverse(matrix);
+       worldtoscreen = cameratoscreen * worldtocamera;
+       worldtondc = screentondc * worldtoscreen;
+       worldtoraster = ndctoraster * worldtondc;
+
        /* differentials */
        if(type == CAMERA_ORTHOGRAPHIC) {
                dx = transform_direction(&rastertocamera, make_float3(1, 0, 0));
@@ -160,10 +169,10 @@
        kcam->rastertoworld = rastertoworld;
        kcam->rastertocamera = rastertocamera;
        kcam->cameratoworld = cameratoworld;
-       kcam->worldtoscreen = transform_inverse(screentoworld);
+       kcam->worldtocamera = worldtocamera;
+       kcam->worldtoscreen = worldtoscreen;
        kcam->worldtoraster = worldtoraster;
-       kcam->worldtondc = transform_inverse(ndctoworld);
-       kcam->worldtocamera = transform_inverse(cameratoworld);
+       kcam->worldtondc = worldtondc;
 
        /* camera motion */
        kcam->have_motion = 0;
@@ -181,8 +190,8 @@
                }
                else {
                        if(use_motion) {
-                               kcam->motion.pre = transform_inverse(motion.pre 
* rastertocamera);
-                               kcam->motion.post = 
transform_inverse(motion.post * rastertocamera);
+                               kcam->motion.pre = cameratoraster * 
transform_inverse(motion.pre);
+                               kcam->motion.post = cameratoraster * 
transform_inverse(motion.post);
                        }
                        else {
                                kcam->motion.pre = worldtoraster;

Modified: trunk/blender/intern/cycles/render/camera.h
===================================================================
--- trunk/blender/intern/cycles/render/camera.h 2012-11-21 00:31:47 UTC (rev 
52416)
+++ trunk/blender/intern/cycles/render/camera.h 2012-11-21 01:00:03 UTC (rev 
52417)
@@ -82,10 +82,16 @@
        Transform screentoworld;
        Transform rastertoworld;
        Transform ndctoworld;
-       Transform rastertocamera;
        Transform cameratoworld;
+
        Transform worldtoraster;
+       Transform worldtoscreen;
+       Transform worldtondc;
+       Transform worldtocamera;
 
+       Transform rastertocamera;
+       Transform cameratoraster;;
+
        float3 dx;
        float3 dy;
 

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

Reply via email to