#include "CFTTBatchModelManager.h" #include #include "CFTTBatchModelBin.h" #include "CFTTDevice.h" #include "CFTTGraphicsDevice.h" #include "CFTTJobQueue.h" #include "CFTTMaterialManager.h" #include "CFTTMatrix32.h" #include "CFTTShaderBuiltInConstants.h" #include "CFTTSkinningTask.h" #include "TFTTCacheLookup.h" #include "global_func.h" #include "memctrl.h" CFTTBatchModelManager *GFXPLAYER_pBatch = nullptr; struct UseBy_dword_5C9840_Sub { CFTTJobQueue *p_cfttjobqueue_0; CFTTBatchModelManager *field_4; CFTTSkinningTask *field_8; int field_c; int field_10; }; struct UseBy_dword_5C9840 { int field_0; int field_4; int field_8; int field_c; int field_10; UseBy_dword_5C9840_Sub useby_dword_5c9840_sub_14[4]; }; MYSTATIC UseBy_dword_5C9840 dword_5C9840; MYSTATIC CFTTSkinningTask cfttskinningtask_5AA834[1024]; // 0020FEFC //乱写的 MYSTATIC void sub_20FEFC(CFTTJob *p_cfttjob_r0_arg, void *p_v_r1_arg) {} //乱写的 struct TFTTBatchVertexShadow { int un_0; }; //乱写的 // 0x20 00211460 080   ADDS            R2, #0x20 struct TFTTBatchVertexBump { float f_0;     // 002111DC float f_4;     // 00211224 float f_8;     // 0021126C short us_C;   // 002112BC short us_E;   // 00211302 short us_10;   // 00211348 short us_12;   // 没有看到给这儿赋值的地方 short us_14;   // 00211444 short us_16;   // 0021145E short us_18;   // 0021138E short us_1A;   // 002113D4 short us_1C;   // 0021141A short us_1E;   // 没有看到给这儿赋值的地方,可能仅仅是为了内存对齐 }; // 0x14 00211E24 由此处确定 struct VertBone { short us_0; short us_2; short us_4; short us_6; short us_8; short us_A; short us_C; short us_E; short us_10; short us_12; }; struct VertNorTex { short us_0; short us_2; short us_4; short us_6; short us_8; short us_A; short us_C; short us_E; short us_10; short us_12; }; struct VertNorTexTan : public VertNorTex { short us_14; short us_16; short us_18; ushort us_1A; }; // 0x20 struct VertNorTexBone : public VertBone { // VertBone tVerBone_0; short us_14; short us_16; short us_18; ushort us_1A; uchar uc_1C; // 00210FB2   LDRB.W          R4, [R9,#0x1C] uchar uc_1D; // 0021108A   LDRB.W          R3, [R9,#0x1D] uchar uc_1E; // 00211086   LDRB.W          R5, [R9,#0x1E] uchar uc_1F; // 00210FD6   LDRB.W          R1, [R9,#0x1F] }; // 0x28 00210FA0 由此处确定 struct VertNorTexTanBone : public VertNorTexBone { // VertNorTexBone tVerNorTexBone_0; ushort us_20;   //此处一定是ushort ushort us_22; ushort us_24; ushort us_26; }; // VertNorTexTanBone // template // void ProcessRigidVertsBumpCount(CFTTMatrix32 const *pMatrix320, // CFTTMatrix32 const *pMatrix321, // TFTTBatchVertexBump *pVertexbump2, T const // *pT3, uint ui4, TUV const *pTUV5) { // if (g_bNeonAvailable) { // // loc_2137D0 // while (ui4) { // // loc_213686 // } // return; // } else { // // loc_2137DA // // loc_213AE4 // for(int r9_i=0;r9_i!=ui4;r9_i++) { // // loc_2137F8 // float s2_f = pT3[r9_i].us_2; // float s6_f = pT3[r9_i].us_4; // float s12_f = pT3[r9_i].us_0; // s2_f = pMatrix320->d[1][0] * s2_f; // float s4_f = pMatrix320->d[0][0]; // float s8_f = pMatrix320->d[2][0]; // float s10_f = pMatrix320->d[3][0]; // s2_f += s4_f * s12_f; // s2_f += s8_f * s6_f; // s2_f += s10_f; // pVertexbump2[r9_i].f_0 = s2_f; // s2_f = pT3[r9_i].us_2; // s6_f = pT3[r9_i].us_4; // s4_f = pMatrix320->d[0][1]; // s8_f = pMatrix320->d[2][1]; // s10_f = pMatrix320->d[3][1]; // s2_f = pMatrix320->[1][1] * s2_f; // s2_f += s4_f * s12_f; // s2_f += s8_f * s6_f; // s2_f += s10_f; // pVertexbump2[r9_i].f_4 = s2_f; // // 00213896 // s2_f = pT3[r9_i].us_2; // s6_f = pT3[r9_i].us_4; // s4_f = pMatrix320->d[0][2]; // s8_f = pMatrix320->d[2][2]; // s10_f = pMatrix320->d[3][2]; // s2_f = pMatrix320->[1][2] * s2_f; // s2_f += s4_f * s12_f; // s2_f += s8_f * s6_f; // s2_f += s10_f; // pVertexbump2[r9_i].f_8 = s2_f; // // 002138DE // s2_f = pT3[r9_i].us_A; // s10_f = pT3[r9_i].us_8; // s6_f = pT3[r9_i].us_C; // s4_f = pMatrix321->d[0][0]; // s8_f = pMatrix321->d[2][0]; // s2_f = pMatrix321->d[1][0] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertexbump2[r9_i].us_C = s2_f; // // 00213926 // s2_f = pT3[r9_i].us_A; // s10_f = pT3[r9_i].us_8; // s6_f = pT3[r9_i].us_C; // s4_f = pMatrix321->d[0][1]; // s8_f = pMatrix321->d[2][1]; // s2_f = pMatrix321->d[1][1] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertexbump2[r9_i].us_E = s2_f; // //0021396E // s2_f = pT3[r9_i].us_A; // s10_f = pT3[r9_i].us_8; // s6_f = pT3[r9_i].us_C; // s4_f = pMatrix321->d[0][2]; // s8_f = pMatrix321->d[2][2]; // s2_f = pMatrix321->d[1][2] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertexbump2[r9_i].us_10 = s2_f; // //002139B6 // s2_f = pT3[r9_i].us_16; // s10_f = pT3[r9_i].us_14; // s6_f = pT3[r9_i].us_18; // s4_f = pMatrix321->d[0][0]; // s8_f = pMatrix321->d[2][0]; // s2_f = pMatrix321->d[1][0] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertexbump2[r9_i].us_18 = s2_f; // //002139FE // s2_f = pT3[r9_i].us_16; // s10_f = pT3[r9_i].us_14; // s6_f = pT3[r9_i].us_18; // s4_f = pMatrix321->d[0][1]; // s8_f = pMatrix321->d[2][1]; // s2_f = pMatrix321->d[1][1] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertexbump2[r9_i].us_1A = s2_f; // //00213A46 // s2_f = pT3[r9_i].us_16; // s10_f = pT3[r9_i].us_14; // s6_f = pT3[r9_i].us_18; // s4_f = pMatrix321->d[0][2]; // s8_f = pMatrix321->d[2][2]; // s2_f = pMatrix321->d[1][2] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertexbump2[r9_i].us_1C = s2_f; // if(pTUV5){ // //00213A90 // pVertexbump2[r9_i].us_14= pTUV5[r9_i].x*32767.0f; // pVertexbump2[r9_i].us_16= pTUV5[r9_i].y*32767.0f; // }else{ // //loc_213AB4 // pVertexbump2[r9_i].us_14= pT3[r9_i].us_10; // pVertexbump2[r9_i].us_16= pT3[r9_i].us_12;; // } // } // } // } // VertBone template void ProcessRigidVertsBumpCount(CFTTMatrix32 const *pMatrix320, CFTTMatrix32 const *pMatrix321, TFTTBatchVertexBump *pVertexbump2, T const *pT3, uint ui4, TUV const *pTUV5) { for (int r9_i = 0; r9_i != ui4; r9_i++) { float s2_f = pT3[r9_i].us_2; float s6_f = pT3[r9_i].us_4; float s12_f = pT3[r9_i].us_0; s2_f = pMatrix320->d[1][0] * s2_f; float s4_f = pMatrix320->d[0][0]; float s8_f = pMatrix320->d[2][0]; float s10_f = pMatrix320->d[3][0]; s2_f += s4_f * s12_f; s2_f += s8_f * s6_f; s2_f += s10_f; pVertexbump2[r9_i].f_0 = s2_f; s2_f = pT3[r9_i].us_2; s6_f = pT3[r9_i].us_4; s4_f = pMatrix320->d[0][1]; s8_f = pMatrix320->d[2][1]; s10_f = pMatrix320->d[3][1]; s2_f = pMatrix320->d[1][1] * s2_f; s2_f += s4_f * s12_f; s2_f += s8_f * s6_f; s2_f += s10_f; pVertexbump2[r9_i].f_4 = s2_f; s2_f = pT3[r9_i].us_2; s6_f = pT3[r9_i].us_4; s4_f = pMatrix320->d[0][2]; s8_f = pMatrix320->d[2][2]; s10_f = pMatrix320->d[3][2]; s2_f = pMatrix320->d[1][2] * s2_f; s2_f += s4_f * s12_f; s2_f += s8_f * s6_f; s2_f += s10_f; pVertexbump2[r9_i].f_8 = s2_f; if (sizeof(*pT3) == sizeof(VertBone)) { // 00214B00 s2_f = pT3[r9_i + 1].us_2; s10_f = pT3[r9_i + 1].us_0; s6_f = pT3[r9_i + 1].us_4; s4_f = pMatrix321->d[0][0]; s8_f = pMatrix321->d[2][0]; s2_f = pMatrix321->d[1][0] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_C = s2_f; s2_f = pT3[r9_i + 1].us_2; s10_f = pT3[r9_i + 1].us_0; s6_f = pT3[r9_i + 1].us_4; s4_f = pMatrix321->d[0][1]; s8_f = pMatrix321->d[2][1]; s2_f = pMatrix321->d[1][1] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_E = s2_f; s2_f = pT3[r9_i + 1].us_2; s10_f = pT3[r9_i + 1].us_0; s6_f = pT3[r9_i + 1].us_4; s4_f = pMatrix321->d[0][2]; s8_f = pMatrix321->d[2][2]; s2_f = pMatrix321->d[1][2] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_10 = s2_f; s2_f = pT3[r9_i + 1].us_A; s10_f = pT3[r9_i + 1].us_8; s6_f = pT3[r9_i + 1].us_C; s4_f = pMatrix321->d[0][0]; s8_f = pMatrix321->d[2][0]; s2_f = pMatrix321->d[1][0] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_18 = s2_f; s2_f = pT3[r9_i + 1].us_A; s10_f = pT3[r9_i + 1].us_8; s6_f = pT3[r9_i + 1].us_C; s4_f = pMatrix321->d[0][1]; s8_f = pMatrix321->d[2][1]; s2_f = pMatrix321->d[1][1] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_1A = s2_f; s2_f = pT3[r9_i + 1].us_A; s10_f = pT3[r9_i + 1].us_8; s6_f = pT3[r9_i + 1].us_C; s4_f = pMatrix321->d[0][2]; s8_f = pMatrix321->d[2][2]; s2_f = pMatrix321->d[1][2] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_1C = s2_f; } else if (sizeof(*pT3) == sizeof(VertNorTexTanBone)) { VertNorTexTanBone *pVertNorTexTanBone3 = (VertNorTexTanBone *)pT3; s2_f = pVertNorTexTanBone3[r9_i].us_A; s10_f = pVertNorTexTanBone3[r9_i].us_8; s6_f = pVertNorTexTanBone3[r9_i].us_C; s4_f = pMatrix321->d[0][0]; s8_f = pMatrix321->d[2][0]; s2_f = pMatrix321->d[1][0] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_C = s2_f; // 00213926 s2_f = pVertNorTexTanBone3[r9_i].us_A; s10_f = pVertNorTexTanBone3[r9_i].us_8; s6_f = pVertNorTexTanBone3[r9_i].us_C; s4_f = pMatrix321->d[0][1]; s8_f = pMatrix321->d[2][1]; s2_f = pMatrix321->d[1][1] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_E = s2_f; // 0021396E s2_f = pVertNorTexTanBone3[r9_i].us_A; s10_f = pVertNorTexTanBone3[r9_i].us_8; s6_f = pVertNorTexTanBone3[r9_i].us_C; s4_f = pMatrix321->d[0][2]; s8_f = pMatrix321->d[2][2]; s2_f = pMatrix321->d[1][2] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_10 = s2_f; // 002139B6 s2_f = pVertNorTexTanBone3[r9_i].us_16; s10_f = pVertNorTexTanBone3[r9_i].us_14; s6_f = pVertNorTexTanBone3[r9_i].us_18; s4_f = pMatrix321->d[0][0]; s8_f = pMatrix321->d[2][0]; s2_f = pMatrix321->d[1][0] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_18 = s2_f; // 002139FE s2_f = pVertNorTexTanBone3[r9_i].us_16; s10_f = pVertNorTexTanBone3[r9_i].us_14; s6_f = pVertNorTexTanBone3[r9_i].us_18; s4_f = pMatrix321->d[0][1]; s8_f = pMatrix321->d[2][1]; s2_f = pMatrix321->d[1][1] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_1A = s2_f; // 00213A46 s2_f = pVertNorTexTanBone3[r9_i].us_16; s10_f = pVertNorTexTanBone3[r9_i].us_14; s6_f = pVertNorTexTanBone3[r9_i].us_18; s4_f = pMatrix321->d[0][2]; s8_f = pMatrix321->d[2][2]; s2_f = pMatrix321->d[1][2] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertexbump2[r9_i].us_1C = s2_f; } if (pTUV5) { // 00213A90 pVertexbump2[r9_i].us_14 = pTUV5[r9_i].x * 32767.0f; pVertexbump2[r9_i].us_16 = pTUV5[r9_i].y * 32767.0f; } else { if (sizeof(*pT3) == sizeof(VertBone)) { pVertexbump2[r9_i].us_14 = pT3[r9_i + 1].us_10; pVertexbump2[r9_i].us_16 = pT3[r9_i + 1].us_12; } else if (sizeof(*pT3) == sizeof(VertNorTexTanBone)) { // loc_213AB4 pVertexbump2[r9_i].us_14 = pT3[r9_i].us_10; pVertexbump2[r9_i].us_16 = pT3[r9_i].us_12; } } } } struct TFTTBatchVertex { float f_0; float f_4; float f_8; short us_C; short us_E; short us_10; short us_12; short us_14; short us_16; }; template void ProcessRigidVertsCount(CFTTMatrix32 const *pMatrix320, CFTTMatrix32 const *pMatrix321, TFTTBatchVertex *pVertex2, T const *pT3, uint u4, TUV const *pTUV5) { //LOGE("g_bNeonAvailable%x", g_bNeonAvailable); if (g_bNeonAvailable) { float32x4_t Q8 = vld1q_f32((float *)pMatrix321); float32x4_t Q12 = vld1q_f32(((float *)pMatrix321) + 4); float32x4_t Q10 = vld1q_f32(((float *)pMatrix321) + 8); float32x4_t Q9 = vld1q_f32((float *)pMatrix320); float32x4_t Q14 = vld1q_f32(((float *)pMatrix320) + 4); float32x4_t Q13 = vld1q_f32(((float *)pMatrix320) + 8); float32x4_t Q11 = vld1q_f32(((float *)pMatrix320) + 12); for (int i = 0; i != u4; i++) { //loc_215B78 float32x4_t Q2; memcpy(&Q2, &Q11, sizeof(Q2)); int16x4_t d30 = vld1_dup_s16((short *)&pT3[i]); float32x4_t Q15 = vmovl_s16(d30); Q15 = vcvtq_f32_s32(Q15); Q2 = vmlaq_f32(Q2, Q9, Q15); int16x4_t D1 = vld1_dup_s16(((short *)&pT3[i]) + 1); float32x4_t Q1 = vmovl_s16(D1); Q15 = vcvtq_f32_s32(Q1); Q2 = vmlaq_f32(Q2, Q14, Q15); D1 = vld1_dup_s16(((short *)&pT3[i]) + 2); Q1 = vmovl_s16(D1); Q15 = vcvtq_f32_s32(Q1); Q2 = vmlaq_f32(Q2, Q13, Q15); memcpy(&pVertex2[i], &Q2, sizeof(Q2)); if (typeid(T) == typeid(VertBone)) { d30 = vld1_dup_s16(((short *)&pT3[i]) + 0xA); Q15 = vmovl_s16(d30); Q15 = vcvtq_f32_s32(Q15); Q15 = vmulq_f32(Q15, Q8); D1 = vld1_dup_s16(((short *)&pT3[i]) + 0xB); Q1 = vmovl_s16(D1); Q1 = vcvtq_f32_s32(Q1); Q15 = vmlaq_f32(Q15, Q12, Q1); D1 = vld1_dup_s16(((short *)&pT3[i]) + 0xC); Q2 = vmovl_s16(D1); Q1 = vcvtq_f32_s32(Q2); Q15 = vmlaq_f32(Q15, Q10, Q1); Q15 = vcvtq_s32_f32(Q15); d30 = vmovn_s32(Q15); memcpy(&pVertex2[i].us_C, &d30, sizeof(d30)); }else { d30 = vld1_dup_s16(((short *)&pT3[i]) + 0x4); Q15 = vmovl_s16(d30); Q15 = vcvtq_f32_s32(Q15); Q15 = vmulq_f32(Q15, Q8); D1 = vld1_dup_s16(((short *)&pT3[i]) + 0x5); Q1 = vmovl_s16(D1); Q1 = vcvtq_f32_s32(Q1); Q15 = vmlaq_f32(Q15, Q12, Q1); D1 = vld1_dup_s16(((short *)&pT3[i]) + 0x6); Q2 = vmovl_s16(D1); Q1 = vcvtq_f32_s32(Q2); Q15 = vmlaq_f32(Q15, Q10, Q1); Q15 = vcvtq_s32_f32(Q15); d30 = vmovn_s32(Q15); memcpy(&pVertex2[i].us_C, &d30, sizeof(d30)); } if (pTUV5) { pVertex2[i].us_14 = pTUV5[i].x * 32767.0f; pVertex2[i].us_16 = pTUV5[i].x * 32767.0f; } else { if (typeid(T) == typeid(VertBone)) { pVertex2[i].us_14 = pT3[i + 1].us_10; pVertex2[i].us_16 = pT3[i + 1].us_12; } else { pVertex2[i].us_14 = pT3[i].us_10; pVertex2[i].us_16 = pT3[i].us_12; } } } } else { for (int r9_i = 0; r9_i != u4; r9_i++) { float s2_f = pT3[r9_i].us_2; float s6_f = pT3[r9_i].us_4; float s12_f = pT3[r9_i].us_0; s2_f = pMatrix320->d[1][0] * s2_f; float s4_f = pMatrix320->d[0][0]; float s8_f = pMatrix320->d[2][0]; float s10_f = pMatrix320->d[3][0]; s2_f += s4_f * s12_f; s2_f += s8_f * s6_f; s2_f += s10_f; pVertex2[r9_i].f_0 = s2_f; s2_f = pT3[r9_i].us_2; s6_f = pT3[r9_i].us_4; s4_f = pMatrix320->d[0][1]; s8_f = pMatrix320->d[2][1]; s10_f = pMatrix320->d[3][1]; s2_f = pMatrix320->d[1][1] * s2_f; s2_f += s4_f * s12_f; s2_f += s8_f * s6_f; s2_f += s10_f; pVertex2[r9_i].f_4 = s2_f; s2_f = pT3[r9_i].us_2; s6_f = pT3[r9_i].us_4; s4_f = pMatrix320->d[0][2]; s8_f = pMatrix320->d[2][2]; s10_f = pMatrix320->d[3][2]; s2_f = pMatrix320->d[1][2] * s2_f; s2_f += s4_f * s12_f; s2_f += s8_f * s6_f; s2_f += s10_f; pVertex2[r9_i].f_8 = s2_f; if (typeid(T) == typeid(VertBone)) { s2_f = pT3[r9_i + 1].us_2; s10_f = pT3[r9_i + 1].us_0; s6_f = pT3[r9_i + 1].us_4; s4_f = pMatrix321->d[0][0]; s8_f = pMatrix321->d[2][0]; s2_f = pMatrix321->d[1][0] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertex2[r9_i].us_C = s2_f; s2_f = pT3[r9_i + 1].us_2; s10_f = pT3[r9_i + 1].us_0; s6_f = pT3[r9_i + 1].us_4; s4_f = pMatrix321->d[0][1]; s8_f = pMatrix321->d[2][1]; s2_f = pMatrix321->d[1][1] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertex2[r9_i].us_E = s2_f; s2_f = pT3[r9_i + 1].us_2; s10_f = pT3[r9_i + 1].us_0; s6_f = pT3[r9_i + 1].us_4; s4_f = pMatrix321->d[0][2]; s8_f = pMatrix321->d[2][2]; s2_f = pMatrix321->d[1][2] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertex2[r9_i].us_10 = s2_f; if (typeid(T) == typeid(VertBone)) { pVertex2[r9_i].us_14 = pT3[r9_i + 1].us_10; pVertex2[r9_i].us_16 = pT3[r9_i + 1].us_12; } else { pVertex2[r9_i].us_14 = pT3[r9_i].us_10; pVertex2[r9_i].us_16 = pT3[r9_i].us_12; } } else { T *pVertNorTexTanBone3 = (T *)pT3; s2_f = pVertNorTexTanBone3[r9_i].us_A; s10_f = pVertNorTexTanBone3[r9_i].us_8; s6_f = pVertNorTexTanBone3[r9_i].us_C; s4_f = pMatrix321->d[0][0]; s8_f = pMatrix321->d[2][0]; s2_f = pMatrix321->d[1][0] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertex2[r9_i].us_C = s2_f; s2_f = pVertNorTexTanBone3[r9_i].us_A; s10_f = pVertNorTexTanBone3[r9_i].us_8; s6_f = pVertNorTexTanBone3[r9_i].us_C; s4_f = pMatrix321->d[0][1]; s8_f = pMatrix321->d[2][1]; s2_f = pMatrix321->d[1][1] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertex2[r9_i].us_E = s2_f; s2_f = pVertNorTexTanBone3[r9_i].us_A; s10_f = pVertNorTexTanBone3[r9_i].us_8; s6_f = pVertNorTexTanBone3[r9_i].us_C; s4_f = pMatrix321->d[0][2]; s8_f = pMatrix321->d[2][2]; s2_f = pMatrix321->d[1][2] * s2_f; s2_f += s4_f * s10_f; s2_f += s8_f * s6_f; pVertex2[r9_i].us_10 = s2_f; } // else if(typeid(T) == typeid(VertNorTex)){ // //002159FA // VertNorTex *pVertNorTex3 = (VertNorTex *)pT3; // s2_f = pVertNorTex3[r9_i].us_A; // s10_f = pVertNorTex3[r9_i].us_8; // s6_f = pVertNorTex3[r9_i].us_C; // s4_f = pMatrix321->d[0][0]; // s8_f = pMatrix321->d[2][0]; // s2_f = pMatrix321->d[1][0] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertex2[r9_i].us_C = s2_f; // s2_f = pVertNorTex3[r9_i].us_A; // s10_f = pVertNorTex3[r9_i].us_8; // s6_f = pVertNorTex3[r9_i].us_C; // s4_f = pMatrix321->d[0][1]; // s8_f = pMatrix321->d[2][1]; // s2_f = pMatrix321->d[1][1] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertex2[r9_i].us_E = s2_f; // s2_f = pVertNorTex3[r9_i].us_A; // s10_f = pVertNorTex3[r9_i].us_8; // s6_f = pVertNorTex3[r9_i].us_C; // s4_f = pMatrix321->d[0][2]; // s8_f = pMatrix321->d[2][2]; // s2_f = pMatrix321->d[1][2] * s2_f; // s2_f += s4_f * s10_f; // s2_f += s8_f * s6_f; // pVertex2[r9_i].us_10 = s2_f; // } if (pTUV5) { // 00213A90 pVertex2[r9_i].us_14 = pTUV5[r9_i].x * 32767.0f; pVertex2[r9_i].us_16 = pTUV5[r9_i].y * 32767.0f; } else { if (typeid(T) == typeid(VertBone)) { pVertex2[r9_i].us_14 = pT3[r9_i + 1].us_10; pVertex2[r9_i].us_16 = pT3[r9_i + 1].us_12; } else { pVertex2[r9_i].us_14 = pT3[r9_i].us_10; pVertex2[r9_i].us_16 = pT3[r9_i].us_12; } // }else if(typeid(T) == typeid(VertNorTex)){ // //loc_215AF0 // pVertex2[r9_i].us_14 = pT3[r9_i].us_10; // pVertex2[r9_i].us_16 = pT3[r9_i].us_12; // } } } } } void testProcessRigidVertsBumpCount() { CFTTMatrix32 a1; CFTTMatrix32 a2; TFTTBatchVertexBump a3; VertBone a4; TUV a6; VertNorTexTanBone a4_1; VertNorTex a4_2; TFTTBatchVertex a3_1; VertNorTexTan a4_3; ProcessRigidVertsCount(&a1, &a2, &a3_1, &a4_3, 5, &a6); ProcessRigidVertsCount(&a1, &a2, &a3_1, &a4_2, 5, &a6); ProcessRigidVertsBumpCount(&a1, &a2, &a3, &a4, 5, &a6); ProcessRigidVertsBumpCount(&a1, &a2, &a3, &a4_1, 5, &a6); } // // 00213594 // //乱写的 // void ProcessRigidVertsBumpCount( // uint ui_r0_arg, CFTTMatrix32 const *p_cfttmatrix32_r1_arg, // CFTTMatrix32 const *p_cfttmatrix32_r2_arg, // TFTTBatchVertexBump *p_tfttbatchvertexbump_r3_arg, void const *p_v_arg_0, // uint ui_arg_4, TUV const *p_tuv_arg_8) { // float tmp = ui_r0_arg + p_cfttmatrix32_r1_arg->d[0][0] + // p_cfttmatrix32_r2_arg->d[0][0] + // p_tfttbatchvertexbump_r3_arg->un_0 + ((int)p_v_arg_0) + // ui_arg_4 + p_tuv_arg_8->x; // LOGI("ProcessRigidVertsBumpCount %f", tmp); // } //------------------------------------------------------------------------------------------------- // 0020F240 //^_- 经过单元测试,功能正常 // 0020F2B6 指令顺序不同 // 0020F2DE 指令顺序不同 // CFTTBatchModelManager::CFTTBatchModelManager(int d_r1_arg, bool b_r2_arg, // int d_r3_arg, // unsigned int ud_arg_0, // bool b_arg_4, bool b_arg_8) // : cfttbmmmatrixcache_0(b_arg_8, 0x200, 0) {} //------------------------------------------------------------------------------------------------- // 0020F378 //^_^ CFTTBatchModelManager::~CFTTBatchModelManager() {} //------------------------------------------------------------------------------------------------- // 0020F414 //^_^ bool CFTTBatchModelManager::PerformFlushOnFull() { return false; } //------------------------------------------------------------------------------------------------- // 0020F450 //^_^ void CFTTBatchModelManager::End() { LOGE("End%x", this); } //------------------------------------------------------------------------------------------------- // 0020F480 //^_^ void CFTTBatchModelManager::Begin() { LOGE("Begin%x", this); } //------------------------------------------------------------------------------------------------- // 0020F4EC //^_- //单元测试等级: 目测游戏表现 //单元测试内容: 启动游戏到第2关(包括第2关) //单元测试结果: 正常 //已测试分支: // 0020F524 // 0020F558 void CFTTBatchModelManager::FlushThreaded() {} //------------------------------------------------------------------------------------------------- // 0020F5B4 //^_^ void CFTTBatchModelManager::Flush(int i_r1_arg, bool b_r2_arg, bool b_r3_arg) {} //------------------------------------------------------------------------------------------------- // 0020F670 //^_^ void CFTTBatchModelManager::ResetCache(bool b_r1_arg) { LOGE("%x", this); LOGE("%x", b_r1_arg); } //------------------------------------------------------------------------------------------------- // 0020F68C //^_^ void CFTTBatchModelManager::SetMatrix( CFTTMatrix32 const &p_cfttmatrix32_r1_arg) {} //------------------------------------------------------------------------------------------------- // 0020F694 //^_- //单元测试等级: 目测游戏表现 //单元测试内容: 启动游戏到第2关(包括第2关) //单元测试结果: 正常 //已测试分支: // 0020F6D0 // 0020F6FA // 0020F726 // 0020F72E // 0020F79E // 0020F6BC // 0020F6C6 // 0020F7E4 int CFTTBatchModelManager::AddModelVerts( int i_r1_arg, CFTTModel *p_cfttmodel_r2_arg, int i_r3_arg, CFTTMatrix32 const *p_cfttmatrix32_arg_0, TUV *p_tuv_arg_4, TFTTCacheLookup tfttcachelookup_arg_8, callback_1 callback_arg_10, CFTTMatrix32 const *p_cfttmatrix32_arg_14) { return 0; } //------------------------------------------------------------------------------------------------- // 0020F8E4 //^_- //单元测试等级: 目测游戏表现 //单元测试内容: 启动游戏到第2关(包括第2关) //单元测试结果: 正常 //已测试分支: // 0020F944 // 0020F97C // 0020F994 // 0020F9B6 // 0020F91E // 0020FA14 // 0020FA24 // 0020FA00 // 0020FA04 void CFTTBatchModelManager::SkinVertsBoned( CFTTModel *p_cfttmodel_r1_arg, int i_r2_arg, float *p_f_r3_arg, void *p_v_arg_0, CFTTMatrix32 const *p_cfttmatrix32_arg_4, CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_8, CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_10, TUV *p_tuv_arg_18, TFTTCacheLookup tfttcachelookup_arg_1c, callback_1 callback_1_arg_24) {} //------------------------------------------------------------------------------------------------- // 0020FA32 //^_^ void CFTTBatchModelManager::CopyVerts( CFTTModel *p_cfttmodel_r1_arg, int i_r2_arg, float *p_f_r3_arg, void *p_v_arg_0, CFTTMatrix32 const *p_cfttmatrix32_arg_4, CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_8, CFTTBMMMatrixCache::StartCount cfttbmmmatrixcache_startcount_arg_10, TUV *p_tuv_arg_18, TFTTCacheLookup tfttcachelookup_arg_1c, callback_1 callback_1_arg_24) {} //------------------------------------------------------------------------------------------------- // 0020FAD8 //^_- //单元测试等级: 目测游戏表现 //单元测试内容: 启动游戏到第2关(包括第2关) //单元测试结果: 正常 //已测试分支: // 0020FB00 // 0020FB0A // 0020FB3C // 0020FB4E // 0020FB60 // 0020FCB6 // 0020FCC0 // 0020FCCE // 0020FCD4 // 0020FCD8 // 0020FB76 // 0020FB80 // 0020FBCC // 0020FBA2 // 0020FBD8 // 0020FB20 void CFTTBatchModelManager::AddModel( CFTTModel *p_cfttmodel_r1_arg, CFTTMatrix32 const *p_cfttmatrix32_r2_arg, TUV *p_tuv_r3_arg, TFTTCacheInstance tfttcacheinstance_arg_0, int i_arg_4, int i_arg_8, callback_1 callback_arg_c, CFTTMatrix32 const *p_cfttmatrix32_arg_10) { LOGE(" CFTTBatchModelManager::AddModel%p%p%p%p%x%x%p%p",p_cfttmodel_r1_arg,p_cfttmatrix32_r2_arg,p_tuv_r3_arg, tfttcacheinstance_arg_0,i_arg_4,i_arg_8,callback_arg_c,p_cfttmatrix32_arg_10); // __android_log_print(ANDROID_LOG_INFO, "sh_log", // "CFTTBatchModelManager::AddModel end"); } //------------------------------------------------------------------------------------------------- // 0020FD4A //^_- //单元测试等级: 目测游戏表现 //单元测试内容: 启动游戏到第2关(包括第2关) //单元测试结果: 正常 //已测试分支: // 0020FD6A // 0020FD76 // 0020FD8A // 0020FD90 // 0020FD9C // 0020FDA4 // 0020FDD6 void CFTTBatchModelManager::AddModelX( CFTTModel *p_cfttmodel_r1_arg, int i_r2_arg, CFTTMatrix32 const *p_cfttmatrix32_r3_arg, TUV *p_tuv_arg_0, callback_1 callback_1_arg_4, CFTTMatrix32 const *p_cfttmatrix32_arg_8) {} //------------------------------------------------------------------------------------------------- // 0020FE74 void CFTTBatchModelManager::SkinVertsBlend( CFTTModel *, int, float *, void *, CFTTMatrix32 const *, CFTTBMMMatrixCache::StartCount, CFTTBMMMatrixCache::StartCount, TUV *, TFTTCacheLookup, void (*)(void *, CFTTModel *, int, CFTTMatrix32 const *)) { } //------------------------------------------------------------------------------------------------- // 0020FE76 void CFTTBatchModelManager::SkinVerts( CFTTModel *, int, float *, void *, CFTTMatrix32 const *, CFTTBMMMatrixCache::StartCount, CFTTBMMMatrixCache::StartCount, TUV *, TFTTCacheLookup, void (*)(void *, CFTTModel *, int, CFTTMatrix32 const *)) { } //------------------------------------------------------------------------------------------------- // 0020FE6E //^_^ void CFTTBatchModelManager::SetFlushOnFullCB( pFlushOnFullCBCallBack pFlushOnFullCBCallBack_r1, void *p_v_r2) { this->field_D4 = pFlushOnFullCBCallBack_r1; this->field_D8 = p_v_r2; } //------------------------------------------------------------------------------------------------- // 0020F494 经过单元测试,功能正常 //^_^- // 0020F4D8处我的代码只取了一次this->field_70,而原始代码取了两次 CFTTBatchModelBin *CFTTBatchModelManager::AddBin( CFTTBatchModelBin *p_cfttbatchmodelbin_r1_arg, int d_r2_arg, uint ud_r3_arg, int d_arg_0, // shader mat id int d_arg_4, bool b_arg_8, bool b_arg_c) { return 0; } //------------------------------------------------------------------------------------------------- //目前还没有实现给dword_5C9840.field_4、dword_5C9840.field_8等字段赋值的函数 //接上,编译器优化会导致这些字段没了,所以自己写一个函数防止编译器优化 void TestUseBy_dword_5C9840() { printf("%p", &dword_5C9840.field_0); printf("%p", &dword_5C9840.field_4); printf("%p", &dword_5C9840.field_8); printf("%p", &dword_5C9840.field_c); // printf("%p", &dword_5C9840.useby_dword_5c9840_sub_14[0].p_cfttjobqueue_0); } //------------------------------------------------------------------------------------------------- // 0020F1EC //^_^ void CFTTBatchModelManager::InitialiseCodePath() {} //-------------------------------------------------------------------------------------------------