hkpCollidable.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_COLLIDE2_COLLIDABLE_H
  9. #define HK_COLLIDE2_COLLIDABLE_H
  10. #include <Physics/Collide/Agent/Collidable/hkpCdBody.h>
  11. #include <Physics/Collide/Dispatch/BroadPhase/hkpTypedBroadPhaseHandle.h>
  12. class hkAabb;
  13. struct hkAabbUint32;
  14. class hkpShape;
  15. class hkTransform;
  16. /// An hkpCollidable can collide with other hkCollidables. It has an hkpShape and a hkMotionState (or hkTransform) for that shape.
  17. /// It also has a void* owner pointer.
  18. /// If you wish to make a collision query, you must create two hkpCollidable objects, and use the hkpCollisionDispatcher
  19. /// to access the correct hkpCollisionAgent for the query.
  20. /// hkpCollidable objects are automatically created by the hkpDynamics system, and the owner points to either the hkpEntity
  21. /// or hkpPhantom object in the world. See these classes for further information.
  22. class hkpCollidable : public hkpCdBody
  23. {
  24. public:
  25. HK_DECLARE_REFLECTION();
  26. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CDINFO, hkpCollidable);
  27. /// Creates a new hkpCollidable.
  28. /// Note: this constructor sets the owner to be HK_NULL, call setOwner to specify the owner and type
  29. /// Note: this collidable can't be used for normal collision detection (processCollision)
  30. inline hkpCollidable( const hkpShape* shape, const hkTransform* ms, int type = 0);
  31. /// Creates a new hkpCollidable.
  32. /// Note: this constructor sets the owner to be HK_NULL, call setOwner to specify the owner and type
  33. inline hkpCollidable( const hkpShape* shape, const hkMotionState* ms, int type = 0);
  34. inline ~hkpCollidable();
  35. /// Gets the hkpShape.
  36. inline const hkpShape* getShape() const;
  37. /// Sets the hkpShape. Note: you should be careful about setting the shape of a hkpCollidable at runtime, as if there
  38. /// are any collision agents that depend on it they will no longer work and crash
  39. inline void setShape(const hkpShape* shape);
  40. /// Sets the entity that owns this hkpCollidable.
  41. /// and the type, see hkpWorldObject::BroadPhaseType for possible types.
  42. inline void setOwner( void* owner );
  43. /// Gets the entity that owns this hkpCollidable.
  44. inline void* getOwner() const
  45. {
  46.         return const_cast<char*>( reinterpret_cast<const char*>(this) + m_ownerOffset ); 
  47.     }
  48. hkBool checkPerformance();
  49. //
  50. // TypedBroadPhase handle i/f:
  51. //
  52. /// Gets a const pointer to the embedded hkpTypedBroadPhaseHandle.
  53. inline const hkpTypedBroadPhaseHandle* getBroadPhaseHandle() const;
  54. /// Gets a non-const pointer to the embedded hkpTypedBroadPhaseHandle.
  55. inline       hkpTypedBroadPhaseHandle* getBroadPhaseHandle();
  56. /// Gets the hkpCollidableQualityType.
  57. HK_FORCE_INLINE hkpCollidableQualityType getQualityType() const;
  58. /// Sets the quality type of this collidable.
  59. ///
  60. /// Note: Having two non-continuously colliding dynamic objects and fixing one of them
  61. /// doesn't result in continuous collision detection between the objects
  62. /// if the agent is already created. The current agent will be replaced
  63. /// by its continuous version only after the bodies separate and lose their broadphase
  64. /// overlap (when their agent is destroyed) and then come into proximity again
  65. /// (creating a new agent of type conforming to their current qualityType settings).
  66. HK_FORCE_INLINE void setQualityType(hkpCollidableQualityType type);
  67. /// Gets the current allowed penetration depth.
  68. /// This is a hint to the continuous physics to allow some penetration for this object
  69. /// to reduce CPU load. Note: this is not a hard limit but more a guideline to the engine.
  70. /// Depending on the qualityType, this allowed penetration can be breached sooner or later.
  71. /// See user guide on continuous physics for details.
  72. HK_FORCE_INLINE hkReal getAllowedPenetrationDepth() const;
  73. /// Sets the current allowed penetration depth. See getAllowedPenetrationDepth for details.
  74. HK_FORCE_INLINE void setAllowedPenetrationDepth( hkReal val );
  75. public:
  76. ///Gets the collision filter info. This is an identifying value used by collision filters
  77. /// - for example, if a group filter is used, this value would encode a collision group and a system group
  78. HK_FORCE_INLINE hkUint32 getCollisionFilterInfo() const;
  79. /// Sets the collision filter info. This is an identifying value used by collision filters
  80. /// - for example, if a group filter is used, this value would encode a collision group and a system group
  81. HK_FORCE_INLINE void setCollisionFilterInfo( hkUint32 info );
  82. ///Gets the type. The possible types are defined in hkpWorldObject::BroadPhaseType.
  83. HK_FORCE_INLINE int getType() const;
  84. hkpCollidable( class hkFinishLoadedObjectFlag flag );
  85. public:
  86. struct BoundingVolumeData
  87. {
  88. HK_DECLARE_REFLECTION();
  89. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpCollidable::BoundingVolumeData );
  90. BoundingVolumeData();
  91. BoundingVolumeData( class hkFinishLoadedObjectFlag flag );
  92. HK_FORCE_INLINE bool hasAllocations() const ; 
  93. void deallocate();
  94. void allocate(int numChildShapes);
  95. HK_FORCE_INLINE void invalidate() { m_min[0] = 1; m_max[0] = 0; }
  96. HK_FORCE_INLINE bool isValid() const { return m_min[0] <= m_max[0]; }
  97. public:
  98. hkUint32 m_min[3];
  99. hkUint8 m_expansionMin[3];
  100. hkUint8 m_expansionShift;
  101. hkUint32 m_max[3];
  102. hkUint8 m_expansionMax[3];
  103. hkUint8 m_padding;
  104. hkUint16 m_numChildShapeAabbs; //+nosave
  105. hkUint16 m_capacityChildShapeAabbs; //+nosave
  106. hkAabbUint32* m_childShapeAabbs; //+nosave
  107. hkpShapeKey* m_childShapeKeys; //+nosave
  108. };
  109. enum ForceCollideOntoPpuReasons
  110. {
  111. /// Requested by hkpRigidBodyCinfo::m_forceCollideOntoPpu.
  112. FORCE_PPU_USER_REQUEST = 1,
  113. /// Requested by the shape, e.g. hkHeightFieldShapes cannot go to the spu. See the PLAYSTATION(R)3-specific documentation for what shapes are supported on spu.
  114. FORCE_PPU_SHAPE_REQUEST = 2,
  115. /// Some constraint modifiers like hkpSoftContactUtil require getting collision callbacks on the ppu, therefore forcing the collision detection for the modified objects to stay on the ppu.
  116. FORCE_PPU_MODIFIER_REQUEST = 4,
  117. };
  118. protected:
  119. /// This is used by hkDynamics to point to the hkpRigidBody.
  120. /// Check the type before doing casts.
  121. /// Note: You can use hkGetRigidBody(hkpCollidable*) to get a type checked owner
  122. /// (defined in file <hkdynamics/entity/hkpRigidBody.h> )
  123. /// It is an offset from 'this' to the owner as it assumes that if
  124. /// a collidable has an owner, the collidable is a member of that owner.
  125. /// Stored as an offset so that the serialization can handle it 'as is'.
  126. hkInt8 m_ownerOffset; // +nosave
  127. public:
  128. /// PLAYSTATION(R)3 only: If this flag is non zero, all collision agents attached to this body will run on the ppu only
  129. /// This is a bitfield using ForceCollideOntoPpuReasons. 
  130. hkUint8   m_forceCollideOntoPpu;
  131. // The shape size to be downloaded to the spu, must be a multiple of 16
  132. hkUint16 m_shapeSizeOnSpu; //+nosave
  133. class hkpTypedBroadPhaseHandle m_broadPhaseHandle;
  134. public:
  135. struct BoundingVolumeData m_boundingVolumeData; //+nosave
  136. // Should be set to the allowed penetration depth
  137. hkReal m_allowedPenetrationDepth;
  138. };
  139. # include <Physics/Collide/Agent/Collidable/hkpCollidable.inl>
  140. #endif // HK_COLLIDE2_COLLIDABLE_H
  141. /*
  142. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  143. * Confidential Information of Havok.  (C) Copyright 1999-2009
  144. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  145. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  146. * rights, and intellectual property rights in the Havok software remain in
  147. * Havok and/or its suppliers.
  148. * Use of this software for evaluation purposes is subject to and indicates
  149. * acceptance of the End User licence Agreement for this product. A copy of
  150. * the license is included with this software and is also available at www.havok.com/tryhavok.
  151. */