Cycles: Fix issues with quick inverse of degenerate matrix
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 8 Oct 2015 16:14:14 +0000 (21:14 +0500)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 9 Oct 2015 10:58:03 +0000 (15:58 +0500)
This fixes part of the issues reported in T46322. Still need to solve
issue with wrong intersection distance scaling.

intern/cycles/util/util_transform.h

index ba8d04b5c1664ba0bc8bd225f1422e03a7b6b834..44502737ec6b1ef5ec6ff47ebf7eb4aba229d6cf 100644 (file)
@@ -347,7 +347,12 @@ ccl_device_inline Transform transform_quick_inverse(Transform M)
         * scale can be inverted but what about shearing? */
        Transform R;
        float det = M.x.x*(M.z.z*M.y.y - M.z.y*M.y.z) - M.y.x*(M.z.z*M.x.y - M.z.y*M.x.z) + M.z.x*(M.y.z*M.x.y - M.y.y*M.x.z);
-
+       if(det == 0.0f) {
+               M[0][0] += 1e-8f;
+               M[1][1] += 1e-8f;
+               M[2][2] += 1e-8f;
+               det = M.x.x*(M.z.z*M.y.y - M.z.y*M.y.z) - M.y.x*(M.z.z*M.x.y - M.z.y*M.x.z) + M.z.x*(M.y.z*M.x.y - M.y.y*M.x.z);
+       }
        det = (det != 0.0f)? 1.0f/det: 0.0f;
 
        float3 Rx = det*make_float3(M.z.z*M.y.y - M.z.y*M.y.z, M.z.y*M.x.z - M.z.z*M.x.y, M.y.z*M.x.y - M.y.y*M.x.z);