FTTInput.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. #include "FTTInput.h"
  2. #include "AndroidApp.h"
  3. #include "CFTTTime.h"
  4. bool FTTInput_bInitialised = false; //005CA22C
  5. uchar s_uKeyStates[343]; //005C9DD0
  6. uchar s_bKeyStatesPressed[343]; //005C9F27
  7. uchar s_bKeyStatesReleased[343]; //005CA07E
  8. uchar s_fRollerValues[20]; //005CA1D8
  9. float s_fAxisValues[16]; //005CA1EC
  10. MYSTATIC int64 int64_3499A0 = 1;
  11. MYSTATIC float gs_fdword_3499A8[3] = {1.0, 1.0, 1.0}; //003499A8
  12. MYSTATIC uchar byte_5CA230_mystatic[343];
  13. MYSTATIC UseBy_unk_5CA388 UseBy_unk_5CA388_5CA388_mystatic;
  14. MYSTATIC CTouchStateInternal CTouchStateInternal_5CA390_mystatic[16];
  15. MYSTATIC UseByAddTouchEvent_Internal UseByAddTouchEvent_Internal_5CA590_mystatic[128];
  16. MYSTATIC bool byte_5CB190_mystatic; // CTouchStateInternal_5CA390_mystatic被初始化元素的count
  17. MYSTATIC int dword_5CB194_mystatic;
  18. MYSTATIC int dword_5CB198_mystatic;
  19. MYSTATIC int dword_5CB19C_mystatic;
  20. MYSTATIC FTTMutex fttmutex_5CB1AC_mystatic;
  21. #pragma pack(4)
  22. struct FTTInput {
  23. bool b_0;
  24. int i_4;
  25. int i_8;
  26. int i_C;
  27. uint field_10;
  28. uint field_14;
  29. uint field_18;
  30. FTTMutex tMutex_1C;
  31. };
  32. #pragma pack()
  33. MYSTATIC FTTInput gs_input_005CB190;
  34. MYSTATIC float gs_fdword_5CB1D0[2];
  35. MYSTATIC float gs_fdword_5CB1D8[4];
  36. //---------------------------------------------------------------------------------------------------------------------------------------------
  37. //0021FF2C //^_^
  38. __attribute__((noinline)) MYSTATIC void sub_21FF2C_mystatic() {
  39. }
  40. //---------------------------------------------------------------------------------------------------------------------------------------------
  41. //0021FCC0
  42. void AddTouchEvent_Internal(CTouchStateInternal *p_ctouchstateinternal_r0_arg,
  43. ETouchEvent etouchevent_r1_arg,
  44. float f_r2_arg,
  45. float f_r3_arg, uint ud_arg_0) {
  46. float f_s16 = f_r3_arg;
  47. float f_s18 = f_r2_arg;
  48. int64 ll_r8_r9;
  49. if (p_ctouchstateinternal_r0_arg != nullptr) { // 0021FCD4
  50. // 0021FCD6
  51. ll_r8_r9 = p_ctouchstateinternal_r0_arg->field_8;
  52. if ((f_s18 == -1.0) && (f_s16 == -1.0)) { // 0021FCDE 0021FCE8
  53. // 0021FCF0
  54. f_s18 = p_ctouchstateinternal_r0_arg->field_0;
  55. f_s16 = p_ctouchstateinternal_r0_arg->field_4;
  56. }
  57. bool b_r0;
  58. if ((etouchevent_r1_arg == 1) && ((b_r0 = p_ctouchstateinternal_r0_arg->NeedsDeferredRelease()) != false)) { // 0021FCF8 0021FD04
  59. // 0021FD06
  60. p_ctouchstateinternal_r0_arg->field_0 = f_s18;
  61. p_ctouchstateinternal_r0_arg->field_4 = f_s16;
  62. p_ctouchstateinternal_r0_arg->b_1c = true;
  63. // 0021FE22
  64. // LOGI("AddTouchEvent_Internal 1_21 return 1");
  65. return;
  66. } else if (((etouchevent_r1_arg == 1) && (b_r0 == false)) || ((etouchevent_r1_arg | 2) == 3)) { // 0021FD24
  67. // 0021FD28 dup
  68. int i_r0 = gs_input_005CB190.i_4 - (p_ctouchstateinternal_r0_arg - CTouchStateInternal_5CA390_mystatic);
  69. int i_r2 = i_r0 - 1;
  70. memmove(p_ctouchstateinternal_r0_arg, &p_ctouchstateinternal_r0_arg[1], sizeof(CTouchStateInternal) * i_r2);
  71. gs_input_005CB190.i_4--;
  72. memset(&CTouchStateInternal_5CA390_mystatic[gs_input_005CB190.i_4], 0, sizeof(CTouchStateInternal));
  73. } else {
  74. // 0021FDC4
  75. p_ctouchstateinternal_r0_arg->field_0 = f_s18;
  76. p_ctouchstateinternal_r0_arg->field_4 = f_s16;
  77. }
  78. } else {
  79. // 0021FD14
  80. if (etouchevent_r1_arg == 3) { // 0021FD14
  81. // 0021FD1A
  82. // 0021FDBE
  83. ll_r8_r9 = 0;
  84. } else {
  85. // 0021FD60
  86. if ((etouchevent_r1_arg == 0) || (etouchevent_r1_arg == 2)) { // 0021FD68
  87. // 0021FD6C
  88. int i_r0 = gs_input_005CB190.i_4;
  89. if (i_r0 <= 0xF) { // 0021FD72
  90. // 0021FD76
  91. gs_input_005CB190.i_4++;
  92. int64 ll_r0_r1 = int64_3499A0;
  93. CTouchStateInternal_5CA390_mystatic[i_r0].field_0 = f_s18;
  94. CTouchStateInternal_5CA390_mystatic[i_r0].field_4 = f_s16;
  95. int64_3499A0++;
  96. CTouchStateInternal_5CA390_mystatic[i_r0].field_8 = ll_r0_r1;
  97. CTouchStateInternal_5CA390_mystatic[i_r0].field_10 = ud_arg_0;
  98. CTouchStateInternal_5CA390_mystatic[i_r0].uFrameNumber_14 = CFTTTime::s_uFrameNumber;
  99. uint ui_r0 = CFTTTime::GetSystemTime();
  100. ll_r8_r9 = CTouchStateInternal_5CA390_mystatic[i_r0].field_8;
  101. CTouchStateInternal_5CA390_mystatic[i_r0].field_18 = ui_r0;
  102. CTouchStateInternal_5CA390_mystatic[i_r0].b_1c = false;
  103. } else {
  104. ll_r8_r9 = 0;
  105. }
  106. } else {
  107. // 0021FDBE
  108. ll_r8_r9 = 0;
  109. }
  110. }
  111. }
  112. // 0021FDCC 合
  113. int i_r1 = gs_input_005CB190.i_8;
  114. int i_r2 = gs_input_005CB190.i_C;
  115. int i_r7 = i_r2 + i_r1;
  116. i_r7 = i_r7 % 128;
  117. UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_0 = etouchevent_r1_arg;
  118. UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_10 = ll_r8_r9;
  119. UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_4 = f_s18;
  120. UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_8 = f_s16;
  121. if (i_r2 <= 0x7F) { // 0021FDD4
  122. // 0021FE08
  123. gs_input_005CB190.i_C = i_r2 + 1;
  124. } else {
  125. // 0021FE0E
  126. i_r1++;
  127. gs_input_005CB190.b_0 = true;
  128. gs_input_005CB190.i_8 = i_r1 % 128;
  129. }
  130. }
  131. //---------------------------------------------------------------------------------------------------------------------------------------------
  132. //0021FAF0 //^_- 唯一区别:
  133. // 在0021FB3C、0021FB40、0021FB48、0021FB4E、0021FB52处,原始的是VST1.32,而我们的是VST1.8,但指令后面的操作数完全相同
  134. void FTTInput_Init() {
  135. }
  136. //---------------------------------------------------------------------------------------------------------------------------------------------
  137. //0021FB8C //^_- 唯一区别:
  138. // 在0021FBB6、0021FBC0、0021FBC8、0021FBCE处,原始的是VST1.32,而我们的是VST1.8,但指令后面的操作数完全相同
  139. void FTTInput_Process() {
  140. }
  141. //---------------------------------------------------------------------------------------------------------------------------------------------
  142. //0021fc6c ^_^
  143. void FTTInput_ClearTriggers() {
  144. memset(&s_bKeyStatesPressed, 0, sizeof(s_bKeyStatesPressed));
  145. memset(&s_bKeyStatesReleased, 0, sizeof(s_bKeyStatesReleased));
  146. }
  147. //---------------------------------------------------------------------------------------------------------------------------------------------
  148. //0021FC94
  149. int FTTInput_Shutdown() { return 1; }
  150. //---------------------------------------------------------------------------------------------------------------------------------------------
  151. //0021FCB0 //^_^
  152. void FTTInput_SetButtonRemappings(TButtonRemapping *p_tbuttonremapping_r0,
  153. uint ud_r1) {
  154. }
  155. //---------------------------------------------------------------------------------------------------------------------------------------------
  156. //0021fe7c ^_^
  157. void FTTInputTouch_Init(void) {
  158. FTTInputTouch_Shutdown();
  159. }
  160. //---------------------------------------------------------------------------------------------------------------------------------------------
  161. //0021FE80 //^_^
  162. void FTTInputTouch_Shutdown() {
  163. }
  164. //---------------------------------------------------------------------------------------------------------------------------------------------
  165. //0021FECC //^_^
  166. void FTTInputTouch_AddTouchEvent(ETouchEvent eEvent1, float f2, float f3, unsigned int u4) {
  167. FTTMutex *pFFTutex = FTTInputTouch_GetMutex();
  168. pFFTutex->Lock();
  169. sub_21FF2C_mystatic();
  170. CTouchStateInternal *pTouchStateInternal_r6 = CTouchStateInternal_5CA390_mystatic;
  171. int count = gs_input_005CB190.i_4;
  172. int i = 0;
  173. while (1) {
  174. if (i < count) {
  175. if (pTouchStateInternal_r6->field_10 == u4) {
  176. if (pTouchStateInternal_r6->b_1c == 0)
  177. break;
  178. }
  179. i++;
  180. pTouchStateInternal_r6++;
  181. } else {
  182. pTouchStateInternal_r6 = NULL;
  183. break;
  184. }
  185. };
  186. AddTouchEvent_Internal(pTouchStateInternal_r6, eEvent1, f2, f3, u4);
  187. pFFTutex->Unlock();
  188. }
  189. //---------------------------------------------------------------------------------------------------------------------------------------------
  190. //0021FF70 //^_^
  191. UseByAddTouchEvent_Internal FTTInput_GetTouchEvent() {
  192. UseByAddTouchEvent_Internal usebyaddtouchevent_internal_retval;
  193. gs_input_005CB190.tMutex_1C.Lock();
  194. sub_21FF2C_mystatic();
  195. if (gs_input_005CB190.b_0 == true) { // 0021FF88
  196. // 0021FF8C
  197. gs_input_005CB190.b_0 = false;
  198. }
  199. if (gs_input_005CB190.i_C != 0) { // 0021FF92
  200. // 0021FF94
  201. usebyaddtouchevent_internal_retval = UseByAddTouchEvent_Internal_5CA590_mystatic[gs_input_005CB190.i_8];
  202. gs_input_005CB190.i_8 = (gs_input_005CB190.i_8 + 1) % 128;
  203. gs_input_005CB190.i_C--;
  204. } else {
  205. // 0021FFC8
  206. usebyaddtouchevent_internal_retval.field_10 = 0;
  207. usebyaddtouchevent_internal_retval.field_0 = ETouchEvent_neg1;
  208. usebyaddtouchevent_internal_retval.field_4 = -1.0;
  209. usebyaddtouchevent_internal_retval.field_8 = -1.0;
  210. }
  211. gs_input_005CB190.tMutex_1C.Unlock();
  212. return usebyaddtouchevent_internal_retval;
  213. }
  214. //---------------------------------------------------------------------------------------------------------------------------------------------
  215. //0021FFF0 //xxx
  216. int FTTInputTouch_GetTouchState(CTouchState *, int) {
  217. return 1;
  218. }
  219. //---------------------------------------------------------------------------------------------------------------------------------------------
  220. //00220040
  221. __attribute__((noinline)) FTTMutex *FTTInputTouch_GetMutex() {
  222. return &gs_input_005CB190.tMutex_1C;
  223. }
  224. int i=0;
  225. float g_r0[19]={566.000000 ,569.626648 ,573.039978 ,576.880005 ,580.506653 ,583.919983 ,587.546692 ,591.173340 ,594.799988 ,598.426636 ,602.053345 ,605.679993 ,609.306641 ,612.933350 ,616.559998 ,620.186646 ,623.813354 ,627.440002 ,630.000000 };
  226. float g_r1[19]={1214.000000,1180.170044,1148.329956,1112.510010,1078.679932,1046.839966,1013.010010,979.179993, 945.349976, 911.520020, 877.690002, 843.859985, 810.030029, 776.199951, 742.369995, 708.539978, 674.710022, 640.880005, 617.000000};
  227. bool flag=false;
  228. //---------------------------------------------------------------------------------------------------------------------------------------------
  229. //0022004C ^_^
  230. bool IsSaveSwipe() {
  231. FILE *fp = fopen("/data/local/tmp/startgetdata", "r");
  232. if (fp) {
  233. fclose(fp);
  234. return true;
  235. }
  236. return false;
  237. }
  238. void FTTInputTouch_AddAndroidTouchEvent(float f_r0, float f_r1, int d_r2,
  239. int d_r3) {
  240. if (IsSaveSwipe() == true) {
  241. LOGE("save data");
  242. //Hook::SaveSwipe(f_r0, f_r1, d_r2, d_r3);
  243. }else
  244. LOGE("NormalAddAndroidTouchEvent");
  245. switch (d_r2) {
  246. case 0:
  247. case 5: {
  248. FTTInputTouch_AddTouchEvent(ETouchEvent_0, f_r0, f_r1, d_r3);
  249. } break;
  250. case 1:
  251. case 6: {
  252. if(f_r0==630.0f&&f_r1==617.0f){
  253. LOGE("replace end");
  254. i=0;
  255. }
  256. FTTInputTouch_AddTouchEvent(ETouchEvent_1, f_r0, f_r1, d_r3);
  257. } break;
  258. case 2: {
  259. if(i){
  260. LOGE("replace");
  261. f_r0=g_r0[i];
  262. f_r1=g_r1[i];
  263. i++;
  264. }
  265. LOGE("r0=%f,r1=%f",f_r0,f_r1);
  266. if(f_r0==566.0f&&f_r1==1214.0f){
  267. i++;
  268. }
  269. FTTInputTouch_AddTouchEvent(ETouchEvent_Touch_2, f_r0, f_r1, d_r3);
  270. } break;
  271. case 3: {
  272. FTTInputTouch_AddTouchEvent(ETouchEvent_3, f_r0, f_r1, d_r3);
  273. } break;
  274. case 4: {
  275. } break;
  276. }
  277. }
  278. //---------------------------------------------------------------------------------------------------------------------------------------------
  279. //00220084 ^_^
  280. void FTTInput_ProcessJoystick() {
  281. }
  282. //---------------------------------------------------------------------------------------------------------------------------------------------
  283. //00220190 单元测试跑不到
  284. void FTTInput_worldOriUpdatedAndroid(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9) {
  285. LOGE("FTTInput_worldOriUpdatedAndroid%f%f%f%f%f%f%f%f%f",f1,f2,f3,f4,f5,f6,f7,f8,f9);
  286. }
  287. //---------------------------------------------------------------------------------------------------------------------------------------------
  288. //002201F4
  289. void FTTInput_PlatformInit() {
  290. //empty
  291. }
  292. //---------------------------------------------------------------------------------------------------------------------------------------------
  293. //002201F6
  294. void FTTInput_PlatformShutdown() {
  295. //empty
  296. }
  297. //---------------------------------------------------------------------------------------------------------------------------------------------
  298. //002201f8 ^_^
  299. void FTTInput_PlatformProcess() {
  300. return FTTInput_ProcessJoystick();
  301. }
  302. //---------------------------------------------------------------------------------------------------------------------------------------------
  303. //002201FC ^_^
  304. int FTTInput_PlatformGetNumXInputDevices() {
  305. return 1;
  306. }
  307. //---------------------------------------------------------------------------------------------------------------------------------------------
  308. //00220200 ^_^
  309. int FTTInput_PlatformGetXInputDevicesMask() {
  310. return 1;
  311. }
  312. //---------------------------------------------------------------------------------------------------------------------------------------------
  313. //00220204 //xxx
  314. int FTTInput_PlatformWorldOriSupported() {
  315. return 1;
  316. }
  317. //---------------------------------------------------------------------------------------------------------------------------------------------
  318. //00220258 //xxx
  319. int FTTInput_PlatformWorldOriEnabled() {
  320. return 1;
  321. }
  322. //---------------------------------------------------------------------------------------------------------------------------------------------
  323. //002202AC //xxx
  324. int FTTInput_PlatformEnableWorldOri() {
  325. return 1;
  326. }
  327. //---------------------------------------------------------------------------------------------------------------------------------------------
  328. //002202F8 //xxx
  329. int FTTInput_PlatformDisableWorldOri() {
  330. return 1;
  331. }
  332. //---------------------------------------------------------------------------------------------------------------------------------------------
  333. //00220344 //xxx
  334. int FTTInput_PlatformGetWorldOri(CFTTMatrix32 &) {
  335. return 1;
  336. }
  337. //---------------------------------------------------------------------------------------------------------------------------------------------
  338. //00220448
  339. void FTTInput_PadSetRumble(int, float, float) {
  340. //empty
  341. }
  342. //---------------------------------------------------------------------------------------------------------------------------------------------