| 559 | |
| 560 | template<int N> |
| 561 | __forceinline size_t intersectNode(const typename BVHN<N>::AABBNodeMB* node, const TravRay<N,false>& ray, const float time, vfloat<N>& dist) |
| 562 | { |
| 563 | const vfloat<N>* pNearX = (const vfloat<N>*)((const char*)&node->lower_x+ray.nearX); |
| 564 | const vfloat<N>* pNearY = (const vfloat<N>*)((const char*)&node->lower_x+ray.nearY); |
| 565 | const vfloat<N>* pNearZ = (const vfloat<N>*)((const char*)&node->lower_x+ray.nearZ); |
| 566 | const vfloat<N>* pFarX = (const vfloat<N>*)((const char*)&node->lower_x+ray.farX); |
| 567 | const vfloat<N>* pFarY = (const vfloat<N>*)((const char*)&node->lower_x+ray.farY); |
| 568 | const vfloat<N>* pFarZ = (const vfloat<N>*)((const char*)&node->lower_x+ray.farZ); |
| 569 | #if defined(__FMA_X4__) |
| 570 | #if defined(__aarch64__) |
| 571 | const vfloat<N> tNearX = madd(madd(time,pNearX[6],vfloat<N>(pNearX[0])), ray.rdir.x, ray.neg_org_rdir.x); |
| 572 | const vfloat<N> tNearY = madd(madd(time,pNearY[6],vfloat<N>(pNearY[0])), ray.rdir.y, ray.neg_org_rdir.y); |
| 573 | const vfloat<N> tNearZ = madd(madd(time,pNearZ[6],vfloat<N>(pNearZ[0])), ray.rdir.z, ray.neg_org_rdir.z); |
| 574 | const vfloat<N> tFarX = madd(madd(time,pFarX [6],vfloat<N>(pFarX [0])), ray.rdir.x, ray.neg_org_rdir.x); |
| 575 | const vfloat<N> tFarY = madd(madd(time,pFarY [6],vfloat<N>(pFarY [0])), ray.rdir.y, ray.neg_org_rdir.y); |
| 576 | const vfloat<N> tFarZ = madd(madd(time,pFarZ [6],vfloat<N>(pFarZ [0])), ray.rdir.z, ray.neg_org_rdir.z); |
| 577 | #else |
| 578 | const vfloat<N> tNearX = msub(madd(time,pNearX[6],vfloat<N>(pNearX[0])), ray.rdir.x, ray.org_rdir.x); |
| 579 | const vfloat<N> tNearY = msub(madd(time,pNearY[6],vfloat<N>(pNearY[0])), ray.rdir.y, ray.org_rdir.y); |
| 580 | const vfloat<N> tNearZ = msub(madd(time,pNearZ[6],vfloat<N>(pNearZ[0])), ray.rdir.z, ray.org_rdir.z); |
| 581 | const vfloat<N> tFarX = msub(madd(time,pFarX [6],vfloat<N>(pFarX [0])), ray.rdir.x, ray.org_rdir.x); |
| 582 | const vfloat<N> tFarY = msub(madd(time,pFarY [6],vfloat<N>(pFarY [0])), ray.rdir.y, ray.org_rdir.y); |
| 583 | const vfloat<N> tFarZ = msub(madd(time,pFarZ [6],vfloat<N>(pFarZ [0])), ray.rdir.z, ray.org_rdir.z); |
| 584 | #endif |
| 585 | #else |
| 586 | const vfloat<N> tNearX = (madd(time,pNearX[6],vfloat<N>(pNearX[0])) - ray.org.x) * ray.rdir.x; |
| 587 | const vfloat<N> tNearY = (madd(time,pNearY[6],vfloat<N>(pNearY[0])) - ray.org.y) * ray.rdir.y; |
| 588 | const vfloat<N> tNearZ = (madd(time,pNearZ[6],vfloat<N>(pNearZ[0])) - ray.org.z) * ray.rdir.z; |
| 589 | const vfloat<N> tFarX = (madd(time,pFarX [6],vfloat<N>(pFarX [0])) - ray.org.x) * ray.rdir.x; |
| 590 | const vfloat<N> tFarY = (madd(time,pFarY [6],vfloat<N>(pFarY [0])) - ray.org.y) * ray.rdir.y; |
| 591 | const vfloat<N> tFarZ = (madd(time,pFarZ [6],vfloat<N>(pFarZ [0])) - ray.org.z) * ray.rdir.z; |
| 592 | #endif |
| 593 | #if defined(__FMA_X4__) && !defined(__AVX512F__) // HSW |
| 594 | const vfloat<N> tNear = maxi(tNearX,tNearY,tNearZ,ray.tnear); |
| 595 | const vfloat<N> tFar = mini(tFarX ,tFarY ,tFarZ ,ray.tfar); |
| 596 | const vbool<N> vmask = asInt(tNear) > asInt(tFar); |
| 597 | const size_t mask = movemask(vmask) ^ ((1<<N)-1); |
| 598 | #elif defined(__AVX512F__) // SKX |
| 599 | const vfloat<N> tNear = maxi(tNearX,tNearY,tNearZ,ray.tnear); |
| 600 | const vfloat<N> tFar = mini(tFarX ,tFarY ,tFarZ ,ray.tfar); |
| 601 | const vbool<N> vmask = asInt(tNear) <= asInt(tFar); |
| 602 | const size_t mask = movemask(vmask); |
| 603 | #else |
| 604 | const vfloat<N> tNear = max(ray.tnear,tNearX,tNearY,tNearZ); |
| 605 | const vfloat<N> tFar = min(ray.tfar, tFarX ,tFarY ,tFarZ ); |
| 606 | const vbool<N> vmask = tNear <= tFar; |
| 607 | const size_t mask = movemask(vmask); |
| 608 | #endif |
| 609 | dist = tNear; |
| 610 | return mask; |
| 611 | } |
| 612 | |
| 613 | ////////////////////////////////////////////////////////////////////////////////////// |
| 614 | // Robust AABBNodeMB intersection |
no test coverage detected