CFTTBatchModelManager.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  1. #include "CFTTBatchModelManager.h"
  2. #include <arm_neon.h>
  3. #include "CFTTBatchModelBin.h"
  4. #include "CFTTDevice.h"
  5. #include "CFTTGraphicsDevice.h"
  6. #include "CFTTJobQueue.h"
  7. #include "CFTTMaterialManager.h"
  8. #include "CFTTMatrix32.h"
  9. #include "CFTTShaderBuiltInConstants.h"
  10. #include "CFTTSkinningTask.h"
  11. #include "TFTTCacheLookup.h"
  12. #include "global_func.h"
  13. #include "memctrl.h"
  14. CFTTBatchModelManager *GFXPLAYER_pBatch = nullptr;
  15. struct UseBy_dword_5C9840_Sub {
  16. CFTTJobQueue *p_cfttjobqueue_0;
  17. CFTTBatchModelManager *field_4;
  18. CFTTSkinningTask *field_8;
  19. int field_c;
  20. int field_10;
  21. };
  22. struct UseBy_dword_5C9840 {
  23. int field_0;
  24. int field_4;
  25. int field_8;
  26. int field_c;
  27. int field_10;
  28. UseBy_dword_5C9840_Sub useby_dword_5c9840_sub_14[4];
  29. };
  30. MYSTATIC UseBy_dword_5C9840 dword_5C9840;
  31. MYSTATIC CFTTSkinningTask cfttskinningtask_5AA834[1024];
  32. // 0020FEFC
  33. //乱写的
  34. MYSTATIC void sub_20FEFC(CFTTJob *p_cfttjob_r0_arg, void *p_v_r1_arg) {}
  35. //乱写的
  36. struct TFTTBatchVertexShadow {
  37. int un_0;
  38. };
  39. //乱写的
  40. // 0x20 00211460 080   ADDS            R2, #0x20
  41. struct TFTTBatchVertexBump {
  42. float f_0;
  43.     // 002111DC
  44. float f_4;
  45.     // 00211224
  46. float f_8;
  47.     // 0021126C
  48. short us_C;
  49.   // 002112BC
  50. short us_E;
  51.   // 00211302
  52. short us_10;
  53.   // 00211348
  54. short us_12;
  55.   // 没有看到给这儿赋值的地方
  56. short us_14;
  57.   // 00211444
  58. short us_16;
  59.   // 0021145E
  60. short us_18;
  61.   // 0021138E
  62. short us_1A;
  63.   // 002113D4
  64. short us_1C;
  65.   // 0021141A
  66. short us_1E;
  67.   // 没有看到给这儿赋值的地方,可能仅仅是为了内存对齐
  68. };
  69. // 0x14 00211E24 由此处确定
  70. struct VertBone {
  71. short us_0;
  72. short us_2;
  73. short us_4;
  74. short us_6;
  75. short us_8;
  76. short us_A;
  77. short us_C;
  78. short us_E;
  79. short us_10;
  80. short us_12;
  81. };
  82. struct VertNorTex {
  83. short us_0;
  84. short us_2;
  85. short us_4;
  86. short us_6;
  87. short us_8;
  88. short us_A;
  89. short us_C;
  90. short us_E;
  91. short us_10;
  92. short us_12;
  93. };
  94. struct VertNorTexTan : public VertNorTex {
  95. short us_14;
  96. short us_16;
  97. short us_18;
  98. ushort us_1A;
  99. };
  100. // 0x20
  101. struct VertNorTexBone : public VertBone {
  102. // VertBone tVerBone_0;
  103. short us_14;
  104. short us_16;
  105. short us_18;
  106. ushort us_1A;
  107. uchar uc_1C;
  108. // 00210FB2   LDRB.W          R4, [R9,#0x1C]
  109. uchar uc_1D;
  110. // 0021108A   LDRB.W          R3, [R9,#0x1D]
  111. uchar uc_1E;
  112. // 00211086   LDRB.W          R5, [R9,#0x1E]
  113. uchar uc_1F;
  114. // 00210FD6   LDRB.W          R1, [R9,#0x1F]
  115. };
  116. // 0x28 00210FA0 由此处确定
  117. struct VertNorTexTanBone : public VertNorTexBone {
  118. // VertNorTexBone tVerNorTexBone_0;
  119. ushort us_20;
  120.   //此处一定是ushort
  121. ushort us_22;
  122. ushort us_24;
  123. ushort us_26;
  124. };
  125. // VertNorTexTanBone
  126. // template <typename T>
  127. // void ProcessRigidVertsBumpCount(CFTTMatrix32 const *pMatrix320,
  128. // CFTTMatrix32 const *pMatrix321,
  129. // TFTTBatchVertexBump *pVertexbump2, T const
  130. // *pT3, uint ui4, TUV const *pTUV5) {
  131. // if (g_bNeonAvailable) {
  132. // // loc_2137D0
  133. // while (ui4) {
  134. // // loc_213686
  135. // }
  136. // return;
  137. // } else {
  138. // // loc_2137DA
  139. // // loc_213AE4
  140. // for(int r9_i=0;r9_i!=ui4;r9_i++) {
  141. // // loc_2137F8
  142. // float s2_f = pT3[r9_i].us_2;
  143. // float s6_f = pT3[r9_i].us_4;
  144. // float s12_f = pT3[r9_i].us_0;
  145. // s2_f = pMatrix320->d[1][0] * s2_f;
  146. // float s4_f = pMatrix320->d[0][0];
  147. // float s8_f = pMatrix320->d[2][0];
  148. // float s10_f = pMatrix320->d[3][0];
  149. // s2_f += s4_f * s12_f;
  150. // s2_f += s8_f * s6_f;
  151. // s2_f += s10_f;
  152. // pVertexbump2[r9_i].f_0 = s2_f;
  153. // s2_f = pT3[r9_i].us_2;
  154. // s6_f = pT3[r9_i].us_4;
  155. // s4_f = pMatrix320->d[0][1];
  156. // s8_f = pMatrix320->d[2][1];
  157. // s10_f = pMatrix320->d[3][1];
  158. // s2_f = pMatrix320->[1][1] * s2_f;
  159. // s2_f += s4_f * s12_f;
  160. // s2_f += s8_f * s6_f;
  161. // s2_f += s10_f;
  162. // pVertexbump2[r9_i].f_4 = s2_f;
  163. // // 00213896
  164. // s2_f = pT3[r9_i].us_2;
  165. // s6_f = pT3[r9_i].us_4;
  166. // s4_f = pMatrix320->d[0][2];
  167. // s8_f = pMatrix320->d[2][2];
  168. // s10_f = pMatrix320->d[3][2];
  169. // s2_f = pMatrix320->[1][2] * s2_f;
  170. // s2_f += s4_f * s12_f;
  171. // s2_f += s8_f * s6_f;
  172. // s2_f += s10_f;
  173. // pVertexbump2[r9_i].f_8 = s2_f;
  174. // // 002138DE
  175. // s2_f = pT3[r9_i].us_A;
  176. // s10_f = pT3[r9_i].us_8;
  177. // s6_f = pT3[r9_i].us_C;
  178. // s4_f = pMatrix321->d[0][0];
  179. // s8_f = pMatrix321->d[2][0];
  180. // s2_f = pMatrix321->d[1][0] * s2_f;
  181. // s2_f += s4_f * s10_f;
  182. // s2_f += s8_f * s6_f;
  183. // pVertexbump2[r9_i].us_C = s2_f;
  184. // // 00213926
  185. // s2_f = pT3[r9_i].us_A;
  186. // s10_f = pT3[r9_i].us_8;
  187. // s6_f = pT3[r9_i].us_C;
  188. // s4_f = pMatrix321->d[0][1];
  189. // s8_f = pMatrix321->d[2][1];
  190. // s2_f = pMatrix321->d[1][1] * s2_f;
  191. // s2_f += s4_f * s10_f;
  192. // s2_f += s8_f * s6_f;
  193. // pVertexbump2[r9_i].us_E = s2_f;
  194. // //0021396E
  195. // s2_f = pT3[r9_i].us_A;
  196. // s10_f = pT3[r9_i].us_8;
  197. // s6_f = pT3[r9_i].us_C;
  198. // s4_f = pMatrix321->d[0][2];
  199. // s8_f = pMatrix321->d[2][2];
  200. // s2_f = pMatrix321->d[1][2] * s2_f;
  201. // s2_f += s4_f * s10_f;
  202. // s2_f += s8_f * s6_f;
  203. // pVertexbump2[r9_i].us_10 = s2_f;
  204. // //002139B6
  205. // s2_f = pT3[r9_i].us_16;
  206. // s10_f = pT3[r9_i].us_14;
  207. // s6_f = pT3[r9_i].us_18;
  208. // s4_f = pMatrix321->d[0][0];
  209. // s8_f = pMatrix321->d[2][0];
  210. // s2_f = pMatrix321->d[1][0] * s2_f;
  211. // s2_f += s4_f * s10_f;
  212. // s2_f += s8_f * s6_f;
  213. // pVertexbump2[r9_i].us_18 = s2_f;
  214. // //002139FE
  215. // s2_f = pT3[r9_i].us_16;
  216. // s10_f = pT3[r9_i].us_14;
  217. // s6_f = pT3[r9_i].us_18;
  218. // s4_f = pMatrix321->d[0][1];
  219. // s8_f = pMatrix321->d[2][1];
  220. // s2_f = pMatrix321->d[1][1] * s2_f;
  221. // s2_f += s4_f * s10_f;
  222. // s2_f += s8_f * s6_f;
  223. // pVertexbump2[r9_i].us_1A = s2_f;
  224. // //00213A46
  225. // s2_f = pT3[r9_i].us_16;
  226. // s10_f = pT3[r9_i].us_14;
  227. // s6_f = pT3[r9_i].us_18;
  228. // s4_f = pMatrix321->d[0][2];
  229. // s8_f = pMatrix321->d[2][2];
  230. // s2_f = pMatrix321->d[1][2] * s2_f;
  231. // s2_f += s4_f * s10_f;
  232. // s2_f += s8_f * s6_f;
  233. // pVertexbump2[r9_i].us_1C = s2_f;
  234. // if(pTUV5){
  235. // //00213A90
  236. // pVertexbump2[r9_i].us_14= pTUV5[r9_i].x*32767.0f;
  237. // pVertexbump2[r9_i].us_16= pTUV5[r9_i].y*32767.0f;
  238. // }else{
  239. // //loc_213AB4
  240. // pVertexbump2[r9_i].us_14= pT3[r9_i].us_10;
  241. // pVertexbump2[r9_i].us_16= pT3[r9_i].us_12;;
  242. // }
  243. // }
  244. // }
  245. // }
  246. // VertBone
  247. template <typename T>
  248. void ProcessRigidVertsBumpCount(CFTTMatrix32 const *pMatrix320,
  249. CFTTMatrix32 const *pMatrix321,
  250. TFTTBatchVertexBump *pVertexbump2, T const *pT3,
  251. uint ui4, TUV const *pTUV5) {
  252. for (int r9_i = 0; r9_i != ui4; r9_i++) {
  253. float s2_f = pT3[r9_i].us_2;
  254. float s6_f = pT3[r9_i].us_4;
  255. float s12_f = pT3[r9_i].us_0;
  256. s2_f = pMatrix320->d[1][0] * s2_f;
  257. float s4_f = pMatrix320->d[0][0];
  258. float s8_f = pMatrix320->d[2][0];
  259. float s10_f = pMatrix320->d[3][0];
  260. s2_f += s4_f * s12_f;
  261. s2_f += s8_f * s6_f;
  262. s2_f += s10_f;
  263. pVertexbump2[r9_i].f_0 = s2_f;
  264. s2_f = pT3[r9_i].us_2;
  265. s6_f = pT3[r9_i].us_4;
  266. s4_f = pMatrix320->d[0][1];
  267. s8_f = pMatrix320->d[2][1];
  268. s10_f = pMatrix320->d[3][1];
  269. s2_f = pMatrix320->d[1][1] * s2_f;
  270. s2_f += s4_f * s12_f;
  271. s2_f += s8_f * s6_f;
  272. s2_f += s10_f;
  273. pVertexbump2[r9_i].f_4 = s2_f;
  274. s2_f = pT3[r9_i].us_2;
  275. s6_f = pT3[r9_i].us_4;
  276. s4_f = pMatrix320->d[0][2];
  277. s8_f = pMatrix320->d[2][2];
  278. s10_f = pMatrix320->d[3][2];
  279. s2_f = pMatrix320->d[1][2] * s2_f;
  280. s2_f += s4_f * s12_f;
  281. s2_f += s8_f * s6_f;
  282. s2_f += s10_f;
  283. pVertexbump2[r9_i].f_8 = s2_f;
  284. if (sizeof(*pT3) == sizeof(VertBone)) {
  285. // 00214B00
  286. s2_f = pT3[r9_i + 1].us_2;
  287. s10_f = pT3[r9_i + 1].us_0;
  288. s6_f = pT3[r9_i + 1].us_4;
  289. s4_f = pMatrix321->d[0][0];
  290. s8_f = pMatrix321->d[2][0];
  291. s2_f = pMatrix321->d[1][0] * s2_f;
  292. s2_f += s4_f * s10_f;
  293. s2_f += s8_f * s6_f;
  294. pVertexbump2[r9_i].us_C = s2_f;
  295. s2_f = pT3[r9_i + 1].us_2;
  296. s10_f = pT3[r9_i + 1].us_0;
  297. s6_f = pT3[r9_i + 1].us_4;
  298. s4_f = pMatrix321->d[0][1];
  299. s8_f = pMatrix321->d[2][1];
  300. s2_f = pMatrix321->d[1][1] * s2_f;
  301. s2_f += s4_f * s10_f;
  302. s2_f += s8_f * s6_f;
  303. pVertexbump2[r9_i].us_E = s2_f;
  304. s2_f = pT3[r9_i + 1].us_2;
  305. s10_f = pT3[r9_i + 1].us_0;
  306. s6_f = pT3[r9_i + 1].us_4;
  307. s4_f = pMatrix321->d[0][2];
  308. s8_f = pMatrix321->d[2][2];
  309. s2_f = pMatrix321->d[1][2] * s2_f;
  310. s2_f += s4_f * s10_f;
  311. s2_f += s8_f * s6_f;
  312. pVertexbump2[r9_i].us_10 = s2_f;
  313. s2_f = pT3[r9_i + 1].us_A;
  314. s10_f = pT3[r9_i + 1].us_8;
  315. s6_f = pT3[r9_i + 1].us_C;
  316. s4_f = pMatrix321->d[0][0];
  317. s8_f = pMatrix321->d[2][0];
  318. s2_f = pMatrix321->d[1][0] * s2_f;
  319. s2_f += s4_f * s10_f;
  320. s2_f += s8_f * s6_f;
  321. pVertexbump2[r9_i].us_18 = s2_f;
  322. s2_f = pT3[r9_i + 1].us_A;
  323. s10_f = pT3[r9_i + 1].us_8;
  324. s6_f = pT3[r9_i + 1].us_C;
  325. s4_f = pMatrix321->d[0][1];
  326. s8_f = pMatrix321->d[2][1];
  327. s2_f = pMatrix321->d[1][1] * s2_f;
  328. s2_f += s4_f * s10_f;
  329. s2_f += s8_f * s6_f;
  330. pVertexbump2[r9_i].us_1A = s2_f;
  331. s2_f = pT3[r9_i + 1].us_A;
  332. s10_f = pT3[r9_i + 1].us_8;
  333. s6_f = pT3[r9_i + 1].us_C;
  334. s4_f = pMatrix321->d[0][2];
  335. s8_f = pMatrix321->d[2][2];
  336. s2_f = pMatrix321->d[1][2] * s2_f;
  337. s2_f += s4_f * s10_f;
  338. s2_f += s8_f * s6_f;
  339. pVertexbump2[r9_i].us_1C = s2_f;
  340. } else if (sizeof(*pT3) == sizeof(VertNorTexTanBone)) {
  341. VertNorTexTanBone *pVertNorTexTanBone3 = (VertNorTexTanBone *)pT3;
  342. s2_f = pVertNorTexTanBone3[r9_i].us_A;
  343. s10_f = pVertNorTexTanBone3[r9_i].us_8;
  344. s6_f = pVertNorTexTanBone3[r9_i].us_C;
  345. s4_f = pMatrix321->d[0][0];
  346. s8_f = pMatrix321->d[2][0];
  347. s2_f = pMatrix321->d[1][0] * s2_f;
  348. s2_f += s4_f * s10_f;
  349. s2_f += s8_f * s6_f;
  350. pVertexbump2[r9_i].us_C = s2_f;
  351. // 00213926
  352. s2_f = pVertNorTexTanBone3[r9_i].us_A;
  353. s10_f = pVertNorTexTanBone3[r9_i].us_8;
  354. s6_f = pVertNorTexTanBone3[r9_i].us_C;
  355. s4_f = pMatrix321->d[0][1];
  356. s8_f = pMatrix321->d[2][1];
  357. s2_f = pMatrix321->d[1][1] * s2_f;
  358. s2_f += s4_f * s10_f;
  359. s2_f += s8_f * s6_f;
  360. pVertexbump2[r9_i].us_E = s2_f;
  361. // 0021396E
  362. s2_f = pVertNorTexTanBone3[r9_i].us_A;
  363. s10_f = pVertNorTexTanBone3[r9_i].us_8;
  364. s6_f = pVertNorTexTanBone3[r9_i].us_C;
  365. s4_f = pMatrix321->d[0][2];
  366. s8_f = pMatrix321->d[2][2];
  367. s2_f = pMatrix321->d[1][2] * s2_f;
  368. s2_f += s4_f * s10_f;
  369. s2_f += s8_f * s6_f;
  370. pVertexbump2[r9_i].us_10 = s2_f;
  371. // 002139B6
  372. s2_f = pVertNorTexTanBone3[r9_i].us_16;
  373. s10_f = pVertNorTexTanBone3[r9_i].us_14;
  374. s6_f = pVertNorTexTanBone3[r9_i].us_18;
  375. s4_f = pMatrix321->d[0][0];
  376. s8_f = pMatrix321->d[2][0];
  377. s2_f = pMatrix321->d[1][0] * s2_f;
  378. s2_f += s4_f * s10_f;
  379. s2_f += s8_f * s6_f;
  380. pVertexbump2[r9_i].us_18 = s2_f;
  381. // 002139FE
  382. s2_f = pVertNorTexTanBone3[r9_i].us_16;
  383. s10_f = pVertNorTexTanBone3[r9_i].us_14;
  384. s6_f = pVertNorTexTanBone3[r9_i].us_18;
  385. s4_f = pMatrix321->d[0][1];
  386. s8_f = pMatrix321->d[2][1];
  387. s2_f = pMatrix321->d[1][1] * s2_f;
  388. s2_f += s4_f * s10_f;
  389. s2_f += s8_f * s6_f;
  390. pVertexbump2[r9_i].us_1A = s2_f;
  391. // 00213A46
  392. s2_f = pVertNorTexTanBone3[r9_i].us_16;
  393. s10_f = pVertNorTexTanBone3[r9_i].us_14;
  394. s6_f = pVertNorTexTanBone3[r9_i].us_18;
  395. s4_f = pMatrix321->d[0][2];
  396. s8_f = pMatrix321->d[2][2];
  397. s2_f = pMatrix321->d[1][2] * s2_f;
  398. s2_f += s4_f * s10_f;
  399. s2_f += s8_f * s6_f;
  400. pVertexbump2[r9_i].us_1C = s2_f;
  401. }
  402. if (pTUV5) {
  403. // 00213A90
  404. pVertexbump2[r9_i].us_14 = pTUV5[r9_i].x * 32767.0f;
  405. pVertexbump2[r9_i].us_16 = pTUV5[r9_i].y * 32767.0f;
  406. } else {
  407. if (sizeof(*pT3) == sizeof(VertBone)) {
  408. pVertexbump2[r9_i].us_14 = pT3[r9_i + 1].us_10;
  409. pVertexbump2[r9_i].us_16 = pT3[r9_i + 1].us_12;
  410. } else if (sizeof(*pT3) == sizeof(VertNorTexTanBone)) {
  411. // loc_213AB4
  412. pVertexbump2[r9_i].us_14 = pT3[r9_i].us_10;
  413. pVertexbump2[r9_i].us_16 = pT3[r9_i].us_12;
  414. }
  415. }
  416. }
  417. }
  418. struct TFTTBatchVertex {
  419. float f_0;
  420. float f_4;
  421. float f_8;
  422. short us_C;
  423. short us_E;
  424. short us_10;
  425. short us_12;
  426. short us_14;
  427. short us_16;
  428. };
  429. template <typename T>
  430. void ProcessRigidVertsCount(CFTTMatrix32 const *pMatrix320,
  431. CFTTMatrix32 const *pMatrix321,
  432. TFTTBatchVertex *pVertex2, T const *pT3, uint u4,
  433. TUV const *pTUV5) {
  434. //LOGE("g_bNeonAvailable%x", g_bNeonAvailable);
  435. if (g_bNeonAvailable) {
  436. float32x4_t Q8 = vld1q_f32((float *)pMatrix321);
  437. float32x4_t Q12 = vld1q_f32(((float *)pMatrix321) + 4);
  438. float32x4_t Q10 = vld1q_f32(((float *)pMatrix321) + 8);
  439. float32x4_t Q9 = vld1q_f32((float *)pMatrix320);
  440. float32x4_t Q14 = vld1q_f32(((float *)pMatrix320) + 4);
  441. float32x4_t Q13 = vld1q_f32(((float *)pMatrix320) + 8);
  442. float32x4_t Q11 = vld1q_f32(((float *)pMatrix320) + 12);
  443. for (int i = 0; i != u4; i++) {
  444. //loc_215B78
  445. float32x4_t Q2;
  446. memcpy(&Q2, &Q11, sizeof(Q2));
  447. int16x4_t d30 = vld1_dup_s16((short *)&pT3[i]);
  448. float32x4_t Q15 = vmovl_s16(d30);
  449. Q15 = vcvtq_f32_s32(Q15);
  450. Q2 = vmlaq_f32(Q2, Q9, Q15);
  451. int16x4_t D1 = vld1_dup_s16(((short *)&pT3[i]) + 1);
  452. float32x4_t Q1 = vmovl_s16(D1);
  453. Q15 = vcvtq_f32_s32(Q1);
  454. Q2 = vmlaq_f32(Q2, Q14, Q15);
  455. D1 = vld1_dup_s16(((short *)&pT3[i]) + 2);
  456. Q1 = vmovl_s16(D1);
  457. Q15 = vcvtq_f32_s32(Q1);
  458. Q2 = vmlaq_f32(Q2, Q13, Q15);
  459. memcpy(&pVertex2[i], &Q2, sizeof(Q2));
  460. if (typeid(T) == typeid(VertBone)) {
  461. d30 = vld1_dup_s16(((short *)&pT3[i]) + 0xA);
  462. Q15 = vmovl_s16(d30);
  463. Q15 = vcvtq_f32_s32(Q15);
  464. Q15 = vmulq_f32(Q15, Q8);
  465. D1 = vld1_dup_s16(((short *)&pT3[i]) + 0xB);
  466. Q1 = vmovl_s16(D1);
  467. Q1 = vcvtq_f32_s32(Q1);
  468. Q15 = vmlaq_f32(Q15, Q12, Q1);
  469. D1 = vld1_dup_s16(((short *)&pT3[i]) + 0xC);
  470. Q2 = vmovl_s16(D1);
  471. Q1 = vcvtq_f32_s32(Q2);
  472. Q15 = vmlaq_f32(Q15, Q10, Q1);
  473. Q15 = vcvtq_s32_f32(Q15);
  474. d30 = vmovn_s32(Q15);
  475. memcpy(&pVertex2[i].us_C, &d30, sizeof(d30));
  476. }else {
  477. d30 = vld1_dup_s16(((short *)&pT3[i]) + 0x4);
  478. Q15 = vmovl_s16(d30);
  479. Q15 = vcvtq_f32_s32(Q15);
  480. Q15 = vmulq_f32(Q15, Q8);
  481. D1 = vld1_dup_s16(((short *)&pT3[i]) + 0x5);
  482. Q1 = vmovl_s16(D1);
  483. Q1 = vcvtq_f32_s32(Q1);
  484. Q15 = vmlaq_f32(Q15, Q12, Q1);
  485. D1 = vld1_dup_s16(((short *)&pT3[i]) + 0x6);
  486. Q2 = vmovl_s16(D1);
  487. Q1 = vcvtq_f32_s32(Q2);
  488. Q15 = vmlaq_f32(Q15, Q10, Q1);
  489. Q15 = vcvtq_s32_f32(Q15);
  490. d30 = vmovn_s32(Q15);
  491. memcpy(&pVertex2[i].us_C, &d30, sizeof(d30));
  492. }
  493. if (pTUV5) {
  494. pVertex2[i].us_14 = pTUV5[i].x * 32767.0f;
  495. pVertex2[i].us_16 = pTUV5[i].x * 32767.0f;
  496. } else {
  497. if (typeid(T) == typeid(VertBone)) {
  498. pVertex2[i].us_14 = pT3[i + 1].us_10;
  499. pVertex2[i].us_16 = pT3[i + 1].us_12;
  500. } else {
  501. pVertex2[i].us_14 = pT3[i].us_10;
  502. pVertex2[i].us_16 = pT3[i].us_12;
  503. }
  504. }
  505. }
  506. } else {
  507. for (int r9_i = 0; r9_i != u4; r9_i++) {
  508. float s2_f = pT3[r9_i].us_2;
  509. float s6_f = pT3[r9_i].us_4;
  510. float s12_f = pT3[r9_i].us_0;
  511. s2_f = pMatrix320->d[1][0] * s2_f;
  512. float s4_f = pMatrix320->d[0][0];
  513. float s8_f = pMatrix320->d[2][0];
  514. float s10_f = pMatrix320->d[3][0];
  515. s2_f += s4_f * s12_f;
  516. s2_f += s8_f * s6_f;
  517. s2_f += s10_f;
  518. pVertex2[r9_i].f_0 = s2_f;
  519. s2_f = pT3[r9_i].us_2;
  520. s6_f = pT3[r9_i].us_4;
  521. s4_f = pMatrix320->d[0][1];
  522. s8_f = pMatrix320->d[2][1];
  523. s10_f = pMatrix320->d[3][1];
  524. s2_f = pMatrix320->d[1][1] * s2_f;
  525. s2_f += s4_f * s12_f;
  526. s2_f += s8_f * s6_f;
  527. s2_f += s10_f;
  528. pVertex2[r9_i].f_4 = s2_f;
  529. s2_f = pT3[r9_i].us_2;
  530. s6_f = pT3[r9_i].us_4;
  531. s4_f = pMatrix320->d[0][2];
  532. s8_f = pMatrix320->d[2][2];
  533. s10_f = pMatrix320->d[3][2];
  534. s2_f = pMatrix320->d[1][2] * s2_f;
  535. s2_f += s4_f * s12_f;
  536. s2_f += s8_f * s6_f;
  537. s2_f += s10_f;
  538. pVertex2[r9_i].f_8 = s2_f;
  539. if (typeid(T) == typeid(VertBone)) {
  540. s2_f = pT3[r9_i + 1].us_2;
  541. s10_f = pT3[r9_i + 1].us_0;
  542. s6_f = pT3[r9_i + 1].us_4;
  543. s4_f = pMatrix321->d[0][0];
  544. s8_f = pMatrix321->d[2][0];
  545. s2_f = pMatrix321->d[1][0] * s2_f;
  546. s2_f += s4_f * s10_f;
  547. s2_f += s8_f * s6_f;
  548. pVertex2[r9_i].us_C = s2_f;
  549. s2_f = pT3[r9_i + 1].us_2;
  550. s10_f = pT3[r9_i + 1].us_0;
  551. s6_f = pT3[r9_i + 1].us_4;
  552. s4_f = pMatrix321->d[0][1];
  553. s8_f = pMatrix321->d[2][1];
  554. s2_f = pMatrix321->d[1][1] * s2_f;
  555. s2_f += s4_f * s10_f;
  556. s2_f += s8_f * s6_f;
  557. pVertex2[r9_i].us_E = s2_f;
  558. s2_f = pT3[r9_i + 1].us_2;
  559. s10_f = pT3[r9_i + 1].us_0;
  560. s6_f = pT3[r9_i + 1].us_4;
  561. s4_f = pMatrix321->d[0][2];
  562. s8_f = pMatrix321->d[2][2];
  563. s2_f = pMatrix321->d[1][2] * s2_f;
  564. s2_f += s4_f * s10_f;
  565. s2_f += s8_f * s6_f;
  566. pVertex2[r9_i].us_10 = s2_f;
  567. if (typeid(T) == typeid(VertBone)) {
  568. pVertex2[r9_i].us_14 = pT3[r9_i + 1].us_10;
  569. pVertex2[r9_i].us_16 = pT3[r9_i + 1].us_12;
  570. } else {
  571. pVertex2[r9_i].us_14 = pT3[r9_i].us_10;
  572. pVertex2[r9_i].us_16 = pT3[r9_i].us_12;
  573. }
  574. } else {
  575. T *pVertNorTexTanBone3 = (T *)pT3;
  576. s2_f = pVertNorTexTanBone3[r9_i].us_A;
  577. s10_f = pVertNorTexTanBone3[r9_i].us_8;
  578. s6_f = pVertNorTexTanBone3[r9_i].us_C;
  579. s4_f = pMatrix321->d[0][0];
  580. s8_f = pMatrix321->d[2][0];
  581. s2_f = pMatrix321->d[1][0] * s2_f;
  582. s2_f += s4_f * s10_f;
  583. s2_f += s8_f * s6_f;
  584. pVertex2[r9_i].us_C = s2_f;
  585. s2_f = pVertNorTexTanBone3[r9_i].us_A;
  586. s10_f = pVertNorTexTanBone3[r9_i].us_8;
  587. s6_f = pVertNorTexTanBone3[r9_i].us_C;
  588. s4_f = pMatrix321->d[0][1];
  589. s8_f = pMatrix321->d[2][1];
  590. s2_f = pMatrix321->d[1][1] * s2_f;
  591. s2_f += s4_f * s10_f;
  592. s2_f += s8_f * s6_f;
  593. pVertex2[r9_i].us_E = s2_f;
  594. s2_f = pVertNorTexTanBone3[r9_i].us_A;
  595. s10_f = pVertNorTexTanBone3[r9_i].us_8;
  596. s6_f = pVertNorTexTanBone3[r9_i].us_C;
  597. s4_f = pMatrix321->d[0][2];
  598. s8_f = pMatrix321->d[2][2];
  599. s2_f = pMatrix321->d[1][2] * s2_f;
  600. s2_f += s4_f * s10_f;
  601. s2_f += s8_f * s6_f;
  602. pVertex2[r9_i].us_10 = s2_f;
  603. }
  604. // else if(typeid(T) == typeid(VertNorTex)){
  605. // //002159FA
  606. // VertNorTex *pVertNorTex3 = (VertNorTex *)pT3;
  607. // s2_f = pVertNorTex3[r9_i].us_A;
  608. // s10_f = pVertNorTex3[r9_i].us_8;
  609. // s6_f = pVertNorTex3[r9_i].us_C;
  610. // s4_f = pMatrix321->d[0][0];
  611. // s8_f = pMatrix321->d[2][0];
  612. // s2_f = pMatrix321->d[1][0] * s2_f;
  613. // s2_f += s4_f * s10_f;
  614. // s2_f += s8_f * s6_f;
  615. // pVertex2[r9_i].us_C = s2_f;
  616. // s2_f = pVertNorTex3[r9_i].us_A;
  617. // s10_f = pVertNorTex3[r9_i].us_8;
  618. // s6_f = pVertNorTex3[r9_i].us_C;
  619. // s4_f = pMatrix321->d[0][1];
  620. // s8_f = pMatrix321->d[2][1];
  621. // s2_f = pMatrix321->d[1][1] * s2_f;
  622. // s2_f += s4_f * s10_f;
  623. // s2_f += s8_f * s6_f;
  624. // pVertex2[r9_i].us_E = s2_f;
  625. // s2_f = pVertNorTex3[r9_i].us_A;
  626. // s10_f = pVertNorTex3[r9_i].us_8;
  627. // s6_f = pVertNorTex3[r9_i].us_C;
  628. // s4_f = pMatrix321->d[0][2];
  629. // s8_f = pMatrix321->d[2][2];
  630. // s2_f = pMatrix321->d[1][2] * s2_f;
  631. // s2_f += s4_f * s10_f;
  632. // s2_f += s8_f * s6_f;
  633. // pVertex2[r9_i].us_10 = s2_f;
  634. // }
  635. if (pTUV5) {
  636. // 00213A90
  637. pVertex2[r9_i].us_14 = pTUV5[r9_i].x * 32767.0f;
  638. pVertex2[r9_i].us_16 = pTUV5[r9_i].y * 32767.0f;
  639. } else {
  640. if (typeid(T) == typeid(VertBone)) {
  641. pVertex2[r9_i].us_14 = pT3[r9_i + 1].us_10;
  642. pVertex2[r9_i].us_16 = pT3[r9_i + 1].us_12;
  643. } else {
  644. pVertex2[r9_i].us_14 = pT3[r9_i].us_10;
  645. pVertex2[r9_i].us_16 = pT3[r9_i].us_12;
  646. }
  647. // }else if(typeid(T) == typeid(VertNorTex)){
  648. // //loc_215AF0
  649. // pVertex2[r9_i].us_14 = pT3[r9_i].us_10;
  650. // pVertex2[r9_i].us_16 = pT3[r9_i].us_12;
  651. // }
  652. }
  653. }
  654. }
  655. }
  656. void testProcessRigidVertsBumpCount() {
  657. CFTTMatrix32 a1;
  658. CFTTMatrix32 a2;
  659. TFTTBatchVertexBump a3;
  660. VertBone a4;
  661. TUV a6;
  662. VertNorTexTanBone a4_1;
  663. VertNorTex a4_2;
  664. TFTTBatchVertex a3_1;
  665. VertNorTexTan a4_3;
  666. ProcessRigidVertsCount(&a1, &a2, &a3_1, &a4_3, 5, &a6);
  667. ProcessRigidVertsCount(&a1, &a2, &a3_1, &a4_2, 5, &a6);
  668. ProcessRigidVertsBumpCount(&a1, &a2, &a3, &a4, 5, &a6);
  669. ProcessRigidVertsBumpCount(&a1, &a2, &a3, &a4_1, 5, &a6);
  670. }
  671. // // 00213594
  672. // //乱写的
  673. // void ProcessRigidVertsBumpCount(
  674. // uint ui_r0_arg, CFTTMatrix32 const *p_cfttmatrix32_r1_arg,
  675. // CFTTMatrix32 const *p_cfttmatrix32_r2_arg,
  676. // TFTTBatchVertexBump *p_tfttbatchvertexbump_r3_arg, void const *p_v_arg_0,
  677. // uint ui_arg_4, TUV const *p_tuv_arg_8) {
  678. // float tmp = ui_r0_arg + p_cfttmatrix32_r1_arg->d[0][0] +
  679. // p_cfttmatrix32_r2_arg->d[0][0] +
  680. // p_tfttbatchvertexbump_r3_arg->un_0 + ((int)p_v_arg_0) +
  681. // ui_arg_4 + p_tuv_arg_8->x;
  682. // LOGI("ProcessRigidVertsBumpCount %f", tmp);
  683. // }
  684. //-------------------------------------------------------------------------------------------------
  685. // 0020F240 //^_- 经过单元测试,功能正常
  686. // 0020F2B6 指令顺序不同
  687. // 0020F2DE 指令顺序不同
  688. // CFTTBatchModelManager::CFTTBatchModelManager(int d_r1_arg, bool b_r2_arg,
  689. // int d_r3_arg,
  690. // unsigned int ud_arg_0,
  691. // bool b_arg_4, bool b_arg_8)
  692. // : cfttbmmmatrixcache_0(b_arg_8, 0x200, 0) {}
  693. //-------------------------------------------------------------------------------------------------
  694. // 0020F378 //^_^
  695. CFTTBatchModelManager::~CFTTBatchModelManager() {}
  696. //-------------------------------------------------------------------------------------------------
  697. // 0020F414 //^_^
  698. bool CFTTBatchModelManager::PerformFlushOnFull() { return false; }
  699. //-------------------------------------------------------------------------------------------------
  700. // 0020F450 //^_^
  701. void CFTTBatchModelManager::End() { LOGE("End%x", this); }
  702. //-------------------------------------------------------------------------------------------------
  703. // 0020F480 //^_^
  704. void CFTTBatchModelManager::Begin() { LOGE("Begin%x", this); }
  705. //-------------------------------------------------------------------------------------------------
  706. // 0020F4EC //^_-
  707. //单元测试等级: 目测游戏表现
  708. //单元测试内容: 启动游戏到第2关(包括第2关)
  709. //单元测试结果: 正常
  710. //已测试分支:
  711. // 0020F524
  712. // 0020F558
  713. void CFTTBatchModelManager::FlushThreaded() {}
  714. //-------------------------------------------------------------------------------------------------
  715. // 0020F5B4 //^_^
  716. void CFTTBatchModelManager::Flush(int i_r1_arg, bool b_r2_arg, bool b_r3_arg) {}
  717. //-------------------------------------------------------------------------------------------------
  718. // 0020F670 //^_^
  719. void CFTTBatchModelManager::ResetCache(bool b_r1_arg) {
  720. LOGE("%x", this);
  721. LOGE("%x", b_r1_arg);
  722. }
  723. //-------------------------------------------------------------------------------------------------
  724. // 0020F68C //^_^
  725. void CFTTBatchModelManager::SetMatrix(
  726. CFTTMatrix32 const &p_cfttmatrix32_r1_arg) {}
  727. //-------------------------------------------------------------------------------------------------
  728. // 0020F694 //^_-
  729. //单元测试等级: 目测游戏表现
  730. //单元测试内容: 启动游戏到第2关(包括第2关)
  731. //单元测试结果: 正常
  732. //已测试分支:
  733. // 0020F6D0
  734. // 0020F6FA
  735. // 0020F726
  736. // 0020F72E
  737. // 0020F79E
  738. // 0020F6BC
  739. // 0020F6C6
  740. // 0020F7E4
  741. int CFTTBatchModelManager::AddModelVerts(
  742. int i_r1_arg, CFTTModel *p_cfttmodel_r2_arg, int i_r3_arg,
  743. CFTTMatrix32 const *p_cfttmatrix32_arg_0, TUV *p_tuv_arg_4,
  744. TFTTCacheLookup tfttcachelookup_arg_8, callback_1 callback_arg_10,
  745. CFTTMatrix32 const *p_cfttmatrix32_arg_14) {
  746. return 0;
  747. }
  748. //-------------------------------------------------------------------------------------------------
  749. // 0020F8E4 //^_-
  750. //单元测试等级: 目测游戏表现
  751. //单元测试内容: 启动游戏到第2关(包括第2关)
  752. //单元测试结果: 正常
  753. //已测试分支:
  754. // 0020F944
  755. // 0020F97C
  756. // 0020F994
  757. // 0020F9B6
  758. // 0020F91E
  759. // 0020FA14
  760. // 0020FA24
  761. // 0020FA00
  762. // 0020FA04
  763. void CFTTBatchModelManager::SkinVertsBoned(
  764. CFTTModel *p_cfttmodel_r1_arg, int i_r2_arg, float *p_f_r3_arg,
  765. void *p_v_arg_0, CFTTMatrix32 const *p_cfttmatrix32_arg_4,
  766. CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_8,
  767. CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_10,
  768. TUV *p_tuv_arg_18, TFTTCacheLookup tfttcachelookup_arg_1c,
  769. callback_1 callback_1_arg_24) {}
  770. //-------------------------------------------------------------------------------------------------
  771. // 0020FA32 //^_^
  772. void CFTTBatchModelManager::CopyVerts(
  773. CFTTModel *p_cfttmodel_r1_arg, int i_r2_arg, float *p_f_r3_arg,
  774. void *p_v_arg_0, CFTTMatrix32 const *p_cfttmatrix32_arg_4,
  775. CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_8,
  776. CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_10,
  777. TUV *p_tuv_arg_18, TFTTCacheLookup tfttcachelookup_arg_1c,
  778. callback_1 callback_1_arg_24) {}
  779. //-------------------------------------------------------------------------------------------------
  780. // 0020FAD8 //^_-
  781. //单元测试等级: 目测游戏表现
  782. //单元测试内容: 启动游戏到第2关(包括第2关)
  783. //单元测试结果: 正常
  784. //已测试分支:
  785. // 0020FB00
  786. // 0020FB0A
  787. // 0020FB3C
  788. // 0020FB4E
  789. // 0020FB60
  790. // 0020FCB6
  791. // 0020FCC0
  792. // 0020FCCE
  793. // 0020FCD4
  794. // 0020FCD8
  795. // 0020FB76
  796. // 0020FB80
  797. // 0020FBCC
  798. // 0020FBA2
  799. // 0020FBD8
  800. // 0020FB20
  801. void CFTTBatchModelManager::AddModel(
  802. CFTTModel *p_cfttmodel_r1_arg, CFTTMatrix32 const *p_cfttmatrix32_r2_arg,
  803. TUV *p_tuv_r3_arg, TFTTCacheInstance tfttcacheinstance_arg_0, int i_arg_4,
  804. int i_arg_8, callback_1 callback_arg_c,
  805. CFTTMatrix32 const *p_cfttmatrix32_arg_10) {
  806. LOGE(" CFTTBatchModelManager::AddModel%p%p%p%p%x%x%p%p",p_cfttmodel_r1_arg,p_cfttmatrix32_r2_arg,p_tuv_r3_arg,
  807. tfttcacheinstance_arg_0,i_arg_4,i_arg_8,callback_arg_c,p_cfttmatrix32_arg_10);
  808. // __android_log_print(ANDROID_LOG_INFO, "sh_log",
  809. // "CFTTBatchModelManager::AddModel end");
  810. }
  811. //-------------------------------------------------------------------------------------------------
  812. // 0020FD4A //^_-
  813. //单元测试等级: 目测游戏表现
  814. //单元测试内容: 启动游戏到第2关(包括第2关)
  815. //单元测试结果: 正常
  816. //已测试分支:
  817. // 0020FD6A
  818. // 0020FD76
  819. // 0020FD8A
  820. // 0020FD90
  821. // 0020FD9C
  822. // 0020FDA4
  823. // 0020FDD6
  824. void CFTTBatchModelManager::AddModelX(
  825. CFTTModel *p_cfttmodel_r1_arg, int i_r2_arg,
  826. CFTTMatrix32 const *p_cfttmatrix32_r3_arg, TUV *p_tuv_arg_0,
  827. callback_1 callback_1_arg_4, CFTTMatrix32 const *p_cfttmatrix32_arg_8) {}
  828. //-------------------------------------------------------------------------------------------------
  829. // 0020FE74
  830. void CFTTBatchModelManager::SkinVertsBlend(
  831. CFTTModel *, int, float *, void *, CFTTMatrix32 const *,
  832. CFTTBMMMatrixCache::StartCount, CFTTBMMMatrixCache::StartCount, TUV *,
  833. TFTTCacheLookup, void (*)(void *, CFTTModel *, int, CFTTMatrix32 const *)) {
  834. }
  835. //-------------------------------------------------------------------------------------------------
  836. // 0020FE76
  837. void CFTTBatchModelManager::SkinVerts(
  838. CFTTModel *, int, float *, void *, CFTTMatrix32 const *,
  839. CFTTBMMMatrixCache::StartCount, CFTTBMMMatrixCache::StartCount, TUV *,
  840. TFTTCacheLookup, void (*)(void *, CFTTModel *, int, CFTTMatrix32 const *)) {
  841. }
  842. //-------------------------------------------------------------------------------------------------
  843. // 0020FE6E //^_^
  844. void CFTTBatchModelManager::SetFlushOnFullCB(
  845. pFlushOnFullCBCallBack pFlushOnFullCBCallBack_r1, void *p_v_r2) {
  846. this->field_D4 = pFlushOnFullCBCallBack_r1;
  847. this->field_D8 = p_v_r2;
  848. }
  849. //-------------------------------------------------------------------------------------------------
  850. // 0020F494 经过单元测试,功能正常
  851. //^_^-
  852. // 0020F4D8处我的代码只取了一次this->field_70,而原始代码取了两次
  853. CFTTBatchModelBin *CFTTBatchModelManager::AddBin(
  854. CFTTBatchModelBin *p_cfttbatchmodelbin_r1_arg, int d_r2_arg, uint ud_r3_arg,
  855. int d_arg_0, // shader mat id
  856. int d_arg_4, bool b_arg_8, bool b_arg_c) {
  857. return 0;
  858. }
  859. //-------------------------------------------------------------------------------------------------
  860. //目前还没有实现给dword_5C9840.field_4、dword_5C9840.field_8等字段赋值的函数
  861. //接上,编译器优化会导致这些字段没了,所以自己写一个函数防止编译器优化
  862. void TestUseBy_dword_5C9840() {
  863. printf("%p", &dword_5C9840.field_0);
  864. printf("%p", &dword_5C9840.field_4);
  865. printf("%p", &dword_5C9840.field_8);
  866. printf("%p", &dword_5C9840.field_c);
  867. // printf("%p", &dword_5C9840.useby_dword_5c9840_sub_14[0].p_cfttjobqueue_0);
  868. }
  869. //-------------------------------------------------------------------------------------------------
  870. // 0020F1EC //^_^
  871. void CFTTBatchModelManager::InitialiseCodePath() {}
  872. //-------------------------------------------------------------------------------------------------