| 1 | \r |
| 2 | #include "app.h"\r |
| 3 | \r |
| 4 | struct Target\r |
| 5 | {\r |
| 6 | int sx,sy; // Onscreen coordinates\r |
| 7 | int dx,dy; // Device values\r |
| 8 | };\r |
| 9 | \r |
| 10 | struct Target Targ[2]=\r |
| 11 | {\r |
| 12 | {0,0, 0,0},\r |
| 13 | {0,0, 0,0}\r |
| 14 | };\r |
| 15 | static int LightState=0;\r |
| 16 | \r |
| 17 | struct Calib\r |
| 18 | {\r |
| 19 | float ax,bx;\r |
| 20 | float ay,by;\r |
| 21 | };\r |
| 22 | static struct Calib Cal={0.0f,0.0f,0.0f,0.0f};\r |
| 23 | \r |
| 24 | int LightCalReset()\r |
| 25 | {\r |
| 26 | LightState=0;\r |
| 27 | \r |
| 28 | memset(Targ,0,sizeof(Targ));\r |
| 29 | Targ[0].sx=MainWidth >>1;\r |
| 30 | Targ[0].sy=MainHeight>>1;\r |
| 31 | Targ[1].sy=Targ[0].sy-MainHeight*61/160;\r |
| 32 | Targ[1].sx=Targ[0].sx-MainWidth *61/160;\r |
| 33 | return 0;\r |
| 34 | }\r |
| 35 | \r |
| 36 | int LightCalUpdate()\r |
| 37 | {\r |
| 38 | int i=0;\r |
| 39 | struct Target *pt=NULL;\r |
| 40 | \r |
| 41 | if (Inp.held[4]==1) LoopMode=3;\r |
| 42 | \r |
| 43 | if (Inp.held[8]==1)\r |
| 44 | {\r |
| 45 | i=LightState&1;\r |
| 46 | pt=Targ+i;\r |
| 47 | \r |
| 48 | pt->dx=Inp.axis[0];\r |
| 49 | pt->dy=Inp.axis[1];\r |
| 50 | \r |
| 51 | if (i==1)\r |
| 52 | {\r |
| 53 | int num=0,den=0;\r |
| 54 | \r |
| 55 | // rx= a + b*x - work out a and b:\r |
| 56 | num=Targ[0].sx-Targ[1].sx;\r |
| 57 | den=Targ[0].dx-Targ[1].dx;\r |
| 58 | if (den) Cal.bx=(float)num/(float)den;\r |
| 59 | Cal.ax=(float)Targ[0].sx-Cal.bx*(float)Targ[0].dx;\r |
| 60 | \r |
| 61 | num=Targ[0].sy-Targ[1].sy;\r |
| 62 | den=Targ[0].dy-Targ[1].dy;\r |
| 63 | if (den) Cal.by=(float)num/(float)den;\r |
| 64 | Cal.ay=(float)Targ[0].sy-Cal.by*(float)Targ[0].dy;\r |
| 65 | }\r |
| 66 | \r |
| 67 | LightState++;\r |
| 68 | }\r |
| 69 | \r |
| 70 | return 0;\r |
| 71 | }\r |
| 72 | \r |
| 73 | int LightCalRender()\r |
| 74 | {\r |
| 75 | int i=0;\r |
| 76 | struct Target *pt=NULL;\r |
| 77 | float fx=0.0f,fy=0.0f;\r |
| 78 | \r |
| 79 | DirectClear(0xffffff);\r |
| 80 | \r |
| 81 | WCHAR text[80]={0};\r |
| 82 | wsprintfW(text,L"LightGun Calibration");\r |
| 83 | FontSetColour(0x0000ff);\r |
| 84 | FontText(text,240,48);\r |
| 85 | \r |
| 86 | wsprintfW(text,L"Start to quit, B to call InputLightCal");\r |
| 87 | FontSetColour(0x004000);\r |
| 88 | FontText(text,64,120);\r |
| 89 | \r |
| 90 | i=LightState&1;\r |
| 91 | pt=Targ+i;\r |
| 92 | FontSetColour(0);\r |
| 93 | FontText(L"X", pt->sx-8, pt->sy-12);\r |
| 94 | \r |
| 95 | fx=Cal.ax+Cal.bx*(float)Inp.axis[0];\r |
| 96 | fy=Cal.ay+Cal.by*(float)Inp.axis[1];\r |
| 97 | \r |
| 98 | FontSetColour(0xff0000);\r |
| 99 | FontText(L"+", (int)fx-8,(int)fy-12);\r |
| 100 | \r |
| 101 | return 0;\r |
| 102 | }\r |