|
@@ -115,4 +115,185 @@ void CFTTConvex::Cleanup() {
|
|
|
bool CFTTConvex::GetOpenPolyline(TFTTFace const &, uchar &, uchar &) {
|
|
|
return 0;
|
|
|
}
|
|
|
-//-------------------------------------------------------------------------------------------------
|
|
|
+//-------------------------------------------------------------------------------------------------
|
|
|
+// 001C0740 //^_-
|
|
|
+//测试到第10关,OK
|
|
|
+void CFTTConvex::GenerateTetrahedra() {
|
|
|
+ uint iFaceCount_R12 = 0;
|
|
|
+
|
|
|
+ // 001C074E
|
|
|
+ for (uint8 i_R3 = 0; i_R3 < field_86; i_R3++) { // 001C0756
|
|
|
+
|
|
|
+ TFTTFace* pFace_i_r10 = list_TFTTFace_field_8 + i_R3;
|
|
|
+
|
|
|
+ iFaceCount_R12 += (pFace_i_r10->field_8 + 0xFE);
|
|
|
+
|
|
|
+ pFace_i_r10->field_0[0] = list_TFTTEdge_field_4[pFace_i_r10->field_4[0]].field_1;
|
|
|
+ list_TFTTEdge_field_4[pFace_i_r10->field_4[0]].field_8 = 0;
|
|
|
+
|
|
|
+ // 001C0760
|
|
|
+ for (int j_R5 = 1; pFace_i_r10->field_8 > j_R5; j_R5++) { // 001C079C
|
|
|
+ int iIndex_e_j = pFace_i_r10->field_4[j_R5];
|
|
|
+ TFTTEdge* pEdge_index_j = list_TFTTEdge_field_4 + iIndex_e_j;
|
|
|
+ pEdge_index_j->field_8 = 1;
|
|
|
+ } // 001C07BE
|
|
|
+
|
|
|
+ uint8 iCount_R0 = 0;
|
|
|
+ // 001C07C2
|
|
|
+ for (int j_R5 = 0; pFace_i_r10->field_8 > j_R5; j_R5++) { // 001C07D0
|
|
|
+ int iIndex_e_j = pFace_i_r10->field_4[j_R5];
|
|
|
+ TFTTEdge* pEdge_index_j_r6 = list_TFTTEdge_field_4 + iIndex_e_j;
|
|
|
+
|
|
|
+ // 001C07E8
|
|
|
+ if (pEdge_index_j_r6->field_8) { // 001C07EC
|
|
|
+ float f_R12 = pEdge_index_j_r6->field_0;
|
|
|
+ float f_R7 = pEdge_index_j_r6->field_1;
|
|
|
+ // 001C07FA
|
|
|
+ if (f_R12 == pFace_i_r10->field_0[iCount_R0]) { // 001C07FE
|
|
|
+ iCount_R0++;
|
|
|
+ pFace_i_r10->field_0[iCount_R0] = f_R7;
|
|
|
+ pEdge_index_j_r6->field_8 = 0;
|
|
|
+ j_R5 = 0;
|
|
|
+ } // 001C0812
|
|
|
+ // 001C0802
|
|
|
+ else if (f_R7 == pFace_i_r10->field_0[iCount_R0]) { // 001C0806
|
|
|
+ iCount_R0++;
|
|
|
+ pFace_i_r10->field_0[iCount_R0] = f_R12;
|
|
|
+ pEdge_index_j_r6->field_8 = 0;
|
|
|
+ j_R5 = 0;
|
|
|
+ } // 001C0812
|
|
|
+
|
|
|
+ // 001C0818
|
|
|
+ if (pFace_i_r10->field_8 - 1 == iCount_R0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } // 001C07C8
|
|
|
+ } // 001C081C
|
|
|
+ } // 001C082E
|
|
|
+
|
|
|
+ // 此处for判断 原版 ++ BCC跳入
|
|
|
+ // loc_1C0840
|
|
|
+ // LDRB.W R3, [R8,#0x85]
|
|
|
+ // CMP R0, R3
|
|
|
+ // BCC loc_1C0836
|
|
|
+ // 新编译成了 -- BNE跳入
|
|
|
+ // CMP R1, #0
|
|
|
+ // BNE loc_BBAFC
|
|
|
+ // 001C082E
|
|
|
+ for (uint8 i_R0 = 0; i_R0 < field_85; i_R0++) { // 001C0836
|
|
|
+ list_TFTTEdge_field_4[i_R0].field_8 = 1;
|
|
|
+ } // 001C0848
|
|
|
+
|
|
|
+ // 此处for判断 原版 ++ BCC跳入
|
|
|
+ // loc_1C085A
|
|
|
+ // LDRB.W R3, [R8,#0x84]
|
|
|
+ // CMP R2, R3
|
|
|
+ // BCC loc_1C0850
|
|
|
+ // 新编译成了 -- BNE跳入
|
|
|
+ // CMP R1, #0
|
|
|
+ // BNE loc_BBB1E
|
|
|
+ // 001C084C
|
|
|
+ for (uint8 i_R2 = 0; i_R2 < field_84; i_R2++) { // 001C0850
|
|
|
+ list_TFTTVertex_field_0[i_R2].field_10 = 0;
|
|
|
+ } // 001C0862
|
|
|
+
|
|
|
+ uint8 iTetraCount_R6 = 0;
|
|
|
+ // 此处for判断 原版 ++ BCC跳入
|
|
|
+ // loc_1C0964
|
|
|
+ // LDRB.W R0, [R8,#0x86]
|
|
|
+ // CMP R1, R0
|
|
|
+ // BCC.W loc_1C086C
|
|
|
+ // 新编译成了 -- BNE跳入
|
|
|
+ // CMP R2, R4
|
|
|
+ // BNE loc_BBB2A
|
|
|
+ // 001C0862
|
|
|
+ for (uint8 i_R1 = 0; i_R1 < field_86; i_R1++) { // 001C086C
|
|
|
+ TFTTFace* pFace_i = list_TFTTFace_field_8 + i_R1;
|
|
|
+ uint8 iIndex_R4 = 0;
|
|
|
+ uint8 iMax_R0 = pFace_i->field_0[0];
|
|
|
+
|
|
|
+ // 001C0880
|
|
|
+ for (uint8 j_R1 = 0; pFace_i->field_8 > j_R1; j_R1++) { // 001C088A
|
|
|
+ // 001C0890
|
|
|
+ if (pFace_i->field_0[j_R1] < iMax_R0) { // 001C0894
|
|
|
+ iIndex_R4 = j_R1;
|
|
|
+ iMax_R0 = pFace_i->field_0[j_R1];
|
|
|
+ } // 001C0898
|
|
|
+ } // 001C08A0
|
|
|
+
|
|
|
+ uint8 iMod0 = (iIndex_R4 + 1) % pFace_i->field_8;
|
|
|
+ // 001C08BA
|
|
|
+ for (uint8 j_R10 = 0; pFace_i->field_8 - 2 > j_R10; j_R10++) { // 001C08C0
|
|
|
+ TFTTTetrahedron* pTetra_n = list_TFTTTetrahedron_field_7C + iTetraCount_R6;
|
|
|
+ pTetra_n->field_30 = pFace_i->field_0[iIndex_R4];
|
|
|
+ pTetra_n->field_31 = pFace_i->field_0[iMod0];
|
|
|
+
|
|
|
+ uint8 iMod1 = (iIndex_R4 + 2 + j_R10) % pFace_i->field_8;
|
|
|
+ pTetra_n->field_32 = pFace_i->field_0[iMod1];
|
|
|
+
|
|
|
+ list_TFTTVertex_field_0[pFace_i->field_0[iIndex_R4]].field_10++;
|
|
|
+ list_TFTTVertex_field_0[pFace_i->field_0[iMod0]].field_10++;
|
|
|
+ list_TFTTVertex_field_0[pFace_i->field_0[iMod1]].field_10++;
|
|
|
+
|
|
|
+ iTetraCount_R6++;
|
|
|
+ } // 001C095C
|
|
|
+ } // 001C096E
|
|
|
+
|
|
|
+ uint8 iTetraCount_R1 = 0;
|
|
|
+ // 001C0976
|
|
|
+ for (uint8 i_R3 = 0; i_R3 < iFaceCount_R12; i_R3++) { // 001C097A
|
|
|
+ TFTTTetrahedron* pTetra_i = list_TFTTTetrahedron_field_7C + i_R3;
|
|
|
+ // 001C098A && 001C0992 && 001C0998
|
|
|
+ if (pTetra_i->field_30 != 0 && pTetra_i->field_31 != 0 && pTetra_i->field_32 != 0) { // 001C099A
|
|
|
+ TFTTTetrahedron* pTetra_n = list_TFTTTetrahedron_field_7C + iTetraCount_R1;
|
|
|
+ pTetra_n->field_30 = pTetra_i->field_30;
|
|
|
+ pTetra_n->field_31 = pTetra_i->field_31;
|
|
|
+ pTetra_n->field_32 = pTetra_i->field_32;
|
|
|
+ pTetra_n->field_33 = i_R3;
|
|
|
+ iTetraCount_R1++;
|
|
|
+ } // 001C09BA
|
|
|
+
|
|
|
+ } // 001C09C2
|
|
|
+
|
|
|
+ // float f_S16 = 6.0;
|
|
|
+
|
|
|
+ field_87 = iTetraCount_R1;
|
|
|
+ field_8C = 0;
|
|
|
+
|
|
|
+ // 001C09CC
|
|
|
+ for (uint8 i_R7 = 0; i_R7 < field_87; i_R7++) { // 001C09DC
|
|
|
+ TFTTTetrahedron* pTetra_i = list_TFTTTetrahedron_field_7C + i_R7;
|
|
|
+
|
|
|
+ TFTTVertex* pVertex0_R0 = list_TFTTVertex_field_0 + pTetra_i->field_30;
|
|
|
+ TFTTVertex* pVertex1_R3 = list_TFTTVertex_field_0 + pTetra_i->field_31;
|
|
|
+ TFTTVertex* pVertex2_R3 = list_TFTTVertex_field_0 + pTetra_i->field_32;
|
|
|
+ TFTTVertex* pVertex3_R1 = list_TFTTVertex_field_0 + pTetra_i->field_33;
|
|
|
+
|
|
|
+ pTetra_i->vec32_0.float_0 = pVertex1_R3->vector_0.float_0 - pVertex0_R0->vector_0.float_0;
|
|
|
+ pTetra_i->vec32_0.float_4 = pVertex1_R3->vector_0.float_4 - pVertex0_R0->vector_0.float_4;
|
|
|
+ pTetra_i->vec32_0.float_8 = pVertex1_R3->vector_0.float_8 - pVertex0_R0->vector_0.float_8;
|
|
|
+
|
|
|
+ pTetra_i->vec32_C.float_0 = pVertex2_R3->vector_0.float_0 - pVertex0_R0->vector_0.float_0;
|
|
|
+ pTetra_i->vec32_C.float_4 = pVertex2_R3->vector_0.float_4 - pVertex0_R0->vector_0.float_4;
|
|
|
+ pTetra_i->vec32_C.float_8 = pVertex2_R3->vector_0.float_8 - pVertex0_R0->vector_0.float_8;
|
|
|
+
|
|
|
+ pTetra_i->vec32_18.float_0 = pVertex3_R1->vector_0.float_0 - pVertex0_R0->vector_0.float_0;
|
|
|
+ pTetra_i->vec32_18.float_0 = pVertex3_R1->vector_0.float_4 - pVertex0_R0->vector_0.float_4;
|
|
|
+ pTetra_i->vec32_18.float_0 = pVertex3_R1->vector_0.float_8 - pVertex0_R0->vector_0.float_8;
|
|
|
+
|
|
|
+ pTetra_i->vec32_24.float_0 = pVertex0_R0->vector_0.float_0;
|
|
|
+ pTetra_i->vec32_24.float_4 = pVertex0_R0->vector_0.float_4;
|
|
|
+ pTetra_i->vec32_24.float_8 = pVertex0_R0->vector_0.float_8;
|
|
|
+ // memcpy(&pTetra_i->vec32_24, &pVertex0_R0, 0x0C);
|
|
|
+ CFTTVector32 vertor_var3C = CrossProduct(pTetra_i->vec32_C, pTetra_i->vec32_18);
|
|
|
+
|
|
|
+ float fAll = pTetra_i->vec32_0.float_0 * vertor_var3C.float_0 +
|
|
|
+ pTetra_i->vec32_0.float_4 * vertor_var3C.float_4 +
|
|
|
+ pTetra_i->vec32_0.float_8 * vertor_var3C.float_8;
|
|
|
+ fAll = fabs(fAll);
|
|
|
+ fAll = fAll * 6.0;
|
|
|
+ pTetra_i->field_34 = fAll;
|
|
|
+
|
|
|
+ field_8C += pTetra_i->field_34;
|
|
|
+ } // 001C0B18
|
|
|
+}
|