PlatformMesh.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. #include "PlatformMesh.h"
  2. #include "FTTUPtr.h"
  3. #include "CFTTRenderHelper.h"
  4. #include "CFTTShaderBuiltInConstants.h"
  5. #include "CFTTMaterialManager.h"
  6. static float g_f309C50[6] = {1.0, 1.0, 1.0, 0.0, 0.0, 0.0};
  7. //---------------------------------------------------------------------------------------------------------------------------------------------
  8. //0021B304 //^_^
  9. //单元测试等级: 游戏运行正常
  10. //单元测试内容: 1-5关
  11. //单元测试结果: 正常
  12. void PlatformMesh_Free(CFTTPlatformMesh *r0_pmesh) {
  13. r0_pmesh->pCFTTRenderHelper_94=NULL;
  14. //loc_21B32A
  15. for(int r5_i=0;r5_i<r0_pmesh->count_40;r5_i++){
  16. // /loc_21B31C
  17. FTT_pMtlL->ReleaseMaterial(r0_pmesh->uOPData_44.list_model[r5_i].tStr12_2.us_materialIndex_0);
  18. }
  19. delete[] ((char*)r0_pmesh);
  20. }
  21. //---------------------------------------------------------------------------------------------------------------------------------------------
  22. //0021B340 //^_^
  23. void PlatformMesh_PerMeshSetup(CFTTPlatformMesh const *pPlatformMesh1, CFTTVector32x4 const *pFTTVector32x42, CFTTVector32x4 const *pFTTVector32x43) {
  24. }
  25. //---------------------------------------------------------------------------------------------------------------------------------------------
  26. //0021b370 ^_^
  27. void PlatformMesh_Render(CFTTPlatformMesh* r0_pPlatformMesh1, int r1_i, unsigned short r2_us, unsigned int r3_u, unsigned int sp10_u)
  28. {
  29. CFTTModel_struct_14* r12_list_model = r0_pPlatformMesh1->uOPData_44.list_model;
  30. if (r2_us ==0xFFFF )
  31. r2_us = r12_list_model[r1_i].tStr12_2.us_materialIndex_0;
  32. if (r3_u == 0xFFFFFFFF)
  33. r3_u = r12_list_model[r1_i].tStr12_2.field_6;
  34. if (sp10_u == 0xFFFFFFFF)
  35. sp10_u = r12_list_model[r1_i].tStr12_2.field_2 *3;
  36. return ((CFTTRenderHelper*)r0_pPlatformMesh1->pCFTTRenderHelper_94.pType_0)->Render( &CFTTShaderBuiltInConstants::ms_matWorld, r2_us, r3_u,sp10_u);
  37. }
  38. //---------------------------------------------------------------------------------------------------------------------------------------------
  39. //0021b3c8 ^_^
  40. void PlatformMesh_PerMeshRestore(CFTTPlatformMesh const *pMesh) {
  41. }
  42. //---------------------------------------------------------------------------------------------------------------------------------------------
  43. //0021B3F0 //^_^
  44. void PlatformMesh_CreateVolatileResources(CFTTPlatformMesh *p_cfttplatformesh_r0_arg, bool b_r1_arg) {
  45. }
  46. //---------------------------------------------------------------------------------------------------------------------------------------------
  47. //0021B44A
  48. void PlatformMesh_DeleteVolatileResources(CFTTPlatformMesh *, bool) {
  49. }
  50. //---------------------------------------------------------------------------------------------------------------------------------------------
  51. //0021B452
  52. void PlatformMesh_CreateManagedResources(CFTTPlatformMesh *, bool) {
  53. // empty
  54. }
  55. //---------------------------------------------------------------------------------------------------------------------------------------------
  56. //0021B454
  57. void PlatformMesh_DeleteManagedResources(CFTTPlatformMesh *, bool) {
  58. // empty
  59. }
  60. //---------------------------------------------------------------------------------------------------------------------------------------------
  61. //0021B456 //^_^
  62. void PlatformMesh_SetVerts(CFTTPlatformMesh *p_cfttplatformesh_r0) {
  63. }
  64. //---------------------------------------------------------------------------------------------------------------------------------------------
  65. //0021b478 ^_^
  66. void PlatformMesh_SetIndices(CFTTPlatformMesh *pPlatformMesh1) {
  67. }
  68. //---------------------------------------------------------------------------------------------------------------------------------------------
  69. //0x0021b488 ^_- 测试8关无异常
  70. /**
  71. * 它将 CFTTPlatformMesh 转换为 TFTTModel
  72. *
  73. * @param pfTTPlatformMesh1 指向 CFTTPlatformMesh 结构的指针
  74. * @param pfTTModel2 指向要创建的模型的指针
  75. * @param eMeshModelFlags3 0x1 = 顶点数据,0x2 = 法线,0x4 = 纹理坐标,0x8 = 颜色,0x10 = 骨骼索引,0x20 = 骨骼权重,0x40 =
  76. * 骨骼索引和权重
  77. *
  78. * @return 指向 TTFTModel 的指针。
  79. */
  80. void PlatformMesh_ToModel(CFTTPlatformMesh* pfTTPlatformMesh1, TFTTModel* pfTTModel2, EMeshModelFlags eMeshModelFlags3)
  81. {
  82. //LOGE("PlatformMesh_ToModel ");
  83. //0021B488
  84. TFTTVertexDescriptor* pTFTTVertexDescriptor_r6 = pfTTPlatformMesh1->uOPData_3C.pTFTTVertexDescriptor;
  85. FTTGetFVFFromDescriptor(pTFTTVertexDescriptor_r6);
  86. pfTTModel2->field_12 = 0;
  87. //!!!!!!注意这里的除法 field_58 定义需要改为short
  88. int sp4 = pfTTPlatformMesh1->field_30 / (short)pfTTPlatformMesh1->field_58;
  89. pfTTModel2->dCount_C = sp4;
  90. void* pr12 = pfTTModel2 + 1;
  91. pfTTModel2->us_10 = pfTTPlatformMesh1->count_40;
  92. if (eMeshModelFlags3 & 1)
  93. {
  94. pfTTModel2->u_28.pfTTModel = (TFTTModel*)pr12;
  95. pfTTModel2->u_34.pdat = (ushort*)((int)pr12 + pfTTModel2->us_10 * 12);
  96. unsigned int u_r12 = (3 + pfTTModel2->us_10 * 2) & 0x3FFFC;
  97. char b_r7 = 0;
  98. unsigned int u_r3 = 0;
  99. //goto loc_21B4F4;
  100. //loc_21B4E4
  101. while (pfTTModel2->us_10 > b_r7)
  102. {
  103. CFTTModel_struct_14* p_list_model2_r1 = pfTTPlatformMesh1->uOPData_44.list_model;
  104. u_r3 = p_list_model2_r1[b_r7].tStr12_2.field_2 + u_r3;
  105. b_r7++;
  106. }
  107. unsigned int p_r0 = (int)pfTTModel2->u_34.pdat + u_r12;
  108. pfTTModel2->field_E = u_r3;
  109. pfTTModel2->u_24.index = p_r0;
  110. unsigned int sp10 = (3 + u_r3 * 6) & 0xFFFFFFFC;
  111. unsigned char b_r10 = 0;
  112. unsigned int u_r9 = 0;
  113. //loc_21B57A:
  114. while (b_r10 < pfTTModel2->us_10)
  115. {
  116. //21B522
  117. CFTTModel_struct_14* plistMode_r2 = pfTTPlatformMesh1->uOPData_44.list_model;
  118. unsigned short us_r7 = plistMode_r2[b_r10].field_0;
  119. TFTTModel_struct_C_1* pTFTTModel_struct_C_1_r8 = &pfTTModel2->u_28.list_C[b_r10];//r8
  120. pTFTTModel_struct_C_1_r8->field_8 = us_r7;
  121. pTFTTModel_struct_C_1_r8->field_4 = 0;
  122. int ir2 = plistMode_r2[b_r10].tStr12_2.field_2;
  123. pTFTTModel_struct_C_1_r8->field_0 = 0;
  124. pTFTTModel_struct_C_1_r8->field_6 = ir2;
  125. int i_r1 = plistMode_r2[b_r10].tStr12_2.field_6;
  126. unsigned short* pus_r0 = pfTTModel2->u_24.pusbuf;
  127. unsigned u_r2 = ((unsigned short)ir2)*6;
  128. ushort* pus_r3 = pfTTPlatformMesh1->uOPData_34.pusData;
  129. memcpy((void*) & pus_r0[u_r9], (void*)&pus_r3[i_r1], u_r2 );
  130. unsigned u_r1 = pTFTTModel_struct_C_1_r8->field_6;
  131. b_r10++;
  132. u_r1 *= 3;
  133. u_r9 += u_r1;
  134. }
  135. pr12 = (void*)((int)p_r0 + sp10);
  136. //loc_21B5B0:
  137. unsigned char b_lr = 0;
  138. unsigned short* pus_r1;
  139. while (b_lr < pfTTModel2->us_10)
  140. {
  141. //loc_21B596
  142. CFTTModel_struct_14* pCFTTModel_struct_14_r3 = pfTTPlatformMesh1->uOPData_44.list_model;
  143. pus_r1 = pfTTModel2->u_34.pdat;
  144. pfTTModel2->u_34.pdat[b_lr] = pCFTTModel_struct_14_r3[b_lr].tStr12_2.us_materialIndex_0;
  145. b_lr++;
  146. }
  147. }
  148. //loc_21B5BE:
  149. unsigned int u_lr = eMeshModelFlags3 & 2;
  150. if (u_lr)
  151. {
  152. pfTTModel2->u_1C.pusbuf = (ushort*)pr12;
  153. pr12 = (void*)((int)pr12 + 12 * sp4);
  154. }
  155. unsigned int sp8 = eMeshModelFlags3 & 4; //r1
  156. float f_s0 = 32767.0;
  157. if (sp8)
  158. {
  159. pfTTModel2->u_20.pusbuf =(ushort*)pr12;
  160. pr12 = (void*)((int)pr12 + 12 * sp4);
  161. }
  162. float f_s2 = 65535.0;
  163. unsigned sp14 = eMeshModelFlags3 & 8;
  164. float f_s4 = 0.0;
  165. if (sp14)
  166. {
  167. pfTTModel2->u_30.pusbuf = (ushort*)pr12;
  168. pr12 = (void*)((int)pr12 + 12 * sp4);
  169. }
  170. unsigned sp10 = eMeshModelFlags3 & 0x20;
  171. if (sp10)
  172. {
  173. pfTTModel2->u_38.pusbuf = (ushort*)pr12;
  174. pr12 = (void*)((int)pr12 + 4 * sp4);
  175. }
  176. unsigned sp18 = eMeshModelFlags3 & 0x40;
  177. if (sp18)
  178. {
  179. unsigned int u_r1 = (int)pr12 + 2 * sp4;
  180. pfTTModel2->pmodel_struct_C_2_40 = (TFTTModel_struct_C_2*)u_r1;
  181. pfTTModel2->pmodel_struct_C_3_3C =(TFTTModel_struct_C_3*) pr12;
  182. pr12 = (void*)((int)u_r1 + 16 * sp4);
  183. }
  184. unsigned int u_r2 = eMeshModelFlags3 & 0x10;
  185. unsigned int spC = u_r2;
  186. if (spC)
  187. pfTTModel2->u_2C.index = (int)pr12;
  188. //loc_21BA12:
  189. //LOGE("PlatformMesh_ToModel while b ");
  190. while (pTFTTVertexDescriptor_r6->field_0 != -1)
  191. {
  192. //loc_21B638:
  193. unsigned int u_r8 = 0;
  194. unsigned int u_r9 = 0;
  195. unsigned int u_r10 = 0;
  196. unsigned int u_r11 = 0;
  197. //goto loc_21BA0A;
  198. //loc_21BA0A:
  199. for (; u_r11 != sp4; u_r11++)
  200. {
  201. unsigned int* p_r12 = (unsigned int*)(pfTTPlatformMesh1->field_58 * u_r11
  202. + pfTTPlatformMesh1->uOPData_2C.pData + pTFTTVertexDescriptor_r6->field_C);
  203. switch (pTFTTVertexDescriptor_r6->field_4)
  204. {
  205. case 0:
  206. {
  207. // LOGE("PlatformMesh_ToModel switch 0 ");
  208. //loc_21B67C:
  209. if (u_lr)
  210. {
  211. if (pTFTTVertexDescriptor_r6->field_0 == 2)
  212. {
  213. //LOGE("PlatformMesh_ToModel switch 0 2 ");
  214. ((int*)(pfTTModel2->u_1C.pmodel_union_struct_2[u_r11].pfbuf))[0] = p_r12[0];
  215. ((int*)(pfTTModel2->u_1C.pmodel_union_struct_2[u_r11].pfbuf))[1] = p_r12[1];
  216. ((int*)(pfTTModel2->u_1C.pmodel_union_struct_2[u_r11].pfbuf))[2] = p_r12[2];
  217. }
  218. //loc_21B6B2
  219. if (pTFTTVertexDescriptor_r6->field_0 == 0x1A)
  220. {
  221. //LOGE("PlatformMesh_ToModel switch 0 1a ");
  222. int icount_r7 = 0;
  223. pfTTModel2->u_1C.pmodel_union_struct_2[u_r11].pfbuf[0] = (float)(((short*)p_r12)[0]) / (float)32767.0;
  224. pfTTModel2->u_1C.pmodel_union_struct_2[u_r11].pfbuf[1] = (float)(((short*)p_r12)[1]) / (float)32767.0;
  225. pfTTModel2->u_1C.pmodel_union_struct_2[u_r11].pfbuf[2] = (float)(((short*)p_r12)[2]) / (float)32767.0;
  226. //LOGE("PlatformMesh_ToModel switch 0 1a while begin ");
  227. //loc_21B72C
  228. while (icount_r7 != 0x3)
  229. {
  230. //loc_21B70E
  231. pfTTModel2->u_1C.pmodel_union_struct_2[u_r8].pfbuf[icount_r7] =
  232. pfTTPlatformMesh1->pfloat_array_68[icount_r7]
  233. + pfTTPlatformMesh1->pfloat_array_5C[icount_r7]*
  234. pfTTModel2->u_1C.pmodel_union_struct_2[u_r8].pfbuf[icount_r7];
  235. icount_r7++;
  236. }
  237. // LOGE("PlatformMesh_ToModel switch 0 1a end ");
  238. }
  239. }
  240. break;
  241. }
  242. case 1:
  243. {
  244. // LOGE("PlatformMesh_ToModel switch 1 ");
  245. if (sp18)
  246. {
  247. pfTTModel2->pmodel_struct_C_2_40[u_r11].pfloatArray[0] = (float)(((unsigned short*)p_r12)[0]) / (float)65535.0;
  248. pfTTModel2->pmodel_struct_C_2_40[u_r11].pfloatArray[1] = (float)(((unsigned short*)p_r12)[1]) / (float)65535.0;
  249. pfTTModel2->pmodel_struct_C_2_40[u_r11].pfloatArray[2] = (float)(((unsigned short*)p_r12)[2]) / (float)65535.0;
  250. pfTTModel2->pmodel_struct_C_2_40[u_r11].pfloatArray[3] = (float)(((unsigned short*)p_r12)[3]) / (float)65535.0;
  251. int icount_r2 = 0;
  252. float f_s6 = 0.0;
  253. //loc_21B7C8
  254. while (icount_r2 != 4)
  255. {
  256. //loc_21B7BC
  257. f_s6 += pfTTModel2->pmodel_struct_C_2_40[u_r10].pfloatArray[icount_r2++];
  258. }
  259. int icount_r7 = 0;
  260. //loc_21B7E4
  261. while (icount_r7 != 2)
  262. {
  263. //loc_21B7D0
  264. pfTTModel2->pmodel_struct_C_2_40[u_r9].pfloatArray[icount_r7] = pfTTModel2->pmodel_struct_C_2_40[u_r9].pfloatArray[icount_r7] / f_s6;
  265. icount_r7++;
  266. }
  267. }
  268. break;
  269. }
  270. case 2:
  271. {
  272. // LOGE("PlatformMesh_ToModel switch 2 ");
  273. //loc_21B880
  274. if (sp18!=0)
  275. {
  276. pfTTModel2->pmodel_struct_C_3_3C[u_r11].field_0 = ((char*)p_r12)[0];
  277. pfTTModel2->pmodel_struct_C_3_3C[u_r11].field_1 = ((char*)p_r12)[1];
  278. }
  279. break;
  280. }
  281. case 3:
  282. {
  283. // LOGE("PlatformMesh_ToModel switch 3 ");
  284. //loc_21B8A2
  285. if (sp8)
  286. {
  287. if (pTFTTVertexDescriptor_r6->field_0 == 2)
  288. {
  289. pfTTModel2->u_20.pmodel_union_struct_2[u_r11].pfbuf[0] = ((float*)p_r12)[0];
  290. pfTTModel2->u_20.pmodel_union_struct_2[u_r11].pfbuf[1] = ((float*)p_r12)[1];
  291. pfTTModel2->u_20.pmodel_union_struct_2[u_r11].pfbuf[2] = ((float*)p_r12)[2];
  292. }
  293. //loc_21B8D6
  294. if (pTFTTVertexDescriptor_r6->field_0 == 0x1A)
  295. {
  296. pfTTModel2->u_20.pmodel_union_struct_2[u_r11].pfbuf[0] = (float)(((short*)p_r12)[0]) / (float)32767.0;
  297. pfTTModel2->u_20.pmodel_union_struct_2[u_r11].pfbuf[1] = (float)(((short*)p_r12)[1]) / (float)32767.0;
  298. pfTTModel2->u_20.pmodel_union_struct_2[u_r11].pfbuf[2] = (float)(((short*)p_r12)[2]) / (float)32767.0;
  299. }
  300. }
  301. break;
  302. }
  303. case 5:
  304. {
  305. // LOGE("PlatformMesh_ToModel switch 5 ");
  306. //loc_21B930
  307. if (spC)
  308. {
  309. int i_r7 = sp4;
  310. if (pTFTTVertexDescriptor_r6->field_8 != 1)
  311. i_r7 = 0;
  312. if (pTFTTVertexDescriptor_r6->field_0 == 1)
  313. {
  314. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[0] = p_r12[0];
  315. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[1] = p_r12[1];
  316. }
  317. //loc_21B968
  318. if (pTFTTVertexDescriptor_r6->field_0 == 0x19)
  319. {
  320. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[0]=(float)(((short*)p_r12)[0]) / (float) 32767.0;
  321. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[1]= (float)(((short*)p_r12)[1]) / (float)32767.0;
  322. CFTTVector32x4* pfttVector32x4 = &pfTTPlatformMesh1->pfTTVector32x4_74;
  323. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[0] =
  324. pfttVector32x4[pTFTTVertexDescriptor_r6->field_8].my[2] +
  325. pfttVector32x4[pTFTTVertexDescriptor_r6->field_8].my[0] *
  326. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[0];
  327. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[1] =
  328. pfttVector32x4[pTFTTVertexDescriptor_r6->field_8].my[3] +
  329. pfttVector32x4[pTFTTVertexDescriptor_r6->field_8].my[1] *
  330. pfTTModel2->u_2C.pmodel_union_struct_3[i_r7 + u_r11].pfbuf[1];
  331. }
  332. }
  333. break;
  334. }
  335. case 6:
  336. {
  337. //LOGE("PlatformMesh_ToModel switch 6 ");
  338. //loc_21B7EA
  339. if (sp14)
  340. {
  341. if (pTFTTVertexDescriptor_r6->field_0 == 2)
  342. {
  343. pfTTModel2->u_30.pmodel_union_struct_2[u_r11].pfbuf[0] = ((float*)p_r12)[0];
  344. pfTTModel2->u_30.pmodel_union_struct_2[u_r11].pfbuf[1] = ((float*)p_r12)[1];
  345. pfTTModel2->u_30.pmodel_union_struct_2[u_r11].pfbuf[2] = ((float*)p_r12)[2];
  346. }
  347. //loc_21B820
  348. if (pTFTTVertexDescriptor_r6->field_0 == 0x1A)
  349. {
  350. pfTTModel2->u_30.pmodel_union_struct_2[u_r11].pfbuf[0] = (float)(((short*)p_r12)[0]) / 32767.0;
  351. pfTTModel2->u_30.pmodel_union_struct_2[u_r11].pfbuf[1] = (float)(((short*)p_r12)[1]) / 32767.0;
  352. pfTTModel2->u_30.pmodel_union_struct_2[u_r11].pfbuf[2] = (float)(((short*)p_r12)[2]) / 32767.0;
  353. }
  354. }
  355. break;
  356. }
  357. case 10:
  358. {
  359. // LOGE("PlatformMesh_ToModel switch 10 ");
  360. if (sp10)
  361. pfTTModel2->u_38.pibuf[u_r11] = p_r12[0];
  362. break;
  363. }
  364. default:
  365. break;
  366. }
  367. //def_21B662
  368. u_r8 += 1;
  369. u_r9 +=1;
  370. u_r10 += 1;//
  371. }
  372. pTFTTVertexDescriptor_r6++;
  373. }
  374. //LOGE("PlatformMesh_ToModel memcpy ");
  375. memcpy((void*)&pfTTModel2->float32x2_t_54, (void*)&pfTTPlatformMesh1->tPlatformModel_0.tfloat32x2_24, sizeof(float32x2_t));
  376. memcpy((void*)&pfTTModel2->float32x2_t_44, (void*)&pfTTPlatformMesh1->tPlatformModel_0.tfloat32x2_14, sizeof(float32x2_t)*2);
  377. //LOGE("PlatformMesh_ToModel memcpy end ");
  378. return;
  379. }
  380. //---------------------------------------------------------------------------------------------------------------------------------------------
  381. //0021BA38
  382. void PlatformMesh_FromModel(CFTTPlatformMesh *, CFTTPlatformMesh *, TFTTModel *, EMeshModelFlags) {
  383. }
  384. //---------------------------------------------------------------------------------------------------------------------------------------------
  385. /*
  386. 0021B304 PlatformMesh_Free
  387. 0021BA38 PlatformMesh_FromModel
  388. 0021B44A PlatformMesh_DeleteVolatileResources
  389. */