summaryrefslogtreecommitdiff
path: root/vphysics/main.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /vphysics/main.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'vphysics/main.cpp')
-rw-r--r--vphysics/main.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/vphysics/main.cpp b/vphysics/main.cpp
new file mode 100644
index 0000000..eda9a95
--- /dev/null
+++ b/vphysics/main.cpp
@@ -0,0 +1,242 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#include "cbase.h"
+#include "interface.h"
+#include "vphysics/object_hash.h"
+#include "vphysics/collision_set.h"
+#include "tier1/tier1.h"
+#include "ivu_vhash.hxx"
+
+
+
+#if defined(_WIN32) && !defined(_X360)
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif // _WIN32 && !_X360
+
+#include "vphysics_interfaceV30.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+static void ivu_string_print_function( const char *str )
+{
+ Msg("%s", str);
+}
+
+#if defined(_WIN32) && !defined(_XBOX)
+//HMODULE gPhysicsDLLHandle;
+
+#pragma warning (disable:4100)
+
+BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
+{
+ if ( fdwReason == DLL_PROCESS_ATTACH )
+ {
+ ivp_set_message_print_function( ivu_string_print_function );
+
+ MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f, false, false, false, false );
+ // store out module handle
+ //gPhysicsDLLHandle = (HMODULE)hinstDLL;
+ }
+ else if ( fdwReason == DLL_PROCESS_DETACH )
+ {
+ }
+ return TRUE;
+}
+
+#endif // _WIN32
+
+#ifdef POSIX
+void __attribute__ ((constructor)) vphysics_init(void);
+void vphysics_init(void)
+{
+ ivp_set_message_print_function( ivu_string_print_function );
+
+ MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f, false, false, false, false );
+}
+#endif
+
+
+// simple 32x32 bit array
+class CPhysicsCollisionSet : public IPhysicsCollisionSet
+{
+public:
+ ~CPhysicsCollisionSet() {}
+ CPhysicsCollisionSet()
+ {
+ memset( m_bits, 0, sizeof(m_bits) );
+ }
+ void EnableCollisions( int index0, int index1 )
+ {
+ Assert(index0<32&&index1<32);
+ m_bits[index0] |= 1<<index1;
+ m_bits[index1] |= 1<<index0;
+ }
+ void DisableCollisions( int index0, int index1 )
+ {
+ Assert(index0<32&&index1<32);
+ m_bits[index0] &= ~(1<<index1);
+ m_bits[index1] &= ~(1<<index0);
+ }
+
+ bool ShouldCollide( int index0, int index1 )
+ {
+ Assert(index0<32&&index1<32);
+ return (m_bits[index0] & (1<<index1)) ? true : false;
+ }
+private:
+ unsigned int m_bits[32];
+};
+
+
+//-----------------------------------------------------------------------------
+// Main physics interface
+//-----------------------------------------------------------------------------
+class CPhysicsInterface : public CTier1AppSystem<IPhysics>
+{
+public:
+ CPhysicsInterface() : m_pCollisionSetHash(NULL) {}
+ virtual void *QueryInterface( const char *pInterfaceName );
+ virtual IPhysicsEnvironment *CreateEnvironment( void );
+ virtual void DestroyEnvironment( IPhysicsEnvironment *pEnvironment );
+ virtual IPhysicsEnvironment *GetActiveEnvironmentByIndex( int index );
+ virtual IPhysicsObjectPairHash *CreateObjectPairHash();
+ virtual void DestroyObjectPairHash( IPhysicsObjectPairHash *pHash );
+ virtual IPhysicsCollisionSet *FindOrCreateCollisionSet( unsigned int id, int maxElementCount );
+ virtual IPhysicsCollisionSet *FindCollisionSet( unsigned int id );
+ virtual void DestroyAllCollisionSets();
+
+private:
+ CUtlVector<IPhysicsEnvironment *> m_envList;
+ CUtlVector<CPhysicsCollisionSet> m_collisionSets;
+ IVP_VHash_Store *m_pCollisionSetHash;
+};
+
+
+//-----------------------------------------------------------------------------
+// Expose singleton
+//-----------------------------------------------------------------------------
+static CPhysicsInterface g_MainDLLInterface;
+IPhysics *g_PhysicsInternal = &g_MainDLLInterface;
+EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CPhysicsInterface, IPhysics, VPHYSICS_INTERFACE_VERSION, g_MainDLLInterface );
+
+
+//-----------------------------------------------------------------------------
+// Query interface
+//-----------------------------------------------------------------------------
+void *CPhysicsInterface::QueryInterface( const char *pInterfaceName )
+{
+ // Loading the datacache DLL mounts *all* interfaces
+ // This includes the backward-compatible interfaces + other vphysics interfaces
+ CreateInterfaceFn factory = Sys_GetFactoryThis(); // This silly construction is necessary
+ return factory( pInterfaceName, NULL ); // to prevent the LTCG compiler from crashing.
+}
+
+
+//-----------------------------------------------------------------------------
+// Implementation of IPhysics
+//-----------------------------------------------------------------------------
+IPhysicsEnvironment *CPhysicsInterface::CreateEnvironment( void )
+{
+ IPhysicsEnvironment *pEnvironment = CreatePhysicsEnvironment();
+ m_envList.AddToTail( pEnvironment );
+ return pEnvironment;
+}
+
+void CPhysicsInterface::DestroyEnvironment( IPhysicsEnvironment *pEnvironment )
+{
+ m_envList.FindAndRemove( pEnvironment );
+ delete pEnvironment;
+}
+
+IPhysicsEnvironment *CPhysicsInterface::GetActiveEnvironmentByIndex( int index )
+{
+ if ( index < 0 || index >= m_envList.Count() )
+ return NULL;
+
+ return m_envList[index];
+}
+
+IPhysicsObjectPairHash *CPhysicsInterface::CreateObjectPairHash()
+{
+ return ::CreateObjectPairHash();
+}
+
+void CPhysicsInterface::DestroyObjectPairHash( IPhysicsObjectPairHash *pHash )
+{
+ delete pHash;
+}
+// holds a cache of these by id.
+// NOTE: This is stuffed into vphysics.dll as a sneaky way of sharing the memory between
+// client and server in single player. So you can't have different client/server rules.
+IPhysicsCollisionSet *CPhysicsInterface::FindOrCreateCollisionSet( unsigned int id, int maxElementCount )
+{
+ if ( !m_pCollisionSetHash )
+ {
+ m_pCollisionSetHash = new IVP_VHash_Store(256);
+ }
+ Assert( id != 0 );
+ Assert( maxElementCount <= 32 );
+ if ( maxElementCount > 32 )
+ return NULL;
+
+ IPhysicsCollisionSet *pSet = FindCollisionSet( id );
+ if ( pSet )
+ return pSet;
+ int index = m_collisionSets.AddToTail();
+ m_pCollisionSetHash->add_elem( (void *)id, (void *)(index+1) );
+ return &m_collisionSets[index];
+}
+
+IPhysicsCollisionSet *CPhysicsInterface::FindCollisionSet( unsigned int id )
+{
+ if ( m_pCollisionSetHash )
+ {
+ int index = (int)m_pCollisionSetHash->find_elem( (void *)id );
+ if ( index > 0 )
+ {
+ Assert( index <= m_collisionSets.Count() );
+ if ( index <= m_collisionSets.Count() )
+ {
+ return &m_collisionSets[index-1];
+ }
+ }
+ }
+ return NULL;
+}
+
+void CPhysicsInterface::DestroyAllCollisionSets()
+{
+ m_collisionSets.Purge();
+ delete m_pCollisionSetHash;
+ m_pCollisionSetHash = NULL;
+}
+
+
+
+// In release build, each of these libraries must contain a symbol that indicates it is also a release build
+// You MUST disable this in order to run a release vphysics.dll with a debug library.
+// This should not usually be necessary
+#if !defined(_DEBUG) && defined(_WIN32)
+extern int ivp_physics_lib_is_a_release_build;
+extern int ivp_compactbuilder_lib_is_a_release_build;
+extern int hk_base_lib_is_a_release_build;
+extern int hk_math_lib_is_a_release_build;
+extern int havana_constraints_lib_is_a_release_build;
+
+void DebugTestFunction()
+{
+ ivp_physics_lib_is_a_release_build = 0;
+ ivp_compactbuilder_lib_is_a_release_build = 0;
+ hk_base_lib_is_a_release_build = 0;
+ hk_math_lib_is_a_release_build = 0;
+ havana_constraints_lib_is_a_release_build = 0;
+}
+#endif
+