From 048139cdcc213c6b0a342becba1c8944d4a68215 Mon Sep 17 00:00:00 2001 From: Gopmyc Date: Thu, 23 Apr 2026 02:07:01 +0200 Subject: [PATCH 1/2] feat(editor): add model embedded material extraction --- .../src/OvEditor/Panels/AssetBrowser.cpp | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp b/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp index 00df43a2..d4ff60dc 100644 --- a/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp +++ b/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp @@ -680,6 +680,42 @@ namespace } } + void ExtractMaterialFiles() + { + auto& modelManager = OVSERVICE(OvCore::ResourceManagement::ModelManager); + auto& materialManager = OVSERVICE(OvCore::ResourceManagement::MaterialManager); + const std::string resourcePath = EDITOR_EXEC(GetResourcePath(filePath.string(), m_protected)); + + if (auto model = modelManager.GetResource(resourcePath)) + { + const auto& embeddedMaterials = model->GetEmbeddedMaterials(); + const auto& materialNames = model->GetMaterialNames(); + + for (size_t materialIndex = 0; materialIndex < embeddedMaterials.size(); ++materialIndex) + { + const std::string embeddedMaterialPath = OvRendering::Resources::Parsers::MakeEmbeddedMaterialPath( + resourcePath, + static_cast(materialIndex) + ); + + auto* embeddedMaterial = materialManager.GetResource(embeddedMaterialPath); + if (!embeddedMaterial) + { + continue; + } + + const bool hasNamedSlot = materialIndex < materialNames.size() && !materialNames[materialIndex].empty(); + const std::string materialName = hasNamedSlot + ? materialNames[materialIndex] + : std::format("embedded_material_{}", materialIndex); + + const auto finalPath = FindAvailableFilePath(filePath.parent_path() / (materialName + ".ovmat")); + OvCore::Resources::Loaders::MaterialLoader::Save(*embeddedMaterial, finalPath.string()); + DuplicateEvent.Invoke(finalPath); + } + } + } + void CreateMaterialCreationOption(OvUI::Internal::WidgetContainer& p_root, const std::string_view p_materialName) { const std::string materialName{ p_materialName }; From bd4e7b3a1d9668a0af04cb9efc77b32d9c864ab8 Mon Sep 17 00:00:00 2001 From: Gopmyc Date: Thu, 23 Apr 2026 02:07:14 +0200 Subject: [PATCH 2/2] feat(editor): add extract materials model menu action --- Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp b/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp index d4ff60dc..74ad49c3 100644 --- a/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp +++ b/Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp @@ -744,9 +744,15 @@ namespace if (!m_protected) { auto& generateMaterialsMenu = CreateWidget("Generate materials..."); + auto& extractMaterialsAction = CreateWidget("Extract materials"); CreateMaterialCreationOption(generateMaterialsMenu, "Standard"); CreateMaterialCreationOption(generateMaterialsMenu, "Unlit"); + + extractMaterialsAction.ClickedEvent += [this] + { + ExtractMaterialFiles(); + }; } FileContextualMenu::CreateList();