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

其他游戏

开发平台:

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_MULTIPLE_VERTEX_BUFFER_H
  9. #define HK_MULTIPLE_VERTEX_BUFFER_H
  10. class hkMemoryMeshVertexBuffer;
  11. #include <Common/Base/Container/Array/hkObjectArray.h>
  12. #include <Common/GeometryUtilities/Mesh/hkMeshVertexBuffer.h>
  13. extern const hkClass hkMultipleVertexBufferClass;
  14. /// The hkMultipleVertexBuffer class allows multiple contained vertex buffers to appear as a single vertex buffer
  15. ///
  16. /// It's often useful to be able to make multiple vertex buffers appear to an application as a single vertex buffer.
  17. /// For example in an implementation of the hkMeshSystem if a vertex buffer has non shared elements, internally
  18. /// it would be beneficial to have share vertex data in one buffer and non shared in another. If this shared and non
  19. /// shared data is held in objects with the hkMeshVertexBuffer interface - they can be returned together as an
  20. /// apparent single vertex buffer, by containing them in a hkMultipleVertexBuffer. When the multiple vertex buffer is cloned
  21. /// it can clone the contained vertex buffers - and the fully shared one will just be referenced counted - saving memory
  22. /// and perhaps improving performance.
  23. ///
  24. /// A multiple vertex buffer can contain one or more contained vertex buffers. A vertex format is specified when the
  25. /// multiple vertex buffer is constructed. Each of the elements of multiple buffers vertex buffer format needs to be
  26. /// mapped to an element of a contained vertex buffer. This mapping is set up by calling 'addElement', for each element
  27. /// of the multiple vertex buffers vertex format. Once all of the elements have been added a call to 'completeConstruction'
  28. /// should be made.
  29. ///
  30. /// The multiple vertex buffer has an extra trick - in that it provides a limited amount of emulation of different
  31. /// vertex element type conversions. If the data type in the vertex format is different from the multiple vertex buffers
  32. /// vertex format, when a lock takes place, a conversion vertex buffer (m_lockedBuffer) is created, and it will hold
  33. /// the vertex elements in the data format the multiple vertex buffer is presenting. The conversion between the internal
  34. /// and external element formats must be possible through the hkVertexBufferUtil::convert method.
  35. ///
  36. /// For an example of usage, the hkgMeshSystem uses the hkMultipleVertexBuffer to implement skinning. The p hkg graphics
  37. /// library doesn't support hardware skinning on many platforms. To get around this problem, the hkgMeshSystem,
  38. /// creates a hkMultipleVertexBuffer for a vertex buffer that contains skinning data. The skinning data is held in a
  39. /// memory vertex buffer which is in a suitable format for software skinning. Conversions between the formats is handled
  40. /// automatically by the hkMultipleVertexBuffer implementation.
  41. ///
  42. /// sa hkMeshVertexBuffer
  43. class hkMultipleVertexBuffer: public hkMeshVertexBuffer
  44. {
  45.     public:
  46.         HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA);
  47.             /// Ctor
  48.         hkMultipleVertexBuffer(const hkVertexFormat& format, int numVertices);
  49. /// Copy Ctor
  50.         hkMultipleVertexBuffer(const hkMultipleVertexBuffer& rhs);
  51.             // hkMeshVertexBuffer implementation
  52.         virtual hkMeshVertexBuffer* clone();
  53. // hkMeshVertexBuffer implementation
  54. virtual bool isSharable() { return m_isSharable; }
  55.             // hkMeshVertexBuffer implementation
  56.         virtual void getVertexFormat( hkVertexFormat& formatOut ) { formatOut = m_vertexFormat; }
  57.             // hkMeshVertexBuffer implementation
  58.         virtual int getNumVertices() { return m_numVertices; }
  59.             // hkMeshVertexBuffer implementation
  60.         virtual LockResult lock( const LockInput& input, LockedVertices& lockedVerticesOut );
  61.             // hkMeshVertexBuffer implementation
  62.         virtual LockResult partialLock( const LockInput& input, const PartialLockInput& partialInput, LockedVertices& lockedOut);
  63.             // hkMeshVertexBuffer implementation
  64.         virtual void getElementVectorArray(const LockedVertices& lockedVertices, int elementIndex, hkVector4* compData);
  65.             // hkMeshVertexBuffer implementation
  66.         virtual void setElementVectorArray(const LockedVertices& lockedVertices, int elementIndex, const hkVector4* compData);
  67.             // hkMeshVertexBuffer implementation
  68.         virtual void getElementIntArray(const LockedVertices& lockedVertices, int elementIndex, int* compData);
  69.             // hkMeshVertexBuffer implementation
  70.         virtual void setElementIntArray(const LockedVertices& lockedVertices, int elementIndex, const int* compData);
  71.             // hkMeshVertexBuffer implementation
  72.         virtual void unlock( const LockedVertices& lockedVertices );
  73.             /// Add an element
  74.         void addElement(int vertexBufferIndex, int elementIndex);
  75.             /// Add a vertex buffer
  76.         void addVertexBuffer(hkMeshVertexBuffer* vertexBuffer);
  77. /// Must be called before the buffer can be used
  78. void completeConstruction();
  79.             /// Returns the current update count - a non zero number that changes every time there is a write lock
  80.         HK_FORCE_INLINE hkUint32 getUpdateCount() const { return m_updateCount; }
  81. // Get a vertex buffer
  82. HK_FORCE_INLINE hkMeshVertexBuffer* getVertexBuffer(int index) const { return m_vertexBufferInfos[index].m_vertexBuffer; }
  83.             // hkReferencedObject Implementation
  84.         virtual const hkClass* getClassType() const { return &hkMultipleVertexBufferClass; }
  85.             // hkReferencedObject Implementation
  86.         virtual void calcContentStatistics( hkStatisticsCollector* collector,const hkClass* cls ) const;
  87.     protected:
  88. /// ElementInfo
  89.         struct ElementInfo
  90.         {
  91. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkMultipleVertexBuffer::ElementInfo );
  92.             hkUint8 m_vertexBufferIndex;                            ///
  93.             hkUint8 m_elementIndex;                                 ///
  94.         };
  95. /// VertexBufferInfo
  96.         struct VertexBufferInfo
  97.         {
  98. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_SCENE_DATA, hkMultipleVertexBuffer::VertexBufferInfo );
  99.             VertexBufferInfo() : m_isLocked(false) {}
  100.             hkRefPtr<hkMeshVertexBuffer> m_vertexBuffer;                ///
  101.             hkMeshVertexBuffer::LockedVertices m_lockedVertices;        ///
  102.             hkBool m_isLocked; ///
  103.         };
  104. /// LockedElement
  105.         struct LockedElement
  106.         {
  107.             hkUint8 m_vertexBufferIndex;                            ///
  108.             hkUint8 m_elementIndex;                                 ///
  109.             hkUint8 m_lockedBufferIndex;                            ///
  110.             hkUint8 m_vertexFormatIndex;                            ///
  111.             hkUint8 m_lockFlags;                                    ///
  112.             hkUint8 m_outputBufferIndex;                            ///
  113.             hkInt8 m_emulatedIndex;                                 ///
  114.         };
  115.         static HK_FORCE_INLINE bool _less(const LockedElement& a, const LockedElement& b)
  116.         {
  117.             if (a.m_vertexBufferIndex != b.m_vertexBufferIndex)
  118.             {
  119.                 return a.m_vertexBufferIndex < b.m_vertexBufferIndex;
  120.             }
  121.             // All of the element indices must be unique
  122.             return a.m_elementIndex < b.m_elementIndex;
  123.         }
  124. void _unlockVertexBuffers();
  125. hkMeshVertexBuffer::LockResult _lockElements( const hkMeshVertexBuffer::LockInput& input, hkMeshVertexBuffer::LockedVertices& lockedOut);
  126. protected:
  127. //
  128. // Members
  129. //
  130.         hkVertexFormat m_vertexFormat;                              ///
  131.         hkArray<LockedElement> m_lockedElements;                    ///
  132.         hkRefPtr<hkMemoryMeshVertexBuffer> m_lockedBuffer;          ///
  133.         hkArray<ElementInfo> m_elementInfos; ///
  134.         hkObjectArray<VertexBufferInfo> m_vertexBufferInfos;
  135. int m_numVertices; ///
  136.         hkBool m_isLocked;
  137.         hkUint32 m_updateCount;                                     ///
  138.         hkBool m_writeLock;                                         ///
  139. hkBool m_isSharable;
  140. hkBool m_constructionComplete;
  141. };
  142. #endif // HK_MULTIPLE_VERTEX_BUFFER_H
  143. /*
  144. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  145. * Confidential Information of Havok.  (C) Copyright 1999-2009
  146. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  147. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  148. * rights, and intellectual property rights in the Havok software remain in
  149. * Havok and/or its suppliers.
  150. * Use of this software for evaluation purposes is subject to and indicates
  151. * acceptance of the End User licence Agreement for this product. A copy of
  152. * the license is included with this software and is also available at www.havok.com/tryhavok.
  153. */