1 
2 
3 #ifndef B3_QUANTIZED_BVH_NODE_H
4 #define B3_QUANTIZED_BVH_NODE_H
5 
6 #include "Bullet3Common/shared/b3Float4.h"
7 
8 #define B3_MAX_NUM_PARTS_IN_BITS 10
9 
10 ///b3QuantizedBvhNodeData is a compressed aabb node, 16 bytes.
11 ///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range).
12 typedef struct b3QuantizedBvhNodeData b3QuantizedBvhNodeData_t;
13 
14 struct b3QuantizedBvhNodeData
15 {
16 	//12 bytes
17 	unsigned short int m_quantizedAabbMin[3];
18 	unsigned short int m_quantizedAabbMax[3];
19 	//4 bytes
20 	int m_escapeIndexOrTriangleIndex;
21 };
22 
b3GetTriangleIndex(const b3QuantizedBvhNodeData * rootNode)23 inline int b3GetTriangleIndex(const b3QuantizedBvhNodeData* rootNode)
24 {
25 	unsigned int x = 0;
26 	unsigned int y = (~(x & 0)) << (31 - B3_MAX_NUM_PARTS_IN_BITS);
27 	// Get only the lower bits where the triangle index is stored
28 	return (rootNode->m_escapeIndexOrTriangleIndex & ~(y));
29 }
30 
b3IsLeaf(const b3QuantizedBvhNodeData * rootNode)31 inline int b3IsLeaf(const b3QuantizedBvhNodeData* rootNode)
32 {
33 	//skipindex is negative (internal node), triangleindex >=0 (leafnode)
34 	return (rootNode->m_escapeIndexOrTriangleIndex >= 0) ? 1 : 0;
35 }
36 
b3GetEscapeIndex(const b3QuantizedBvhNodeData * rootNode)37 inline int b3GetEscapeIndex(const b3QuantizedBvhNodeData* rootNode)
38 {
39 	return -rootNode->m_escapeIndexOrTriangleIndex;
40 }
41 
b3QuantizeWithClamp(unsigned short * out,b3Float4ConstArg point2,int isMax,b3Float4ConstArg bvhAabbMin,b3Float4ConstArg bvhAabbMax,b3Float4ConstArg bvhQuantization)42 inline void b3QuantizeWithClamp(unsigned short* out, b3Float4ConstArg point2, int isMax, b3Float4ConstArg bvhAabbMin, b3Float4ConstArg bvhAabbMax, b3Float4ConstArg bvhQuantization)
43 {
44 	b3Float4 clampedPoint = b3MaxFloat4(point2, bvhAabbMin);
45 	clampedPoint = b3MinFloat4(clampedPoint, bvhAabbMax);
46 
47 	b3Float4 v = (clampedPoint - bvhAabbMin) * bvhQuantization;
48 	if (isMax)
49 	{
50 		out[0] = (unsigned short)(((unsigned short)(v.x + 1.f) | 1));
51 		out[1] = (unsigned short)(((unsigned short)(v.y + 1.f) | 1));
52 		out[2] = (unsigned short)(((unsigned short)(v.z + 1.f) | 1));
53 	}
54 	else
55 	{
56 		out[0] = (unsigned short)(((unsigned short)(v.x) & 0xfffe));
57 		out[1] = (unsigned short)(((unsigned short)(v.y) & 0xfffe));
58 		out[2] = (unsigned short)(((unsigned short)(v.z) & 0xfffe));
59 	}
60 }
61 
b3TestQuantizedAabbAgainstQuantizedAabbSlow(const unsigned short int * aabbMin1,const unsigned short int * aabbMax1,const unsigned short int * aabbMin2,const unsigned short int * aabbMax2)62 inline int b3TestQuantizedAabbAgainstQuantizedAabbSlow(
63 	const unsigned short int* aabbMin1,
64 	const unsigned short int* aabbMax1,
65 	const unsigned short int* aabbMin2,
66 	const unsigned short int* aabbMax2)
67 {
68 	//int overlap = 1;
69 	if (aabbMin1[0] > aabbMax2[0])
70 		return 0;
71 	if (aabbMax1[0] < aabbMin2[0])
72 		return 0;
73 	if (aabbMin1[1] > aabbMax2[1])
74 		return 0;
75 	if (aabbMax1[1] < aabbMin2[1])
76 		return 0;
77 	if (aabbMin1[2] > aabbMax2[2])
78 		return 0;
79 	if (aabbMax1[2] < aabbMin2[2])
80 		return 0;
81 	return 1;
82 	//overlap = ((aabbMin1[0] > aabbMax2[0]) || (aabbMax1[0] < aabbMin2[0])) ? 0 : overlap;
83 	//overlap = ((aabbMin1[2] > aabbMax2[2]) || (aabbMax1[2] < aabbMin2[2])) ? 0 : overlap;
84 	//overlap = ((aabbMin1[1] > aabbMax2[1]) || (aabbMax1[1] < aabbMin2[1])) ? 0 : overlap;
85 	//return overlap;
86 }
87 
88 #endif  //B3_QUANTIZED_BVH_NODE_H
89