hkpConstraintData.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_DYNAMICS2_CONSTRAINT_DATA_H
  9. #define HK_DYNAMICS2_CONSTRAINT_DATA_H
  10. #include <Physics/ConstraintSolver/Solve/hkpSolverResults.h>
  11. #include <Physics/ConstraintSolver/Solve/hkpSolve.h>
  12. #include <Physics/Dynamics/Constraint/hkpConstraintInfo.h>
  13. class hkpConstraintQueryIn;
  14. class hkpConstraintQueryOut;
  15. class hkpConstraintOwner;
  16. class hkpConstraintInstance;
  17. extern const hkClass hkpConstraintDataClass;
  18. extern const hkClass hkpConstraintInfoClass;
  19. // All runtime information of the constraints must start with an array of solverresults
  20. typedef void hkpConstraintRuntime;
  21. class hkpConstraintData;
  22. /// The base class for constraints.
  23. /// This class holds all information about the data of a constraint. 
  24. /// As this data is constant over the lifetime of a constraint, 
  25. class hkpConstraintData : public hkReferencedObject
  26. {
  27. public:
  28. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CONSTRAINT);
  29. HK_DECLARE_REFLECTION();
  30. // Serialization ctor
  31. hkpConstraintData(hkFinishLoadedObjectFlag f) : hkReferencedObject(f) {}
  32.             /// Types for canned contraints
  33.         enum ConstraintType
  34.         {
  35.             CONSTRAINT_TYPE_BALLANDSOCKET = 0,
  36.             CONSTRAINT_TYPE_HINGE = 1,
  37.             CONSTRAINT_TYPE_LIMITEDHINGE = 2,
  38.             CONSTRAINT_TYPE_POINTTOPATH = 3,
  39.             CONSTRAINT_TYPE_PRISMATIC = 6,
  40.             CONSTRAINT_TYPE_RAGDOLL = 7,
  41.             CONSTRAINT_TYPE_STIFFSPRING = 8,
  42.             CONSTRAINT_TYPE_WHEEL = 9,
  43.             CONSTRAINT_TYPE_GENERIC = 10,
  44.             CONSTRAINT_TYPE_CONTACT = 11,
  45.             CONSTRAINT_TYPE_BREAKABLE = 12,
  46.             CONSTRAINT_TYPE_MALLEABLE = 13,
  47.             CONSTRAINT_TYPE_POINTTOPLANE = 14,
  48.         CONSTRAINT_TYPE_PULLEY = 15,
  49. CONSTRAINT_TYPE_ROTATIONAL = 16,
  50. CONSTRAINT_TYPE_HINGE_LIMITS = 18,
  51. CONSTRAINT_TYPE_RAGDOLL_LIMITS = 19,
  52. CONSTRAINT_TYPE_CUSTOM = 20,
  53.         
  54.         // Constraint Chains
  55.         BEGIN_CONSTRAINT_CHAIN_TYPES = 100,        
  56.         CONSTRAINT_TYPE_STIFF_SPRING_CHAIN = 100,
  57.         CONSTRAINT_TYPE_BALL_SOCKET_CHAIN = 101,
  58.         CONSTRAINT_TYPE_POWERED_CHAIN = 102
  59.         };
  60. /// Default constructor. You cannot instantiate this class directly - see derived classes.
  61. /// This constructor just does some debug checks for alignment.
  62. inline hkpConstraintData();
  63. /// Destructor.
  64. inline virtual ~hkpConstraintData();
  65. /// Get the user data for the constraint (initialized to 0).
  66. inline hkUlong getUserData() const;
  67. /// Set the user data of the constraint.
  68. inline void setUserData( hkUlong data );
  69. /// Sets the maximum impulse that can be applied for this atom.
  70. /// Set it to HK_REAL_MAX to effectively disable the limit.
  71. virtual void setMaxLinearImpulse(hkReal maxImpulse) { HK_WARN_ONCE(0xad809031, "setMaxLinearImpulse() called on a constraint that doesn't support it."); }
  72. /// Gets the maximUm impulse that can be applied by this constraint.
  73. virtual hkReal getMaxLinearImpulse() const { return HK_REAL_MAX; }
  74. /// Choose the body to be notified when the constraint's impulse is breached.
  75. /// Only one of the bodies can be notified (as it is in the case of breached contact impulse).
  76. /// Typically you will want to notify the body with the lesser strength.
  77. /// 
  78. /// The callbacks are passed by the world to any attached hkpContactImpulseLimitBreachedListeners.
  79. /// The suggested way to handle those those callbacks is to use a hkpBreakOffPartsUtil.
  80. /// hkpBreafOffPartsUtil converts breached constraints into the "breached constact point" representation
  81. /// so that they can be treated uniformly by the hkpBreafOffPartsListener. To handle the callbacks you should
  82. /// implement your own hkpBreakOffPartsListener & attach it to the hkpBreakOffPartsUtil.
  83. /// See this demo for reference: Demos/Physics/Api/Dynamics/RigidBodies/BreakOffParts/BreakOffPartsDemo
  84. virtual void setBodyToNotify(int bodyIdx) {}
  85. /// Returns the index of the body that is notified when the constraint's impulse limit is breached.
  86. virtual hkUint8 getNotifiedBodyIndex() const { HK_ASSERT2(0xad809033, false, "getNotifiedBodyIndex() called on a constaint that doesn't support max impulse."); return 0xff; }
  87. /// Checks member variables of constraint for consistency
  88. /// this method will be empty for some constraints
  89. /// This method is automatically called by the constraint constructors
  90. virtual hkBool isValid() const = 0;
  91. /// Get the type of constraint
  92. virtual int getType() const = 0;
  93. //
  94. // Interface for solver runtime data 
  95. //
  96. /// Return runtime information
  97. struct RuntimeInfo
  98. {
  99. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpConstraintData::RuntimeInfo );
  100. int m_sizeOfExternalRuntime;
  101. int m_numSolverResults;
  102. };
  103. /// Get information about the size of the runtime data needed
  104. /// Notes:
  105. /// - if wantRuntime is set, you ask for a runtime information
  106. /// - Some constraint have their private runtime, so no need to externally allocate runtime info
  107. /// - Some constraint might not want to use any runtime information
  108. /// - All Runtimes of the constraints should start with an array of hkpSolverResults
  109. virtual void getRuntimeInfo( hkBool wantRuntime, RuntimeInfo& infoOut ) const = 0;
  110. /// Gives you access to the solver results in a generic way, use getRuntimeInfo to get the number of solver results
  111. virtual hkpSolverResults* getSolverResults( hkpConstraintRuntime* runtime );
  112. /// Initialize the runtime data. The default implementation simply zeros all values
  113. virtual void addInstance( hkpConstraintInstance* constraint, hkpConstraintRuntime* runtime, int sizeOfRuntime ) const;
  114. /// Drop an instance reference to this data
  115. inline void removeInstance( hkpConstraintInstance* constraint, hkpConstraintRuntime* runtime, int sizeOfRuntime ) const;
  116. protected: // exported data for the solver setup
  117. friend class hkpConstraintSolverSetup;
  118. public:
  119. //
  120. // Internal functions
  121. //
  122. //Sets up the constraint for the solver.
  123. virtual void buildJacobian( const hkpConstraintQueryIn &in, hkpConstraintQueryOut &out ) { HK_ASSERT2(0xad567bbd, false, "Function deprecated"); }
  124. // Does the constraint need a single-threaded callback before jacobians are built from atoms?
  125. virtual hkBool isBuildJacobianCallbackRequired() const { return false; }
  126. // The callback. Note that all callbacks are performed in single threaded mode.
  127. virtual void buildJacobianCallback( const hkpConstraintQueryIn &in ) { HK_ASSERT2(0xad567bbd, false, "This function must be overwritten, if the constraint requires a callback."); }
  128. struct ConstraintInfo : public hkpConstraintInfo
  129. {
  130. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_DYNAMICS, hkpConstraintData::ConstraintInfo );
  131. struct hkpConstraintAtom* m_atoms;
  132. hkUint32   m_sizeOfAllAtoms;
  133. };
  134. virtual void getConstraintInfo( ConstraintInfo& infoOut ) const = 0;
  135. static void HK_CALL getConstraintInfoUtil( const hkpConstraintAtom* atoms, int sizeOfAllAtoms, ConstraintInfo& infoOut );
  136. public:
  137. /// For any use you want. Not used by the Havok system.
  138. hkUlong m_userData; //+default(0)
  139. };
  140. #include <Physics/Dynamics/Constraint/hkpConstraintData.inl>
  141. #endif // HK_DYNAMICS2_CONSTRAINT_DATA_H
  142. /*
  143. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  144. * Confidential Information of Havok.  (C) Copyright 1999-2009
  145. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  146. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  147. * rights, and intellectual property rights in the Havok software remain in
  148. * Havok and/or its suppliers.
  149. * Use of this software for evaluation purposes is subject to and indicates
  150. * acceptance of the End User licence Agreement for this product. A copy of
  151. * the license is included with this software and is also available at www.havok.com/tryhavok.
  152. */