| 538 | |
| 539 | template<int N> |
| 540 | __forceinline size_t intersectNodeRobust(const typename BVHN<N>::AABBNode* node, const TravRay<N,true>& ray, vfloat<N>& dist) |
| 541 | { |
| 542 | const vfloat<N> tNearX = (vfloat<N>::load((float*)((const char*)&node->lower_x+ray.nearX)) - ray.org.x) * ray.rdir_near.x; |
| 543 | const vfloat<N> tNearY = (vfloat<N>::load((float*)((const char*)&node->lower_x+ray.nearY)) - ray.org.y) * ray.rdir_near.y; |
| 544 | const vfloat<N> tNearZ = (vfloat<N>::load((float*)((const char*)&node->lower_x+ray.nearZ)) - ray.org.z) * ray.rdir_near.z; |
| 545 | const vfloat<N> tFarX = (vfloat<N>::load((float*)((const char*)&node->lower_x+ray.farX )) - ray.org.x) * ray.rdir_far.x; |
| 546 | const vfloat<N> tFarY = (vfloat<N>::load((float*)((const char*)&node->lower_x+ray.farY )) - ray.org.y) * ray.rdir_far.y; |
| 547 | const vfloat<N> tFarZ = (vfloat<N>::load((float*)((const char*)&node->lower_x+ray.farZ )) - ray.org.z) * ray.rdir_far.z; |
| 548 | const vfloat<N> tNear = max(tNearX,tNearY,tNearZ,ray.tnear); |
| 549 | const vfloat<N> tFar = min(tFarX ,tFarY ,tFarZ ,ray.tfar); |
| 550 | const vbool<N> vmask = tNear <= tFar; |
| 551 | const size_t mask = movemask(vmask); |
| 552 | dist = tNear; |
| 553 | return mask; |
| 554 | } |
| 555 | |
| 556 | ////////////////////////////////////////////////////////////////////////////////////// |
| 557 | // Fast AABBNodeMB intersection |