123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- #include "CFTTConvex.h"
- #include "CFTTPlane32.h"
- #include "Matrix.h"
- #include "XSYS.h"
- //-------------------------------------------------------------------------------------------------
- //001C1380 //^_^
- CFTTConvex::CFTTConvex() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C1394 //^_^
- CFTTConvex::CFTTConvex(TFTTVertex *p_r1, TFTTEdge *p_r2, TFTTFace *p_r3, uchar uc_arg_0, uchar uc_arg_4, uchar uc_arg_8) {
- }
- //-------------------------------------------------------------------------------------------------
- //001C13B8 //^_^
- CFTTConvex::~CFTTConvex() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C0418 //^_^
- void CFTTConvex::Set(TFTTVertex *p_r1_arg, TFTTEdge *p_r2_arg, TFTTFace *p_r3, uchar uc_arg0, uchar uc_arg4, uchar uc_arg8) {
- }
- //-------------------------------------------------------------------------------------------------
- //001C0488
- //???问题:常量赋值
- void CFTTConvex::Split(CFTTPlane32 const &plane_r1_arg, CFTTConvex *&p_convex_r2_arg) {
- return;
- }
- //-------------------------------------------------------------------------------------------------
- //001C0734 //^_^
- void CFTTConvex::SetTetraBuffer(TFTTTetrahedron *p_r1_arg, uchar uc_r2_arg) {
- }
- //-------------------------------------------------------------------------------------------------
- //001C0B24
- //???汇编指令完全相同,寄存器不同
- float CFTTConvex::GetVolume(bool b_r1_arg) {
- return 0;
- }
- //-------------------------------------------------------------------------------------------------
- //001C0B60
- //static函数
- uint CFTTConvex::Split(CFTTPlane32 const &plane32_r1_arg, CFTTConvex *&p_convex_r2_arg, CFTTConvex *&p_convex_r3_arg) {
- return 0;
- }
- //-------------------------------------------------------------------------------------------------
- //001C0BA4
- uchar CFTTConvex::GetNumTetras() {
- return 0;
- }
- //-------------------------------------------------------------------------------------------------
- //001C0BAC
- CFTTVector32 CFTTConvex::GenerateRandomTetra() {
- CFTTVector32 ret;
- return ret;
- }
- //-------------------------------------------------------------------------------------------------
- //001C0D00
- void CFTTConvex::SetTriangleBuffer(TFTTTriangle *, uchar) {
- }
- //-------------------------------------------------------------------------------------------------
- //001C0D10
- void CFTTConvex::GenerateTriangles() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C107C
- void CFTTConvex::ProjectTriangles(CFTTVector32) {
- }
- //-------------------------------------------------------------------------------------------------
- //001C11EC
- float CFTTConvex::GetArea(bool) {
- return 0;
- }
- //-------------------------------------------------------------------------------------------------
- //001C122C
- CFTTVector32 CFTTConvex::GenerateRandomTri(CFTTVector32) {
- CFTTVector32 ret;
- return ret;
- }
- //-------------------------------------------------------------------------------------------------
- //001C13F8
- //???问题:优化了*(float*)((int)this->list_TFTTVertex_field_0 + i_r4,两次变一次
- int CFTTConvex::GetSplitType(CFTTPlane32 const &plane_r1) {
- return 0;
- }
- //-------------------------------------------------------------------------------------------------
- //001C148C
- void CFTTConvex::FlipDistances() {
- int a = 0;
- }
- //-------------------------------------------------------------------------------------------------
- //001C14B0
- void CFTTConvex::Clip() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C14CE
- void CFTTConvex::Clone(CFTTConvex const &) {
- int a = 0;
- }
- //-------------------------------------------------------------------------------------------------
- //001C154C
- void CFTTConvex::ProcessVertices() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C15BC
- void CFTTConvex::ProcessEdges() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C16D8
- void CFTTConvex::ProcessFaces() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C17FC
- void CFTTConvex::Cleanup() {
- }
- //-------------------------------------------------------------------------------------------------
- //001C1A28
- 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
- }
|