@@ -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