FITD/FitdLib/actorList.cpp

139 lines
4.5 KiB
C++

#include "common.h"
int sortCompareFunction(const void* param1, const void* param2)
{
int distance1 = 0;
int distance2 = 0;
tObject* actor1Ptr;
tObject* actor2Ptr;
ZVStruct* actor1ZvPtr;
ZVStruct* actor2ZvPtr;
ZVStruct localZv1;
ZVStruct localZv2;
int flag = 0;
int y1;
int y2;
ASSERT(*(int*)param1 >=0 && *(int*)param1 < NUM_MAX_OBJECT);
ASSERT(*(int*)param2 >=0 && *(int*)param2 < NUM_MAX_OBJECT);
actor1Ptr = &ListObjets[*(int*)param1];
actor2Ptr = &ListObjets[*(int*)param2];
actor1ZvPtr = &actor1Ptr->zv;
actor2ZvPtr = &actor2Ptr->zv;
if(actor1Ptr->room != currentRoom)
{
CopyZV(actor1ZvPtr, &localZv1);
AdjustZV(&localZv1, actor1Ptr->room, currentRoom);
actor1ZvPtr = &localZv1;
}
if(actor2Ptr->room != currentRoom)
{
CopyZV(actor2ZvPtr, &localZv2);
AdjustZV(&localZv2, actor2Ptr->room, currentRoom);
actor2ZvPtr = &localZv2;
}
y1 = ((((actor1ZvPtr->ZVY1 + actor1ZvPtr->ZVY2) / 2) - 2000) / 2000) * 2000;
y2 = ((((actor2ZvPtr->ZVY1 + actor2ZvPtr->ZVY2) / 2) - 2000) / 2000) * 2000;
if((y1 == y2) || (g_gameId >= JACK)) // both y in the same range
{
if(
((actor1ZvPtr->ZVX1 > actor2ZvPtr->ZVX1) && (actor1ZvPtr->ZVX1 < actor2ZvPtr->ZVX2)) ||
((actor1ZvPtr->ZVX2 > actor2ZvPtr->ZVX1) && (actor1ZvPtr->ZVX2 < actor2ZvPtr->ZVX2)) ||
((actor2ZvPtr->ZVX1 > actor1ZvPtr->ZVX1) && (actor2ZvPtr->ZVX1 < actor1ZvPtr->ZVX2)) ||
((actor2ZvPtr->ZVX2 > actor1ZvPtr->ZVX1) && (actor2ZvPtr->ZVX2 < actor1ZvPtr->ZVX2)) )
{
flag |= 1;
}
if(
((actor1ZvPtr->ZVZ1 > actor2ZvPtr->ZVZ1) && (actor1ZvPtr->ZVZ1 < actor2ZvPtr->ZVZ2)) ||
((actor1ZvPtr->ZVZ2 > actor2ZvPtr->ZVZ1) && (actor1ZvPtr->ZVZ2 < actor2ZvPtr->ZVZ2)) ||
((actor2ZvPtr->ZVZ1 > actor1ZvPtr->ZVZ1) && (actor2ZvPtr->ZVZ1 < actor1ZvPtr->ZVZ2)) ||
((actor2ZvPtr->ZVZ2 > actor1ZvPtr->ZVZ1) && (actor2ZvPtr->ZVZ2 < actor1ZvPtr->ZVZ2)) )
{
flag |= 2;
}
//TODO: remove hack and find the exact cause of the bug in the sorting algorithm
//flag = 0;
if(flag == 0)
{
distance1 = GiveDistance2D(translateX,translateZ,(actor1ZvPtr->ZVX1+actor1ZvPtr->ZVX2)/2,(actor1ZvPtr->ZVZ1+actor1ZvPtr->ZVZ2)/2);
distance2 = GiveDistance2D(translateX,translateZ,(actor2ZvPtr->ZVX1+actor2ZvPtr->ZVX2)/2,(actor2ZvPtr->ZVZ1+actor2ZvPtr->ZVZ2)/2);
}
else
{
if(flag & 2) // intersect on Z
{
if( abs(translateX - actor1ZvPtr->ZVX1) < abs(translateX - actor1ZvPtr->ZVX2) )
{
distance1 = abs(translateX - actor1ZvPtr->ZVX1);
}
else
{
distance1 = abs(translateX - actor1ZvPtr->ZVX2);
}
if( abs(translateX - actor2ZvPtr->ZVX1) < abs(translateX - actor2ZvPtr->ZVX2) )
{
distance2 = abs(translateX - actor2ZvPtr->ZVX1);
}
else
{
distance2 = abs(translateX - actor2ZvPtr->ZVX2);
}
}
if(flag & 1) // intersect on X
{
if( abs(translateZ - actor1ZvPtr->ZVZ1) < abs(translateZ - actor1ZvPtr->ZVZ2) )
{
distance1 += abs(translateZ - actor1ZvPtr->ZVZ1);
}
else
{
distance1 += abs(translateZ - actor1ZvPtr->ZVZ2);
}
if( abs(translateZ - actor2ZvPtr->ZVZ1) < abs(translateZ - actor2ZvPtr->ZVZ2) )
{
distance2 += abs(translateZ - actor2ZvPtr->ZVZ1);
}
else
{
distance2 += abs(translateZ - actor2ZvPtr->ZVZ2);
}
}
}
}
else
{
distance1 = abs(translateY - 2000 - y1);
distance2 = abs(translateY - 2000 - y2);
}
if(distance1>distance2)
{
return(-1);
}
if(distance1<distance2)
{
return(1);
}
return(0);
}
void sortActorList()
{
qsort(Index.data(), NbAffObjets, sizeof(int), sortCompareFunction);
}