29#ifndef GU_BV4_SLABS_KAJIYA_ORDERED_H
30#define GU_BV4_SLABS_KAJIYA_ORDERED_H
32#include "GuBVConstants.h"
36 template<const
int inflateT,
class LeafTestT,
class ParamsT>
37 static void BV4_ProcessStreamKajiyaOrdered(
const BVDataPacked*
PX_RESTRICT node, PxU32 initData, ParamsT*
PX_RESTRICT params)
39 const BVDataPacked* root = node;
42 PxU32 stack[GU_BV4_STACK_SIZE];
46 const PxU32* tmp =
reinterpret_cast<const PxU32*
>(¶ms->mLocalDir_Padded);
47 const PxU32 X = tmp[0]>>31;
48 const PxU32 Y = tmp[1]>>31;
49 const PxU32 Z = tmp[2]>>31;
53 const PxU32 bitIndex = 3+(Z|(Y<<1)|(X<<2));
54 const PxU32 dirMask = 1u<<bitIndex;
58 BV4_ALIGN16(
float distances4[4]);
62 Vec4V fattenAABBsX, fattenAABBsY, fattenAABBsZ;
65 Vec4V fattenAABBs4 = V4LoadU_Safe(¶ms->mOriginalExtents_Padded.x);
66 fattenAABBs4 = V4Add(fattenAABBs4, epsInflateFloat4);
67 fattenAABBsX = V4SplatElement<0>(fattenAABBs4);
68 fattenAABBsY = V4SplatElement<1>(fattenAABBs4);
69 fattenAABBsZ = V4SplatElement<2>(fattenAABBs4);
76#ifdef GU_BV4_QUANTIZED_TREE
77 const Vec4V minCoeffV = V4LoadA_Safe(¶ms->mCenterOrMinCoeff_PaddedAligned.x);
78 const Vec4V maxCoeffV = V4LoadA_Safe(¶ms->mExtentsOrMaxCoeff_PaddedAligned.x);
79 const Vec4V minCoeffxV = V4SplatElement<0>(minCoeffV);
80 const Vec4V minCoeffyV = V4SplatElement<1>(minCoeffV);
81 const Vec4V minCoeffzV = V4SplatElement<2>(minCoeffV);
82 const Vec4V maxCoeffxV = V4SplatElement<0>(maxCoeffV);
83 const Vec4V maxCoeffyV = V4SplatElement<1>(maxCoeffV);
84 const Vec4V maxCoeffzV = V4SplatElement<2>(maxCoeffV);
89 const PxU32 childData = stack[--nb];
90 node = root + getChildOffset(childData);
92 const BVDataSwizzled* tn =
reinterpret_cast<const BVDataSwizzled*
>(node);
94#ifdef GU_BV4_QUANTIZED_TREE
97 OPC_DEQ4(maxx4a, minx4a, mX, minCoeffxV, maxCoeffxV)
101 OPC_DEQ4(maxy4a, miny4a, mY, minCoeffyV, maxCoeffyV)
105 OPC_DEQ4(maxz4a, minz4a, mZ, minCoeffzV, maxCoeffzV)
107 Vec4V minx4a = V4LoadA(tn->mMinX);
108 Vec4V miny4a = V4LoadA(tn->mMinY);
109 Vec4V minz4a = V4LoadA(tn->mMinZ);
111 Vec4V maxx4a = V4LoadA(tn->mMaxX);
112 Vec4V maxy4a = V4LoadA(tn->mMaxY);
113 Vec4V maxz4a = V4LoadA(tn->mMaxZ);
117 maxx4a = V4Add(maxx4a, fattenAABBsX); maxy4a = V4Add(maxy4a, fattenAABBsY); maxz4a = V4Add(maxz4a, fattenAABBsZ);
118 minx4a = V4Sub(minx4a, fattenAABBsX); miny4a = V4Sub(miny4a, fattenAABBsY); minz4a = V4Sub(minz4a, fattenAABBsZ);
125 V4StoreA(maxOfNeasa, &distances4[0]);
165 #define DO_LEAF_TEST(x) \
167 if(!inflateT || distances4[x]<params->mStabbedFace.mDistance + GU_EPSILON_SAME_DISTANCE) \
171 LeafTestT::doLeafTest(params, tn->getPrimitive(x)); \
172 maxT4 = V4Load(params->mStabbedFace.mDistance); \
182 #define DO_LEAF_TEST(x) \
186 LeafTestT::doLeafTest(params, tn->getPrimitive(x)); \
187 maxT4 = V4Load(params->mStabbedFace.mDistance); \
196 const PxU32 nodeType = getChildType(childData);
198 if(!(code&8) && nodeType>1)
201 if(!(code&4) && nodeType>0)
212 #define DO_LEAF_TEST(x) \
215 LeafTestT::doLeafTest(params, tn->getPrimitive(x)); \
216 maxT4 = V4Load(params->mStabbedFace.mDistance); \
220 stack[nb++] = tn->getChildData(x); \
224 const PxU32 nodeType = getChildType(childData);
225 if(!(code&8) && nodeType>1)
228 if(!(code&4) && nodeType>0)
280 #define DO_LEAF_TEST(x) \
282 if(!inflateT || distances4[x]<params->mStabbedFace.mDistance + GU_EPSILON_SAME_DISTANCE) \
286 LeafTestT::doLeafTest(params, tn->getPrimitive(x)); \
287 maxT4 = V4Load(params->mStabbedFace.mDistance); \
291 code2 |= 1<<x; nbHits++; \
297 #define DO_LEAF_TEST(x) \
301 LeafTestT::doLeafTest(params, tn->getPrimitive(x)); \
302 maxT4 = V4Load(params->mStabbedFace.mDistance); \
306 code2 |= 1<<x; nbHits++; \
311 #define DO_LEAF_TEST(x) \
314 LeafTestT::doLeafTest(params, tn->getPrimitive(x)); \
315 maxT4 = V4Load(params->mStabbedFace.mDistance); \
319 stack[nb++] = tn->getChildData(x); \
324 template<const
int inflateT,
class LeafTestT,
class ParamsT>
325 static void BV4_ProcessStreamKajiyaOrderedQ(
const BVDataPackedQ*
PX_RESTRICT node, PxU32 initData, ParamsT*
PX_RESTRICT params)
327 const BVDataPackedQ* root = node;
330 PxU32 stack[GU_BV4_STACK_SIZE];
334 const PxU32* tmp =
reinterpret_cast<const PxU32*
>(¶ms->mLocalDir_Padded);
335 const PxU32 X = tmp[0]>>31;
336 const PxU32 Y = tmp[1]>>31;
337 const PxU32 Z = tmp[2]>>31;
341 const PxU32 bitIndex = 3+(Z|(Y<<1)|(X<<2));
342 const PxU32 dirMask = 1u<<bitIndex;
346 BV4_ALIGN16(
float distances4[4]);
350 Vec4V fattenAABBsX, fattenAABBsY, fattenAABBsZ;
353 Vec4V fattenAABBs4 = V4LoadU_Safe(¶ms->mOriginalExtents_Padded.x);
354 fattenAABBs4 = V4Add(fattenAABBs4, epsInflateFloat4);
355 fattenAABBsX = V4SplatElement<0>(fattenAABBs4);
356 fattenAABBsY = V4SplatElement<1>(fattenAABBs4);
357 fattenAABBsZ = V4SplatElement<2>(fattenAABBs4);
364 const Vec4V minCoeffV = V4LoadA_Safe(¶ms->mCenterOrMinCoeff_PaddedAligned.x);
365 const Vec4V maxCoeffV = V4LoadA_Safe(¶ms->mExtentsOrMaxCoeff_PaddedAligned.x);
366 const Vec4V minCoeffxV = V4SplatElement<0>(minCoeffV);
367 const Vec4V minCoeffyV = V4SplatElement<1>(minCoeffV);
368 const Vec4V minCoeffzV = V4SplatElement<2>(minCoeffV);
369 const Vec4V maxCoeffxV = V4SplatElement<0>(maxCoeffV);
370 const Vec4V maxCoeffyV = V4SplatElement<1>(maxCoeffV);
371 const Vec4V maxCoeffzV = V4SplatElement<2>(maxCoeffV);
375 const PxU32 childData = stack[--nb];
376 node = root + getChildOffset(childData);
378 const BVDataSwizzledQ* tn =
reinterpret_cast<const BVDataSwizzledQ*
>(node);
382 OPC_DEQ4(maxx4a, minx4a, mX, minCoeffxV, maxCoeffxV)
386 OPC_DEQ4(maxy4a, miny4a, mY, minCoeffyV, maxCoeffyV)
390 OPC_DEQ4(maxz4a, minz4a, mZ, minCoeffzV, maxCoeffzV)
394 maxx4a = V4Add(maxx4a, fattenAABBsX); maxy4a = V4Add(maxy4a, fattenAABBsY); maxz4a = V4Add(maxz4a, fattenAABBsZ);
395 minx4a = V4Sub(minx4a, fattenAABBsX); miny4a = V4Sub(miny4a, fattenAABBsY); minz4a = V4Sub(minz4a, fattenAABBsZ);
402 V4StoreA(maxOfNeasa, &distances4[0]);
410 const PxU32 nodeType = getChildType(childData);
412 if(!(code&8) && nodeType>1)
415 if(!(code&4) && nodeType>0)
435 const PxU32 nodeType = getChildType(childData);
436 if(!(code&8) && nodeType>1)
439 if(!(code&4) && nodeType>0)
454 template<const
int inflateT,
class LeafTestT,
class ParamsT>
455 static void BV4_ProcessStreamKajiyaOrderedNQ(
const BVDataPackedNQ*
PX_RESTRICT node, PxU32 initData, ParamsT*
PX_RESTRICT params)
457 const BVDataPackedNQ* root = node;
460 PxU32 stack[GU_BV4_STACK_SIZE];
464 const PxU32* tmp =
reinterpret_cast<const PxU32*
>(¶ms->mLocalDir_Padded);
465 const PxU32 X = tmp[0]>>31;
466 const PxU32 Y = tmp[1]>>31;
467 const PxU32 Z = tmp[2]>>31;
471 const PxU32 bitIndex = 3+(Z|(Y<<1)|(X<<2));
472 const PxU32 dirMask = 1u<<bitIndex;
476 BV4_ALIGN16(
float distances4[4]);
480 Vec4V fattenAABBsX, fattenAABBsY, fattenAABBsZ;
483 Vec4V fattenAABBs4 = V4LoadU_Safe(¶ms->mOriginalExtents_Padded.x);
484 fattenAABBs4 = V4Add(fattenAABBs4, epsInflateFloat4);
485 fattenAABBsX = V4SplatElement<0>(fattenAABBs4);
486 fattenAABBsY = V4SplatElement<1>(fattenAABBs4);
487 fattenAABBsZ = V4SplatElement<2>(fattenAABBs4);
496 const PxU32 childData = stack[--nb];
497 node = root + getChildOffset(childData);
499 const BVDataSwizzledNQ* tn =
reinterpret_cast<const BVDataSwizzledNQ*
>(node);
501 Vec4V minx4a = V4LoadA(tn->mMinX);
502 Vec4V miny4a = V4LoadA(tn->mMinY);
503 Vec4V minz4a = V4LoadA(tn->mMinZ);
505 Vec4V maxx4a = V4LoadA(tn->mMaxX);
506 Vec4V maxy4a = V4LoadA(tn->mMaxY);
507 Vec4V maxz4a = V4LoadA(tn->mMaxZ);
511 maxx4a = V4Add(maxx4a, fattenAABBsX); maxy4a = V4Add(maxy4a, fattenAABBsY); maxz4a = V4Add(maxz4a, fattenAABBsZ);
512 minx4a = V4Sub(minx4a, fattenAABBsX); miny4a = V4Sub(miny4a, fattenAABBsY); minz4a = V4Sub(minz4a, fattenAABBsZ);
519 V4StoreA(maxOfNeasa, &distances4[0]);
527 const PxU32 nodeType = getChildType(childData);
529 if(!(code&8) && nodeType>1)
532 if(!(code&4) && nodeType>0)
551 const PxU32 nodeType = getChildType(childData);
552 if(!(code&8) && nodeType>1)
555 if(!(code&4) && nodeType>0)
#define PX_RESTRICT
Definition PxPreprocessor.h:355