From 6268ec803b3f312fa0a8074c5963f7e77359b512 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 17:44:33 +0900 Subject: [PATCH 01/12] IResponsibilityForDestroyObjects --- .../Runtime/UniGLTF/IO/ImporterContext.cs | 4 ++-- Assets/VRM/Runtime/IO/VRMImporterContext.cs | 2 +- .../IResponsibilityForDestroyObjects.cs | 20 +++++++++++++++++++ .../IResponsibilityForDestroyObjects.cs.meta | 11 ++++++++++ .../GLTF/IO/Runtime/MaterialFactory.cs | 4 ++-- .../GLTF/IO/Runtime/TextureFactory.cs | 4 ++-- 6 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs create mode 100644 Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs.meta diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 616afcda2..7dd0158e1 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -10,7 +10,7 @@ namespace UniGLTF /// /// GLTF importer /// - public class ImporterContext : IDisposable + public class ImporterContext : IResponsibilityForDestroyObjects { public ITextureDescriptorGenerator TextureDescriptorGenerator { get; protected set; } public IMaterialDescriptorGenerator MaterialDescriptorGenerator { get; protected set; } @@ -358,7 +358,7 @@ namespace UniGLTF /// Root ヒエラルキーで使っているリソース /// /// - public virtual void TransferOwnership(Func take) + public virtual void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { var list = new List(); foreach (var mesh in Meshes) diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index f2fcca636..1874b8fb7 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -317,7 +317,7 @@ namespace VRM return meta; } - public override void TransferOwnership(Func take) + public override void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { // VRM 固有のリソース(ScriptableObject) if (take(HumanoidAvatar)) diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs new file mode 100644 index 000000000..cff41ebcc --- /dev/null +++ b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs @@ -0,0 +1,20 @@ +using System; + +namespace VRMShaders +{ + public delegate bool TakeResponsibilityForDestroyObjectFunc(UnityEngine.Object obj); + + /// + /// UnityObjectを破棄する責務。 + /// + /// この interface を実装するクラスは、利用後に破棄すべき UnityObject を保持する可能性があるので + /// Dispose により解放すること。 + /// + /// TransferOwnership により、破棄責任を移譲することができる。 + /// + /// + public interface IResponsibilityForDestroyObjects : IDisposable + { + void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take); + } +} diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs.meta b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs.meta new file mode 100644 index 000000000..bb07b2ed6 --- /dev/null +++ b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93ab2216c7e8c684d84873bd2ae72c6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs index d30f029bc..f186820d5 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs @@ -9,7 +9,7 @@ namespace VRMShaders { public delegate Task GetTextureAsyncFunc(TextureDescriptor texDesc); - public class MaterialFactory : IDisposable + public class MaterialFactory : IResponsibilityForDestroyObjects { private readonly IReadOnlyDictionary m_externalMap; @@ -79,7 +79,7 @@ namespace VRMShaders /// /// /// - public void TransferOwnership(Func take) + public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { var list = new List(); foreach (var x in m_materials) diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs index d3bc48f0c..8353d7a34 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace VRMShaders { - public class TextureFactory : IDisposable + public class TextureFactory : IResponsibilityForDestroyObjects { private readonly ITextureDeserializer _textureDeserializer; private readonly IReadOnlyDictionary _externalMap; @@ -43,7 +43,7 @@ namespace VRMShaders /// 所有権(Dispose権)を移譲する /// /// - public void TransferOwnership(Func take) + public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { var transferredAssets = new HashSet(); foreach (var x in _textureCache) From 3b1f3fb52c9f5635b1c1d6e42a68fb7887325945 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 18:40:04 +0900 Subject: [PATCH 02/12] add SubAssetKey to TakeResponsibilityForDestroyObjectFunc --- .../ScriptedImporter/EditorAnimation.cs | 2 +- .../ScriptedImporter/ScriptedImporterImpl.cs | 6 +- .../ScriptedImporter/TextureExtractor.cs | 9 -- .../IO/AnimationIO/AnimationImporterUtil.cs | 8 ++ .../Runtime/UniGLTF/IO/ImporterContext.cs | 51 +++---- .../Editor/Format/VRMEditorImporterContext.cs | 2 +- Assets/VRM/Runtime/IO/VRMImporterContext.cs | 12 +- .../Editor/ScriptedImporter/EditorVrm.cs | 14 +- .../VrmScriptedImporterImpl.cs | 4 +- .../Components/Expression/ExpressionKey.cs | 12 ++ Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 124 +++++++++--------- .../IResponsibilityForDestroyObjects.cs | 2 +- .../GLTF/IO/Runtime/KeyValuePariExtensions.cs | 13 ++ .../IO/Runtime/KeyValuePariExtensions.cs.meta | 11 ++ .../GLTF/IO/Runtime/MaterialFactory.cs | 10 +- .../VRMShaders/GLTF/IO/Runtime/SubAssetKey.cs | 17 ++- .../GLTF/IO/Runtime/TextureFactory.cs | 6 +- 17 files changed, 157 insertions(+), 146 deletions(-) create mode 100644 Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs create mode 100644 Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs.meta diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs index b17706477..632b65ccb 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs @@ -21,7 +21,7 @@ namespace UniGLTF } } - importer.DrawRemapGUI(parser.GLTF.animations.Select(x => new SubAssetKey(typeof(AnimationClip), x.name))); + importer.DrawRemapGUI(AnimationImporterUtil.EnumerateSubAssetKeys(parser.GLTF)); if (GUILayout.Button("Clear")) { diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs index 5d0f12d61..fd6e6a83a 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; using System.Linq; -using UnityEditor; using UnityEngine; using VRMShaders; #if UNITY_2020_2_OR_NEWER @@ -53,9 +51,9 @@ namespace UniGLTF loader.Load(); loader.ShowMeshes(); - loader.TransferOwnership(o => + loader.TransferOwnership((k, o) => { - context.AddObjectToAsset(o.name, o); + context.AddObjectToAsset(k.Name, o); if (o is GameObject) { // Root GameObject is main object diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/TextureExtractor.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/TextureExtractor.cs index bc19ccd19..f633ab624 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/TextureExtractor.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/TextureExtractor.cs @@ -107,13 +107,4 @@ namespace UniGLTF }; } } - - public static class KeyValuePariExtensions - { - public static void Deconstruct(this KeyValuePair pair, out T key, out U value) - { - key = pair.Key; - value = pair.Value; - } - } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs index dc561cbcf..5914212b6 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs @@ -312,5 +312,13 @@ namespace UniGLTF } return clip; } + + public static IEnumerable EnumerateSubAssetKeys(glTF gltf) + { + foreach (var gltfAnimation in gltf.animations) + { + yield return new VRMShaders.SubAssetKey(typeof(AnimationClip), gltfAnimation.name); + } + } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 7dd0158e1..0b6b02f12 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -119,18 +119,17 @@ namespace UniGLTF { if (GLTF.animations != null && GLTF.animations.Any()) { - for (int i = 0; i < GLTF.animations.Count; ++i) + foreach (var (key, gltfAnimation) in Enumerable.Zip(AnimationImporterUtil.EnumerateSubAssetKeys(GLTF), GLTF.animations, (x, y) => (x, y))) { - var gltfAnimation = GLTF.animations[i]; AnimationClip clip = default; - if (_externalObjectMap.TryGetValue(new SubAssetKey(typeof(AnimationClip), gltfAnimation.name), out UnityEngine.Object value)) + if (_externalObjectMap.TryGetValue(key, out UnityEngine.Object value)) { clip = value as AnimationClip; } else { - clip = AnimationImporterUtil.ConvertAnimationClip(GLTF, GLTF.animations[i], InvertAxis.Create()); - AnimationClips.Add(clip); + clip = AnimationImporterUtil.ConvertAnimationClip(GLTF, gltfAnimation, InvertAxis.Create()); + AnimationClips.Add((key, clip)); } } @@ -150,7 +149,7 @@ namespace UniGLTF var animation = Root.AddComponent(); for (int i = 0; i < AnimationClips.Count; ++i) { - var clip = AnimationClips[i]; + var (_, clip) = AnimationClips[i]; animation.AddClip(clip, clip.name); if (i == 0) { @@ -290,14 +289,6 @@ namespace UniGLTF } } } - void RemoveMesh(Mesh mesh) - { - var index = Meshes.FindIndex(x => x.Mesh == mesh); - if (index >= 0) - { - Meshes.RemoveAt(index); - } - } public void EnableUpdateWhenOffscreen() { @@ -314,7 +305,7 @@ namespace UniGLTF } } - public List AnimationClips = new List(); + public List<(SubAssetKey, AnimationClip)> AnimationClips = new List<(SubAssetKey, AnimationClip)>(); #endregion /// @@ -324,7 +315,7 @@ namespace UniGLTF { Action destroy = UnityResourceDestroyer.DestroyResource(); - foreach (var x in AnimationClips) + foreach (var (k, x) in AnimationClips) { #if VRM_DEVELOP // Debug.Log($"Destroy {x}"); @@ -360,38 +351,30 @@ namespace UniGLTF /// public virtual void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { - var list = new List(); - foreach (var mesh in Meshes) + foreach (var mesh in Meshes.ToArray()) { - if (take(mesh.Mesh)) + // mesh の extract は実装していないので SubAssetKey を使わない + if (take(default, mesh.Mesh)) { - list.Add(mesh.Mesh); + Meshes.Remove(mesh); } } - foreach (var x in list) - { - RemoveMesh(x as Mesh); - } TextureFactory.TransferOwnership(take); MaterialFactory.TransferOwnership(take); - list.Clear(); - foreach (var animation in AnimationClips) + foreach (var (key, animation) in AnimationClips.ToArray()) { - if (take(animation)) + if (take(key, animation)) { - list.Add(animation); + AnimationClips.Remove((key, animation)); } } - foreach (var x in list) - { - AnimationClips.Remove(x as AnimationClip); - } if (m_ownRoot && Root != null) { - if (take(Root)) + // GameObject の extract は無いので SubAssetKey を使わない + if (take(default, Root)) { // 所有権(Dispose権) m_ownRoot = false; @@ -411,7 +394,7 @@ namespace UniGLTF public UnityResourceDestroyer DisposeOnGameObjectDestroyed() { var destroyer = Root.AddComponent(); - TransferOwnership(o => + TransferOwnership((k, o) => { destroyer.Resources.Add(o); return true; diff --git a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs index 2c03ea857..61afcfa38 100644 --- a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs +++ b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs @@ -108,7 +108,7 @@ namespace VRM TextureExtractor.ExtractTextures(m_context.Parser, m_prefabPath.Parent.Child(dirName), m_context.TextureDescriptorGenerator, subAssets, (_x, _y) => { }, onTextureReloaded); } - bool SaveAsAsset(UnityEngine.Object o) + bool SaveAsAsset(SubAssetKey _, UnityEngine.Object o) { if (o is GameObject) { diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index 1874b8fb7..7fccf05a5 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -319,31 +319,33 @@ namespace VRM public override void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { + // VRM-0 は SubAssetKey を使っていないので default で済ます + // VRM 固有のリソース(ScriptableObject) - if (take(HumanoidAvatar)) + if (take(default, HumanoidAvatar)) { HumanoidAvatar = null; } - if (take(Meta)) + if (take(default, Meta)) { Meta = null; } - if (take(AvatarDescription)) + if (take(default, AvatarDescription)) { AvatarDescription = null; } foreach (var x in BlendShapeAvatar.Clips) { - if (take(x)) + if (take(default, x)) { // do nothing } } - if (take(BlendShapeAvatar)) + if (take(default, BlendShapeAvatar)) { BlendShapeAvatar = null; } diff --git a/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs b/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs index 37e0d03f9..48cd04591 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs @@ -15,18 +15,6 @@ namespace UniVRM10 { public static class EditorVrm { - static ExpressionKey CreateKey(UniGLTF.Extensions.VRMC_vrm.Expression expression) - { - if (expression.Preset == UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.custom) - { - return ExpressionKey.CreateCustom(expression.Name); - } - else - { - return ExpressionKey.CreateFromPreset(expression.Preset); - } - } - public static void OnGUI(ScriptedImporter importer, GltfParser parser, UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm) { var hasExternal = importer.GetExternalObjectMap().Any(x => x.Value is VRM10MetaObject || x.Value is VRM10ExpressionAvatar || x.Value is VRM10Expression); @@ -42,7 +30,7 @@ namespace UniVRM10 importer.DrawRemapGUI(new SubAssetKey[] { VRM10MetaObject.SubAssetKey }); // expressions - importer.DrawRemapGUI(vrm.Expressions.Select(x => CreateKey(x).SubAssetKey)); + importer.DrawRemapGUI(vrm.Expressions.Select(x => ExpressionKey.CreateFromVrm10(x).SubAssetKey)); if (GUILayout.Button("Clear")) { diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index 948295c4f..d5a7ef111 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -45,9 +45,9 @@ namespace UniVRM10 loader.Load(); loader.ShowMeshes(); - loader.TransferOwnership(o => + loader.TransferOwnership((key, o) => { - context.AddObjectToAsset(o.name, o); + context.AddObjectToAsset(key.Name, o); if (o is GameObject) { // Root GameObject is main object diff --git a/Assets/VRM10/Runtime/Components/Expression/ExpressionKey.cs b/Assets/VRM10/Runtime/Components/Expression/ExpressionKey.cs index f9bb60ab6..19a1ef27f 100644 --- a/Assets/VRM10/Runtime/Components/Expression/ExpressionKey.cs +++ b/Assets/VRM10/Runtime/Components/Expression/ExpressionKey.cs @@ -133,6 +133,18 @@ namespace UniVRM10 return new ExpressionKey(clip.Preset, clip.ExpressionName); } + public static ExpressionKey CreateFromVrm10(UniGLTF.Extensions.VRMC_vrm.Expression expression) + { + if (expression.Preset == UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.custom) + { + return ExpressionKey.CreateCustom(expression.Name); + } + else + { + return ExpressionKey.CreateFromPreset(expression.Preset); + } + } + public override string ToString() { return _id.Replace(UnknownPresetPrefix, ""); diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index b1ae1537f..d48f07ddd 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; using UniGLTF; using UnityEngine; -using VrmLib; using VRMShaders; @@ -16,7 +14,7 @@ namespace UniVRM10 /// public class Vrm10Importer : UniGLTF.ImporterContext { - readonly Model m_model; + readonly VrmLib.Model m_model; UniGLTF.Extensions.VRMC_vrm.VRMC_vrm m_vrm; @@ -54,61 +52,61 @@ namespace UniVRM10 // assign humanoid bones if (m_vrm.Humanoid != null) { - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Hips, HumanoidBones.hips); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftUpperLeg, HumanoidBones.leftUpperLeg); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightUpperLeg, HumanoidBones.rightUpperLeg); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLowerLeg, HumanoidBones.leftLowerLeg); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLowerLeg, HumanoidBones.rightLowerLeg); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftFoot, HumanoidBones.leftFoot); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightFoot, HumanoidBones.rightFoot); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Spine, HumanoidBones.spine); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Chest, HumanoidBones.chest); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Neck, HumanoidBones.neck); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Head, HumanoidBones.head); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftShoulder, HumanoidBones.leftShoulder); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightShoulder, HumanoidBones.rightShoulder); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftUpperArm, HumanoidBones.leftUpperArm); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightUpperArm, HumanoidBones.rightUpperArm); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLowerArm, HumanoidBones.leftLowerArm); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLowerArm, HumanoidBones.rightLowerArm); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftHand, HumanoidBones.leftHand); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightHand, HumanoidBones.rightHand); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftToes, HumanoidBones.leftToes); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightToes, HumanoidBones.rightToes); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftEye, HumanoidBones.leftEye); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightEye, HumanoidBones.rightEye); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Jaw, HumanoidBones.jaw); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftThumbProximal, HumanoidBones.leftThumbProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftThumbIntermediate, HumanoidBones.leftThumbIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftThumbDistal, HumanoidBones.leftThumbDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftIndexProximal, HumanoidBones.leftIndexProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftIndexIntermediate, HumanoidBones.leftIndexIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftIndexDistal, HumanoidBones.leftIndexDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftMiddleProximal, HumanoidBones.leftMiddleProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftMiddleIntermediate, HumanoidBones.leftMiddleIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftMiddleDistal, HumanoidBones.leftMiddleDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftRingProximal, HumanoidBones.leftRingProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftRingIntermediate, HumanoidBones.leftRingIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftRingDistal, HumanoidBones.leftRingDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLittleProximal, HumanoidBones.leftLittleProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLittleIntermediate, HumanoidBones.leftLittleIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLittleDistal, HumanoidBones.leftLittleDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightThumbProximal, HumanoidBones.rightThumbProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightThumbIntermediate, HumanoidBones.rightThumbIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightThumbDistal, HumanoidBones.rightThumbDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightIndexProximal, HumanoidBones.rightIndexProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightIndexIntermediate, HumanoidBones.rightIndexIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightIndexDistal, HumanoidBones.rightIndexDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightMiddleProximal, HumanoidBones.rightMiddleProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightMiddleIntermediate, HumanoidBones.rightMiddleIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightMiddleDistal, HumanoidBones.rightMiddleDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightRingProximal, HumanoidBones.rightRingProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightRingIntermediate, HumanoidBones.rightRingIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightRingDistal, HumanoidBones.rightRingDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLittleProximal, HumanoidBones.rightLittleProximal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLittleIntermediate, HumanoidBones.rightLittleIntermediate); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLittleDistal, HumanoidBones.rightLittleDistal); - AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.UpperChest, HumanoidBones.upperChest); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Hips, VrmLib.HumanoidBones.hips); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftUpperLeg, VrmLib.HumanoidBones.leftUpperLeg); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightUpperLeg, VrmLib.HumanoidBones.rightUpperLeg); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLowerLeg, VrmLib.HumanoidBones.leftLowerLeg); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLowerLeg, VrmLib.HumanoidBones.rightLowerLeg); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftFoot, VrmLib.HumanoidBones.leftFoot); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightFoot, VrmLib.HumanoidBones.rightFoot); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Spine, VrmLib.HumanoidBones.spine); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Chest, VrmLib.HumanoidBones.chest); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Neck, VrmLib.HumanoidBones.neck); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Head, VrmLib.HumanoidBones.head); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftShoulder, VrmLib.HumanoidBones.leftShoulder); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightShoulder, VrmLib.HumanoidBones.rightShoulder); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftUpperArm, VrmLib.HumanoidBones.leftUpperArm); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightUpperArm, VrmLib.HumanoidBones.rightUpperArm); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLowerArm, VrmLib.HumanoidBones.leftLowerArm); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLowerArm, VrmLib.HumanoidBones.rightLowerArm); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftHand, VrmLib.HumanoidBones.leftHand); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightHand, VrmLib.HumanoidBones.rightHand); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftToes, VrmLib.HumanoidBones.leftToes); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightToes, VrmLib.HumanoidBones.rightToes); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftEye, VrmLib.HumanoidBones.leftEye); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightEye, VrmLib.HumanoidBones.rightEye); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.Jaw, VrmLib.HumanoidBones.jaw); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftThumbProximal, VrmLib.HumanoidBones.leftThumbProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftThumbIntermediate, VrmLib.HumanoidBones.leftThumbIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftThumbDistal, VrmLib.HumanoidBones.leftThumbDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftIndexProximal, VrmLib.HumanoidBones.leftIndexProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftIndexIntermediate, VrmLib.HumanoidBones.leftIndexIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftIndexDistal, VrmLib.HumanoidBones.leftIndexDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftMiddleProximal, VrmLib.HumanoidBones.leftMiddleProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftMiddleIntermediate, VrmLib.HumanoidBones.leftMiddleIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftMiddleDistal, VrmLib.HumanoidBones.leftMiddleDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftRingProximal, VrmLib.HumanoidBones.leftRingProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftRingIntermediate, VrmLib.HumanoidBones.leftRingIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftRingDistal, VrmLib.HumanoidBones.leftRingDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLittleProximal, VrmLib.HumanoidBones.leftLittleProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLittleIntermediate, VrmLib.HumanoidBones.leftLittleIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.LeftLittleDistal, VrmLib.HumanoidBones.leftLittleDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightThumbProximal, VrmLib.HumanoidBones.rightThumbProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightThumbIntermediate, VrmLib.HumanoidBones.rightThumbIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightThumbDistal, VrmLib.HumanoidBones.rightThumbDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightIndexProximal, VrmLib.HumanoidBones.rightIndexProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightIndexIntermediate, VrmLib.HumanoidBones.rightIndexIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightIndexDistal, VrmLib.HumanoidBones.rightIndexDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightMiddleProximal, VrmLib.HumanoidBones.rightMiddleProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightMiddleIntermediate, VrmLib.HumanoidBones.rightMiddleIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightMiddleDistal, VrmLib.HumanoidBones.rightMiddleDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightRingProximal, VrmLib.HumanoidBones.rightRingProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightRingIntermediate, VrmLib.HumanoidBones.rightRingIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightRingDistal, VrmLib.HumanoidBones.rightRingDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLittleProximal, VrmLib.HumanoidBones.rightLittleProximal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLittleIntermediate, VrmLib.HumanoidBones.rightLittleIntermediate); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.RightLittleDistal, VrmLib.HumanoidBones.rightLittleDistal); + AssignHumanoid(m_model.Nodes, m_vrm.Humanoid.HumanBones.UpperChest, VrmLib.HumanoidBones.upperChest); } } @@ -124,7 +122,7 @@ namespace UniVRM10 /// readonly ModelMap m_map = new ModelMap(); - static void AssignHumanoid(List nodes, UniGLTF.Extensions.VRMC_vrm.HumanBone humanBone, VrmLib.HumanoidBones key) + static void AssignHumanoid(List nodes, UniGLTF.Extensions.VRMC_vrm.HumanBone humanBone, VrmLib.HumanoidBones key) { if (humanBone != null && humanBone.Node.HasValue) { @@ -620,17 +618,17 @@ namespace UniVRM10 return renderer; } - public override void TransferOwnership(Func take) + public override void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { // VRM 固有のリソース(ScriptableObject) - if (take(m_humanoid)) + if (take(default, m_humanoid)) { m_humanoid = null; } if (m_meta != null) { - if (take(m_meta)) + if (take(VRM10MetaObject.SubAssetKey, m_meta)) { m_meta = null; } @@ -638,7 +636,7 @@ namespace UniVRM10 foreach (var x in m_expressions) { - if (take(x)) + if (take(ExpressionKey.CreateFromClip(x).SubAssetKey, x)) { // do nothing } diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs index cff41ebcc..2936837f8 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs @@ -2,7 +2,7 @@ using System; namespace VRMShaders { - public delegate bool TakeResponsibilityForDestroyObjectFunc(UnityEngine.Object obj); + public delegate bool TakeResponsibilityForDestroyObjectFunc(SubAssetKey key, UnityEngine.Object obj); /// /// UnityObjectを破棄する責務。 diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs b/Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs new file mode 100644 index 000000000..91a41891f --- /dev/null +++ b/Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace VRMShaders +{ + public static class KeyValuePariExtensions + { + public static void Deconstruct(this KeyValuePair pair, out T key, out U value) + { + key = pair.Key; + value = pair.Value; + } + } +} diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs.meta b/Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs.meta new file mode 100644 index 000000000..ec64d27cb --- /dev/null +++ b/Assets/VRMShaders/GLTF/IO/Runtime/KeyValuePariExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7dd6ef3302d21eb4b83c4f8f2c1e47cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs index f186820d5..41c5f264c 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs @@ -30,13 +30,15 @@ namespace VRMShaders public struct MaterialLoadInfo { + public SubAssetKey Key; public readonly Material Asset; public readonly bool UseExternal; public bool IsSubAsset => !UseExternal; - public MaterialLoadInfo(Material asset, bool useExternal) + public MaterialLoadInfo(SubAssetKey key, Material asset, bool useExternal) { + Key = key; Asset = asset; UseExternal = useExternal; } @@ -87,7 +89,7 @@ namespace VRMShaders if (!x.UseExternal) { // 外部の '.asset' からロードしていない - if (take(x.Asset)) + if (take(x.Key, x.Asset)) { list.Add(x.Asset); } @@ -110,7 +112,7 @@ namespace VRMShaders { if (m_externalMap.TryGetValue(matDesc.SubAssetKey, out Material material)) { - m_materials.Add(new MaterialLoadInfo(material, true)); + m_materials.Add(new MaterialLoadInfo(matDesc.SubAssetKey, material, true)); return material; } @@ -174,7 +176,7 @@ namespace VRMShaders action(material); } - m_materials.Add(new MaterialLoadInfo(material, false)); + m_materials.Add(new MaterialLoadInfo(matDesc.SubAssetKey, material, false)); return material; } diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/SubAssetKey.cs b/Assets/VRMShaders/GLTF/IO/Runtime/SubAssetKey.cs index 702d7a863..d9bd042b0 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/SubAssetKey.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/SubAssetKey.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using UnityEngine; namespace VRMShaders @@ -7,15 +6,16 @@ namespace VRMShaders /// /// UnityEditor.Experimental.AssetImporter.SourceAssetIdentifier に対応する /// - /// * SourceAssetIdentifier が UnityEditor なので、 Runtime でも使えるように + /// * SourceAssetIdentifier が UnityEditor なので、 Runtime でも使えるように作成 /// * Type が違うが Name が同じだと警告が出る。例えば、Material と 同じ名前の Texture がある場合。 /// Identifier uniqueness violation: 'Alicia_body'. Scripted Importers do not guarantee that subsequent imports of this asset will properly re-link to these targets. - /// * なので、SourceAssetIdentifier は、$"{Type.Name}.{UnityObject.name}" のように強制的に Unique にするのが良さそう - /// * 一方で、Extract したファイル名に $"{Type.Name}." が付属するのは煩わしいのでこれは無しにしたい。 /// /// public void AddRemap(SourceAssetIdentifier identifier, UnityEngine.Object externalObject); - /// - /// の呼び出し時に、identifier.name と externalObject.name が同じでない運用にしてみる。 + /// scriptedImporter.GetExternalObjectMap + /// + /// に関係する。 + /// + /// SubAssetKey を新しく作る場所は集約して、不一致が起こらないように注意する /// /// public readonly struct SubAssetKey : IEquatable @@ -48,6 +48,11 @@ namespace VRMShaders Name = obj.name; } + public static SubAssetKey Create(T obj) where T : UnityEngine.Object + { + return new SubAssetKey(typeof(T), obj.name); + } + public SubAssetKey(Type type, string name) { if (type == null || string.IsNullOrEmpty(name)) diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs index 8353d7a34..2f7458e07 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs @@ -46,11 +46,11 @@ namespace VRMShaders public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { var transferredAssets = new HashSet(); - foreach (var x in _textureCache) + foreach (var (k, v) in _textureCache) { - if (take(x.Value)) + if (take(k, v)) { - transferredAssets.Add(x.Key); + transferredAssets.Add(k); } } From aa6b826cb311d997a717b46d8c6c4b71680e4af1 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 18:46:51 +0900 Subject: [PATCH 03/12] rename UnityResourceDestroyer to UnityObjectManager --- Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs | 6 +++--- .../{UnityResourceDestroyer.cs => UnityObjectManager.cs} | 2 +- ...ResourceDestroyer.cs.meta => UnityObjectManager.cs.meta} | 2 +- Assets/VRM/Runtime/IO/VRMImporterContext.cs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename Assets/UniGLTF/Runtime/UniGLTF/{UnityResourceDestroyer.cs => UnityObjectManager.cs} (95%) rename Assets/UniGLTF/Runtime/UniGLTF/{UnityResourceDestroyer.cs.meta => UnityObjectManager.cs.meta} (83%) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 0b6b02f12..8edd0f151 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -313,7 +313,7 @@ namespace UniGLTF /// public virtual void Dispose() { - Action destroy = UnityResourceDestroyer.DestroyResource(); + Action destroy = UnityObjectManager.DestroyResource(); foreach (var (k, x) in AnimationClips) { @@ -391,9 +391,9 @@ namespace UniGLTF /// ImporterContext.Dispose の対象から外れる。 /// /// - public UnityResourceDestroyer DisposeOnGameObjectDestroyed() + public UnityObjectManager DisposeOnGameObjectDestroyed() { - var destroyer = Root.AddComponent(); + var destroyer = Root.AddComponent(); TransferOwnership((k, o) => { destroyer.Resources.Add(o); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityResourceDestroyer.cs b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs similarity index 95% rename from Assets/UniGLTF/Runtime/UniGLTF/UnityResourceDestroyer.cs rename to Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs index b14ae9b45..8bd333f14 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityResourceDestroyer.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs @@ -8,7 +8,7 @@ namespace UniGLTF /// /// Mesh, Material, Texture などを抱えておいて確実に破棄できるようにする /// - public class UnityResourceDestroyer : MonoBehaviour + public class UnityObjectManager : MonoBehaviour { List m_resources = new List(); public IList Resources => m_resources; diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityResourceDestroyer.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs.meta similarity index 83% rename from Assets/UniGLTF/Runtime/UniGLTF/UnityResourceDestroyer.cs.meta rename to Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs.meta index b07ef89ae..13de66798 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityResourceDestroyer.cs.meta +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 93b3af59a4d8b704a883260f2fd40c44 +guid: a396b6305c6ed494bad94f21d359e774 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index 7fccf05a5..2904917fb 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -356,7 +356,7 @@ namespace VRM public override void Dispose() { - Action destroy = UnityResourceDestroyer.DestroyResource(); + Action destroy = UnityObjectManager.DestroyResource(); // VRM specific if (HumanoidAvatar != null) From a17c789a0220f7282e1c5e350a4d3e418adb75b2 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 19:42:10 +0900 Subject: [PATCH 04/12] =?UTF-8?q?ImporterContext.LoadAsync=20=E3=81=8C=20U?= =?UTF-8?q?nityObjectManager=20=E3=82=92=E6=88=BB=E3=81=99=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=82=A4=E3=83=B3=E3=82=BF=E3=83=95=E3=82=A7?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScriptedImporter/ScriptedImporterImpl.cs | 13 +- .../Runtime/UniGLTF/IO/ImporterContext.cs | 82 +----- .../UniGLTF/IO/ImporterContextExtensions.cs | 4 +- .../Runtime/UniGLTF/UnityObjectManager.cs | 63 +++-- Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs | 30 +- Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs | 36 +-- .../Editor/Tests/VRMImportExportTests.cs | 258 +++++++++--------- .../VRM.Samples/Scripts/VRMRuntimeExporter.cs | 9 +- .../VRM.Samples/Scripts/VRMRuntimeLoader.cs | 21 +- Assets/VRM.Samples/Scripts/ViewerUI.cs | 27 +- .../Editor/Format/VRMEditorImporterContext.cs | 10 +- Assets/VRM/Editor/Format/VRMImporterMenu.cs | 13 +- .../Editor/Format/vrmAssetPostprocessor.cs | 4 +- Assets/VRM/Runtime/IO/VRMImporterContext.cs | 12 +- Assets/VRM/Tests/VRMLoadTests.cs | 3 +- Assets/VRM/Tests/VRMLookAtTests.cs | 30 +- Assets/VRM/Tests/VrmDividedMeshTests.cs | 6 +- Assets/VRM10.Samples/Runtime/ViewerUI.cs | 31 +-- .../VrmScriptedImporterImpl.cs | 13 +- Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 8 +- Assets/VRM10/Runtime/Scenes/Sample.cs | 6 +- Assets/VRM10/Tests.PlayMode/MaterialTests.cs | 7 +- Assets/VRM10/Tests/ApiSampleTests.cs | 8 +- .../GLTF/IO/Runtime/MaterialFactory.cs | 3 +- .../GLTF/IO/Runtime/TextureFactory.cs | 114 ++++---- .../GLTF/IO/Runtime/UnityObjectDestroyer.cs | 19 ++ .../IO/Runtime/UnityObjectDestroyer.cs.meta | 11 + 27 files changed, 390 insertions(+), 451 deletions(-) create mode 100644 Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs create mode 100644 Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs.meta diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs index fd6e6a83a..f2315725c 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs @@ -48,20 +48,17 @@ namespace UniGLTF } loader.InvertAxis = reverseAxis; - loader.Load(); - loader.ShowMeshes(); + var loaded = loader.Load(); + loaded.ShowMeshes(); loader.TransferOwnership((k, o) => { context.AddObjectToAsset(k.Name, o); - if (o is GameObject) - { - // Root GameObject is main object - context.SetMainObject(loader.Root); - } - return true; }); + + context.AddObjectToAsset(loaded.name, loaded.gameObject); + context.SetMainObject(loaded.gameObject); } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 8edd0f151..cd37a0f86 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -61,7 +61,7 @@ namespace UniGLTF }; #region Load. Build unity objects - public virtual async Task LoadAsync(IAwaitCaller awaitCaller = null, Func MeasureTime = null) + public virtual async Task LoadAsync(IAwaitCaller awaitCaller = null, Func MeasureTime = null) { if (awaitCaller == null) { @@ -108,6 +108,8 @@ namespace UniGLTF } await OnLoadHierarchy(awaitCaller, MeasureTime); + + return UnityObjectManager.AttachTo(Root, this); } /// @@ -274,36 +276,10 @@ namespace UniGLTF #endregion #region Imported - public GameObject Root; - bool m_ownRoot = true; + protected GameObject Root; public List Nodes = new List(); public List Meshes = new List(); - public void ShowMeshes() - { - foreach (var x in Meshes) - { - foreach (var y in x.Renderers) - { - y.enabled = true; - } - } - } - - public void EnableUpdateWhenOffscreen() - { - foreach (var x in Meshes) - { - foreach (var r in x.Renderers) - { - var skinnedMeshRenderer = r as SkinnedMeshRenderer; - if (skinnedMeshRenderer != null) - { - skinnedMeshRenderer.updateWhenOffscreen = true; - } - } - } - } public List<(SubAssetKey, AnimationClip)> AnimationClips = new List<(SubAssetKey, AnimationClip)>(); #endregion @@ -313,36 +289,20 @@ namespace UniGLTF /// public virtual void Dispose() { - Action destroy = UnityObjectManager.DestroyResource(); - foreach (var (k, x) in AnimationClips) { -#if VRM_DEVELOP - // Debug.Log($"Destroy {x}"); -#endif - destroy(x); + UnityObjectDestoyer.DestroyRuntimeOrEditor(x); } AnimationClips.Clear(); foreach (var x in Meshes) { -#if VRM_DEVELOP - // Debug.Log($"Destroy {x.Mesh}"); -#endif - destroy(x.Mesh); + UnityObjectDestoyer.DestroyRuntimeOrEditor(x.Mesh); } Meshes.Clear(); MaterialFactory?.Dispose(); TextureFactory?.Dispose(); - - if (m_ownRoot && Root != null) - { -#if VRM_DEVELOP - // Debug.Log($"Destroy {Root}"); -#endif - destroy(Root); - } } /// @@ -370,36 +330,6 @@ namespace UniGLTF AnimationClips.Remove((key, animation)); } } - - if (m_ownRoot && Root != null) - { - // GameObject の extract は無いので SubAssetKey を使わない - if (take(default, Root)) - { - // 所有権(Dispose権) - m_ownRoot = false; - } - } - } - - /// - /// RootにUnityResourceDestroyerをアタッチして、 - /// RootをUnityEngine.Object.Destroyしたときに、 - /// 関連するUnityEngine.Objectを破棄するようにする。 - /// Mesh, Material, Texture, AnimationClip, GameObject の所有者が - /// ImporterContext から UnityResourceDestroyer に移動する。 - /// ImporterContext.Dispose の対象から外れる。 - /// - /// - public UnityObjectManager DisposeOnGameObjectDestroyed() - { - var destroyer = Root.AddComponent(); - TransferOwnership((k, o) => - { - destroyer.Resources.Add(o); - return true; - }); - return destroyer; } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs index 900440fe3..8b3bbe165 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs @@ -8,7 +8,7 @@ namespace UniGLTF /// /// Build unity objects from parsed gltf /// - public static void Load(this ImporterContext self) + public static UnityObjectManager Load(this ImporterContext self) { var meassureTime = new ImporterContextSpeedLog(); var task = self.LoadAsync(default(ImmediateCaller), meassureTime.MeasureTime); @@ -24,6 +24,8 @@ namespace UniGLTF #if VRM_DEVELOP Debug.Log($"{self.Parser.TargetPath}: {meassureTime.GetSpeedLog()}"); #endif + + return task.Result; } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs index 8bd333f14..183097841 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs @@ -1,39 +1,64 @@ using System; using System.Collections.Generic; using UnityEngine; - +using VRMShaders; namespace UniGLTF { /// /// Mesh, Material, Texture などを抱えておいて確実に破棄できるようにする /// - public class UnityObjectManager : MonoBehaviour + public class UnityObjectManager : MonoBehaviour, IResponsibilityForDestroyObjects { - List m_resources = new List(); - public IList Resources => m_resources; + List<(SubAssetKey, UnityEngine.Object)> m_resources = new List<(SubAssetKey, UnityEngine.Object)>(); + + public static UnityObjectManager AttachTo(GameObject go, ImporterContext context) + { + var loaded = go.AddComponent(); + context.TransferOwnership((k, o) => + { + loaded.m_resources.Add((k, o)); + return true; + }); + return loaded; + } + + public void ShowMeshes() + { + foreach (var r in GetComponentsInChildren()) + { + r.enabled = true; + } + } + + public void EnableUpdateWhenOffscreen() + { + foreach (var smr in GetComponentsInChildren()) + { + smr.updateWhenOffscreen = true; + } + } void OnDestroy() { Debug.Log("UnityResourceDestroyer.OnDestroy"); - foreach (var x in Resources) - { -#if VRM_DEVELOP - Debug.Log($"Destroy: {x}"); -#endif - Destroy(x); - } + Dispose(); } - public static Action DestroyResource() + public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { - Action des = (UnityEngine.Object o) => UnityEngine.Object.Destroy(o); - Action desi = (UnityEngine.Object o) => UnityEngine.Object.DestroyImmediate(o); - Action func = Application.isPlaying - ? des - : desi - ; - return func; + throw new NotImplementedException(); + } + + public void Dispose() + { + foreach (var (key, x) in m_resources) + { +#if VRM_DEVELOP + // Debug.Log($"Destroy: {x}"); +#endif + UnityObjectDestoyer.DestroyRuntimeOrEditor(x); + } } } } diff --git a/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs b/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs index eedddfcba..dad99978e 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs @@ -93,27 +93,27 @@ namespace UniGLTF { try { - loader.Load(); + var loaded = loader.Load(); + if (loaded == null) + { + Debug.LogWarning($"root is null: ${gltf}"); + return; + } + + if (Skip.Contains(gltf.Directory.Parent.Name)) + { + // Export issue: + // skip + return; + } + + Export(loaded.gameObject); } catch (Exception ex) { Message(gltf.FullName.Substring(subStrStart), ex); } - if (Skip.Contains(gltf.Directory.Parent.Name)) - { - // Export issue: - // skip - return; - } - - if (loader.Root == null) - { - Debug.LogWarning($"root is null: ${gltf}"); - return; - } - - Export(loader.Root); } } diff --git a/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs b/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs index 2273be95e..8f718abc1 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs @@ -120,9 +120,9 @@ namespace UniGLTF // import using (var context = new ImporterContext(parser)) + using (var loaded = context.Load()) { - context.Load(); - AssertAreEqual(go.transform, context.Root.transform); + AssertAreEqual(go.transform, loaded.transform); } } @@ -557,16 +557,14 @@ namespace UniGLTF parser.ParseJson(json, new SimpleStorage(new ArraySegment(new byte[1024 * 1024]))); using (var context = new ImporterContext(parser)) + using (var loaded = context.Load()) { - //Debug.LogFormat("{0}", context.Json); - context.Load(); - - var importedRed = context.Root.transform.GetChild(0); + var importedRed = loaded.transform.GetChild(0); var importedRedMaterial = importedRed.GetComponent().sharedMaterial; Assert.AreEqual("red", importedRedMaterial.name); Assert.AreEqual(Color.red, importedRedMaterial.color); - var importedBlue = context.Root.transform.GetChild(1); + var importedBlue = loaded.transform.GetChild(1); var importedBlueMaterial = importedBlue.GetComponent().sharedMaterial; Assert.AreEqual("blue", importedBlueMaterial.name); Assert.AreEqual(Color.blue, importedBlueMaterial.color); @@ -579,15 +577,14 @@ namespace UniGLTF parser.ParseJson(json, new SimpleStorage(new ArraySegment(new byte[1024 * 1024]))); //Debug.LogFormat("{0}", context.Json); using (var context = new ImporterContext(parser)) + using (var loaded = context.Load()) { - context.Load(); - - var importedRed = context.Root.transform.GetChild(0); + var importedRed = loaded.transform.GetChild(0); var importedRedMaterial = importedRed.GetComponent().sharedMaterial; Assert.AreEqual("red", importedRedMaterial.name); Assert.AreEqual(Color.red, importedRedMaterial.color); - var importedBlue = context.Root.transform.GetChild(1); + var importedBlue = loaded.transform.GetChild(1); var importedBlueMaterial = importedBlue.GetComponent().sharedMaterial; Assert.AreEqual("blue", importedBlueMaterial.name); Assert.AreEqual(Color.blue, importedBlueMaterial.color); @@ -633,13 +630,11 @@ namespace UniGLTF parser.ParseJson(json, new SimpleStorage(new ArraySegment(new byte[1024 * 1024]))); using (var context = new ImporterContext(parser)) + using (var loaded = context.Load()) { - context.Load(); - - Assert.AreEqual(1, context.Root.transform.GetChildren().Count()); - + Assert.AreEqual(1, loaded.transform.GetChildren().Count()); { - var child = context.Root.transform.GetChild(0); + var child = loaded.transform.GetChild(0); Assert.IsNull(child.GetSharedMesh()); } } @@ -700,18 +695,17 @@ namespace UniGLTF parser.ParseJson(json, new SimpleStorage(new ArraySegment(new byte[1024 * 1024]))); using (var context = new ImporterContext(parser)) + using (var loaded = context.Load()) { - context.Load(); - - Assert.AreEqual(2, context.Root.transform.GetChildren().Count()); + Assert.AreEqual(2, loaded.transform.GetChildren().Count()); { - var child = context.Root.transform.GetChild(0); + var child = loaded.transform.GetChild(0); Assert.IsNull(child.GetSharedMesh()); } { - var child = context.Root.transform.GetChild(1); + var child = loaded.transform.GetChild(1); Assert.IsNull(child.GetSharedMesh()); } } diff --git a/Assets/VRM.Samples/Editor/Tests/VRMImportExportTests.cs b/Assets/VRM.Samples/Editor/Tests/VRMImportExportTests.cs index 72aca7a9b..2f6aae909 100644 --- a/Assets/VRM.Samples/Editor/Tests/VRMImportExportTests.cs +++ b/Assets/VRM.Samples/Editor/Tests/VRMImportExportTests.cs @@ -47,152 +47,144 @@ namespace VRM.Samples parser.ParseGlb(File.ReadAllBytes(path)); using (var context = new VRMImporterContext(parser)) + using (var loaded = context.Load()) { - context.Load(); - context.ShowMeshes(); - context.EnableUpdateWhenOffscreen(); + loaded.ShowMeshes(); + loaded.EnableUpdateWhenOffscreen(); - var destroyer = context.DisposeOnGameObjectDestroyed(); - try + // mesh { - // mesh + foreach (var renderer in loaded.GetComponentsInChildren()) { - foreach (var renderer in destroyer.GetComponentsInChildren()) + Mesh mesh = default; + if (renderer is MeshRenderer) { - Mesh mesh = default; - if (renderer is MeshRenderer) + var f = renderer.GetComponent(); + mesh = f.sharedMesh; + } + else if (renderer is SkinnedMeshRenderer smr) + { + mesh = smr.sharedMesh; + } + + var gltfMesh = parser.GLTF.meshes.Find(x => x.name == mesh.name); + Assert.AreEqual(gltfMesh.name, mesh.name); + + // materials + foreach (var material in renderer.sharedMaterials) + { + var gltfMaterial = parser.GLTF.materials.Find(x => x.name == material.name); + Assert.AreEqual(gltfMaterial.name, material.name); + + var materialIndex = parser.GLTF.materials.IndexOf(gltfMaterial); + var vrmMaterial = context.VRM.materialProperties[materialIndex]; + // Debug.Log($"shaderName: '{vrmMaterial.shader}'"); + if (vrmMaterial.shader == "VRM/MToon") { - var f = renderer.GetComponent(); - mesh = f.sharedMesh; + // MToon + // Debug.Log($"{material.name} is MToon"); + foreach (var kv in vrmMaterial.textureProperties) + { + var texture = material.GetTexture(kv.Key); + // Debug.Log($"{kv.Key}: {texture}"); + Assert.NotNull(texture); + } } - else if (renderer is SkinnedMeshRenderer smr) + else if (glTF_KHR_materials_unlit.IsEnable(gltfMaterial)) { - mesh = smr.sharedMesh; + // Unlit + // Debug.Log($"{material.name} is unlit"); + throw new NotImplementedException(); } - - var gltfMesh = parser.GLTF.meshes.Find(x => x.name == mesh.name); - Assert.AreEqual(gltfMesh.name, mesh.name); - - // materials - foreach (var material in renderer.sharedMaterials) + else { - var gltfMaterial = parser.GLTF.materials.Find(x => x.name == material.name); - Assert.AreEqual(gltfMaterial.name, material.name); - - var materialIndex = parser.GLTF.materials.IndexOf(gltfMaterial); - var vrmMaterial = context.VRM.materialProperties[materialIndex]; - // Debug.Log($"shaderName: '{vrmMaterial.shader}'"); - if (vrmMaterial.shader == "VRM/MToon") - { - // MToon - // Debug.Log($"{material.name} is MToon"); - foreach (var kv in vrmMaterial.textureProperties) - { - var texture = material.GetTexture(kv.Key); - // Debug.Log($"{kv.Key}: {texture}"); - Assert.NotNull(texture); - } - } - else if (glTF_KHR_materials_unlit.IsEnable(gltfMaterial)) - { - // Unlit - // Debug.Log($"{material.name} is unlit"); - throw new NotImplementedException(); - } - else - { - // PBR - // Debug.Log($"{material.name} is PBR"); - throw new NotImplementedException(); - } + // PBR + // Debug.Log($"{material.name} is PBR"); + throw new NotImplementedException(); } } } - - // meta - { - var meta = destroyer.GetComponent(); - } - - // humanoid - { - var animator = destroyer.GetComponent(); - } - - - // blendshape - { - var blendshapeProxy = destroyer.GetComponent(); - for (int i = 0; i < context.VRM.blendShapeMaster.blendShapeGroups.Count; ++i) - { - var gltfBlendShapeClip = context.VRM.blendShapeMaster.blendShapeGroups[i]; - var unityBlendShapeClip = blendshapeProxy.BlendShapeAvatar.Clips[i]; - Assert.AreEqual(Enum.Parse(typeof(BlendShapePreset), gltfBlendShapeClip.presetName, true), unityBlendShapeClip.Preset); - } - } - - var importedJson = JsonParser.Parse(context.Json); - importedJson.SetValue("/extensions/VRM/exporterVersion", VRMVersion.VRM_VERSION, (f, x) => f.Value(x)); - importedJson.SetValue("/asset/generator", UniGLTF.UniGLTFVersion.UNIGLTF_VERSION, (f, x) => f.Value(x)); - importedJson.SetValue("/scene", 0, (f, x) => f.Value(x)); - importedJson.SetValue("/materials/*/doubleSided", false, (f, x) => f.Value(x)); - //importJson.SetValue("/materials/*/pbrMetallicRoughness/roughnessFactor", 0); - //importJson.SetValue("/materials/*/pbrMetallicRoughness/baseColorFactor", new float[] { 1, 1, 1, 1 }); - importedJson.SetValue("/accessors/*/normalized", false, (f, x) => f.Value(x)); - importedJson.RemoveValue(Utf8String.From("/nodes/*/extras")); - /* - importJson.SetValue("/bufferViews/12/byteStride", 4); - importJson.SetValue("/bufferViews/13/byteStride", 4); - importJson.SetValue("/bufferViews/14/byteStride", 4); - importJson.SetValue("/bufferViews/15/byteStride", 4); - importJson.SetValue("/bufferViews/22/byteStride", 4); - importJson.SetValue("/bufferViews/29/byteStride", 4); - importJson.SetValue("/bufferViews/45/byteStride", 4); - importJson.SetValue("/bufferViews/46/byteStride", 4); - importJson.SetValue("/bufferViews/47/byteStride", 4); - importJson.SetValue("/bufferViews/201/byteStride", 4); - importJson.SetValue("/bufferViews/202/byteStride", 4); - importJson.SetValue("/bufferViews/203/byteStride", 4); - importJson.SetValue("/bufferViews/204/byteStride", 4); - importJson.SetValue("/bufferViews/211/byteStride", 4); - importJson.SetValue("/bufferViews/212/byteStride", 4); - importJson.SetValue("/bufferViews/213/byteStride", 4); - importJson.SetValue("/bufferViews/214/byteStride", 4); - importJson.SetValue("/bufferViews/215/byteStride", 4); - importJson.SetValue("/bufferViews/243/byteStride", 4); - importJson.SetValue("/bufferViews/247/byteStride", 64); - importJson.SetValue("/bufferViews/248/byteStride", 64); - importJson.SetValue("/bufferViews/249/byteStride", 64); - importJson.SetValue("/bufferViews/250/byteStride", 64); - importJson.SetValue("/bufferViews/251/byteStride", 64); - importJson.SetValue("/bufferViews/252/byteStride", 64); - importJson.SetValue("/bufferViews/253/byteStride", 64); - */ - importedJson.RemoveValue(Utf8String.From("/bufferViews/*/byteStride")); - - var vrm = VRMExporter.Export(UniGLTF.MeshExportSettings.Default, context.Root, new EditorTextureSerializer()); - - // TODO: Check contents in JSON - /*var exportJson = */ - JsonParser.Parse(vrm.ToJson()); - - // TODO: Check contents in JSON - /*var newExportedJson = */ - // JsonParser.Parse(JsonSchema.FromType().Serialize(vrm)); - - /* - foreach (var kv in importJson.Diff(exportJson)) - { - Debug.Log(kv); - } - - Assert.AreEqual(importJson, exportJson); - */ } - finally + + // meta { - UnityEngine.Object.DestroyImmediate(destroyer.gameObject); + var meta = loaded.GetComponent(); } + + // humanoid + { + var animator = loaded.GetComponent(); + } + + + // blendshape + { + var blendshapeProxy = loaded.GetComponent(); + for (int i = 0; i < context.VRM.blendShapeMaster.blendShapeGroups.Count; ++i) + { + var gltfBlendShapeClip = context.VRM.blendShapeMaster.blendShapeGroups[i]; + var unityBlendShapeClip = blendshapeProxy.BlendShapeAvatar.Clips[i]; + Assert.AreEqual(Enum.Parse(typeof(BlendShapePreset), gltfBlendShapeClip.presetName, true), unityBlendShapeClip.Preset); + } + } + + var importedJson = JsonParser.Parse(context.Json); + importedJson.SetValue("/extensions/VRM/exporterVersion", VRMVersion.VRM_VERSION, (f, x) => f.Value(x)); + importedJson.SetValue("/asset/generator", UniGLTF.UniGLTFVersion.UNIGLTF_VERSION, (f, x) => f.Value(x)); + importedJson.SetValue("/scene", 0, (f, x) => f.Value(x)); + importedJson.SetValue("/materials/*/doubleSided", false, (f, x) => f.Value(x)); + //importJson.SetValue("/materials/*/pbrMetallicRoughness/roughnessFactor", 0); + //importJson.SetValue("/materials/*/pbrMetallicRoughness/baseColorFactor", new float[] { 1, 1, 1, 1 }); + importedJson.SetValue("/accessors/*/normalized", false, (f, x) => f.Value(x)); + importedJson.RemoveValue(Utf8String.From("/nodes/*/extras")); + /* + importJson.SetValue("/bufferViews/12/byteStride", 4); + importJson.SetValue("/bufferViews/13/byteStride", 4); + importJson.SetValue("/bufferViews/14/byteStride", 4); + importJson.SetValue("/bufferViews/15/byteStride", 4); + importJson.SetValue("/bufferViews/22/byteStride", 4); + importJson.SetValue("/bufferViews/29/byteStride", 4); + importJson.SetValue("/bufferViews/45/byteStride", 4); + importJson.SetValue("/bufferViews/46/byteStride", 4); + importJson.SetValue("/bufferViews/47/byteStride", 4); + importJson.SetValue("/bufferViews/201/byteStride", 4); + importJson.SetValue("/bufferViews/202/byteStride", 4); + importJson.SetValue("/bufferViews/203/byteStride", 4); + importJson.SetValue("/bufferViews/204/byteStride", 4); + importJson.SetValue("/bufferViews/211/byteStride", 4); + importJson.SetValue("/bufferViews/212/byteStride", 4); + importJson.SetValue("/bufferViews/213/byteStride", 4); + importJson.SetValue("/bufferViews/214/byteStride", 4); + importJson.SetValue("/bufferViews/215/byteStride", 4); + importJson.SetValue("/bufferViews/243/byteStride", 4); + importJson.SetValue("/bufferViews/247/byteStride", 64); + importJson.SetValue("/bufferViews/248/byteStride", 64); + importJson.SetValue("/bufferViews/249/byteStride", 64); + importJson.SetValue("/bufferViews/250/byteStride", 64); + importJson.SetValue("/bufferViews/251/byteStride", 64); + importJson.SetValue("/bufferViews/252/byteStride", 64); + importJson.SetValue("/bufferViews/253/byteStride", 64); + */ + importedJson.RemoveValue(Utf8String.From("/bufferViews/*/byteStride")); + + var vrm = VRMExporter.Export(UniGLTF.MeshExportSettings.Default, loaded.gameObject, new EditorTextureSerializer()); + + // TODO: Check contents in JSON + /*var exportJson = */ + JsonParser.Parse(vrm.ToJson()); + + // TODO: Check contents in JSON + /*var newExportedJson = */ + // JsonParser.Parse(JsonSchema.FromType().Serialize(vrm)); + + /* + foreach (var kv in importJson.Diff(exportJson)) + { + Debug.Log(kv); + } + + Assert.AreEqual(importJson, exportJson); + */ } } @@ -204,10 +196,10 @@ namespace VRM.Samples parser.ParseGlb(File.ReadAllBytes(path)); using (var context = new VRMImporterContext(parser)) + using (var loaded = context.Load()) { - context.Load(); - context.ShowMeshes(); - context.EnableUpdateWhenOffscreen(); + loaded.ShowMeshes(); + loaded.EnableUpdateWhenOffscreen(); foreach (var mesh in context.Meshes) { var src = mesh.Mesh; diff --git a/Assets/VRM.Samples/Scripts/VRMRuntimeExporter.cs b/Assets/VRM.Samples/Scripts/VRMRuntimeExporter.cs index be398c101..7159d90b7 100644 --- a/Assets/VRM.Samples/Scripts/VRMRuntimeExporter.cs +++ b/Assets/VRM.Samples/Scripts/VRMRuntimeExporter.cs @@ -59,13 +59,12 @@ namespace VRM.Samples Debug.LogFormat("meta: title:{0}", meta.Title); // ParseしたJSONをシーンオブジェクトに変換していく - await context.LoadAsync(); + var loaded = await context.LoadAsync(); - context.ShowMeshes(); - context.EnableUpdateWhenOffscreen(); - var destroyer = context.DisposeOnGameObjectDestroyed(); + loaded.ShowMeshes(); + loaded.EnableUpdateWhenOffscreen(); - OnLoaded(destroyer.gameObject); + OnLoaded(loaded.gameObject); } } diff --git a/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs b/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs index 023690a18..5058281d7 100644 --- a/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs +++ b/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs @@ -97,16 +97,17 @@ namespace VRM.Samples Debug.LogFormat("meta: title:{0}", meta.Title); // ParseしたJSONをシーンオブジェクトに変換していく + var loaded = default(UnityObjectManager); if (m_loadAsync) { - await context.LoadAsync(); + loaded = await context.LoadAsync(); } else { - context.Load(); + loaded = context.Load(); } - OnLoaded(context); + OnLoaded(loaded); } } @@ -135,15 +136,16 @@ namespace VRM.Samples parser.ParseGlb(bytes); var context = new VRMImporterContext(parser); + var loaded = default(UnityObjectManager); if (m_loadAsync) { - await context.LoadAsync(); + loaded = await context.LoadAsync(); } else { - context.Load(); + loaded = context.Load(); } - OnLoaded(context); + OnLoaded(loaded); } void LoadBVHClicked() @@ -165,15 +167,14 @@ namespace VRM.Samples #endif } - void OnLoaded(VRMImporterContext context) + void OnLoaded(UnityObjectManager loaded) { - var root = context.Root; + var root = loaded.gameObject; root.transform.SetParent(transform, false); //メッシュを表示します - context.ShowMeshes(); - context.DisposeOnGameObjectDestroyed(); + loaded.ShowMeshes(); // add motion var humanPoseTransfer = root.AddComponent(); diff --git a/Assets/VRM.Samples/Scripts/ViewerUI.cs b/Assets/VRM.Samples/Scripts/ViewerUI.cs index 81af05dc5..5a7eb185a 100644 --- a/Assets/VRM.Samples/Scripts/ViewerUI.cs +++ b/Assets/VRM.Samples/Scripts/ViewerUI.cs @@ -317,11 +317,10 @@ namespace VRM.Samples using (var context = new VRMImporterContext(parser)) { await m_texts.UpdateMetaAsync(context); - await context.LoadAsync(); - context.EnableUpdateWhenOffscreen(); - context.ShowMeshes(); - context.DisposeOnGameObjectDestroyed(); - SetModel(context.Root); + var loaded = await context.LoadAsync(); + loaded.EnableUpdateWhenOffscreen(); + loaded.ShowMeshes(); + SetModel(loaded.gameObject); } break; } @@ -333,11 +332,10 @@ namespace VRM.Samples parser.ParseGlb(file); var context = new UniGLTF.ImporterContext(parser); - context.Load(); - context.EnableUpdateWhenOffscreen(); - context.ShowMeshes(); - context.DisposeOnGameObjectDestroyed(); - SetModel(context.Root); + var loaded = context.Load(); + loaded.EnableUpdateWhenOffscreen(); + loaded.ShowMeshes(); + SetModel(loaded.gameObject); break; } @@ -348,11 +346,10 @@ namespace VRM.Samples parser.ParsePath(path); var context = new UniGLTF.ImporterContext(parser); - context.Load(); - context.EnableUpdateWhenOffscreen(); - context.ShowMeshes(); - context.DisposeOnGameObjectDestroyed(); - SetModel(context.Root); + var loaded = context.Load(); + loaded.EnableUpdateWhenOffscreen(); + loaded.ShowMeshes(); + SetModel(loaded.gameObject); break; } diff --git a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs index 61afcfa38..ee34d985c 100644 --- a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs +++ b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs @@ -140,29 +140,29 @@ namespace VRM return true; } - public void SaveAsAsset() + public void SaveAsAsset(UniGLTF.UnityObjectManager loaded) { - m_context.ShowMeshes(); + loaded.ShowMeshes(); // // save sub assets // m_paths.Clear(); m_paths.Add(m_prefabPath); - m_context.TransferOwnership(SaveAsAsset); + loaded.TransferOwnership(SaveAsAsset); // Create or update Main Asset if (m_prefabPath.IsFileExists) { Debug.LogFormat("replace prefab: {0}", m_prefabPath); var prefab = m_prefabPath.LoadAsset(); - PrefabUtility.SaveAsPrefabAssetAndConnect(m_context.Root, m_prefabPath.Value, InteractionMode.AutomatedAction); + PrefabUtility.SaveAsPrefabAssetAndConnect(loaded.gameObject, m_prefabPath.Value, InteractionMode.AutomatedAction); } else { Debug.LogFormat("create prefab: {0}", m_prefabPath); - PrefabUtility.SaveAsPrefabAssetAndConnect(m_context.Root, m_prefabPath.Value, InteractionMode.AutomatedAction); + PrefabUtility.SaveAsPrefabAssetAndConnect(loaded.gameObject, m_prefabPath.Value, InteractionMode.AutomatedAction); } foreach (var x in m_paths) diff --git a/Assets/VRM/Editor/Format/VRMImporterMenu.cs b/Assets/VRM/Editor/Format/VRMImporterMenu.cs index df531c930..83e41a089 100644 --- a/Assets/VRM/Editor/Format/VRMImporterMenu.cs +++ b/Assets/VRM/Editor/Format/VRMImporterMenu.cs @@ -50,11 +50,10 @@ namespace VRM using (var context = new VRMImporterContext(parser)) { - context.Load(); - context.EnableUpdateWhenOffscreen(); - context.ShowMeshes(); - context.DisposeOnGameObjectDestroyed(); - Selection.activeGameObject = context.Root; + var loaded = context.Load(); + loaded.EnableUpdateWhenOffscreen(); + loaded.ShowMeshes(); + Selection.activeGameObject = loaded.gameObject; } } @@ -88,8 +87,8 @@ namespace VRM { VRMShaders.TextureImporterConfigurator.Configure(textureInfo, context.TextureFactory.ExternalTextures); } - context.Load(); - editor.SaveAsAsset(); + var loaded = context.Load(); + editor.SaveAsAsset(loaded); } }; diff --git a/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs b/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs index 415b616ba..10c83d539 100644 --- a/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs +++ b/Assets/VRM/Editor/Format/vrmAssetPostprocessor.cs @@ -63,8 +63,8 @@ namespace VRM { VRMShaders.TextureImporterConfigurator.Configure(textureInfo, context.TextureFactory.ExternalTextures); } - context.Load(); - editor.SaveAsAsset(); + var loaded = context.Load(); + editor.SaveAsAsset(loaded); } }; diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index 2904917fb..ab777d86f 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -356,28 +356,26 @@ namespace VRM public override void Dispose() { - Action destroy = UnityObjectManager.DestroyResource(); - // VRM specific if (HumanoidAvatar != null) { - destroy(HumanoidAvatar); + UnityObjectDestoyer.DestroyRuntimeOrEditor(HumanoidAvatar); } if (Meta != null) { - destroy(Meta); + UnityObjectDestoyer.DestroyRuntimeOrEditor(Meta); } if (AvatarDescription != null) { - destroy(AvatarDescription); + UnityObjectDestoyer.DestroyRuntimeOrEditor(AvatarDescription); } if (BlendShapeAvatar != null) { foreach (var clip in BlendShapeAvatar.Clips) { - destroy(clip); + UnityObjectDestoyer.DestroyRuntimeOrEditor(clip); } - destroy(BlendShapeAvatar); + UnityObjectDestoyer.DestroyRuntimeOrEditor(BlendShapeAvatar); } base.Dispose(); diff --git a/Assets/VRM/Tests/VRMLoadTests.cs b/Assets/VRM/Tests/VRMLoadTests.cs index 509001680..db4e7ee65 100644 --- a/Assets/VRM/Tests/VRMLoadTests.cs +++ b/Assets/VRM/Tests/VRMLoadTests.cs @@ -74,8 +74,7 @@ namespace VRM { using (var importer = new VRMImporterContext(parser)) { - importer.Load(); - return importer.DisposeOnGameObjectDestroyed().gameObject; + return importer.Load().gameObject; } } catch (Exception ex) diff --git a/Assets/VRM/Tests/VRMLookAtTests.cs b/Assets/VRM/Tests/VRMLookAtTests.cs index 702d1bf1d..8e071635c 100644 --- a/Assets/VRM/Tests/VRMLookAtTests.cs +++ b/Assets/VRM/Tests/VRMLookAtTests.cs @@ -24,11 +24,11 @@ namespace VRM parser.ParsePath(AliciaPath); byte[] bytes = default; using (var loader = new VRMImporterContext(parser)) + using (var loaded = loader.Load()) { - loader.Load(); - loader.ShowMeshes(); + loaded.ShowMeshes(); - var go = loader.Root; + var go = loaded.gameObject; var fp = go.GetComponent(); GameObject.DestroyImmediate(go.GetComponent()); var lookAt = go.AddComponent(); @@ -54,11 +54,11 @@ namespace VRM byte[] bytes = default; CurveMapper horizontalInner = default; using (var loader = new VRMImporterContext(parser)) + using (var loaded = loader.Load()) { - loader.Load(); - loader.ShowMeshes(); + loaded.ShowMeshes(); - var go = loader.Root; + var go = loaded.gameObject; var fp = go.GetComponent(); var lookAt = go.GetComponent(); horizontalInner = lookAt.HorizontalInner; @@ -71,11 +71,11 @@ namespace VRM var parser2 = new GltfParser(); parser2.Parse(AliciaPath, bytes); using (var loader = new VRMImporterContext(parser2)) + using (var loaded = loader.Load()) { - loader.Load(); - loader.ShowMeshes(); + loaded.ShowMeshes(); - var lookAt = loader.Root.GetComponent(); + var lookAt = loaded.GetComponent(); Assert.AreEqual(horizontalInner.CurveXRangeDegree, lookAt.HorizontalInner.CurveXRangeDegree); Assert.AreEqual(horizontalInner.CurveYRangeDegree, lookAt.HorizontalInner.CurveYRangeDegree); } @@ -89,11 +89,11 @@ namespace VRM byte[] bytes = default; CurveMapper horizontalInner = default; using (var loader = new VRMImporterContext(parser)) + using (var loaded = loader.Load()) { - loader.Load(); - loader.ShowMeshes(); + loaded.ShowMeshes(); - var go = loader.Root; + var go = loaded.gameObject; var fp = go.GetComponent(); var lookAt = go.GetComponent(); horizontalInner = lookAt.HorizontalInner; @@ -106,11 +106,11 @@ namespace VRM var parser2 = new GltfParser(); parser2.Parse(AliciaPath, bytes); using (var loader = new VRMImporterContext(parser2)) + using (var loaded = loader.Load()) { - loader.Load(); - loader.ShowMeshes(); + loaded.ShowMeshes(); - var lookAt = loader.Root.GetComponent(); + var lookAt = loaded.GetComponent(); Assert.AreEqual(horizontalInner.CurveXRangeDegree, lookAt.HorizontalInner.CurveXRangeDegree); Assert.AreEqual(horizontalInner.CurveYRangeDegree, lookAt.HorizontalInner.CurveYRangeDegree); } diff --git a/Assets/VRM/Tests/VrmDividedMeshTests.cs b/Assets/VRM/Tests/VrmDividedMeshTests.cs index f1bdc46af..ccb2babf2 100644 --- a/Assets/VRM/Tests/VrmDividedMeshTests.cs +++ b/Assets/VRM/Tests/VrmDividedMeshTests.cs @@ -26,9 +26,9 @@ namespace VRM using (var loader = new VRMImporterContext(parser)) { - loader.Load(); - loader.ShowMeshes(); - return loader.DisposeOnGameObjectDestroyed().gameObject; + var loaded = loader.Load(); + loaded.ShowMeshes(); + return loaded.gameObject; } } diff --git a/Assets/VRM10.Samples/Runtime/ViewerUI.cs b/Assets/VRM10.Samples/Runtime/ViewerUI.cs index 35b441433..d64d08f00 100644 --- a/Assets/VRM10.Samples/Runtime/ViewerUI.cs +++ b/Assets/VRM10.Samples/Runtime/ViewerUI.cs @@ -308,18 +308,17 @@ namespace UniVRM10.Samples { case ".vrm": { - if(!Vrm10Parser.TryParseOrMigrate(path, doMigrate: true, out Vrm10Parser.Result result, out string error)) + if (!Vrm10Parser.TryParseOrMigrate(path, doMigrate: true, out Vrm10Parser.Result result, out string error)) { Debug.LogError(error); return; } using (var loader = new Vrm10Importer(result.Parser, result.Vrm)) { - loader.Load(); - loader.ShowMeshes(); - loader.EnableUpdateWhenOffscreen(); - var destroyer = loader.DisposeOnGameObjectDestroyed(); - SetModel(destroyer.gameObject); + var loaded = loader.Load(); + loaded.ShowMeshes(); + loaded.EnableUpdateWhenOffscreen(); + SetModel(loaded.gameObject); } break; } @@ -332,12 +331,10 @@ namespace UniVRM10.Samples using (var loader = new UniGLTF.ImporterContext(parser)) { - loader.Load(); - loader.ShowMeshes(); - loader.EnableUpdateWhenOffscreen(); - loader.ShowMeshes(); - var destroyer = loader.DisposeOnGameObjectDestroyed(); - SetModel(destroyer.gameObject); + var loaded = loader.Load(); + loaded.ShowMeshes(); + loaded.EnableUpdateWhenOffscreen(); + SetModel(loaded.gameObject); } break; } @@ -350,12 +347,10 @@ namespace UniVRM10.Samples using (var loader = new UniGLTF.ImporterContext(parser)) { - loader.Load(); - loader.ShowMeshes(); - loader.EnableUpdateWhenOffscreen(); - loader.ShowMeshes(); - var destroyer = loader.DisposeOnGameObjectDestroyed(); - SetModel(destroyer.gameObject); + var loaded = loader.Load(); + loaded.ShowMeshes(); + loaded.EnableUpdateWhenOffscreen(); + SetModel(loaded.gameObject); } break; } diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index d5a7ef111..44ca900c2 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -42,20 +42,17 @@ namespace UniVRM10 VRMShaders.TextureImporterConfigurator.Configure(textureInfo, loader.TextureFactory.ExternalTextures); } - loader.Load(); - loader.ShowMeshes(); + var loaded = loader.Load(); + loaded.ShowMeshes(); loader.TransferOwnership((key, o) => { context.AddObjectToAsset(key.Name, o); - if (o is GameObject) - { - // Root GameObject is main object - context.SetMainObject(loader.Root); - } - return true; }); + + context.AddObjectToAsset(loaded.name, loaded.gameObject); + context.SetMainObject(loaded.gameObject); } } } diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index d48f07ddd..4eeb035cd 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -649,21 +649,19 @@ namespace UniVRM10 public override void Dispose() { - Action destroy = UnityResourceDestroyer.DestroyResource(); - // VRM specific if (m_humanoid != null) { - destroy(m_humanoid); + UnityObjectDestoyer.DestroyRuntimeOrEditor(m_humanoid); } if (m_meta != null) { - destroy(m_meta); + UnityObjectDestoyer.DestroyRuntimeOrEditor(m_meta); } foreach (var clip in m_expressions) { - destroy(clip); + UnityObjectDestoyer.DestroyRuntimeOrEditor(clip); } base.Dispose(); diff --git a/Assets/VRM10/Runtime/Scenes/Sample.cs b/Assets/VRM10/Runtime/Scenes/Sample.cs index 211d1ce36..eba4892f9 100644 --- a/Assets/VRM10/Runtime/Scenes/Sample.cs +++ b/Assets/VRM10/Runtime/Scenes/Sample.cs @@ -22,9 +22,9 @@ namespace UniVRM10.Sample using (var loader = new Vrm10Importer(result.Parser, result.Vrm)) { - loader.Load(); - loader.ShowMeshes(); - return loader.DisposeOnGameObjectDestroyed().gameObject; + var loaded = loader.Load(); + loaded.ShowMeshes(); + return loaded.gameObject; } } diff --git a/Assets/VRM10/Tests.PlayMode/MaterialTests.cs b/Assets/VRM10/Tests.PlayMode/MaterialTests.cs index 55a099959..92017283d 100644 --- a/Assets/VRM10/Tests.PlayMode/MaterialTests.cs +++ b/Assets/VRM10/Tests.PlayMode/MaterialTests.cs @@ -31,7 +31,7 @@ namespace UniVRM10.Test private (GameObject, IReadOnlyList) ToUnity(byte[] bytes) { // Vrm => Model - if(!Vrm10Parser.TryParseOrMigrate("tpm.vrm", bytes, true, out Vrm10Parser.Result result, out string error)) + if (!Vrm10Parser.TryParseOrMigrate("tpm.vrm", bytes, true, out Vrm10Parser.Result result, out string error)) { throw new Exception(); } @@ -44,9 +44,8 @@ namespace UniVRM10.Test // Model => Unity using (var loader = new Vrm10Importer(parser, vrm)) { - loader.Load(); - loader.DisposeOnGameObjectDestroyed(); - return (loader.Root, loader.MaterialFactory.Materials); + var loaded = loader.Load(); + return (loaded.gameObject, loader.MaterialFactory.Materials); } } diff --git a/Assets/VRM10/Tests/ApiSampleTests.cs b/Assets/VRM10/Tests/ApiSampleTests.cs index e4d1c722a..79daf7e3d 100644 --- a/Assets/VRM10/Tests/ApiSampleTests.cs +++ b/Assets/VRM10/Tests/ApiSampleTests.cs @@ -24,13 +24,13 @@ namespace UniVRM10.Test { using (var loader = new Vrm10Importer(parser, vrm)) { - loader.Load(); + var loaded = loader.Load(); if (showMesh) { - loader.ShowMeshes(); + loaded.ShowMeshes(); } - loader.EnableUpdateWhenOffscreen(); - return loader.DisposeOnGameObjectDestroyed().gameObject; + loaded.EnableUpdateWhenOffscreen(); + return loaded.gameObject; } } diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs index 41c5f264c..67d3fb63a 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using UnityEngine; @@ -66,7 +65,7 @@ namespace VRMShaders #if VRM_DEVELOP // Debug.Log($"Destroy {x.Asset}"); #endif - UnityEngine.Object.DestroyImmediate(x.Asset, false); + UnityObjectDestoyer.DestroyRuntimeOrEditor(x.Asset); } } } diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs index 2f7458e07..7f9834f4f 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs @@ -33,7 +33,7 @@ namespace VRMShaders { foreach (var kv in _temporaryTextures) { - DestroyResource(kv.Value); + UnityObjectDestoyer.DestroyRuntimeOrEditor(kv.Value); } _temporaryTextures.Clear(); _textureCache.Clear(); @@ -81,80 +81,68 @@ namespace VRMShaders switch (texDesc.TextureType) { case TextureImportTypes.NormalMap: - { - // no conversion. Unity's normal map is same with glTF's. - // - // > contrary to Unity’s usual convention of using Y as “up” - // https://docs.unity3d.com/2018.4/Documentation/Manual/StandardShaderMaterialParameterNormalMap.html - var data0 = await texDesc.Index0(); - var rawTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); - rawTexture.name = subAssetKey.Name; - rawTexture.SetSampler(texDesc.Sampler); - _textureCache.Add(subAssetKey, rawTexture); - return rawTexture; - } + { + // no conversion. Unity's normal map is same with glTF's. + // + // > contrary to Unity’s usual convention of using Y as “up” + // https://docs.unity3d.com/2018.4/Documentation/Manual/StandardShaderMaterialParameterNormalMap.html + var data0 = await texDesc.Index0(); + var rawTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); + rawTexture.name = subAssetKey.Name; + rawTexture.SetSampler(texDesc.Sampler); + _textureCache.Add(subAssetKey, rawTexture); + return rawTexture; + } case TextureImportTypes.StandardMap: - { - Texture2D metallicRoughnessTexture = default; - Texture2D occlusionTexture = default; - - if (texDesc.Index0 != null) { - var data0 = await texDesc.Index0(); - metallicRoughnessTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); - } - if (texDesc.Index1 != null) - { - var data1 = await texDesc.Index1(); - occlusionTexture = await _textureDeserializer.LoadTextureAsync(data1, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); - } + Texture2D metallicRoughnessTexture = default; + Texture2D occlusionTexture = default; - var combinedTexture = OcclusionMetallicRoughnessConverter.Import(metallicRoughnessTexture, - texDesc.MetallicFactor, texDesc.RoughnessFactor, occlusionTexture); - combinedTexture.name = subAssetKey.Name; - combinedTexture.SetSampler(texDesc.Sampler); - _textureCache.Add(subAssetKey, combinedTexture); - DestroyResource(metallicRoughnessTexture); - DestroyResource(occlusionTexture); - return combinedTexture; - } + if (texDesc.Index0 != null) + { + var data0 = await texDesc.Index0(); + metallicRoughnessTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); + } + if (texDesc.Index1 != null) + { + var data1 = await texDesc.Index1(); + occlusionTexture = await _textureDeserializer.LoadTextureAsync(data1, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); + } + + var combinedTexture = OcclusionMetallicRoughnessConverter.Import(metallicRoughnessTexture, + texDesc.MetallicFactor, texDesc.RoughnessFactor, occlusionTexture); + combinedTexture.name = subAssetKey.Name; + combinedTexture.SetSampler(texDesc.Sampler); + _textureCache.Add(subAssetKey, combinedTexture); + UnityObjectDestoyer.DestroyRuntimeOrEditor(metallicRoughnessTexture); + UnityObjectDestoyer.DestroyRuntimeOrEditor(occlusionTexture); + return combinedTexture; + } case TextureImportTypes.sRGB: - { - var data0 = await texDesc.Index0(); - var rawTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.sRGB); - rawTexture.name = subAssetKey.Name; - rawTexture.SetSampler(texDesc.Sampler); - _textureCache.Add(subAssetKey, rawTexture); - return rawTexture; - } + { + var data0 = await texDesc.Index0(); + var rawTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.sRGB); + rawTexture.name = subAssetKey.Name; + rawTexture.SetSampler(texDesc.Sampler); + _textureCache.Add(subAssetKey, rawTexture); + return rawTexture; + } case TextureImportTypes.Linear: - { - var data0 = await texDesc.Index0(); - var rawTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); - rawTexture.name = subAssetKey.Name; - rawTexture.SetSampler(texDesc.Sampler); - _textureCache.Add(subAssetKey, rawTexture); - return rawTexture; - } + { + var data0 = await texDesc.Index0(); + var rawTexture = await _textureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear); + rawTexture.name = subAssetKey.Name; + rawTexture.SetSampler(texDesc.Sampler); + _textureCache.Add(subAssetKey, rawTexture); + return rawTexture; + } default: throw new ArgumentOutOfRangeException(); } throw new NotImplementedException(); } - - private static void DestroyResource(UnityEngine.Object o) - { - if (Application.isPlaying) - { - UnityEngine.Object.Destroy(o); - } - else - { - UnityEngine.Object.DestroyImmediate(o); - } - } } } diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs b/Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs new file mode 100644 index 000000000..d35cffc54 --- /dev/null +++ b/Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace VRMShaders +{ + public static class UnityObjectDestoyer + { + public static void DestroyRuntimeOrEditor(UnityEngine.Object o) + { + if (Application.isPlaying) + { + UnityEngine.Object.Destroy(o); + } + else + { + UnityEngine.Object.DestroyImmediate(o); + } + } + } +} diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs.meta b/Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs.meta new file mode 100644 index 000000000..e4fc70f72 --- /dev/null +++ b/Assets/VRMShaders/GLTF/IO/Runtime/UnityObjectDestroyer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0b4d1043455aa2c489e9ad8250a80fc4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From e9d4654678be917473e13d57e8efaebe766e1948 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 19:53:48 +0900 Subject: [PATCH 05/12] =?UTF-8?q?UnityObjectManager=20=E3=81=8B=E3=82=89?= =?UTF-8?q?=20ScriptedImporter=20=E3=81=AB=E7=A7=BB=E8=AD=B2=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs | 2 +- Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs | 3 +-- Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs | 11 +++++++---- .../ScriptedImporter/VrmScriptedImporterImpl.cs | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs index f2315725c..53279b8e8 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs @@ -51,7 +51,7 @@ namespace UniGLTF var loaded = loader.Load(); loaded.ShowMeshes(); - loader.TransferOwnership((k, o) => + loaded.TransferOwnership((k, o) => { context.AddObjectToAsset(k.Name, o); return true; diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index cd37a0f86..3615735b8 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -313,8 +313,7 @@ namespace UniGLTF { foreach (var mesh in Meshes.ToArray()) { - // mesh の extract は実装していないので SubAssetKey を使わない - if (take(default, mesh.Mesh)) + if (take(SubAssetKey.Create(mesh.Mesh), mesh.Mesh)) { Meshes.Remove(mesh); } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs index 183097841..488fb0aa9 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs @@ -47,16 +47,19 @@ namespace UniGLTF public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { - throw new NotImplementedException(); + foreach (var (key, x) in m_resources.ToArray()) + { + if (take(key, x)) + { + m_resources.Remove((key, x)); + } + } } public void Dispose() { foreach (var (key, x) in m_resources) { -#if VRM_DEVELOP - // Debug.Log($"Destroy: {x}"); -#endif UnityObjectDestoyer.DestroyRuntimeOrEditor(x); } } diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index 44ca900c2..7eedc650c 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -45,7 +45,7 @@ namespace UniVRM10 var loaded = loader.Load(); loaded.ShowMeshes(); - loader.TransferOwnership((key, o) => + loaded.TransferOwnership((key, o) => { context.AddObjectToAsset(key.Name, o); return true; From 0bdd18c40816d0791f93b56c1ee70cd61ddb963a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 19:57:12 +0900 Subject: [PATCH 06/12] fix humanoid SubAssetKey --- Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 4eeb035cd..4b09f02fc 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -621,7 +621,7 @@ namespace UniVRM10 public override void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { // VRM 固有のリソース(ScriptableObject) - if (take(default, m_humanoid)) + if (take(SubAssetKey.Create(m_humanoid), m_humanoid)) { m_humanoid = null; } From 612a59cba71e5585bb79e7189274318d63a79b8d Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 20:07:04 +0900 Subject: [PATCH 07/12] =?UTF-8?q?TakeResponsibilityForDestroyObjectFunc=20?= =?UTF-8?q?=E3=81=AE=E8=BF=94=E3=82=8A=E5=80=A4=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GameObject(prefab root)の移譲の判定にしか使っていなかった。設計変更で不要になった --- .../ScriptedImporter/ScriptedImporterImpl.cs | 1 - .../Runtime/UniGLTF/IO/ImporterContext.cs | 12 +++----- .../Runtime/UniGLTF/UnityObjectManager.cs | 7 ++--- .../Editor/Format/VRMEditorImporterContext.cs | 30 ++++++------------- Assets/VRM/Runtime/IO/VRMImporterContext.cs | 26 ++++++---------- .../VrmScriptedImporterImpl.cs | 1 - Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 18 ++++------- .../IResponsibilityForDestroyObjects.cs | 2 +- .../GLTF/IO/Runtime/MaterialFactory.cs | 13 ++------ .../GLTF/IO/Runtime/TextureFactory.cs | 14 ++------- 10 files changed, 37 insertions(+), 87 deletions(-) diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs index 53279b8e8..1bde54543 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs @@ -54,7 +54,6 @@ namespace UniGLTF loaded.TransferOwnership((k, o) => { context.AddObjectToAsset(k.Name, o); - return true; }); context.AddObjectToAsset(loaded.name, loaded.gameObject); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 3615735b8..9a3666f1c 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -313,10 +313,8 @@ namespace UniGLTF { foreach (var mesh in Meshes.ToArray()) { - if (take(SubAssetKey.Create(mesh.Mesh), mesh.Mesh)) - { - Meshes.Remove(mesh); - } + take(SubAssetKey.Create(mesh.Mesh), mesh.Mesh); + Meshes.Remove(mesh); } TextureFactory.TransferOwnership(take); @@ -324,10 +322,8 @@ namespace UniGLTF foreach (var (key, animation) in AnimationClips.ToArray()) { - if (take(key, animation)) - { - AnimationClips.Remove((key, animation)); - } + take(key, animation); + AnimationClips.Remove((key, animation)); } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs index 488fb0aa9..beeb548cc 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs @@ -18,7 +18,6 @@ namespace UniGLTF context.TransferOwnership((k, o) => { loaded.m_resources.Add((k, o)); - return true; }); return loaded; } @@ -49,10 +48,8 @@ namespace UniGLTF { foreach (var (key, x) in m_resources.ToArray()) { - if (take(key, x)) - { - m_resources.Remove((key, x)); - } + take(key, x); + m_resources.Remove((key, x)); } } diff --git a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs index ee34d985c..8445c19f7 100644 --- a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs +++ b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs @@ -108,36 +108,25 @@ namespace VRM TextureExtractor.ExtractTextures(m_context.Parser, m_prefabPath.Parent.Child(dirName), m_context.TextureDescriptorGenerator, subAssets, (_x, _y) => { }, onTextureReloaded); } - bool SaveAsAsset(SubAssetKey _, UnityEngine.Object o) + void SaveAsAsset(SubAssetKey _, UnityEngine.Object o) { - if (o is GameObject) - { - return false; - } - if (!string.IsNullOrEmpty(AssetDatabase.GetAssetPath(o))) { - // already exists. not dispose #if VRM_DEVELOP - Debug.Log($"Loaded. skip: {o}"); + // 来ない? + Debug.LogWarning($"{o} already exists. skip write"); #endif - return true; + return; } var assetPath = GetAssetPath(m_prefabPath, o); - if (assetPath.IsNull) + if (!assetPath.IsNull) { - // not dispose - return true; + // アセットとして書き込む + assetPath.Parent.EnsureFolder(); + assetPath.CreateAsset(o); + m_paths.Add(assetPath); } - - // アセットとして書き込む - assetPath.Parent.EnsureFolder(); - assetPath.CreateAsset(o); - m_paths.Add(assetPath); - - // 所有権が移動 - return true; } public void SaveAsAsset(UniGLTF.UnityObjectManager loaded) @@ -157,7 +146,6 @@ namespace VRM Debug.LogFormat("replace prefab: {0}", m_prefabPath); var prefab = m_prefabPath.LoadAsset(); PrefabUtility.SaveAsPrefabAssetAndConnect(loaded.gameObject, m_prefabPath.Value, InteractionMode.AutomatedAction); - } else { diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index ab777d86f..eebf178e4 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -322,33 +322,25 @@ namespace VRM // VRM-0 は SubAssetKey を使っていないので default で済ます // VRM 固有のリソース(ScriptableObject) - if (take(default, HumanoidAvatar)) - { - HumanoidAvatar = null; - } + take(default, HumanoidAvatar); + HumanoidAvatar = null; - if (take(default, Meta)) - { - Meta = null; - } + take(default, Meta); + Meta = null; - if (take(default, AvatarDescription)) - { - AvatarDescription = null; - } + take(default, AvatarDescription); + AvatarDescription = null; foreach (var x in BlendShapeAvatar.Clips) { - if (take(default, x)) + take(default, x); { // do nothing } } - if (take(default, BlendShapeAvatar)) - { - BlendShapeAvatar = null; - } + take(default, BlendShapeAvatar); + BlendShapeAvatar = null; // GLTF のリソース base.TransferOwnership(take); diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index 7eedc650c..65f4a94fc 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -48,7 +48,6 @@ namespace UniVRM10 loaded.TransferOwnership((key, o) => { context.AddObjectToAsset(key.Name, o); - return true; }); context.AddObjectToAsset(loaded.name, loaded.gameObject); diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 4b09f02fc..058a866f1 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -621,25 +621,19 @@ namespace UniVRM10 public override void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { // VRM 固有のリソース(ScriptableObject) - if (take(SubAssetKey.Create(m_humanoid), m_humanoid)) - { - m_humanoid = null; - } + take(SubAssetKey.Create(m_humanoid), m_humanoid); + m_humanoid = null; if (m_meta != null) { - if (take(VRM10MetaObject.SubAssetKey, m_meta)) - { - m_meta = null; - } + take(VRM10MetaObject.SubAssetKey, m_meta); + m_meta = null; } foreach (var x in m_expressions) { - if (take(ExpressionKey.CreateFromClip(x).SubAssetKey, x)) - { - // do nothing - } + take(ExpressionKey.CreateFromClip(x).SubAssetKey, x); + // do nothing } m_expressions.Clear(); diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs index 2936837f8..05ae257b3 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/IResponsibilityForDestroyObjects.cs @@ -2,7 +2,7 @@ using System; namespace VRMShaders { - public delegate bool TakeResponsibilityForDestroyObjectFunc(SubAssetKey key, UnityEngine.Object obj); + public delegate void TakeResponsibilityForDestroyObjectFunc(SubAssetKey key, UnityEngine.Object obj); /// /// UnityObjectを破棄する責務。 diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs index 67d3fb63a..eb1ceb870 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/MaterialFactory.cs @@ -82,22 +82,15 @@ namespace VRMShaders /// public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { - var list = new List(); - foreach (var x in m_materials) + foreach (var x in m_materials.ToArray()) { if (!x.UseExternal) { // 外部の '.asset' からロードしていない - if (take(x.Key, x.Asset)) - { - list.Add(x.Asset); - } + take(x.Key, x.Asset); + m_materials.Remove(x); } } - foreach (var x in list) - { - Remove(x); - } } public Material GetMaterial(int index) diff --git a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs index 7f9834f4f..e2f8ee6f2 100644 --- a/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs +++ b/Assets/VRMShaders/GLTF/IO/Runtime/TextureFactory.cs @@ -45,18 +45,10 @@ namespace VRMShaders /// public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { - var transferredAssets = new HashSet(); - foreach (var (k, v) in _textureCache) + foreach (var (k, v) in _textureCache.ToArray()) { - if (take(k, v)) - { - transferredAssets.Add(k); - } - } - - foreach (var key in transferredAssets) - { - _textureCache.Remove(key); + take(k, v); + _textureCache.Remove(k); } } From 81e02c8a76bfe42a7e379d5f55e690c437eb135c Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 10 Jun 2021 20:22:00 +0900 Subject: [PATCH 08/12] =?UTF-8?q?Dispose=20=E3=81=A7=20Destory(this)=20?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs index beeb548cc..aa58fe242 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs @@ -41,7 +41,10 @@ namespace UniGLTF void OnDestroy() { Debug.Log("UnityResourceDestroyer.OnDestroy"); - Dispose(); + foreach (var (key, x) in m_resources) + { + UnityObjectDestoyer.DestroyRuntimeOrEditor(x); + } } public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) @@ -55,10 +58,7 @@ namespace UniGLTF public void Dispose() { - foreach (var (key, x) in m_resources) - { - UnityObjectDestoyer.DestroyRuntimeOrEditor(x); - } + UnityObjectDestoyer.DestroyRuntimeOrEditor(this); } } } From ac7e4cd217b211b3a4ed7be0757773f347f7c897 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 11 Jun 2021 17:02:03 +0900 Subject: [PATCH 09/12] Dispose gameobject --- Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs index aa58fe242..cc7607cf7 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs @@ -58,7 +58,7 @@ namespace UniGLTF public void Dispose() { - UnityObjectDestoyer.DestroyRuntimeOrEditor(this); + UnityObjectDestoyer.DestroyRuntimeOrEditor(this.gameObject); } } } From 4db17114106c92afae6fb72385256b78ed4f2691 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 11 Jun 2021 17:03:23 +0900 Subject: [PATCH 10/12] Root --- Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs index cc7607cf7..40e6d6dda 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs @@ -10,6 +10,11 @@ namespace UniGLTF /// public class UnityObjectManager : MonoBehaviour, IResponsibilityForDestroyObjects { + /// + /// this is UniGLTF root gameObject + /// + public GameObject Root => this.gameObject; + List<(SubAssetKey, UnityEngine.Object)> m_resources = new List<(SubAssetKey, UnityEngine.Object)>(); public static UnityObjectManager AttachTo(GameObject go, ImporterContext context) From 423889cb05d12f7c3464491fe286e88a7743cbb5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 11 Jun 2021 17:12:13 +0900 Subject: [PATCH 11/12] UnityObjectManager is not unnecessary for prefab --- .../Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs | 6 ++++-- Assets/VRM/Editor/Format/VRMEditorImporterContext.cs | 6 ++++-- .../Editor/ScriptedImporter/VrmScriptedImporterImpl.cs | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs index 1bde54543..335dd3ef0 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/ScriptedImporterImpl.cs @@ -55,9 +55,11 @@ namespace UniGLTF { context.AddObjectToAsset(k.Name, o); }); + var root = loaded.Root; + GameObject.DestroyImmediate(loaded); - context.AddObjectToAsset(loaded.name, loaded.gameObject); - context.SetMainObject(loaded.gameObject); + context.AddObjectToAsset(root.name, root); + context.SetMainObject(root); } } } diff --git a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs index 8445c19f7..5ee95bc43 100644 --- a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs +++ b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs @@ -139,18 +139,20 @@ namespace VRM m_paths.Clear(); m_paths.Add(m_prefabPath); loaded.TransferOwnership(SaveAsAsset); + var root = loaded.Root; + GameObject.DestroyImmediate(loaded); // Create or update Main Asset if (m_prefabPath.IsFileExists) { Debug.LogFormat("replace prefab: {0}", m_prefabPath); var prefab = m_prefabPath.LoadAsset(); - PrefabUtility.SaveAsPrefabAssetAndConnect(loaded.gameObject, m_prefabPath.Value, InteractionMode.AutomatedAction); + PrefabUtility.SaveAsPrefabAssetAndConnect(root, m_prefabPath.Value, InteractionMode.AutomatedAction); } else { Debug.LogFormat("create prefab: {0}", m_prefabPath); - PrefabUtility.SaveAsPrefabAssetAndConnect(loaded.gameObject, m_prefabPath.Value, InteractionMode.AutomatedAction); + PrefabUtility.SaveAsPrefabAssetAndConnect(root, m_prefabPath.Value, InteractionMode.AutomatedAction); } foreach (var x in m_paths) diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs index 65f4a94fc..334a1df38 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterImpl.cs @@ -49,9 +49,11 @@ namespace UniVRM10 { context.AddObjectToAsset(key.Name, o); }); + var root = loaded.Root; + GameObject.DestroyImmediate(loaded); - context.AddObjectToAsset(loaded.name, loaded.gameObject); - context.SetMainObject(loaded.gameObject); + context.AddObjectToAsset(root.name, root); + context.SetMainObject(root); } } } From 89276c2783faf4e4d99073ecdcf4ce9fd84c966f Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 11 Jun 2021 17:16:47 +0900 Subject: [PATCH 12/12] rename RuntimeGltfInstance --- .../UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs | 4 ++-- .../Runtime/UniGLTF/IO/ImporterContextExtensions.cs | 2 +- ...UnityObjectManager.cs => RuntimeGltfInstance.cs} | 13 +++++++------ ...tManager.cs.meta => RuntimeGltfInstance.cs.meta} | 2 +- Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs | 6 +++--- .../VRM/Editor/Format/VRMEditorImporterContext.cs | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) rename Assets/UniGLTF/Runtime/UniGLTF/{UnityObjectManager.cs => RuntimeGltfInstance.cs} (75%) rename Assets/UniGLTF/Runtime/UniGLTF/{UnityObjectManager.cs.meta => RuntimeGltfInstance.cs.meta} (83%) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 9a3666f1c..9b72a9603 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -61,7 +61,7 @@ namespace UniGLTF }; #region Load. Build unity objects - public virtual async Task LoadAsync(IAwaitCaller awaitCaller = null, Func MeasureTime = null) + public virtual async Task LoadAsync(IAwaitCaller awaitCaller = null, Func MeasureTime = null) { if (awaitCaller == null) { @@ -109,7 +109,7 @@ namespace UniGLTF await OnLoadHierarchy(awaitCaller, MeasureTime); - return UnityObjectManager.AttachTo(Root, this); + return RuntimeGltfInstance.AttachTo(Root, this); } /// diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs index 8b3bbe165..180a91d84 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContextExtensions.cs @@ -8,7 +8,7 @@ namespace UniGLTF /// /// Build unity objects from parsed gltf /// - public static UnityObjectManager Load(this ImporterContext self) + public static RuntimeGltfInstance Load(this ImporterContext self) { var meassureTime = new ImporterContextSpeedLog(); var task = self.LoadAsync(default(ImmediateCaller), meassureTime.MeasureTime); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs similarity index 75% rename from Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs rename to Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs index 40e6d6dda..283b3f90a 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs @@ -1,14 +1,15 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; using VRMShaders; namespace UniGLTF { /// - /// Mesh, Material, Texture などを抱えておいて確実に破棄できるようにする + /// ImporterContext の Load 結果の GltfModel + /// + /// Runtime でモデルを Destory したときに関連リソース(Texture, Material...などの UnityEngine.Object)を自動的に Destroy する。 /// - public class UnityObjectManager : MonoBehaviour, IResponsibilityForDestroyObjects + public class RuntimeGltfInstance : MonoBehaviour, IResponsibilityForDestroyObjects { /// /// this is UniGLTF root gameObject @@ -17,9 +18,9 @@ namespace UniGLTF List<(SubAssetKey, UnityEngine.Object)> m_resources = new List<(SubAssetKey, UnityEngine.Object)>(); - public static UnityObjectManager AttachTo(GameObject go, ImporterContext context) + public static RuntimeGltfInstance AttachTo(GameObject go, ImporterContext context) { - var loaded = go.AddComponent(); + var loaded = go.AddComponent(); context.TransferOwnership((k, o) => { loaded.m_resources.Add((k, o)); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs.meta similarity index 83% rename from Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs.meta rename to Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs.meta index 13de66798..af47451a0 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UnityObjectManager.cs.meta +++ b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a396b6305c6ed494bad94f21d359e774 +guid: 423fb0cccbe420047ac28163cce68db4 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs b/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs index 5058281d7..bb5ad6e96 100644 --- a/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs +++ b/Assets/VRM.Samples/Scripts/VRMRuntimeLoader.cs @@ -97,7 +97,7 @@ namespace VRM.Samples Debug.LogFormat("meta: title:{0}", meta.Title); // ParseしたJSONをシーンオブジェクトに変換していく - var loaded = default(UnityObjectManager); + var loaded = default(RuntimeGltfInstance); if (m_loadAsync) { loaded = await context.LoadAsync(); @@ -136,7 +136,7 @@ namespace VRM.Samples parser.ParseGlb(bytes); var context = new VRMImporterContext(parser); - var loaded = default(UnityObjectManager); + var loaded = default(RuntimeGltfInstance); if (m_loadAsync) { loaded = await context.LoadAsync(); @@ -167,7 +167,7 @@ namespace VRM.Samples #endif } - void OnLoaded(UnityObjectManager loaded) + void OnLoaded(RuntimeGltfInstance loaded) { var root = loaded.gameObject; diff --git a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs index 5ee95bc43..552bff92d 100644 --- a/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs +++ b/Assets/VRM/Editor/Format/VRMEditorImporterContext.cs @@ -129,7 +129,7 @@ namespace VRM } } - public void SaveAsAsset(UniGLTF.UnityObjectManager loaded) + public void SaveAsAsset(UniGLTF.RuntimeGltfInstance loaded) { loaded.ShowMeshes();