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