// // sub_54DB0 from 0x54db0 to 0x55c5c (3756 bytes) // // 2 xrefs: // > sub_58380 @ 0x583c8 // > sub_5B3B0 @ 0x5b4b8 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // __int64 __fastcall sub_54DB0(__int64 a1, int a2, char a3) { long double v3; // q8 long double v4; // q9 long double v5; // q11 long double v6; // q12 __int64 result; // x0 long double v11; // q0 long double v12; // q2 float v13; // s9 float *v14; // x22 float v15; // s8 __int64 v16; // x8 float v17; // s0 int v18; // w24 __int64 v19; // x0 __int64 v20; // x0 __int64 v21; // x0 unsigned int v22; // w8 float v23; // s2 float v24; // s1 float v25; // s3 float v26; // s4 float v27; // s1 float v28; // s1 float v29; // s2 float v30; // s3 float v31; // s4 float v32; // s2 float v33; // s2 float v34; // s4 float v35; // s5 float v36; // s3 float v37; // w8 __int64 v38; // x21 float v39; // s0 __int64 v40; // x20 int v41; // w8 float32x2_t *v42; // x27 float v43; // s1 float32x2_t v44; // d3 float v45; // s13 float v46; // s0 __int64 v47; // x0 float v48; // s0 float v49; // s1 __int64 v50; // x9 __int64 v51; // x8 float *v52; // x9 __int64 i; // x10 float v54; // s0 float v55; // s1 float v56; // s14 float v57; // s0 float v58; // s1 float v59; // s1 float v60; // s2 float v61; // s0 float v62; // s1 float v63; // s0 float v64; // s0 int v65; // w8 float v67; // s1 __int64 v68; // x9 float32x2_t v69; // d5 float v72; // s6 float v73; // s7 float v78; // w8 __int64 v79; // x8 float v80; // s4 __int64 v81; // x21 float v82; // s2 float v83; // s3 float v84; // s7 float v85; // s0 float v86; // s1 float v87; // s16 float v88; // s6 float v89; // s5 int v90; // w8 char v91; // w26 float v92; // s19 float v93; // s7 float v94; // s20 float v95; // s17 float v96; // s18 float v97; // s16 float v98; // s2 float v99; // s0 float v100; // s0 int v101; // w8 __int64 v103; // x22 int v104; // w8 float v105; // s13 __int64 v106; // x20 _BOOL4 v107; // w27 float v108; // s14 float v109; // s0 float v110; // s0 int v111; // w22 _DWORD *v112; // x0 int v113; // w20 int v114; // w8 __int64 v115; // x23 __int64 v116; // x24 __int64 v117; // x21 float v118; // s15 __int64 v119; // x26 __int64 v120; // x21 float *v121; // x27 __int64 v122; // x8 float *v123; // x9 __int64 v124; // x10 __int64 v125; // x11 int v126; // w12 bool v127; // zf float v128; // s0 float v129; // s0 __int64 v131; // x9 __int64 v132; // x10 __int64 v133; // x13 float v134; // s1 __int64 *v135; // x12 __int64 v136; // x8 __int64 v137; // x14 float v138; // s2 __int64 v139; // x11 float v140; // s3 bool v141; // cc bool v142; // cc __int64 *v143; // x8 __int64 v144; // x9 __int64 v145; // x10 float v146; // s0 float v147; // s1 float v148; // s2 __int64 v149; // x8 float v150; // s0 float v151; // s0 float v152; // s1 __int64 v153; // x21 _QWORD *j; // x22 int v155; // w9 __int64 v156; // x25 _DWORD *v157; // x26 int v158; // s0 __int64 v159; // x8 float *v160; // x11 _QWORD *k; // x12 float *v162; // x13 float *v163; // x14 __int64 v164; // x15 float v165; // t1 __int64 v166; // x8 float *v167; // x9 __int64 v168; // x3 __int64 v169; // x0 _QWORD *v170; // [xsp+8h] [xbp-DF8h] char v171; // [xsp+18h] [xbp-DE8h] unsigned int v172; // [xsp+1Ch] [xbp-DE4h] float v173; // [xsp+2Ch] [xbp-DD4h] float cosx; // [xsp+30h] [xbp-DD0h] BYREF float sinx; // [xsp+34h] [xbp-DCCh] BYREF _QWORD v176[2]; // [xsp+38h] [xbp-DC8h] BYREF _QWORD v177[192]; // [xsp+48h] [xbp-DB8h] BYREF float v178; // [xsp+648h] [xbp-7B8h] BYREF unsigned __int64 v179; // [xsp+64Ch] [xbp-7B4h] _DWORD v180[289]; // [xsp+7C8h] [xbp-638h] int v181; // [xsp+C4Ch] [xbp-1B4h] BYREF _OWORD v182[8]; // [xsp+C50h] [xbp-1B0h] BYREF _OWORD v183[8]; // [xsp+CD0h] [xbp-130h] BYREF char v184[4]; // [xsp+D50h] [xbp-B0h] BYREF float v185; // [xsp+D54h] [xbp-ACh] BYREF float v186; // [xsp+D58h] [xbp-A8h] BYREF int v187; // [xsp+D5Ch] [xbp-A4h] BYREF v187 = 0; result = (*(__int64 (__fastcall **)(__int64, int *))(*(_QWORD *)a1 + 152LL))(a1, &v187); if ( (_DWORD)result ) return result; if ( (v187 & 0x40000010) != 0x10 ) goto LABEL_51; v13 = *(float *)(a1 + 200); v14 = (float *)(a1 + 204); v15 = *(float *)(a1 + 204); if ( (*(_BYTE *)(a1 + 72) & 4) != 0 || (result = sub_55C5C(*(_QWORD *)(a1 + 8)), (result & 1) != 0) || *(_BYTE *)(*(_QWORD *)(a1 + 8) + 73152LL) || (a3 & 1) != 0 ) { v16 = *(_QWORD *)(a1 + 8); if ( *(_QWORD *)(v16 + 73136) ) { v17 = *(float *)(a1 + 128); if ( (v187 & 0x40000) != 0 ) { v17 = *(float *)(v16 + 68208) + v17; v179 = vadd_f32(*(float32x2_t *)(v16 + 68212), *(float32x2_t *)(a1 + 132)).n64_u64[0]; } else { v179 = *(_QWORD *)(a1 + 132); } v178 = v17; if ( (a3 & 1) != 0 ) { sub_5CF84(v16 + 73144, v16 + 68208, &v178, a1 + 200, a1 + 204); v18 = 1; goto LABEL_18; } v19 = ((__int64 (*)(void))sub_579C8)(); result = sub_5D078(v19); } } v18 = 0; if ( (a3 & 1) == 0 ) { v20 = sub_579C8(result); v21 = sub_5D1CC(v20); if ( v21 ) { if ( *(_QWORD *)(v21 + 32) == *(_QWORD *)(a1 + 80) ) { v18 = 1; *(_QWORD *)(a1 + 200) = *(_QWORD *)(v21 + 52); } } } LABEL_18: if ( *(_QWORD *)(a1 + 368) ) { if ( v18 ) { result = sub_55C9C(a1, *(_QWORD *)(a1 + 80), 0, 3, a1 + 200, a1 + 204); if ( (_DWORD)result ) return result; } } LODWORD(v11) = *(_DWORD *)(a1 + 200); v22 = *(_DWORD *)(*(_QWORD *)(a1 + 8) + 69708LL); v23 = (float)v22; if ( !v22 ) v23 = 500.0; if ( v13 != *(float *)&v11 ) { v24 = (float)(*(float *)&v11 - *(float *)(a1 + 192)) / v23; v25 = fminf(v24, -0.0001); v26 = fmaxf(v24, 0.0001); if ( v24 >= 0.0 ) v27 = v26; else v27 = v25; *(float *)(a1 + 216) = v27; } v28 = *v14; if ( v15 != *v14 ) { v29 = (float)(v28 - *(float *)(a1 + 196)) / v23; v30 = fminf(v29, -0.0001); v31 = fmaxf(v29, 0.0001); if ( v29 >= 0.0 ) v32 = v31; else v32 = v30; *(float *)(a1 + 220) = v32; } v33 = *(float *)(a1 + 192); if ( (v33 != *(float *)&v11 || *(float *)(a1 + 196) != v28) && (a2 || (a3 & 1) != 0) ) { if ( (a3 & 1) != 0 ) { *(_DWORD *)(a1 + 192) = LODWORD(v11); *(float *)(a1 + 196) = v28; LABEL_50: (*(void (__fastcall **)(__int64, _QWORD, long double))(*(_QWORD *)a1 + 408LL))(a1, 0, v11); goto LABEL_51; } v35 = *(float *)(a1 + 216); v34 = *(float *)(a1 + 220); *(float *)&v12 = v33 + (float)(v35 * (float)a2); v36 = *(float *)(a1 + 196) + (float)(v34 * (float)a2); *(_DWORD *)(a1 + 192) = LODWORD(v12); *(float *)(a1 + 196) = v36; if ( v35 <= 0.0 ) { if ( *(float *)&v12 >= *(float *)&v11 ) goto LABEL_44; } else if ( *(float *)&v12 <= *(float *)&v11 ) { LABEL_44: if ( v34 <= 0.0 ) { if ( v36 >= v28 ) goto LABEL_49; } else if ( v36 <= v28 ) { goto LABEL_49; } *(float *)(a1 + 196) = v28; LABEL_49: v11 = v12; goto LABEL_50; } v12 = v11; *(_DWORD *)(a1 + 192) = LODWORD(v11); goto LABEL_44; } LABEL_51: result = sub_6D7C4(*(_QWORD *)(a1 + 8), &v186, &v185, v184); if ( (_DWORD)result ) return result; v186 = v186 * *(float *)(a1 + 244); if ( (*(_BYTE *)(a1 + 72) & 4) != 0 || (sub_55C5C(*(_QWORD *)(a1 + 8)) & 1) != 0 ) { result = sub_6D6EC(*(_QWORD *)(a1 + 8), &v178); if ( !(_DWORD)result ) { v37 = v178; v38 = 0; v39 = 3.4028e38; while ( 1 ) { if ( v38 >= SLODWORD(v37) ) goto LABEL_115; v40 = *(_QWORD *)(a1 + 8); v41 = v187; v42 = (float32x2_t *)(v40 + 112 * v38 + 68208); if ( (v187 & 0x40000) != 0 ) { *(_QWORD *)&v6 = *(_QWORD *)(a1 + 128); v43 = *(float *)(a1 + 136); } else { *(float32x2_t *)&v6 = vsub_f32(*(float32x2_t *)(a1 + 128), (float32x2_t)v42->n64_u64[0]); v43 = *(float *)(a1 + 136) - *(float *)(v40 + 112 * v38 + 68216); } v44.n64_u64[0] = vmul_f32(*(float32x2_t *)&v6, *(float32x2_t *)&v6).n64_u64[0]; v45 = (*(_BYTE *)(v40 + 120) & 4) != 0 ? -v43 : v43; *(float *)&v3 = sqrtf(vaddv_f32(v44) + (float)(v45 * v45)); if ( *(float *)&v3 < v39 ) break; LABEL_99: v37 = v178; if ( v186 > 0.0 && LODWORD(v178) == 1 ) { if ( (v187 & 0x40000) != 0 ) { _D3.n64_u64[0] = *(unsigned __int64 *)(a1 + 144); v69.n64_u64[0] = *(unsigned __int64 *)(a1 + 128); _S4 = *(float *)(a1 + 136); } else { v68 = v40 + 112 * v38; v69.n64_u64[0] = vsub_f32(*(float32x2_t *)(a1 + 128), (float32x2_t)v42->n64_u64[0]).n64_u64[0]; _D3.n64_u32[1] = vsub_f32(*(float32x2_t *)(a1 + 144), *(float32x2_t *)(v68 + 68236)).n64_u32[1]; _S4 = *(float *)(a1 + 136) - *(float *)(v68 + 68216); } v72 = sqrtf(vaddv_f32(vmul_f32(v69, v69)) + (float)(_S4 * _S4)); v73 = 0.0; if ( v72 > 0.0 ) { __asm { FMLA S2, S4, V3.S[1] } v73 = _S2 / v72; } v67 = (float)((float)(v185 * 340.0) - (float)(v73 * v186)) / (float)(v185 * 340.0); *(float *)(a1 + 124) = v67; } else { v67 = *(float *)(a1 + 124); } if ( v67 < 0.000001 ) *(_DWORD *)(a1 + 124) = 897988541; ++v38; } *(_DWORD *)(a1 + 152) = LODWORD(v3); if ( *(_QWORD *)(v40 + 69120) ) { result = sub_7BA10(v40, 0); if ( (_DWORD)result ) return result; v46 = (*(float (__fastcall **)(_QWORD, float))(*(_QWORD *)(a1 + 8) + 69120LL))( *(_QWORD *)(a1 + 80), *(float *)(a1 + 152)); v47 = *(_QWORD *)(a1 + 8); *(float *)(a1 + 120) = v46; result = sub_7BAA0(v47); if ( (_DWORD)result ) return result; } else { if ( (v41 & 0x4000000) == 0 ) { v48 = sub_54D2C(a1, v41 & 0x4F00000, v3); LABEL_70: *(float *)(a1 + 120) = v48; LABEL_71: v49 = 0.0; if ( v48 >= 0.0 ) { v49 = 1.0; if ( v48 <= 1.0 ) { LABEL_83: v56 = *(float *)(a1 + 172); if ( v56 >= 360.0 && *(float *)(a1 + 168) >= 360.0 ) goto LABEL_98; v57 = *(float *)(a1 + 152); v58 = 0.0; if ( v57 > 0.0 ) { v59 = *(float *)(a1 + 188); v60 = vaddv_f32(vmul_f32(*(float32x2_t *)(a1 + 180), *(float32x2_t *)&v6)); if ( (*(_DWORD *)(*(_QWORD *)(a1 + 8) + 120LL) & 4) != 0 ) v59 = -v59; v61 = (float)(v60 + (float)(v59 * v45)) / v57; v62 = fminf(-v61, 1.0); if ( v61 <= 1.0 ) v63 = v62; else v63 = -1.0; v58 = acosf(v63) * 114.59; } v64 = *(float *)(a1 + 168); if ( v58 >= v64 ) { if ( v58 < v56 ) { *(float *)(a1 + 164) = (float)(1.0 - (float)((float)(v58 - v64) / (float)(v56 - v64))) + (float)(*(float *)(a1 + 176) * (float)((float)(v58 - v64) / (float)(v56 - v64))); LABEL_98: v39 = *(float *)&v3; goto LABEL_99; } v65 = *(_DWORD *)(a1 + 176); } else { v65 = 1065353216; } *(_DWORD *)(a1 + 164) = v65; goto LABEL_98; } } LABEL_82: *(float *)(a1 + 120) = v49; goto LABEL_83; } v50 = *(_QWORD *)(a1 + 224); v49 = 1.0; if ( !v50 ) goto LABEL_82; v51 = *(int *)(a1 + 232); v49 = 1.0; if ( !(_DWORD)v51 ) goto LABEL_82; if ( *(float *)&v3 >= *(float *)(v50 + 12 * (v51 - 1)) ) { v78 = *(float *)(v50 + 12 * (v51 - 1) + 4); *(float *)(a1 + 120) = v78; v48 = v78; goto LABEL_71; } v52 = (float *)(v50 + 16); for ( i = 1; i < v51; ++i ) { v54 = *(v52 - 4); if ( *(float *)&v3 >= v54 ) { v55 = *(v52 - 1); if ( *(float *)&v3 < v55 ) { v48 = (float)(*(v52 - 3) - (float)((float)((float)(*(float *)&v3 - v54) / (float)(v55 - v54)) * *(v52 - 3))) + (float)(*v52 * (float)((float)(*(float *)&v3 - v54) / (float)(v55 - v54))); goto LABEL_70; } } v52 += 3; } } v48 = *(float *)(a1 + 120); goto LABEL_71; } } else { LABEL_115: memset(v183, 0, sizeof(v183)); memset(v182, 0, sizeof(v182)); result = (*(__int64 (__fastcall **)(__int64, int *))(*(_QWORD *)a1 + 504LL))(a1, &v181); if ( (_DWORD)result ) return result; v79 = *(_QWORD *)(a1 + 8); v80 = 1.0; v81 = v79 + 68208; if ( *(_DWORD *)(v79 + 69104) == 1 ) { v83 = *(float *)(a1 + 128); v82 = *(float *)(a1 + 132); v84 = *(float *)(a1 + 136); if ( (v187 & 0x40000) != 0 ) { v85 = 0.0; v87 = 1.0; v86 = 0.0; v89 = 0.0; v90 = *(_DWORD *)(v79 + 120) & 4; if ( v90 ) v80 = -1.0; v88 = 0.0; } else { v86 = *(float *)(v79 + 68280); v85 = *(float *)(v79 + 68284); v87 = *(float *)(v79 + 68288); v80 = *(float *)(v79 + 68304); v88 = *(float *)(v79 + 68308); v89 = *(float *)(v79 + 68312); v83 = v83 - *(float *)v81; v82 = v82 - *(float *)(v79 + 68212); v84 = v84 - *(float *)(v79 + 68216); v90 = *(_DWORD *)(v79 + 120) & 4; } v92 = -v84; if ( v90 ) { v93 = -v87; } else { v92 = v84; v93 = v87; } v94 = sqrtf((float)((float)(v82 * v82) + (float)(v83 * v83)) + (float)(v92 * v92)); v95 = 0.0; v96 = 0.0; v97 = 0.0; if ( v94 > 0.0 ) { v97 = v83 * (float)(1.0 / v94); v96 = v82 * (float)(1.0 / v94); v95 = v92 * (float)(1.0 / v94); } v98 = (float)((float)(v95 * v89) + (float)(v96 * v88)) + (float)(v97 * v80); result = 36; if ( v98 > 1.01 ) return result; if ( v98 < -1.01 ) return result; v99 = (float)((float)(v95 * v93) + (float)(v96 * v85)) + (float)(v97 * v86); result = 36; if ( v99 > 1.01 || v99 < -1.01 ) return result; *(float *)&v3 = fmaxf(fminf(v98, 1.0), -1.0); *(float *)&v4 = fmaxf(fminf(v99, 1.0), -1.0); v173 = sub_55D20(36, v3, v4); *(float *)(a1 + 256) = acosf(*(float *)&v4) * 57.296; v100 = *(float *)(a1 + 236); v101 = v181; if ( v100 != 0.0 && v181 == 1 ) { v101 = 2; v91 = 1; v181 = 2; } else { v91 = 0; } v103 = v101; v104 = v101 - 1; v105 = v100 * -0.0087266; v106 = 0; v107 = v100 == 0.0 || v104 == 0; v108 = 1.0 / (float)v104; while ( v106 < v103 ) { if ( v107 ) { *((_DWORD *)v183 + v106) = LODWORD(v3); v109 = *(float *)&v4; } else { switch ( (int)v103 ) { case 4: if ( v106 == 1 ) v110 = 1.0; else v110 = 0.0; if ( !v106 ) v110 = -1.0; break; case 6: v110 = 0.0; if ( (unsigned int)v106 < 6 ) v110 = flt_2F15C[v106]; break; case 8: case 12: v110 = 0.0; if ( (unsigned int)v106 < 8 ) v110 = flt_2F174[v106]; break; default: v110 = (float)((float)((float)(int)v106 + (float)(int)v106) * v108) + -1.0; break; } sincosf(v105 * v110, &sinx, &cosx); v109 = (float)(sinx * *(float *)&v3) + (float)(cosx * *(float *)&v4); *((float *)v183 + v106) = -(float)((float)(sinx * *(float *)&v4) - (float)(cosx * *(float *)&v3)); } *((float *)v182 + v106++) = v109; } } else { v91 = 0; LODWORD(v3) = 0; LODWORD(v4) = 0; v173 = 0.0; } v111 = *(_DWORD *)(v81 + 2252); if ( (unsigned int)(v111 - 1) >= 2 ) { v112 = (_DWORD *)sub_57994(&v178); v171 = v91; v113 = 5; v114 = 2; switch ( v111 ) { case 3: goto LABEL_160; case 4: case 5: v114 = v111; goto LABEL_160; case 6: goto LABEL_163; case 7: v111 = 8; v113 = 7; goto LABEL_163; case 8: v111 = 12; v113 = 11; LABEL_163: v172 = v111; v115 = a1 + 56; v170 = (_QWORD *)(a1 + 64); if ( *(_QWORD *)(a1 + 64) && *(_BYTE *)(v81 + 2440) ) { v117 = 0; v116 = 3; while ( v117 < v181 ) { v177[0] = a1 + 56; v177[1] = 3; v112 = (_DWORD *)sub_55D90(v177, (unsigned int)v117); v180[v117++] = *v112; } } else { v116 = 3; } break; default: v114 = 0; LABEL_160: v115 = a1 + 56; v116 = 0xFFFFFFFFLL; v113 = v114; v170 = (_QWORD *)(a1 + 64); v172 = v114; break; } v118 = *(float *)(a1 + 240); if ( v118 > 0.0 ) { v119 = v181; v120 = 0; v121 = &v178; while ( v120 < v119 ) { LODWORD(v5) = *((_DWORD *)v182 + v120); LODWORD(v6) = *((_DWORD *)v183 + v120); if ( *(float *)&v5 != 0.0 || *(float *)&v6 != 0.0 ) { v129 = v173; if ( *(float *)&v5 != *(float *)&v4 || *(float *)&v6 != *(float *)&v3 ) v129 = sub_55D20(v112, v6, v5); v131 = *(_QWORD *)(a1 + 8); v132 = *(_QWORD *)(v131 + 71040); if ( v132 ) { if ( *(_QWORD *)(v131 + 71048) ) { v133 = (unsigned int)(v113 + 1) - 1LL; v134 = v129 + 8.0; v135 = (__int64 *)(v131 + 71048); v136 = *(_QWORD *)(v131 + 71040); if ( v113 != 0 ) { while ( v136 ) { v137 = *v135; v138 = *(float *)(v136 + 32); if ( *v135 ) v139 = *v135; else v139 = *(_QWORD *)(v131 + 71040); v140 = *(float *)(v139 + 32); if ( v138 != v140 ) { if ( v140 < v138 ) v140 = v140 + 8.0; v141 = v138 > v129 || v140 <= v129; if ( !v141 || (v134 >= v138 ? (v142 = v134 < v140) : (v142 = 0), v142) ) { if ( *(_BYTE *)(v136 + 41) ) { v146 = -(float)((float)(*(float *)(v139 + 20) * *(float *)&v5) - (float)(*(float *)(v139 + 28) * *(float *)&v6)); v147 = -(float)((float)(*(float *)(v136 + 28) * *(float *)&v6) - (float)(*(float *)(v136 + 20) * *(float *)&v5)); v148 = *(float *)(v136 + 44) / sqrtf((float)(v146 * v146) + (float)(v147 * v147)); *(&v178 + 32 * (__int64)*(int *)(v136 + 4) + v120) = v148 * v146; v149 = *(int *)(v139 + 4); v150 = v148 * v147; } else { v151 = (float)(*(float *)(v136 + 20) * *(float *)&v6) + (float)(*(float *)(v136 + 28) * *(float *)&v5); v152 = sqrtf(2.0 - (float)(v151 * v151)); *(&v178 + 32 * (__int64)*(int *)(v136 + 4) + v120) = (float)(v152 + v151) * 0.5; v149 = *(int *)(v139 + 4); v150 = (float)(v152 - v151) * 0.5; } *(&v178 + 32 * v149 + v120) = v150; goto LABEL_217; } } --v133; ++v135; v136 = v137; if ( !v133 ) goto LABEL_217; } v143 = (__int64 *)(v131 + 71040); v144 = (unsigned int)v113; if ( v113 ) { do { v145 = *v143; if ( !*v143 ) break; --v144; ++v143; *(&v178 + 32 * (__int64)*(int *)(v145 + 4) + v120) = 1.0; } while ( v144 ); } } } else { *(&v178 + 32 * (__int64)*(int *)(v132 + 4) + v120) = 1.0; } } } else { v122 = v116; v123 = v121; v124 = 70504; v125 = v172; if ( v172 ) { do { --v125; v126 = *(unsigned __int8 *)(*(_QWORD *)(a1 + 8) + v124); v124 += 48; if ( v126 ) v127 = v122 == 0; else v127 = 1; if ( v127 ) v128 = 0.0; else v128 = 1.4142 / (float)v113; *v123 = v128; v123 += 32; --v122; } while ( v125 ); } } LABEL_217: ++v120; ++v121; } } if ( v118 < 1.0 ) { if ( *v170 ) { v153 = 0; for ( j = v177; ; j = (_QWORD *)((char *)j + 4) ) { v155 = v181; if ( v153 >= v181 ) break; v156 = 0; v157 = j; while ( v172 != v156 ) { v158 = 0; if ( v116 != v156 ) { v176[0] = v115; v176[1] = v156; v158 = *(_DWORD *)sub_55D90(v176, (unsigned int)v153); } *v157 = v158; v157 += 32; ++v156; } ++v153; } } else { sub_57994(v177); sub_AB134(v177, 0, v172, (unsigned int)v181, 1.0); v155 = v181; } v159 = 0; v160 = &v178; for ( k = v177; ; k = (_QWORD *)((char *)k + 4) ) { v162 = (float *)k; v163 = v160; v164 = v172; if ( v159 >= v155 ) break; if ( v172 ) { do { v165 = *v162; v162 += 32; --v164; *v163 = (float)(*v163 * v118) + (float)(v165 * (float)(1.0 - v118)); v163 += 32; } while ( v164 ); } ++v159; ++v160; } } if ( (v171 & 1) != 0 ) { v166 = v172; v181 = 1; v167 = &v178; if ( v172 ) { do { --v166; *v167 = (float)(v167[1] + *v167) * 0.5; v167 += 32; } while ( v166 ); } v168 = 1; } else { v168 = (unsigned int)v181; } (*(void (__fastcall **)(__int64, float *, _QWORD, __int64, __int64, _QWORD))(*(_QWORD *)a1 + 200LL))( a1, &v178, v172, v168, 32, 0); } v169 = (*(__int64 (__fastcall **)(__int64, float))(*(_QWORD *)a1 + 72LL))(a1, *(float *)(a1 + 52)); sub_5790C(v169); return 0; } return result; }