VPhysics: add CPhysicsCollision singleton

Used for CStudioVCollide::~CStudioVCollide().
This commit is contained in:
Kawe Mazidjatari 2024-01-07 14:19:31 +01:00
parent 8aa8323ea4
commit fc1c911c81
6 changed files with 101 additions and 5 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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"

View File

@ -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;
}
//-----------------------------------------------------------------------------

View File

@ -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