CFTTConvex.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #include "CFTTConvex.h"
  2. #include "CFTTPlane32.h"
  3. #include "Matrix.h"
  4. #include "XSYS.h"
  5. //-------------------------------------------------------------------------------------------------
  6. //001C1380 //^_^
  7. CFTTConvex::CFTTConvex() {
  8. }
  9. //-------------------------------------------------------------------------------------------------
  10. //001C1394 //^_^
  11. CFTTConvex::CFTTConvex(TFTTVertex *p_r1, TFTTEdge *p_r2, TFTTFace *p_r3, uchar uc_arg_0, uchar uc_arg_4, uchar uc_arg_8) {
  12. }
  13. //-------------------------------------------------------------------------------------------------
  14. //001C13B8 //^_^
  15. CFTTConvex::~CFTTConvex() {
  16. }
  17. //-------------------------------------------------------------------------------------------------
  18. //001C0418 //^_^
  19. void CFTTConvex::Set(TFTTVertex *p_r1_arg, TFTTEdge *p_r2_arg, TFTTFace *p_r3, uchar uc_arg0, uchar uc_arg4, uchar uc_arg8) {
  20. }
  21. //-------------------------------------------------------------------------------------------------
  22. //001C0488
  23. //???问题:常量赋值
  24. void CFTTConvex::Split(CFTTPlane32 const &plane_r1_arg, CFTTConvex *&p_convex_r2_arg) {
  25. return;
  26. }
  27. //-------------------------------------------------------------------------------------------------
  28. //001C0734 //^_^
  29. void CFTTConvex::SetTetraBuffer(TFTTTetrahedron *p_r1_arg, uchar uc_r2_arg) {
  30. }
  31. //-------------------------------------------------------------------------------------------------
  32. //001C0B24
  33. //???汇编指令完全相同,寄存器不同
  34. float CFTTConvex::GetVolume(bool b_r1_arg) {
  35. return 0;
  36. }
  37. //-------------------------------------------------------------------------------------------------
  38. //001C0B60
  39. //static函数
  40. uint CFTTConvex::Split(CFTTPlane32 const &plane32_r1_arg, CFTTConvex *&p_convex_r2_arg, CFTTConvex *&p_convex_r3_arg) {
  41. return 0;
  42. }
  43. //-------------------------------------------------------------------------------------------------
  44. //001C0BA4
  45. uchar CFTTConvex::GetNumTetras() {
  46. return 0;
  47. }
  48. //-------------------------------------------------------------------------------------------------
  49. //001C0BAC
  50. CFTTVector32 CFTTConvex::GenerateRandomTetra() {
  51. CFTTVector32 ret;
  52. return ret;
  53. }
  54. //-------------------------------------------------------------------------------------------------
  55. //001C0D00
  56. void CFTTConvex::SetTriangleBuffer(TFTTTriangle *, uchar) {
  57. }
  58. //-------------------------------------------------------------------------------------------------
  59. //001C0D10
  60. void CFTTConvex::GenerateTriangles() {
  61. }
  62. //-------------------------------------------------------------------------------------------------
  63. //001C107C
  64. void CFTTConvex::ProjectTriangles(CFTTVector32) {
  65. }
  66. //-------------------------------------------------------------------------------------------------
  67. //001C11EC
  68. float CFTTConvex::GetArea(bool) {
  69. return 0;
  70. }
  71. //-------------------------------------------------------------------------------------------------
  72. //001C122C
  73. CFTTVector32 CFTTConvex::GenerateRandomTri(CFTTVector32) {
  74. CFTTVector32 ret;
  75. return ret;
  76. }
  77. //-------------------------------------------------------------------------------------------------
  78. //001C13F8
  79. //???问题:优化了*(float*)((int)this->list_TFTTVertex_field_0 + i_r4,两次变一次
  80. int CFTTConvex::GetSplitType(CFTTPlane32 const &plane_r1) {
  81. return 0;
  82. }
  83. //-------------------------------------------------------------------------------------------------
  84. //001C148C
  85. void CFTTConvex::FlipDistances() {
  86. int a = 0;
  87. }
  88. //-------------------------------------------------------------------------------------------------
  89. //001C14B0
  90. void CFTTConvex::Clip() {
  91. }
  92. //-------------------------------------------------------------------------------------------------
  93. //001C14CE
  94. void CFTTConvex::Clone(CFTTConvex const &) {
  95. int a = 0;
  96. }
  97. //-------------------------------------------------------------------------------------------------
  98. //001C154C
  99. void CFTTConvex::ProcessVertices() {
  100. }
  101. //-------------------------------------------------------------------------------------------------
  102. //001C15BC
  103. void CFTTConvex::ProcessEdges() {
  104. }
  105. //-------------------------------------------------------------------------------------------------
  106. //001C16D8
  107. void CFTTConvex::ProcessFaces() {
  108. }
  109. //-------------------------------------------------------------------------------------------------
  110. //001C17FC
  111. void CFTTConvex::Cleanup() {
  112. }
  113. //-------------------------------------------------------------------------------------------------
  114. //001C1A28
  115. bool CFTTConvex::GetOpenPolyline(TFTTFace const &, uchar &, uchar &) {
  116. return 0;
  117. }
  118. //-------------------------------------------------------------------------------------------------
  119. // 001C0740 //^_-
  120. //测试到第10关,OK
  121. void CFTTConvex::GenerateTetrahedra() {
  122. uint iFaceCount_R12 = 0;
  123. // 001C074E
  124. for (uint8 i_R3 = 0; i_R3 < field_86; i_R3++) { // 001C0756
  125. TFTTFace* pFace_i_r10 = list_TFTTFace_field_8 + i_R3;
  126. iFaceCount_R12 += (pFace_i_r10->field_8 + 0xFE);
  127. pFace_i_r10->field_0[0] = list_TFTTEdge_field_4[pFace_i_r10->field_4[0]].field_1;
  128. list_TFTTEdge_field_4[pFace_i_r10->field_4[0]].field_8 = 0;
  129. // 001C0760
  130. for (int j_R5 = 1; pFace_i_r10->field_8 > j_R5; j_R5++) { // 001C079C
  131. int iIndex_e_j = pFace_i_r10->field_4[j_R5];
  132. TFTTEdge* pEdge_index_j = list_TFTTEdge_field_4 + iIndex_e_j;
  133. pEdge_index_j->field_8 = 1;
  134. } // 001C07BE
  135. uint8 iCount_R0 = 0;
  136. // 001C07C2
  137. for (int j_R5 = 0; pFace_i_r10->field_8 > j_R5; j_R5++) { // 001C07D0
  138. int iIndex_e_j = pFace_i_r10->field_4[j_R5];
  139. TFTTEdge* pEdge_index_j_r6 = list_TFTTEdge_field_4 + iIndex_e_j;
  140. // 001C07E8
  141. if (pEdge_index_j_r6->field_8) { // 001C07EC
  142. float f_R12 = pEdge_index_j_r6->field_0;
  143. float f_R7 = pEdge_index_j_r6->field_1;
  144. // 001C07FA
  145. if (f_R12 == pFace_i_r10->field_0[iCount_R0]) { // 001C07FE
  146. iCount_R0++;
  147. pFace_i_r10->field_0[iCount_R0] = f_R7;
  148. pEdge_index_j_r6->field_8 = 0;
  149. j_R5 = 0;
  150. } // 001C0812
  151. // 001C0802
  152. else if (f_R7 == pFace_i_r10->field_0[iCount_R0]) { // 001C0806
  153. iCount_R0++;
  154. pFace_i_r10->field_0[iCount_R0] = f_R12;
  155. pEdge_index_j_r6->field_8 = 0;
  156. j_R5 = 0;
  157. } // 001C0812
  158. // 001C0818
  159. if (pFace_i_r10->field_8 - 1 == iCount_R0) {
  160. break;
  161. }
  162. } // 001C07C8
  163. } // 001C081C
  164. } // 001C082E
  165. // 此处for判断 原版 ++ BCC跳入
  166. // loc_1C0840
  167. // LDRB.W R3, [R8,#0x85]
  168. // CMP R0, R3
  169. // BCC loc_1C0836
  170. // 新编译成了 -- BNE跳入
  171. // CMP R1, #0
  172. // BNE loc_BBAFC
  173. // 001C082E
  174. for (uint8 i_R0 = 0; i_R0 < field_85; i_R0++) { // 001C0836
  175. list_TFTTEdge_field_4[i_R0].field_8 = 1;
  176. } // 001C0848
  177. // 此处for判断 原版 ++ BCC跳入
  178. // loc_1C085A
  179. // LDRB.W R3, [R8,#0x84]
  180. // CMP R2, R3
  181. // BCC loc_1C0850
  182. // 新编译成了 -- BNE跳入
  183. // CMP R1, #0
  184. // BNE loc_BBB1E
  185. // 001C084C
  186. for (uint8 i_R2 = 0; i_R2 < field_84; i_R2++) { // 001C0850
  187. list_TFTTVertex_field_0[i_R2].field_10 = 0;
  188. } // 001C0862
  189. uint8 iTetraCount_R6 = 0;
  190. // 此处for判断 原版 ++ BCC跳入
  191. // loc_1C0964
  192. // LDRB.W R0, [R8,#0x86]
  193. // CMP R1, R0
  194. // BCC.W loc_1C086C
  195. // 新编译成了 -- BNE跳入
  196. // CMP R2, R4
  197. // BNE loc_BBB2A
  198. // 001C0862
  199. for (uint8 i_R1 = 0; i_R1 < field_86; i_R1++) { // 001C086C
  200. TFTTFace* pFace_i = list_TFTTFace_field_8 + i_R1;
  201. uint8 iIndex_R4 = 0;
  202. uint8 iMax_R0 = pFace_i->field_0[0];
  203. // 001C0880
  204. for (uint8 j_R1 = 0; pFace_i->field_8 > j_R1; j_R1++) { // 001C088A
  205. // 001C0890
  206. if (pFace_i->field_0[j_R1] < iMax_R0) { // 001C0894
  207. iIndex_R4 = j_R1;
  208. iMax_R0 = pFace_i->field_0[j_R1];
  209. } // 001C0898
  210. } // 001C08A0
  211. uint8 iMod0 = (iIndex_R4 + 1) % pFace_i->field_8;
  212. // 001C08BA
  213. for (uint8 j_R10 = 0; pFace_i->field_8 - 2 > j_R10; j_R10++) { // 001C08C0
  214. TFTTTetrahedron* pTetra_n = list_TFTTTetrahedron_field_7C + iTetraCount_R6;
  215. pTetra_n->field_30 = pFace_i->field_0[iIndex_R4];
  216. pTetra_n->field_31 = pFace_i->field_0[iMod0];
  217. uint8 iMod1 = (iIndex_R4 + 2 + j_R10) % pFace_i->field_8;
  218. pTetra_n->field_32 = pFace_i->field_0[iMod1];
  219. list_TFTTVertex_field_0[pFace_i->field_0[iIndex_R4]].field_10++;
  220. list_TFTTVertex_field_0[pFace_i->field_0[iMod0]].field_10++;
  221. list_TFTTVertex_field_0[pFace_i->field_0[iMod1]].field_10++;
  222. iTetraCount_R6++;
  223. } // 001C095C
  224. } // 001C096E
  225. uint8 iTetraCount_R1 = 0;
  226. // 001C0976
  227. for (uint8 i_R3 = 0; i_R3 < iFaceCount_R12; i_R3++) { // 001C097A
  228. TFTTTetrahedron* pTetra_i = list_TFTTTetrahedron_field_7C + i_R3;
  229. // 001C098A && 001C0992 && 001C0998
  230. if (pTetra_i->field_30 != 0 && pTetra_i->field_31 != 0 && pTetra_i->field_32 != 0) { // 001C099A
  231. TFTTTetrahedron* pTetra_n = list_TFTTTetrahedron_field_7C + iTetraCount_R1;
  232. pTetra_n->field_30 = pTetra_i->field_30;
  233. pTetra_n->field_31 = pTetra_i->field_31;
  234. pTetra_n->field_32 = pTetra_i->field_32;
  235. pTetra_n->field_33 = i_R3;
  236. iTetraCount_R1++;
  237. } // 001C09BA
  238. } // 001C09C2
  239. // float f_S16 = 6.0;
  240. field_87 = iTetraCount_R1;
  241. field_8C = 0;
  242. // 001C09CC
  243. for (uint8 i_R7 = 0; i_R7 < field_87; i_R7++) { // 001C09DC
  244. TFTTTetrahedron* pTetra_i = list_TFTTTetrahedron_field_7C + i_R7;
  245. TFTTVertex* pVertex0_R0 = list_TFTTVertex_field_0 + pTetra_i->field_30;
  246. TFTTVertex* pVertex1_R3 = list_TFTTVertex_field_0 + pTetra_i->field_31;
  247. TFTTVertex* pVertex2_R3 = list_TFTTVertex_field_0 + pTetra_i->field_32;
  248. TFTTVertex* pVertex3_R1 = list_TFTTVertex_field_0 + pTetra_i->field_33;
  249. pTetra_i->vec32_0.float_0 = pVertex1_R3->vector_0.float_0 - pVertex0_R0->vector_0.float_0;
  250. pTetra_i->vec32_0.float_4 = pVertex1_R3->vector_0.float_4 - pVertex0_R0->vector_0.float_4;
  251. pTetra_i->vec32_0.float_8 = pVertex1_R3->vector_0.float_8 - pVertex0_R0->vector_0.float_8;
  252. pTetra_i->vec32_C.float_0 = pVertex2_R3->vector_0.float_0 - pVertex0_R0->vector_0.float_0;
  253. pTetra_i->vec32_C.float_4 = pVertex2_R3->vector_0.float_4 - pVertex0_R0->vector_0.float_4;
  254. pTetra_i->vec32_C.float_8 = pVertex2_R3->vector_0.float_8 - pVertex0_R0->vector_0.float_8;
  255. pTetra_i->vec32_18.float_0 = pVertex3_R1->vector_0.float_0 - pVertex0_R0->vector_0.float_0;
  256. pTetra_i->vec32_18.float_0 = pVertex3_R1->vector_0.float_4 - pVertex0_R0->vector_0.float_4;
  257. pTetra_i->vec32_18.float_0 = pVertex3_R1->vector_0.float_8 - pVertex0_R0->vector_0.float_8;
  258. pTetra_i->vec32_24.float_0 = pVertex0_R0->vector_0.float_0;
  259. pTetra_i->vec32_24.float_4 = pVertex0_R0->vector_0.float_4;
  260. pTetra_i->vec32_24.float_8 = pVertex0_R0->vector_0.float_8;
  261. // memcpy(&pTetra_i->vec32_24, &pVertex0_R0, 0x0C);
  262. CFTTVector32 vertor_var3C = CrossProduct(pTetra_i->vec32_C, pTetra_i->vec32_18);
  263. float fAll = pTetra_i->vec32_0.float_0 * vertor_var3C.float_0 +
  264. pTetra_i->vec32_0.float_4 * vertor_var3C.float_4 +
  265. pTetra_i->vec32_0.float_8 * vertor_var3C.float_8;
  266. fAll = fabs(fAll);
  267. fAll = fAll * 6.0;
  268. pTetra_i->field_34 = fAll;
  269. field_8C += pTetra_i->field_34;
  270. } // 001C0B18
  271. }