picodrive/platform/win32/GenaDrive/LightCal.cpp
notaz cc68a136aa initial import
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@2 be3aeb3a-fb24-0410-a615-afba39da0efa
2006-12-19 20:53:21 +00:00

102 lines
1.8 KiB
C++

#include "app.h"
struct Target
{
int sx,sy; // Onscreen coordinates
int dx,dy; // Device values
};
struct Target Targ[2]=
{
{0,0, 0,0},
{0,0, 0,0}
};
static int LightState=0;
struct Calib
{
float ax,bx;
float ay,by;
};
static struct Calib Cal={0.0f,0.0f,0.0f,0.0f};
int LightCalReset()
{
LightState=0;
memset(Targ,0,sizeof(Targ));
Targ[0].sx=MainWidth >>1;
Targ[0].sy=MainHeight>>1;
Targ[1].sy=Targ[0].sy-MainHeight*61/160;
Targ[1].sx=Targ[0].sx-MainWidth *61/160;
return 0;
}
int LightCalUpdate()
{
int i=0;
struct Target *pt=NULL;
if (Inp.held[4]==1) LoopMode=3;
if (Inp.held[8]==1)
{
i=LightState&1;
pt=Targ+i;
pt->dx=Inp.axis[0];
pt->dy=Inp.axis[1];
if (i==1)
{
int num=0,den=0;
// rx= a + b*x - work out a and b:
num=Targ[0].sx-Targ[1].sx;
den=Targ[0].dx-Targ[1].dx;
if (den) Cal.bx=(float)num/(float)den;
Cal.ax=(float)Targ[0].sx-Cal.bx*(float)Targ[0].dx;
num=Targ[0].sy-Targ[1].sy;
den=Targ[0].dy-Targ[1].dy;
if (den) Cal.by=(float)num/(float)den;
Cal.ay=(float)Targ[0].sy-Cal.by*(float)Targ[0].dy;
}
LightState++;
}
return 0;
}
int LightCalRender()
{
int i=0;
struct Target *pt=NULL;
float fx=0.0f,fy=0.0f;
DirectClear(0xffffff);
WCHAR text[80]={0};
wsprintfW(text,L"LightGun Calibration");
FontSetColour(0x0000ff);
FontText(text,240,48);
wsprintfW(text,L"Start to quit, B to call InputLightCal");
FontSetColour(0x004000);
FontText(text,64,120);
i=LightState&1;
pt=Targ+i;
FontSetColour(0);
FontText(L"X", pt->sx-8, pt->sy-12);
fx=Cal.ax+Cal.bx*(float)Inp.axis[0];
fy=Cal.ay+Cal.by*(float)Inp.axis[1];
FontSetColour(0xff0000);
FontText(L"+", (int)fx-8,(int)fy-12);
return 0;
}