hkpBreakOffPartsUtil.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 INC_UTILITIES_BREAK_OFF_PARTS_UTIL_H
  9. #define INC_UTILITIES_BREAK_OFF_PARTS_UTIL_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Container/PointerMap/hkPointerMap.h>
  12. #include <Physics/Dynamics/World/Listener/hkpWorldDeletionListener.h>
  13. #include <Physics/Dynamics/Constraint/Contact/hkpContactImpulseLimitBreachedListener.h>
  14. #include <Physics/Dynamics/Entity/hkpEntityListener.h>
  15. #include <Physics/Dynamics/Collide/hkpCollisionListener.h>
  16. #include <Physics/Dynamics/Constraint/hkpConstraintListener.h>
  17. class hkpPhysicsSystem;
  18. class hkpRigidBody;
  19. /// This is an interface to the game/graphics engine and implements the user part of the hkpBreakOffPartsUtil
  20. class hkpBreakOffPartsListener
  21. {
  22. public:
  23. virtual ~hkpBreakOffPartsListener(){}
  24. /// Event structure
  25. struct ContactImpulseLimitBreachedEvent
  26. {
  27. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpBreakOffPartsListener::ContactImpulseLimitBreachedEvent );
  28. //ContactImpulseLimitBreachedEvent()  { }
  29. struct PointInfo
  30. {
  31. hkpRigidBody* m_collidingBody;
  32. hkpShapeKey   m_brokenShapeKey;
  33. hkBool        m_isContact;
  34. hkReal   m_contactPointDirection; // either +1 or -1
  35. const hkContactPoint* m_contactPoint;
  36. const hkpContactPointProperties* m_properties;
  37. const hkpSimpleConstraintContactMgr* m_internalContactMgr;
  38. };
  39. hkpRigidBody*  m_breakingBody;
  40. hkInplaceArray<PointInfo,4> m_points;
  41. };
  42. /// breaks off a subpart and returns the newly created objects.
  43. /// The implementation can decide to break off several elements, it just has to return
  44. /// the removed shapekeys and the created bodies and constraints.
  45. /// This is called from deep within the engine, so the implementation has to be THREADSAFE! 
  46. /// However there are never two calls to this listener in parallel thanks to a critical section in hkpBreakOffPartsUtil
  47. virtual hkResult breakOffSubPart( const ContactImpulseLimitBreachedEvent& event, hkArray<hkpShapeKey>& keysBrokenOffOut, hkpPhysicsSystem& bodiesOut ) = 0;
  48. };
  49. /// This is a helper class, breaking off pieces from a compound body. 
  50. /// The basic idea is that this class properly monitors and clips the impulse acting on a compound sub part.
  51. /// So it basically can be used instead of the usual hkContactPointAdded callback.
  52. ///   - There should only be one instance of this class per hkpWorld.
  53. ///   - This only works if you can identify a sub piece using a single hkpShapeKey, that means
  54. ///     only one hkMoppShape is allowed per rigid body (e.g. hkpExtendedMeshShape)
  55. ///   - If you use this class on the PLAYSTATION(R)3 SPU, the default implementation on the SPU will put the shape key into the materials userData
  56. class hkpBreakOffPartsUtil: public hkReferencedObject, public hkpContactImpulseLimitBreachedListener, hkpEntityListener, 
  57. hkpWorldDeletionListener, hkpConstraintListener
  58. {
  59. public:
  60. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_WORLD );
  61. /// Creates an instance of this class and add itself to the world. You only need one per world. 
  62. /// It automatically calls hkpWorld::addContactImpulseLimitBreachedListener(this) and adds a reference
  63. /// to itself as long as the world is valid.
  64. /// The hkpBreakOffPartsListener is used to decide on the destruction details and needs
  65. /// to be implemented by the user
  66. hkpBreakOffPartsUtil( hkpWorld* world, hkpBreakOffPartsListener* listenerInterface );
  67. /// Flag a subpart of an object to break off above a given impulse limit
  68. void markPieceBreakable( hkpEntity* entity, hkpShapeKey key, hkReal maxImpulse );
  69. /// Flag a whole entity to be breakable
  70. void markEntityBreakable( hkpEntity* entity, hkReal maxImpulse );
  71. /// Set factor used to multiply maximum impulse for attached constraints.
  72. /// This function must be used when setting max impulses for individual hkpShapeKeys, 
  73. /// and not for the entire entity with markEntityBreakable().
  74. void setMaxConstraintImpulse( hkpEntity* entity, hkReal maxConstraintImpulse );
  75. /// Safely removes a piece from a listshape, or a listshape wrapped in a moppshape
  76. /// Both the mopp and listshapes are updated
  77. static void HK_CALL removeKeysFromListShape( hkpEntity* entity, hkpShapeKey* keysToRemove, int numKeys);
  78. //
  79. // internal section
  80. //
  81. protected:
  82. ~hkpBreakOffPartsUtil();
  83. // this removes pieces which are to be broken off
  84. virtual void contactImpulseLimitBreachedCallback( const hkpContactImpulseLimitBreachedListenerInfo* breachedContacts, int numBreachedContacts );
  85.         void contactImpulseLimitBreachedCallback_forToi( const hkpContactImpulseLimitBreachedListenerInfo* breachedContact );
  86. // hkWorldListenerImplementation
  87. virtual void worldDeletedCallback( hkpWorld* world);
  88. // hkEntityListenerImplementation
  89. virtual void entityRemovedCallback( hkpEntity* entity );
  90. // hkpConstraintListener interface implementation
  91. virtual void constraintAddedCallback( hkpConstraintInstance* constraint );
  92. virtual void constraintRemovedCallback( hkpConstraintInstance* constraint ) {}
  93. public:
  94. /// A small helper class, which gets attached to an hkpEntity 
  95. class LimitContactImpulseUtil: public hkReferencedObject, public hkpCollisionListener
  96. {
  97. public:
  98. LimitContactImpulseUtil( hkpBreakOffPartsUtil* breakUtil, hkpEntity* entity );
  99. protected:
  100. // hkpCollisionListener interface implementation
  101. virtual void contactPointAddedCallback( hkpContactPointAddedEvent& event);
  102. virtual void contactPointConfirmedCallback( hkpContactPointConfirmedEvent& event){}
  103. virtual void contactPointRemovedCallback( hkpContactPointRemovedEvent& event ){}
  104. public:
  105. /// Associate the given max impulse with the given key.
  106. inline void setMaxImpulseForShapeKey ( const hkpShapeKey key, hkUint8 max_impulse );
  107. /// Get the max impulse associated with the given key.
  108. /// If no impulse has been associated with this key, zero is returned.
  109. inline hkUint8 getMaxImpulseForKey ( const hkpShapeKey key ) const; 
  110. /// Stop storing the associated impulse value for this key.
  111. inline void removeKey ( const hkpShapeKey key );
  112. /// Checks if there are any hkpShapeKey-specific max impulse values defined.
  113. inline hkBool32 hasShapeKeySpecificMaxImpulses() { return m_shapeKeyToMaxImpulse.getSize(); }
  114. /// Return the weakest point on the object. 
  115. void findWeakestPoint( hkpShapeKey& keyOut, hkReal& weakestImpulseOut );
  116. public:
  117. HK_ALIGN16(hkpEntity*       m_entity);
  118. hkUFloat8                  m_maxImpulse; // set to 255 = (hkUFloat8::MAX_VALUE-1) if not breakable
  119. hkReal m_maxConstraintImpulse;
  120. private:
  121. /// Stores a the max impulse for given shape key.
  122. /// The first value is a shape key
  123. /// The second value is the int value field of hkUfloat8.
  124. hkPointerMap<hkpShapeKey, hkUint8> m_shapeKeyToMaxImpulse;
  125. };
  126. private:
  127. // return the entity util if one exists or create one 
  128. HK_FORCE_INLINE LimitContactImpulseUtil* getOrCreateUtil( hkpEntity* entity );
  129. public:
  130. hkpWorld* m_world;
  131. // an optional critical section to serialize access to this utility
  132. hkCriticalSection* m_criticalSection;
  133. hkpBreakOffPartsListener* m_breakOffPartsListener;
  134. };
  135. #include <Physics/Utilities/Destruction/BreakOffParts/hkpBreakOffPartsUtil.inl>
  136. #endif //INC_UTILITIES_BREAK_OFF_PARTS_UTIL_H
  137. /*
  138. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  139. * Confidential Information of Havok.  (C) Copyright 1999-2009
  140. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  141. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  142. * rights, and intellectual property rights in the Havok software remain in
  143. * Havok and/or its suppliers.
  144. * Use of this software for evaluation purposes is subject to and indicates
  145. * acceptance of the End User licence Agreement for this product. A copy of
  146. * the license is included with this software and is also available at www.havok.com/tryhavok.
  147. */