diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/IAnimationImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/IAnimationImporter.cs index 4ea8f4ba2..6e9a2f773 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/IAnimationImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/IAnimationImporter.cs @@ -1,10 +1,11 @@ using System.Collections.Generic; using UnityEngine; +using VRMShaders; namespace UniGLTF { public interface IAnimationImporter { - List Import(glTF gltf, GameObject root, List nodes, Axes invertAxis); + AnimationClip Import(glTF gltf, int i, Axes invertAxis); } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/RootAnimationImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/RootAnimationImporter.cs index 53f7016d6..980caec8a 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/RootAnimationImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/RootAnimationImporter.cs @@ -1,53 +1,12 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEngine; +using UnityEngine; namespace UniGLTF { public sealed class RootAnimationImporter : IAnimationImporter { - public List Import(glTF gltf, GameObject root, List _nodes, Axes invertAxis) + public AnimationClip Import(glTF gltf, int i, Axes invertAxis) { - var animationClips = new List(); - if (gltf.animations != null && gltf.animations.Any()) - { - var animation = root.AddComponent(); - animationClips.AddRange(ImportAnimationClips(gltf, invertAxis)); - - foreach (var clip in animationClips) - { - animation.AddClip(clip, clip.name); - } - if (animationClips.Count > 0) - { - animation.clip = animationClips.First(); - } - } - return animationClips; - } - - private IEnumerable ImportAnimationClips(glTF gltf, Axes invertAxis) - { - for (var i = 0; i < gltf.animations.Count; ++i) - { - var clip = new AnimationClip(); - clip.ClearCurves(); - clip.legacy = true; - clip.name = gltf.animations[i].name; - if (string.IsNullOrEmpty(clip.name)) - { - clip.name = $"legacy_{i}"; - } - clip.wrapMode = WrapMode.Loop; - - var animation = gltf.animations[i]; - if (string.IsNullOrEmpty(animation.name)) - { - animation.name = $"animation:{i}"; - } - - yield return AnimationImporterUtil.ConvertAnimationClip(gltf, animation, invertAxis.Create()); - } + return AnimationImporterUtil.ConvertAnimationClip(gltf, gltf.animations[i], invertAxis.Create()); } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 0ba65fb02..f513391e3 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -36,6 +36,7 @@ namespace UniGLTF public IMaterialDescriptorGenerator MaterialDescriptorGenerator { get; protected set; } public TextureFactory TextureFactory { get; } public MaterialFactory MaterialFactory { get; } + IReadOnlyDictionary _externalObjectMap; public ImporterContext( GltfParser parser, @@ -46,13 +47,13 @@ namespace UniGLTF TextureDescriptorGenerator = new GltfTextureDescriptorGenerator(Parser); MaterialDescriptorGenerator = new GltfMaterialDescriptorGenerator(); - externalObjectMap = externalObjectMap ?? new Dictionary(); + _externalObjectMap = externalObjectMap ?? new Dictionary(); textureDeserializer = textureDeserializer ?? new UnityTextureDeserializer(); - TextureFactory = new TextureFactory(textureDeserializer, externalObjectMap + TextureFactory = new TextureFactory(textureDeserializer, _externalObjectMap .Where(x => x.Value is Texture) .ToDictionary(x => x.Key, x => (Texture)x.Value)); - MaterialFactory = new MaterialFactory(externalObjectMap + MaterialFactory = new MaterialFactory(_externalObjectMap .Where(x => x.Value is Material) .ToDictionary(x => x.Key, x => (Material)x.Value)); } @@ -122,7 +123,30 @@ namespace UniGLTF using (MeasureTime("AnimationImporter")) { - AnimationClips.AddRange(AnimationImporter.Import(GLTF, Root, null, InvertAxis)); + if (GLTF.animations != null && GLTF.animations.Any()) + { + var animation = Root.AddComponent(); + for (int i = 0; i < GLTF.animations.Count; ++i) + { + var gltfAnimation = GLTF.animations[i]; + AnimationClip clip = default; + if (_externalObjectMap.TryGetValue(new SubAssetKey(typeof(AnimationClip), gltfAnimation.name), out UnityEngine.Object value)) + { + clip = value as AnimationClip; + } + else + { + clip = AnimationImporter.Import(GLTF, i, InvertAxis); + AnimationClips.Add(clip); + } + + animation.AddClip(clip, clip.name); + if (i == 0) + { + animation.clip = clip; + } + } + } } await OnLoadHierarchy(awaitCaller, MeasureTime);