Cycles: Fix intersection issues caused by degenerate instance matrix

Issue was caused by wrong intersection distance scaling on instance pop,
which could cause intersection distance to become zero, confusing following
intersection checks.
This commit is contained in:
Sergey Sharybin
2015-10-08 20:30:51 +05:00
parent c8005703f2
commit 8fa4fccec4
3 changed files with 16 additions and 16 deletions

View File

@@ -232,8 +232,8 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
#if BVH_FEATURE(BVH_MOTION)
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
#else
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
float t_fac = len(transform_direction(&tfm, 1.0f/idir));
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
#endif
for(int i = 0; i < num_hits_in_instance; i++) {
(isect_array-i-1)->t *= t_fac;
@@ -270,8 +270,8 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
# if BVH_FEATURE(BVH_MOTION)
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
# else
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
float t_fac = len(transform_direction(&tfm, 1.0f/idir));
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
#endif
for(int i = 0; i < num_hits_in_instance; i++) {
(isect_array-i-1)->t *= t_fac;
@@ -313,8 +313,8 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
# if BVH_FEATURE(BVH_MOTION)
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
# else
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
float t_fac = len(transform_direction(&tfm, 1.0f/idir));
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
#endif
for(int i = 0; i < num_hits_in_instance; i++) {
(isect_array-i-1)->t *= t_fac;

View File

@@ -428,8 +428,8 @@ ccl_device_inline void qbvh_instance_push(KernelGlobals *kg,
ccl_device_inline void bvh_instance_pop(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *dir, float3 *idir, ccl_addr_space float *t)
{
if(*t != FLT_MAX) {
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
*t *= len(transform_direction(&tfm, 1.0f/(*idir)));
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
*t /= len(transform_direction(&tfm, ray->D));
}
*P = ray->P;
@@ -441,8 +441,8 @@ ccl_device_inline void bvh_instance_pop(KernelGlobals *kg, int object, const Ray
ccl_device_inline void bvh_instance_pop_factor(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *dir, float3 *idir, float *t_fac)
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
*t_fac = len(transform_direction(&tfm, 1.0f/(*idir)));
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
*t_fac = 1.0f / len(transform_direction(&tfm, ray->D));
*P = ray->P;
*dir = bvh_clamp_direction(ray->D);

View File

@@ -249,8 +249,8 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
#if BVH_FEATURE(BVH_MOTION)
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
#else
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
float t_fac = len(transform_direction(&tfm, 1.0f/idir));
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
#endif
for(int i = 0; i < num_hits_in_instance; i++) {
(isect_array-i-1)->t *= t_fac;
@@ -287,8 +287,8 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
# if BVH_FEATURE(BVH_MOTION)
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
# else
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
float t_fac = len(transform_direction(&tfm, 1.0f/idir));
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
#endif
for(int i = 0; i < num_hits_in_instance; i++) {
(isect_array-i-1)->t *= t_fac;
@@ -330,8 +330,8 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
# if BVH_FEATURE(BVH_MOTION)
float t_fac = len(transform_direction(&ob_tfm, 1.0f/idir));
# else
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
float t_fac = len(transform_direction(&tfm, 1.0f/idir));
Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
float t_fac = 1.0f / len(transform_direction(&itfm, dir));
#endif
for(int i = 0; i < num_hits_in_instance; i++) {
(isect_array-i-1)->t *= t_fac;