diff options
Diffstat (limited to 'materialsystem/shaderapidx9/meshdx10.h')
| -rw-r--r-- | materialsystem/shaderapidx9/meshdx10.h | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/materialsystem/shaderapidx9/meshdx10.h b/materialsystem/shaderapidx9/meshdx10.h new file mode 100644 index 0000000..2279612 --- /dev/null +++ b/materialsystem/shaderapidx9/meshdx10.h @@ -0,0 +1,282 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//===========================================================================// + + +#ifndef MESHDX10_H +#define MESHDX10_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "meshbase.h" +#include "shaderapi/ishaderdevice.h" + + +//----------------------------------------------------------------------------- +// Forward declaration +//----------------------------------------------------------------------------- +struct ID3D10Buffer; + + +//----------------------------------------------------------------------------- +// Dx10 implementation of a vertex buffer +//----------------------------------------------------------------------------- +class CVertexBufferDx10 : public CVertexBufferBase +{ + typedef CVertexBufferBase BaseClass; + + // Methods of IVertexBuffer +public: + virtual int VertexCount() const; + virtual VertexFormat_t GetVertexFormat() const; + virtual bool Lock( int nMaxVertexCount, bool bAppend, VertexDesc_t &desc ); + virtual void Unlock( int nWrittenVertexCount, VertexDesc_t &desc ); + virtual bool IsDynamic() const; + virtual void BeginCastBuffer( VertexFormat_t format ); + virtual void EndCastBuffer( ); + virtual int GetRoomRemaining() const; + + // Other public methods +public: + // constructor, destructor + CVertexBufferDx10( ShaderBufferType_t type, VertexFormat_t fmt, int nVertexCount, const char *pBudgetGroupName ); + virtual ~CVertexBufferDx10(); + + ID3D10Buffer* GetDx10Buffer() const; + int VertexSize() const; + + // Only used by dynamic buffers, indicates the next lock should perform a discard. + void Flush(); + +protected: + // Creates, destroys the index buffer + bool Allocate( ); + void Free(); + + ID3D10Buffer *m_pVertexBuffer; + VertexFormat_t m_VertexFormat; + int m_nVertexCount; + int m_nBufferSize; + int m_nFirstUnwrittenOffset; + bool m_bIsLocked : 1; + bool m_bIsDynamic : 1; + bool m_bFlush : 1; // Used only for dynamic buffers, indicates to discard the next time + +#ifdef _DEBUG + static int s_nBufferCount; +#endif +}; + + +//----------------------------------------------------------------------------- +// inline methods for CVertexBufferDx10 +//----------------------------------------------------------------------------- +inline ID3D10Buffer* CVertexBufferDx10::GetDx10Buffer() const +{ + return m_pVertexBuffer; +} + +inline int CVertexBufferDx10::VertexSize() const +{ + return VertexFormatSize( m_VertexFormat ); +} + + +//----------------------------------------------------------------------------- +// Dx10 implementation of an index buffer +//----------------------------------------------------------------------------- +class CIndexBufferDx10 : public CIndexBufferBase +{ + typedef CIndexBufferBase BaseClass; + + // Methods of IIndexBuffer +public: + virtual int IndexCount() const; + virtual MaterialIndexFormat_t IndexFormat() const; + virtual int GetRoomRemaining() const; + virtual bool Lock( int nMaxIndexCount, bool bAppend, IndexDesc_t &desc ); + virtual void Unlock( int nWrittenIndexCount, IndexDesc_t &desc ); + virtual void ModifyBegin( bool bReadOnly, int nFirstIndex, int nIndexCount, IndexDesc_t& desc ); + virtual void ModifyEnd( IndexDesc_t& desc ); + virtual bool IsDynamic() const; + virtual void BeginCastBuffer( MaterialIndexFormat_t format ); + virtual void EndCastBuffer( ); + + // Other public methods +public: + // constructor, destructor + CIndexBufferDx10( ShaderBufferType_t type, MaterialIndexFormat_t fmt, int nIndexCount, const char *pBudgetGroupName ); + virtual ~CIndexBufferDx10(); + + ID3D10Buffer* GetDx10Buffer() const; + MaterialIndexFormat_t GetIndexFormat() const; + + // Only used by dynamic buffers, indicates the next lock should perform a discard. + void Flush(); + +protected: + // Creates, destroys the index buffer + bool Allocate( ); + void Free(); + + // Returns the size of the index in bytes + int IndexSize() const; + + ID3D10Buffer *m_pIndexBuffer; + MaterialIndexFormat_t m_IndexFormat; + int m_nIndexCount; + int m_nBufferSize; + int m_nFirstUnwrittenOffset; // Used only for dynamic buffers, indicates where it's safe to write (nooverwrite) + bool m_bIsLocked : 1; + bool m_bIsDynamic : 1; + bool m_bFlush : 1; // Used only for dynamic buffers, indicates to discard the next time + +#ifdef _DEBUG + static int s_nBufferCount; +#endif +}; + + +//----------------------------------------------------------------------------- +// Returns the size of the index in bytes +//----------------------------------------------------------------------------- +inline int CIndexBufferDx10::IndexSize() const +{ + switch( m_IndexFormat ) + { + default: + case MATERIAL_INDEX_FORMAT_UNKNOWN: + return 0; + case MATERIAL_INDEX_FORMAT_16BIT: + return 2; + case MATERIAL_INDEX_FORMAT_32BIT: + return 4; + } +} + +inline ID3D10Buffer* CIndexBufferDx10::GetDx10Buffer() const +{ + return m_pIndexBuffer; +} + +inline MaterialIndexFormat_t CIndexBufferDx10::GetIndexFormat() const +{ + return m_IndexFormat; +} + + +//----------------------------------------------------------------------------- +// Dx10 implementation of a mesh +//----------------------------------------------------------------------------- +class CMeshDx10 : public CMeshBase +{ +public: + CMeshDx10(); + virtual ~CMeshDx10(); + + // FIXME: Make this work! Unsupported methods of IIndexBuffer + virtual bool Lock( int nMaxIndexCount, bool bAppend, IndexDesc_t& desc ) { Assert(0); return false; } + virtual void Unlock( int nWrittenIndexCount, IndexDesc_t& desc ) { Assert(0); } + virtual int GetRoomRemaining() const { Assert(0); return 0; } + virtual void ModifyBegin( bool bReadOnly, int nFirstIndex, int nIndexCount, IndexDesc_t& desc ) { Assert(0); } + virtual void ModifyEnd( IndexDesc_t& desc ) { Assert(0); } + virtual void Spew( int nIndexCount, const IndexDesc_t & desc ) { Assert(0); } + virtual void ValidateData( int nIndexCount, const IndexDesc_t &desc ) { Assert(0); } + virtual bool Lock( int nVertexCount, bool bAppend, VertexDesc_t &desc ) { Assert(0); return false; } + virtual void Unlock( int nVertexCount, VertexDesc_t &desc ) { Assert(0); } + virtual void Spew( int nVertexCount, const VertexDesc_t &desc ) { Assert(0); } + virtual void ValidateData( int nVertexCount, const VertexDesc_t & desc ) { Assert(0); } + virtual bool IsDynamic() const { Assert(0); return false; } + virtual void BeginCastBuffer( MaterialIndexFormat_t format ) { Assert(0); } + virtual void BeginCastBuffer( VertexFormat_t format ) { Assert(0); } + virtual void EndCastBuffer( ) { Assert(0); } + + void LockMesh( int numVerts, int numIndices, MeshDesc_t& desc ); + void UnlockMesh( int numVerts, int numIndices, MeshDesc_t& desc ); + + void ModifyBeginEx( bool bReadOnly, int firstVertex, int numVerts, int firstIndex, int numIndices, MeshDesc_t& desc ); + void ModifyBegin( int firstVertex, int numVerts, int firstIndex, int numIndices, MeshDesc_t& desc ); + void ModifyEnd( MeshDesc_t& desc ); + + // returns the # of vertices (static meshes only) + int VertexCount() const; + + virtual void BeginPass( ) {} + virtual void RenderPass() {} + virtual bool HasColorMesh() const { return false; } + virtual bool IsUsingMorphData() const { return false; } + virtual bool HasFlexMesh() const { return false; } + + // Sets the primitive type + void SetPrimitiveType( MaterialPrimitiveType_t type ); + + // Draws the entire mesh + void Draw(int firstIndex, int numIndices); + + void Draw(CPrimList *pPrims, int nPrims); + + // Copy verts and/or indices to a mesh builder. This only works for temp meshes! + virtual void CopyToMeshBuilder( + int iStartVert, // Which vertices to copy. + int nVerts, + int iStartIndex, // Which indices to copy. + int nIndices, + int indexOffset, // This is added to each index. + CMeshBuilder &builder ); + + // Spews the mesh data + void Spew( int numVerts, int numIndices, const MeshDesc_t & desc ); + + void ValidateData( int numVerts, int numIndices, const MeshDesc_t & desc ); + + // gets the associated material + IMaterial* GetMaterial(); + + void SetColorMesh( IMesh *pColorMesh, int nVertexOffset ) + { + } + + + virtual int IndexCount() const + { + return 0; + } + + virtual MaterialIndexFormat_t IndexFormat() const + { + Assert( 0 ); + return MATERIAL_INDEX_FORMAT_UNKNOWN; + } + + virtual void SetFlexMesh( IMesh *pMesh, int nVertexOffset ) {} + + virtual void DisableFlexMesh() {} + + virtual void MarkAsDrawn() {} + + virtual unsigned ComputeMemoryUsed() { return 0; } + + virtual VertexFormat_t GetVertexFormat() const { return VERTEX_POSITION; } + + virtual IMesh *GetMesh() + { + return this; + } + +private: + enum + { + VERTEX_BUFFER_SIZE = 1024 * 1024 + }; + + unsigned char* m_pVertexMemory; +}; + +#endif // MESHDX10_H + |