Files
funnygame/public/materialsystem/imaterialsystem.h
2026-02-19 00:39:20 +02:00

246 lines
7.3 KiB
C++

#ifndef MATERIAL_SYSTEM_H
#define MATERIAL_SYSTEM_H
#include "tier0/platform.h"
#include "tier2/iappsystem.h"
class IGameWindow;
class IGameWindowManager;
#define VULKAN_FRAMES_IN_FLIGHT 2
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_UNORM,
IMAGE_FORMAT_RGBA16_UINT,
IMAGE_FORMAT_RGBA16_SINT,
IMAGE_FORMAT_RGBA16_SFLOAT,
IMAGE_FORMAT_RGBA32_SFLOAT,
IMAGE_FORMAT_D32_SFLOAT,
IMAGE_FORMAT_WINDOW,
};
enum EVertexFormat
{
VERTEX_FORMAT_X32_SFLOAT,
VERTEX_FORMAT_XY32_SFLOAT,
VERTEX_FORMAT_XYZ32_SFLOAT,
VERTEX_FORMAT_XYZW32_SFLOAT,
};
enum EIndexFormat
{
INDEX_FORMAT_USHORT,
INDEX_FORMAT_UINT,
};
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,
};
//-----------------------------------------------------------------------------
// Basic rendering object
//-----------------------------------------------------------------------------
abstract_class IRenderingObject
{
public:
virtual ~IRenderingObject() = default;
virtual void SetDebugName( const char *szName ) = 0;
};
//-----------------------------------------------------------------------------
// Buffer object
//-----------------------------------------------------------------------------
abstract_class IBuffer : public IRenderingObject
{
public:
virtual ~IBuffer() = default;
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;
//-----------------------------------------------------------------------------
// Image object
//-----------------------------------------------------------------------------
abstract_class IImage : public IRenderingObject
{
public:
virtual uint32_t GetImageWidth() = 0;
virtual uint32_t GetImageHeight() = 0;
virtual EImageFormat GetImageFormat() = 0;
virtual EMultisampleType GetMultisampleType() = 0;
};
//-----------------------------------------------------------------------------
// Shader object
//-----------------------------------------------------------------------------
abstract_class IShader
{
public:
virtual ~IShader() = default;
virtual uint32_t PSGetResourceByName( const char *szName ) = 0;
virtual uint32_t VSGetResourceByName( const char *szName ) = 0;
virtual void AddLayout( int iIndex, int iStride ) = 0;
virtual void AddAttribute( int iBufferIndex, int iLocation, EVertexFormat eFormat, int iOffset ) = 0;
virtual void SetTopology( ETopologyMode eTopology ) = 0;
virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat ) = 0;
virtual void SetDepthImage( EImageFormat eFormat ) = 0;
virtual void DisablePixelShader( bool bDisable) = 0;
virtual void Build() = 0;
};
//-----------------------------------------------------------------------------
// Material handle
// It allows to specify resources in shaders such as textures, buffers etc.
//
// Resources must be updated prior to the frame, which can be done
// prior to the frame.
//-----------------------------------------------------------------------------
abstract_class IMaterial
{
public:
virtual ~IMaterial() = default;
virtual void VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) = 0;
virtual void PSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) = 0;
virtual void VSSetConstantsBuffer( uint32_t uRegister, IBuffer *pImage ) = 0;
virtual void PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pImage ) = 0;
};
abstract_class IRenderCommandList
{
public:
virtual void ResetRendering() = 0;
virtual void SetRenderTarget( uint32_t uIndex, IImage *pImage ) = 0;
virtual void SetClearColor( uint32_t uIndex, float r, float g, float b, float a ) = 0;
virtual void SetDepthTarget( IImage *pDepth ) = 0;
virtual void SetClearDepth( float fVal ) = 0;
virtual void SetRenderResolution( uint32_t iWidth, uint32_t iHeight ) = 0;
virtual void SetScissors( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight ) = 0;
virtual void SetViewport( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight, float fMinDepth, float fMaxDepth ) = 0;
virtual void SetMaterial( IMaterial *pMaterial ) = 0;
virtual void SetVertexBuffer( uint32_t uBinding, 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;
virtual void ResolveImage( IImage *pOriginal, IImage *pResolved ) = 0;
virtual void StartRecording() = 0;
virtual void EndRecording() = 0;
};
//-----------------------------------------------------------------------------
// Rendering context
//
// Responsible for the object handling
//-----------------------------------------------------------------------------
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 IBuffer *CreateConstantBuffer( uint32_t nSize ) = 0;
virtual IBuffer *CreateStorageBuffer( 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 IRenderCommandList *CreateCommandList() = 0;
virtual void DestroyCommandList( IRenderCommandList *pCommandList ) = 0;
virtual void SubmitCommandList(IRenderCommandList *pList) = 0;
virtual void SetMainWindowManager( IGameWindowManager *pWindowManager ) = 0;
virtual void RenderGameWindow( IGameWindow *pWindow ) = 0;
virtual void RegisterGameWindow( IGameWindow *pWindow ) = 0;
virtual void UnregisterGameWindow( IGameWindow *pWindow ) = 0;
};
#define RENDER_CONTEXT_INTERFACE_VERSION "RenderContext001"
#define MATERIAL_SYSTEM_INTERFACE_VERSION "MaterialSystem001"
abstract_class IMaterialSystem: public IAppSystem
{
public:
virtual void Frame( float fTime ) = 0;
virtual void RenderGameWindow( IGameWindow *pWindow ) = 0;
};
#endif