Added GenerateMask to AssetsHelpers;
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
using UnityEditor;
|
||||
|
||||
namespace Misaki.ArtToolEditor
|
||||
{
|
||||
public class ExtractMaterialsMenu
|
||||
{
|
||||
private const string Material_Extension = ".mat";
|
||||
|
||||
|
||||
|
||||
[MenuItem("Assets/Art Tools/Mesh Helpers/Extract Materials", true)]
|
||||
public static bool ExtractMaterialsValidator()
|
||||
{
|
||||
foreach (var selectedObject in Selection.objects)
|
||||
{
|
||||
var assetImporter = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(selectedObject));
|
||||
if (assetImporter is not ModelImporter)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Assets/Art Tools/Mesh Helpers/Extract Materials")]
|
||||
public static void ExtractMaterials()
|
||||
{
|
||||
var window = EditorWindow.GetWindow<OutputOptionsWindow>(true, "Extract Materials Output Options");
|
||||
window.WithItemSource(Selection.objects);
|
||||
window.RegisterVisualProvider<ExtractMaterialsVisualProvider>();
|
||||
window.RegisterProcessor<ExtractMaterialsProcessor>();
|
||||
|
||||
window.InitializeAndShow();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c21cf688d17737c4d91cec961bfce976
|
||||
@@ -0,0 +1,75 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Misaki.ArtToolEditor
|
||||
{
|
||||
internal class ExtractMaterialsProcessor : IAssetsProcessor
|
||||
{
|
||||
private const string Material_Extension = ".mat";
|
||||
|
||||
public bool useMaterialRemap = false;
|
||||
public ModelImporterMaterialLocation materialLocation = ModelImporterMaterialLocation.InPrefab;
|
||||
public ModelImporterMaterialName materialRemapNamingOption = ModelImporterMaterialName.BasedOnMaterialName;
|
||||
public ModelImporterMaterialSearch materialRemapSearchOption = ModelImporterMaterialSearch.RecursiveUp;
|
||||
|
||||
public void OnPreProcess(AssetsProcessContext context)
|
||||
{
|
||||
context.userData = new HashSet<string>();
|
||||
}
|
||||
|
||||
public void OnProcess(Object source, string outputDirectory, AssetsProcessContext context)
|
||||
{
|
||||
var assetsToReload = (HashSet<string>)context.userData;
|
||||
|
||||
var assetImporter = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(source));
|
||||
if (assetImporter is not ModelImporter modelImporter)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (useMaterialRemap)
|
||||
{
|
||||
modelImporter.materialLocation = materialLocation;
|
||||
modelImporter.SearchAndRemapMaterials(materialRemapNamingOption, materialRemapSearchOption);
|
||||
modelImporter.SaveAndReimport();
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
var materials = AssetDatabase.LoadAllAssetsAtPath(modelImporter.assetPath).Where(x => x.GetType() == typeof(Material));
|
||||
|
||||
foreach (var material in materials)
|
||||
{
|
||||
var newAssetPath = Path.Combine(outputDirectory, material.name) + Material_Extension;
|
||||
newAssetPath = AssetDatabase.GenerateUniqueAssetPath(newAssetPath);
|
||||
|
||||
var error = AssetDatabase.ExtractAsset(material, newAssetPath);
|
||||
if (string.IsNullOrEmpty(error))
|
||||
{
|
||||
assetsToReload.Add(modelImporter.assetPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnPostProcess(AssetsProcessContext context)
|
||||
{
|
||||
var assetsToReload = (HashSet<string>)context.userData;
|
||||
|
||||
foreach (var assetPath in assetsToReload)
|
||||
{
|
||||
if (string.IsNullOrEmpty(assetPath))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AssetDatabase.WriteImportSettingsIfDirty(assetPath);
|
||||
AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ae6fdf97993458e47add233725aecaa4
|
||||
@@ -0,0 +1,66 @@
|
||||
using System.Collections.Generic;
|
||||
using Unity.Properties;
|
||||
using UnityEditor;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace Misaki.ArtToolEditor
|
||||
{
|
||||
internal class ExtractMaterialsVisualProvider : OptionsVisualProvider
|
||||
{
|
||||
internal override VisualElement ContentAfterList()
|
||||
{
|
||||
var root = new VisualElement();
|
||||
var materialRemapOptionContainer = new VisualElement()
|
||||
{
|
||||
style =
|
||||
{
|
||||
display = DisplayStyle.None,
|
||||
}
|
||||
};
|
||||
|
||||
var useMaterialRemapField = new DropdownField("Use Material Remap", new List<string> { "False", "True" }, "False");
|
||||
useMaterialRemapField.SetBinding(
|
||||
nameof(DropdownField.index),
|
||||
new DataBinding()
|
||||
{
|
||||
dataSourcePath = PropertyPath.FromName(nameof(ExtractMaterialsProcessor.useMaterialRemap))
|
||||
});
|
||||
useMaterialRemapField.RegisterValueChangedCallback(evt =>
|
||||
{
|
||||
materialRemapOptionContainer.style.display = evt.newValue == "True" ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
});
|
||||
|
||||
var materialLocationField = new EnumField("Location", ModelImporterMaterialLocation.External);
|
||||
materialLocationField.SetBinding(
|
||||
nameof(EnumField.value),
|
||||
new DataBinding()
|
||||
{
|
||||
dataSourcePath = PropertyPath.FromName(nameof(ExtractMaterialsProcessor.materialLocation))
|
||||
});
|
||||
|
||||
var materialRemapNamingOptionField = new EnumField("Naming Option", ModelImporterMaterialName.BasedOnTextureName);
|
||||
materialRemapNamingOptionField.SetBinding(
|
||||
nameof(EnumField.value),
|
||||
new DataBinding()
|
||||
{
|
||||
dataSourcePath = PropertyPath.FromName(nameof(ExtractMaterialsProcessor.materialRemapNamingOption))
|
||||
});
|
||||
|
||||
var materialRemapSearchOptionField = new EnumField("Search Option", ModelImporterMaterialSearch.Local);
|
||||
materialRemapSearchOptionField.SetBinding(
|
||||
nameof(EnumField.value),
|
||||
new DataBinding()
|
||||
{
|
||||
dataSourcePath = PropertyPath.FromName(nameof(ExtractMaterialsProcessor.materialRemapSearchOption))
|
||||
});
|
||||
|
||||
materialRemapOptionContainer.Add(materialLocationField);
|
||||
materialRemapOptionContainer.Add(materialRemapNamingOptionField);
|
||||
materialRemapOptionContainer.Add(materialRemapSearchOptionField);
|
||||
|
||||
root.Add(useMaterialRemapField);
|
||||
root.Add(materialRemapOptionContainer);
|
||||
return root;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74347edff42a5cd47a6a5d4989210334
|
||||
Reference in New Issue
Block a user