Commit: 29247a7a0504d8755903e95744fbf13774e450cb
Author: Sergey Sharybin
Date:   Thu Oct 8 21:24:54 2015 +0500
Branches: master
https://developer.blender.org/rB29247a7a0504d8755903e95744fbf13774e450cb

Cycles: Fix wrong intersection with motion blur and degenerate object transform

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

M       intern/cycles/kernel/geom/geom_bvh_shadow.h
M       intern/cycles/kernel/geom/geom_bvh_subsurface.h
M       intern/cycles/kernel/geom/geom_bvh_traversal.h
M       intern/cycles/kernel/geom/geom_bvh_volume.h
M       intern/cycles/kernel/geom/geom_bvh_volume_all.h
M       intern/cycles/kernel/geom/geom_object.h
M       intern/cycles/kernel/geom/geom_qbvh_shadow.h
M       intern/cycles/kernel/geom/geom_qbvh_subsurface.h
M       intern/cycles/kernel/geom/geom_qbvh_traversal.h
M       intern/cycles/kernel/geom/geom_qbvh_volume.h
M       intern/cycles/kernel/geom/geom_qbvh_volume_all.h

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

diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow.h 
b/intern/cycles/kernel/geom/geom_bvh_shadow.h
index e4cba99..cb3f75f 100644
--- a/intern/cycles/kernel/geom/geom_bvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_bvh_shadow.h
@@ -59,7 +59,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
        float isect_t = tmax;
 
 #if BVH_FEATURE(BVH_MOTION)
-       Transform ob_tfm;
+       Transform ob_itfm;
 #endif
 
 #if BVH_FEATURE(BVH_INSTANCING)
@@ -302,7 +302,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                        object = 
kernel_tex_fetch(__prim_object, -primAddr-1);
 
 #if BVH_FEATURE(BVH_MOTION)
-                                       bvh_instance_motion_push(kg, object, 
ray, &P, &dir, &idir, &isect_t, &ob_tfm);
+                                       bvh_instance_motion_push(kg, object, 
ray, &P, &dir, &idir, &isect_t, &ob_itfm);
 #else
                                        bvh_instance_push(kg, object, ray, &P, 
&dir, &idir, &isect_t);
 #endif
@@ -338,7 +338,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                float t_fac;
 
 #if BVH_FEATURE(BVH_MOTION)
-                               bvh_instance_motion_pop_factor(kg, object, ray, 
&P, &dir, &idir, &t_fac, &ob_tfm);
+                               bvh_instance_motion_pop_factor(kg, object, ray, 
&P, &dir, &idir, &t_fac, &ob_itfm);
 #else
                                bvh_instance_pop_factor(kg, object, ray, &P, 
&dir, &idir, &t_fac);
 #endif
@@ -353,7 +353,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                float ignore_t = FLT_MAX;
 
 #if BVH_FEATURE(BVH_MOTION)
-                               bvh_instance_motion_pop(kg, object, ray, &P, 
&dir, &idir, &ignore_t, &ob_tfm);
+                               bvh_instance_motion_pop(kg, object, ray, &P, 
&dir, &idir, &ignore_t, &ob_itfm);
 #else
                                bvh_instance_pop(kg, object, ray, &P, &dir, 
&idir, &ignore_t);
 #endif
diff --git a/intern/cycles/kernel/geom/geom_bvh_subsurface.h 
b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
index a73139f..a093b9b 100644
--- a/intern/cycles/kernel/geom/geom_bvh_subsurface.h
+++ b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
@@ -63,7 +63,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
        uint num_hits = 0;
 
 #if BVH_FEATURE(BVH_MOTION)
-       Transform ob_tfm;
+       Transform ob_itfm;
 #endif
 
 #if defined(__KERNEL_SSE2__)
@@ -240,7 +240,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                                object = subsurface_object;
 
 #if BVH_FEATURE(BVH_MOTION)
-                                               bvh_instance_motion_push(kg, 
object, ray, &P, &dir, &idir, &isect_t, &ob_tfm);
+                                               bvh_instance_motion_push(kg, 
object, ray, &P, &dir, &idir, &isect_t, &ob_itfm);
 #else
                                                bvh_instance_push(kg, object, 
ray, &P, &dir, &idir, &isect_t);
 #endif
@@ -278,7 +278,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
 
                        /* instance pop */
 #if BVH_FEATURE(BVH_MOTION)
-                       bvh_instance_motion_pop(kg, object, ray, &P, &dir, 
&idir, &isect_t, &ob_tfm);
+                       bvh_instance_motion_pop(kg, object, ray, &P, &dir, 
&idir, &isect_t, &ob_itfm);
 #else
                        bvh_instance_pop(kg, object, ray, &P, &dir, &idir, 
&isect_t);
 #endif
diff --git a/intern/cycles/kernel/geom/geom_bvh_traversal.h 
b/intern/cycles/kernel/geom/geom_bvh_traversal.h
index 73d79fd..13d118b 100644
--- a/intern/cycles/kernel/geom/geom_bvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_bvh_traversal.h
@@ -65,7 +65,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
        int object = OBJECT_NONE;
 
 #if BVH_FEATURE(BVH_MOTION)
-       Transform ob_tfm;
+       Transform ob_itfm;
 #endif
 
        isect->t = ray->t;
@@ -342,7 +342,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                        object = 
kernel_tex_fetch(__prim_object, -primAddr-1);
 
 #if BVH_FEATURE(BVH_MOTION)
-                                       bvh_instance_motion_push(kg, object, 
ray, &P, &dir, &idir, &isect->t, &ob_tfm);
+                                       bvh_instance_motion_push(kg, object, 
ray, &P, &dir, &idir, &isect->t, &ob_itfm);
 #else
                                        bvh_instance_push(kg, object, ray, &P, 
&dir, &idir, &isect->t);
 #endif
@@ -378,7 +378,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
 
                        /* instance pop */
 #if BVH_FEATURE(BVH_MOTION)
-                       bvh_instance_motion_pop(kg, object, ray, &P, &dir, 
&idir, &isect->t, &ob_tfm);
+                       bvh_instance_motion_pop(kg, object, ray, &P, &dir, 
&idir, &isect->t, &ob_itfm);
 #else
                        bvh_instance_pop(kg, object, ray, &P, &dir, &idir, 
&isect->t);
 #endif
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume.h 
b/intern/cycles/kernel/geom/geom_bvh_volume.h
index 41c7848..656cd6e 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume.h
@@ -59,7 +59,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
        const uint visibility = PATH_RAY_ALL_VISIBILITY;
 
 #if BVH_FEATURE(BVH_MOTION)
-       Transform ob_tfm;
+       Transform ob_itfm;
 #endif
 
        isect->t = ray->t;
@@ -267,7 +267,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                        if(object_flag & SD_OBJECT_HAS_VOLUME) {
 
 #if BVH_FEATURE(BVH_MOTION)
-                                               bvh_instance_motion_push(kg, 
object, ray, &P, &dir, &idir, &isect->t, &ob_tfm);
+                                               bvh_instance_motion_push(kg, 
object, ray, &P, &dir, &idir, &isect->t, &ob_itfm);
 #else
                                                bvh_instance_push(kg, object, 
ray, &P, &dir, &idir, &isect->t);
 #endif
@@ -307,7 +307,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
 
                        /* instance pop */
 #if BVH_FEATURE(BVH_MOTION)
-                       bvh_instance_motion_pop(kg, object, ray, &P, &dir, 
&idir, &isect->t, &ob_tfm);
+                       bvh_instance_motion_pop(kg, object, ray, &P, &dir, 
&idir, &isect->t, &ob_itfm);
 #else
                        bvh_instance_pop(kg, object, ray, &P, &dir, &idir, 
&isect->t);
 #endif
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume_all.h 
b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
index 5bb7a67..8f7e3ad 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume_all.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
@@ -62,7 +62,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
        const uint visibility = PATH_RAY_ALL_VISIBILITY;
 
 #if BVH_FEATURE(BVH_MOTION)
-       Transform ob_tfm;
+       Transform ob_itfm;
 #endif
 
 #if BVH_FEATURE(BVH_INSTANCING)
@@ -230,7 +230,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                                                        
if(num_hits == max_hits) {
 #if BVH_FEATURE(BVH_INSTANCING)
 #if BVH_FEATURE(BVH_MOTION)
-                                                                               
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
+                                                                               
float t_fac = 1.0f / len(transform_direction(&ob_itfm, dir));
 #else
                                                                                
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
                                                                                
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
@@ -268,7 +268,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                                                        
if(num_hits == max_hits) {
 #if BVH_FEATURE(BVH_INSTANCING)
 #  if BVH_FEATURE(BVH_MOTION)
-                                                                               
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
+                                                                               
float t_fac = 1.0f / len(transform_direction(&ob_itfm, dir));
 #  else
                                                                                
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
                                                                                
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
@@ -311,7 +311,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                                                        
if(num_hits == max_hits) {
 #if BVH_FEATURE(BVH_INSTANCING)
 #  if BVH_FEATURE(BVH_MOTION)
-                                                                               
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
+                                                                               
float t_fac = 1.0f / len(transform_direction(&ob_itfm, dir));
 #  else
                                                                                
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
                                                                                
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
@@ -341,7 +341,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                                        if(object_flag & SD_OBJECT_HAS_VOLUME) {
 
 #if BVH_FEATURE(BVH_MOTION)
-                                               bvh_instance_motion_push(kg, 
object, ray, &P, &dir, &idir, &isect_t, &ob_tfm);
+                                               bvh_instance_motion_push(kg, 
object, ray, &P, &dir, &idir, &isect_t, &ob_itfm);
 #else
                                                bvh_instance_push(kg, object, 
ray, &P, &dir, &idir, &isect_t);
 #endif
@@ -384,7 +384,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                        if(num_hits_in_instance) {
                                float t_fac;
 #if BVH_FEATURE(BVH_MOTION)
-                               bvh_instance_motion_pop_factor(kg, object, ray, 
&P, &dir, &idir, &t_fac, &ob_tfm);
+                               bvh_instance_motion_pop_factor(kg, object, ray, 
&P, &dir, &idir, &t_fac, &ob_itfm);
 #else
                                bvh_instance_pop_factor(kg, object, ray, &P, 
&dir, &idir, &t_fac);
 #endif
@@ -397,7 +397,7 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals 
*kg,
                        else {
                                float ignore_t = FLT_MAX;
 #if BVH_FEATURE(BVH_MOTION)
-                               bvh_instance_motion_pop(kg, object, ray, &P, 
&dir, &idir, &ignore_t, &ob_tfm);
+                               bvh_instance_motion_pop(kg, object, ray, &P, 
&dir, &idir, &ignore_t, &ob_itfm);
 #else
                                bvh_instance_pop(kg, object, ray, &P, &dir, 
&idir, &ignore_t);
 #endif
diff --git a/intern/cycles/kernel/geom/geom_object.h 
b/intern/cycles/kernel/geom/geom_object.h
index bf1a3eb..ffd2f3b 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -453,15 +453,21 @@ ccl_device_inline void 
bvh_instance_pop_factor(KernelGlobals *kg, int object, co
 #ifdef __OBJECT_MOTION__
 /* Transform ray into object space to enter motion blurred object in BVH */
 
-ccl_device_inline void bvh_instance_motion_push(KernelGlobals *kg, int object, 
const Ray *ray, float3 *P, float3 *dir, float3 *idir, ccl_addr_space float *t, 
Transform *tfm)
+ccl_device_inline void bvh_instance_motion_push(KernelGlobals *kg,
+                                                int object,
+                                                const Ray *ray,
+                                                float3 *P,
+                                                float3 *dir,
+                                                float3 *idir,
+                                                ccl_addr_space float *t,
+                                                Transform *itfm)
 {
-       Transform itfm;
-       *tfm = object_fetch_transform_motion_test(kg, object, ray->time, &itfm);
+       object_fetch_transform_motion_test(kg, object, ray->time, itfm);
 
-       *P = transform_point(&itfm, ray->P);
+       *P = transform_point(itfm, ray->P);
 
        float len;
-       *dir = bvh_clamp_direction(normalize_len(transform_direction(&itfm, 
ray->D), &len));
+       *dir = bvh_clamp_direction(normalize_len(transform_direction(

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to