// 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_BASICRENDERQUEUE_HPP #define NAZARA_BASICRENDERQUEUE_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { class AbstractViewer; class NAZARA_GRAPHICS_API BasicRenderQueue : public AbstractRenderQueue { friend class ForwardRenderTechnique; public: struct BillboardData; BasicRenderQueue() = default; ~BasicRenderQueue() = default; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr = nullptr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr, SparsePtr alphaPtr) override; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr alphaPtr) override; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr = nullptr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr, SparsePtr alphaPtr) override; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr colorPtr = nullptr) override; void AddBillboards(int renderOrder, const Material* material, std::size_t billboardCount, const Recti& scissorRect, 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, const Recti& scissorRect) override; void AddSprites(int renderOrder, const Material* material, const VertexStruct_XYZ_Color_UV* vertices, std::size_t spriteCount, const Recti& scissorRect, const Texture* overlay = nullptr) override; void Clear(bool fully = false) override; inline const BillboardData* GetBillboardData(std::size_t billboardIndex) const; void Sort(const AbstractViewer* viewer); struct BillboardData { Color color; Vector3f center; Vector2f size; Vector2f sinCos; }; struct Billboard { int layerIndex; MovablePtr material; Nz::Recti scissorRect; BillboardData data; }; struct BillboardChain { int layerIndex; MovablePtr material; Nz::Recti scissorRect; std::size_t billboardCount; std::size_t billboardIndex; }; RenderQueue billboards; RenderQueue depthSortedBillboards; struct CustomDrawable { int layerIndex; MovablePtr drawable; }; RenderQueue customDrawables; struct Model { int layerIndex; MeshData meshData; MovablePtr material; Nz::Matrix4f matrix; Nz::Recti scissorRect; Nz::Spheref obbSphere; }; RenderQueue models; RenderQueue depthSortedModels; struct SpriteChain { int layerIndex; std::size_t spriteCount; MovablePtr material; MovablePtr overlay; MovablePtr vertices; Nz::Recti scissorRect; }; RenderQueue basicSprites; RenderQueue depthSortedSprites; private: inline Color ComputeColor(float alpha); inline Vector2f ComputeSinCos(float angle); inline Vector2f ComputeSize(float size); inline void RegisterLayer(int layerIndex); std::unordered_map m_pipelineCache; std::unordered_map m_materialCache; std::unordered_map m_overlayCache; std::unordered_map m_shaderCache; std::unordered_map m_textureCache; std::unordered_map m_vertexBufferCache; std::unordered_map m_layerCache; std::vector m_billboards; std::vector m_renderLayers; }; } #include #endif // NAZARA_BASICRENDERQUEUE_HPP