Subdivides the node.
A well-balanced tree should have a O(log n) depth. A degenerate tree would have a O(n) depth. Note a perfectly-balanced tree is not well-suited to collision detection anyway.
153 if(!builder)
return false;
162 bool ValidSplit =
true;
167 Point Extents;
mBV.GetExtents(Extents);
171 NbPos =
Split(Axis, builder);
180 Point Means(0.0f, 0.0f, 0.0f);
188 Means/=
float(mNbPrimitives);
191 Point Vars(0.0f, 0.0f, 0.0f);
198 Vars.x += (Cx - Means.x)*(Cx - Means.x);
199 Vars.y += (Cy - Means.y)*(Cy - Means.y);
200 Vars.z += (Cz - Means.z)*(Cz - Means.z);
202 Vars/=
float(mNbPrimitives-1);
205 udword Axis = Vars.LargestAxis();
208 NbPos =
Split(Axis, builder);
211 if(!NbPos || NbPos==mNbPrimitives) ValidSplit =
false;
217 NbPos =
Split(0, builder); Results[0] =
float(NbPos)/
float(mNbPrimitives);
218 NbPos =
Split(1, builder); Results[1] =
float(NbPos)/
float(mNbPrimitives);
219 NbPos =
Split(2, builder); Results[2] =
float(NbPos)/
float(mNbPrimitives);
220 Results[0]-=0.5f; Results[0]*=Results[0];
221 Results[1]-=0.5f; Results[1]*=Results[1];
222 Results[2]-=0.5f; Results[2]*=Results[2];
224 if(Results[1]<Results[Min]) Min = 1;
225 if(Results[2]<Results[Min]) Min = 2;
228 NbPos =
Split(Min, builder);
231 if(!NbPos || NbPos==mNbPrimitives) ValidSplit =
false;
238 Point Extents;
mBV.GetExtents(Extents);
239 udword SortedAxis[] = { 0, 1, 2 };
240 float* Keys = (
float*)&Extents.
x;
245 if(Keys[SortedAxis[i]]<Keys[SortedAxis[i+1]])
247 udword Tmp = SortedAxis[i];
248 SortedAxis[i] = SortedAxis[i+1];
249 SortedAxis[i+1] = Tmp;
257 while(!ValidSplit && CurAxis!=3)
259 NbPos =
Split(SortedAxis[CurAxis], builder);
261 if(!NbPos || NbPos==mNbPrimitives) CurAxis++;
262 else ValidSplit =
true;
268 NbPos = mNbPrimitives>>1;
282 NbPos = mNbPrimitives>>1;
294 OPASSERT(!(uintptr_t(&Pool[Count+0])&1));
295 OPASSERT(!(uintptr_t(&Pool[Count+1])&1));
296 mPos = uintptr_t(&Pool[Count+0])|1;
297 #ifndef OPC_NO_NEG_VANILLA_TREE
298 mNeg = uintptr_t(&Pool[Count+1])|1;
304 #ifndef OPC_NO_NEG_VANILLA_TREE
310 mPos = (uintptr_t)PosNeg;