From 90f49c4262c982a4915e79dfe7a1a99d434fee90 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 31 Aug 2021 19:30:21 +0900 Subject: [PATCH] add Vrm10UrpMaterialDescriptorGenerator and VRMURPMaterialDescriptorGenerator --- Assets/VRM/Runtime/IO/VRMImporterContext.cs | 5 +-- .../IO/VRMURPMaterialDescriptorGenerator.cs | 34 +++++++++++++++++++ .../VRMURPMaterialDescriptorGenerator.cs.meta | 11 ++++++ .../ScriptedImporter/VrmScriptedImporter.cs | 5 ++- .../VrmScriptedImporterEditorGUI.cs | 5 +++ .../VrmScriptedImporterImpl.cs | 14 ++++++-- .../Vrm10UrpMaterialDescriptorGenerator.cs | 28 +++++++++++++++ ...rm10UrpMaterialDescriptorGenerator.cs.meta | 11 ++++++ Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 5 +-- 9 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs create mode 100644 Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs.meta create mode 100644 Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs create mode 100644 Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs.meta diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index 9595006e2..ed413893c 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -23,7 +23,8 @@ namespace VRM public VRMImporterContext( GltfData data, IReadOnlyDictionary externalObjectMap = null, - ITextureDeserializer textureDeserializer = null) + ITextureDeserializer textureDeserializer = null, + IMaterialDescriptorGenerator materialGenerator = null) : base(data, externalObjectMap, textureDeserializer) { // parse VRM part @@ -31,7 +32,7 @@ namespace VRM { VRM = vrm; TextureDescriptorGenerator = new VrmTextureDescriptorGenerator(Data, VRM); - MaterialDescriptorGenerator = new VRMMaterialDescriptorGenerator(VRM); + MaterialDescriptorGenerator = materialGenerator ?? new VRMMaterialDescriptorGenerator(VRM); } else { diff --git a/Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs b/Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs new file mode 100644 index 000000000..a3661a255 --- /dev/null +++ b/Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs @@ -0,0 +1,34 @@ +using UniGLTF; +using UnityEngine; +using VRMShaders; + +namespace VRM +{ + public sealed class VRMURPMaterialDescriptorGenerator : IMaterialDescriptorGenerator + { + readonly glTF_VRM_extensions m_vrm; + public VRMURPMaterialDescriptorGenerator(glTF_VRM_extensions vrm) + { + m_vrm = vrm; + } + + public MaterialDescriptor Get(GltfData data, int i) + { + // mtoon URP "MToon" shader is not ready. import fallback to unlit + // unlit "UniUnlit" work in URP + if (!GltfUnlitMaterialImporter.TryCreateParam(data, i, out MaterialDescriptor matDesc)) + { + // pbr "Standard" to "Universal Render Pipeline/Lit" + if (!GltfPbrURPMaterialImporter.TryCreateParam(data, i, out matDesc)) + { + // fallback +#if VRM_DEVELOP + Debug.LogWarning($"material: {i} out of range. fallback"); +#endif + return new MaterialDescriptor(GltfMaterialDescriptorGenerator.GetMaterialName(i, null), GltfPbrMaterialImporter.ShaderName); + } + } + return matDesc; + } + } +} diff --git a/Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs.meta b/Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs.meta new file mode 100644 index 000000000..2db886c74 --- /dev/null +++ b/Assets/VRM/Runtime/IO/VRMURPMaterialDescriptorGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e5aeab73a304ef644b0d20fac93bcfb9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporter.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporter.cs index c23c62e34..d0414cc82 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporter.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporter.cs @@ -14,9 +14,12 @@ namespace UniVRM10 [SerializeField] public bool MigrateToVrm1 = default; + [SerializeField] + public bool UseUrp = default; + public override void OnImportAsset(AssetImportContext ctx) { - VrmScriptedImporterImpl.Import(this, ctx, MigrateToVrm1); + VrmScriptedImporterImpl.Import(this, ctx, MigrateToVrm1, UseUrp); } } } diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs index c0c13a1d8..b17d8d5f9 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs @@ -102,6 +102,11 @@ namespace UniVRM10 { case Vrm10FileType.Vrm1: EditorGUILayout.HelpBox(m_result.Message, MessageType.Info); + { + serializedObject.Update(); + EditorGUILayout.PropertyField(serializedObject.FindProperty("UseUrp")); + serializedObject.ApplyModifiedProperties(); + } ApplyRevertGUI(); break; diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index 83a50bf65..20e67c7a4 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -16,7 +16,7 @@ namespace UniVRM10 { public static class VrmScriptedImporterImpl { - public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool migrateToVrm1) + public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool migrateToVrm1, bool useUrp) { #if VRM_DEVELOP Debug.Log("OnImportAsset to " + scriptedImporter.assetPath); @@ -35,7 +35,17 @@ namespace UniVRM10 .Where(kv => kv.Value != null) .ToDictionary(kv => new SubAssetKey(kv.Value.GetType(), kv.Key.name), kv => kv.Value); - using (var loader = new Vrm10Importer(result.Data, result.Vrm, extractedObjects)) + IMaterialDescriptorGenerator materialGenerator; + if (useUrp) + { + materialGenerator = new Vrm10UrpMaterialDescriptorGenerator(); + } + else + { + materialGenerator = new Vrm10MaterialDescriptorGenerator(); + } + + using (var loader = new Vrm10Importer(result.Data, result.Vrm, extractedObjects, materialGenerator: materialGenerator)) { // settings TextureImporters foreach (var textureInfo in loader.TextureDescriptorGenerator.Get().GetEnumerable()) diff --git a/Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs b/Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs new file mode 100644 index 000000000..2082d1d07 --- /dev/null +++ b/Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs @@ -0,0 +1,28 @@ +using UniGLTF; +using UnityEngine; +using VRMShaders; + +namespace UniVRM10 +{ + public sealed class Vrm10UrpMaterialDescriptorGenerator : IMaterialDescriptorGenerator + { + public MaterialDescriptor Get(GltfData data, int i) + { + // unlit + if (!GltfUnlitMaterialImporter.TryCreateParam(data, i, out MaterialDescriptor matDesc)) + { + // pbr + if (!GltfPbrURPMaterialImporter.TryCreateParam(data, i, out matDesc)) + { + // fallback +#if VRM_DEVELOP + Debug.LogWarning($"material: {i} out of range. fallback"); +#endif + return new MaterialDescriptor(GltfMaterialDescriptorGenerator.GetMaterialName(i, null), GltfPbrMaterialImporter.ShaderName); + } + } + return matDesc; + } + + } +} diff --git a/Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs.meta b/Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs.meta new file mode 100644 index 000000000..109c9c92b --- /dev/null +++ b/Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 377d1bd166d5452408fc7772554715ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index f2872b8c7..a64bdd98d 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -23,7 +23,8 @@ namespace UniVRM10 public Vrm10Importer( UniGLTF.GltfData data, UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm, IReadOnlyDictionary externalObjectMap = null, - ITextureDeserializer textureDeserializer = null) + ITextureDeserializer textureDeserializer = null, + IMaterialDescriptorGenerator materialGenerator = null) : base(data, externalObjectMap, textureDeserializer) { if (data == null) @@ -38,7 +39,7 @@ namespace UniVRM10 m_vrm = vrm; TextureDescriptorGenerator = new Vrm10TextureDescriptorGenerator(data); - MaterialDescriptorGenerator = new Vrm10MaterialDescriptorGenerator(); + MaterialDescriptorGenerator = materialGenerator ?? new Vrm10MaterialDescriptorGenerator(); m_externalMap = externalObjectMap; if (m_externalMap == null)