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

其他游戏

开发平台:

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_UTILITIES_POWERED_CHAIN_MAPPER_H
  9. #define HK_UTILITIES_POWERED_CHAIN_MAPPER_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Container/Array/hkObjectArray.h>
  12. #include <Common/Base/Container/PointerMap/hkPointerMap.h>
  13. class hkpConstraintInstance;
  14. class hkpEntity;
  15. class hkpConstraintMotor;
  16. class hkQuaternion;
  17. class hkpConstraintChainData;
  18. class hkpPoweredChainData;
  19. class hkpConstraintChainInstance;
  20. extern const hkClass hkpPoweredChainMapperClass;
  21. /// This class allows you to manage several overlapping powered chains.
  22. /// It allows you to set max forces and target orientations for motors.
  23. class hkpPoweredChainMapper : public hkReferencedObject
  24. {
  25. public:
  26. HK_DECLARE_REFLECTION();
  27. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CONSTRAINT);
  28. private:
  29. // You should only create the mapper with the buildChainMapper() function.
  30. hkpPoweredChainMapper() {}
  31. public:
  32. virtual ~hkpPoweredChainMapper();
  33. /// Holds parameters for the mapper-building function.
  34. struct Config
  35. {
  36. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpPoweredChainMapper::Config );
  37. /// Tells whether limit constraints should be created in parallel with the chains.
  38. ///
  39. /// Limit constraints use information from the existing powered/non-powered ragdoll/hinge constraints only.
  40. /// No limit constraints are created for any other types of constraints.
  41. hkBool m_createLimitConstraints;
  42. /// Should the chains clone motors or reuse the ones from the original constraints.
  43. hkBool m_cloneMotors;
  44. Config()
  45. {
  46. m_createLimitConstraints = false;
  47. m_cloneMotors = false;
  48. }
  49. };
  50. /// Used to specify the first and the last entity of a new chain.
  51. struct ChainEndpoints
  52. {
  53. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpPoweredChainMapper::ChainEndpoints );
  54. /// First entity in the chain.
  55. hkpEntity* m_start;
  56. /// Last entity in the chain.
  57. hkpEntity* m_end;
  58. };
  59. /// Builds a mapper with chains specified by entity pairs in the ChainEndpoints array. 
  60. /// Returns HK_NULL upon failure.
  61. static hkpPoweredChainMapper* HK_CALL buildChainMapper(const Config config, const hkArray<hkpConstraintInstance*>& allConstraints, const hkArray<ChainEndpoints>& pairs, hkArray<hkpConstraintInstance*>* unusedConstraints = HK_NULL);
  62. //
  63. // Setting link properties
  64. //
  65. /// Sets min/max force for one motor (specifed by the coordinateIndex) in all chains overlapping at the specified link (linkIndex)
  66. void setForceLimits(int linkIndex, int coordinageIndex /*motorIndex*/, hkReal minForce, hkReal maxForce);
  67. /// This appends the motors related to a given link to the motorsOut array.
  68. /// Note: there may be only one motor for a given link/coordinate index pair in a chain; but there may be several chains overlapping at the specified link.
  69. void getMotors(int linkIndex, int coordinateIndex, hkArray<hkpConstraintMotor*>& motorsOut);
  70. /// Return the total number of links.
  71. /// Note: as links order is a one-to-one match with the constraintArray passed to the buildChainMapper function, 
  72. /// some of the links might not lead to any target chains.
  73. inline int getNumLinks() { return m_links.getSize(); }
  74. /// Set motor for the given link/coordinate index
  75. void setMotors(int linkIndex, int coordinateIndex, hkpConstraintMotor* newMotor);
  76. /// Sets target orientations for all chains overlapping at the specified link.
  77. void setTargetOrientation(int linkIndex, const hkQuaternion& newTarget);
  78. //
  79. // Internal
  80. //
  81. /// Specifies a chain/index referenced by a link.
  82. struct Target
  83. {
  84. HK_DECLARE_REFLECTION();
  85. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT, Target );
  86. /// Targeted powered chain 
  87. hkpPoweredChainData* m_chain;
  88. /// Index of the targeted ConstraintInfo in the chain
  89. int m_infoIndex;
  90. };
  91. /// Holds information about a single link of the mapper.
  92. /// One link may point to none, one, or a few chains.
  93. /// Also a link may have a limit constraint associated with it.
  94. struct LinkInfo
  95. {
  96. HK_DECLARE_REFLECTION();
  97. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT, LinkInfo );
  98. /// This specifies the index of the first target for this link. All targets for a given link are groupped together.
  99. /// Those targets are set, when you call setMaxForce() or setTargetOrientation() for that link.
  100. int m_firstTargetIdx;
  101. /// Specifies the number of targets for this link.
  102. int m_numTargets;
  103. /// A limit constraint that functions in parallel with the chains.
  104. /// It is direcly related to using chains, and should be added/removed to/from the world when chains are removed.
  105. hkpConstraintInstance* m_limitConstraint;
  106. LinkInfo() : m_firstTargetIdx(-1), m_numTargets(0), m_limitConstraint(HK_NULL) {}
  107. LinkInfo(const LinkInfo& info) { m_firstTargetIdx = info.m_firstTargetIdx; m_numTargets = info.m_numTargets; m_limitConstraint = info.m_limitConstraint; }
  108. };
  109. /// Matches 1-1 the hkpConstraintInstance array passed to buildChainMapper()
  110. /// Note that some m_links may have no targets -- when a certain constraint is not used by the mapper.
  111. hkArray<struct LinkInfo> m_links;
  112. /// Combined array of targets for all the links.
  113. hkArray<struct Target> m_targets;
  114. /// Just an extra array listing directly all the chains owned by the mapper.
  115. hkArray<class hkpConstraintChainInstance*> m_chains;
  116. /// Finish up ctor.
  117. hkpPoweredChainMapper( hkFinishLoadedObjectFlag f ) :
  118. hkReferencedObject(f), m_links(f), m_targets(f), m_chains(f) {}
  119. };
  120. #endif // HK_UTILITIES_POWERED_CHAIN_MAPPER_H
  121. /*
  122. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  123. * Confidential Information of Havok.  (C) Copyright 1999-2009
  124. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  125. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  126. * rights, and intellectual property rights in the Havok software remain in
  127. * Havok and/or its suppliers.
  128. * Use of this software for evaluation purposes is subject to and indicates
  129. * acceptance of the End User licence Agreement for this product. A copy of
  130. * the license is included with this software and is also available at www.havok.com/tryhavok.
  131. */