Ver código fonte

0x001715ec,CPlayer::GetBonePositionbugfix

DESKTOP-AB9OQPJ\RED-10 3 anos atrás
pai
commit
5e87d23589
3 arquivos alterados com 256 adições e 2 exclusões
  1. 1 0
      jni/CAnimManager.cpp
  2. 182 1
      jni/CFTTConvex.cpp
  3. 73 1
      jni/CPlayer.cpp

+ 1 - 0
jni/CAnimManager.cpp

@@ -122,6 +122,7 @@ void CAnimManager::GetAnimID(uint) {
 //-------------------------------------------------------------------------------------------------
 //00156B14 ^_-(模块测试通过,MD5输出一致)
 void CAnimManager::GetBonePositionAnim(short *a1, int a2, int a3, int a4, int a5, int a6) {
+  LOGE("GetBonePositionAnim%p%x%x%x%x%x",a1,a2,a3,a4,a5,a6);
 }
 //-------------------------------------------------------------------------------------------------
 //00156D30

+ 182 - 1
jni/CFTTConvex.cpp

@@ -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
+}

+ 73 - 1
jni/CPlayer.cpp

@@ -765,8 +765,80 @@ void CPlayer::GetActionPoint(TPoint3D *pPoint3D1) {
 }
 //-------------------------------------------------------------------------------------------------
 // 001715EC 经过单元测试,功能正常
+// 001715EC 经过单元测试,功能正常
 void CPlayer::GetBonePosition(int i1, TPoint3D *pPoint3D2) {
-   LOGI("CPlayer::GetBonePosition %p %p%x", this, pPoint3D2,i1);
+  short aShort_1E_sp12[3];
+  CAnimManager::GetBonePositionAnim(aShort_1E_sp12, tStr32_44.field_10, tStr32_44.field_14, i1, s_80, tStr32_44.s_30);
+
+  // 00171616
+  if (tStr32_44.sBlend_2E) {
+    // 0017161A
+    short aShort_24_spC[3];
+    CAnimManager::GetBonePositionAnim(aShort_24_spC, tStr32_44.field_20, tStr32_44.field_24, i1, tStr32_44.s_2A, tStr32_44.s_30);
+
+    // 00171632
+    short r0_s;
+    short r1_s;
+    // 0017164C
+    if (CAnimManager::s_tAnimData[tStr32_44.field_10].us_1C != tStr32_44.s_2C) {
+      // 00171650
+      int r0_i =  CAnimManager::s_tAnimData[tStr32_44.field_10].us_1C-tStr32_44.s_2C ;
+
+      int r7_i = xsin(-r0_i);
+      r0_i = xcos(-r0_i);
+
+      int r3_i = r0_i * aShort_24_spC[0];
+      int r1_i = aShort_24_spC[0] * r7_i;
+      r3_i -= r7_i * aShort_24_spC[1];  // 0017166E   MLS.W 3, R7, R2, R3
+      r0_i = (r0_i * aShort_24_spC[1]) + r1_i;
+
+      r1_s = r3_i / 0x4000;
+      r0_s = r0_i / 0x4000;
+
+      aShort_24_spC[0] = r1_s;
+      aShort_24_spC[1] = r0_s;
+    } else {
+      // loc_171690
+      r0_s = aShort_24_spC[1];
+      r1_s = aShort_24_spC[0];
+    }
+    // loc_171698
+
+    int r4_i = 0x2000 - tStr32_44.sBlend_2E;
+    int r3_i = aShort_1E_sp12[0] * r4_i;  // 001716B0   MULS            R3, R4
+
+    int r1_i = (r1_s * tStr32_44.sBlend_2E) + r3_i;  // 001716B2   SMLABB.W        R1, R1, R2, R3
+    r3_i = r4_i * aShort_1E_sp12[2];                                  // 001716B6   MUL.W           R3, R4, R6
+
+    // int r7_i = aShort_1E_sp12[1] * r4_i;
+    int r0_i = (r0_s * tStr32_44.sBlend_2E) + (aShort_1E_sp12[1] * r4_i);
+    int r2_i = (aShort_24_spC[2] * tStr32_44.sBlend_2E) + r3_i;
+
+    aShort_1E_sp12[0] = r1_i / 8192;
+    aShort_1E_sp12[1] = r0_i / 8192;
+    aShort_1E_sp12[2] = r2_i / 8192;
+  }
+
+  // loc_1716EC
+  int r6_i = (4096 - u_0.s_2_0.s_2) & 0x3FFF;
+  int r7_i = xsin(r6_i);
+  int r0_i = xcos(r6_i);
+
+  r6_i = r0_i * aShort_1E_sp12[0];
+  int r1_i = aShort_1E_sp12[0] * r7_i;
+  r7_i = r6_i - (r7_i * aShort_1E_sp12[1]);  // 00171716
+
+  r0_i = (r0_i * aShort_1E_sp12[1]) + r1_i;  // 0017171C
+
+  int r2_i = (r7_i / 0x4000) * us_122;
+  r0_i = (r0_i / 0x4000) * us_122;
+
+  // 0017173A
+  r1_i = us_122 * aShort_1E_sp12[2];
+
+  pPoint3D2->point_0.dx_0 = ballPosPrev_4.point_0.dx_0 + ((381 * (r2_i / -32))) / 1024;
+  pPoint3D2->point_0.dy_4 = ballPosPrev_4.point_0.dy_4 + ((381 * (r0_i / 32))) / 1024;
+  pPoint3D2->dz_8 = ballPosPrev_4.dz_8 + (381 * (r1_i / 32)) / 1024;
 }
 //-------------------------------------------------------------------------------------------------
 // 00171798