From 8881882873b991d953347a7dfa6e582bf58ec5e8 Mon Sep 17 00:00:00 2001 From: iruca3 Date: Sat, 17 Aug 2024 13:13:37 +0900 Subject: [PATCH] Introduce ImporterContextSettings for handling loading animation and axes conversion. Refs: https://github.com/vrm-c/UniVRM/pull/1719#discussion_r908105469 --- .../GltfScriptedImporterBase.cs | 4 +- .../Runtime/UniGLTF/IO/ImporterContext.cs | 11 ++++-- .../UniGLTF/IO/ImporterContextSettings.cs | 19 +++++++++ .../IO/ImporterContextSettings.cs.meta | 3 ++ .../Editor/Format/vrmAssetPostprocessor.cs | 3 +- Assets/VRM/Runtime/IO/VRMImporterContext.cs | 5 +-- Assets/VRM/Runtime/IO/VrmUtility.cs | 6 ++- Assets/VRM10/Runtime/IO/Vrm10.cs | 39 +++++++++++++------ Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 5 ++- .../VRM10/Runtime/IO/VrmAnimationImporter.cs | 4 +- 10 files changed, 71 insertions(+), 28 deletions(-) create mode 100644 Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs create mode 100644 Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs.meta diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs index f467c9d3c..d7588cbcf 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs @@ -42,9 +42,10 @@ namespace UniGLTF .ToDictionary(kv => new SubAssetKey(kv.Value.GetType(), kv.Key.name), kv => kv.Value); var materialGenerator = GetMaterialDescriptorGenerator(renderPipeline); + var importerContextSettings = new ImporterContextSettings(loadAnimation: true, invertAxis: reverseAxis); using (var data = new AutoGltfFileParser(scriptedImporter.assetPath).Parse()) - using (var loader = new ImporterContext(data, extractedObjects, materialGenerator: materialGenerator)) + using (var loader = new ImporterContext(data, extractedObjects, materialGenerator: materialGenerator, settings: importerContextSettings)) { // Configure TextureImporter to Extracted Textures. foreach (var textureInfo in loader.TextureDescriptorGenerator.Get().GetEnumerable()) @@ -52,7 +53,6 @@ namespace UniGLTF TextureImporterConfigurator.Configure(textureInfo, loader.TextureFactory.ExternalTextures); } - loader.InvertAxis = reverseAxis; var loaded = loader.Load(); loaded.ShowMeshes(); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index d7c56f709..131bf0695 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -12,12 +12,14 @@ namespace UniGLTF /// public class ImporterContext : IResponsibilityForDestroyObjects { + private readonly ImporterContextSettings _settings; + public ITextureDescriptorGenerator TextureDescriptorGenerator { get; protected set; } public IMaterialDescriptorGenerator MaterialDescriptorGenerator { get; protected set; } public TextureFactory TextureFactory { get; } public MaterialFactory MaterialFactory { get; } public AnimationClipFactory AnimationClipFactory { get; } - public bool LoadAnimation { get; set; } = true; + private bool LoadAnimation => _settings.LoadAnimation; public IReadOnlyDictionary ExternalObjectMap; @@ -29,12 +31,15 @@ namespace UniGLTF /// 外部オブジェクトのリスト(主にScriptedImporterのRemapで使う) /// Textureロードをカスタマイズする /// Materialロードをカスタマイズする(URP向け) + /// ImporterContextの設定 public ImporterContext( GltfData data, IReadOnlyDictionary externalObjectMap = null, ITextureDeserializer textureDeserializer = null, - IMaterialDescriptorGenerator materialGenerator = null) + IMaterialDescriptorGenerator materialGenerator = null, + ImporterContextSettings settings = null) { + _settings = settings ?? new ImporterContextSettings(); Data = data; TextureDescriptorGenerator = new GltfTextureDescriptorGenerator(Data); MaterialDescriptorGenerator = materialGenerator ?? MaterialDescriptorGeneratorUtility.GetValidGltfMaterialDescriptorGenerator(); @@ -66,7 +71,7 @@ namespace UniGLTF /// /// GLTF から Unity に変換するときに反転させる軸 /// - public Axes InvertAxis = Axes.Z; + private Axes InvertAxis => _settings.InvertAxis; public static List UnsupportedExtensions = new List { diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs new file mode 100644 index 000000000..262a71719 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs @@ -0,0 +1,19 @@ +namespace UniGLTF +{ + public class ImporterContextSettings + { + public bool LoadAnimation { get; } + public Axes InvertAxis { get; } + + /// + /// ImporterContextの設定を指定する。 + /// + /// アニメーションをインポートする場合はtrueを指定(初期値はtrue) + /// GLTF から Unity に変換するときに反転させる軸を指定(初期値はAxes.Z) + public ImporterContextSettings(bool loadAnimation = true, Axes invertAxis = Axes.Z) + { + LoadAnimation = loadAnimation; + InvertAxis = invertAxis; + } + } +} \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs.meta new file mode 100644 index 000000000..b57676d9a --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextSettings.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 091d1bfaecd542b6a039fb7a3e3676f8 +timeCreated: 1723863327 \ No newline at end of file diff --git a/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs b/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs index 4edcfa423..688e7ffc5 100644 --- a/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs +++ b/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs @@ -76,10 +76,11 @@ namespace VRM var map = texturePaths .Select(x => x.LoadAsset()) .ToDictionary(x => new SubAssetKey(x), x => x as UnityEngine.Object); + var settings = new ImporterContextSettings(); // 確実に Dispose するために敢えて再パースしている using (var data = new GlbFileParser(vrmPath).Parse()) - using (var context = new VRMImporterContext(new VRMData(data), externalObjectMap: map, loadAnimation: true)) + using (var context = new VRMImporterContext(new VRMData(data), externalObjectMap: map, settings: settings)) { var editor = new VRMEditorImporterContext(context, prefabPath); foreach (var textureInfo in context.TextureDescriptorGenerator.Get().GetEnumerable()) diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index 642c40917..a3cc8f4af 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -25,12 +25,11 @@ namespace VRM IReadOnlyDictionary externalObjectMap = null, ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null, - bool loadAnimation = false) - : base(data.Data, externalObjectMap, textureDeserializer, materialGenerator ?? VrmMaterialDescriptorGeneratorUtility.GetValidVrmMaterialDescriptorGenerator(data.VrmExtension)) + ImporterContextSettings settings = null) + : base(data.Data, externalObjectMap, textureDeserializer, materialGenerator ?? VrmMaterialDescriptorGeneratorUtility.GetValidVrmMaterialDescriptorGenerator(data.VrmExtension), settings ?? new ImporterContextSettings(false)) { _data = data; TextureDescriptorGenerator = new VrmTextureDescriptorGenerator(Data, VRM); - LoadAnimation = loadAnimation; } #region OnLoad diff --git a/Assets/VRM/Runtime/IO/VrmUtility.cs b/Assets/VRM/Runtime/IO/VrmUtility.cs index 34f08bea6..8ba66c562 100644 --- a/Assets/VRM/Runtime/IO/VrmUtility.cs +++ b/Assets/VRM/Runtime/IO/VrmUtility.cs @@ -39,11 +39,12 @@ namespace VRM { materialGen = materialGeneratorCallback(vrm.VrmExtension); } + var importerContextSettings = new ImporterContextSettings(loadAnimation); using (var loader = new VRMImporterContext( vrm, textureDeserializer: textureDeserializer, materialGenerator: materialGen, - loadAnimation: loadAnimation)) + settings: importerContextSettings)) { if (metaCallback != null) { @@ -96,11 +97,12 @@ namespace VRM { materialGen = materialGeneratorCallback(vrm.VrmExtension); } + var importerContextSettings = new ImporterContextSettings(loadAnimation: loadAnimation); using (var loader = new VRMImporterContext( vrm, textureDeserializer: textureDeserializer, materialGenerator: materialGen, - loadAnimation: loadAnimation)) + settings: importerContextSettings)) { if (metaCallback != null) { diff --git a/Assets/VRM10/Runtime/IO/Vrm10.cs b/Assets/VRM10/Runtime/IO/Vrm10.cs index 7532f88e3..1f3661ea8 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10.cs @@ -34,6 +34,7 @@ namespace UniVRM10 /// this loader use specified material generation strategy. /// return callback that notify meta information before loading. /// CancellationToken + /// Importer context settings. /// vrm-1.0 instance. Maybe return null if unexpected error was raised. public static async Task LoadPathAsync( string path, @@ -44,7 +45,8 @@ namespace UniVRM10 ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null, VrmMetaInformationCallback vrmMetaInformationCallback = null, - CancellationToken ct = default) + CancellationToken ct = default, + ImporterContextSettings importerContextSettings = null) { awaitCaller ??= Application.isPlaying ? new RuntimeOnlyAwaitCaller() @@ -64,7 +66,8 @@ namespace UniVRM10 textureDeserializer, materialGenerator, vrmMetaInformationCallback, - ct); + ct, + importerContextSettings); } /// @@ -82,6 +85,7 @@ namespace UniVRM10 /// this loader use specified material generation strategy. /// return callback that notify meta information before loading. /// CancellationToken + /// Importer context settings. /// vrm-1.0 instance. Maybe return null if unexpected error was raised. public static async Task LoadBytesAsync( byte[] bytes, @@ -92,7 +96,8 @@ namespace UniVRM10 ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null, VrmMetaInformationCallback vrmMetaInformationCallback = null, - CancellationToken ct = default) + CancellationToken ct = default, + ImporterContextSettings importerContextSettings = null) { awaitCaller ??= Application.isPlaying ? new RuntimeOnlyAwaitCaller() @@ -108,7 +113,8 @@ namespace UniVRM10 textureDeserializer, materialGenerator, vrmMetaInformationCallback, - ct); + ct, + importerContextSettings); } /// @@ -127,6 +133,7 @@ namespace UniVRM10 /// this loader use specified material generation strategy. /// return callback that notify meta information before loading. /// CancellationToken + /// Importer context settings. /// vrm-1.0 instance. Maybe return null if unexpected error was raised. public static async Task LoadGltfDataAsync( GltfData gltfData, @@ -137,7 +144,8 @@ namespace UniVRM10 ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null, VrmMetaInformationCallback vrmMetaInformationCallback = null, - CancellationToken ct = default) + CancellationToken ct = default, + ImporterContextSettings importerContextSettings = null) { awaitCaller ??= Application.isPlaying ? new RuntimeOnlyAwaitCaller() @@ -152,7 +160,8 @@ namespace UniVRM10 textureDeserializer, materialGenerator, vrmMetaInformationCallback, - ct); + ct, + importerContextSettings); } private static async Task LoadAsync( @@ -164,7 +173,8 @@ namespace UniVRM10 ITextureDeserializer textureDeserializer, IMaterialDescriptorGenerator materialGenerator, VrmMetaInformationCallback vrmMetaInformationCallback, - CancellationToken ct) + CancellationToken ct, + ImporterContextSettings importerContextSettings = null) { ct.ThrowIfCancellationRequested(); if (awaitCaller == null) @@ -181,7 +191,8 @@ namespace UniVRM10 textureDeserializer, materialGenerator, vrmMetaInformationCallback, - ct); + ct, + importerContextSettings); if (instance != null) { if (ct.IsCancellationRequested) @@ -230,7 +241,8 @@ namespace UniVRM10 ITextureDeserializer textureDeserializer, IMaterialDescriptorGenerator materialGenerator, VrmMetaInformationCallback vrmMetaInformationCallback, - CancellationToken ct) + CancellationToken ct, + ImporterContextSettings importerContextSettings = null) { ct.ThrowIfCancellationRequested(); if (awaitCaller == null) @@ -256,7 +268,8 @@ namespace UniVRM10 textureDeserializer, materialGenerator, vrmMetaInformationCallback, - ct); + ct, + importerContextSettings); } private static async Task TryMigratingFromVrm0XAsync( @@ -313,7 +326,8 @@ namespace UniVRM10 ITextureDeserializer textureDeserializer, IMaterialDescriptorGenerator materialGenerator, VrmMetaInformationCallback vrmMetaInformationCallback, - CancellationToken ct) + CancellationToken ct, + ImporterContextSettings importerContextSettings = null) { ct.ThrowIfCancellationRequested(); if (awaitCaller == null) @@ -330,7 +344,8 @@ namespace UniVRM10 vrm10Data, textureDeserializer: textureDeserializer, materialGenerator: materialGenerator, - useControlRig: controlRigGenerationOption != ControlRigGenerationOption.None)) + useControlRig: controlRigGenerationOption != ControlRigGenerationOption.None, + settings: importerContextSettings)) { // 1. Load meta information if callback was available. if (vrmMetaInformationCallback != null) diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index a9447fea7..31d49fc5d 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -29,9 +29,10 @@ namespace UniVRM10 IReadOnlyDictionary externalObjectMap = null, ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null, - bool useControlRig = false + bool useControlRig = false, + ImporterContextSettings settings = null ) - : base(vrm.Data, externalObjectMap, textureDeserializer) + : base(vrm.Data, externalObjectMap, textureDeserializer, settings: settings) { if (vrm == null) { diff --git a/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs b/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs index 4928ffe0a..41674c19e 100644 --- a/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs +++ b/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs @@ -18,10 +18,8 @@ namespace UniVRM10 IReadOnlyDictionary externalObjectMap = null, ITextureDeserializer textureDeserializer = null, IMaterialDescriptorGenerator materialGenerator = null) - : base(data, externalObjectMap, textureDeserializer, materialGenerator) + : base(data, externalObjectMap, textureDeserializer, materialGenerator, new ImporterContextSettings(invertAxis: Axes.X)) { - InvertAxis = Axes.X; - m_vrma = GetExtension(Data); }