hkIndexedTransformSet.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_INDEXED_TRANSFORM_SET_H
  9. #define HK_INDEXED_TRANSFORM_SET_H
  10. /// hkIndexedTransformSetCinfo describes transforms needed by a hkMeshBody that has multiple transforms (over and
  11. /// above the basic position transform)
  12. ///
  13. /// A hkMeshBody needs to have indexed transforms, if all of its shapes' mesh sections have an index. Such a mesh shape
  14. /// is constructed when the method createCompoundShape is called on hkMeshShape. Each of the meshes is given a transform
  15. /// index, the first shape has index 0, the next 1 and so forth.
  16. /// When a hkMeshBody is constructed from the mesh shape, the positions of the 'child' meshes can be controlled via
  17. /// indexed transforms. This structure holds information about the child transforms.
  18. ///
  19. /// The other situation where indexed transforms are used is when skinning is in operation. Skinning occurs when
  20. /// the vertex buffer for a mesh section has skinning information defined on it.
  21. /// The actual sequence of transforms performed of a vertex will be as follows (the displayTransform
  22. /// is the main transform, set via setTransform on the hkMeshBody):
  23. ///
  24. /// vertex -> inverse -> matrix -> displayTransform
  25. ///
  26. /// or as column major matrix multiplication (Havok style)
  27. ///
  28. /// vertexOut = displayTransform * matrix * inverse * vertexIn
  29. ///
  30. /// Only the displayMatrix and the matrices can be modified on a per body basis - the inverses are immutable throughout
  31. /// the life of the hkMeshBody.
  32. ///
  33. /// The inverse transforms are there for skinning and are the 'bone space' transform. Setting the value to HK_NULL
  34. /// will indicate that inverse transforms are not needed, and may provide a significant speed improvement.
  35. ///
  36. /// sa hkMeshBody
  37. struct hkIndexedTransformSetCinfo
  38. {
  39. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkIndexedTransformSetCinfo );
  40. hkIndexedTransformSetCinfo();
  41. const hkMatrix4* m_inverseMatrices;               ///
  42. const hkMatrix4* m_matrices;                      ///
  43. int m_numMatrices;                          ///
  44. hkBool m_allTransformsAreAffine;            ///
  45. };
  46. extern const hkClass hkIndexedTransformSetClass;
  47. /// The hkIndexedTransformSet is designed make implementation transforms associated with hkMeshBody objects simpler
  48. /// to implement.
  49. ///
  50. /// If a hkMeshBody is holding indexed matrix information (identified by the hkIndexedTransformSetCinfo being passed
  51. /// into createBody on hkMeshSystem) - then that data needs to be held somehow. Although an implementation is free to
  52. /// choose how to do this - using the hkIndexedTransformSet makes it simpler.
  53. ///
  54. /// To use in an implementation of a hkMeshBody - hold a pointer to a hkIndexedTransformSet. If the body doesn't
  55. /// have any indexed transformed this member can just be left as HK_NULL. If it does construct a hkIndexedTranformSet
  56. /// using the hkIndexedTransformSetCinfo value passed into the createBody method. Finding transforms used for rendering
  57. /// is straight forward using the calculateMatrixes/calculateMatrix method. The class also has optimizations to stop
  58. /// unneeded calculations if for example the inverse transforms are all the identity.
  59. class hkIndexedTransformSet: public hkReferencedObject
  60. {
  61.     public:
  62.         HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA);
  63.             /// Ctor
  64.         hkIndexedTransformSet(const hkIndexedTransformSetCinfo& info);
  65. /// Get the total amount of matrices stored in this set
  66.         HK_FORCE_INLINE int getNumMatrices() const { return m_matrices.getSize(); }
  67.             /// Set a range of matrices
  68.         void setMatrices(int startIndex, const hkMatrix4* matrices, int numMatrices);
  69.             /// Get a range of matrices
  70.         void getMatrices(int startIndex, hkMatrix4* matrices, int numMatrices) const;
  71.             /// Get a range of inverse matrices
  72.         void getInverseMatrices(int startIndex, hkMatrix4* matrices, int numMatrices) const;
  73.             /// Get the matrices
  74.         HK_FORCE_INLINE const hkArray<hkMatrix4>& getMatrices() const { return m_matrices; }
  75.             /// Get the inverse matrices. If there are no inverses (ie effectively all identity) will return with a size of 0
  76.         HK_FORCE_INLINE const hkArray<hkMatrix4>& getInverseMatrices() const { return m_inverseMatrices; }
  77.             /// Returns true if it has inverse transforms
  78.         HK_FORCE_INLINE bool hasInverseMatrices() const { return m_inverseMatrices.getSize() > 0; }
  79.             /// Works out the transforms from model space to world/parent space
  80.         void calculateMatrices(hkArray<hkMatrix4>& matrices) const;
  81.             /// Works out a series of transforms
  82.         void calculateMatrices(const hkMatrix4& parentToWorld,  hkArray<hkMatrix4>& matrices) const;
  83.             /// Works out a single transform matrix
  84.         void calculateMatrix(int index, hkMatrix4& matrixOut) const;
  85.             /// Works out the transforms (taking into account the parentToWorld transform)
  86.         void calculateMatrix(const hkMatrix4& parentToWorld, int index, hkMatrix4& matrixOut) const;
  87.             // hkReferencedObject Implementation
  88.         virtual const hkClass* getClassType() const { return &hkIndexedTransformSetClass; }
  89.             // hkReferencedObject Implementation
  90.         virtual void calcContentStatistics( hkStatisticsCollector* collector,const hkClass* cls ) const;
  91. public:
  92. //
  93. // Members
  94. //
  95. hkArray<hkMatrix4> m_matrices; ///
  96.         hkArray<hkMatrix4> m_inverseMatrices;               ///
  97.         hkBool m_allMatricesAreAffine;                      ///
  98. };
  99. #endif // HK_INDEXED_TRANSFORM_SET_H
  100. /*
  101. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  102. * Confidential Information of Havok.  (C) Copyright 1999-2009
  103. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  104. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  105. * rights, and intellectual property rights in the Havok software remain in
  106. * Havok and/or its suppliers.
  107. * Use of this software for evaluation purposes is subject to and indicates
  108. * acceptance of the End User licence Agreement for this product. A copy of
  109. * the license is included with this software and is also available at www.havok.com/tryhavok.
  110. */