// Copyright (C) 2015 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_DEFERREDRENDERQUEUE_HPP #define NAZARA_DEFERREDRENDERQUEUE_HPP #include #include #include #include #include #include #include #include #include #include #include class NzForwardRenderQueue; class NAZARA_GRAPHICS_API NzDeferredRenderQueue : public NzAbstractRenderQueue { public: NzDeferredRenderQueue(NzForwardRenderQueue* forwardQueue); ~NzDeferredRenderQueue() = default; void AddBillboard(const NzMaterial* material, const NzVector3f& position, const NzVector2f& size, const NzVector2f& sinCos = NzVector2f(0.f, 1.f), const NzColor& color = NzColor::White) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr sinCosPtr = nullptr, NzSparsePtr colorPtr = nullptr) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr sinCosPtr, NzSparsePtr alphaPtr) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr anglePtr, NzSparsePtr colorPtr = nullptr) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr anglePtr, NzSparsePtr alphaPtr) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr sinCosPtr = nullptr, NzSparsePtr colorPtr = nullptr) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr sinCosPtr, NzSparsePtr alphaPtr) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr anglePtr, NzSparsePtr colorPtr = nullptr) override; void AddBillboards(const NzMaterial* material, unsigned int count, NzSparsePtr positionPtr, NzSparsePtr sizePtr, NzSparsePtr anglePtr, NzSparsePtr alphaPtr) override; void AddDrawable(const NzDrawable* drawable) override; void AddMesh(const NzMaterial* material, const NzMeshData& meshData, const NzBoxf& meshAABB, const NzMatrix4f& transformMatrix) override; void AddSprites(const NzMaterial* material, const NzVertexStruct_XYZ_Color_UV* vertices, unsigned int spriteCount, const NzTexture* overlay = nullptr) override; void Clear(bool fully = false); struct MeshDataComparator { bool operator()(const NzMeshData& data1, const NzMeshData& data2) const; }; struct MeshInstanceEntry { NazaraSlot(NzIndexBuffer, OnIndexBufferRelease, indexBufferReleaseSlot); NazaraSlot(NzVertexBuffer, OnVertexBufferRelease, vertexBufferReleaseSlot); std::vector instances; }; typedef std::map MeshInstanceContainer; struct BatchedModelMaterialComparator { bool operator()(const NzMaterial* mat1, const NzMaterial* mat2) const; }; struct BatchedModelEntry { NazaraSlot(NzMaterial, OnMaterialRelease, materialReleaseSlot); MeshInstanceContainer meshMap; bool enabled = false; bool instancingEnabled = false; }; typedef std::map ModelBatches; ModelBatches opaqueModels; NzForwardRenderQueue* m_forwardQueue; void OnIndexBufferInvalidation(const NzIndexBuffer* indexBuffer); void OnMaterialInvalidation(const NzMaterial* material); void OnVertexBufferInvalidation(const NzVertexBuffer* vertexBuffer); }; #endif // NAZARA_DEFERREDRENDERQUEUE_HPP