// Copyright (C) 2017 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_FORWARDRENDERQUEUE_HPP #define NAZARA_FORWARDRENDERQUEUE_HPP #include #include #include #include #include #include #include #include #include #include #include namespace Nz { class AbstractViewer; class NAZARA_GRAPHICS_API ForwardRenderQueue : public AbstractRenderQueue { friend class ForwardRenderTechnique; public: ForwardRenderQueue() = default; ~ForwardRenderQueue() = default; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr = nullptr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr, SparsePtr alphaPtr) override; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr alphaPtr) override; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr = nullptr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr, SparsePtr alphaPtr) override; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr alphaPtr) override; void AddDrawable(int renderOrder, const Drawable* drawable) override; void AddMesh(int renderOrder, const Material* material, const MeshData& meshData, const Boxf& meshAABB, const Matrix4f& transformMatrix) override; void AddSprites(int renderOrder, const Material* material, const VertexStruct_XYZ_Color_UV* vertices, std::size_t spriteCount, const Texture* overlay = nullptr) override; void Clear(bool fully = false) override; void Sort(const AbstractViewer* viewer); struct MaterialComparator { bool operator()(const Material* mat1, const Material* mat2) const; }; struct MaterialPipelineComparator { bool operator()(const MaterialPipeline* pipeline1, const MaterialPipeline* pipeline2) const; }; /// Billboards struct BillboardData { Color color; Vector3f center; Vector2f size; Vector2f sinCos; }; struct BatchedBillboardEntry { NazaraSlot(Material, OnMaterialRelease, materialReleaseSlot); std::vector billboards; }; using BatchedBillboardContainer = std::map; struct BatchedBillboardPipelineEntry { BatchedBillboardContainer materialMap; bool enabled = false; }; using BillboardPipelineBatches = std::map; /// Sprites struct SpriteChain_XYZ_Color_UV { const VertexStruct_XYZ_Color_UV* vertices; std::size_t spriteCount; }; struct BatchedSpriteEntry { NazaraSlot(Texture, OnTextureRelease, textureReleaseSlot); std::vector spriteChains; }; using SpriteOverlayBatches = std::map; struct BatchedBasicSpriteEntry { NazaraSlot(Material, OnMaterialRelease, materialReleaseSlot); SpriteOverlayBatches overlayMap; bool enabled = false; }; using SpriteMaterialBatches = std::map; struct BatchedSpritePipelineEntry { SpriteMaterialBatches materialMap; bool enabled = false; }; using SpritePipelineBatches = std::map; /// Meshes struct MeshDataComparator { bool operator()(const MeshData& data1, const MeshData& data2) const; }; struct MeshInstanceEntry { NazaraSlot(IndexBuffer, OnIndexBufferRelease, indexBufferReleaseSlot); NazaraSlot(VertexBuffer, OnVertexBufferRelease, vertexBufferReleaseSlot); std::vector instances; Spheref squaredBoundingSphere; }; using MeshInstanceContainer = std::map; struct BatchedModelEntry { NazaraSlot(Material, OnMaterialRelease, materialReleaseSlot); MeshInstanceContainer meshMap; bool enabled = false; }; using MeshMaterialBatches = std::map; struct BatchedMaterialEntry { std::size_t maxInstanceCount = 0; MeshMaterialBatches materialMap; }; using MeshPipelineBatches = std::map; struct UnbatchedModelData { Matrix4f transformMatrix; MeshData meshData; Spheref obbSphere; const Material* material; }; struct UnbatchedSpriteData { std::size_t spriteCount; const Material* material; const Texture* overlay; const VertexStruct_XYZ_Color_UV* vertices; }; struct Layer { BillboardPipelineBatches billboards; SpritePipelineBatches opaqueSprites; MeshPipelineBatches opaqueModels; std::vector depthSortedMeshes; std::vector depthSortedSprites; std::vector depthSortedMeshData; std::vector depthSortedSpriteData; std::vector otherDrawables; unsigned int clearCount = 0; }; std::map layers; private: BillboardData* GetBillboardData(int renderOrder, const Material* material, unsigned int count); Layer& GetLayer(int i); ///TODO: Inline void SortBillboards(Layer& layer, const Planef& nearPlane); void SortForOrthographic(const AbstractViewer* viewer); void SortForPerspective(const AbstractViewer* viewer); void OnIndexBufferInvalidation(const IndexBuffer* indexBuffer); void OnMaterialInvalidation(const Material* material); void OnTextureInvalidation(const Texture* texture); void OnVertexBufferInvalidation(const VertexBuffer* vertexBuffer); }; } #endif // NAZARA_FORWARDRENDERQUEUE_HPP