mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
This has to be debugged still as the computed data does not match the one computed from the engine (this is the reason the larger maps show artifacts!)
352 lines
14 KiB
C++
352 lines
14 KiB
C++
#include "core/stdafx.h"
|
|
#include "tier1/cvar.h"
|
|
#include "datacache/mdlcache.h"
|
|
#include "common/pseudodefs.h"
|
|
#include "materialsystem/cmaterialglue.h"
|
|
#include "engine/host_state.h"
|
|
#include "engine/modelloader.h"
|
|
#include "bsplib/bsplib.h"
|
|
|
|
struct CStaticPropMaterialGlue
|
|
{
|
|
void* m_pVTable0;
|
|
void* m_pVTable1;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: calculates the view frustum culling data per static prop
|
|
//-----------------------------------------------------------------------------
|
|
__int64 __fastcall BuildPropStaticFrustumCullMap(__int64 a1, __int64 a2, unsigned int a3, unsigned int a4, __int64 a5, __int64 a6, __int64 a7)
|
|
{
|
|
if (staticProp_defaultBuildFrustum->GetBool())
|
|
return v_BuildPropStaticFrustumCullMap(a1, a2, a3, a4, a5, a6, a7);
|
|
|
|
float v9; // xmm6_4
|
|
char v10; // r13
|
|
double v11; // xmm7_8
|
|
__int64 v12; // rsi
|
|
MDLHandle_t mdlhandle; // dx
|
|
studiohdr_t* studio; // 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
|
|
studiohdr_t* 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
|
|
char* v62; // r13
|
|
__int64 v63; // rdx
|
|
int v64; // er14
|
|
char* v65; // rdi
|
|
__int64 v66; // r13
|
|
__int64 v67; // r15
|
|
void* v68; // rbx
|
|
int32_t 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]
|
|
studiohdr_t* v84; // [rsp+298h] [rbp+190h]
|
|
__int64 v85; // [rsp+2A8h] [rbp+1A0h]
|
|
|
|
v9 = 1.0f;
|
|
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.0f / (float)(*(float*)&v11 * *(float*)&v11);
|
|
mdlhandle = *(unsigned __int16*)(a7 + 0x140);
|
|
*(MDLHandle_t*)a1 = mdlhandle;
|
|
studio = CMDLCache::FindMDL(g_MDLCache, mdlhandle, nullptr);
|
|
v84 = studio;
|
|
if ((studio->flags & STUDIOHDR_FLAGS_STATIC_PROP) == 0 && (*dword_1696A9D20) < 0x64)
|
|
++(*dword_1696A9D20);
|
|
v15 = *(_BYTE*)(a5 + 30);
|
|
if (v15 > 2u && (unsigned __int8)(v15 - 6) > 2u)
|
|
{
|
|
v16 = (const char*)(*((__int64(__fastcall**)(CModelLoader**, __int64))g_pModelLoader + 4))(&g_pModelLoader, a7);
|
|
strncpy(Destination, v16, 0x104ui64);
|
|
v15 = 0;
|
|
}
|
|
v17 = *(unsigned __int8*)(a5 + 32);
|
|
*(_BYTE*)(a1 + 4) = v17;
|
|
v18 = v17;
|
|
v19 = v17 < studio->numskinfamilies;
|
|
*(_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, (__m128i*)(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;
|
|
__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)), (*xmmword_1415BD270));
|
|
v27 = sub_140270130(&v74);
|
|
*(__m128*)(v26 + (*qword_141744EA8) + 48) = v27;// DIFF 1
|
|
(*((void(__fastcall**)(void**, __int64, __m128i*, __int8*))*(void**)off_141731448 + 10))(&*(void**)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]);
|
|
v28 = *qword_141744EA0;
|
|
v29 = 3 * v12;
|
|
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.0f)
|
|
{
|
|
if ((v84->flags & STUDIOHDR_FLAGS_NO_FORCED_FADE) != 0)
|
|
{
|
|
v41 = 227023.36f;
|
|
}
|
|
else
|
|
{
|
|
v43 = v84->fadeDist;
|
|
if (v43 <= 0.0f)
|
|
v41 = fmaxf(
|
|
(float)((float)(sqrtf(
|
|
(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)
|
|
* model_defaultFadeDistScale->GetFloat(),
|
|
model_defaultFadeDistMin->GetFloat());
|
|
else
|
|
v41 = v43 * *(float*)&v11;
|
|
}
|
|
}
|
|
v44 = fmaxf(v41, 100.0f);
|
|
*(float*)(a1 + 16) = v44 * v44;
|
|
v45 = _mm_loadu_si32(&v84->gatherSize);
|
|
if (*(float*)v45.m128i_i32 <= 0.0f)
|
|
{
|
|
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.0004883f);
|
|
v47 = v46;
|
|
*(float*)v47.m128i_i32 = fminf(*(float*)v46.m128i_i32, 4293918700.0f);
|
|
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.363449684f)
|
|
v9 = staticProp_no_fade_scalar->GetFloat();
|
|
v53 = 0;
|
|
*(float*)((*qword_141744E88) + 8i64 * a3) = v9 * (float)(1.0f / (float)(v52 * staticProp_gather_size_weight->GetFloat()));
|
|
v54 = *qword_141744E88;
|
|
*(_BYTE*)((*qword_141744E88) + 8i64 * a3 + 4) &= 0xFEu;
|
|
*(_BYTE*)(v54 + 8i64 * a3 + 4) |= v44 >= 227023.363449684f;
|
|
v55 = (__int64)CMDLCache::GetStudioMaterialGlue(g_MDLCache, *(unsigned __int16*)(a7 + 320)); // Gets some object containing pointer to 2 CMaterialGlue vtables.
|
|
v56 = *(unsigned __int16*)(a5 + 0x20);
|
|
v76 = *(__int64*)v55;
|
|
v57 = (__int64)v84 + 2 * v56 * v84->numskinref + v84->skinindex;
|
|
v58 = 0;
|
|
v85 = v57;
|
|
v83 = 0;
|
|
if (v84->numbodyparts <= 0)
|
|
return 0i64;
|
|
v59 = 0i64;
|
|
v73 = 0i64;
|
|
do
|
|
{
|
|
v60 = v59 + v42->bodypartindex;
|
|
v61 = 0;
|
|
v62 = (char*)v42 + v60;
|
|
v82 = 0;
|
|
v74.m128_u64[0] = (unsigned __int64)v62;
|
|
if (*((int*)v62 + 1) > 0)
|
|
{
|
|
v63 = 0i64;
|
|
v79 = 0i64;
|
|
do
|
|
{
|
|
v64 = 0;
|
|
v65 = &v62[v63 + *((int*)v62 + 3)];
|
|
if (*((int*)v65 + 19) > 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 = 0;
|
|
if (*dword_141744EE8)
|
|
{
|
|
// Compares equality of pointers to the CMaterial object
|
|
// between the current offset [v69] in the CStaticPropMgr buffer
|
|
// and that of v68 (obtained via operation in parent loop).
|
|
|
|
while (*(&*(void**)off_141744E70 + v69 + 16) != v68)
|
|
{
|
|
v69++;// = (unsigned int)(v69 + 1);
|
|
|
|
if (static_cast<int32_t>(v69) >= *dword_141744EE8)
|
|
goto LABEL_42;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LABEL_42:
|
|
*(&*(void**)off_141744E70 + (*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 + 19));
|
|
v62 = (char*)v74.m128_u64[0];
|
|
v61 = v82;
|
|
v63 = v79;
|
|
}
|
|
++v61;
|
|
v63 += 136i64;
|
|
v82 = v61;
|
|
v79 = v63;
|
|
} while (v61 < *((_DWORD*)v62 + 1));
|
|
v42 = v84;
|
|
v58 = v83;
|
|
}
|
|
++v58;
|
|
v59 = v73 + 16;
|
|
v83 = v58;
|
|
v73 += 16i64;
|
|
} while (v58 < v42->numbodyparts);
|
|
result = v53;
|
|
if (v53)
|
|
*(_BYTE*)(a1 + 5) &= 0x7Fu;
|
|
return result;
|
|
}
|
|
|
|
void BspLib_Attach()
|
|
{
|
|
DetourAttach((LPVOID*)&v_BuildPropStaticFrustumCullMap, &BuildPropStaticFrustumCullMap);
|
|
}
|
|
|
|
void BspLib_Detach()
|
|
{
|
|
DetourDetach((LPVOID*)&v_BuildPropStaticFrustumCullMap, &BuildPropStaticFrustumCullMap);
|
|
}
|