diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporter.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporter.cs index f14ff3e0b..3c952fc04 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporter.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporter.cs @@ -12,7 +12,7 @@ namespace UniGLTF { public override void OnImportAsset(AssetImportContext ctx) { - Import(this, ctx, m_reverseAxis.ToAxes()); + Import(this, ctx, m_reverseAxis.ToAxes(), m_renderPipeline); } } } diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporter.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporter.cs index 2ab443cd6..39d8914ba 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporter.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporter.cs @@ -12,7 +12,7 @@ namespace UniGLTF { public override void OnImportAsset(AssetImportContext ctx) { - Import(this, ctx, m_reverseAxis.ToAxes()); + Import(this, ctx, m_reverseAxis.ToAxes(), m_renderPipeline); } } } diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs index cbb75086e..75aa41e2f 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs @@ -1,5 +1,4 @@ using UnityEngine; -using UnityEditor; using System.Linq; using VRMShaders; #if UNITY_2020_2_OR_NEWER @@ -19,13 +18,32 @@ namespace UniGLTF [SerializeField] public ScriptedImporterAxes m_reverseAxis = default; + [SerializeField] + [Header("Experimental")] + public RenderPipelineTypes m_renderPipeline; + + static IMaterialDescriptorGenerator GetMaterialGenerator(RenderPipelineTypes renderPipeline) + { + switch (renderPipeline) + { + case RenderPipelineTypes.BuiltinRenderPipeline: + return new GltfUrpMaterialDescriptorGenerator(); + + case RenderPipelineTypes.UniversalRenderPipeline: + return new GltfMaterialDescriptorGenerator(); + + default: + throw new System.NotImplementedException(); + } + } + /// /// glb をパースして、UnityObject化、さらにAsset化する /// /// /// /// - protected static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, Axes reverseAxis) + protected static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, Axes reverseAxis, RenderPipelineTypes renderPipeline) { #if VRM_DEVELOP Debug.Log("OnImportAsset to " + scriptedImporter.assetPath); @@ -46,7 +64,9 @@ namespace UniGLTF .Where(x => x.Value != null) .ToDictionary(kv => new SubAssetKey(kv.Value.GetType(), kv.Key.name), kv => kv.Value); - using (var loader = new ImporterContext(data, extractedObjects)) + IMaterialDescriptorGenerator materialGenerator = GetMaterialGenerator(renderPipeline); + + using (var loader = new ImporterContext(data, extractedObjects, materialGenerator: materialGenerator)) { // Configure TextureImporter to Extracted Textures. foreach (var textureInfo in loader.TextureDescriptorGenerator.Get().GetEnumerable()) diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ZipArchivedGltfScriptedImporter.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ZipArchivedGltfScriptedImporter.cs index 668cbe3a2..518019a0c 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ZipArchivedGltfScriptedImporter.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ZipArchivedGltfScriptedImporter.cs @@ -14,7 +14,7 @@ namespace UniGLTF { public override void OnImportAsset(AssetImportContext ctx) { - Import(this, ctx, m_reverseAxis.ToAxes()); + Import(this, ctx, m_reverseAxis.ToAxes(), m_renderPipeline); } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 814eac7b2..d9ed0dba9 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -22,11 +22,12 @@ namespace UniGLTF public ImporterContext( GltfData data, IReadOnlyDictionary externalObjectMap = null, - ITextureDeserializer textureDeserializer = null) + ITextureDeserializer textureDeserializer = null, + IMaterialDescriptorGenerator materialGenerator = null) { Data = data; TextureDescriptorGenerator = new GltfTextureDescriptorGenerator(Data); - MaterialDescriptorGenerator = new GltfMaterialDescriptorGenerator(); + MaterialDescriptorGenerator = materialGenerator ?? new GltfMaterialDescriptorGenerator(); ExternalObjectMap = externalObjectMap ?? new Dictionary(); textureDeserializer = textureDeserializer ?? new UnityTextureDeserializer(); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/RenderPipelineTypes.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/RenderPipelineTypes.cs new file mode 100644 index 000000000..78c1cf7f9 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/RenderPipelineTypes.cs @@ -0,0 +1,12 @@ +namespace UniGLTF +{ + /// + /// TODO: HDRP ? + /// TODO: UserCustom ? + /// + public enum RenderPipelineTypes + { + BuiltinRenderPipeline, + UniversalRenderPipeline, + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/RenderPipelineTypes.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/RenderPipelineTypes.cs.meta new file mode 100644 index 000000000..38093f034 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/RenderPipelineTypes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87bf5e0c19fe0584084fcddfd5294ad3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP.meta new file mode 100644 index 000000000..a716bc76f --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e25906189630c09469e8bdfcab01b754 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs new file mode 100644 index 000000000..93c8d7a31 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs @@ -0,0 +1,169 @@ +using UnityEngine; +using VRMShaders; +using ColorSpace = VRMShaders.ColorSpace; + +namespace UniGLTF +{ + /// + /// glTF PBR to URP Lit. + /// + /// see: https://github.com/Unity-Technologies/Graphics/blob/v7.5.3/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineMaterialUpgrader.cs#L354-L379 + /// + public static class GltfPbrUrpMaterialImporter + { + public const string ShaderName = "Universal Render Pipeline/Lit"; + + private enum BlendMode + { + Opaque, + Cutout, + Fade, + Transparent + } + + public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc) + { + if (i < 0 || i >= data.GLTF.materials.Count) + { + matDesc = default; + return false; + } + + var src = data.GLTF.materials[i]; + matDesc = new MaterialDescriptor(GltfMaterialDescriptorGenerator.GetMaterialName(i, src), ShaderName); + + var standardTexDesc = default(TextureDescriptor); + if (src.pbrMetallicRoughness != null || src.occlusionTexture != null) + { + if (src.pbrMetallicRoughness.metallicRoughnessTexture != null || src.occlusionTexture != null) + { + SubAssetKey key; + (key, standardTexDesc) = GltfPbrTextureImporter.StandardTexture(data, src); + } + + if (src.pbrMetallicRoughness.baseColorFactor != null && src.pbrMetallicRoughness.baseColorFactor.Length == 4) + { + // from _Color ! + matDesc.Colors.Add("_BaseColor", + src.pbrMetallicRoughness.baseColorFactor.ToColor4(ColorSpace.Linear, ColorSpace.sRGB) + ); + } + + if (src.pbrMetallicRoughness.baseColorTexture != null && src.pbrMetallicRoughness.baseColorTexture.index != -1) + { + var (key, textureParam) = GltfPbrTextureImporter.BaseColorTexture(data, src); + // from _MainTex ! + matDesc.TextureSlots.Add("_BaseMap", textureParam); + } + + if (src.pbrMetallicRoughness.metallicRoughnessTexture != null && src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1) + { + matDesc.Actions.Add(material => material.EnableKeyword("_METALLICGLOSSMAP")); + matDesc.TextureSlots.Add("_MetallicGlossMap", standardTexDesc); + // Set 1.0f as hard-coded. See: https://github.com/dwango/UniVRM/issues/212. + matDesc.FloatValues.Add("_Metallic", 1.0f); + matDesc.FloatValues.Add("_GlossMapScale", 1.0f); + // default value is 0.5 ! + matDesc.FloatValues.Add("_Smoothness", 1.0f); + } + else + { + matDesc.FloatValues.Add("_Metallic", src.pbrMetallicRoughness.metallicFactor); + // from _Glossiness ! + matDesc.FloatValues.Add("_Smoothness", 1.0f - src.pbrMetallicRoughness.roughnessFactor); + } + } + + if (src.normalTexture != null && src.normalTexture.index != -1) + { + matDesc.Actions.Add(material => material.EnableKeyword("_NORMALMAP")); + var (key, textureParam) = GltfPbrTextureImporter.NormalTexture(data, src); + matDesc.TextureSlots.Add("_BumpMap", textureParam); + matDesc.FloatValues.Add("_BumpScale", src.normalTexture.scale); + } + + if (src.occlusionTexture != null && src.occlusionTexture.index != -1) + { + matDesc.TextureSlots.Add("_OcclusionMap", standardTexDesc); + matDesc.FloatValues.Add("_OcclusionStrength", src.occlusionTexture.strength); + } + + if (src.emissiveFactor != null + || (src.emissiveTexture != null && src.emissiveTexture.index != -1)) + { + matDesc.Actions.Add(material => + { + material.EnableKeyword("_EMISSION"); + material.globalIlluminationFlags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack; + }); + + if (src.emissiveFactor != null && src.emissiveFactor.Length == 3) + { + var emissiveFactor = src.emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.Linear); + if (UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, + out UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.VRMC_materials_hdr_emissiveMultiplier ex)) + { + emissiveFactor *= ex.EmissiveMultiplier.Value; + } + matDesc.Colors.Add("_EmissionColor", emissiveFactor); + } + + if (src.emissiveTexture != null && src.emissiveTexture.index != -1) + { + var (key, textureParam) = GltfPbrTextureImporter.EmissiveTexture(data, src); + matDesc.TextureSlots.Add("_EmissionMap", textureParam); + } + } + + matDesc.Actions.Add(material => + { + BlendMode blendMode = BlendMode.Opaque; + // https://forum.unity.com/threads/standard-material-shader-ignoring-setfloat-property-_mode.344557/#post-2229980 + switch (src.alphaMode) + { + case "BLEND": + blendMode = BlendMode.Fade; + material.SetOverrideTag("RenderType", "Transparent"); + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + material.SetInt("_ZWrite", 0); + material.DisableKeyword("_ALPHATEST_ON"); + material.EnableKeyword("_ALPHABLEND_ON"); + material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); + material.renderQueue = 3000; + break; + + case "MASK": + blendMode = BlendMode.Cutout; + material.SetOverrideTag("RenderType", "TransparentCutout"); + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); + material.SetInt("_ZWrite", 1); + material.SetFloat("_Cutoff", src.alphaCutoff); + material.EnableKeyword("_ALPHATEST_ON"); + material.DisableKeyword("_ALPHABLEND_ON"); + material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); + material.renderQueue = 2450; + + break; + + default: // OPAQUE + blendMode = BlendMode.Opaque; + material.SetOverrideTag("RenderType", ""); + material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); + material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); + material.SetInt("_ZWrite", 1); + material.DisableKeyword("_ALPHATEST_ON"); + material.DisableKeyword("_ALPHABLEND_ON"); + material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); + material.renderQueue = -1; + break; + } + + material.SetFloat("_Mode", (float)blendMode); + }); + + return true; + } + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs.meta new file mode 100644 index 000000000..3a87eaf63 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 08a0ae763ee70ed45809fad80ffe8e78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfURPMaterialDescriptorGenerator.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfURPMaterialDescriptorGenerator.cs new file mode 100644 index 000000000..e5422ae9a --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfURPMaterialDescriptorGenerator.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using UnityEngine; +using VRMShaders; + + +namespace UniGLTF +{ + /// + /// GLTF の MaterialImporter + /// + public sealed class GltfUrpMaterialDescriptorGenerator : IMaterialDescriptorGenerator + { + public MaterialDescriptor Get(GltfData data, int i) + { + if (!GltfUnlitMaterialImporter.TryCreateParam(data, i, out var param)) + { + if (!GltfPbrUrpMaterialImporter.TryCreateParam(data, i, out param)) + { + // fallback +#if VRM_DEVELOP + Debug.LogWarning($"material: {i} out of range. fallback"); +#endif + return new MaterialDescriptor(GetMaterialName(i, null), GltfPbrMaterialImporter.ShaderName); + } + } + + return param; + } + + public static string GetMaterialName(int index, glTFMaterial src) + { + if (src != null && !string.IsNullOrEmpty(src.name)) + { + return src.name; + } + return $"material_{index:00}"; + } + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfURPMaterialDescriptorGenerator.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfURPMaterialDescriptorGenerator.cs.meta new file mode 100644 index 000000000..ba39444e7 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfURPMaterialDescriptorGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ae66bf5ee5e1cb44b7dc416727d3bc1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: 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..376198d32 --- /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..af17de1ff 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 UniGLTF.RenderPipelineTypes RenderPipeline = default; + public override void OnImportAsset(AssetImportContext ctx) { - VrmScriptedImporterImpl.Import(this, ctx, MigrateToVrm1); + VrmScriptedImporterImpl.Import(this, ctx, MigrateToVrm1, RenderPipeline); } } } diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs index 649180af9..e217e1160 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs @@ -102,6 +102,12 @@ namespace UniVRM10 { case Vrm10FileType.Vrm1: EditorGUILayout.HelpBox(m_result.Message, MessageType.Info); + { + serializedObject.Update(); + EditorGUILayout.HelpBox("Experimental", MessageType.Warning); + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(VrmScriptedImporter.RenderPipeline))); + serializedObject.ApplyModifiedProperties(); + } ApplyRevertGUI(); break; diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index 83a50bf65..c9290f8f7 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -1,9 +1,7 @@ using System.Linq; using UnityEngine; using UniGLTF; -using System.IO; using System; -using UniJSON; using VRMShaders; #if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; @@ -16,7 +14,22 @@ namespace UniVRM10 { public static class VrmScriptedImporterImpl { - public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool migrateToVrm1) + static IMaterialDescriptorGenerator GetMaterialDescriptorGenerator(RenderPipelineTypes renderPipeline) + { + switch (renderPipeline) + { + case RenderPipelineTypes.BuiltinRenderPipeline: + return new Vrm10MaterialDescriptorGenerator(); + + case RenderPipelineTypes.UniversalRenderPipeline: + return new Vrm10UrpMaterialDescriptorGenerator(); + + default: + throw new NotImplementedException(); + } + } + + public static void Import(ScriptedImporter scriptedImporter, AssetImportContext context, bool migrateToVrm1, RenderPipelineTypes renderPipeline) { #if VRM_DEVELOP Debug.Log("OnImportAsset to " + scriptedImporter.assetPath); @@ -35,7 +48,9 @@ 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)) + var materialGenerator = GetMaterialDescriptorGenerator(renderPipeline); + + 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..49434506f --- /dev/null +++ b/Assets/VRM10/Runtime/IO/Material/Vrm10UrpMaterialDescriptorGenerator.cs @@ -0,0 +1,26 @@ +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 + Debug.LogWarning($"material: {i} out of range. fallback"); + 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)