// 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_ABSTRACTRENDERQUEUE_HPP #define NAZARA_ABSTRACTRENDERQUEUE_HPP #include #include #include #include #include #include #include #include #include namespace Nz { class Drawable; class Material; class Texture; struct MeshData; class NAZARA_GRAPHICS_API AbstractRenderQueue { public: struct DirectionalLight; struct PointLight; struct SpotLight; AbstractRenderQueue() = default; AbstractRenderQueue(const AbstractRenderQueue&) = delete; AbstractRenderQueue(AbstractRenderQueue&&) = default; virtual ~AbstractRenderQueue(); // Je ne suis vraiment pas fan du nombre de surcharges pour AddBillboards, // mais je n'ai pas d'autre solution tout aussi performante pour le moment... virtual void AddBillboard(int renderOrder, const Material* material, const Vector3f& position, const Vector2f& size, const Vector2f& sinCos = Vector2f(0.f, 1.f), const Color& color = Color::White) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr = nullptr, SparsePtr colorPtr = nullptr) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr, SparsePtr alphaPtr) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr colorPtr = nullptr) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr alphaPtr) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr = nullptr, SparsePtr colorPtr = nullptr) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr sinCosPtr, SparsePtr alphaPtr) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr colorPtr = nullptr) = 0; virtual void AddBillboards(int renderOrder, const Material* material, unsigned int count, SparsePtr positionPtr, SparsePtr sizePtr, SparsePtr anglePtr, SparsePtr alphaPtr) = 0; virtual void AddDrawable(int renderOrder, const Drawable* drawable) = 0; virtual void AddDirectionalLight(const DirectionalLight& light); virtual void AddMesh(int renderOrder, const Material* material, const MeshData& meshData, const Boxf& meshAABB, const Matrix4f& transformMatrix) = 0; virtual void AddPointLight(const PointLight& light); virtual void AddSpotLight(const SpotLight& light); virtual void AddSprites(int renderOrder, const Material* material, const VertexStruct_XYZ_Color_UV* vertices, unsigned int spriteCount, const Texture* overlay = nullptr) = 0; virtual void Clear(bool fully = false); AbstractRenderQueue& operator=(const AbstractRenderQueue&) = delete; AbstractRenderQueue& operator=(AbstractRenderQueue&&) = default; struct DirectionalLight { Color color; Matrix4f transformMatrix; Vector3f direction; Texture* shadowMap; float ambientFactor; float diffuseFactor; }; struct PointLight { Color color; Vector3f position; Texture* shadowMap; float ambientFactor; float attenuation; float diffuseFactor; float invRadius; float radius; }; struct SpotLight { Color color; Matrix4f transformMatrix; Vector3f direction; Vector3f position; Texture* shadowMap; float ambientFactor; float attenuation; float diffuseFactor; float innerAngleCosine; float invRadius; float outerAngleCosine; float outerAngleTangent; float radius; }; std::vector directionalLights; std::vector pointLights; std::vector spotLights; }; } #endif // NAZARA_ABSTRACTRENDERQUEUE_HPP