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

其他游戏

开发平台:

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_COLLISION_AGENT3_H
  9. #define HK_COLLIDE2_COLLISION_AGENT3_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Types/Physics/ContactPoint/hkContactPoint.h>
  12. struct hkpProcessCollisionInput;
  13. class hkpContactMgr;
  14. struct hkpProcessCollisionOutput;
  15. struct hkpCollisionQualityInfo;
  16. class hkpLinkedCollidable;
  17. class hkpCollisionDispatcher;
  18. #ifndef hkCollisionConstraintOwner
  19. class hkpConstraintOwner;
  20. # define hkCollisionConstraintOwner hkpConstraintOwner
  21. #endif
  22. struct hkpCollisionInput;
  23. class hkpCdBody;
  24. // this is a copied version from the hkpProcessCollisionOutput.h file
  25. # define HK_1N_MACHINE_SUPPORTS_WELDING 
  26. class hkpCollisionAgent;
  27. /// the base memory stream 
  28. struct hkpAgentEntry
  29. {
  30. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CDINFO, hkpAgentEntry );
  31. /// see hkAgent3::StreamCommand
  32. hkUchar     m_streamCommand;
  33. /// the type of the agent (to be used with the hkpCollisionDispatcher)
  34. hkUchar     m_agentType;
  35. /// The number of contact points, if you don't use this, set it to 1
  36. hkUchar     m_numContactPoints;
  37. /// the size of the agent in bytes
  38. hkUchar     m_size;
  39. };
  40. typedef void hkpAgentData;
  41. /// The input structure needed to call an implementation of an agent3
  42. struct hkpAgent3Input
  43. {
  44. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CDINFO, hkpAgent3Input );
  45. hkpAgent3Input() : m_overrideBodyA(HK_NULL) {}
  46. /// BodyA
  47. hkPadSpu<const hkpCdBody*> m_bodyA;
  48. /// BodyB
  49. hkPadSpu<const hkpCdBody*> m_bodyB;
  50. /// Original BodyA for the hkpCdBody hierarchy.
  51. /// This is only used when the hkpCollectionAgent3 calls routines from hkpCollectionCollectionAgent3 and then the NmMachine
  52. hkPadSpu<const hkpCdBody*> m_overrideBodyA;
  53. /// Pointer to hkpProcessCollisionInput
  54. hkPadSpu<const hkpProcessCollisionInput*> m_input;
  55. /// Pointer to hkpContactMgr
  56. hkPadSpu<hkpContactMgr*> m_contactMgr;
  57. /// a transform converting from b to a space
  58. hkTransform m_aTb;
  59. };
  60. struct hkpAgent3ProcessInput : public hkpAgent3Input
  61. {
  62. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CDINFO, hkpAgent3ProcessInput );
  63. /// for gsk convex agents using tim
  64. hkPadSpu<hkReal>          m_distAtT1;
  65. hkPadSpu<int> m_offsetPpuSectorMinusSpuSector;
  66. /// for agents using tim
  67. hkVector4       m_linearTimInfo;
  68. };
  69. namespace hkAgent3
  70. {
  71. /// An id, which can be used with the hkpCollisionDispatcher to get the right function
  72. typedef int AgentType;
  73. enum {
  74. MIN_TOTAL_SIZE = 16, // 16 = size of end command
  75. MAX_MEMORY_INCREASE = 80, // <todo: set back to 48 the maximum amount of memory an agent is allowed to increase every frame
  76. MAX_INITIAL_SIZE    = MAX_MEMORY_INCREASE + MIN_TOTAL_SIZE
  77. };
  78. enum StreamCommand
  79. {
  80. STREAM_NULL = 0,  // not defined
  81. STREAM_END  = 1,  // end of last sectors
  82. STREAM_CALL = 2,  // call the function declared in the dispatcher using the m_agentType
  83. STREAM_CALL_FLIPPED = 3, // call the function declared in the dispatcher using the m_agentType with flipped input variables
  84. STREAM_CALL_WITH_TIM = 4, // same but check tims before
  85. STREAM_CALL_WITH_TIM_FLIPPED = 5, // same as STREAM_CALL_WITH_TIM but using flipped input variables
  86. STREAM_CALL_AGENT = 6, // special mode for compatibility with old style agents.
  87. TRANSFORM_FLAG = 0x08, // when this flag is set in a command, then at least one of the hkpCdBodies in the agent entry is a hkpTransformShape.
  88. STREAM_CALL_WITH_TRANSFORM = TRANSFORM_FLAG | STREAM_CALL,
  89. STREAM_CALL_FLIPPED_WITH_TRANSFORM = TRANSFORM_FLAG | STREAM_CALL_FLIPPED,
  90. STREAM_CALL_WITH_TIM_WITH_TRANSFORM = TRANSFORM_FLAG | STREAM_CALL_WITH_TIM,
  91. STREAM_CALL_WITH_TIM_FLIPPED_WITH_TRANSFORM = TRANSFORM_FLAG | STREAM_CALL_WITH_TIM_FLIPPED,
  92. STREAM_CALL_AGENT_WITH_TRANSFORM = TRANSFORM_FLAG | STREAM_CALL_AGENT,
  93. };
  94. //
  95. // Functions needed to create a full agent
  96. //
  97. /// Create an agent and return a pointer just after the agent (but 16byte aligned)
  98. typedef hkpAgentData* (HK_CALL* CreateFunc)( const hkpAgent3Input& input, hkpAgentEntry* entry, hkpAgentData* agentData );
  99. /// Destroy the agent
  100. typedef void  (HK_CALL* DestroyFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, hkpContactMgr* mgr, hkCollisionConstraintOwner& constraintOwner, hkpCollisionDispatcher* dispatcher );
  101. /// call to process collision, which should produce a nice manifold<br>
  102. /// Notes: 
  103. ///  - separatingNormalOut is set to HK_NULL if SepNormalFunc was set to HK_NULL 
  104. ///  - You should set the entry->m_numContatPoints if possible, else set it to 1
  105. typedef hkpAgentData* (HK_CALL* ProcessFunc)( const hkpAgent3ProcessInput& input, hkpAgentEntry* entry, hkpAgentData* agentData, hkVector4* separatingNormalOut, hkpProcessCollisionOutput& result);
  106. enum Symmetric
  107. {
  108. IS_SYMMETRIC,
  109. IS_NOT_SYMMETRIC,
  110. IS_NOT_SYMMETRIC_AND_FLIPPED
  111. };
  112. //
  113. // If an agent uses tim technology it needs to implement:
  114. //
  115. /// An optional function, which you need to implement to enable tims.
  116. /// It calculates a valid separating plane (.w component is distance)
  117. typedef void  (HK_CALL* SepNormalFunc)( const hkpAgent3Input& input, hkpAgentEntry* entry, hkpAgentData* agentData, hkVector4& separatingNormalOut );
  118. /// An optional function, which you need to implement to enable tims
  119. /// This function removes all contact points held by the hkAgent3. You only need to implement
  120. /// this if SepNormalFunc is defined
  121. typedef hkpAgentData* (HK_CALL* CleanupFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, hkpContactMgr* mgr, hkCollisionConstraintOwner& constraintOwner );
  122. //
  123. // If an agent places contact points in the hkpProcessCollisionOutput.m_potentialContacts, 
  124. //  it needs to implement the following functions
  125. //
  126. /// Remove one contact point (including potential ones). This function should not call the contact mgr!
  127. typedef void (HK_CALL* RemovePointFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, hkContactPointId idToRemove );
  128. /// Commit a potential contact point (one which does not have an id yet. This function should not call the contact mgr!
  129. typedef void (HK_CALL* CommitPotentialFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, hkContactPointId newId );
  130. /// Flag a contact point to die at the next process call
  131. /// This is used when the contact point id is still valid and we need the contact point this very frame
  132. typedef void (HK_CALL* CreateZombieFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, hkContactPointId idTobecomeZombie );
  133. //
  134. // Other functions
  135. //
  136. /// Update child shapes with collision filter
  137. typedef void (HK_CALL* UpdateFilterFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, const hkpCdBody& bodyA, const hkpCdBody& bodyB, const hkpCollisionInput& input, hkpContactMgr* mgr, hkCollisionConstraintOwner& constraintOwner );
  138. /// Calculate statistics for all child agents
  139. typedef void (HK_CALL* CalcStatisticsFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, const hkpCollisionInput& input, hkStatisticsCollector* collector );
  140. /// Update child shapes with collision filter
  141. typedef void (HK_CALL* InvalidateTimFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, const hkpCollisionInput& input );
  142. /// Update child shapes with collision filter
  143. typedef void (HK_CALL* WarpTimeFunc)( hkpAgentEntry* entry, hkpAgentData* agentData, hkTime oldTime, hkTime newTime, const hkpCollisionInput& input );
  144. }
  145. #endif // HK_COLLIDE2_COLLISION_AGENT3_H
  146. /*
  147. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  148. * Confidential Information of Havok.  (C) Copyright 1999-2009
  149. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  150. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  151. * rights, and intellectual property rights in the Havok software remain in
  152. * Havok and/or its suppliers.
  153. * Use of this software for evaluation purposes is subject to and indicates
  154. * acceptance of the End User licence Agreement for this product. A copy of
  155. * the license is included with this software and is also available at www.havok.com/tryhavok.
  156. */