From 541ece55cabcd20c27d0eec1af77eebc7ae4a3bf Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 1 Jun 2021 19:36:24 +0900 Subject: [PATCH] =?UTF-8?q?AnimationClip=20=E3=81=AE=20extract=20=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IO/AnimationIO/IAnimationImporter.cs | 3 +- .../IO/AnimationIO/RootAnimationImporter.cs | 47 ++----------------- .../Runtime/UniGLTF/IO/ImporterContext.cs | 32 +++++++++++-- 3 files changed, 33 insertions(+), 49 deletions(-) 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);