//===== Copyright © 1996-2005, 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( const unsigned char *pInstanceCommandBuffer ) {} virtual bool HasColorMesh() const { return false; } virtual bool IsUsingMorphData() const { return false; } virtual bool HasFlexMesh() const { return false; } virtual VertexStreamSpec_t *GetVertexStreamSpec() const { return NULL; } virtual void DrawInstances( MaterialPrimitiveType_t type, int nCount, const MeshInstanceData_t *pInstanceData ) {} // Sets the primitive type void SetPrimitiveType( MaterialPrimitiveType_t type ); // Using vertex ID stream? bool IsUsingVertexID() const { return false; } // Using tessellation for subd surfaces? TessellationMode_t GetTessellationType() const { return TESSELLATION_MODE_DISABLED; } // Draws the entire mesh void Draw(int firstIndex, int numIndices); void DrawModulated( const Vector4D &vecDiffuseModulation, 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 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