// Copyright (C) 2012 Jérôme Leclercq // This file is part of the "Nazara Engine". // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_RENDERER_HPP #define NAZARA_RENDERER_HPP #include #include #include #include #include #include #define NazaraRenderer NzRenderer::Instance() class NzColor; class NzContext; class NzIndexBuffer; class NzRenderTarget; class NzShader; class NzUtility; class NzVertexBuffer; class NzVertexDeclaration; class NAZARA_API NzRenderer { public: NzRenderer(); ~NzRenderer(); void Clear(unsigned long flags = nzRendererClear_Color | nzRendererClear_Depth); void DrawIndexedPrimitives(nzPrimitiveType primitive, unsigned int firstIndex, unsigned int indexCount); void DrawPrimitives(nzPrimitiveType primitive, unsigned int firstVertex, unsigned int vertexCount); void Enable(nzRendererParameter parameter, bool enable); unsigned int GetMaxAnisotropyLevel() const; unsigned int GetMaxRenderTargets() const; unsigned int GetMaxTextureUnits() const; NzShader* GetShader() const; NzRenderTarget* GetTarget() const; NzRectui GetViewport() const; bool HasCapability(nzRendererCap capability) const; bool Initialize(); void SetBlendFunc(nzBlendFunc src, nzBlendFunc dest); void SetClearColor(const NzColor& color); void SetClearColor(nzUInt8 r, nzUInt8 g, nzUInt8 b, nzUInt8 a = 255); void SetClearDepth(double depth); void SetClearStencil(unsigned int value); void SetFaceCulling(nzFaceCulling cullingMode); void SetFaceFilling(nzFaceFilling fillingMode); bool SetIndexBuffer(const NzIndexBuffer* indexBuffer); bool SetShader(NzShader* shader); void SetStencilCompareFunction(nzRendererComparison compareFunc); void SetStencilFailOperation(nzStencilOperation failOperation); void SetStencilMask(nzUInt32 mask); void SetStencilPassOperation(nzStencilOperation passOperation); void SetStencilReferenceValue(unsigned int refValue); void SetStencilZFailOperation(nzStencilOperation zfailOperation); bool SetTarget(NzRenderTarget* target); bool SetVertexBuffer(const NzVertexBuffer* vertexBuffer); bool SetVertexDeclaration(const NzVertexDeclaration* vertexDeclaration); void SetViewport(const NzRectui& viewport); void Uninitialize(); static NzRenderer* Instance(); static bool IsInitialized(); private: bool EnsureStateUpdate(); typedef std::tuple VAO_Key; std::map m_vaos; nzRendererComparison m_stencilCompare; nzStencilOperation m_stencilFail; nzStencilOperation m_stencilPass; nzStencilOperation m_stencilZFail; nzUInt32 m_stencilMask; const NzIndexBuffer* m_indexBuffer; NzRenderTarget* m_target; NzShader* m_shader; NzUtility* m_utilityModule; const NzVertexBuffer* m_vertexBuffer; const NzVertexDeclaration* m_vertexDeclaration; bool m_vaoUpdated; bool m_capabilities[nzRendererCap_Max+1]; bool m_stencilFuncUpdated; bool m_stencilOpUpdated; unsigned int m_maxAnisotropyLevel; unsigned int m_maxRenderTarget; unsigned int m_maxTextureUnit; unsigned int m_stencilReference; static NzRenderer* s_instance; static bool s_initialized; }; #endif // NAZARA_RENDERER_HPP