22 #ifndef __DG_AABB_POLYGONSOUP_H_
23 #define __DG_AABB_POLYGONSOUP_H_
25 #include "dCoreStdafx.h"
27 #include "dIntersections.h"
28 #include "dPolygonSoupDatabase.h"
46 #define DG_INDEX_COUNT_BITS 6
60 inline dUnsigned32 IsLeaf ()
const
62 return m_node & 0x80000000;
65 inline dUnsigned32 GetCount()
const
68 return (m_node & (~0x80000000)) >> (32 - DG_INDEX_COUNT_BITS - 1);
71 inline dUnsigned32 GetIndex()
const
74 return m_node & (~(-(1 << (32 - DG_INDEX_COUNT_BITS - 1))));
77 inline dgLeafNodePtr (dUnsigned32 faceIndexCount, dUnsigned32 faceIndexStart)
79 dAssert (faceIndexCount < (1<<DG_INDEX_COUNT_BITS));
80 m_node = 0x80000000 | (faceIndexCount << (32 - DG_INDEX_COUNT_BITS - 1)) | faceIndexStart;
83 inline dNode* GetNode (
const void*
const root)
const
85 return ((
dNode*) root) + m_node;
104 dVector minBox (&vertexArray[m_indexBox0].m_x);
105 dVector maxBox (&vertexArray[m_indexBox1].m_x);
106 minBox = minBox & dVector::m_triplexMask;
107 maxBox = maxBox & dVector::m_triplexMask;
108 return ray.BoxIntersect(minBox, maxBox);
113 dVector p0 (&vertexArray[m_indexBox0].m_x);
114 dVector p1 (&vertexArray[m_indexBox1].m_x);
115 p0 = p0 & dVector::m_triplexMask;
116 p1 = p1 & dVector::m_triplexMask;
117 dVector minBox (p0 - obb.m_p1);
118 dVector maxBox (p1 - obb.m_p0);
119 dAssert(maxBox.m_x >= minBox.m_x);
120 dAssert(maxBox.m_y >= minBox.m_y);
121 dAssert(maxBox.m_z >= minBox.m_z);
123 dVector mask ((minBox * maxBox) < dVector::m_zero);
124 dVector dist (maxBox.GetMin (minBox.Abs()) & mask);
125 dist = dist.GetMin(dist.ShiftTripleRight());
126 dist = dist.GetMin(dist.ShiftTripleRight());
128 if (dist.GetScalar() > dFloat32 (0.0f))
130 dVector origin (dVector::m_half * (p1 + p0));
131 dVector size (dVector::m_half * (p1 - p0));
133 origin = obb.UntransformVector(origin);
134 size = obb.m_absDir.RotateVector(size);
137 dVector minBox1 (q0 - obb.m_size);
138 dVector maxBox1 (q1 + obb.m_size);
139 dAssert(maxBox1.m_x >= minBox1.m_x);
140 dAssert(maxBox1.m_y >= minBox1.m_y);
141 dAssert(maxBox1.m_z >= minBox1.m_z);
142 dVector mask1 ((minBox1 * maxBox1) < dVector::m_zero);
143 dVector dist1 (maxBox1.GetMin (minBox1.Abs()) & mask1);
144 dist1 = dist1.GetMin(dist1.ShiftTripleRight());
145 dist1 = dist1.GetMin(dist1.ShiftTripleRight());
146 dist = dist.GetMin(dist1);
150 dVector p1p0((minBox.Abs()).GetMin(maxBox.Abs()).AndNot(mask));
151 dist = p1p0.DotProduct(p1p0);
152 dist = dist.Sqrt() * dVector::m_negOne;
154 return dist.GetScalar();
159 dVector p0 (&vertexArray[m_indexBox0].m_x);
160 dVector p1 (&vertexArray[m_indexBox1].m_x);
161 p0 = p0 & dVector::m_triplexMask;
162 p1 = p1 & dVector::m_triplexMask;
164 dVector minBox (p0 - obb.m_p1);
165 dVector maxBox (p1 - obb.m_p0);
166 dFloat32 dist = ray.BoxIntersect(minBox, maxBox);
167 if (dist < dFloat32 (1.0f))
169 dVector origin (dVector::m_half * (p1 + p0));
170 dVector size (dVector::m_half * (p1 - p0));
172 origin = obb.UntransformVector(origin);
173 size = obb.m_absDir.RotateVector(size);
177 dVector minBox1 (q0 - obb.m_size);
178 dVector maxBox1 (q1 + obb.m_size);
179 dFloat32 dist1 = obbRay.BoxIntersect(minBox1, maxBox1);
180 dist = (dist1 > dFloat32 (1.0f)) ? dist1 : dMax (dist1, dist);
187 dgLeafNodePtr m_left;
188 dgLeafNodePtr m_right;
195 D_CORE_API
virtual void Serialize (
const char*
const path)
const;
196 D_CORE_API
virtual void Deserialize (
const char*
const path);
203 D_CORE_API
void CalculateAdjacendy ();
204 D_CORE_API
virtual void ForAllSectorsRayHit (
const dFastRayTest& ray, dFloat32 maxT, dRayIntersectCallback callback,
void*
const context)
const;
205 D_CORE_API
virtual void ForAllSectors (
const dFastAabbInfo& obbAabb,
const dVector& boxDistanceTravel, dFloat32 m_maxT, dAaabbIntersectCallback callback,
void*
const context)
const;
206 D_CORE_API
virtual dVector ForAllSectorsSupportVectex(
const dVector& dir)
const;
208 inline void* GetRootNode()
const
213 inline void* GetBackNode(
const void*
const root)
const
215 dNode*
const node = (dNode*) root;
216 return node->m_left.IsLeaf() ? NULL : node->m_left.GetNode(m_aabb);
219 inline void* GetFrontNode(
const void*
const root)
const
221 dNode*
const node = (dNode*) root;
222 return node->m_right.IsLeaf() ? NULL : node->m_right.GetNode(m_aabb);
225 inline void GetNodeAABB(
const void*
const root,
dVector& p0,
dVector& p1)
const
227 const dNode*
const node = (dNode*)root;
230 p0 = p0 & dVector::m_triplexMask;
231 p1 = p1 & dVector::m_triplexMask;
237 dgNodeBuilder* BuildTopDown (dgNodeBuilder*
const leafArray, dInt32 firstBox, dInt32 lastBox, dgNodeBuilder**
const allocator)
const;
238 dFloat32 CalculateFaceMaxSize (
const dVector*
const vertex, dInt32 indexCount,
const dInt32*
const indexArray)
const;
240 static dIntersectStatus CalculateDisjointedFaceEdgeNormals (
void*
const context,
const dFloat32*
const polygon, dInt32 strideInBytes,
const dInt32*
const indexArray, dInt32 indexCount, dFloat32 hitDistance);
241 static dIntersectStatus CalculateAllFaceEdgeNormalsOld (
void*
const context,
const dFloat32*
const polygon, dInt32 strideInBytes,
const dInt32*
const indexArray, dInt32 indexCount, dFloat32 hitDistance);
242 static dIntersectStatus CalculateAllFaceEdgeNormals(
void*
const context,
const dFloat32*
const polygon, dInt32 strideInBytes,
const dInt32*
const indexArray, dInt32 indexCount, dFloat32 hitDistance);
243 void ImproveNodeFitness (dgNodeBuilder*
const node)
const;