23 using namespace Opcode;
27 if(id0>id1)
Swap(id0, id1);
62 if(
this!=element &&
this!=element->
Next)
65 if(Previous) Previous->Next = Next;
66 if(Next) Next->Previous = Previous;
79 if(
this!=element &&
this!=element->
Previous)
82 if(Previous) Previous->Next = Next;
83 if(Next) Next->Previous = Previous;
90 if(Previous) Previous->
Next =
this;
129 void SAP_PairData::Release()
149 if(!nb_objects)
return false;
154 mNbObjects = nb_objects;
168 if(element) element = (
SAP_Element*)(uintptr_t(element) + delta);
182 if(remap) *remap = 0;
188 FreeElem = mFirstFree;
189 mFirstFree = mFirstFree->
mNext;
193 if(mNbUsedElements==mNbElements)
196 mNbElements = mNbElements ? (mNbElements<<1) : 2;
204 udword Delta = uintptr_t(NewElems) - uintptr_t(mElementPool);
207 for(i=0;i<mNbUsedElements;i++)
Remap(NewElems[i].mNext, Delta);
208 for(i=0;i<mNbObjects;i++)
Remap(mArray[i], Delta);
210 Remap(mFirstFree, Delta);
213 if(remap) *remap =
Delta;
217 mElementPool = NewElems;
220 FreeElem = &mElementPool[mNbUsedElements++];
237 elem->
mNext = mFirstFree;
248 if(id1>=mNbObjects)
return;
256 mArray[id1] = GetFreeElem(id2,
null);
258 else if(Current->
mID>id2)
261 mArray[id1] = GetFreeElem(id2, mArray[id1]);
266 while(Current->
mNext)
268 if(Current->
mNext->
mID > id2)
break;
270 Current = Current->
mNext;
273 if(Current->
mID==id2)
return;
278 if(Delta)
Remap(Current, Delta);
290 if(id1>=mNbObjects)
return;
299 if(Current->
mID==id2)
301 mArray[id1] = Current->
mNext;
307 while(Current->
mNext)
310 if(Current->
mNext->
mID > id2)
return;
320 Current = Current->
mNext;
328 for(
udword i=0;i<mNbObjects;i++)
336 Current = Current->
mNext;
343 if(!callback)
return;
346 for(
udword i=0;i<mNbObjects;i++)
353 if(!(callback)(i, Current->
mID, user_data))
return;
354 Current = Current->
mNext;
417 mNbObjects = nb_objects;
419 mBoxes =
new SAP_Box[nb_objects];
422 float* Data =
new float[nb_objects*2];
424 for(
udword Axis=0;Axis<3;Axis++)
429 for(i=0;i<nb_objects;i++)
431 Data[i*2+0] = boxes[i]->
GetMin(Axis);
432 Data[i*2+1] = boxes[i]->
GetMax(Axis);
439 for(i=0;i<nb_objects*2;i++)
441 udword SortedIndex = *Sorted++;
442 float SortedCoord = Data[SortedIndex];
443 udword BoxIndex = SortedIndex>>1;
447 SAP_EndPoint* CurrentEndPoint = &mList[Axis][SortedIndex];
448 CurrentEndPoint->
Value = SortedCoord;
451 CurrentEndPoint->
SetData(BoxIndex, SortedIndex&1);
452 CurrentEndPoint->
Previous = PreviousEndPoint;
454 if(PreviousEndPoint) PreviousEndPoint->
Next = CurrentEndPoint;
456 if(CurrentEndPoint->
IsMax()) mBoxes[BoxIndex].Max[Axis] = CurrentEndPoint;
457 else mBoxes[BoxIndex].
Min[Axis] = CurrentEndPoint;
459 PreviousEndPoint = CurrentEndPoint;
465 CheckListsIntegrity();
469 mPairs.
Init(nb_objects);
481 if(id0!=id1 && boxes[id0]->
Intersect(*boxes[id1]))
492 bool SweepAndPrune::CheckListsIntegrity()
494 for(
udword Axis=0;Axis<3;Axis++)
510 if(Previous->
Value > Current->
Value)
return false;
514 if(Current->
Previous!=Previous)
return false;
517 Current = Current->
Next;
538 for(
udword Axis=0;Axis<3;Axis++)
547 const float Limit = box.
GetMin(Axis);
548 if(Limit == CurrentMin->
Value)
551 else if(Limit < CurrentMin->Value)
553 CurrentMin->
Value = Limit;
579 CurrentMin->
Value = Limit;
586 while((tmp = NewPos->
Next) && tmp->
Value < Limit)
609 const float Limit = box.
GetMax(Axis);
610 if(Limit == CurrentMax->
Value)
613 else if(Limit > CurrentMax->
Value)
615 CurrentMax->
Value = Limit;
622 while((tmp = NewPos->
Next) && tmp->
Value < Limit)
640 CurrentMax->
Value = Limit;