| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef MATERIAL_MATERIALLOADER_H |
| #define MATERIAL_MATERIALLOADER_H |
|
|
| #include <memory> |
|
|
| #include <QDir> |
| #include <QString> |
| #include <yaml-cpp/yaml.h> |
|
|
| #include "Materials.h" |
| #include "trim.h" |
|
|
| namespace Materials |
| { |
| class MaterialLibrary; |
| class MaterialLibraryLocal; |
|
|
| class MaterialEntry |
| { |
| public: |
| MaterialEntry() = default; |
| MaterialEntry(const std::shared_ptr<MaterialLibraryLocal>& library, |
| const QString& modelName, |
| const QString& dir, |
| const QString& modelUuid); |
| virtual ~MaterialEntry() = default; |
|
|
| virtual void |
| addToTree(std::shared_ptr<std::map<QString, std::shared_ptr<Material>>> materialMap) = 0; |
|
|
| std::shared_ptr<MaterialLibraryLocal> getLibrary() const |
| { |
| return _library; |
| } |
| QString getName() const |
| { |
| return _name; |
| } |
| QString getDirectory() const |
| { |
| return _directory; |
| } |
| QString getUUID() const |
| { |
| return _uuid; |
| } |
|
|
| protected: |
| std::shared_ptr<MaterialLibraryLocal> _library; |
| QString _name; |
| QString _directory; |
| QString _uuid; |
| }; |
|
|
| class MaterialYamlEntry: public MaterialEntry |
| { |
| public: |
| MaterialYamlEntry(const std::shared_ptr<MaterialLibraryLocal>& library, |
| const QString& modelName, |
| const QString& dir, |
| const QString& modelUuid, |
| const YAML::Node& modelData); |
| ~MaterialYamlEntry() override = default; |
|
|
| void |
| addToTree(std::shared_ptr<std::map<QString, std::shared_ptr<Material>>> materialMap) override; |
|
|
| const YAML::Node& getModel() const |
| { |
| return _model; |
| } |
| YAML::Node* getModelPtr() |
| { |
| return &_model; |
| } |
|
|
| private: |
| MaterialYamlEntry(); |
|
|
| static QString |
| yamlValue(const YAML::Node& node, const std::string& key, const std::string& defaultValue); |
| static std::shared_ptr<QList<QVariant>> readList(const YAML::Node& node, |
| bool isImageList = false); |
| static std::shared_ptr<QList<QVariant>> readImageList(const YAML::Node& node); |
| static std::shared_ptr<Array2D> read2DArray(const YAML::Node& node, int columns); |
| static std::shared_ptr<Array3D> read3DArray(const YAML::Node& node, int columns); |
|
|
| YAML::Node _model; |
| }; |
|
|
| class MaterialLoader |
| { |
| public: |
| MaterialLoader(const std::shared_ptr<std::map<QString, std::shared_ptr<Material>>>& materialMap, |
| const std::shared_ptr<std::list<std::shared_ptr<MaterialLibrary>>>& libraryList); |
| ~MaterialLoader() = default; |
|
|
| static std::shared_ptr<std::list<QString>> |
| getMaterialFolders(const MaterialLibraryLocal& library); |
| static void showYaml(const YAML::Node& yaml); |
| static void |
| dereference(const std::shared_ptr<std::map<QString, std::shared_ptr<Material>>>& materialMap, |
| const std::shared_ptr<Material>& material); |
| static std::shared_ptr<MaterialEntry> |
| getMaterialFromYAML(const std::shared_ptr<MaterialLibraryLocal>& library, |
| YAML::Node& yamlroot, |
| const QString& path); |
|
|
| private: |
| MaterialLoader(); |
|
|
| void addToTree(std::shared_ptr<MaterialEntry> model); |
| void dereference(const std::shared_ptr<Material>& material); |
| std::shared_ptr<MaterialEntry> |
| getMaterialFromPath(const std::shared_ptr<MaterialLibraryLocal>& library, const QString& path) const; |
| void addLibrary(const std::shared_ptr<MaterialLibraryLocal>& model); |
| void loadLibrary(const std::shared_ptr<MaterialLibraryLocal>& library); |
| void loadLibraries( |
| const std::shared_ptr<std::list<std::shared_ptr<MaterialLibrary>>>& libraryList); |
|
|
| static std::unique_ptr<std::map<QString, std::shared_ptr<MaterialEntry>>> _materialEntryMap; |
| std::shared_ptr<std::map<QString, std::shared_ptr<Material>>> _materialMap; |
| std::shared_ptr<std::list<std::shared_ptr<MaterialLibrary>>> _libraryList; |
| }; |
|
|
| } |
|
|
| #endif |
|
|