// Copyright (C) 2016 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_MATERIALPIPELINE_HPP #define NAZARA_MATERIALPIPELINE_HPP #include #include #include #include #include #include #include #include namespace Nz { struct MaterialPipelineInfo : RenderStates { bool alphaTest = false; bool depthSorting = false; bool hasAlphaMap = false; bool hasDiffuseMap = false; bool hasEmissiveMap = false; bool hasHeightMap = false; bool hasNormalMap = false; bool hasSpecularMap = false; bool shadowReceive = true; UberShaderConstRef uberShader; }; inline bool operator==(const MaterialPipelineInfo& lhs, const MaterialPipelineInfo& rhs); inline bool operator!=(const MaterialPipelineInfo& lhs, const MaterialPipelineInfo& rhs); class MaterialPipeline; using MaterialPipelineConstRef = ObjectRef; using MaterialPipelineLibrary = ObjectLibrary; using MaterialPipelineRef = ObjectRef; class NAZARA_GRAPHICS_API MaterialPipeline : public RefCounted { friend class Graphics; friend MaterialPipelineLibrary; public: struct Instance; MaterialPipeline(const MaterialPipeline&) = delete; MaterialPipeline(MaterialPipeline&&) = delete; ~MaterialPipeline() = default; inline const Instance& Apply(UInt32 flags = ShaderFlags_None) const; MaterialPipeline& operator=(const MaterialPipeline&) = delete; MaterialPipeline& operator=(MaterialPipeline&&) = delete; inline const MaterialPipelineInfo& GetInfo() const; inline const Instance& GetInstance(UInt32 flags = ShaderFlags_None) const; static MaterialPipelineRef GetPipeline(const MaterialPipelineInfo& pipelineInfo); struct Instance { RenderPipeline renderPipeline; UberShaderInstance* uberInstance = nullptr; std::array uniforms; }; private: inline MaterialPipeline(const MaterialPipelineInfo& pipelineInfo); void GenerateRenderPipeline(UInt32 flags) const; static bool Initialize(); template static MaterialPipelineRef New(Args&&... args); static void Uninitialize(); MaterialPipelineInfo m_pipelineInfo; mutable std::array m_instances; using PipelineCache = std::unordered_map; static PipelineCache s_pipelineCache; static MaterialPipelineLibrary::LibraryMap s_library; }; } #include #endif // NAZARA_MATERIALPIPELINE_HPP