50 lines
1.3 KiB
C
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;
|
||
|
};
|