hkpPairCollisionFilter.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:6k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_COLLIDE2_PAIR_COLLISION_FILTER_H
  9. #define HK_COLLIDE2_PAIR_COLLISION_FILTER_H
  10. #include <Common/Base/Container/PointerMap/hkPointerMapBase.h>
  11. #include <Physics/Collide/Filter/hkpCollisionFilter.h>
  12. class hkpEntity;
  13. /// A simple pairwise collision filter that allows to enable/disable collisions between two dedicated entities.
  14. /// Each pair maintains a counter, i.e. you have to 'enable' as many times as 'disable' to actually re-enable
  15. /// collision detection between a pair of entities.
  16. class hkpPairCollisionFilter : public hkpCollisionFilter
  17. {
  18. public:
  19. #if HK_POINTER_SIZE == 4
  20. typedef hkUint64 PairFilterKey;
  21. #else
  22. struct PairFilterKey
  23. {
  24. hkUint64 m_a;
  25. hkUint64 m_b;
  26. };
  27. struct PairFilterPointerMapOperations
  28. {
  29. inline unsigned hash( PairFilterKey key, unsigned modulus )
  30. {
  31. // using Knuth's multiplicative golden hash
  32. // the lowest four bits on the address are ignored as most addresses will be 16-byte aligned
  33. // finally we truncate the hash value as hkPointerMap can only handle 32 bit 
  34. hkUint64 combinedKey = (key.m_a + (key.m_b << 28)) >> 4;
  35. return (unsigned)(((combinedKey * 0x9e3779b97f4a7c13LL) & modulus) & 0xffffffff);
  36. }
  37. inline void invalidate( PairFilterKey& key )
  38. {
  39. key.m_a = 0xffffffffffffffff;
  40. key.m_b = 0xffffffffffffffff;
  41. }
  42. inline hkBool32 isValid( PairFilterKey key )
  43. {
  44. return key.m_a != 0xffffffffffffffff && key.m_b != 0xffffffffffffffff;
  45. }
  46. inline hkBool32 equal( PairFilterKey key0, PairFilterKey key1 )
  47. {
  48. return key0.m_a == key1.m_a && key0.m_b == key1.m_b;
  49. }
  50. };
  51. #endif
  52. public:
  53. //HK_DECLARE_REFLECTION();
  54.  hkpPairCollisionFilter(const hkpCollisionFilter* childFilter = HK_NULL);
  55.  hkpPairCollisionFilter( class hkFinishLoadedObjectFlag flag ) {}
  56. ~hkpPairCollisionFilter();
  57. /// Enable collisions between entity A and entity B. Returns the number of times the pair is still 'disabled'.
  58. /// ###ACCESS_CHECKS###( [entityA->getWorld(),HK_ACCESS_RW] );
  59. int enableCollisionsBetween(const hkpEntity* entityA, const hkpEntity* entityB);
  60. /// Disable collisions between entity A and entity B. Returns the number of times the pair is now 'disabled'.
  61. /// ###ACCESS_CHECKS###( [entityA->getWorld(),HK_ACCESS_RW] );
  62. int disableCollisionsBetween(const hkpEntity* entityA, const hkpEntity* entityB);
  63. /// This implementation of isCollisionEnabled() checks if the two supplied entities are allowed to collide or not.
  64. hkBool isCollisionEnabled( const hkpEntity* entityA, const hkpEntity* entityB ) const;
  65. /// This implementation of isCollisionEnabled() simply forwards to the entity/entity variant.
  66. virtual hkBool isCollisionEnabled( const hkpCollidable& collidableA, const hkpCollidable& collidableB ) const;
  67. /// This implementation of isCollisionEnabled() simply forwards to the entity/entity variant.
  68. virtual hkBool isCollisionEnabled( const hkpCollisionInput& input, const hkpCdBody& a, const hkpCdBody& b, const HK_SHAPE_CONTAINER& bContainer, hkpShapeKey bKey  ) const;
  69. // hkpShapeCollectionFilter interface forwarding
  70. virtual hkBool isCollisionEnabled( const hkpCollisionInput& input, const hkpCdBody& collectionBodyA, const hkpCdBody& collectionBodyB, const HK_SHAPE_CONTAINER& containerShapeA, const HK_SHAPE_CONTAINER& containerShapeB, hkpShapeKey keyA, hkpShapeKey keyB ) const;
  71. /// This implementation of isCollisionEnabled() will always return true.
  72. virtual hkBool isCollisionEnabled( const hkpShapeRayCastInput& aInput, const hkpShape& bShape, const HK_SHAPE_CONTAINER& bContainer, hkpShapeKey bKey ) const;
  73. /// This implementation of isCollisionEnabled() will always return true.
  74. virtual hkBool isCollisionEnabled( const hkpWorldRayCastInput& inputA, const hkpCollidable& collidableB ) const;
  75. private:
  76. // Constructs the 64bit hash key from the entities' pointers.
  77. HK_FORCE_INLINE void calcKey(const hkpEntity* entityA, const hkpEntity* entityB, PairFilterKey& keyOut) const;
  78. public:
  79. #if HK_POINTER_SIZE == 4
  80. class hkPointerMapBase<PairFilterKey> m_disabledPairs; //+nosave
  81. #else
  82. class hkPointerMapBase<PairFilterKey, hkUint64, PairFilterPointerMapOperations> m_disabledPairs; //+nosave
  83. #endif
  84. const hkpCollisionFilter* m_childFilter;
  85. };
  86. #include <Physics/Utilities/Collide/Filter/pair/hkpPairCollisionFilter.inl>
  87. #endif // HK_COLLIDE2_PAIR_COLLISION_FILTER_H
  88. /*
  89. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  90. * Confidential Information of Havok.  (C) Copyright 1999-2009
  91. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  92. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  93. * rights, and intellectual property rights in the Havok software remain in
  94. * Havok and/or its suppliers.
  95. * Use of this software for evaluation purposes is subject to and indicates
  96. * acceptance of the End User licence Agreement for this product. A copy of
  97. * the license is included with this software and is also available at www.havok.com/tryhavok.
  98. */