// 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_MODEL_HPP #define NAZARA_GRAPHICS_MODEL_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { struct NAZARA_GRAPHICS_API ModelParams : ResourceParameters { bool loadMaterials = true; FunctionRef(const std::shared_ptr& mesh)> meshCallback = nullptr; MeshParams mesh; bool IsValid() const; }; class Model; using ModelLibrary = ObjectLibrary; using ModelLoader = ResourceLoader; using ModelManager = ResourceManager; using ModelSaver = ResourceSaver; class NAZARA_GRAPHICS_API Model : public InstancedRenderable, public Resource { public: using Params = ModelParams; Model(std::shared_ptr graphicalMesh); Model(const Model&) = delete; Model(Model&&) noexcept = default; ~Model() = default; void BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector& elements) const override; const std::shared_ptr& GetIndexBuffer(std::size_t subMeshIndex) const; std::size_t GetIndexCount(std::size_t subMeshIndex) const; const std::shared_ptr& GetMaterial(std::size_t subMeshIndex) const override; std::size_t GetMaterialCount() const override; inline std::size_t GetSubMeshCount() const; const std::vector& GetVertexBufferData(std::size_t subMeshIndex) const; const std::shared_ptr& GetVertexBuffer(std::size_t subMeshIndex) const; inline void SetMaterial(std::size_t subMeshIndex, std::shared_ptr material); Model& operator=(const Model&) = delete; Model& operator=(Model&&) noexcept = default; static std::shared_ptr LoadFromFile(const std::filesystem::path& filePath, const ModelParams& params = ModelParams()); static std::shared_ptr LoadFromMemory(const void* data, std::size_t size, const ModelParams& params = ModelParams()); static std::shared_ptr LoadFromStream(Stream& stream, const ModelParams& params = ModelParams()); private: struct SubMeshData { std::shared_ptr material; std::vector vertexBufferData; }; NazaraSlot(GraphicalMesh, OnInvalidated, m_onInvalidated); std::shared_ptr m_graphicalMesh; std::vector m_submeshes; }; } #include #endif // NAZARA_GRAPHICS_MODEL_HPP