hkpBreakableConstraintData.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_BREAKABLE_CONSTRAINT_H
  9. #define HK_BREAKABLE_CONSTRAINT_H
  10. #include <Physics/Dynamics/Constraint/hkpConstraintData.h>
  11. #include <Physics/ConstraintSolver/Constraint/Atom/hkpConstraintAtom.h>
  12. class hkpWorld;
  13. extern const hkClass hkpBreakableConstraintDataClass;
  14. /// Definition of the breakable constraint class which is essentially a wrapper around a hkpConstraintInstance.
  15. /// The constraint will "break" ie. cease to apply forces/impulse to maintain itself
  16. /// whenever the "threshold" is exceeded. 
  17. /// N.B. Currently, "threshold" is an empirical value
  18. /// based on the magnitude of the force(s) required to maintain the constraint and 
  19. /// must be hand-tweaked, but larger values produce "harder-to-break" constraints.
  20. /// N.B This constraint can be shared. In this case all constraints will break at the very same time
  21. class hkpBreakableConstraintData : public hkpConstraintData
  22. {
  23. public:
  24. HK_DECLARE_REFLECTION();
  25. /// Construct the constraint with a pointer to the constraint to be broken
  26. /// and a link to the hkpWorld object (needed for the constraint to perform its logic).
  27. /// The constraint to be 'breakable' should be passed in along with the world.
  28. ///
  29. /// The breakable constraint essentially wraps another constraint.  A reference 
  30. /// is added to the constraint passed in (and removed upon destruction). The 
  31. /// world pointer is need in case you want the constraint to be automatically 
  32. /// removed from the world when breakage occurs.  NOTE: Instead of adding the 
  33. /// original constraint to the world, you should add this breakable constraint. 
  34. /// Do not add both constraints.
  35. hkpBreakableConstraintData( hkpConstraintData* constraintData );
  36. /// The reference to the original constraint is removed.
  37. ~hkpBreakableConstraintData();
  38. /// Set the current threshold.
  39. /// N.B. Currently, "threshold" is an empirical value
  40. /// based on the magnitude of the force(s) required to maintain the constraint and 
  41. /// must be hand-tweaked, but larger values produce "harder-to-break" constraints.
  42. inline void setThreshold(hkReal thresh);
  43. /// Remove Constraint from world when broken
  44. inline void setRemoveWhenBroken(hkBool tf);
  45. /// Set this to true if you want to undo all impulses
  46. /// applied between now and the time of breakage.<br>
  47. /// As the constraint is not broken by the solver, the
  48. /// solver might apply a huge impulse before the constraint breaks.
  49. /// So even if a constraint door brakes, it might be able to stop
  50. /// a fast car hitting it.
  51. /// Setting this flag to true enables a workaround, which reverts
  52. /// back the velocity of the two bodies involved before the time
  53. /// of breakage. This workaround can have some artifacts, especially
  54. /// when used with keyframed objects, but might work very well in
  55. /// other cases.
  56. inline void setRevertBackVelocityOnBreak( hkBool b );
  57. /// Returns whether constraint will be removed when it breaks
  58. inline hkBool getRemoveWhenBroken() const;
  59. /// read setRevertBackVelocityOnBreak() for details
  60. inline hkBool getRevertBackVelocityOnBreak() const;
  61. /// Returns whether the constraint is in broken state
  62. inline hkBool getIsBroken( const hkpConstraintInstance* instance );
  63. /// Set the broken state of the given constraint instance
  64. void setBroken ( hkpConstraintInstance* instance, hkBool broken, hkReal currentForce = 0.0f );
  65. /// Returns the breaking threshold
  66. inline hkReal getThreshold() const;
  67. /// Check consistency of constraint members
  68. virtual hkBool isValid() const;
  69. // hkpConstraintData interface implementation
  70. virtual int getType() const;
  71. struct Runtime
  72. {
  73. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpBreakableConstraintData::Runtime );
  74. hkBool m_isBroken;
  75. hkReal m_linearVelcityA[3];
  76. hkReal m_linearVelcityB[3];
  77. hkReal m_angularVelcityA[3];
  78. hkReal m_angularVelcityB[3];
  79. };
  80. inline Runtime* HK_CALL getRuntime( hkpConstraintRuntime* runtime );
  81. // hkpConstraintData interface implementation
  82. virtual void getRuntimeInfo( hkBool wantRuntime, hkpConstraintData::RuntimeInfo& infoOut ) const;
  83. public:
  84. /// Gets the wrapped constraint
  85. inline hkpConstraintData* getWrappedConstraintData();
  86. /// Gets the wrapped constraint
  87. inline const hkpConstraintData* getWrappedConstraintData() const;
  88. //protected:
  89. public: // as they are reset in hkpWorld::addConstraint.
  90. struct hkpBridgeAtoms m_atoms;
  91. /// The wrapped constraint
  92. hkpConstraintData* m_constraintData;
  93. // the size of the runtime of the child constraint
  94. hkUint16 m_childRuntimeSize;
  95. // the number of solver results of the child constraint
  96. hkUint16 m_childNumSolverResults;
  97. public:
  98. /// The threshold of breakage
  99. hkReal m_solverResultLimit;
  100. /// Remove breakable constraint from world when broken? 
  101. hkBool  m_removeWhenBroken;
  102. /// See setRevertBackVelocityOnBreak()
  103. hkBool  m_revertBackVelocityOnBreak;
  104. /// Needed to build an jacobian, which is doing nothing
  105. void buildNopJacobian( const hkpConstraintQueryIn &in, hkpConstraintQueryOut &out );
  106. public:
  107. /// This is where the constraint is either solved for or broken
  108. void buildJacobian( const hkpConstraintQueryIn &in, hkpConstraintQueryOut &out );
  109. // Does the constraint need a single-threaded callback before jacobians are built from atoms?
  110. virtual hkBool isBuildJacobianCallbackRequired() const { return true; }
  111. // The callback. Note that all callbacks are performed in single threaded mode.
  112. virtual void buildJacobianCallback( const hkpConstraintQueryIn &in );
  113. virtual void getConstraintInfo( hkpConstraintData::ConstraintInfo& info ) const;
  114. public:
  115. // This is to allow loading of pre-3.3 assets.
  116. //
  117. // In 3.3 we have two problematic members: m_childRuntimeSize and m_childNumSolverResults.
  118. //
  119. // Initialization of those members depends on a call to a virtual method of a different object, 
  120. // and we cannot do that safely in our current serialization framework neither at the time 
  121. // of converting assets nor in the finish-up constructor.
  122. //
  123. // Therefore we're doing that in hkpWorld::addConstraint().
  124. //
  125. hkpBreakableConstraintData(hkFinishLoadedObjectFlag f);
  126. };
  127. #include <Physics/Dynamics/Constraint/Breakable/hkpBreakableConstraintData.inl>
  128. #endif 
  129. /*
  130. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  131. * Confidential Information of Havok.  (C) Copyright 1999-2009
  132. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  133. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  134. * rights, and intellectual property rights in the Havok software remain in
  135. * Havok and/or its suppliers.
  136. * Use of this software for evaluation purposes is subject to and indicates
  137. * acceptance of the End User licence Agreement for this product. A copy of
  138. * the license is included with this software and is also available at www.havok.com/tryhavok.
  139. */