131 lines
3.7 KiB
C++
131 lines
3.7 KiB
C++
#include "ShotTracker.h"
|
|
#include "memory.h"
|
|
#include "stdlib.h"
|
|
|
|
#define THL 5
|
|
|
|
void SHOTS_CLASS::MainCall(MAP *pSrc)
|
|
{
|
|
u32 Counter;
|
|
|
|
if (MapSize < pSrc->PITCH * pSrc->SY * 2)
|
|
{
|
|
if (MapCal) free(MapCal);
|
|
MapSize = pSrc->PITCH * pSrc->SY * 2;
|
|
MapCal = (s8 *)malloc(MapSize);
|
|
}
|
|
|
|
/* Detect new shots */
|
|
DetectedGravNum = SHOTS_DETECT(pSrc,DetectedGrav,(u8*)MapCal);
|
|
|
|
#ifdef DISPLAY_MINUS1
|
|
Counter = DetectedGravNum;
|
|
while (Counter--)
|
|
{
|
|
SHOT_DrawDebug(&DetectedGrav[Counter],pSrc,0 , 1 , 0x808080);
|
|
}//*/
|
|
return;
|
|
#endif
|
|
|
|
/* Transform detected shots into tracked shot according several conditions */
|
|
{
|
|
GravC *pBase, *pCurrent , *pLast;
|
|
pBase = pCurrent = DetectedGrav;
|
|
pLast = pBase+DetectedGravNum;
|
|
DetectedGravNum = 0;
|
|
while (pCurrent < pLast)
|
|
{
|
|
if (pCurrent->CodeNumber < 1<<RAW_CODEBITNUM)
|
|
{
|
|
TrackedCodeHistory[pCurrent->CodeNumber] |= 1;
|
|
if (((!TrackedGrav[pCurrent->CodeNumber].Validated) )
|
|
|| (TrackedGrav[pCurrent->CodeNumber].ContourError < 0.9f))
|
|
{
|
|
if (GetBitNumber(TrackedCodeHistory[pCurrent->CodeNumber])>=THL)
|
|
{
|
|
TrackedGrav[pCurrent->CodeNumber] = *pCurrent;
|
|
TrackedGrav[pCurrent->CodeNumber].Validated = 1;
|
|
TrackedGrav[pCurrent->CodeNumber].TrackedTime = 0;
|
|
TrackedGrav[pCurrent->CodeNumber].MatrixSmoothed = TrackedGrav[pCurrent->CodeNumber].Matrix;
|
|
TrackedGrav[pCurrent->CodeNumber].PerspectiveDirSmoothed = TrackedGrav[pCurrent->CodeNumber].PerspectiveDir;
|
|
/*
|
|
pBase++;
|
|
*pBase = *pCurrent;
|
|
DetectedGravNum++;//*/
|
|
}
|
|
}
|
|
#ifdef DETECTION_PREFERED_TOTRACKER
|
|
else
|
|
if (GetBitNumber(TrackedCodeHistory[pCurrent->CodeNumber])>=THL)
|
|
/*#else
|
|
if (TrackedGrav[pCurrent->CodeNumber].ContourError < 0.9f)
|
|
#endif*/
|
|
{
|
|
TrackedCodeHistory[pCurrent->CodeNumber] |= 1;
|
|
pCurrent->MatrixSmoothed = TrackedGrav[pCurrent->CodeNumber].MatrixSmoothed;
|
|
pCurrent->PerspectiveDirSmoothed = TrackedGrav[pCurrent->CodeNumber].PerspectiveDir;
|
|
TrackedGrav[pCurrent->CodeNumber] = *pCurrent;
|
|
TrackedGrav[pCurrent->CodeNumber].Validated = 1;
|
|
TrackedGrav[pCurrent->CodeNumber].TrackedTime = 0;
|
|
SHOT_ComputeSmooth(&TrackedGrav[pCurrent->CodeNumber]);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
pCurrent++;
|
|
}
|
|
}
|
|
|
|
|
|
/* TRack shots */
|
|
|
|
{
|
|
MAP8 MHS,MHSO2,MHSO4,MHSO8;
|
|
MAP_2_MAP8(pSrc,&MHS,(u8*)MapCal);
|
|
MAP8_COMPUTEO2(&MHS,&MHSO2);
|
|
MAP8_COMPUTEO2(&MHSO2,&MHSO4);
|
|
Counter = 1<<RAW_CODEBITNUM;
|
|
while (Counter--)
|
|
{
|
|
if (GetBitNumber(TrackedCodeHistory[Counter])<THL)
|
|
TrackedGrav[Counter].Validated = 0;
|
|
if (TrackedGrav[Counter].Validated && (TrackedCodeRequested[Counter>>5] & 1<<(Counter&31)) && (TrackedGrav[Counter].TrackedTime != 0))
|
|
{
|
|
TrackedGrav[Counter].CodeNumber = Counter;
|
|
TrackedGrav[Counter].Validated = SHOTS_TRACK(&MHS,&MHSO2,&MHSO4,&TrackedGrav[Counter],pSrc);
|
|
if (TrackedGrav[Counter].CodeNumber != Counter) TrackedCodeHistory[Counter] &= ~1;
|
|
} //else
|
|
//TrackedGrav[Counter].Validated = 0;
|
|
if (TrackedGrav[Counter].Validated)
|
|
{
|
|
if (TrackedGrav[Counter].CodeNumber == Counter) TrackedCodeHistory[Counter] |= 1;
|
|
TrackedGrav[Counter].TrackedTime++;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (DrawShots)
|
|
{
|
|
// Draw shots
|
|
Counter = 1<<RAW_CODEBITNUM;
|
|
while (Counter--)
|
|
{
|
|
if (TrackedGrav[Counter].Validated)
|
|
SHOT_DrawDebug(&TrackedGrav[Counter],pSrc,0, 1 , TrackedGrav[Counter].TrackedTime>1 ? 0xff0000 : 0xff00);
|
|
|
|
}//*/
|
|
}
|
|
|
|
/* Update history */
|
|
Counter = 1<<RAW_CODEBITNUM;
|
|
while (Counter--)
|
|
{
|
|
if ((TrackedCodeRequested[Counter>>5] & 1<<(Counter&31)) == 0)
|
|
TrackedGrav[Counter].Validated = 0;
|
|
}
|
|
Counter = 1<<RAW_CODEBITNUM;
|
|
while (Counter--) TrackedCodeHistory[Counter] <<= 1;
|
|
memset(TrackedCodeRequested,0,sizeof(TrackedCodeRequested));
|
|
}
|