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

其他游戏

开发平台:

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_COLLIDE_SHAPE_CONTAINER_H
  9. #define HK_COLLIDE_SHAPE_CONTAINER_H
  10. class hkpShape;
  11. /// Interface to shapes which have one or more children, accessible through a shapekey.
  12. /// See hkpShape::getCollection()
  13. class hkpShapeContainer
  14. {
  15. public:
  16. HK_DECLARE_REFLECTION();
  17. /// Attributes of the buffer used in getChildShape.
  18. enum {  HK_SHAPE_BUFFER_ALIGNMENT = 16, HK_SHAPE_BUFFER_SIZE = 512 };
  19. /// The policy used how the constructor will change the reference count of the new child, this does not affect the destructor
  20. enum ReferencePolicy
  21. {
  22. //+reflected(False)
  23. /// ignore the reference count of the child
  24. REFERENCE_POLICY_IGNORE,
  25. /// increment the reference count of the child
  26. REFERENCE_POLICY_INCREMENT
  27. };
  28. /// A buffer type, allocated locally on the stack by calling functions,
  29. /// to be passed to getChildShape.
  30. typedef HK_ALIGN16( char ShapeBuffer[HK_SHAPE_BUFFER_SIZE] );
  31. ///
  32. virtual ~hkpShapeContainer() { }
  33. /// The number of child shapes. The default implementation just iterates over all keys and is really slow
  34. virtual int getNumChildShapes() const;
  35. /// Get the first child shape key
  36. /// see getChildShape() for extra details
  37. virtual hkpShapeKey getFirstKey() const = 0;
  38. /// Get the next child shape key
  39. /// If the the "oldKey" parameter is the last key in the shape collection, this function
  40. /// returns HK_INVALID_SHAPE_KEY
  41. /// see getChildShape() for extra details
  42. virtual hkpShapeKey getNextKey( hkpShapeKey oldKey ) const = 0;
  43. /// Return the collision filter info for a given child shape
  44. virtual hkUint32 getCollisionFilterInfo( hkpShapeKey key ) const;
  45. /// Gets a child shape using a shape key.
  46. /// This function must return a child shape pointer. This is only called internally by
  47. /// the collision detection system after having called getFirstKey() or getNextKey().
  48. /// If you have shape keys that are invalid, you must implement getNextKey() in such
  49. /// a way that it skips over these shapes.
  50. /// Important Note: It is assumed by the system that a shape key, if valid (i.e. returned by
  51. /// getNextkey()) will always remain valid.<br>
  52. /// Notes:
  53. /// - You can return a pointer to a shape
  54. /// - or you can construct a shape in place in the buffer and return a pointer to that buffer.
  55. ///    e.g. hkpMeshShape uses this buffer for temporarily created triangles.
  56. ///    hkpListShape does not use the buffer as it already has shape instances.
  57. ///    Attention: When the buffer gets erased, no destructor will be called.
  58. /// - The buffer must be 16 byte aligned.
  59. virtual const hkpShape* getChildShape( hkpShapeKey key, ShapeBuffer& buffer ) const = 0;
  60. /// Return whether welding should be enabled for this shape container (default true)
  61. virtual bool isWeldingEnabled() const { return true; }
  62. };
  63. /// Utility class for a shape which has a single child.
  64. class hkpSingleShapeContainer : public hkpShapeContainer
  65. {
  66. public:
  67. HK_DECLARE_REFLECTION();
  68. void* operator new(hk_size_t, void* p) { return p; }
  69. void  operator delete(void* p) { }
  70. /// Create a single shape collection.
  71. hkpSingleShapeContainer( const hkpShape* s, ReferencePolicy ref = REFERENCE_POLICY_INCREMENT ) : m_childShape(s)
  72. {
  73. if ( ref == REFERENCE_POLICY_INCREMENT)
  74. {
  75. m_childShape->addReference();
  76. }
  77. }
  78. hkpSingleShapeContainer(hkFinishLoadedObjectFlag) {}
  79. ~hkpSingleShapeContainer()
  80. {
  81. if( m_childShape )
  82. {
  83. m_childShape->removeReference();
  84. }
  85. }
  86. // Implemented method of hkpShapeContainer
  87. virtual int getNumChildShapes() const { return 1; }
  88. // Implemented method of hkpShapeContainer
  89. virtual hkpShapeKey getFirstKey() const { return 0; }
  90. // Implemented method of hkpShapeContainer
  91. virtual hkpShapeKey getNextKey( hkpShapeKey oldKey ) const { return HK_INVALID_SHAPE_KEY; }
  92. // Implemented method of hkpShapeContainer
  93. virtual const hkpShape* getChildShape( hkpShapeKey key, ShapeBuffer& buffer ) const;
  94. /// Get the child shape.
  95. inline const hkpShape* getChild() const { return m_childShape; }
  96. /// 
  97. inline const hkpShape* operator->() const { return m_childShape; }
  98. protected:
  99. const hkpShape* m_childShape;
  100. };
  101. #endif // HK_COLLIDE_SHAPE_CONTAINER_H
  102. /*
  103. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  104. * Confidential Information of Havok.  (C) Copyright 1999-2009
  105. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  106. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  107. * rights, and intellectual property rights in the Havok software remain in
  108. * Havok and/or its suppliers.
  109. * Use of this software for evaluation purposes is subject to and indicates
  110. * acceptance of the End User licence Agreement for this product. A copy of
  111. * the license is included with this software and is also available at www.havok.com/tryhavok.
  112. */