From fc1c911c8142346a738964b9f7c0c0ae98e21bc3 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:19:31 +0100 Subject: [PATCH] VPhysics: add CPhysicsCollision singleton Used for CStudioVCollide::~CStudioVCollide(). --- src/core/init.cpp | 2 ++ src/datacache/mdlcache.h | 10 +++--- src/public/vphysics/vphysics_interface.h | 40 +++++++++++++++++++++ src/vphysics/CMakeLists.txt | 2 ++ src/vphysics/physics_collide.cpp | 8 +++++ src/vphysics/physics_collide.h | 44 ++++++++++++++++++++++++ 6 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 src/public/vphysics/vphysics_interface.h create mode 100644 src/vphysics/physics_collide.h diff --git a/src/core/init.cpp b/src/core/init.cpp index 82f0b5f4..a6603cbe 100644 --- a/src/core/init.cpp +++ b/src/core/init.cpp @@ -38,6 +38,7 @@ #include "codecs/miles/miles_impl.h" #include "codecs/miles/radshal_wasapi.h" #endif // !DEDICATED +#include "vphysics/physics_collide.h" #include "vphysics/QHull.h" #include "engine/staticpropmgr.h" #include "materialsystem/cmaterialsystem.h" @@ -502,6 +503,7 @@ void DetourRegister() // Register detour classes to be searched and hooked. #endif // !DEDICATED // VPhysics + REGISTER(VPhysicsCollide); REGISTER(VQHull); // StaticPropMgr diff --git a/src/datacache/mdlcache.h b/src/datacache/mdlcache.h index 8570d4b2..b471298d 100644 --- a/src/datacache/mdlcache.h +++ b/src/datacache/mdlcache.h @@ -7,7 +7,7 @@ #include "datacache/imdlcache.h" #include "public/studio.h" #include "public/vphysics/phyfile.h" -#include "public/vphysics/vcollide.h" +#include "vphysics/physics_collide.h" #include "public/rtech/ipakfile.h" class CStudioFallbackHandler @@ -105,10 +105,10 @@ private: struct CStudioVCollide : public CRefCounted<> { public: - //~CStudioVCollide() // TODO: add g_PhysicsCollision to SDK - //{ - // g_pPhysicsCollision->VCollideUnload(&m_vcollide); - //} + ~CStudioVCollide() + { + PhysicsCollision()->VCollideUnload(&m_vcollide); + } vcollide_t* GetVCollide() { return &m_vcollide; diff --git a/src/public/vphysics/vphysics_interface.h b/src/public/vphysics/vphysics_interface.h new file mode 100644 index 00000000..c5ab473c --- /dev/null +++ b/src/public/vphysics/vphysics_interface.h @@ -0,0 +1,40 @@ +//=============================================================================// +// +// Purpose: Public interfaces to vphysics DLL +// +// $NoKeywords: $ +//=============================================================================// +#ifndef VPHYSICS_INTERFACE_H +#define VPHYSICS_INTERFACE_H +#include "public/vphysics/vcollide.h" + +#define VPHYSICS_COLLISION_INTERFACE_VERSION "VPhysicsCollision007" + +abstract_class IPhysicsCollision +{ +public: + virtual ~IPhysicsCollision(void) {} + +private: + // TODO: reverse these: + virtual void sub_14058C3B0() = 0; + virtual void sub_14058C3F0() = 0; + virtual void sub_14058CD80() = 0; + virtual void sub_14058C6E0() = 0; + virtual void sub_14058C6F0() = 0; + virtual void sub_14058CDD0() = 0; + virtual void sub_14058CB50() = 0; + virtual void sub_14058C980() = 0; + virtual void sub_14058D3D0() = 0; + virtual void sub_14058D400() = 0; + virtual void sub_14058C0D0() = 0; + virtual void sub_14058C060() = 0; + +public: + virtual void VCollideLoad(vcollide_t* const pOutput, const int numSolids, const char* const pBuffer) = 0; + virtual void VCollideUnload(vcollide_t* const pVCollide) = 0; + + // TODO: there is more past this, see r5apex.exe @1413A9420 +}; + +#endif // VPHYSICS_INTERFACE_H diff --git a/src/vphysics/CMakeLists.txt b/src/vphysics/CMakeLists.txt index 3e66230e..1b41de42 100644 --- a/src/vphysics/CMakeLists.txt +++ b/src/vphysics/CMakeLists.txt @@ -5,11 +5,13 @@ start_sources() add_sources( SOURCE_GROUP "Private" "physics_collide.cpp" + "physics_collide.h" "QHull.cpp" "QHull.h" ) add_sources( SOURCE_GROUP "Public" + "${ENGINE_SOURCE_DIR}/public/vphysics/vphysics_interface.h" "${ENGINE_SOURCE_DIR}/public/vphysics/phyfile.h" "${ENGINE_SOURCE_DIR}/public/vphysics/vcollide.h" "${ENGINE_SOURCE_DIR}/public/trace.h" diff --git a/src/vphysics/physics_collide.cpp b/src/vphysics/physics_collide.cpp index bf51eb19..5fe1de9d 100644 --- a/src/vphysics/physics_collide.cpp +++ b/src/vphysics/physics_collide.cpp @@ -7,5 +7,13 @@ #include "core/stdafx.h" #include "mathlib/vector.h" #include "mathlib/mathlib.h" +#include "physics_collide.h" + +CPhysicsCollision* g_pPhysicsCollision = nullptr; + +IPhysicsCollision* PhysicsCollision() +{ + return g_pPhysicsCollision; +} //----------------------------------------------------------------------------- diff --git a/src/vphysics/physics_collide.h b/src/vphysics/physics_collide.h new file mode 100644 index 00000000..2656a243 --- /dev/null +++ b/src/vphysics/physics_collide.h @@ -0,0 +1,44 @@ +//=============================================================================// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#ifndef PHYSICS_COLLIDE_H +#define PHYSICS_COLLIDE_H + +#include "vphysics/vphysics_interface.h" + +class CPhysicsCollision : public IPhysicsCollision +{ +public: + // Class implemented in engine! +}; + +extern CPhysicsCollision* g_pPhysicsCollision; + +// Physics collision singleton accessor. +IPhysicsCollision* PhysicsCollision(); + + +/////////////////////////////////////////////////////////////////////////////// +class VPhysicsCollide : public IDetour +{ + virtual void GetAdr(void) const + { + LogVarAdr("g_PhysicsCollision", g_pPhysicsCollision); + } + virtual void GetFun(void) const { } + virtual void GetVar(void) const + { + // Unfortunately can't obtain it via interface system; have to get it this way... + g_GameDll.FindPatternSIMD("40 53 48 83 EC 20 48 83 3D ?? ?? ?? ?? ?? 48 8B D9 75 08 32 C0 48 83 C4 20 5B C3 48 8D 05 ?? ?? ?? ??") + .FindPatternSelf("48 8D 05", CMemory::Direction::DOWN, 512, 3).ResolveRelativeAddressSelf(0x3, 0x7).GetPtr(g_pPhysicsCollision); + } + virtual void GetCon(void) const { } + virtual void Detour(const bool bAttach) const { }; +}; +/////////////////////////////////////////////////////////////////////////////// + + +#endif // PHYSICS_COLLIDE_H