408 lines
11 KiB
C++
408 lines
11 KiB
C++
#include "TRACK.h"
|
|
//#include "SHOTS.h"
|
|
//#include "SHOTS.h"
|
|
//#pragma optimize("",off)
|
|
void MAP16_Neg(MAP16 *MapSRC);
|
|
|
|
u32 F2DT_FRAME(MAP *CurrentMap,u32 options);
|
|
|
|
#define F2DTLevels 1
|
|
static MAP MWork[F2DTLevels];
|
|
static MAP MWork_Help[F2DTLevels];
|
|
static MAP MWork_Help2[F2DTLevels];
|
|
|
|
#define HistoryPo2 6
|
|
#define HistorySize (1<<HistoryPo2)
|
|
|
|
static MAP Dancer_Past[HistorySize + 1];
|
|
|
|
#define SynchroSize 11
|
|
static MAP Dancer_Synchro[SynchroSize];
|
|
static u32 SynchroPos = 0;
|
|
|
|
static MAP *LastCurrentMap = NULL;
|
|
static u32 CounterInc = 0;
|
|
static u32 CounterHistory = 0;
|
|
|
|
void MAP32_NormalizeBW(MAP *MapBW,u32 One,u32 Border);
|
|
float MAP32_DotProductNormalized1(MAP *Map1,MAP *Map2)
|
|
{
|
|
s32 *LAST,*M1,*M2;
|
|
float Average1 = 0,Average2 = 0;
|
|
float Sqr1 = 0,DotProd = 0;
|
|
float Sqr2 = 0;
|
|
SET_BORDER(Map1,Map1->SX>>3,0);
|
|
SET_BORDER(Map2,Map2->SX>>3,0);
|
|
M1 = Map1->GetBase();
|
|
M2 = Map2->GetBase();
|
|
for (u32 SizeY = 0; SizeY < Map1->SY;SizeY ++)
|
|
{
|
|
LAST = M1 + (Map1->SX);
|
|
while (M1 < LAST)
|
|
{
|
|
Average1 += (float)*M1;
|
|
Average2 += (float)*M2;
|
|
M1++;
|
|
M2++;
|
|
}
|
|
M1+=Map1->PITCH-Map1->SX;
|
|
M2+=Map2->PITCH-Map2->SX;
|
|
}
|
|
Average1 /= (float)Map1->SX * (float)(Map1->SY);
|
|
Average2 /= (float)Map1->SX * (float)(Map1->SY);
|
|
M1 = Map1->GetBase();
|
|
M2 = Map2->GetBase();
|
|
for (u32 SizeY = 0; SizeY < Map1->SY;SizeY ++)
|
|
{
|
|
LAST = M1 + (Map1->SX);
|
|
while (M1 < LAST)
|
|
{
|
|
float fM1 = *M1 - Average1;
|
|
float fM2 = *M2 - Average2;
|
|
Sqr1 += fM1 * fM1;
|
|
Sqr2 += fM2 * fM2;
|
|
DotProd += fM1 * fM2;
|
|
M1++;
|
|
M2++;
|
|
}
|
|
M1+=Map1->PITCH-Map1->SX;
|
|
M2+=Map2->PITCH-Map2->SX;
|
|
}
|
|
return DotProd * FastInvSqrt(Sqr1 * Sqr2);
|
|
}
|
|
u32 GetHistoryIndex(s32 K)
|
|
{
|
|
u32 R = (HistorySize + CounterHistory - K) & (HistorySize-1);
|
|
return R;
|
|
}
|
|
float GetDaNumber()
|
|
{
|
|
float DP1[128],AvgS1 = 0,SqrS1 = 0;
|
|
float DP2[128],AvgS2 = 0,SqrS2 = 0;
|
|
float FinalDotProd = 0;
|
|
#define Depth 12
|
|
MAP32_Set(&Dancer_Past[HistorySize],0);
|
|
for (int i = 1 ; i < Depth+1 ; i ++)
|
|
MAP32_Add(&Dancer_Past[GetHistoryIndex(i)],&Dancer_Past[HistorySize]);
|
|
for (int i = 1 ; i < Depth+1 ; i ++)
|
|
{
|
|
u32 I1 = HistorySize ,I2 = GetHistoryIndex(i);
|
|
Dancer_Past[I1].SetBase(Dancer_Past[I1].GetBase());
|
|
Dancer_Past[I2].SetBase(Dancer_Past[I2].GetBase());
|
|
Dancer_Past[I1].SX >>= 1;
|
|
Dancer_Past[I2].SX >>= 1;
|
|
Dancer_Past[I1].SetBase(Dancer_Past[I1].GetBase()+Dancer_Past[I1].SX);
|
|
Dancer_Past[I2].SetBase(Dancer_Past[I2].GetBase()+Dancer_Past[I2].SX);
|
|
DP1[i] = MAP32_DotProductNormalized1(&Dancer_Past[I1],&Dancer_Past[I2]);
|
|
AvgS1 += DP1[i];
|
|
Dancer_Past[I1].SetBase(Dancer_Past[I1].GetBase()-Dancer_Past[I1].SX);
|
|
Dancer_Past[I2].SetBase(Dancer_Past[I2].GetBase()-Dancer_Past[I2].SX);
|
|
Dancer_Past[I1].SX <<= 1;
|
|
Dancer_Past[I2].SX <<= 1;
|
|
|
|
}
|
|
for (int i = 1 ; i < Depth+1 ; i ++)
|
|
{
|
|
u32 I1 = HistorySize ,I2 = GetHistoryIndex(i);
|
|
Dancer_Past[I1].SetBase(Dancer_Past[I1].GetBase());
|
|
Dancer_Past[I2].SetBase(Dancer_Past[I2].GetBase());
|
|
Dancer_Past[I1].SX >>= 1;
|
|
Dancer_Past[I2].SX >>= 1;
|
|
DP2[i] = MAP32_DotProductNormalized1(&Dancer_Past[I1],&Dancer_Past[I2]);
|
|
AvgS2 += DP2[i];
|
|
Dancer_Past[I1].SX <<= 1;
|
|
Dancer_Past[I2].SX <<= 1;
|
|
}
|
|
AvgS1 /= Depth;
|
|
AvgS2 /= Depth;
|
|
for (int i = 1 ; i < Depth+1 ; i ++)
|
|
{
|
|
DP1[i] -= AvgS1;
|
|
DP2[i] -= AvgS2;
|
|
}//*/
|
|
AvgS1 = SqrS1 = AvgS2 = SqrS2 = 0.0;
|
|
for (int i = 1 ; i < Depth+1 ; i ++)
|
|
{
|
|
SqrS1 += DP1[i] * DP1[i];
|
|
SqrS2 += DP2[i] * DP2[i];
|
|
FinalDotProd += DP1[i] * DP2[i];
|
|
}
|
|
FinalDotProd = FinalDotProd * FastInvSqrt(SqrS1 * SqrS2);
|
|
return FinalDotProd;
|
|
}
|
|
float Fast2DCompareLeftAndRight(MAP *pCurrent)
|
|
{
|
|
u32 F2DT_CreateFeatureBox(u32 Index, s32 X,s32 Y,s32 W, s32 H, float Rotation);
|
|
float FAST2D_FeatureBoxGetPertinence(u32 Index);
|
|
void F2DT_FeatureBoxSetParam(u32 Index,char *String , float Value);
|
|
pCurrent->SX >>= 1;
|
|
F2DT_FRAME(pCurrent,0);
|
|
#define Kin (pCurrent->SX>>4)
|
|
F2DT_CreateFeatureBox(0, Kin,Kin,pCurrent->SX-Kin*2,pCurrent->SY-Kin*2, 0.0f);
|
|
pCurrent->SetBase(pCurrent->GetBase()+pCurrent->SX);
|
|
F2DT_FeatureBoxSetParam(0,"TURN",0);
|
|
F2DT_FeatureBoxSetParam(0,"SCAL",1);
|
|
F2DT_FeatureBoxSetParam(0,"JUMP",0);
|
|
F2DT_FeatureBoxSetParam(0,"INIT",1);
|
|
F2DT_FeatureBoxSetParam(0,"EROR",0.6);
|
|
|
|
F2DT_FRAME(pCurrent,3);
|
|
pCurrent->SetBase(pCurrent->GetBase()-pCurrent->SX);
|
|
pCurrent->SX <<= 1;
|
|
return FAST2D_FeatureBoxGetPertinence(0)/100.0f;
|
|
}
|
|
|
|
void DanceDance_NoiseMap(MAP *CurrentMap)
|
|
{
|
|
char TTTT[256];
|
|
|
|
float SqrSumm = 0,Average = 0;
|
|
float SqrSumm2 = 0,Average2 = 0;
|
|
static float LastAverage = 0;
|
|
static float LastAverage2 = 0;
|
|
static float Blended = 0.0;
|
|
static float BlendedBlended = 0.0;
|
|
#define MedianSize 9
|
|
static float Median[MedianSize];
|
|
static float MedianSorted[MedianSize];
|
|
|
|
if (CurrentMap->SX*CurrentMap->SY != MWork[0].SX*MWork[0].SY)
|
|
{
|
|
MWork[0].SetSize(CurrentMap->SX*6, CurrentMap->SY);
|
|
MWork[0].PITCH = MWork[0].SX = CurrentMap->SX;
|
|
MWork[0].SY = CurrentMap->SY;
|
|
for (int i = 1 ; i < F2DTLevels; i++ ) {MWork[i].PITCH = MWork[i].SX = MWork[i-1].SX >> 1;MWork[i].SY = MWork[i-1].SY >> 1;MWork[i].SetBase(MWork[i-1].GetBase() + MWork[i-1].SX * MWork[i-1].SY * 4);};
|
|
for (int i = 0 ; i < F2DTLevels; i++ ) {MWork_Help[i] = MWork[i];MWork_Help[i].staticBase = 1;MWork_Help[i].MoveBase(MWork_Help[i].SX * MWork_Help[i].SY) ;};
|
|
for (int i = 0 ; i < F2DTLevels; i++ ) {MWork_Help2[i] = MWork_Help[i];MWork_Help2[i].staticBase = 1;MWork_Help2[i].MoveBase(MWork_Help2[i].SX * MWork_Help2[i].SY) ;};
|
|
for (int i = 0 ; i < HistorySize+1; i++ )
|
|
{
|
|
Dancer_Past[i].SetSize(CurrentMap->SX,CurrentMap->SY,1);
|
|
};
|
|
for (int i = 0 ; i < SynchroSize; i++ )
|
|
{
|
|
Dancer_Synchro[i].SetSize(CurrentMap->SX>>1,CurrentMap->SY,1);
|
|
};
|
|
}
|
|
|
|
/* Synchroise */
|
|
CurrentMap->SX >>= 1;
|
|
MAP32_Copy(CurrentMap,&Dancer_Synchro[SynchroPos]);
|
|
SynchroPos++;
|
|
if (SynchroPos == SynchroSize) SynchroPos = 0;
|
|
MAP32_Copy(&Dancer_Synchro[SynchroPos],CurrentMap);
|
|
CurrentMap->SX <<= 1;
|
|
|
|
CounterInc ++;
|
|
if (LastCurrentMap != CurrentMap)
|
|
{
|
|
|
|
#if 0
|
|
MAP32_BLUR_Inplace(&MWork_Help2[0],1,3);
|
|
MAP32_Copy(&MWork_Help2[0],&Dancer_Past[GetHistoryIndex(0)]);
|
|
// MAP32_Shift(&Dancer_Past[GetHistoryIndex(0)],2);
|
|
COPY_RGBA(&Dancer_Past[GetHistoryIndex(0)],&Dancer_Past[GetHistoryIndex(0)]);
|
|
|
|
Blended = Fast2DCompareLeftAndRight(&Dancer_Past[GetHistoryIndex(0)]);
|
|
BlendedBlended = BlendedBlended * 0.95f + Blended * 0.05f;
|
|
|
|
CounterHistory ++;
|
|
CounterInc = 1;
|
|
CounterHistory &= HistorySize-1;
|
|
#else
|
|
MAP32_Copy(&MWork_Help2[0],&Dancer_Past[GetHistoryIndex(0)]);
|
|
// MAP32_Sub(&MWork_Help2[0],&Dancer_Past[GetHistoryIndex(0)]);
|
|
//MAP32_Add(&Dancer_Past[GetHistoryIndex(0)],128);
|
|
//MAP32_BLUR_Inplace(&Dancer_Past[GetHistoryIndex(0)],2,3);
|
|
CounterHistory ++;
|
|
CounterHistory &= HistorySize-1;
|
|
CounterInc = 1;
|
|
MAP32_Set(&MWork[0],0);
|
|
MAP32_Set(&MWork_Help[0],0);
|
|
MAP32_Set(&MWork_Help2[0],0);
|
|
|
|
Blended = Blended * 0.95f + GetDaNumber() * 0.05f;
|
|
Blended = GetDaNumber();
|
|
if (Blended < 0) Blended = 0;
|
|
Blended *= Blended;
|
|
for (int i = 1 ; i < MedianSize ; i++)
|
|
Median[i-1] = Median[i];
|
|
Median[MedianSize-1] = Blended;
|
|
for (int i = 0 ; i < MedianSize ; i++)
|
|
MedianSorted[i] = Median[i];
|
|
for (int i = 0 ; i < MedianSize - 1 ; i++)
|
|
for (int j = i+1 ; i < MedianSize ; i++)
|
|
if (MedianSorted[i] < MedianSorted[j])
|
|
{
|
|
float Swap = MedianSorted[i];MedianSorted[i] = Median[i]; Median[i] = Swap;
|
|
}
|
|
//BlendedBlended = MedianSorted[(MedianSize>>1) + 1];
|
|
BlendedBlended = BlendedBlended * 0.95f + Blended * 0.05f;
|
|
#endif
|
|
//Blended = GetDaNumber();
|
|
}
|
|
|
|
LastCurrentMap = CurrentMap;
|
|
|
|
//CounterInc = 1;
|
|
#if 0
|
|
MAP32_COPY_BW(CurrentMap,CurrentMap);
|
|
MAP32_BLUR_Inplace(CurrentMap,1,3);
|
|
MAP32_Shift(CurrentMap,-2);
|
|
MAP32_COPY_RGBA(CurrentMap,CurrentMap);
|
|
#endif
|
|
|
|
/*
|
|
|
|
CurrentMap->SetValue(2, rand()%321654);
|
|
return;//*/
|
|
|
|
//MAP32_And(CurrentMap,0xff);
|
|
//MAP32_BLUR_Inplace(CurrentMap,1,3);
|
|
{
|
|
s32 *LAST,*DST;
|
|
s32 *WH0,*WH1,*WH2;
|
|
DST = CurrentMap->GetBase();
|
|
WH0 = MWork[0].GetBase();
|
|
WH1 = MWork_Help[0].GetBase();
|
|
WH2 = MWork_Help2[0].GetBase();
|
|
for (u32 SizeY = 0; SizeY < CurrentMap->SY;SizeY ++)
|
|
{
|
|
LAST = DST + (CurrentMap->SX>>1);
|
|
while (DST < LAST)
|
|
{
|
|
s32 MAX;
|
|
MAX = ((u8*)DST)[0];
|
|
if (((u8*)DST)[1] > MAX) MAX = ((u8*)DST)[1];
|
|
if (((u8*)DST)[2] > MAX) MAX = ((u8*)DST)[2];
|
|
*WH0 += (MAX);
|
|
*WH1 += (MAX * MAX);
|
|
MAX = (*WH1 / CounterInc) - (*WH0 / CounterInc) * (*WH0 / CounterInc);
|
|
if (MAX) MAX = FastSqrt(MAX);
|
|
Average += (float)MAX;
|
|
SqrSumm += (float)MAX * (float)MAX;
|
|
*WH2 =MAX;
|
|
|
|
//if (!MAX) *((s32*)DST) = 0;
|
|
|
|
|
|
WH0 ++;
|
|
WH1 ++;
|
|
WH2 ++;
|
|
DST++;
|
|
}
|
|
LAST = DST + (CurrentMap->SX>>1);
|
|
while (DST < LAST)
|
|
{
|
|
s32 MAX;
|
|
MAX = ((u8*)DST)[0];
|
|
MAX += ((u8*)DST)[1];
|
|
MAX += ((u8*)DST)[2];
|
|
MAX /= 3;
|
|
//if (((u8*)DST)[3] > MAX) MAX = ((u8*)DST)[3];
|
|
//((u8*)DST)[0] = ((u8*)DST)[1] = ((u8*)DST)[2] = ((u8*)DST)[3] = MAX>>1;
|
|
*WH0 += (MAX);
|
|
*WH1 += (MAX * MAX);
|
|
MAX = (*WH1 / CounterInc) - (*WH0 / CounterInc) * (*WH0 / CounterInc);
|
|
if (MAX) MAX = FastSqrt(MAX);
|
|
Average2 += (float)MAX;
|
|
SqrSumm2 += (float)MAX * (float)MAX;
|
|
*WH2 =MAX;
|
|
// *WH2 =MAX;
|
|
//if (!MAX) *((s32*)DST) = 0;
|
|
|
|
|
|
WH0 ++;
|
|
WH1 ++;
|
|
WH2 ++;
|
|
DST ++;
|
|
}
|
|
DST+=CurrentMap->PITCH-CurrentMap->SX;
|
|
WH0+=MWork[0].PITCH-MWork[0].SX;
|
|
WH1+=MWork_Help[0].PITCH-MWork_Help[0].SX;
|
|
WH2+=MWork_Help2[0].PITCH-MWork_Help2[0].SX;
|
|
}
|
|
}
|
|
/* MAP32_MIN_CROSS(CurrentMap,&MWork_Help2[0]);
|
|
MAP32_MIN_CROSS(&MWork_Help2[0],CurrentMap);
|
|
*/
|
|
Average = 2.0 * Average / ((float)CurrentMap->SX * (float)CurrentMap->SY);
|
|
SqrSumm = 2.0 * SqrSumm / ((float)CurrentMap->SX * (float)CurrentMap->SY);
|
|
SqrSumm -= Average * Average;
|
|
SqrSumm = FastSqrt(SqrSumm);
|
|
SqrSumm = 32 / (SqrSumm + 1);
|
|
|
|
Average2 = 2.0 * Average2 / ((float)CurrentMap->SX * (float)CurrentMap->SY);
|
|
SqrSumm2 = 2.0 * SqrSumm2 / ((float)CurrentMap->SX * (float)CurrentMap->SY);
|
|
SqrSumm2 -= Average2 * Average2;
|
|
SqrSumm2 = FastSqrt(SqrSumm2);
|
|
SqrSumm2 = 32 / (SqrSumm2 + 1);
|
|
|
|
LastAverage = Average;
|
|
LastAverage2 = Average2;
|
|
|
|
/* {
|
|
s32 *LAST,*DST;
|
|
DST = CurrentMap->GetBase();
|
|
for (u32 SizeY = 0; SizeY < CurrentMap->SY;SizeY ++)
|
|
{
|
|
LAST = DST + (CurrentMap->SX>>1);
|
|
while (DST < LAST)
|
|
{
|
|
*DST = (*DST - Average)*SqrSumm + 128;
|
|
DST++;
|
|
}
|
|
LAST = DST + (CurrentMap->SX>>1);
|
|
while (DST < LAST)
|
|
{
|
|
*DST = (*DST - Average2)*SqrSumm2 + 128;
|
|
DST++;
|
|
}
|
|
DST+=CurrentMap->PITCH-CurrentMap->SX;
|
|
}
|
|
}
|
|
*/
|
|
/*
|
|
MAP32_Copy(&Dancer_Past[GetHistoryIndex(1)],CurrentMap);
|
|
MAP32_Copy(&MWork_Help2[0],CurrentMap);
|
|
|
|
MAP32_Add(CurrentMap,128);
|
|
|
|
MAP32_COPY_RGBA(CurrentMap,CurrentMap);*/
|
|
MAP32_COPY_RGBA(&Dancer_Past[GetHistoryIndex(1)],CurrentMap);
|
|
MAP32_COPY_RGBA(&MWork_Help2[0],CurrentMap);
|
|
|
|
/*MAP32_Copy(&MWork_Help2[0],CurrentMap);
|
|
MAP32_COPY_RGBA(CurrentMap,CurrentMap);*/
|
|
//*/
|
|
/* {
|
|
s32 *LAST,*DST;
|
|
DST = CurrentMap->GetBase();
|
|
for (u32 SizeY = 0; SizeY < CurrentMap->SY;SizeY ++)
|
|
{
|
|
LAST = DST + (CurrentMap->SX>>1);
|
|
while (DST < LAST)
|
|
{
|
|
if (*DST< 0) *DST = 0;
|
|
if ((*DST & 0xffff00))
|
|
*DST = 0xffffff;
|
|
DST++;
|
|
}
|
|
LAST = DST + (CurrentMap->SX>>1);
|
|
while (DST < LAST)
|
|
{
|
|
if (*DST< 0) *DST = 0;
|
|
if (*DST & 0xffff00)
|
|
*DST = 0xffffff;
|
|
else
|
|
*DST = (*DST<<16);
|
|
DST++;
|
|
}
|
|
DST+=CurrentMap->PITCH-CurrentMap->SX;
|
|
}
|
|
}*/
|
|
sprintf(TTTT , "%.2f",Blended);
|
|
DrawQuadFull(CurrentMap,0,0,CurrentMap->SX*BlendedBlended,CurrentMap->SY>>3,0xff00);
|
|
DRawTEXT_Soft_B((u8*)TTTT ,(u32*)CurrentMap->GetBase(),10,10,CurrentMap->PITCH,CurrentMap->SY,0xffffff);
|
|
|
|
CurrentMap->SetValue(2, rand()%321654);
|
|
}
|