#pragma once #include "ShaderExpression.h" #include "Graphics/Descriptor.h" namespace Seele { DECLARE_REF(MaterialInstance) class Material { public: Material(); Material(Gfx::PGraphics graphics, Gfx::ODescriptorLayout layout, uint32 uniformDataSize, uint32 uniformBinding, std::string materialName, Array expressions, Array parameter, MaterialNode brdf); ~Material(); const Gfx::PDescriptorLayout getDescriptorLayout() const { return layout; } Gfx::PDescriptorLayout getDescriptorLayout() { return layout; } OMaterialInstance instantiate(); const std::string& getName() const { return materialName; } constexpr uint64 getId() const { return materialId; } static constexpr const PMaterial findMaterialById(uint64 id) { return materials[id]; } void save(ArchiveBuffer& buffer) const; void load(ArchiveBuffer& buffer); void compile(); private: Gfx::PGraphics graphics; uint32 uniformDataSize; uint32 uniformBinding; uint64 instanceId; uint64 materialId; Gfx::ODescriptorLayout layout; std::string materialName; Array codeExpressions; Array parameters; MaterialNode brdf; static std::atomic_uint64_t materialIdCounter; static Array materials; }; DEFINE_REF(Material) } // namespace Seele