initial import
[picodrive.git] / platform / win32 / GenaDrive / LightCal.cpp
diff --git a/platform/win32/GenaDrive/LightCal.cpp b/platform/win32/GenaDrive/LightCal.cpp
new file mode 100644 (file)
index 0000000..0d697d9
--- /dev/null
@@ -0,0 +1,102 @@
+\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