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

其他游戏

开发平台:

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 INC_UTILITIES_TRANSFORM_COLLAPSE_UTIL_H
  9. #define INC_UTILITIES_TRANSFORM_COLLAPSE_UTIL_H
  10. #include <Common/Base/hkBase.h>
  11. class hkpRigidBody;
  12. class hkpShape;
  13. /// This utility class provides functionality to navigate the shape hierarchy of one or multiple rigid bodies and manipulate transform,
  14. /// convex transform and convex translate shapes - possibly collapsing them into the child transform (by updating vertices, for example).
  15. class hkpTransformCollapseUtil
  16. {
  17. public:
  18. /// The SharedShapeBehaviour enum determines what happens when a transforms can be collapsed into a shape shared 
  19. /// by more than one shape or rigid body (since collapsing will cause duplication in that case - the shape will no longer
  20. /// be shared).
  21. enum SharedShapeBehaviour
  22. {
  23. /// The transform will be collapsed into the shape, creating a unique (non-shared) shape.
  24. ALWAYS_COLLAPSE,
  25. /// The transform will not be collapsed into the shape.
  26. NEVER_COLLAPSE,
  27. /// The transform will be collapsed into the shape if the number of shapes/rigid bodies sharing it is less than
  28. /// a threshold (specified by the m_sharedShapeThreshold member of CollapseOptions)
  29. COLLAPSE_IF_LESS_THAN_THRESHOLD,
  30. };
  31. /// Options used by the "collapseTransforms" method.
  32. struct Options
  33. {
  34. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpTransformCollapseUtil::Options );
  35. /// Specified how to behave when a transform can be collapsed into a shape shared by other shapes/rigid bodies.
  36. /// Default is ALWAYS_COLLAPSE.
  37. SharedShapeBehaviour m_sharedShapeBehaviour;
  38. /// If using the COLLAPSE_IF_LESS_THAN_THRESHOLD behavior, shared shapes will only be collapsed if they are
  39. /// shared by less than this amount of shapes/rigid bodies.
  40. int m_sharedShapeThreshold;
  41. /// If true, transform shapes applied to a list shape will be moved to the children in the list (and possibly
  42. /// collapsed there).
  43. /// Default is true.
  44. hkBool m_propageTransformInList;
  45. /// Constructor, sets defaults.
  46. Options ();
  47. };
  48. /// This struct will be filled by the "collapseTransforms" methods with information about how much work was done.
  49. struct Results
  50. {
  51. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkpTransformCollapseUtil::Results );
  52. /// Number of transform shapes collapsed into their childs (T->x  becoming x')
  53. int m_numCollapsedShapes;
  54. /// Number of unnecessary transform shapes removed (T->x becoming x)
  55. int m_numIdentityTransformsRemoved;
  56. /// Number of transform shapes converted to specialized versions (convex transform, convex translate)
  57. int m_numSpecializedTransformShapes;
  58. /// Number of transforms shapes propagated to list shapes (T->L->x,y,z.. becoming L'->(T->x),(T->y),(T->z))
  59. int m_numPropagatedTransformsToLists;
  60. /// Constructors, sets defaults.
  61. Results();
  62. /// Uses the HK_REPORT macro to report the values stored in the struct.
  63. void report() const;
  64. /// Resets all results to 0.
  65. void reset();
  66. };
  67. /// Collapses, if possible, transform shapes in the given rigid body.
  68. static hkResult HK_CALL collapseTransforms (hkpRigidBody* rigidBody, const Options& options, Results& resultsOut);
  69. /// Collapses, if possible, transform shapes in the given set of rigid bodies.
  70. static hkResult HK_CALL collapseTransforms (hkArray<hkpRigidBody*>& rigidBodies, const Options& options, Results& resultsOut);
  71. /// Collapses, if possible, transform shapes in the given hkpShape.
  72. static hkResult HK_CALL collapseTransforms (const hkpShape* shape, const Options& options, Results& resultsOut, hkpShape** shapeOut);
  73. /// Try to modify the transform shape (of shape is a transform shape), otherwise create a transform shape with shape as its child
  74. /// If the final transform has an identity transform, remove the extra transform shape
  75. static const hkpShape* HK_CALL transformTransformShape (const hkpShape* shape, const hkTransform& transform );
  76. private:
  77. // Always returns a "new" shape
  78. static const hkpShape* collapseShapesRecursively (const hkpShape* shape, const Options& options, class _SharedShapeData& sharedShapeData, Results& resultsOut);
  79. // Always returns a "new" shape
  80. static const hkpShape* collapseTransformShape (const hkpShape* transformShape, const Options& options, class _SharedShapeData& sharedShapeData, Results& resultsOut);
  81. };
  82. #endif //INC_UTILITIES_TRANSFORM_COLLAPSE_UTIL_H
  83. /*
  84. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  85. * Confidential Information of Havok.  (C) Copyright 1999-2009
  86. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  87. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  88. * rights, and intellectual property rights in the Havok software remain in
  89. * Havok and/or its suppliers.
  90. * Use of this software for evaluation purposes is subject to and indicates
  91. * acceptance of the End User licence Agreement for this product. A copy of
  92. * the license is included with this software and is also available at www.havok.com/tryhavok.
  93. */