JD2022-TU1/main/extern/Camcam/ShotTracker/ShotsPts.cpp

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));
}