From 2d4c6c7f68013ecda2a0622ba61d2f0d2b9ca6c6 Mon Sep 17 00:00:00 2001 From: IcePixelx <41352111+PixieCore@users.noreply.github.com> Date: Tue, 1 Mar 2022 22:49:57 +0100 Subject: [PATCH] fixing CalcPropStaticFrustumCulling up. --- r5dev/bsplib/bsplib.cpp | 649 +++++++++++++++++++++------------------- 1 file changed, 333 insertions(+), 316 deletions(-) diff --git a/r5dev/bsplib/bsplib.cpp b/r5dev/bsplib/bsplib.cpp index c1de71e2..def61b17 100644 --- a/r5dev/bsplib/bsplib.cpp +++ b/r5dev/bsplib/bsplib.cpp @@ -2,330 +2,347 @@ #include "tier0/cvar.h" #include "common/pseudodefs.h" #include "bsplib/bsplib.h" +#include "engine/host_state.h" //----------------------------------------------------------------------------- // Purpose: calculates the view frustum culling data per static prop //----------------------------------------------------------------------------- __int64 __fastcall HCalcPropStaticFrustumCulling(__int64 a1, __int64 a2, unsigned int a3, unsigned int a4, __int64 a5, __int64 a6, __int64 a7) { - //float v9; // xmm6_4 - //char v10; // r13 - //float v11; // xmm7_4 - //__int64 v12; // rsi - //__int64 v13; // rdx - //__int64 v14; // rbx - //unsigned __int8 v15; // r8 - //const char* v16; // rax - //int v17; // eax - //char v18; // dl - //bool v19; // cc - //char v20; // al - //__int16 v21; // ax - //__int64 v22; // rax - //__m128 v23; // xmm9 - //__m128 v24; // xmm10 - //__m128 v25; // xmm11 - //unsigned __int64 v26; // rbx - //__m128 v27; // xmm0 - //__m128 v28; // xmm8 - //__int64 v29; // rax - //__int64 v30; // rcx - //__int64 v31; // xmm1_8 - //int v32; // er8 - //__m128 v33; // xmm0 - //__int64 v34; // rcx - //unsigned __int64 v35; // rdx - //__int64 v36; // rax - //__int64 v37; // rax - //unsigned __int64 v38; // rcx - //__int64 v39; // rax - //unsigned __int64 v40; // rcx - //__int64 v41; // rax - //float v42; // xmm2_4 - //__int64 v43; // rbx - //float v44; // xmm2_4 - //float v45; // xmm4_4 - //__m128i v46; // xmm1 - //__m128i v47; // xmm2 - //__m128i v48; // xmm3 - //unsigned int v49; // eax - //float v50; // xmm0_4 - //float v51; // xmm2_4 - //float v52; // xmm1_4 - //float v53; // xmm2_4 - //unsigned __int8 v54; // si - //__int64 v55; // rax - //__int64 v56; // rcx - //int v57; // eax - //__int64 v58; // rcx - //int v59; // edx - //__int64 v60; // rax - //__int64 v61; // r13 - //int v62; // eax - //unsigned __int64 v63; // r13 - //__int64 v64; // rdx - //int v65; // er14 - //unsigned __int64 v66; // rdi - //__int64 v67; // r13 - //__int64 v68; // r15 - //void** v69; // rbx - //__int64 v70; // rcx - //__int64 result; // rax - //__m128 v72; // [rsp+38h] [rbp-D0h] BYREF - //__int64 v73; // [rsp+48h] [rbp-C0h] - //__int64 v74; // [rsp+50h] [rbp-B8h] - //__m128 v75; // [rsp+58h] [rbp-B0h] BYREF - //__int64 v76; // [rsp+68h] [rbp-A0h] - //__int64 v77; // [rsp+78h] [rbp-90h] - //__m128 v78[3]; // [rsp+88h] [rbp-80h] BYREF - //char Destination[376]; // [rsp+B8h] [rbp-50h] BYREF - //__int64 v80; // [rsp+278h] [rbp+170h] - //int v83; // [rsp+288h] [rbp+180h] - //int v84; // [rsp+290h] [rbp+188h] - //__int64 v85; // [rsp+298h] [rbp+190h] - //__int64 v86; // [rsp+2A8h] [rbp+1A0h] + float v9; // xmm6_4 + char v10; // r13 + double v11; // xmm7_8 + __int64 v12; // rsi + __int64 v13; // rdx + __int64 v14; // rbx + unsigned __int8 v15; // r8 + const char* v16; // rax + int v17; // eax + char v18; // dl + bool v19; // cc + char v20; // al + __int16 v21; // ax + __int64 v22; // rax + __m128 v23; // xmm9 + __m128 v24; // xmm10 + __m128 v25; // xmm11 + unsigned __int64 v26; // rbx + __m128 v27; // xmm8 + __int64 v28; // rax + __int64 v29; // rcx + __int64 v30; // xmm1_8 + int v31; // er8 + __m128i v32; // xmm0 + __int64 v33; // rcx + unsigned __int64 v34; // rdx + __int64 v35; // rax + __int64 v36; // rax + unsigned __int64 v37; // rcx + __int64 v38; // rax + unsigned __int64 v39; // rcx + __int64 v40; // rax + float v41; // xmm2_4 + __int64 v42; // rbx + float v43; // xmm2_4 + float v44; // xmm4_4 + __m128i v45; // xmm1 + __m128i v46; // xmm2 + __m128i v47; // xmm3 + unsigned int v48; // eax + float v49; // xmm0_4 + float v50; // xmm2_4 + float v51; // xmm1_4 + float v52; // xmm2_4 + unsigned __int8 v53; // si + __int64 v54; // rax + __int64 v55; // rcx + int v56; // eax + __int64 v57; // rcx + int v58; // edx + __int64 v59; // rax + __int64 v60; // r13 + int v61; // eax + unsigned __int64 v62; // r13 + __int64 v63; // rdx + int v64; // er14 + unsigned __int64 v65; // rdi + __int64 v66; // r13 + __int64 v67; // r15 + void* v68; // rbx + __int64 v69; // rcx + __int64 result; // rax + __m128i v71; // [rsp+38h] [rbp-D0h] BYREF + __int64 v72; // [rsp+48h] [rbp-C0h] + __int64 v73; // [rsp+50h] [rbp-B8h] + __m128 v74; // [rsp+58h] [rbp-B0h] BYREF + __int64 v75; // [rsp+68h] [rbp-A0h] + __int64 v76; // [rsp+78h] [rbp-90h] + __m128 v77[3]; // [rsp+88h] [rbp-80h] BYREF + char Destination[376]; // [rsp+B8h] [rbp-50h] BYREF + __int64 v79; // [rsp+278h] [rbp+170h] + int v82; // [rsp+288h] [rbp+180h] + int v83; // [rsp+290h] [rbp+188h] + __int64 v84; // [rsp+298h] [rbp+190h] + __int64 v85; // [rsp+2A8h] [rbp+1A0h] - //v9 = 1.0; - //v10 = a4; - //*(_QWORD*)(a1 + 20) = *(_QWORD*)a5; - //*(_DWORD*)(a1 + 28) = *(_DWORD*)(a5 + 8); - //*(_DWORD*)(a1 + 8) = a4; - //v11 = *(float*)(a5 + 24); - //v12 = a4 >> 1; - //*(float*)(a1 + 12) = 1.0 / (float)(v11 * v11); - //v13 = *(unsigned __int16*)(a7 + 320); - //*(_WORD*)a1 = v13; - //v14 = (*(__int64(__fastcall**)(__int64, __int64, _QWORD))(*(_QWORD*)qword_14D40B328 + 104i64))(qword_14D40B328, v13, 0i64); - //v85 = v14; - //if ((*(_BYTE*)(v14 + 156) & 0x10) == 0 && dword_1696A9D20 < 100) - // ++dword_1696A9D20; - //v15 = *(_BYTE*)(a5 + 30); - //if (v15 > 2u && (unsigned __int8)(v15 - 6) > 2u) - //{ - // v16 = (const char*)(*((__int64(__fastcall**)(void**, __int64))g_CModelLoader + 4))(&g_CModelLoader, a7); - // strncpy_s(Destination, v16, 0x104ui64); - // v15 = 0; - //} - //v17 = *(unsigned __int8*)(a5 + 32); - //*(_BYTE*)(a1 + 4) = v17; - //v18 = v17; - //v19 = v17 < *(_DWORD*)(v14 + 228); - //*(_BYTE*)(a1 + 5) = v15; - //if (!v19) - // v18 = 0; - //*(_BYTE*)(a1 + 4) = v18; - //v20 = *(_BYTE*)(a5 + 31); - //if ((v20 & 4) != 0) - //{ - // v15 |= 0x40u; - // *(_BYTE*)(a1 + 5) = v15; - // v20 = *(_BYTE*)(a5 + 31); - //} - //if ((v20 & 8) != 0) - //{ - // v15 |= 0x20u; - // *(_BYTE*)(a1 + 5) = v15; - // v20 = *(_BYTE*)(a5 + 31); - //} - //if ((v20 & 0x30) != 16) - // *(_BYTE*)(a1 + 5) = v15 | 0x10; - //v21 = 0; - //if (*(_WORD*)(a5 + 34) != 0xFFFF) - // v21 = *(_WORD*)(a5 + 34); - //*(_WORD*)(a1 + 2) = v21; - //sub_1404365A0(v78, a5, a5 + 12, 0); - //v22 = qword_141744EA8; - //v23 = v78[0]; - //v24 = v78[1]; - //v25 = v78[2]; - //v26 = (unsigned __int64)(unsigned int)v12 << 6; - //*(__m128*)(v26 + qword_141744EA8) = v78[0]; - //*(__m128*)(v26 + v22 + 16) = v24; - //*(__m128*)(v26 + v22 + 32) = v25; - //v27 = _mm_mul_ps(_mm_cvtepi32_ps(_mm_unpacklo_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(_DWORD*)(a5 + 52)), (__m128i)0i64), (__m128i)0i64)), (__m128)xmmword_1415BD270); - //v75 = v27; - //*(double*)v27.m128_u64 = _mm_castsi128_ps(sub_140270130(&v75)); - //v28 = v27; - //*(__m128*)(v26 + qword_141744EA8 + 48) = v27; - //((void(__fastcall*)(void***, __int64, __int64*, char*))off_141731448[10])(&off_141731448, a7, (long long*)&v72, (char*)&v72 + 12); - //sub_14028F170((unsigned int)&v75, (unsigned int)&v75.m128_u32[3], (__m128*)v78, (__m128i*)&v72, (__m128i*)&v72 + 12); - //v29 = qword_141744EA0; - //v30 = 3 * v12; - //v31 = v76; - //*(__m128*)(qword_141744EA0 + 8 * v30) = v75; - //*(_QWORD*)(v29 + 8 * v30 + 16) = v31; - //if ((v10 & 1) != 0) - //{ - // v32 = dword_141744EBC; - // v33 = v72; - // *(_DWORD*)a2 = *(_DWORD*)(a6 + 48); - // *(_DWORD*)(a2 + 4) = *(_DWORD*)(a6 + 52); - // *(_QWORD*)(a2 + 8) = 0i64; - // v34 = 3i64 * (unsigned int)(v32 + v12); - // v35 = (unsigned __int64)(unsigned int)(v32 + v12) << 6; - // v36 = qword_141744EA0; - // *(__m128*)(qword_141744EA0 + 8 * v34) = v33; - // *(_QWORD*)(v36 + 8 * v34 + 16) = v73; - // v37 = qword_141744EA8; - // v38 = (unsigned __int64)(unsigned int)(v12 + 2 * v32) << 6; - // *(__m128*)(v35 + qword_141744EA8) = v23; - // *(__m128*)(v35 + v37 + 16) = v24; - // *(__m128*)(v35 + v37 + 32) = v25; - // *(__m128*)(v35 + qword_141744EA8 + 48) = v28; - // v39 = qword_141744EA8; - // *(__m128*)(v38 + qword_141744EA8) = v23; - // *(__m128*)(v38 + v39 + 16) = v24; - // *(__m128*)(v38 + v39 + 32) = v25; - // *(__m128*)(v38 + qword_141744EA8 + 48) = v28; - // v40 = (unsigned __int64)(unsigned int)(v32 + v12 + 2 * v32) << 6; - // *(__m128*)(v40 + qword_141744EA8 + 48) = v28; - // v41 = qword_141744EA8; - // *(__m128*)(v40 + qword_141744EA8) = *(__m128*)a6; - // *(__m128*)(v40 + v41 + 16) = *(__m128*)(a6 + 16); - // *(__m128*)(v40 + v41 + 32) = *(__m128*)(a6 + 32); - //} - //v42 = *(float*)(a5 + 36); - //v43 = v85; - //if (v42 <= 0.0) - //{ - // if ((*(_DWORD*)(v85 + 156) & 0x800) != 0) - // { - // v42 = 227023.36; - // } - // else - // { - // v44 = *(float*)(v85 + 364); - // if (v44 <= 0.0) - // v42 = fmaxf( - // (float)((float)(sqrtf( - // (float)((float)((float)(*(float*)&v72 - *((float*)&v72 + 3)) * (float)(*(float*)&v72 - *((float*)&v72 + 3))) - // + (float)((float)(*((float*)&v72 + 1) - *(float*)&v73) * (float)(*((float*)&v72 + 1) - *(float*)&v73))) - // + (float)((float)(*((float*)&v72 + 2) - *((float*)&v73 + 1)) * (float)(*((float*)&v72 + 2) - *((float*)&v73 + 1)))) - // * 0.5) - // * v11) - // * g_pCvar->FindVar("model_defaultFadeDistScale")->m_pParent->m_flValue, - // g_pCvar->FindVar("model_defaultFadeDistMin")->m_pParent->m_flValue); - // else - // v42 = v44 * v11; - // } - //} - //v45 = fmaxf(v42, 100.0); - //*(float*)(a1 + 16) = v45 * v45; - //v46 = (__m128i) * (unsigned int*)(v85 + 368); - //if (*(float*)v46.m128i_i32 <= 0.0) - //{ - // LOWORD(v49) = 0; - //} - //else - //{ - // *(float*)v46.m128i_i32 = *(float*)v46.m128i_i32 * *(float*)v46.m128i_i32; - // v47 = v46; - // *(float*)v47.m128i_i32 = fmaxf(*(float*)v46.m128i_i32, 1.0004883); - // v48 = v47; - // *(float*)v48.m128i_i32 = fminf(*(float*)v47.m128i_i32, 4293918700.0); - // v49 = (unsigned int)(_mm_cvtsi128_si32(v48) - 1065351168) >> 12; - //} - //*(_WORD*)(a1 + 6) = v49; - //v50 = *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 8) - // - *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 20); - //v51 = *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 4) - // - *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 16); - //v52 = *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1)) - // - *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 12); - //v53 = (float)((float)(v51 * v51) + (float)(v52 * v52)) + (float)(v50 * v50); - //if (v45 >= 227023.363449684) - // v9 = g_pCvar->FindVar("staticProp_no_fade_scalar")->m_pParent->m_flValue; - //v54 = 0; - //*(float*)(qword_141744E88 + 8i64 * a3) = v9 * (float)(1.0 / (float)(v53 * g_pCvar->FindVar("staticProp_gather_size_weight")->m_pParent->m_flValue)); - //v55 = qword_141744E88; - //*(_BYTE*)(qword_141744E88 + 8i64 * a3 + 4) &= 0xFEu; - //*(_BYTE*)(v55 + 8i64 * a3 + 4) |= v45 >= 227023.363449684; - //v56 = *(_QWORD*)(*(__int64(__fastcall**)(__int64, _QWORD))(*(_QWORD*)qword_14D40B328 + 160i64))(qword_14D40B328, *(unsigned __int16*)(a7 + 320)); - //v57 = *(unsigned __int16*)(a5 + 32); - //v77 = v56; - //v58 = v85 + *(int*)(v85 + 232) + 2i64 * v57 * *(_DWORD*)(v85 + 224); - //v59 = 0; - //v86 = v58; - //v84 = 0; - //if (*(int*)(v85 + 236) <= 0) - // return 0i64; - //v60 = 0i64; - //v74 = 0i64; - //do - //{ - // v61 = v60 + *(int*)(v43 + 240); - // v62 = 0; - // v63 = v43 + v61; - // v83 = 0; - // v75.m128_u64[0] = v63; - // if (*(int*)(v63 + 4) > 0) - // { - // v64 = 0i64; - // v80 = 0i64; - // do - // { - // v65 = 0; - // v66 = v63 + v64 + *(int*)(v63 + 12); - // if (*(int*)(v66 + 76) > 0) - // { - // v67 = v77; - // v68 = 0i64; - // do - // { - // v69 = *(void***)(v67 + 8i64 * *(__int16*)(v58 + 2i64 * *(int*)(v68 + *(int*)(v66 + 80) + v66))); - // if (!(*((unsigned __int8(__fastcall**)(void**)) * v69 + 86))(v69)) - // { - // if (!(*((unsigned __int8(__fastcall**)(void**)) * v69 + 32))(v69) && (*((unsigned __int8(__fastcall**)(void**)) * v69 + 31))(v69)) - // { - // v70 = 0i64; - // if (dword_141744EE8) - // { - // while (off_141744E70[v70 + 16] != v69) - // { - // v70 = (unsigned int)(v70 + 1); - // if ((unsigned int)v70 >= dword_141744EE8) - // goto LABEL_42; - // } - // } - // else - // { - // LABEL_42: - // off_141744E70[(unsigned int)dword_141744EE8++ + 16] = v69; - // } - // } - // if ((*((unsigned __int8(__fastcall**)(void**)) * v69 + 21))(v69) && (*((unsigned int(__fastcall**)(void**, __int64)) * v69 + 18))(v69, 1i64)) - // *(_BYTE*)(a1 + 5) |= 0x80u; - // if (!(*((unsigned __int8(__fastcall**)(void**)) * v69 + 48))(v69) && (*((unsigned int(__fastcall**)(void**, __int64)) * v69 + 18))(v69, 21844i64)) - // v54 |= 2u; - // v54 |= (*((unsigned __int8(__fastcall**)(void**)) * v69 + 48))(v69) != 0; - // } - // v58 = v86; - // ++v65; - // v68 += 92i64; - // } while (v65 < *(_DWORD*)(v66 + 76)); - // v63 = v75.m128_u64[0]; - // v62 = v83; - // v64 = v80; - // } - // ++v62; - // v64 += 136i64; - // v83 = v62; - // v80 = v64; - // } while (v62 < *(_DWORD*)(v63 + 4)); - // v43 = v85; - // v59 = v84; - // } - // ++v59; - // v60 = v74 + 16; - // v84 = v59; - // v74 += 16i64; - //} while (v59 < *(_DWORD*)(v43 + 236)); - //result = v54; - //if (v54) - // *(_BYTE*)(a1 + 5) &= 0x7Fu; - //return result; + static auto g_MdlCache = ADDRESS(0x14D40B328).RCast(); + static auto dword_1696A9D20 = *ADDRESS(0x1696A9D20).RCast(); + static auto sub_1404365A0 = ADDRESS(0x1404365A0).RCast(); + static auto qword_141744EA8 = *ADDRESS(0x141744EA8).RCast(); + static auto sub_140270130 = ADDRESS(0x140270130).RCast<__m128(*)(__m128*)>(); + static auto off_141731448 = ADDRESS(0x141731448).RCast(); + static auto sub_14028F170 = ADDRESS(0x14028F170).RCast(); + static auto qword_141744EA0 = *ADDRESS(0x141744EA0).RCast(); + static auto dword_141744EBC = *ADDRESS(0x141744EBC).RCast(); + static auto qword_141744E88 = *ADDRESS(0x141744E88).RCast(); + static auto dword_141744EE8 = *ADDRESS(0x141744EE8).RCast(); + static auto off_141744E70 = ADDRESS(0x141744E70).RCast(); + static auto sub_1401E7900 = ADDRESS(0x1401E7900).RCast<__int64(*)(void*, unsigned __int16, __int64)>(); + static auto sub_140257F20 = ADDRESS(0x140257F20).RCast<__int64(*)(void*, __int64, __m128i*, __int8*)>(); -return NULL; + v9 = 1.0; + v10 = a4; + *(_QWORD*)(a1 + 20) = *(_QWORD*)a5; + *(_DWORD*)(a1 + 28) = *(_DWORD*)(a5 + 8); + *(_DWORD*)(a1 + 8) = a4; + *(_QWORD*)&v11 = *(unsigned int*)(a5 + 24); + v12 = a4 >> 1; + *(float*)(a1 + 12) = 1.0 / (float)(*(float*)&v11 * *(float*)&v11); + v13 = *(unsigned __int16*)(a7 + 320); + *(_WORD*)a1 = v13; +// v14 = (*(__int64(__fastcall**)(void*, __int64, _QWORD))(*(_QWORD*)g_MdlCache + 104i64))(g_MdlCache, v13, 0i64); + v14 = sub_1401E7900(g_MdlCache, v13, 0i64); + v84 = v14; + if ((*(_BYTE*)(v14 + 156) & 0x10) == 0 && dword_1696A9D20 < 100) + ++dword_1696A9D20; + v15 = *(_BYTE*)(a5 + 30); + if (v15 > 2u && (unsigned __int8)(v15 - 6) > 2u) + { + v16 = (const char*)(*((__int64(__fastcall**)(void**, __int64))g_CModelLoader + 4))(&g_CModelLoader, a7); +#pragma warning( push ) +#pragma warning( disable : 4996) + strncpy(Destination, v16, 0x104ui64); +#pragma warning( pop ) + v15 = 0; + } + v17 = *(unsigned __int8*)(a5 + 32); + *(_BYTE*)(a1 + 4) = v17; + v18 = v17; + v19 = v17 < *(_DWORD*)(v14 + 228); + *(_BYTE*)(a1 + 5) = v15; + if (!v19) + v18 = 0; + *(_BYTE*)(a1 + 4) = v18; + v20 = *(_BYTE*)(a5 + 31); + if ((v20 & 4) != 0) + { + v15 |= 0x40u; + *(_BYTE*)(a1 + 5) = v15; + v20 = *(_BYTE*)(a5 + 31); + } + if ((v20 & 8) != 0) + { + v15 |= 0x20u; + *(_BYTE*)(a1 + 5) = v15; + v20 = *(_BYTE*)(a5 + 31); + } + if ((v20 & 0x30) != 16) + *(_BYTE*)(a1 + 5) = v15 | 0x10; + v21 = 0; + if (*(_WORD*)(a5 + 34) != 0xFFFF) + v21 = *(_WORD*)(a5 + 34); + *(_WORD*)(a1 + 2) = v21; + sub_1404365A0(v77, (const __m128i*)a5, (unsigned int*)(a5 + 12), v11); + v22 = qword_141744EA8; + v23 = v77[0]; + v24 = v77[1]; + v25 = v77[2]; + v26 = (unsigned __int64)(unsigned int)v12 << 6; + *(__m128*)(v26 + qword_141744EA8) = v77[0]; + *(__m128*)(v26 + v22 + 16) = v24; + *(__m128*)(v26 + v22 + 32) = v25; + auto m1 = _mm_set_ps(0.003922, 0.003922, 0.003922, 0.003922); + __m128i m2 = { 0 }; + __m128i m3 = { 0 }; + v74 = _mm_mul_ps(_mm_cvtepi32_ps(_mm_unpacklo_epi16(_mm_unpacklo_epi8(_mm_cvtsi32_si128(*(_DWORD*)(a5 + 52)), m2), m3)), m1); + v27 = sub_140270130(&v74); + *(__m128*)(v26 + qword_141744EA8 + 48) = v27; + sub_140257F20(&off_141731448, a7, &v71, &v71.m128i_i8[12]); + sub_14028F170((__int64)&v74, (__int64)&v74.m128_i64[1] + 4, v77, &v71, (const __m128i*) & v71.m128i_i8[12]); + v72 = v71.m128i_i8[12]; // may be wrong + v28 = qword_141744EA0; + v29 = 3 * v12; + v75 = (__int64)&v74.m128_i64[1] + 4; // may be wrong. + v30 = v75; + *(__m128*)(qword_141744EA0 + 8 * v29) = v74; + *(_QWORD*)(v28 + 8 * v29 + 16) = v30; + if ((v10 & 1) != 0) + { + v31 = dword_141744EBC; + v32 = v71; + *(_DWORD*)a2 = *(_DWORD*)(a6 + 48); + *(_DWORD*)(a2 + 4) = *(_DWORD*)(a6 + 52); + *(_QWORD*)(a2 + 8) = 0i64; + v33 = 3i64 * (unsigned int)(v31 + v12); + v34 = (unsigned __int64)(unsigned int)(v31 + v12) << 6; + v35 = qword_141744EA0; + *(__m128i*)(qword_141744EA0 + 8 * v33) = v32; + *(_QWORD*)(v35 + 8 * v33 + 16) = v72; + v36 = qword_141744EA8; + v37 = (unsigned __int64)(unsigned int)(v12 + 2 * v31) << 6; + *(__m128*)(v34 + qword_141744EA8) = v23; + *(__m128*)(v34 + v36 + 16) = v24; + *(__m128*)(v34 + v36 + 32) = v25; + *(__m128*)(v34 + qword_141744EA8 + 48) = v27; + v38 = qword_141744EA8; + *(__m128*)(v37 + qword_141744EA8) = v23; + *(__m128*)(v37 + v38 + 16) = v24; + *(__m128*)(v37 + v38 + 32) = v25; + *(__m128*)(v37 + qword_141744EA8 + 48) = v27; + v39 = (unsigned __int64)(unsigned int)(v31 + v12 + 2 * v31) << 6; + *(__m128*)(v39 + qword_141744EA8 + 48) = v27; + v40 = qword_141744EA8; + *(__m128*)(v39 + qword_141744EA8) = *(__m128*)a6; //*(_OWORD*)(v39 + qword_141744EA8) = *(_OWORD*)a6; + *(__m128*)(v39 + v40 + 16) = *(__m128*)(a6 + 16); //*(_OWORD*)(v39 + v40 + 16) = *(_OWORD*)(a6 + 16); + *(__m128*)(v39 + v40 + 32) = *(__m128*)(a6 + 32); //*(__m128*)(v40 + v41 + 32) = *(__m128*)(a6 + 32); + } + v41 = *(float*)(a5 + 36); + v42 = v84; + if (v41 <= 0.0) + { + if ((*(_DWORD*)(v84 + 156) & 0x800) != 0) + { + v41 = 227023.36; + } + else + { + v43 = *(float*)(v84 + 364); + if (v43 <= 0.0) + v41 = fmaxf( + (float)((float)(sqrt( + (float)((float)((float)(*(float*)v71.m128i_i32 - *(float*)&v71.m128i_i32[3]) * (float)(*(float*)v71.m128i_i32 - *(float*)&v71.m128i_i32[3])) + + (float)((float)(*(float*)&v71.m128i_i32[1] - *(float*)&v72) * (float)(*(float*)&v71.m128i_i32[1] - *(float*)&v72))) + + (float)((float)(*(float*)&v71.m128i_i32[2] - *((float*)&v72 + 1)) * (float)(*(float*)&v71.m128i_i32[2] - *((float*)&v72 + 1)))) + * 0.5) + * *(float*)&v11) + * g_pCVar->FindVar("model_defaultFadeDistScale")->GetFloat(), + g_pCVar->FindVar("model_defaultFadeDistScale")->GetFloat()); + else + v41 = v43 * *(float*)&v11; + } + } + v44 = fmaxf(v41, 100.0); + *(float*)(a1 + 16) = v44 * v44; + v45 = _mm_loadu_si32((unsigned int*)(v84 + 368)); //v45 = (__m128i)*(unsigned int*)(v84 + 368); + if (*(float*)v45.m128i_i32 <= 0.0) + { + LOWORD(v48) = 0; + } + else + { + *(float*)v45.m128i_i32 = *(float*)v45.m128i_i32 * *(float*)v45.m128i_i32; + v46 = v45; + *(float*)v46.m128i_i32 = fmaxf(*(float*)v45.m128i_i32, 1.0004883); + v47 = v46; + *(float*)v47.m128i_i32 = fminf(*(float*)v46.m128i_i32, 4293918700.0); + v48 = (unsigned int)(_mm_cvtsi128_si32(v47) - 1065351168) >> 12; + } + *(_WORD*)(a1 + 6) = v48; + v49 = *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 8) - *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 20); + v50 = *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 4) - *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 16); + v51 = *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1)) - *(float*)(qword_141744EA0 + 24 * ((unsigned __int64)*(unsigned int*)(a1 + 8) >> 1) + 12); + v52 = (float)((float)(v50 * v50) + (float)(v51 * v51)) + (float)(v49 * v49); + if (v44 >= 227023.363449684) + v9 = g_pCVar->FindVar("staticProp_no_fade_scalar")->GetFloat(); + v53 = 0; + *(float*)(qword_141744E88 + 8i64 * a3) = v9 * (float)(1.0 / (float)(v52 * g_pCVar->FindVar("staticProp_gather_size_weight")->GetFloat())); + v54 = qword_141744E88; + *(_BYTE*)(qword_141744E88 + 8i64 * a3 + 4) &= 0xFEu; + *(_BYTE*)(v54 + 8i64 * a3 + 4) |= v44 >= 227023.363449684; + v55 = *(_QWORD*)(*(__int64(__fastcall**)(void*, _QWORD))(*(_QWORD*)g_MdlCache + 160i64))(g_MdlCache, *(unsigned __int16*)(a7 + 320)); + v56 = *(unsigned __int16*)(a5 + 0x20); + v76 = v55; + v57 = v84 + *(int*)(v84 + 232) + 2i64 * v56 * *(_DWORD*)(v84 + 224); + v58 = 0; + v85 = v57; + v83 = 0; + if (*(int*)(v84 + 236) <= 0) + return 0i64; + v59 = 0i64; + v73 = 0i64; + do + { + v60 = v59 + *(int*)(v42 + 240); + v61 = 0; + v62 = v42 + v60; + v82 = 0; + v74.m128_u64[0] = v62; + if (*(int*)(v62 + 4) > 0) + { + v63 = 0i64; + v79 = 0i64; + do + { + v64 = 0; + v65 = v62 + v63 + *(int*)(v62 + 12); + if (*(int*)(v65 + 76) > 0) + { + v66 = v76; + v67 = 0i64; + do + { + v68 = *(void**)(v66 + 8i64 * *(__int16*)(v57 + 2i64 * *(int*)(v67 + *(int*)(v65 + 80) + v65))); + if (!(*(unsigned __int8(__fastcall**)(void*))(*(_QWORD*)v68 + 688i64))(v68)) + { + if (!(*(unsigned __int8(__fastcall**)(void*))(*(_QWORD*)v68 + 256i64))(v68) && (*(unsigned __int8(__fastcall**)(void*))(*(_QWORD*)v68 + 248i64))(v68)) + { + v69 = 0i64; + if (dword_141744EE8) + { + while (*(&off_141744E70 + v69 + 16) != v68) + { + v69 = (unsigned int)(v69 + 1); + if ((unsigned int)v69 >= dword_141744EE8) + goto LABEL_42; + } + } + else + { + LABEL_42: + *(&off_141744E70 + (unsigned int)dword_141744EE8++ + 16) = v68; + } + } + if ((*(unsigned __int8(__fastcall**)(void*))(*(_QWORD*)v68 + 168i64))(v68) && (*(unsigned int(__fastcall**)(void*, __int64))(*(_QWORD*)v68 + 144i64))(v68, 1i64)) + *(_BYTE*)(a1 + 5) |= 0x80u; + if (!(*(unsigned __int8(__fastcall**)(void*))(*(_QWORD*)v68 + 384i64))(v68) && (*(unsigned int(__fastcall**)(void*, __int64))(*(_QWORD*)v68 + 144i64))(v68, 21844i64)) + v53 |= 2u; + v53 |= (*(unsigned __int8(__fastcall**)(void*))(*(_QWORD*)v68 + 384i64))(v68) != 0; + } + v57 = v85; + ++v64; + v67 += 92i64; + } while (v64 < *(_DWORD*)(v65 + 76)); + v62 = v74.m128_u64[0]; + v61 = v82; + v63 = v79; + } + ++v61; + v63 += 136i64; + v82 = v61; + v79 = v63; + } while (v61 < *(_DWORD*)(v62 + 4)); + v42 = v84; + v58 = v83; + } + ++v58; + v59 = v73 + 16; + v83 = v58; + v73 += 16i64; + } while (v58 < *(_DWORD*)(v42 + 236)); + result = v53; + if (v53) + *(_BYTE*)(a1 + 5) &= 0x7Fu; + return result; } void BspLib_Attach()