#ifndef MATERIAL_SYSTEM_H #define MATERIAL_SYSTEM_H #include "tier2/iappsystem.h" #include "tier0/platform.h" enum EImageFormat { IMAGE_FORMAT_R8_UINT, IMAGE_FORMAT_RGBA8_UNORM, IMAGE_FORMAT_BGRA8_UNORM, IMAGE_FORMAT_RGBA8_UINT, IMAGE_FORMAT_RGBA8_SINT, IMAGE_FORMAT_RGBA16_SFLOAT, IMAGE_FORMAT_RGBA32_SFLOAT, IMAGE_FORMAT_D32_SFLOAT, IMAGE_FORMAT_WINDOW, }; enum EImageType { IMAGE_TYPE_1D, IMAGE_TYPE_2D, IMAGE_TYPE_3D, IMAGE_TYPE_CUBE, IMAGE_TYPE_1D_ARRAY, IMAGE_TYPE_2D_ARRAY, IMAGE_TYPE_CUBE_ARRAY, }; enum EMultisampleType { MULTISAMPLE_TYPE_NONE, MULTISAMPLE_TYPE_2_SAMPLES, MULTISAMPLE_TYPE_4_SAMPLES, MULTISAMPLE_TYPE_8_SAMPLES, }; enum EResolveMode { RESOLVE_MODE_NONE, RESOLVE_MODE_ZERO, RESOLVE_MODE_AVERAGE, RESOLVE_MODE_MIN, RESOLVE_MODE_MAX, }; enum ELoadMode { LOAD_MODE_LOAD, LOAD_MODE_CLEAR, LOAD_MODE_DONT_CARE, }; enum EStoreMode { STORE_MODE_STORE, STORE_MODE_DONT_CARE, }; enum ETopologyMode { TOPOLOGY_MODE_POINT_LIST, TOPOLOGY_MODE_LINE_LIST, TOPOLOGY_MODE_LINE_STRIP, TOPOLOGY_MODE_TRIANGLE_LIST, TOPOLOGY_MODE_TRIANGLE_STRIP, }; abstract_class IRenderingObject { public: virtual void SetDebugName( const char *szName ) = 0; }; abstract_class IBuffer : public IRenderingObject { public: virtual void Lock() = 0; virtual void Unlock() = 0; virtual void *Map() = 0; virtual void Unmap() = 0; virtual uint32_t GetSize() = 0; }; typedef IBuffer IVertexBuffer; typedef IBuffer IIndexBuffer; abstract_class IImage : public IRenderingObject { public: virtual uint32_t GetImageWidth() = 0; virtual uint32_t GetImageHeight() = 0; virtual EImageFormat GetImageFormat() = 0; virtual EMultisampleType GetMultisampleType() = 0; }; abstract_class IShader { public: }; #define BEGIN_SHADER(name) \ class CShader_##name \ { #define END_SHADER() \ } abstract_class IMaterial { public: virtual void SetConstants( void *pData ) = 0; virtual void SetTexture( const char *szName, IImage *pImage ) = 0; virtual void SetBuffer( const char *szName, IBuffer *pImage ) = 0; }; abstract_class IRenderContext: public IAppSystem { public: virtual void Frame( float fTime ) = 0; virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) = 0; virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) = 0; virtual IImage *CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; virtual IImage *CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; virtual void DestroyBuffer( IBuffer *pBuffer ) = 0; virtual void DestroyImage( IImage *pImage ) = 0; virtual IShader *CreateShader( const char *szName ) = 0; virtual void DestroyShader( IShader *pMaterial ) = 0; virtual IMaterial *CreateMaterial( IShader *pShader ) = 0; virtual void DestroyMaterial( IMaterial *pMaterial ) = 0; virtual void SetMaterial( IMaterial *pMaterial ) = 0; virtual void SetVertexBuffer( IVertexBuffer *pBuffer ) = 0; virtual void SetIndexBuffer( IVertexBuffer *pBuffer ) = 0; virtual void DrawPrimitives( uint32_t nVertexCount, uint32_t nFirstVertex, uint32_t nInstanceCount, uint32_t nFirstInstance ) = 0; virtual void DrawPrimitivesIndexed( uint32_t nIndexCount, uint32_t nFirstIndex, uint32_t nVertexOffset, uint32_t nInstanceCount, uint32_t nFirstInstance ) = 0; }; abstract_class IMaterialSystem: public IAppSystem { public: virtual void Frame( float fTime ) = 0; virtual IRenderContext *GetRenderContext( void ) = 0; }; IMaterialSystem *Materials( void ); #endif