forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			173 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
Bullet Continuous Collision Detection and Physics Library
 | 
						|
Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
 | 
						|
 | 
						|
This software is provided 'as-is', without any express or implied warranty.
 | 
						|
In no event will the authors be held liable for any damages arising from the use of this software.
 | 
						|
Permission is granted to anyone to use this software for any purpose, 
 | 
						|
including commercial applications, and to alter it and redistribute it freely, 
 | 
						|
subject to the following restrictions:
 | 
						|
 | 
						|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
 | 
						|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 | 
						|
3. This notice may not be removed or altered from any source distribution.
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef BT_HASHED_SIMPLE_PAIR_CACHE_H
 | 
						|
#define BT_HASHED_SIMPLE_PAIR_CACHE_H
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#include "LinearMath/btAlignedObjectArray.h"
 | 
						|
 | 
						|
const int BT_SIMPLE_NULL_PAIR=0xffffffff;
 | 
						|
 | 
						|
struct btSimplePair
 | 
						|
{
 | 
						|
	btSimplePair(int indexA,int indexB)
 | 
						|
		:m_indexA(indexA),
 | 
						|
		m_indexB(indexB),
 | 
						|
		m_userPointer(0)
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	int m_indexA;
 | 
						|
	int m_indexB;
 | 
						|
	union
 | 
						|
	{
 | 
						|
		void*	m_userPointer;
 | 
						|
		int		m_userValue;
 | 
						|
	};
 | 
						|
};
 | 
						|
 | 
						|
typedef btAlignedObjectArray<btSimplePair>	btSimplePairArray;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
extern int gOverlappingSimplePairs;
 | 
						|
extern int gRemoveSimplePairs;
 | 
						|
extern int gAddedSimplePairs;
 | 
						|
extern int gFindSimplePairs;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class btHashedSimplePairCache
 | 
						|
{
 | 
						|
	btSimplePairArray	m_overlappingPairArray;
 | 
						|
		
 | 
						|
 | 
						|
protected:
 | 
						|
	
 | 
						|
	btAlignedObjectArray<int>	m_hashTable;
 | 
						|
	btAlignedObjectArray<int>	m_next;
 | 
						|
	
 | 
						|
 | 
						|
public:
 | 
						|
	btHashedSimplePairCache();
 | 
						|
	virtual ~btHashedSimplePairCache();
 | 
						|
	
 | 
						|
	void removeAllPairs();
 | 
						|
 | 
						|
	virtual void*	removeOverlappingPair(int indexA,int indexB);
 | 
						|
	
 | 
						|
	// Add a pair and return the new pair. If the pair already exists,
 | 
						|
	// no new pair is created and the old one is returned.
 | 
						|
	virtual btSimplePair* 	addOverlappingPair(int indexA,int indexB)
 | 
						|
	{
 | 
						|
		gAddedSimplePairs++;
 | 
						|
 | 
						|
		return internalAddPair(indexA,indexB);
 | 
						|
	}
 | 
						|
 | 
						|
	
 | 
						|
	virtual btSimplePair*	getOverlappingPairArrayPtr()
 | 
						|
	{
 | 
						|
		return &m_overlappingPairArray[0];
 | 
						|
	}
 | 
						|
 | 
						|
	const btSimplePair*	getOverlappingPairArrayPtr() const
 | 
						|
	{
 | 
						|
		return &m_overlappingPairArray[0];
 | 
						|
	}
 | 
						|
 | 
						|
	btSimplePairArray&	getOverlappingPairArray()
 | 
						|
	{
 | 
						|
		return m_overlappingPairArray;
 | 
						|
	}
 | 
						|
 | 
						|
	const btSimplePairArray&	getOverlappingPairArray() const
 | 
						|
	{
 | 
						|
		return m_overlappingPairArray;
 | 
						|
	}
 | 
						|
 | 
						|
	
 | 
						|
	btSimplePair* findPair(int indexA,int indexB);
 | 
						|
 | 
						|
	int GetCount() const { return m_overlappingPairArray.size(); }
 | 
						|
 | 
						|
	int	getNumOverlappingPairs() const
 | 
						|
	{
 | 
						|
		return m_overlappingPairArray.size();
 | 
						|
	}
 | 
						|
private:
 | 
						|
	
 | 
						|
	btSimplePair* 	internalAddPair(int indexA, int indexB);
 | 
						|
 | 
						|
	void	growTables();
 | 
						|
 | 
						|
	SIMD_FORCE_INLINE bool equalsPair(const btSimplePair& pair, int indexA, int indexB)
 | 
						|
	{	
 | 
						|
		return pair.m_indexA == indexA && pair.m_indexB == indexB;
 | 
						|
	}
 | 
						|
 | 
						|
	
 | 
						|
	
 | 
						|
	SIMD_FORCE_INLINE unsigned int getHash(unsigned int indexA, unsigned int indexB)
 | 
						|
	{
 | 
						|
		unsigned int key = indexA | (indexB << 16);
 | 
						|
		// Thomas Wang's hash
 | 
						|
 | 
						|
		key += ~(key << 15);
 | 
						|
		key ^=  (key >> 10);
 | 
						|
		key +=  (key << 3);
 | 
						|
		key ^=  (key >> 6);
 | 
						|
		key += ~(key << 11);
 | 
						|
		key ^=  (key >> 16);
 | 
						|
		return key;
 | 
						|
	}
 | 
						|
	
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	SIMD_FORCE_INLINE btSimplePair* internalFindPair(int proxyIdA , int proxyIdB, int hash)
 | 
						|
	{
 | 
						|
		
 | 
						|
		int index = m_hashTable[hash];
 | 
						|
		
 | 
						|
		while( index != BT_SIMPLE_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyIdA, proxyIdB) == false)
 | 
						|
		{
 | 
						|
			index = m_next[index];
 | 
						|
		}
 | 
						|
 | 
						|
		if ( index == BT_SIMPLE_NULL_PAIR )
 | 
						|
		{
 | 
						|
			return NULL;
 | 
						|
		}
 | 
						|
 | 
						|
		btAssert(index < m_overlappingPairArray.size());
 | 
						|
 | 
						|
		return &m_overlappingPairArray[index];
 | 
						|
	}
 | 
						|
 | 
						|
	
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif //BT_HASHED_SIMPLE_PAIR_CACHE_H
 | 
						|
 | 
						|
 |