29#ifndef GU_BV4_SLABS_KAJIYA_NO_ORDER_H
30#define GU_BV4_SLABS_KAJIYA_NO_ORDER_H
32#include "GuBVConstants.h"
36 template<
int inflateT,
class LeafTestT,
class ParamsT>
37 static PxIntBool BV4_ProcessStreamKajiyaNoOrder(
const BVDataPacked*
PX_RESTRICT node, PxU32 initData, ParamsT*
PX_RESTRICT params)
39 const BVDataPacked* root = node;
42 PxU32 stack[GU_BV4_STACK_SIZE];
47 Vec4V fattenAABBsX, fattenAABBsY, fattenAABBsZ;
50 Vec4V fattenAABBs4 = V4LoadU_Safe(¶ms->mOriginalExtents_Padded.x);
51 fattenAABBs4 = V4Add(fattenAABBs4, epsInflateFloat4);
52 fattenAABBsX = V4SplatElement<0>(fattenAABBs4);
53 fattenAABBsY = V4SplatElement<1>(fattenAABBs4);
54 fattenAABBsZ = V4SplatElement<2>(fattenAABBs4);
61#ifdef GU_BV4_QUANTIZED_TREE
62 const Vec4V minCoeffV = V4LoadA_Safe(¶ms->mCenterOrMinCoeff_PaddedAligned.x);
63 const Vec4V maxCoeffV = V4LoadA_Safe(¶ms->mExtentsOrMaxCoeff_PaddedAligned.x);
64 const Vec4V minCoeffxV = V4SplatElement<0>(minCoeffV);
65 const Vec4V minCoeffyV = V4SplatElement<1>(minCoeffV);
66 const Vec4V minCoeffzV = V4SplatElement<2>(minCoeffV);
67 const Vec4V maxCoeffxV = V4SplatElement<0>(maxCoeffV);
68 const Vec4V maxCoeffyV = V4SplatElement<1>(maxCoeffV);
69 const Vec4V maxCoeffzV = V4SplatElement<2>(maxCoeffV);
74 const PxU32 childData = stack[--nb];
75 node = root + getChildOffset(childData);
77 const BVDataSwizzled* tn =
reinterpret_cast<const BVDataSwizzled*
>(node);
79#ifdef GU_BV4_QUANTIZED_TREE
82 OPC_DEQ4(maxx4a, minx4a, mX, minCoeffxV, maxCoeffxV)
86 OPC_DEQ4(maxy4a, miny4a, mY, minCoeffyV, maxCoeffyV)
90 OPC_DEQ4(maxz4a, minz4a, mZ, minCoeffzV, maxCoeffzV)
92 Vec4V minx4a = V4LoadA(tn->mMinX);
93 Vec4V miny4a = V4LoadA(tn->mMinY);
94 Vec4V minz4a = V4LoadA(tn->mMinZ);
96 Vec4V maxx4a = V4LoadA(tn->mMaxX);
97 Vec4V maxy4a = V4LoadA(tn->mMaxY);
98 Vec4V maxz4a = V4LoadA(tn->mMaxZ);
102 maxx4a = V4Add(maxx4a, fattenAABBsX); maxy4a = V4Add(maxy4a, fattenAABBsY); maxz4a = V4Add(maxz4a, fattenAABBsZ);
103 minx4a = V4Sub(minx4a, fattenAABBsX); miny4a = V4Sub(miny4a, fattenAABBsY); minz4a = V4Sub(minz4a, fattenAABBsZ);
110#define DO_LEAF_TEST(x) \
113 if(LeafTestT::doLeafTest(params, tn->getPrimitive(x))) \
117 stack[nb++] = tn->getChildData(x);}
119 const PxU32 nodeType = getChildType(childData);
120 if(!(code&8) && nodeType>1)
123 if(!(code&4) && nodeType>0)
140#define DO_LEAF_TEST(x) \
143 if(LeafTestT::doLeafTest(params, tn->getPrimitive(x))) \
147 stack[nb++] = tn->getChildData(x);}
151 template<
int inflateT,
class LeafTestT,
class ParamsT>
152 static PxIntBool BV4_ProcessStreamKajiyaNoOrderQ(
const BVDataPackedQ*
PX_RESTRICT node, PxU32 initData, ParamsT*
PX_RESTRICT params)
154 const BVDataPackedQ* root = node;
157 PxU32 stack[GU_BV4_STACK_SIZE];
162 Vec4V fattenAABBsX, fattenAABBsY, fattenAABBsZ;
165 Vec4V fattenAABBs4 = V4LoadU_Safe(¶ms->mOriginalExtents_Padded.x);
166 fattenAABBs4 = V4Add(fattenAABBs4, epsInflateFloat4);
167 fattenAABBsX = V4SplatElement<0>(fattenAABBs4);
168 fattenAABBsY = V4SplatElement<1>(fattenAABBs4);
169 fattenAABBsZ = V4SplatElement<2>(fattenAABBs4);
176 const Vec4V minCoeffV = V4LoadA_Safe(¶ms->mCenterOrMinCoeff_PaddedAligned.x);
177 const Vec4V maxCoeffV = V4LoadA_Safe(¶ms->mExtentsOrMaxCoeff_PaddedAligned.x);
178 const Vec4V minCoeffxV = V4SplatElement<0>(minCoeffV);
179 const Vec4V minCoeffyV = V4SplatElement<1>(minCoeffV);
180 const Vec4V minCoeffzV = V4SplatElement<2>(minCoeffV);
181 const Vec4V maxCoeffxV = V4SplatElement<0>(maxCoeffV);
182 const Vec4V maxCoeffyV = V4SplatElement<1>(maxCoeffV);
183 const Vec4V maxCoeffzV = V4SplatElement<2>(maxCoeffV);
187 const PxU32 childData = stack[--nb];
188 node = root + getChildOffset(childData);
190 const BVDataSwizzledQ* tn =
reinterpret_cast<const BVDataSwizzledQ*
>(node);
194 OPC_DEQ4(maxx4a, minx4a, mX, minCoeffxV, maxCoeffxV)
198 OPC_DEQ4(maxy4a, miny4a, mY, minCoeffyV, maxCoeffyV)
202 OPC_DEQ4(maxz4a, minz4a, mZ, minCoeffzV, maxCoeffzV)
206 maxx4a = V4Add(maxx4a, fattenAABBsX); maxy4a = V4Add(maxy4a, fattenAABBsY); maxz4a = V4Add(maxz4a, fattenAABBsZ);
207 minx4a = V4Sub(minx4a, fattenAABBsX); miny4a = V4Sub(miny4a, fattenAABBsY); minz4a = V4Sub(minz4a, fattenAABBsZ);
214 const PxU32 nodeType = getChildType(childData);
215 if(!(code&8) && nodeType>1)
218 if(!(code&4) && nodeType>0)
234 template<
int inflateT, class LeafTestT, class ParamsT>
235 static PxIntBool BV4_ProcessStreamKajiyaNoOrderNQ(const BVDataPackedNQ*
PX_RESTRICT node, PxU32 initData, ParamsT*
PX_RESTRICT params)
237 const BVDataPackedNQ* root = node;
240 PxU32 stack[GU_BV4_STACK_SIZE];
245 Vec4V fattenAABBsX, fattenAABBsY, fattenAABBsZ;
248 Vec4V fattenAABBs4 = V4LoadU_Safe(¶ms->mOriginalExtents_Padded.x);
249 fattenAABBs4 = V4Add(fattenAABBs4, epsInflateFloat4);
250 fattenAABBsX = V4SplatElement<0>(fattenAABBs4);
251 fattenAABBsY = V4SplatElement<1>(fattenAABBs4);
252 fattenAABBsZ = V4SplatElement<2>(fattenAABBs4);
261 const PxU32 childData = stack[--nb];
262 node = root + getChildOffset(childData);
264 const BVDataSwizzledNQ* tn =
reinterpret_cast<const BVDataSwizzledNQ*
>(node);
266 Vec4V minx4a = V4LoadA(tn->mMinX);
267 Vec4V miny4a = V4LoadA(tn->mMinY);
268 Vec4V minz4a = V4LoadA(tn->mMinZ);
270 Vec4V maxx4a = V4LoadA(tn->mMaxX);
271 Vec4V maxy4a = V4LoadA(tn->mMaxY);
272 Vec4V maxz4a = V4LoadA(tn->mMaxZ);
276 maxx4a = V4Add(maxx4a, fattenAABBsX); maxy4a = V4Add(maxy4a, fattenAABBsY); maxz4a = V4Add(maxz4a, fattenAABBsZ);
277 minx4a = V4Sub(minx4a, fattenAABBsX); miny4a = V4Sub(miny4a, fattenAABBsY); minz4a = V4Sub(minz4a, fattenAABBsZ);
284 const PxU32 nodeType = getChildType(childData);
285 if(!(code&8) && nodeType>1)
288 if(!(code&4) && nodeType>0)
#define PX_RESTRICT
Definition PxPreprocessor.h:355