Skip to content

Commit 980938b

Browse files
authored
Add Extract materials action to model contextual menu (#767)
1 parent 305d96d commit 980938b

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

Sources/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,42 @@ namespace
680680
}
681681
}
682682

683+
void ExtractMaterialFiles()
684+
{
685+
auto& modelManager = OVSERVICE(OvCore::ResourceManagement::ModelManager);
686+
auto& materialManager = OVSERVICE(OvCore::ResourceManagement::MaterialManager);
687+
const std::string resourcePath = EDITOR_EXEC(GetResourcePath(filePath.string(), m_protected));
688+
689+
if (auto model = modelManager.GetResource(resourcePath))
690+
{
691+
const auto& embeddedMaterials = model->GetEmbeddedMaterials();
692+
const auto& materialNames = model->GetMaterialNames();
693+
694+
for (size_t materialIndex = 0; materialIndex < embeddedMaterials.size(); ++materialIndex)
695+
{
696+
const std::string embeddedMaterialPath = OvRendering::Resources::Parsers::MakeEmbeddedMaterialPath(
697+
resourcePath,
698+
static_cast<uint32_t>(materialIndex)
699+
);
700+
701+
auto* embeddedMaterial = materialManager.GetResource(embeddedMaterialPath);
702+
if (!embeddedMaterial)
703+
{
704+
continue;
705+
}
706+
707+
const bool hasNamedSlot = materialIndex < materialNames.size() && !materialNames[materialIndex].empty();
708+
const std::string materialName = hasNamedSlot
709+
? materialNames[materialIndex]
710+
: std::format("embedded_material_{}", materialIndex);
711+
712+
const auto finalPath = FindAvailableFilePath(filePath.parent_path() / (materialName + ".ovmat"));
713+
OvCore::Resources::Loaders::MaterialLoader::Save(*embeddedMaterial, finalPath.string());
714+
DuplicateEvent.Invoke(finalPath);
715+
}
716+
}
717+
}
718+
683719
void CreateMaterialCreationOption(OvUI::Internal::WidgetContainer& p_root, const std::string_view p_materialName)
684720
{
685721
const std::string materialName{ p_materialName };
@@ -708,9 +744,15 @@ namespace
708744
if (!m_protected)
709745
{
710746
auto& generateMaterialsMenu = CreateWidget<OvUI::Widgets::Menu::MenuList>("Generate materials...");
747+
auto& extractMaterialsAction = CreateWidget<OvUI::Widgets::Menu::MenuItem>("Extract materials");
711748

712749
CreateMaterialCreationOption(generateMaterialsMenu, "Standard");
713750
CreateMaterialCreationOption(generateMaterialsMenu, "Unlit");
751+
752+
extractMaterialsAction.ClickedEvent += [this]
753+
{
754+
ExtractMaterialFiles();
755+
};
714756
}
715757

716758
FileContextualMenu::CreateList();

0 commit comments

Comments
 (0)