Loading...
Searching...
No Matches
32#include "foundation/PxFPU.h"
33#include "GuBV4_Common.h"
35#ifdef GU_BV4_USE_SLABS
42 #define BV4_SLABS_SORT
44 #define PNS_BLOCK3(a, b, c, d) { \
45 if(code2 & (1<<a)) { stack[nb++] = tn->getChildData(a); } \
46 if(code2 & (1<<b)) { stack[nb++] = tn->getChildData(b); } \
47 if(code2 & (1<<c)) { stack[nb++] = tn->getChildData(c); } \
48 if(code2 & (1<<d)) { stack[nb++] = tn->getChildData(d); } } \
50 #define OPC_SLABS_GET_MIN_MAX(i) \
51 const VecI32V minVi = I4LoadXYZW(node->mX[i].mMin, node->mY[i].mMin, node->mZ[i].mMin, 0); \
52 const Vec4V minCoeffV = V4LoadA_Safe(¶ms->mCenterOrMinCoeff_PaddedAligned.x); \
53 Vec4V minV = V4Mul(Vec4V_From_VecI32V(minVi), minCoeffV); \
54 const VecI32V maxVi = I4LoadXYZW(node->mX[i].mMax, node->mY[i].mMax, node->mZ[i].mMax, 0); \
55 const Vec4V maxCoeffV = V4LoadA_Safe(¶ms->mExtentsOrMaxCoeff_PaddedAligned.x); \
56 Vec4V maxV = V4Mul(Vec4V_From_VecI32V(maxVi), maxCoeffV); \
58 #define OPC_SLABS_GET_CEQ(i) \
59 OPC_SLABS_GET_MIN_MAX(i) \
60 const FloatV HalfV = FLoad(0.5f); \
61 const Vec4V centerV = V4Scale(V4Add(maxV, minV), HalfV); \
62 const Vec4V extentsV = V4Scale(V4Sub(maxV, minV), HalfV);
64 #define OPC_SLABS_GET_CE2Q(i) \
65 OPC_SLABS_GET_MIN_MAX(i) \
66 const Vec4V centerV = V4Add(maxV, minV); \
67 const Vec4V extentsV = V4Sub(maxV, minV);
69 #define OPC_SLABS_GET_CENQ(i) \
70 const FloatV HalfV = FLoad(0.5f); \
71 const Vec4V minV = V4LoadXYZW(node->mMinX[i], node->mMinY[i], node->mMinZ[i], 0.0f); \
72 const Vec4V maxV = V4LoadXYZW(node->mMaxX[i], node->mMaxY[i], node->mMaxZ[i], 0.0f); \
73 const Vec4V centerV = V4Scale(V4Add(maxV, minV), HalfV); \
74 const Vec4V extentsV = V4Scale(V4Sub(maxV, minV), HalfV);
76 #define OPC_SLABS_GET_CE2NQ(i) \
77 const Vec4V minV = V4LoadXYZW(node->mMinX[i], node->mMinY[i], node->mMinZ[i], 0.0f); \
78 const Vec4V maxV = V4LoadXYZW(node->mMaxX[i], node->mMaxY[i], node->mMaxZ[i], 0.0f); \
79 const Vec4V centerV = V4Add(maxV, minV); \
80 const Vec4V extentsV = V4Sub(maxV, minV);
82#define OPC_DEQ4(part2xV, part1xV, mMember, minCoeff, maxCoeff) \
84 part2xV = V4LoadA(reinterpret_cast<const float*>(tn->mMember)); \
85 part1xV = Vec4V_ReinterpretFrom_VecI32V(VecI32V_And(VecI32V_ReinterpretFrom_Vec4V(part2xV), I4Load(0x0000ffff))); \
86 part1xV = Vec4V_ReinterpretFrom_VecI32V(VecI32V_RightShift(VecI32V_LeftShift(VecI32V_ReinterpretFrom_Vec4V(part1xV),16), 16)); \
87 part1xV = V4Mul(Vec4V_From_VecI32V(VecI32V_ReinterpretFrom_Vec4V(part1xV)), minCoeff); \
88 part2xV = Vec4V_ReinterpretFrom_VecI32V(VecI32V_RightShift(VecI32V_ReinterpretFrom_Vec4V(part2xV), 16)); \
89 part2xV = V4Mul(Vec4V_From_VecI32V(VecI32V_ReinterpretFrom_Vec4V(part2xV)), maxCoeff); \
93 Vec4V maxT4 = V4Load(params->mStabbedFace.mDistance);\
94 const Vec4V rayP = V4LoadU_Safe(¶ms->mOrigin_Padded.x);\
95 Vec4V rayD = V4LoadU_Safe(¶ms->mLocalDir_Padded.x);\
96 const VecU32V raySign = V4U32and(VecU32V_ReinterpretFrom_Vec4V(rayD), signMask);\
97 const Vec4V rayDAbs = V4Abs(rayD);\
98 Vec4V rayInvD = Vec4V_ReinterpretFrom_VecU32V(V4U32or(raySign, VecU32V_ReinterpretFrom_Vec4V(V4Max(rayDAbs, epsFloat4))));\
100 rayInvD = V4RecipFast(rayInvD);\
101 rayInvD = V4Mul(rayInvD, V4NegMulSub(rayD, rayInvD, twos));\
102 const Vec4V rayPinvD = V4NegMulSub(rayInvD, rayP, zeroes);\
103 const Vec4V rayInvDsplatX = V4SplatElement<0>(rayInvD);\
104 const Vec4V rayInvDsplatY = V4SplatElement<1>(rayInvD);\
105 const Vec4V rayInvDsplatZ = V4SplatElement<2>(rayInvD);\
106 const Vec4V rayPinvDsplatX = V4SplatElement<0>(rayPinvD);\
107 const Vec4V rayPinvDsplatY = V4SplatElement<1>(rayPinvD);\
108 const Vec4V rayPinvDsplatZ = V4SplatElement<2>(rayPinvD);
111 const Vec4V tminxa0 = V4MulAdd(minx4a, rayInvDsplatX, rayPinvDsplatX);\
112 const Vec4V tminya0 = V4MulAdd(miny4a, rayInvDsplatY, rayPinvDsplatY);\
113 const Vec4V tminza0 = V4MulAdd(minz4a, rayInvDsplatZ, rayPinvDsplatZ);\
114 const Vec4V tmaxxa0 = V4MulAdd(maxx4a, rayInvDsplatX, rayPinvDsplatX);\
115 const Vec4V tmaxya0 = V4MulAdd(maxy4a, rayInvDsplatY, rayPinvDsplatY);\
116 const Vec4V tmaxza0 = V4MulAdd(maxz4a, rayInvDsplatZ, rayPinvDsplatZ);\
117 const Vec4V tminxa = V4Min(tminxa0, tmaxxa0);\
118 const Vec4V tmaxxa = V4Max(tminxa0, tmaxxa0);\
119 const Vec4V tminya = V4Min(tminya0, tmaxya0);\
120 const Vec4V tmaxya = V4Max(tminya0, tmaxya0);\
121 const Vec4V tminza = V4Min(tminza0, tmaxza0);\
122 const Vec4V tmaxza = V4Max(tminza0, tmaxza0);\
123 const Vec4V maxOfNeasa = V4Max(V4Max(tminxa, tminya), tminza);\
124 const Vec4V minOfFarsa = V4Min(V4Min(tmaxxa, tmaxya), tmaxza);\
127 BoolV ignore4a = V4IsGrtr(epsFloat4, minOfFarsa); \
128 ignore4a = BOr(ignore4a, V4IsGrtr(maxOfNeasa, maxT4)); \
129 BoolV resa4 = V4IsGrtr(maxOfNeasa, minOfFarsa); \
130 resa4 = BOr(resa4, ignore4a);\
131 const PxU32 code = BGetBitMask(resa4);\
138 if(tn->decodePNSNoShift(0) & dirMask) \
140 if(tn->decodePNSNoShift(1) & dirMask) \
142 if(tn->decodePNSNoShift(2) & dirMask) \
143 PNS_BLOCK3(3,2,1,0) \
145 PNS_BLOCK3(2,3,1,0) \
149 if(tn->decodePNSNoShift(2) & dirMask) \
150 PNS_BLOCK3(3,2,0,1) \
152 PNS_BLOCK3(2,3,0,1) \
157 if(tn->decodePNSNoShift(1) & dirMask) \
159 if(tn->decodePNSNoShift(2) & dirMask) \
160 PNS_BLOCK3(1,0,3,2) \
162 PNS_BLOCK3(1,0,2,3) \
166 if(tn->decodePNSNoShift(2) & dirMask) \
167 PNS_BLOCK3(0,1,3,2) \
169 PNS_BLOCK3(0,1,2,3) \