// 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_FORWARDRENDERQUEUE_HPP #define NAZARA_FORWARDRENDERQUEUE_HPP #include #include #include #include #include #include #include #include #include #include #include #include class NzAbstractViewer; class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue, NzObjectListener { friend class NzForwardRenderTechnique; public: NzForwardRenderQueue() = default; ~NzForwardRenderQueue() = 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); void Sort(const NzAbstractViewer* viewer); private: bool OnObjectDestroy(const NzRefCounted* object, int index) override; void OnObjectReleased(const NzRefCounted* object, int index) override; /// Billboards struct BillboardData { NzColor color; NzVector3f center; NzVector2f size; NzVector2f sinCos; }; struct BatchedBillboardComparator { bool operator()(const NzMaterial* mat1, const NzMaterial* mat2); }; struct BatchedBillboardEntry { BatchedBillboardEntry(NzObjectListener* listener, int materialValue) : materialListener(listener, materialValue) { } NzMaterialConstListener materialListener; std::vector billboards; }; typedef std::map BatchedBillboardContainer; /// Sprites struct SpriteChain_XYZ_Color_UV { const NzVertexStruct_XYZ_Color_UV* vertices; unsigned int spriteCount; }; struct BatchedSpriteEntry { BatchedSpriteEntry(NzObjectListener* listener, int textureValue) : textureListener(listener, textureValue) { } std::vector spriteChains; NzTextureConstListener textureListener; }; struct BatchedSpriteMaterialComparator { bool operator()(const NzMaterial* mat1, const NzMaterial* mat2); }; typedef std::map BasicSpriteOverlayContainer; struct BatchedBasicSpriteEntry { BatchedBasicSpriteEntry(NzObjectListener* listener, int materialValue) : materialListener(listener, materialValue) { } NzMaterialConstListener materialListener; BasicSpriteOverlayContainer overlayMap; bool enabled = false; }; typedef std::map BasicSpriteBatches; /// Meshes struct MeshDataComparator { bool operator()(const NzMeshData& data1, const NzMeshData& data2); }; struct MeshInstanceEntry { MeshInstanceEntry(NzObjectListener* listener, int indexBufferValue, int vertexBufferValue) : indexBufferListener(listener, indexBufferValue), vertexBufferListener(listener, vertexBufferValue) { } std::vector instances; NzIndexBufferConstListener indexBufferListener; NzSpheref squaredBoundingSphere; NzVertexBufferConstListener vertexBufferListener; }; typedef std::map MeshInstanceContainer; struct BatchedModelMaterialComparator { bool operator()(const NzMaterial* mat1, const NzMaterial* mat2); }; struct BatchedModelEntry { BatchedModelEntry(NzObjectListener* listener, int materialValue) : materialListener(listener, materialValue) { } NzMaterialConstListener materialListener; MeshInstanceContainer meshMap; bool enabled = false; bool instancingEnabled = false; }; typedef std::map ModelBatches; struct TransparentModelData { NzMatrix4f transformMatrix; NzMeshData meshData; NzSpheref squaredBoundingSphere; const NzMaterial* material; }; typedef std::vector TransparentModelContainer; BatchedBillboardContainer billboards; BasicSpriteBatches basicSprites; ModelBatches opaqueModels; TransparentModelContainer transparentModels; std::vector transparentModelData; std::vector otherDrawables; }; #endif // NAZARA_FORWARDRENDERQUEUE_HPP