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

其他游戏

开发平台:

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_LIST_SHAPE_H
  9. #define HK_COLLIDE2_LIST_SHAPE_H
  10. #include <Common/Internal/1AxisSweep/hk1AxisSweep.h>
  11. #include <Physics/Collide/Shape/Compound/Collection/hkpShapeCollection.h>
  12. #include <Physics/Collide/Util/hkpAabbUtil.h>
  13. extern const hkClass hkpListShapeClass;
  14. struct hkAabbUint32;
  15. struct hkpCollisionInput;
  16. /// A simple static list of hkShapes. You can use this shape class to create compound bodies.
  17. /// A list shape can hold a mix of different shape types e.g. an ice cream cone could be made
  18. /// from a list shape containing a sphere for the ice cream and a convex vertices shape
  19. /// for the wafer cone.
  20. /// If your list shape contains many subshapes, consider using a hkpBvTreeShape for faster access
  21. class hkpListShape : public hkpShapeCollection
  22. {
  23. public:
  24. HK_DECLARE_REFLECTION();
  25. enum { MAX_CHILDREN_FOR_SPU_MIDPHASE = 252 };
  26. struct ChildInfo
  27. {
  28. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpListShape::ChildInfo );
  29. HK_DECLARE_REFLECTION();
  30. HK_ALIGN16(const hkpShape* m_shape); // we need this because all the child infos might not fit into a cacheline
  31. hkUint32 m_collisionFilterInfo;
  32. mutable int m_shapeSize; // +nosave
  33. mutable int m_numChildShapes; // +nosave
  34. };
  35. /// Flags for controlling list shape algorithms
  36. enum ListShapeFlags
  37. {
  38. ALL_FLAGS_CLEAR = 0, ///
  39. DISABLE_SPU_CACHE_FOR_LIST_CHILD_INFO = 1<<0 ///
  40. };
  41. public:
  42. /// Constructs a list shape with an array of pointers to shapes.
  43. /// Note: The hkpShapeContainer::ReferencePolicy is only used for the constructor, the destructor will still always decrement the childs reference
  44. hkpListShape( const hkpShape*const* shapeArray, int numShapes, hkpShapeContainer::ReferencePolicy ref = hkpShapeContainer::REFERENCE_POLICY_INCREMENT );
  45. hkpListShape( class hkFinishLoadedObjectFlag flag );
  46. /// The destructor removes references to child shapes.
  47. ~hkpListShape();
  48. /// Returns the ith child shape.
  49. inline const hkpShape* getChildShapeInl(int i) const { return m_childInfo[i].m_shape; }
  50. /// Call this whenever your underlying child shapes moves or increases its AABB
  51. void recalcAabbExtents();
  52. /// Call this whenever your underlying child shapes moves or increases its AABB
  53. /// Also returns the aabb
  54. void recalcAabbExtents( hkAabb& aabbOut );
  55. /// Allows for quickly disabling a child shape.
  56. /// Warning: you also have to invalidate the corresponding cached aabb in the hkpCollidable::m_boundingVolumeData::m_childShapeAabbs.
  57. /// You can use the hkpBreakOffPartsUtil::removeKeysFromListShape() to do this for you
  58. void disableChild( hkpShapeKey index );
  59. /// Allows for quickly enabling a child shape.
  60. void enableChild( hkpShapeKey index );
  61. /// Check whether a child is enabled
  62. HK_FORCE_INLINE hkBool32 isChildEnabled( hkpShapeKey index ) const
  63. {
  64. HK_ASSERT2(0xad808208, index < hkUint32(m_childInfo.getSize()), "hkpListShape child index out of bounds");
  65. if ( index < MAX_DISABLED_CHILDREN )
  66. {
  67. return m_enabledChildren[ index>>5 ] & (1<<(index&0x1f));
  68. }
  69. return true;
  70. }
  71. //
  72. // hkpShapeCollection interface
  73. //
  74. // hkpShapeCollection interface implementation.
  75. inline virtual int getNumChildShapes() const { return m_childInfo.getSize() - m_numDisabledChildren; }
  76. /// Get the next child shape key.
  77. inline virtual hkpShapeKey getNextKey( hkpShapeKey key ) const 
  78. {
  79. for ( int i = key+1; i < m_childInfo.getSize(); i++ )
  80. {
  81. if (isChildEnabled( i ))
  82. {
  83. return hkpShapeKey(i);
  84. }
  85. }
  86. return HK_INVALID_SHAPE_KEY;
  87. }
  88. /// Get the first child shape key.
  89. inline virtual hkpShapeKey getFirstKey() const { return hkpListShape::getNextKey( hkpShapeKey(-1) ); }
  90. // hkpShapeContainer::getCollisionFilterInfo() interface implementation.
  91. HKP_SHAPE_VIRTUAL hkUint32 getCollisionFilterInfoImpl( HKP_SHAPE_VIRTUAL_THIS hkpShapeKey key ) HKP_SHAPE_VIRTUAL_CONST;
  92. /// Sets the collisionFilterInfo for a given index
  93. void setCollisionFilterInfo( hkpShapeKey index, hkUint32 filterInfo );
  94. /// hkpShapeContainer::getChildShape() interface implementation.
  95. HKP_SHAPE_VIRTUAL const hkpShape* getChildShapeImpl( HKP_SHAPE_VIRTUAL_THIS hkpShapeKey key, ShapeBuffer& buffer ) HKP_SHAPE_VIRTUAL_CONST;
  96. //
  97. // hkpShape implementation
  98. //
  99. // hkpShape interface implementation.
  100. HKP_SHAPE_VIRTUAL void getAabbImpl( HKP_SHAPE_VIRTUAL_THIS const hkTransform& localToWorld, hkReal tolerance, hkAabb& out ) HKP_SHAPE_VIRTUAL_CONST;
  101. // hkpShape interface implementation.
  102. HKP_SHAPE_VIRTUAL hkBool castRayImpl( HKP_SHAPE_VIRTUAL_THIS const hkpShapeRayCastInput& input, hkpShapeRayCastOutput& results) HKP_SHAPE_VIRTUAL_CONST;
  103. // hkpShape interface implementation.
  104. HKP_SHAPE_VIRTUAL void castRayWithCollectorImpl( HKP_SHAPE_VIRTUAL_THIS const hkpShapeRayCastInput& input, const hkpCdBody& cdBody, hkpRayHitCollector& collector) HKP_SHAPE_VIRTUAL_CONST;
  105. /// Returns a struct of function pointers needed by the SPU
  106. static void HK_CALL registerSimulationFunctions( ShapeFuncs& sf );
  107. /// Returns a struct of function pointers needed by the SPU
  108. static void HK_CALL registerCollideQueryFunctions( ShapeFuncs& sf );
  109. /// Returns a struct of function pointers needed by the SPU
  110. static void HK_CALL registerRayCastFunctions( ShapeFuncs& sf );
  111. /// Returns a struct of function pointers needed by the SPU
  112. static void HK_CALL registerGetAabbFunction( ShapeFuncs& sf );
  113.         virtual void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls) const;
  114. virtual int calcSizeForSpu(const CalcSizeForSpuInput& input, int spuBufferSizeLeft) const;
  115. inline int getNumAabbsForSharedBufferForAabbsAndChildInfos() const
  116. {
  117. int maxByteSize = hkpListShape::getNumChildShapes() * sizeof(hkAabbUint32) + (m_childInfo.getSize()-hkpListShape::getNumChildShapes())*sizeof(ChildInfo);
  118. int maxNumAabbs = (maxByteSize + sizeof(hkAabbUint32) - 1) / sizeof(hkAabbUint32) + 1;
  119. return maxNumAabbs;
  120. }
  121. public:
  122. friend class hkpListAgent;
  123. hkArray<struct ChildInfo> m_childInfo;
  124. hkUint16 m_flags; ///
  125. hkUint16 m_numDisabledChildren; /// < the number of disabled children
  126. hkVector4 m_aabbHalfExtents;
  127. hkVector4 m_aabbCenter;
  128. // if one of the bits is set, the child is disabled
  129. enum { MAX_DISABLED_CHILDREN = 256 };
  130. hkUint32 m_enabledChildren[ 8 ]; // [MAX_DISABLED_CHILDREN/32]
  131. protected:
  132. void setShapes( const hkpShape*const* shapeArray, int numShapes, const hkUint32* filterInfoArray = HK_NULL, hkpShapeContainer::ReferencePolicy ref = hkpShapeContainer::REFERENCE_POLICY_INCREMENT );
  133. };
  134. # define HK_ACCESS_COLLECTION_METHOD(obj, func) obj->func
  135. #endif // HK_COLLIDE2_LIST_SHAPE_H
  136. /*
  137. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  138. * Confidential Information of Havok.  (C) Copyright 1999-2009
  139. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  140. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  141. * rights, and intellectual property rights in the Havok software remain in
  142. * Havok and/or its suppliers.
  143. * Use of this software for evaluation purposes is subject to and indicates
  144. * acceptance of the End User licence Agreement for this product. A copy of
  145. * the license is included with this software and is also available at www.havok.com/tryhavok.
  146. */