MCPcopy Create free account
hub / github.com/RenderKit/embree / intersectNode

Function intersectNode

kernels/bvh/node_intersector1.h:561–611  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

Callers 11

intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85
intersectMethod · 0.85

Calls 13

maddFunction · 0.50
msubFunction · 0.50
maxiFunction · 0.50
miniFunction · 0.50
asIntFunction · 0.50
movemaskFunction · 0.50
maxFunction · 0.50
minFunction · 0.50
leFunction · 0.50
xfmVectorFunction · 0.50
rcp_safeFunction · 0.50
xfmPointFunction · 0.50

Tested by

no test coverage detected