vphysics_jolt/vphysics_jolt/vjolt_objectpairhash.h

50 lines
1.3 KiB
C++

#pragma once
class JoltPhysicsObjectPairHash : public IPhysicsObjectPairHash
{
public:
JoltPhysicsObjectPairHash();
void AddObjectPair( void *pObject0, void *pObject1 ) override;
void RemoveObjectPair( void *pObject0, void *pObject1 ) override;
bool IsObjectPairInHash( void *pObject0, void *pObject1 ) override;
void RemoveAllPairsForObject( void *pObject0 ) override;
bool IsObjectInHash( void *pObject0 ) override;
int GetPairCountForObject( void *pObject0 ) override;
int GetPairListForObject( void *pObject0, int nMaxCount, void **ppObjectList ) override;
private:
struct PointerHasher
{
template < typename T >
static void HashCombine( size_t& seed, const T& v )
{
std::hash< T > hasher;
seed ^= hasher( v ) + 0x9e3779b9 + ( seed << 6 ) + ( seed >> 2 );
}
size_t operator() ( const std::pair< void*, void* >& val ) const
{
size_t hash = 0;
HashCombine( hash, val.first );
HashCombine( hash, val.second );
return hash;
}
};
static constexpr size_t HashSize = 1024;
static constexpr size_t GetHashArrayIndex( size_t hash )
{
return hash & ( HashSize - 1u );
}
using HashEntries = std::unordered_set< std::pair< void*, void* >, PointerHasher >;
std::array< HashEntries, HashSize > m_PairHashes;
std::array< HashEntries, HashSize > m_ObjectHashes;
std::unordered_multiset< void* > m_Objects;
};