diff --git a/r5dev/bsplib/bsplib.cpp b/r5dev/bsplib/bsplib.cpp deleted file mode 100644 index 81310b33..00000000 --- a/r5dev/bsplib/bsplib.cpp +++ /dev/null @@ -1,447 +0,0 @@ -#include "core/stdafx.h" -#include "tier1/cvar.h" -#include "datacache/mdlcache.h" -#include "common/pseudodefs.h" -#include "materialsystem/cmaterialsystem.h" -#include "materialsystem/cmaterialglue.h" -#include "engine/host_state.h" -#include "engine/modelloader.h" -#include "bsplib/bsplib.h" - -//void* __fastcall BuildPropStaticFrustumCullMap(int64_t a1, int64_t a2, unsigned int a3, unsigned int a4, int64_t a5, int64_t a6, int64_t 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 -// void* 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; // <-- Data written here is incorrect [v41 used in the 'fmaxf' operation is most likely computed wrong]! -// v45 = _mm_castps_si128(_mm_load_ss(&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; // <-- DEBUG! -// 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))); -// -// static CModule::ModuleSections_t mData = g_GameDll.GetSectionByName(".data"); -// static CModule::ModuleSections_t mPData = g_GameDll.GetSectionByName(".pdata"); -// if (reinterpret_cast(v68) < mData.m_pSectionBase || -// reinterpret_cast(v68) > mPData.m_pSectionBase) // Check bounds (data could only be within the '.data' segment. -// continue; -// -// 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(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 = (void*)v53; -// if (v53) -// *(_BYTE*)(a1 + 5) &= 0x7Fu; -// return result; -//} - -//----------------------------------------------------------------------------- -// Purpose: calculates the view frustum culling data foreach static prop -//----------------------------------------------------------------------------- -void* __fastcall BuildPropStaticFrustumCullMap(int64_t a1, int64_t a2, unsigned int a3, unsigned int a4, int64_t a5, int64_t a6, int64_t a7) -{ - if (staticProp_defaultBuildFrustum->GetBool()) - return v_BuildPropStaticFrustumCullMap(a1, a2, a3, a4, a5, a6, a7); - - MDLHandle_t handle; // dx - studiohdr_t *studio; // rbx - double v54; // xmm7_8 - int64_t v55; // rcx - int v56; // eax - int64_t v57; // rcx - int v58; // edx - int64_t v59; // rax - int64_t v60; // r13 - int v61; // eax - char *v62; // r13 - int64_t v63; // rdx - int v64; // er14 - char *v65; // rdi - int64_t v67; // r15 - void *v68; // rbx - int64_t v73; // [rsp+50h] [rbp-B8h] - bool error = false; - - handle = *reinterpret_cast(a7 + 0x140); - studio = g_MDLCache->FindMDL(g_MDLCache, handle, nullptr); - v55 = *reinterpret_cast(g_MDLCache->GetMaterialTable(g_MDLCache, *reinterpret_cast((a7 + 320)))); // Gets some object containing pointer to 2 CMaterialGlue vtables. - v56 = *reinterpret_cast(a5 + 0x20); - v57 = reinterpret_cast(studio) + 2i64 * v56 * studio->numskinref + studio->skinindex; - v58 = 0; - if (studio->numbodyparts <= 0) - return nullptr; - v59 = 0i64; - v73 = 0i64; - do - { - v60 = v59 + studio->bodypartindex; - v61 = 0; - v62 = reinterpret_cast(studio) + v60; - if (*((int*)v62 + 1) > 0) - { - v63 = 0i64; - do - { - v64 = 0; - v65 = &v62[v63 + *((int*)v62 + 3)]; - if (*((int*)v65 + 19) > 0) - { - v67 = 0i64; - do - { - v68 = *(void**)(v55 + 8i64 * *(__int16*)(v57 + 2i64 * *(int*)(v67 + *(int*)(v65 + 80) + v65))); - ++v64; - v67 += 92i64; - - if (reinterpret_cast(v68) < g_GameDll.m_RunTimeData.m_pSectionBase || // Check bounds (data is mostly within the '.data' segment. - reinterpret_cast(v68) > g_GameDll.m_ExceptionTable.m_pSectionBase || error) - { - if (!CMaterialSystem::IsMaterialInternal(reinterpret_cast(v68))) // Last chance. - { - error = true; - continue; - } - } - } while (v64 < *((int*)v65 + 19)); - } - ++v61; - v63 += 136i64; - } while (v61 < *((int*)v62 + 1)); - } - ++v58; - v59 = v73 + 16; - v73 += 16i64; - } while (v58 < studio->numbodyparts); - - if (error) // Don't use engine's implementation if batch contains errors! - { - *(MDLHandle_t*)a1 = handle; - *(_QWORD*)&v54 = *(unsigned int*)(a5 + 24); - *(_DWORD*)(a1 + 8) = a4; - *(float*)(a1 + 12) = 1.0f / (float)(*(float*)&v54 * *(float*)&v54); - *(float*)(a1 + 16) = 227023.36f * 227023.36f; // STUDIOHDR_FLAGS_NO_FORCED_FADE - *(_QWORD*)(a1 + 20) = *(_QWORD*)a5; - *(_DWORD*)(a1 + 28) = *(_DWORD*)(a5 + 8); - - return nullptr; - } - return v_BuildPropStaticFrustumCullMap(a1, a2, a3, a4, a5, a6, a7); -} - -void VBspLib::Attach() const -{ -#ifndef DEDICATED - DetourAttach((LPVOID*)&v_BuildPropStaticFrustumCullMap, &BuildPropStaticFrustumCullMap); -#endif // !DEDICATED -} - -void VBspLib::Detach() const -{ -#ifndef DEDICATED - DetourDetach((LPVOID*)&v_BuildPropStaticFrustumCullMap, &BuildPropStaticFrustumCullMap); -#endif // !DEDICATED -} diff --git a/r5dev/bsplib/bsplib.h b/r5dev/bsplib/bsplib.h deleted file mode 100644 index edd6483e..00000000 --- a/r5dev/bsplib/bsplib.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once - - -inline CMemory p_BuildPropStaticFrustumCullMap; -inline auto v_BuildPropStaticFrustumCullMap = p_BuildPropStaticFrustumCullMap.RCast(); - -//inline void** (*sub_1404365A0)(__m128*, const __m128i*, __m128i*, double) = nullptr; -//inline __m128 (*sub_140270130)(__m128*) = nullptr; -//inline const __m128i* (*sub_14028F170)(__int64, __int64, __m128*, const __m128i*, const __m128i*) = nullptr; -//inline int64_t(*sub_140257F20)(void*, __int64, __m128i*, __int8*) = nullptr; -// -//inline int32_t* dword_1696A9D20 = nullptr; -//inline int32_t* dword_141744EBC = nullptr; -//inline int32_t* dword_141744EE8 = nullptr; -// -//inline int64_t* qword_141744EA8 = nullptr; -//inline int64_t* qword_141744EA0 = nullptr; -//inline int64_t* qword_141744E88 = nullptr; -// -//inline __m128* xmmword_1415BD270 = nullptr; -// -//inline void* off_141744E70 = nullptr; -//inline void* off_141731448 = nullptr; - -void* __fastcall BuildPropStaticFrustumCullMap(int64_t a1, int64_t a2, unsigned int a3, unsigned int a4, int64_t a5, int64_t a6, int64_t a7); - -/////////////////////////////////////////////////////////////////////////////// -class VBspLib : public IDetour -{ - virtual void GetAdr(void) const - { - LogFunAdr("BuildPropStaticFrustumCullMap", p_BuildPropStaticFrustumCullMap.GetPtr()); - //LogFunAdr("sub_1404365A0", reinterpret_cast(sub_1404365A0)); - //LogFunAdr("sub_140270130", reinterpret_cast(sub_140270130)); - //LogFunAdr("sub_14028F170", reinterpret_cast(sub_14028F170)); - //LogFunAdr("sub_140257F20", reinterpret_cast(sub_140257F20)); - //LogVarAdr("dword_1696A9D20", reinterpret_cast(dword_1696A9D20)); - //LogVarAdr("dword_141744EBC", reinterpret_cast(dword_141744EBC)); - //LogVarAdr("dword_141744EE8", reinterpret_cast(dword_141744EE8)); - //LogVarAdr("qword_141744EA8", reinterpret_cast(qword_141744EA8)); - //LogVarAdr("qword_141744EA0", reinterpret_cast(qword_141744EA0)); - //LogVarAdr("qword_141744E88", reinterpret_cast(qword_141744E88)); - //LogVarAdr("xmmword_1415BD270", reinterpret_cast(xmmword_1415BD270)); - //LogVarAdr("off_141744E70", reinterpret_cast(off_141744E70)); - //LogVarAdr("off_141731448", reinterpret_cast(off_141731448)); - } - virtual void GetFun(void) const - { - p_BuildPropStaticFrustumCullMap = g_GameDll.FindPatternSIMD("48 8B C4 44 89 40 18 48 89 50 10 55"); /*48 8B C4 44 89 40 18 48 89 50 10 55*/ - v_BuildPropStaticFrustumCullMap = p_BuildPropStaticFrustumCullMap.RCast(); - - //sub_1404365A0 = g_GameDll.FindPatternSIMD("48 8B C4 48 83 EC 78 F3 41 0F 10 48 ??").RCast(); - //sub_140270130 = g_GameDll.FindPatternSIMD("48 83 EC 28 66 0F 6F 15 ?? ?? ?? ??").RCast<__m128(*)(__m128*)>(); - //sub_14028F170 = g_GameDll.FindPatternSIMD("48 83 EC 58 F3 41 0F 7E 11").RCast(); - //sub_140257F20 = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 57 48 83 EC 20 49 8B D9 49 8B F8 48 85 D2").RCast<__int64(*)(void*, __int64, __m128i*, __int8*)>(); - } - virtual void GetVar(void) const - { -// dword_1696A9D20 = p_BuildPropStaticFrustumCullMap.FindPattern("89 0D").ResolveRelativeAddressSelf(0x2, 0x6).RCast(); -// dword_141744EBC = p_BuildPropStaticFrustumCullMap.Offset(0x200).FindPattern("44 8B").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); -// dword_141744EE8 = p_BuildPropStaticFrustumCullMap.Offset(0x550).FindPattern("8B 15").ResolveRelativeAddressSelf(0x2, 0x6).RCast(); -// -// qword_141744EA8 = p_BuildPropStaticFrustumCullMap.Offset(0x150).FindPattern("48 8B").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); -// qword_141744EA0 = p_BuildPropStaticFrustumCullMap.Offset(0x220).FindPattern("48 8B").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); -// qword_141744E88 = p_BuildPropStaticFrustumCullMap.Offset(0x4E0).FindPattern("48 8B").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); -// -// xmmword_1415BD270 = p_BuildPropStaticFrustumCullMap.Offset(0x1A0).FindPattern("0F 59").ResolveRelativeAddressSelf(0x3, 0x7).RCast<__m128*>(); -// -// off_141744E70 = p_BuildPropStaticFrustumCullMap.Offset(0x550).FindPattern("4C 8D").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); -//#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1) -// off_141731448 = p_CalcPropStaticFrustumCulling.Offset(0x1F0).FindPattern("48 ?? ?? ?? ?? ?? 01").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); -//#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3) -// off_141731448 = p_BuildPropStaticFrustumCullMap.Offset(0x200).FindPattern("48 ?? ?? ?? ?? ?? 01").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); -//#endif - } - virtual void GetCon(void) const { } - virtual void Attach(void) const; - virtual void Detach(void) const; -}; -/////////////////////////////////////////////////////////////////////////////// diff --git a/r5dev/core/init.cpp b/r5dev/core/init.cpp index c0f07da4..bdaa2a71 100644 --- a/r5dev/core/init.cpp +++ b/r5dev/core/init.cpp @@ -38,7 +38,7 @@ #include "codecs/miles/radshal_wasapi.h" #endif // !DEDICATED #include "vphysics/QHull.h" -#include "bsplib/bsplib.h" +#include "engine/staticpropmgr.h" #include "materialsystem/cmaterialsystem.h" #ifndef DEDICATED #include "materialsystem/cmaterialglue.h" @@ -426,8 +426,8 @@ void DetourRegister() // Register detour classes to be searched and hooked. // VPhysics REGISTER(VQHull); - // BspLib - REGISTER(VBspLib); + // StaticPropMgr + REGISTER(VStaticPropMgr); // MaterialSystem REGISTER(VMaterialSystem); diff --git a/r5dev/engine/staticpropmgr.cpp b/r5dev/engine/staticpropmgr.cpp new file mode 100644 index 00000000..9f23b96b --- /dev/null +++ b/r5dev/engine/staticpropmgr.cpp @@ -0,0 +1,37 @@ +#include "core/stdafx.h" +#include "datacache/mdlcache.h" +#include "engine/staticpropmgr.h" + +//----------------------------------------------------------------------------- +// Purpose: initialises static props from the static prop gamelump +//----------------------------------------------------------------------------- +void* __fastcall CStaticProp_Init(int64_t thisptr, int64_t a2, unsigned int idx, unsigned int a4, StaticPropLump_t* lump, int64_t a6, int64_t a7) +{ + MDLHandle_t handle = *reinterpret_cast(a7 + 0x140); + studiohdr_t* pStudioHdr = g_MDLCache->FindMDL(g_MDLCache, handle, nullptr); + + if (lump->m_Skin >= pStudioHdr->numskinfamilies) + { + Error(eDLL_T::ENGINE, NO_ERROR, + "Invalid skin index for static prop %i with model '%s' (got %i, max %i)\n", + idx, pStudioHdr->name, lump->m_Skin, pStudioHdr->numskinfamilies-1); + + lump->m_Skin = 0; + } + + return v_CStaticProp_Init(thisptr, a2, idx, a4, lump, a6, a7); +} + +void VStaticPropMgr::Attach() const +{ +#ifndef DEDICATED + DetourAttach((LPVOID*)&v_CStaticProp_Init, &CStaticProp_Init); +#endif // !DEDICATED +} + +void VStaticPropMgr::Detach() const +{ +#ifndef DEDICATED + DetourDetach((LPVOID*)&v_CStaticProp_Init, &CStaticProp_Init); +#endif // !DEDICATED +} diff --git a/r5dev/engine/staticpropmgr.h b/r5dev/engine/staticpropmgr.h new file mode 100644 index 00000000..90bb3b53 --- /dev/null +++ b/r5dev/engine/staticpropmgr.h @@ -0,0 +1,46 @@ +#pragma once + +struct StaticPropLump_t +{ + Vector3D m_Origin; + Vector3D m_Angles; + float m_Scale; + short m_PropType; + char m_Solid; + char m_Flags; + short m_Skin; + short m_EnvCubemap; + float m_FadeDist; + Vector3D m_LightingOrigin; + int m_DiffuseModulation; + char gap_38[4]; + int m_collisionFlagsRemove; +}; + +inline CMemory p_CStaticProp_Init; +inline auto v_CStaticProp_Init = p_CStaticProp_Init.RCast(); + +void* __fastcall CStaticProp_Init(int64_t thisptr, int64_t a2, unsigned int idx, unsigned int a4, StaticPropLump_t* lump, int64_t a6, int64_t a7); + +/////////////////////////////////////////////////////////////////////////////// +class VStaticPropMgr : public IDetour +{ + virtual void GetAdr(void) const + { + LogFunAdr("CStaticProp::Init", p_CStaticProp_Init.GetPtr()); + + } + virtual void GetFun(void) const + { + p_CStaticProp_Init = g_GameDll.FindPatternSIMD("48 8B C4 44 89 40 18 48 89 50 10 55"); /*48 8B C4 44 89 40 18 48 89 50 10 55*/ + v_CStaticProp_Init = p_CStaticProp_Init.RCast(); + } + virtual void GetVar(void) const + { + + } + virtual void GetCon(void) const { } + virtual void Attach(void) const; + virtual void Detach(void) const; +}; +/////////////////////////////////////////////////////////////////////////////// diff --git a/r5dev/materialsystem/cmaterialsystem.cpp b/r5dev/materialsystem/cmaterialsystem.cpp index 11d91b96..97d933bb 100644 --- a/r5dev/materialsystem/cmaterialsystem.cpp +++ b/r5dev/materialsystem/cmaterialsystem.cpp @@ -9,7 +9,6 @@ #include "vpc/keyvalues.h" #include "rtech/rtech_utils.h" #include "engine/cmodel_bsp.h" -#include "bsplib/bsplib.h" #include "materialsystem/cmaterialglue.h" #include "materialsystem/cmaterialsystem.h" diff --git a/r5dev/vproj/clientsdk.vcxproj b/r5dev/vproj/clientsdk.vcxproj index e4ca2fb1..9970302f 100644 --- a/r5dev/vproj/clientsdk.vcxproj +++ b/r5dev/vproj/clientsdk.vcxproj @@ -16,7 +16,6 @@ - @@ -55,6 +54,7 @@ + @@ -182,7 +182,6 @@ - @@ -233,6 +232,7 @@ + diff --git a/r5dev/vproj/clientsdk.vcxproj.filters b/r5dev/vproj/clientsdk.vcxproj.filters index 84459b12..921013ed 100644 --- a/r5dev/vproj/clientsdk.vcxproj.filters +++ b/r5dev/vproj/clientsdk.vcxproj.filters @@ -79,9 +79,6 @@ {d914384a-56bc-4829-977b-5900f01b5612} - - {336e3141-0276-4cd5-a836-585eef681b7b} - {55bb4f60-5f5a-4780-a7a2-b3db51c53680} @@ -324,9 +321,6 @@ sdk\vpklib - - sdk\bsplib - sdk\mathlib @@ -678,6 +672,9 @@ sdk\tier1 + + sdk\engine + @@ -821,9 +818,6 @@ sdk\mathlib - - sdk\bsplib - sdk\common @@ -1727,6 +1721,9 @@ sdk\public\tier0 + + sdk\engine + diff --git a/r5dev/vproj/dedicated.vcxproj b/r5dev/vproj/dedicated.vcxproj index d3fff6db..dfa03dad 100644 --- a/r5dev/vproj/dedicated.vcxproj +++ b/r5dev/vproj/dedicated.vcxproj @@ -198,7 +198,6 @@ - @@ -237,6 +236,7 @@ + @@ -518,7 +518,6 @@ - @@ -548,6 +547,7 @@ + diff --git a/r5dev/vproj/dedicated.vcxproj.filters b/r5dev/vproj/dedicated.vcxproj.filters index b5d268da..f86c003d 100644 --- a/r5dev/vproj/dedicated.vcxproj.filters +++ b/r5dev/vproj/dedicated.vcxproj.filters @@ -64,9 +64,6 @@ {e7189077-ca26-4a4e-bb60-eec7e5a1bafc} - - {8288ba1a-7609-42ef-af3b-850727635a99} - {da2c5c3d-eff4-404f-af3f-e30ec17dcc1a} @@ -291,9 +288,6 @@ sdk\mathlib - - sdk\bsplib - sdk\common @@ -1137,6 +1131,9 @@ sdk\public\tier0 + + sdk\engine + @@ -1205,9 +1202,6 @@ sdk\vpklib - - sdk\bsplib - sdk\mathlib @@ -1529,6 +1523,9 @@ sdk\tier1 + + sdk\engine + diff --git a/r5dev/vproj/gamesdk.vcxproj b/r5dev/vproj/gamesdk.vcxproj index a527f8ac..87739b61 100644 --- a/r5dev/vproj/gamesdk.vcxproj +++ b/r5dev/vproj/gamesdk.vcxproj @@ -16,7 +16,6 @@ - @@ -59,6 +58,7 @@ + @@ -201,7 +201,6 @@ - @@ -257,6 +256,7 @@ + diff --git a/r5dev/vproj/gamesdk.vcxproj.filters b/r5dev/vproj/gamesdk.vcxproj.filters index f86cadbf..e9b61f27 100644 --- a/r5dev/vproj/gamesdk.vcxproj.filters +++ b/r5dev/vproj/gamesdk.vcxproj.filters @@ -82,9 +82,6 @@ {d914384a-56bc-4829-977b-5900f01b5612} - - {336e3141-0276-4cd5-a836-585eef681b7b} - {55bb4f60-5f5a-4780-a7a2-b3db51c53680} @@ -339,9 +336,6 @@ sdk\vpklib - - sdk\bsplib - sdk\mathlib @@ -744,6 +738,9 @@ sdk\tier1 + + sdk\engine + @@ -890,9 +887,6 @@ sdk\mathlib - - sdk\bsplib - sdk\common @@ -1898,6 +1892,9 @@ sdk\public\tier0 + + sdk\engine +