// Copyright (C) 2024 Jérôme "SirLynix" Leclercq (lynix680@gmail.com) // 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_GRAPHICS_MATERIALSETTINGS_HPP #define NAZARA_GRAPHICS_MATERIALSETTINGS_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { template struct TypeToMaterialPropertyType; template constexpr MaterialPropertyType TypeToMaterialPropertyType_v = TypeToMaterialPropertyType::PropertyType; template struct MaterialPropertyTypeInfo; struct MaterialPropertyNoValue {}; using MaterialPropertyTypeList = TypeList< MaterialPropertyNoValue, Color, bool, Vector2, Vector3, Vector4, float, Vector2, Vector3, Vector4, Int32, Vector2, Vector3, Vector4, UInt32, Vector2, Vector3, Vector4 >; class NAZARA_GRAPHICS_API MaterialSettings { public: struct TextureProperty; struct ValueProperty; using Value = TypeListInstantiate; MaterialSettings() = default; MaterialSettings(const MaterialSettings&) = delete; MaterialSettings(MaterialSettings&&) noexcept = default; ~MaterialSettings() = default; void AddPass(std::string_view passName, MaterialPass materialPass); inline void AddPass(std::size_t passIndex, MaterialPass materialPass); inline void AddPropertyHandler(std::unique_ptr propertyHandler); inline void AddTextureProperty(std::string propertyName, ImageType propertyType); inline void AddTextureProperty(std::string propertyName, ImageType propertyType, std::shared_ptr defaultTexture); inline void AddTextureProperty(std::string propertyName, ImageType propertyType, std::shared_ptr defaultTexture, const TextureSamplerInfo& defaultSamplerInfo); inline void AddValueProperty(std::string propertyName, MaterialPropertyType propertyType, Value defaultValue); template void AddValueProperty(std::string propertyName); template void AddValueProperty(std::string propertyName, U&& defaultValue); inline std::size_t FindTextureProperty(std::string_view propertyName) const; inline std::size_t FindValueProperty(std::string_view propertyName) const; const MaterialPass* GetPass(std::string_view passName) const; inline const MaterialPass* GetPass(std::size_t passIndex) const; inline const std::vector>& GetPasses() const; inline const std::vector>& GetPropertyHandlers() const; inline const TextureProperty& GetTextureProperty(std::size_t texturePropertyIndex) const; inline std::size_t GetTexturePropertyCount() const; inline const ValueProperty& GetValueProperty(std::size_t valuePropertyIndex) const; inline std::size_t GetValuePropertyCount() const; MaterialSettings& operator=(const MaterialSettings&) = delete; MaterialSettings& operator=(MaterialSettings&&) = default; struct TextureProperty { std::shared_ptr defaultTexture; std::string name; ImageType type; TextureSamplerInfo defaultSamplerInfo; }; struct ValueProperty { Value defaultValue; std::string name; MaterialPropertyType type; }; static constexpr std::size_t InvalidPropertyIndex = std::numeric_limits::max(); private: std::vector> m_propertyHandlers; std::vector> m_materialPasses; std::vector m_textureProperties; std::vector m_valueProperties; }; } #include #endif // NAZARA_GRAPHICS_MATERIALSETTINGS_HPP