// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Graphics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_DEFERREDGEOMETRYPASS_HPP #define NAZARA_DEFERREDGEOMETRYPASS_HPP #include #include #include #include #include #include namespace Nz { class NAZARA_GRAPHICS_API DeferredGeometryPass : public DeferredRenderPass { friend class DeferredRenderTechnique; public: DeferredGeometryPass(); virtual ~DeferredGeometryPass(); bool Process(const SceneData& sceneData, unsigned int firstWorkTexture, unsigned int secondWorkTexture) const override; bool Resize(const Vector2ui& dimensions) override; protected: struct ShaderUniforms; void DrawBillboards(const SceneData& sceneData, const BasicRenderQueue& renderQueue, const RenderQueue& billboards) const; void DrawBillboards(const SceneData& sceneData, const BasicRenderQueue& renderQueue, const RenderQueue& billboards) const; void DrawModels(const SceneData& sceneData, const BasicRenderQueue& renderQueue, const RenderQueue& models) const; void DrawSprites(const SceneData& sceneData, const BasicRenderQueue& renderQueue, const RenderQueue& sprites) const; const ShaderUniforms* GetShaderUniforms(const Shader* shader) const; void OnShaderInvalidated(const Shader* shader) const; static bool Initialize(); static void Uninitialize(); struct ShaderUniforms { NazaraSlot(Shader, OnShaderUniformInvalidated, shaderUniformInvalidatedSlot); NazaraSlot(Shader, OnShaderRelease, shaderReleaseSlot); int eyePosition; int sceneAmbient; int textureOverlay; }; struct SpriteBatch { std::size_t spriteCount; const Material* material; const Texture* overlayTexture; Recti scissorRect; }; mutable std::unordered_map m_shaderUniforms; mutable std::vector m_spriteBatches; Buffer m_vertexBuffer; RenderStates m_clearStates; ShaderRef m_clearShader; TextureRef m_whiteTexture; VertexBuffer m_billboardPointBuffer; VertexBuffer m_spriteBuffer; static IndexBuffer s_quadIndexBuffer; static VertexBuffer s_quadVertexBuffer; static VertexDeclaration s_billboardInstanceDeclaration; static VertexDeclaration s_billboardVertexDeclaration; }; } #endif // NAZARA_DEFERREDGEOMETRYPASS_HPP