125 lines
No EOL
2.7 KiB
C++
125 lines
No EOL
2.7 KiB
C++
#include "ShotTracker.h"
|
|
#include "stdio.h"
|
|
#include "stdlib.h"
|
|
#include "math.h"
|
|
|
|
/*
|
|
Generation of elliptic tag bmp files.
|
|
*/
|
|
|
|
//#pragma optimize( "", off )
|
|
#define TAG_BNM_Size 200
|
|
u32 SAVEBMP(MAP *RefMap,char *Filename);
|
|
void SetCode(/*OUT*/ u32 *pCodeG_100,/*IN*/u32 CodeV);
|
|
|
|
//#define CURRENT_TAG_VERION 12
|
|
|
|
s32 PolarToColor(float R,float A,u32 *Code)
|
|
{
|
|
if (R > (TAG_BNM_Size>>1) -2)
|
|
{
|
|
if ((s32)(A * 1024.0f / (2.0f * 3.1415926535897932384626433832795f))&8) return 0xffffffff;
|
|
if (R > (TAG_BNM_Size>>1) -1) return 0xffffffff;
|
|
return 0;
|
|
}
|
|
R *= 1.40f * 256.0f / (float)TAG_BNM_Size ;
|
|
/* A *= 1.05f;
|
|
if (A > (2.0f * 3.1415926535897932384626433832795f)) return 0xffffffff;*/
|
|
if (R < 128.0f)
|
|
{
|
|
if (R > 128.0f * SMALL_RADIUS)
|
|
{
|
|
if ((R > 128.0f * CMIN) && (R < 128.0f * CMAX))
|
|
{
|
|
A *= (float)RAW_CODELENGHT / (2.0f * 3.1415926535897932384626433832795f);
|
|
if (Code[(u32)A])
|
|
{
|
|
R = (R - CMIN) / ((CMAX) - (CMIN));
|
|
return 0xFFFFFFFF;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
return 0xffffff;
|
|
}
|
|
else
|
|
return 0xffffff;
|
|
}
|
|
|
|
void CreateTags()
|
|
{
|
|
FILE *F;
|
|
char TEXT[2048];
|
|
sprintf(TEXT,".\\TAG\\TAG_VERSION.VER",0);
|
|
F = fopen(TEXT,"rb");
|
|
if (F)
|
|
{
|
|
u32 Version;
|
|
fread(&Version,1,4,F);
|
|
fclose(F);
|
|
if (CURRENT_TAG_VERION == Version) return;
|
|
}//*/
|
|
F = fopen(TEXT,"wb");
|
|
if (F)
|
|
{
|
|
u32 Version = CURRENT_TAG_VERION;
|
|
fwrite(&Version,1,4,F);
|
|
fclose(F);
|
|
}//*/
|
|
|
|
{
|
|
MAP TAG;
|
|
MAP TAGSAVE,TAGO2;
|
|
float ASIN[8193];
|
|
for (int F = 0 ; F < 8193 ; F++) ASIN[F] = asin((float)F / 8192.0f);
|
|
|
|
TAG.SX = TAG_BNM_Size<<2;
|
|
TAG.SY = TAG_BNM_Size<<2;
|
|
TAG.SetSize(TAG.SX, TAG.SY);
|
|
TAG.staticBase = 1;
|
|
for (s32 Code = 0 ; Code < (1<<RAW_CODEBITNUM) ; Code ++)
|
|
{
|
|
|
|
u32 CodeB[1024];
|
|
SetCode(CodeB,Code);
|
|
for (u32 CX = 0 ; CX < TAG.SX ; CX ++)
|
|
{
|
|
for (u32 CY = 0 ; CY < TAG.SY ; CY ++)
|
|
{
|
|
float Cfx = (float)CX - (float)(TAG.SX>>1) + 0.5f;
|
|
float Cfy = (float)CY - (float)(TAG.SY>>1) + 0.5f;
|
|
float PolarD;
|
|
float PolarAlpha;
|
|
PolarD = sqrtf(Cfx * Cfx + Cfy * Cfy);
|
|
if (Cfy < 0.0f) PolarAlpha = ASIN[(u32)(8192.0f *(-Cfy/PolarD))];
|
|
else PolarAlpha = ASIN[(u32)(8192.0f *(Cfy/PolarD))];
|
|
if (Cfx > 0.0f) PolarAlpha = 3.1415927f - PolarAlpha;
|
|
if (Cfy < 0.0f) PolarAlpha = 2.0f * 3.1415927f - PolarAlpha;
|
|
TAG.SetValue(CX + CY * TAG.PITCH, PolarToColor(PolarD/4.0f,PolarAlpha,CodeB));
|
|
}
|
|
}
|
|
sprintf(TEXT,".\\TAG\\TAG_%03d.BMP",Code);
|
|
TAGO2 = TAGSAVE = TAG;
|
|
TAGO2.SX >>= 1;
|
|
TAGO2.SY >>= 1;
|
|
COPY_O2_RGBA(&TAG,&TAGO2);
|
|
TAG = TAGO2;
|
|
TAGO2.SX >>= 1;
|
|
TAGO2.SY >>= 1;
|
|
COPY_O2_RGBA(&TAG,&TAGO2);
|
|
TAG = TAGO2;
|
|
SAVEBMP(&TAG,TEXT);
|
|
TAG = TAGSAVE ;
|
|
|
|
}
|
|
TAG.staticBase = 0;
|
|
}
|
|
}
|
|
|
|
void SHOTS_CLASS::Init()
|
|
{
|
|
CreateTags();
|
|
} |