From 64d6a6bde48e8622f77e93fb2bd5d595569d23b5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 13:35:24 +0900 Subject: [PATCH 01/12] add test --- .../UniGLTF/Tests/UniGLTF/NativeArrayTests.cs | 26 +++++++++++++++++++ .../Tests/UniGLTF/NativeArrayTests.cs.meta | 11 ++++++++ 2 files changed, 37 insertions(+) create mode 100644 Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs create mode 100644 Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs.meta diff --git a/Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs b/Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs new file mode 100644 index 000000000..f6b0e1933 --- /dev/null +++ b/Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs @@ -0,0 +1,26 @@ +using System; +using NUnit.Framework; +using Unity.Collections; + +namespace UniGLTF +{ + public class NativeArrayTests + { + [Test] + public void DisposeTest() + { + var array = new NativeArray(64, Allocator.Persistent); + var sub = array.GetSubArray(10, 4); + Assert.Throws(() => { sub.Dispose(); }); + var cast = array.Reinterpret(1); + + // Dispose可能 + cast.Dispose(); + + // Disposed + Assert.Throws(() => { var c = cast[0]; }); + Assert.Throws(() => { var a = array[0]; }); + Assert.Throws(() => { var s = sub[0]; }); + } + } +} diff --git a/Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs.meta b/Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs.meta new file mode 100644 index 000000000..f90aa3d01 --- /dev/null +++ b/Assets/UniGLTF/Tests/UniGLTF/NativeArrayTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d3712bde0d2a4b348ab5bb661fe1a51a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From ab0964293f8f3ad4930aa2e9ee8fa053c40a3216 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 18:03:10 +0900 Subject: [PATCH 02/12] =?UTF-8?q?GltfData.Bin=20=E3=82=92=20ArraySegment=20=E3=81=8B=E3=82=89=20NatriveArray=20=E3=81=AB?= =?UTF-8?q?=E7=BD=AE=E3=81=8D=E6=8F=9B=E3=81=88=E3=80=82Dispose=20?= =?UTF-8?q?=E3=81=AE=E8=B2=AC=E5=8B=99=E3=81=8C=E7=99=BA=E7=94=9F=E3=81=97?= =?UTF-8?q?=E3=81=9F=E3=81=8C=E3=80=81ImporterContext=20=E3=81=8C=20Dispos?= =?UTF-8?q?e=20=E3=81=99=E3=82=8B=E3=81=93=E3=81=A8=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/Extensions/ArrayExtensions.cs | 4 +- .../IO/AnimationIO/AnimationImporterUtil.cs | 16 +-- Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs | 116 +++++++++++------- .../Runtime/UniGLTF/IO/ImporterContext.cs | 3 + .../Runtime/UniGLTF/IO/MeshIO/MeshContext.cs | 20 +-- .../UniGLTF/IO/MeshIO/PrimitiveExtensions.cs | 45 +++---- .../IO/TextureIO/GltfTextureImporter.cs | 32 ++--- Assets/VRM10/Runtime/IO/Vrm10Data.cs | 110 +++++++++-------- Assets/VRM10/Runtime/IO/Vrm10Storage.cs | 2 +- Assets/VRM10/Runtime/Migration/MeshUpdater.cs | 4 +- Assets/VRM10/Runtime/Migration/RotateY180.cs | 4 +- 11 files changed, 200 insertions(+), 156 deletions(-) diff --git a/Assets/UniGLTF/Runtime/Extensions/ArrayExtensions.cs b/Assets/UniGLTF/Runtime/Extensions/ArrayExtensions.cs index 42d15c547..6547f93c8 100644 --- a/Assets/UniGLTF/Runtime/Extensions/ArrayExtensions.cs +++ b/Assets/UniGLTF/Runtime/Extensions/ArrayExtensions.cs @@ -2,7 +2,7 @@ using System.Linq; using System.Collections.Generic; using System.Runtime.InteropServices; - +using Unity.Collections; namespace UniGLTF { @@ -102,7 +102,7 @@ namespace UniGLTF public static class ListExtensions { - public static void Assign(this List dst, T[] src, Func pred) + public static void Assign(this List dst, NativeArray src, Func pred) where T : struct { dst.Capacity = src.Length; dst.AddRange(src.Select(pred)); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs index 7d4f16239..8c38c23a3 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/AnimationIO/AnimationImporterUtil.cs @@ -208,8 +208,8 @@ namespace UniGLTF clip, relativePath, new string[] { "localPosition.x", "localPosition.y", "localPosition.z" }, - input, - output, + input.ToArray(), + output.ToArray(), sampler.interpolation, typeof(Transform), (values, last) => @@ -231,8 +231,8 @@ namespace UniGLTF clip, relativePath, new string[] { "localRotation.x", "localRotation.y", "localRotation.z", "localRotation.w" }, - input, - output, + input.ToArray(), + output.ToArray(), sampler.interpolation, typeof(Transform), (values, last) => @@ -257,8 +257,8 @@ namespace UniGLTF clip, relativePath, new string[] { "localScale.x", "localScale.y", "localScale.z" }, - input, - output, + input.ToArray(), + output.ToArray(), sampler.interpolation, typeof(Transform), (values, last) => values); @@ -289,8 +289,8 @@ namespace UniGLTF clip, relativePath, keyNames, - input, - output, + input.ToArray(), + output.ToArray(), sampler.interpolation, typeof(SkinnedMeshRenderer), (values, last) => diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs index 19d720102..eeccc501e 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; +using Unity.Collections; namespace UniGLTF { @@ -9,7 +10,7 @@ namespace UniGLTF /// * JSON is parsed but not validated as glTF /// * For glb, bin chunks are already available /// - public sealed class GltfData + public sealed class GltfData : IDisposable { /// /// Source file path. @@ -43,21 +44,7 @@ namespace UniGLTF /// > This chunk MUST be the second chunk of the Binary glTF asset /// /// - public ArraySegment Bin - { - get - { - if (Chunks == null) - { - return default; - } - if (Chunks.Count < 2) - { - return default; - } - return Chunks[1].Bytes; - } - } + public readonly NativeArray Bin; /// /// Migration Flags used by ImporterContext @@ -74,7 +61,7 @@ namespace UniGLTF /// uri = 相対パス。File.ReadAllBytes /// /// - Dictionary> _UriCache = new Dictionary>(); + Dictionary> _UriCache = new Dictionary>(); public GltfData(string targetPath, string json, glTF gltf, IReadOnlyList chunks, IStorage storage, MigrationFlags migrationFlags) { @@ -84,6 +71,14 @@ namespace UniGLTF Chunks = chunks; _storage = storage; MigrationFlags = migrationFlags; + + if (Chunks != null) + { + if (Chunks.Count >= 2) + { + Bin = CreateNativeArray(Chunks[1].Bytes); + } + } } public static GltfData CreateFromExportForTest(ExportingGltfData data) @@ -107,14 +102,14 @@ namespace UniGLTF ); } - ArraySegment GetBytesFromUri(string uri) + NativeArray GetBytesFromUri(string uri) { if (string.IsNullOrEmpty(uri)) { throw new ArgumentNullException(); } - if (_UriCache.TryGetValue(uri, out ArraySegment data)) + if (_UriCache.TryGetValue(uri, out NativeArray data)) { // return cache return data; @@ -122,20 +117,20 @@ namespace UniGLTF if (uri.StartsWith("data:", StringComparison.Ordinal)) { - data = new ArraySegment(UriByteBuffer.ReadEmbedded(uri)); + data = CreateNativeArray(UriByteBuffer.ReadEmbedded(uri)); } else { - data = _storage.Get(uri); + data = CreateNativeArray(_storage.Get(uri)); } _UriCache.Add(uri, data); return data; } - public ArraySegment GetBytesFromBuffer(int bufferIndex) + public NativeArray GetBytesFromBuffer(int bufferIndex) { var buffer = GLTF.buffers[bufferIndex]; - if (bufferIndex == 0 && Bin.Array != null) + if (bufferIndex == 0 && Bin.IsCreated) { // https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#glb-stored-buffer return Bin; @@ -146,23 +141,20 @@ namespace UniGLTF } } - public ArraySegment GetBytesFromBufferView(int bufferView) + public NativeArray GetBytesFromBufferView(int bufferView) { var view = GLTF.bufferViews[bufferView]; var segment = GetBytesFromBuffer(view.buffer); - return new ArraySegment(segment.Array, segment.Offset + view.byteOffset, view.byteLength); + return segment.GetSubArray(view.byteOffset, view.byteLength); } - T[] GetTypedFromBufferView(int count, int byteOffset, glTFBufferView view) where T : struct + NativeArray GetTypedFromBufferView(int count, int byteOffset, glTFBufferView view) where T : struct { var segment = GetBytesFromBuffer(view.buffer); - var attrib = new T[count]; - var bytes = new ArraySegment(segment.Array, segment.Offset + view.byteOffset + byteOffset, count * Marshal.SizeOf()); - SafeMarshalCopy.CopyBytesToArray(bytes, attrib); - return attrib; + return segment.GetSubArray(view.byteOffset + byteOffset, count * Marshal.SizeOf()).Reinterpret(1); } - T[] GetTypedFromAccessor(glTFAccessor accessor, glTFBufferView view) where T : struct + NativeArray GetTypedFromAccessor(glTFAccessor accessor, glTFBufferView view) where T : struct { return GetTypedFromBufferView(accessor.count, accessor.byteOffset, view); } @@ -247,15 +239,15 @@ namespace UniGLTF return indices; } - public T[] GetArrayFromAccessor(int accessorIndex) where T : struct + public NativeArray GetArrayFromAccessor(int accessorIndex) where T : struct { var vertexAccessor = GLTF.accessors[accessorIndex]; - if (vertexAccessor.count <= 0) return new T[] { }; + if (vertexAccessor.count <= 0) return CreateNativeArray(0); var result = (vertexAccessor.bufferView != -1) ? GetTypedFromAccessor(vertexAccessor, GLTF.bufferViews[vertexAccessor.bufferView]) - : new T[vertexAccessor.count] + : CreateNativeArray(vertexAccessor.count) ; var sparse = vertexAccessor.sparse; @@ -275,27 +267,24 @@ namespace UniGLTF return result; } - public float[] FlatternFloatArrayFromAccessor(int accessorIndex) + public NativeArray FlatternFloatArrayFromAccessor(int accessorIndex) { var vertexAccessor = GLTF.accessors[accessorIndex]; - if (vertexAccessor.count <= 0) return new float[] { }; + if (vertexAccessor.count <= 0) return CreateNativeArray(0); var bufferCount = vertexAccessor.count * vertexAccessor.TypeCount; - float[] result = null; + NativeArray result = default; if (vertexAccessor.bufferView != -1) { - var attrib = new float[vertexAccessor.count * vertexAccessor.TypeCount]; var view = GLTF.bufferViews[vertexAccessor.bufferView]; var segment = GetBytesFromBuffer(view.buffer); - var bytes = new ArraySegment(segment.Array, segment.Offset + view.byteOffset + vertexAccessor.byteOffset, vertexAccessor.count * 4 * vertexAccessor.TypeCount); - SafeMarshalCopy.CopyBytesToArray(bytes, attrib); - result = attrib; + result = segment.GetSubArray(view.byteOffset + vertexAccessor.byteOffset, vertexAccessor.count * 4 * vertexAccessor.TypeCount).Reinterpret(1); } else { - result = new float[bufferCount]; + result = CreateNativeArray(bufferCount); } var sparse = vertexAccessor.sparse; @@ -315,7 +304,7 @@ namespace UniGLTF return result; } - public (ArraySegment binary, string mimeType)? GetBytesFromImage(int imageIndex) + public (NativeArray binary, string mimeType)? GetBytesFromImage(int imageIndex) { if (imageIndex < 0 || imageIndex >= GLTF.images.Count) return default; @@ -373,5 +362,46 @@ namespace UniGLTF return false; } + + /// + /// NativeArrayを新規作成し、Dispose管理する。 + /// 個別にDisposeする必要が無い。 + /// + /// + /// + /// + public NativeArray CreateNativeArray(int size) where T : struct + { + var array = new NativeArray(size, Allocator.Persistent); + m_disposables.Add(array); + return array; + } + + NativeArray CreateNativeArray(ArraySegment data) where T : struct + { + var array = CreateNativeArray(data.Count); + // TODO: remove ToArray + array.CopyFrom(data.ToArray()); + return array; + } + + NativeArray CreateNativeArray(T[] data) where T : struct + { + var array = CreateNativeArray(data.Length); + array.CopyFrom(data); + return array; + } + + List m_disposables = new List(); + + public void Dispose() + { + foreach (var disposable in m_disposables) + { + disposable.Dispose(); + } + m_disposables.Clear(); + _UriCache.Clear(); + } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 7d3f514eb..5cb3a0dfe 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -330,6 +330,9 @@ namespace UniGLTF AnimationClipFactory?.Dispose(); MaterialFactory?.Dispose(); TextureFactory?.Dispose(); + + // OK ? + Data.Dispose(); } /// diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs index 54bc2ba8b..b1507791a 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs @@ -142,7 +142,7 @@ namespace UniGLTF for (var i = 0; i < positions.Length; ++i) { var position = inverter.InvertVector3(positions[i]); - var normal = normals != null ? inverter.InvertVector3(normals[i]) : Vector3.zero; + var normal = normals != null ? inverter.InvertVector3(normals.Value[i]) : Vector3.zero; var texCoord0 = Vector2.zero; if (texCoords0 != null) @@ -151,20 +151,20 @@ namespace UniGLTF { #pragma warning disable 0612 // backward compatibility - texCoord0 = texCoords0[i].ReverseY(); + texCoord0 = texCoords0.Value[i].ReverseY(); #pragma warning restore 0612 } else { - texCoord0 = texCoords0[i].ReverseUV(); + texCoord0 = texCoords0.Value[i].ReverseUV(); } } - var texCoord1 = texCoords1 != null ? texCoords1[i].ReverseUV() : Vector2.zero; + var texCoord1 = texCoords1 != null ? texCoords1.Value[i].ReverseUV() : Vector2.zero; var joints = jointsGetter?.Invoke(i) ?? (0, 0, 0, 0); var weights = weightsGetter != null ? NormalizeBoneWeight(weightsGetter(i)) : (0, 0, 0, 0); - var color = colors != null ? colors[i] : Color.white; + var color = colors != null ? colors.Value[i] : Color.white; _vertices.Add( new MeshVertex( position, @@ -285,24 +285,24 @@ namespace UniGLTF for (var i = 0; i < positions.Length; ++i) { var position = inverter.InvertVector3(positions[i]); - var normal = normals != null ? inverter.InvertVector3(normals[i]) : Vector3.zero; + var normal = normals != null ? inverter.InvertVector3(normals.Value[i]) : Vector3.zero; var texCoord0 = Vector2.zero; if (texCoords0 != null) { if (data.GLTF.IsGeneratedUniGLTFAndOlder(1, 16)) { #pragma warning disable 0612 - texCoord0 = texCoords0[i].ReverseY(); + texCoord0 = texCoords0.Value[i].ReverseY(); #pragma warning restore 0612 } else { - texCoord0 = texCoords0[i].ReverseUV(); + texCoord0 = texCoords0.Value[i].ReverseUV(); } } - var texCoord1 = texCoords1 != null ? texCoords1[i].ReverseUV() : Vector2.zero; - var color = colors != null ? colors[i] : Color.white; + var texCoord1 = texCoords1 != null ? texCoords1.Value[i].ReverseUV() : Vector2.zero; + var color = colors != null ? colors.Value[i] : Color.white; var joints = jointsGetter?.Invoke(i) ?? (0, 0, 0, 0); var weights = weightsGetter != null ? NormalizeBoneWeight(weightsGetter(i)) : (0, 0, 0, 0); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/PrimitiveExtensions.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/PrimitiveExtensions.cs index 7e0f9fd08..13e8a3a70 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/PrimitiveExtensions.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/PrimitiveExtensions.cs @@ -1,4 +1,5 @@ using System; +using Unity.Collections; using UnityEngine; namespace UniGLTF @@ -11,12 +12,12 @@ namespace UniGLTF public static bool HasSkin(this glTFPrimitives primitives) => primitives.attributes.JOINTS_0 != -1 && primitives.attributes.WEIGHTS_0 != -1; public static bool HasColor(this glTFPrimitives primitives) => primitives.attributes.COLOR_0 != -1; - public static Vector3[] GetPositions(this glTFPrimitives primitives, GltfData data) + public static NativeArray GetPositions(this glTFPrimitives primitives, GltfData data) { return data.GetArrayFromAccessor(primitives.attributes.POSITION); } - public static Vector3[] GetNormals(this glTFPrimitives primitives, GltfData data, int positionsLength) + public static NativeArray? GetNormals(this glTFPrimitives primitives, GltfData data, int positionsLength) { if (!HasNormal(primitives)) return null; var result = data.GetArrayFromAccessor(primitives.attributes.NORMAL); @@ -28,7 +29,7 @@ namespace UniGLTF return result; } - public static Vector2[] GetTexCoords0(this glTFPrimitives primitives, GltfData data, int positionsLength) + public static NativeArray? GetTexCoords0(this glTFPrimitives primitives, GltfData data, int positionsLength) { if (!HasTexCoord0(primitives)) return null; var result = data.GetArrayFromAccessor(primitives.attributes.TEXCOORD_0); @@ -39,8 +40,8 @@ namespace UniGLTF return result; } - - public static Vector2[] GetTexCoords1(this glTFPrimitives primitives, GltfData data, int positionsLength) + + public static NativeArray? GetTexCoords1(this glTFPrimitives primitives, GltfData data, int positionsLength) { if (!HasTexCoord1(primitives)) return null; var result = data.GetArrayFromAccessor(primitives.attributes.TEXCOORD_1); @@ -48,33 +49,33 @@ namespace UniGLTF { throw new Exception("different length"); } - + return result; } - public static Color[] GetColors(this glTFPrimitives primitives, GltfData data, int positionsLength) + public static NativeArray? GetColors(this glTFPrimitives primitives, GltfData data, int positionsLength) { if (!HasColor(primitives)) return null; - + switch (data.GLTF.accessors[primitives.attributes.COLOR_0].TypeCount) { case 3: - { - var vec3Color = data.GetArrayFromAccessor(primitives.attributes.COLOR_0); - if (vec3Color.Length != positionsLength) { - throw new Exception("different length"); - } - var colors = new Color[vec3Color.Length]; + var vec3Color = data.GetArrayFromAccessor(primitives.attributes.COLOR_0); + if (vec3Color.Length != positionsLength) + { + throw new Exception("different length"); + } + var colors = data.CreateNativeArray(vec3Color.Length); - for (var index = 0; index < vec3Color.Length; index++) - { - var color = vec3Color[index]; - colors[index] = new Color(color.x, color.y, color.z); - } + for (var index = 0; index < vec3Color.Length; index++) + { + var color = vec3Color[index]; + colors[index] = new Color(color.x, color.y, color.z); + } - return colors; - } + return colors; + } case 4: var result = data.GetArrayFromAccessor(primitives.attributes.COLOR_0); if (result.Length != positionsLength) @@ -89,7 +90,7 @@ namespace UniGLTF } } - public static JointsAccessor.Getter GetJoints(this glTFPrimitives primitives, GltfData data, int positionsLength) + public static JointsAccessor.Getter GetJoints(this glTFPrimitives primitives, GltfData data, int positionsLength) { // skin if (!HasSkin(primitives)) return null; diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs index c14c779b3..bde1d5d2b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/TextureIO/GltfTextureImporter.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using Unity.Collections; using UnityEngine; using VRMShaders; @@ -201,22 +202,23 @@ namespace UniGLTF return data.GLTF.textures[textureIndex].source; } - private static byte[] ToArray(ArraySegment bytes) + private static byte[] ToArray(NativeArray bytes) { - if (bytes.Array == null) - { - return new byte[] { }; - } - else if (bytes.Offset == 0 && bytes.Count == bytes.Array.Length) - { - return bytes.Array; - } - else - { - var result = new byte[bytes.Count]; - Buffer.BlockCopy(bytes.Array, bytes.Offset, result, 0, result.Length); - return result; - } + // if (bytes.Array == null) + // { + // return new byte[] { }; + // } + // else if (bytes.Offset == 0 && bytes.Count == bytes.Array.Length) + // { + // return bytes.Array; + // } + // else + // { + // var result = new byte[bytes.Count]; + // Buffer.BlockCopy(bytes.Array, bytes.Offset, result, 0, result.Length); + // return result; + // } + return bytes.ToArray(); } } } diff --git a/Assets/VRM10/Runtime/IO/Vrm10Data.cs b/Assets/VRM10/Runtime/IO/Vrm10Data.cs index 6e38ca237..27353acc7 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Data.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Data.cs @@ -14,7 +14,7 @@ namespace UniVRM10 Other, } - public class Vrm10Data + public class Vrm10Data : IDisposable { public GltfData Data { get; } public UniGLTF.Extensions.VRMC_vrm.VRMC_vrm VrmExtension { get; } @@ -86,77 +86,85 @@ namespace UniVRM10 // try migrateion byte[] migrated = default; Migration.Vrm0Meta oldMeta = default; - try + using (data) { - var json = data.Json.ParseAsJson(); try { - if (!json.TryGet("extensions", out JsonNode extensions)) + var json = data.Json.ParseAsJson(); + try { - result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no extensions"); + if (!json.TryGet("extensions", out JsonNode extensions)) + { + result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no extensions"); + return false; + } + if (!extensions.TryGet("VRM", out JsonNode vrm0)) + { + result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no vrm0"); + return false; + } + } + catch (Exception ex) + { + result = new Vrm10Data(default, default, Vrm10FileType.Other, $"error: {ex}"); return false; } - if (!extensions.TryGet("VRM", out JsonNode vrm0)) + + if (!doMigrate) { - result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no vrm0"); + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: not migrated"); return false; } + + migrated = MigrationVrm.Migrate(data); + if (migrated == null) + { + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: cannot migrate"); + return false; + } + + oldMeta = Migration.Vrm0Meta.FromJsonBytes(json); } catch (Exception ex) { - result = new Vrm10Data(default, default, Vrm10FileType.Other, $"error: {ex}"); + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, $"vrm0: migration error: {ex}"); return false; } - if (!doMigrate) { - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: not migrated"); - return false; - } - - migrated = MigrationVrm.Migrate(data); - if (migrated == null) - { - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: cannot migrate"); - return false; - } - - oldMeta = Migration.Vrm0Meta.FromJsonBytes(json); - } - catch (Exception ex) - { - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, $"vrm0: migration error: {ex}"); - return false; - } - - { - var migratedData = new GlbLowLevelParser(data.TargetPath, migrated).Parse(); - if (UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(migratedData.GLTF.extensions, out VRMC_vrm vrm)) - { - // success - if (oldMeta == null) + var migratedData = new GlbLowLevelParser(data.TargetPath, migrated).Parse(); + if (UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(migratedData.GLTF.extensions, out VRMC_vrm vrm)) { - throw new NullReferenceException("oldMeta"); - } - byte[] migratedBytes = null; - if (VRMShaders.Symbols.VRM_DEVELOP) - { - // 右手左手座標変換でバッファが破壊的変更されるので、コピーを作っている - migratedBytes = migrated.Select(x => x).ToArray(); + // success + if (oldMeta == null) + { + throw new NullReferenceException("oldMeta"); + } + byte[] migratedBytes = null; + if (VRMShaders.Symbols.VRM_DEVELOP) + { + // 右手左手座標変換でバッファが破壊的変更されるので、コピーを作っている + migratedBytes = migrated.Select(x => x).ToArray(); + } + + result = new Vrm10Data(migratedData, vrm, Vrm10FileType.Vrm0, + message: "vrm0: migrated", + oldMeta: oldMeta, + migratedBytes: migratedBytes + ); + + return true; } - result = new Vrm10Data(migratedData, vrm, Vrm10FileType.Vrm0, - message: "vrm0: migrated", - oldMeta: oldMeta, - migratedBytes: migratedBytes - ); - - return true; + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: migrate but error ?"); + return false; } - - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: migrate but error ?"); - return false; } } + + public void Dispose() + { + Data.Dispose(); + } } } diff --git a/Assets/VRM10/Runtime/IO/Vrm10Storage.cs b/Assets/VRM10/Runtime/IO/Vrm10Storage.cs index c79730938..4fd8adadd 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Storage.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Storage.cs @@ -55,7 +55,7 @@ namespace UniVRM10 gltfVrmSpringBone = springBone; } - _buffer = new ArraySegmentByteBuffer(data.Bin); + _buffer = new ArraySegmentByteBuffer(new ArraySegment(data.Bin.ToArray())); } public void Reserve(int bytesLength) diff --git a/Assets/VRM10/Runtime/Migration/MeshUpdater.cs b/Assets/VRM10/Runtime/Migration/MeshUpdater.cs index 9538a818c..f20040456 100644 --- a/Assets/VRM10/Runtime/Migration/MeshUpdater.cs +++ b/Assets/VRM10/Runtime/Migration/MeshUpdater.cs @@ -20,7 +20,7 @@ namespace UniVRM10 public MeshUpdater(GltfData data) { _data = data; - _buffer = new ArrayByteBuffer(new byte[data.Bin.Count]); + _buffer = new ArrayByteBuffer(new byte[data.Bin.Length]); } int AddBuffer(ArraySegment bytes) @@ -70,7 +70,7 @@ namespace UniVRM10 foreach (var image in gltf.images) { var bytes = _data.GetBytesFromBufferView(image.bufferView); - image.bufferView = AddBuffer(bytes); + image.bufferView = AddBuffer(new ArraySegment(bytes.ToArray())); } // update Mesh diff --git a/Assets/VRM10/Runtime/Migration/RotateY180.cs b/Assets/VRM10/Runtime/Migration/RotateY180.cs index 4ada62c1c..93bb4203c 100644 --- a/Assets/VRM10/Runtime/Migration/RotateY180.cs +++ b/Assets/VRM10/Runtime/Migration/RotateY180.cs @@ -73,7 +73,7 @@ namespace UniVRM10 if (bufferViewIndex != -1) { var buffer = data.GetBytesFromBufferView(bufferViewIndex); - var span = SpanLike.Wrap(buffer); + var span = buffer.Reinterpret(1); for (int i = 0; i < span.Length; ++i) { span[i] = span[i].RotateY180(); @@ -114,7 +114,7 @@ namespace UniVRM10 { var accessor = data.GLTF.accessors[skin.inverseBindMatrices]; var buffer = data.GetBytesFromBufferView(accessor.bufferView); - var span = SpanLike.Wrap(buffer); + var span = buffer.Reinterpret(1); for (int i = 0; i < span.Length; ++i) { span[i] = span[i].RotateY180(); From a9f1f0a353ae38c869c995922d7ab64cde6d60b7 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 18:38:12 +0900 Subject: [PATCH 03/12] =?UTF-8?q?CreateNativeArray=20=E3=82=92=E9=81=85?= =?UTF-8?q?=E5=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs index eeccc501e..fdddbf823 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs @@ -39,12 +39,32 @@ namespace UniGLTF /// public glTF GLTF { get; } + public NativeArray? _bin; + /// /// BIN chunk /// > This chunk MUST be the second chunk of the Binary glTF asset /// /// - public readonly NativeArray Bin; + public NativeArray Bin + { + get + { + if (!_bin.HasValue) + { + // init + if (Chunks != null) + { + if (Chunks.Count >= 2) + { + _bin = CreateNativeArray(Chunks[1].Bytes); + } + } + + } + return _bin.GetValueOrDefault(); + } + } /// /// Migration Flags used by ImporterContext @@ -71,14 +91,6 @@ namespace UniGLTF Chunks = chunks; _storage = storage; MigrationFlags = migrationFlags; - - if (Chunks != null) - { - if (Chunks.Count >= 2) - { - Bin = CreateNativeArray(Chunks[1].Bytes); - } - } } public static GltfData CreateFromExportForTest(ExportingGltfData data) @@ -402,6 +414,7 @@ namespace UniGLTF } m_disposables.Clear(); _UriCache.Clear(); + _bin = null; } } } From d6dac4db9c552c40685756019f7ade0247412ceb Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 18:38:30 +0900 Subject: [PATCH 04/12] =?UTF-8?q?ImporterContext=20=E3=81=AF=20GltfData.Di?= =?UTF-8?q?spose=20=E3=82=92=E5=91=BC=E3=81=B0=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 5cb3a0dfe..7d3f514eb 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -330,9 +330,6 @@ namespace UniGLTF AnimationClipFactory?.Dispose(); MaterialFactory?.Dispose(); TextureFactory?.Dispose(); - - // OK ? - Data.Dispose(); } /// From 684db5091fceaee79ca5abda0d7444c2605e4b80 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 19:17:24 +0900 Subject: [PATCH 05/12] fix GltfData.Dispose for tests --- .../UniGLTF/EditorTextureSerializerTests.cs | 19 ++--- .../UniGLTF/Tests/UniGLTF/GlbParserTests.cs | 26 ++++--- Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs | 31 ++++---- Assets/VRM/Tests/VRMLoadTests.cs | 1 + Assets/VRM/Tests/VRMLookAtTests.cs | 9 ++- Assets/VRM10/Tests/MaterialImportTests.cs | 26 ++++--- Assets/VRM10/Tests/MigrationTests.cs | 74 +++++++++++-------- Assets/VRM10/Tests/TestAsset.cs | 1 + 8 files changed, 107 insertions(+), 80 deletions(-) diff --git a/Assets/UniGLTF/Tests/UniGLTF/EditorTextureSerializerTests.cs b/Assets/UniGLTF/Tests/UniGLTF/EditorTextureSerializerTests.cs index 6580dbe54..349db71fd 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/EditorTextureSerializerTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/EditorTextureSerializerTests.cs @@ -143,16 +143,17 @@ namespace UniGLTF UnityEngine.Object.DestroyImmediate(mat); UnityEngine.Object.DestroyImmediate(root); - var parsed = GltfData.CreateFromGltfDataForTest(gltf, data.BinBytes); + using (var parsed = GltfData.CreateFromGltfDataForTest(gltf, data.BinBytes)) + { + // Extract Image to Texture2D + var exportedBytes = parsed.GetBytesFromBufferView(exportedImage.bufferView).ToArray(); + var exportedTexture = new Texture2D(2, 2, TextureFormat.ARGB32, mipChain: false, linear: false); + Assert.IsTrue(exportedTexture.LoadImage(exportedBytes)); // Always true ? + Assert.AreEqual(srcTex.width, exportedTexture.width); + Assert.AreEqual(srcTex.height, exportedTexture.height); - // Extract Image to Texture2D - var exportedBytes = parsed.GetBytesFromBufferView(exportedImage.bufferView).ToArray(); - var exportedTexture = new Texture2D(2, 2, TextureFormat.ARGB32, mipChain: false, linear: false); - Assert.IsTrue(exportedTexture.LoadImage(exportedBytes)); // Always true ? - Assert.AreEqual(srcTex.width, exportedTexture.width); - Assert.AreEqual(srcTex.height, exportedTexture.height); - - return exportedTexture; + return exportedTexture; + } } private static Color32 GetFirstPixelInTexture2D(Texture2D tex) diff --git a/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs b/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs index 9c36ec786..22034d331 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs @@ -33,11 +33,13 @@ namespace UniGLTF }); var parser = new GlbLowLevelParser("Test", data.ToGlbBytes()); - var parsed = parser.Parse(); + using (var parsed = parser.Parse()) + { - Assert.AreEqual("FooBar", parsed.GLTF.textures[0].name); - // NOTE: 大文字小文字が違うだけの名前は、同一としてみなされ、Suffix が付く。 - Assert.AreEqual("foobar__UNIGLTF__DUPLICATED__2", parsed.GLTF.textures[1].name); + Assert.AreEqual("FooBar", parsed.GLTF.textures[0].name); + // NOTE: 大文字小文字が違うだけの名前は、同一としてみなされ、Suffix が付く。 + Assert.AreEqual("foobar__UNIGLTF__DUPLICATED__2", parsed.GLTF.textures[1].name); + } } /// @@ -61,16 +63,18 @@ namespace UniGLTF Assert.True(File.Exists(path)); var bytes = File.ReadAllBytes(path); - var data = new GlbBinaryParser(bytes, Path.GetFileNameWithoutExtension(path)).Parse(); - - // glb header + 1st chunk only - var mod = bytes.Take(12 + 8 + data.Chunks[0].Bytes.Count).ToArray(); - - Assert.Throws(() => + using (var data = new GlbBinaryParser(bytes, Path.GetFileNameWithoutExtension(path)).Parse()) { + + // glb header + 1st chunk only + var mod = bytes.Take(12 + 8 + data.Chunks[0].Bytes.Count).ToArray(); + + Assert.Throws(() => + { // 再パース var data2 = new GlbBinaryParser(mod, Path.GetFileNameWithoutExtension(path)).Parse(); - }); + }); + } } } } diff --git a/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs b/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs index b37167c06..3684281d1 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/GltfLoadTests.cs @@ -89,6 +89,7 @@ namespace UniGLTF Debug.LogException(ex); } + using (data) using (var loader = new ImporterContext(data)) { try @@ -136,12 +137,15 @@ namespace UniGLTF } // should unique - var gltfTextures = new GltfTextureDescriptorGenerator(data).Get().GetEnumerable() - .Select(x => x.SubAssetKey) - .ToArray(); - var distinct = gltfTextures.Distinct().ToArray(); - Assert.True(gltfTextures.Length == distinct.Length); - Assert.True(gltfTextures.SequenceEqual(distinct)); + using (data) + { + var gltfTextures = new GltfTextureDescriptorGenerator(data).Get().GetEnumerable() + .Select(x => x.SubAssetKey) + .ToArray(); + var distinct = gltfTextures.Distinct().ToArray(); + Assert.True(gltfTextures.Length == distinct.Length); + Assert.True(gltfTextures.SequenceEqual(distinct)); + } } static bool Exclude(FileInfo f) @@ -220,13 +224,14 @@ namespace UniGLTF { var path = Path.Combine(root.FullName, "DamagedHelmet/glTF-Binary/DamagedHelmet.glb"); - var data = new AutoGltfFileParser(path).Parse(); - - var matDesc = new GltfMaterialDescriptorGenerator().Get(data, 0); - Assert.AreEqual("Standard", matDesc.ShaderName); - Assert.AreEqual(5, matDesc.TextureSlots.Count); - var (key, value) = matDesc.EnumerateSubAssetKeyValue().First(); - Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "texture_0"), key); + using (var data = new AutoGltfFileParser(path).Parse()) + { + var matDesc = new GltfMaterialDescriptorGenerator().Get(data, 0); + Assert.AreEqual("Standard", matDesc.ShaderName); + Assert.AreEqual(5, matDesc.TextureSlots.Count); + var (key, value) = matDesc.EnumerateSubAssetKeyValue().First(); + Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "texture_0"), key); + } } } } diff --git a/Assets/VRM/Tests/VRMLoadTests.cs b/Assets/VRM/Tests/VRMLoadTests.cs index 63da4b822..ef2ac3042 100644 --- a/Assets/VRM/Tests/VRMLoadTests.cs +++ b/Assets/VRM/Tests/VRMLoadTests.cs @@ -72,6 +72,7 @@ namespace VRM try { + using (data) using (var importer = new VRMImporterContext(new VRMData(data))) { return importer.Load().gameObject; diff --git a/Assets/VRM/Tests/VRMLookAtTests.cs b/Assets/VRM/Tests/VRMLookAtTests.cs index d262120c7..95c197326 100644 --- a/Assets/VRM/Tests/VRMLookAtTests.cs +++ b/Assets/VRM/Tests/VRMLookAtTests.cs @@ -22,6 +22,7 @@ namespace VRM { var data = new GlbFileParser(AliciaPath).Parse(); byte[] bytes = default; + using (data) using (var loader = new VRMImporterContext(new VRMData(data))) using (var loaded = loader.Load()) { @@ -37,7 +38,7 @@ namespace VRM }); } - var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse(); + using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse()) using (var loader2 = new VRMImporterContext(new VRMData(data2))) { Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType); @@ -50,6 +51,7 @@ namespace VRM var data = new GlbFileParser(AliciaPath).Parse(); byte[] bytes = default; CurveMapper horizontalInner = default; + using (data) using (var loader = new VRMImporterContext(new VRMData(data))) using (var loaded = loader.Load()) { @@ -65,7 +67,7 @@ namespace VRM }); } - var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse(); + using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse()) using (var loader = new VRMImporterContext(new VRMData(data2))) using (var loaded = loader.Load()) { @@ -83,6 +85,7 @@ namespace VRM var data = new GlbFileParser(AliciaPath).Parse(); byte[] bytes = default; CurveMapper horizontalInner = default; + using (data) using (var loader = new VRMImporterContext(new VRMData(data))) using (var loaded = loader.Load()) { @@ -98,7 +101,7 @@ namespace VRM }); } - var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse(); + using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse()) using (var loader = new VRMImporterContext(new VRMData(data2))) using (var loaded = loader.Load()) { diff --git a/Assets/VRM10/Tests/MaterialImportTests.cs b/Assets/VRM10/Tests/MaterialImportTests.cs index cbe82ce0b..c4961c776 100644 --- a/Assets/VRM10/Tests/MaterialImportTests.cs +++ b/Assets/VRM10/Tests/MaterialImportTests.cs @@ -22,22 +22,24 @@ namespace UniVRM10 public void MaterialImporterTest() { var migratedBytes = MigrationVrm.Migrate(File.ReadAllBytes(AliciaPath)); - var data = new GlbLowLevelParser(AliciaPath, migratedBytes).Parse(); + using (var data = new GlbLowLevelParser(AliciaPath, migratedBytes).Parse()) + { - var matDesc = new Vrm10MaterialDescriptorGenerator().Get(data, 0); - Assert.AreEqual("Alicia_body", matDesc.Name); - Assert.AreEqual("VRM10/MToon10", matDesc.ShaderName); - Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_MainTex"].UnityObjectName); - Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_ShadeTex"].UnityObjectName); + var matDesc = new Vrm10MaterialDescriptorGenerator().Get(data, 0); + Assert.AreEqual("Alicia_body", matDesc.Name); + Assert.AreEqual("VRM10/MToon10", matDesc.ShaderName); + Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_MainTex"].UnityObjectName); + Assert.AreEqual("Alicia_body", matDesc.TextureSlots["_ShadeTex"].UnityObjectName); - AreColorEqualApproximately(new Color(1, 1, 1, 1), matDesc.Colors["_Color"]); - ColorUtility.TryParseHtmlString("#FFDDD6", out var shadeColor); - AreColorEqualApproximately(shadeColor, matDesc.Colors["_ShadeColor"]); + AreColorEqualApproximately(new Color(1, 1, 1, 1), matDesc.Colors["_Color"]); + ColorUtility.TryParseHtmlString("#FFDDD6", out var shadeColor); + AreColorEqualApproximately(shadeColor, matDesc.Colors["_ShadeColor"]); - Assert.AreEqual(1.0f - 0.1f, matDesc.FloatValues["_GiEqualization"]); + Assert.AreEqual(1.0f - 0.1f, matDesc.FloatValues["_GiEqualization"]); - var (key, value) = matDesc.EnumerateSubAssetKeyValue().First(); - Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "Alicia_body"), key); + var (key, value) = matDesc.EnumerateSubAssetKeyValue().First(); + Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "Alicia_body"), key); + } } private void AreColorEqualApproximately(Color expected, Color actual) diff --git a/Assets/VRM10/Tests/MigrationTests.cs b/Assets/VRM10/Tests/MigrationTests.cs index d1c8f7763..4a491433d 100644 --- a/Assets/VRM10/Tests/MigrationTests.cs +++ b/Assets/VRM10/Tests/MigrationTests.cs @@ -22,9 +22,11 @@ namespace UniVRM10 static JsonNode GetVRM0(byte[] bytes) { - var glb = new GlbBinaryParser(bytes, "vrm0").Parse(); - var json = glb.Json.ParseAsJson(); - return json["extensions"]["VRM"]; + using (var glb = new GlbBinaryParser(bytes, "vrm0").Parse()) + { + var json = glb.Json.ParseAsJson(); + return json["extensions"]["VRM"]; + } } T GetExtension(UniGLTF.glTFExtension extensions, UniJSON.Utf8String key, Func deserializer) @@ -50,14 +52,16 @@ namespace UniVRM10 var vrm0Json = GetVRM0(vrm0Bytes); var vrm1 = MigrationVrm.Migrate(vrm0Bytes); - var glb = new GlbBinaryParser(vrm1, "vrm1").Parse(); - var json = glb.Json.ParseAsJson(); - var gltf = UniGLTF.GltfDeserializer.Deserialize(json); + using (var glb = new GlbBinaryParser(vrm1, "vrm1").Parse()) + { + var json = glb.Json.ParseAsJson(); + var gltf = UniGLTF.GltfDeserializer.Deserialize(json); - MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.ExtensionNameUtf8, - UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.Deserialize), MigrationVrm.CreateMeshToNode(gltf)); - MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.ExtensionNameUtf8, - UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.Deserialize), gltf.nodes); + MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.ExtensionNameUtf8, + UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.Deserialize), MigrationVrm.CreateMeshToNode(gltf)); + MigrationVrm.Check(vrm0Json, GetExtension(gltf.extensions, UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.ExtensionNameUtf8, + UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.Deserialize), gltf.nodes); + } } const float EPS = 1e-4f; @@ -195,6 +199,7 @@ namespace UniVRM10 try { Vrm10Data.TryParseOrMigrate(gltf.FullName, true, out Vrm10Data vrm); + using (vrm) using (var loader = new Vrm10Importer(vrm)) { loader.LoadAsync().Wait(); @@ -218,35 +223,40 @@ namespace UniVRM10 // var VALUE = new Vector3(-0.0359970331f, -0.0188314915f, 0.00566166639f); var bytes0 = File.ReadAllBytes(AliciaPath); - var data0 = new GlbLowLevelParser(AliciaPath, bytes0).Parse(); - var json0 = data0.Json.ParseAsJson(); - var groupIndex = json0["extensions"]["VRM"]["secondaryAnimation"]["boneGroups"][0]["colliderGroups"][0].GetInt32(); - var x = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["x"].GetSingle(); - var y = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["y"].GetSingle(); - var z = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["z"].GetSingle(); - Assert.AreEqual(VALUE.x, x); - Assert.AreEqual(VALUE.y, y); - Assert.AreEqual(VALUE.z, z); + int groupIndex = default; + using (var data0 = new GlbLowLevelParser(AliciaPath, bytes0).Parse()) + { + var json0 = data0.Json.ParseAsJson(); + groupIndex = json0["extensions"]["VRM"]["secondaryAnimation"]["boneGroups"][0]["colliderGroups"][0].GetInt32(); + var x = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["x"].GetSingle(); + var y = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["y"].GetSingle(); + var z = json0["extensions"]["VRM"]["secondaryAnimation"]["colliderGroups"][groupIndex]["colliders"][0]["offset"]["z"].GetSingle(); + Assert.AreEqual(VALUE.x, x); + Assert.AreEqual(VALUE.y, y); + Assert.AreEqual(VALUE.z, z); + } // // vrm1 に migrate // var bytes1 = MigrationVrm.Migrate(bytes0); - var data1 = new GlbLowLevelParser(AliciaPath, bytes1).Parse(); - Assert.True(UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.TryGet(data1.GLTF.extensions, out UniGLTF.Extensions.VRMC_springBone.VRMC_springBone springBone)); - var spring = springBone.Springs[0]; - // var colliderNodeIndex = spring.ColliderGroups[0]; - // x軸だけが反転する - - var colliderIndex = 0; - for (int i = 0; i < groupIndex; ++i) + using (var data1 = new GlbLowLevelParser(AliciaPath, bytes1).Parse()) { - colliderIndex += springBone.ColliderGroups[i].Colliders.Length; - } + Assert.True(UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.TryGet(data1.GLTF.extensions, out UniGLTF.Extensions.VRMC_springBone.VRMC_springBone springBone)); + var spring = springBone.Springs[0]; + // var colliderNodeIndex = spring.ColliderGroups[0]; + // x軸だけが反転する - Assert.AreEqual(-VALUE.x, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[0]); - Assert.AreEqual(VALUE.y, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[1]); - Assert.AreEqual(VALUE.z, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[2]); + var colliderIndex = 0; + for (int i = 0; i < groupIndex; ++i) + { + colliderIndex += springBone.ColliderGroups[i].Colliders.Length; + } + + Assert.AreEqual(-VALUE.x, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[0]); + Assert.AreEqual(VALUE.y, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[1]); + Assert.AreEqual(VALUE.z, springBone.Colliders[colliderIndex].Shape.Sphere.Offset[2]); + } } [Test] diff --git a/Assets/VRM10/Tests/TestAsset.cs b/Assets/VRM10/Tests/TestAsset.cs index 803119d99..d3d6c7ec9 100644 --- a/Assets/VRM10/Tests/TestAsset.cs +++ b/Assets/VRM10/Tests/TestAsset.cs @@ -17,6 +17,7 @@ namespace UniVRM10 public static Vrm10Instance LoadAlicia() { Vrm10Data.TryParseOrMigrate(AliciaPath, true, out Vrm10Data vrm); + using (vrm) using (var loader = new Vrm10Importer(vrm)) { var task = loader.LoadAsync(new VRMShaders.ImmediateCaller()); From 7a0e105f61972286b22e1e827eab2be9de5c7cbd Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 19:46:24 +0900 Subject: [PATCH 06/12] HighLevel API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit とりあえず --- .../UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs | 25 ++++++ .../Runtime/UniGLTF/IO/GltfUtility.cs.meta | 11 +++ Assets/VRM/Runtime/IO/VrmUtility.cs | 52 ++++++++++++ Assets/VRM/Runtime/IO/VrmUtility.cs.meta | 11 +++ Assets/VRM_Samples/SimpleViewer/ViewerUI.cs | 82 ++++--------------- 5 files changed, 117 insertions(+), 64 deletions(-) create mode 100644 Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs create mode 100644 Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs.meta create mode 100644 Assets/VRM/Runtime/IO/VrmUtility.cs create mode 100644 Assets/VRM/Runtime/IO/VrmUtility.cs.meta diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs new file mode 100644 index 000000000..881f74b0a --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs @@ -0,0 +1,25 @@ +using System.IO; +using System.Threading.Tasks; +using UnityEngine; +using VRMShaders; + +namespace UniGLTF +{ + public static class GltfUtility + { + public static async Task LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null) + { + if (!File.Exists(path)) + { + throw new FileNotFoundException(path); + } + + Debug.LogFormat("{0}", path); + using (GltfData data = new AutoGltfFileParser(path).Parse()) + using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)) + { + return await loader.LoadAsync(awaitCaller); + } + } + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs.meta new file mode 100644 index 000000000..2adf5c700 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 317decd1053397d4b9bdb9fb183bba4a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM/Runtime/IO/VrmUtility.cs b/Assets/VRM/Runtime/IO/VrmUtility.cs new file mode 100644 index 000000000..0a5ec9979 --- /dev/null +++ b/Assets/VRM/Runtime/IO/VrmUtility.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using UniGLTF; +using UnityEngine; +using VRMShaders; + +namespace VRM +{ + public static class VrmUtility + { + public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm); + public delegate void MetaCallback(VRMMetaObject meta); + public static async Task LoadAsync(string path, + IAwaitCaller awaitCaller = null, + MaterialGeneratorCallback materialGeneratorCallback = null, + MetaCallback metaCallback = null + ) + { + if (!File.Exists(path)) + { + throw new FileNotFoundException(path); + } + + using (GltfData data = new AutoGltfFileParser(path).Parse()) + { + try + { + var vrm = new VRMData(data); + using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGeneratorCallback(vrm.VrmExtension))) + { + if (metaCallback != null) + { + var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true); + metaCallback(meta); + } + return await loader.LoadAsync(awaitCaller); + } + } + catch (NotVrm0Exception) + { + // retry + Debug.LogWarning("file extension is vrm. but not vrm ?"); + using (var loader = new UniGLTF.ImporterContext(data)) + { + return await loader.LoadAsync(awaitCaller); + } + } + } + } + } +} diff --git a/Assets/VRM/Runtime/IO/VrmUtility.cs.meta b/Assets/VRM/Runtime/IO/VrmUtility.cs.meta new file mode 100644 index 000000000..f2c9cf8df --- /dev/null +++ b/Assets/VRM/Runtime/IO/VrmUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 431e57aed523ae240a0c88b0657677f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs b/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs index d60fa64a6..fb924cd22 100644 --- a/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs +++ b/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs @@ -103,10 +103,8 @@ namespace VRM.SimpleViewer m_textDistributionOther.text = ""; } - public async Task UpdateMetaAsync(VRMImporterContext context) + public void UpdateMeta(VRMMetaObject meta) { - var meta = await context.ReadMetaAsync(new ImmediateCaller(), true); - m_textModelTitle.text = meta.Title; m_textModelVersion.text = meta.Version; m_textModelAuthor.text = meta.Author; @@ -321,7 +319,7 @@ namespace VRM.SimpleViewer string[] cmds = System.Environment.GetCommandLineArgs(); if (cmds.Length > 1) { - LoadModel(cmds[1]); + LoadModelAsync(cmds[1]); } m_texts.Start(); @@ -366,10 +364,10 @@ namespace VRM.SimpleViewer return; } - LoadModel(path); + LoadModelAsync(path); } - void LoadModel(string path) + async void LoadModelAsync(string path) { var ext = Path.GetExtension(path).ToLower(); switch (ext) @@ -377,12 +375,21 @@ namespace VRM.SimpleViewer case ".gltf": case ".glb": case ".zip": - LoadModelAsync(path, false); - break; + { + var instance = await GltfUtility.LoadAsync(path, + GetIAwaitCaller(m_useAsync.isOn), + GetGltfMaterialGenerator(m_useUrpMaterial.isOn)); + break; + } case ".vrm": - LoadModelAsync(path, true); - break; + { + VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm); + VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta; + var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback); + SetModel(instance); + break; + } case ".bvh": LoadMotion(path, File.ReadAllText(path)); @@ -431,59 +438,6 @@ namespace VRM.SimpleViewer } } - async void LoadModelAsync(string path, bool isVrm) - { - if (!File.Exists(path)) - { - return; - } - - Debug.LogFormat("{0}", path); - - GltfData data; - try - { - data = new AutoGltfFileParser(path).Parse(); - } - catch (Exception ex) - { - Debug.LogWarningFormat("parse error: {0}", ex); - return; - } - - if (isVrm) - { - try - { - var vrm = new VRMData(data); - using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension))) - { - await m_texts.UpdateMetaAsync(loader); - var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn)); - SetModel(instance); - } - } - catch (NotVrm0Exception) - { - // retry - Debug.LogWarning("file extension is vrm. but not vrm ?"); - using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn))) - { - var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn)); - SetModel(instance); - } - } - } - else - { - using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn))) - { - var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn)); - SetModel(instance); - } - } - } - void SetModel(RuntimeGltfInstance instance) { // cleanup @@ -495,7 +449,7 @@ namespace VRM.SimpleViewer if (m_useFastSpringBone.isOn) { - FastSpringBoneReplacer.ReplaceAsync(instance.Root); + var _ = FastSpringBoneReplacer.ReplaceAsync(instance.Root); } instance.EnableUpdateWhenOffscreen(); From dbdb989dad4ad6059cc8fd56cc104e38a6037d2a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 20:00:14 +0900 Subject: [PATCH 07/12] use VrmUtility --- Assets/VRM/Runtime/IO/VrmUtility.cs | 7 +++++- .../VRMRuntimeExporter.cs | 22 ++++--------------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/Assets/VRM/Runtime/IO/VrmUtility.cs b/Assets/VRM/Runtime/IO/VrmUtility.cs index 0a5ec9979..431ca1d1f 100644 --- a/Assets/VRM/Runtime/IO/VrmUtility.cs +++ b/Assets/VRM/Runtime/IO/VrmUtility.cs @@ -27,7 +27,12 @@ namespace VRM try { var vrm = new VRMData(data); - using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGeneratorCallback(vrm.VrmExtension))) + IMaterialDescriptorGenerator materialGen = default; + if (materialGeneratorCallback != null) + { + materialGen = materialGeneratorCallback(vrm.VrmExtension); + } + using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen)) { if (metaCallback != null) { diff --git a/Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs b/Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs index 50c6fce21..0c39e342c 100644 --- a/Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs +++ b/Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs @@ -49,25 +49,11 @@ namespace VRM.RuntimeExporterSample return; } - // GLB形式でJSONを取得しParseします - var data = new GlbFileParser(path).Parse(); - // VRM extension を parse します - var vrm = new VRMData(data); - using (var context = new VRMImporterContext(vrm)) - { + var loaded = await VrmUtility.LoadAsync(path); - // metaを取得(todo: thumbnailテクスチャのロード) - var meta = await context.ReadMetaAsync(); - Debug.LogFormat("meta: title:{0}", meta.Title); - - // ParseしたJSONをシーンオブジェクトに変換していく - var loaded = await context.LoadAsync(); - - loaded.ShowMeshes(); - loaded.EnableUpdateWhenOffscreen(); - - OnLoaded(loaded.gameObject); - } + loaded.ShowMeshes(); + loaded.EnableUpdateWhenOffscreen(); + OnLoaded(loaded.gameObject); } void OnLoaded(GameObject go) From 6dc449a61d3f5d1c154d8fd3ec3e33d3ec9d43a4 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 25 Jan 2022 20:02:15 +0900 Subject: [PATCH 08/12] use VrmUtility --- .../FirstPersonSample/VRMRuntimeLoader.cs | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/Assets/VRM_Samples/FirstPersonSample/VRMRuntimeLoader.cs b/Assets/VRM_Samples/FirstPersonSample/VRMRuntimeLoader.cs index 57dcb479e..ed4c36a07 100644 --- a/Assets/VRM_Samples/FirstPersonSample/VRMRuntimeLoader.cs +++ b/Assets/VRM_Samples/FirstPersonSample/VRMRuntimeLoader.cs @@ -85,27 +85,8 @@ namespace VRM.FirstPersonSample // GLB形式でJSONを取得しParseします // VRM extension を parse します - var data = new GlbFileParser(path).Parse(); - var vrm = new VRMData(data); - using (var context = new VRMImporterContext(vrm)) - { - // metaを取得(todo: thumbnailテクスチャのロード) - var meta = await context.ReadMetaAsync(); - Debug.LogFormat("meta: title:{0}", meta.Title); - - // ParseしたJSONをシーンオブジェクトに変換していく - var loaded = default(RuntimeGltfInstance); - if (m_loadAsync) - { - loaded = await context.LoadAsync(); - } - else - { - loaded = context.Load(); - } - - OnLoaded(loaded); - } + var loaded = await VrmUtility.LoadAsync(path); + OnLoaded(loaded); } /// From f966abb9e4d8beb2bd661822cf4d3c00a12fa041 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 26 Jan 2022 12:49:53 +0900 Subject: [PATCH 09/12] =?UTF-8?q?NativeArray=3F=20=E3=82=84=E3=82=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * コンストラクターで初期化 * Dispose上の方 --- Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs | 56 ++++++++----------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs index fdddbf823..287df0e95 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfData.cs @@ -39,32 +39,12 @@ namespace UniGLTF /// public glTF GLTF { get; } - public NativeArray? _bin; - /// /// BIN chunk /// > This chunk MUST be the second chunk of the Binary glTF asset /// /// - public NativeArray Bin - { - get - { - if (!_bin.HasValue) - { - // init - if (Chunks != null) - { - if (Chunks.Count >= 2) - { - _bin = CreateNativeArray(Chunks[1].Bytes); - } - } - - } - return _bin.GetValueOrDefault(); - } - } + public NativeArray Bin { get; } /// /// Migration Flags used by ImporterContext @@ -83,6 +63,8 @@ namespace UniGLTF /// Dictionary> _UriCache = new Dictionary>(); + List m_disposables = new List(); + public GltfData(string targetPath, string json, glTF gltf, IReadOnlyList chunks, IStorage storage, MigrationFlags migrationFlags) { TargetPath = targetPath; @@ -91,6 +73,25 @@ namespace UniGLTF Chunks = chunks; _storage = storage; MigrationFlags = migrationFlags; + + // init + if (Chunks != null) + { + if (Chunks.Count >= 2) + { + Bin = CreateNativeArray(Chunks[1].Bytes); + } + } + } + + public void Dispose() + { + foreach (var disposable in m_disposables) + { + disposable.Dispose(); + } + m_disposables.Clear(); + _UriCache.Clear(); } public static GltfData CreateFromExportForTest(ExportingGltfData data) @@ -403,18 +404,5 @@ namespace UniGLTF array.CopyFrom(data); return array; } - - List m_disposables = new List(); - - public void Dispose() - { - foreach (var disposable in m_disposables) - { - disposable.Dispose(); - } - m_disposables.Clear(); - _UriCache.Clear(); - _bin = null; - } } } From 163308e2f48a52be9645ac24167cd67d256fbce9 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 26 Jan 2022 13:08:32 +0900 Subject: [PATCH 10/12] =?UTF-8?q?Dispose=20=E4=B8=8A=E3=81=AE=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/VRM10/Runtime/IO/Vrm10Data.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Assets/VRM10/Runtime/IO/Vrm10Data.cs b/Assets/VRM10/Runtime/IO/Vrm10Data.cs index 27353acc7..07a930b32 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Data.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Data.cs @@ -52,6 +52,11 @@ namespace UniVRM10 MigratedBytes = migratedBytes; } + public void Dispose() + { + Data.Dispose(); + } + public static bool TryParseOrMigrate(string path, bool doMigrate, out Vrm10Data result) { return TryParseOrMigrate(path, File.ReadAllBytes(path), doMigrate, out result); @@ -161,10 +166,5 @@ namespace UniVRM10 } } } - - public void Dispose() - { - Data.Dispose(); - } } } From 62356cb57efe6e89127e102a77af85ee1e1630a0 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 26 Jan 2022 14:17:59 +0900 Subject: [PATCH 11/12] =?UTF-8?q?Test=20=E3=81=AE=20Dispose=20=E3=81=8C?= =?UTF-8?q?=E8=B6=B3=E3=82=8A=E3=81=AA=E3=81=84=E3=81=A8=E3=81=93=E3=82=8D?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs | 44 ++++++++++---------- Assets/UniGLTF/Tests/UniGLTF/TextureTests.cs | 5 +-- Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs | 4 +- Assets/VRM/Tests/VrmDividedMeshTests.cs | 14 ++++--- Assets/VRM10/Tests/ApiSampleTests.cs | 14 ++++--- Assets/VRM10/Tests/MigrationTests.cs | 3 +- 6 files changed, 43 insertions(+), 41 deletions(-) diff --git a/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs b/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs index 0337f0bd8..41f2c97fa 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs @@ -137,30 +137,32 @@ namespace UniGLTF : MeshExporter_SharedVertexBuffer.Export(data, unityMesh, Materials, axisInverter, meshExportSettings) ; - var parsed = GltfData.CreateFromGltfDataForTest(data.GLTF, data.BinBytes); - + using (var parsed = GltfData.CreateFromGltfDataForTest(data.GLTF, data.BinBytes)) { - var indices = parsed.GetIndices(gltfMesh.primitives[0].indices); - Assert.AreEqual(0, indices[0]); - Assert.AreEqual(1, indices[1]); - Assert.AreEqual(5, indices[2]); - Assert.AreEqual(5, indices[3]); - Assert.AreEqual(1, indices[4]); - Assert.AreEqual(4, indices[5]); - } - { - var indices = parsed.GetIndices(gltfMesh.primitives[1].indices); - Assert.AreEqual(1, indices[0]); - Assert.AreEqual(2, indices[1]); - Assert.AreEqual(4, indices[2]); - Assert.AreEqual(4, indices[3]); - Assert.AreEqual(2, indices[4]); - Assert.AreEqual(3, indices[5]); - } + { + var indices = parsed.GetIndices(gltfMesh.primitives[0].indices); + Assert.AreEqual(0, indices[0]); + Assert.AreEqual(1, indices[1]); + Assert.AreEqual(5, indices[2]); + Assert.AreEqual(5, indices[3]); + Assert.AreEqual(1, indices[4]); + Assert.AreEqual(4, indices[5]); + } - var positions = parsed.GetArrayFromAccessor(gltfMesh.primitives[0].attributes.POSITION); - Assert.AreEqual(6, positions.Length); + { + var indices = parsed.GetIndices(gltfMesh.primitives[1].indices); + Assert.AreEqual(1, indices[0]); + Assert.AreEqual(2, indices[1]); + Assert.AreEqual(4, indices[2]); + Assert.AreEqual(4, indices[3]); + Assert.AreEqual(2, indices[4]); + Assert.AreEqual(3, indices[5]); + } + + var positions = parsed.GetArrayFromAccessor(gltfMesh.primitives[0].attributes.POSITION); + Assert.AreEqual(6, positions.Length); + } } [Test] diff --git a/Assets/UniGLTF/Tests/UniGLTF/TextureTests.cs b/Assets/UniGLTF/Tests/UniGLTF/TextureTests.cs index 00baf6061..6f8e6ba84 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/TextureTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/TextureTests.cs @@ -88,10 +88,7 @@ namespace UniGLTF return; } - // parse - var data = new GlbFileParser(path.FullName).Parse(); - - // load + using (var data = new GlbFileParser(path.FullName).Parse()) using (var context = new ImporterContext(data)) { var instance = context.Load(); diff --git a/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs b/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs index 0a90b7d38..a0392b6a9 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs @@ -115,9 +115,7 @@ namespace UniGLTF } // parse - var parsed = GltfData.CreateFromExportForTest(data); - - // import + using (var parsed = GltfData.CreateFromExportForTest(data)) using (var context = new ImporterContext(parsed)) using (var loaded = context.Load()) { diff --git a/Assets/VRM/Tests/VrmDividedMeshTests.cs b/Assets/VRM/Tests/VrmDividedMeshTests.cs index 2903d7d38..f23744e49 100644 --- a/Assets/VRM/Tests/VrmDividedMeshTests.cs +++ b/Assets/VRM/Tests/VrmDividedMeshTests.cs @@ -21,13 +21,15 @@ namespace VRM static GameObject Load(byte[] bytes, string path) { - var gltf = new GlbLowLevelParser(path, bytes).Parse(); - var data = new VRMData(gltf); - using (var loader = new VRMImporterContext(data)) + using (var gltf = new GlbLowLevelParser(path, bytes).Parse()) { - var loaded = loader.Load(); - loaded.ShowMeshes(); - return loaded.gameObject; + var data = new VRMData(gltf); + using (var loader = new VRMImporterContext(data)) + { + var loaded = loader.Load(); + loaded.ShowMeshes(); + return loaded.gameObject; + } } } diff --git a/Assets/VRM10/Tests/ApiSampleTests.cs b/Assets/VRM10/Tests/ApiSampleTests.cs index 08a8b8a67..9ac34e0dd 100644 --- a/Assets/VRM10/Tests/ApiSampleTests.cs +++ b/Assets/VRM10/Tests/ApiSampleTests.cs @@ -40,14 +40,16 @@ namespace UniVRM10.Test Debug.Log($"load: {path}"); Assert.IsTrue(Vrm10Data.TryParseOrMigrate(path, true, out Vrm10Data result)); + using (result) + { + var go = BuildGameObject(result, true); + Debug.Log(go); - var go = BuildGameObject(result, true); - Debug.Log(go); + // export + var vrmBytes = Vrm10Exporter.Export(go, new EditorTextureSerializer()); - // export - var vrmBytes = Vrm10Exporter.Export(go, new EditorTextureSerializer()); - - Debug.Log($"export {vrmBytes.Length} bytes"); + Debug.Log($"export {vrmBytes.Length} bytes"); + } } } } diff --git a/Assets/VRM10/Tests/MigrationTests.cs b/Assets/VRM10/Tests/MigrationTests.cs index 4a491433d..1a3adb2a4 100644 --- a/Assets/VRM10/Tests/MigrationTests.cs +++ b/Assets/VRM10/Tests/MigrationTests.cs @@ -198,7 +198,7 @@ namespace UniVRM10 { try { - Vrm10Data.TryParseOrMigrate(gltf.FullName, true, out Vrm10Data vrm); + Assert.True(Vrm10Data.TryParseOrMigrate(gltf.FullName, true, out Vrm10Data vrm)); using (vrm) using (var loader = new Vrm10Importer(vrm)) { @@ -263,6 +263,7 @@ namespace UniVRM10 public void MigrateMeta() { Assert.True(Vrm10Data.TryParseOrMigrate(AliciaPath, true, out Vrm10Data vrm)); + vrm.Dispose(); } } } From 33384b5557250dc524e56765070ddd3291939dbb Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 26 Jan 2022 14:19:16 +0900 Subject: [PATCH 12/12] =?UTF-8?q?vrm-1.0=20=E3=81=AE=E3=83=9E=E3=82=A4?= =?UTF-8?q?=E3=82=B0=E3=83=AC=E3=83=BC=E3=83=88=E7=B5=A1=E3=81=BF=E3=81=AE?= =?UTF-8?q?=20Dispose=20=E3=81=AF=E5=88=A5=20Issue=20=E3=81=A7=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=81=97=E3=81=BE=E3=81=99=E3=80=82API=20=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E3=81=8C=E5=BF=85=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/VRM10/Runtime/IO/Vrm10Data.cs | 103 +++++++++++++-------------- 1 file changed, 50 insertions(+), 53 deletions(-) diff --git a/Assets/VRM10/Runtime/IO/Vrm10Data.cs b/Assets/VRM10/Runtime/IO/Vrm10Data.cs index 07a930b32..020f492c8 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Data.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Data.cs @@ -91,79 +91,76 @@ namespace UniVRM10 // try migrateion byte[] migrated = default; Migration.Vrm0Meta oldMeta = default; - using (data) + try { + var json = data.Json.ParseAsJson(); try { - var json = data.Json.ParseAsJson(); - try + if (!json.TryGet("extensions", out JsonNode extensions)) { - if (!json.TryGet("extensions", out JsonNode extensions)) - { - result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no extensions"); - return false; - } - if (!extensions.TryGet("VRM", out JsonNode vrm0)) - { - result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no vrm0"); - return false; - } - } - catch (Exception ex) - { - result = new Vrm10Data(default, default, Vrm10FileType.Other, $"error: {ex}"); + result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no extensions"); return false; } - - if (!doMigrate) + if (!extensions.TryGet("VRM", out JsonNode vrm0)) { - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: not migrated"); + result = new Vrm10Data(default, default, Vrm10FileType.Other, "gltf: no vrm0"); return false; } - - migrated = MigrationVrm.Migrate(data); - if (migrated == null) - { - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: cannot migrate"); - return false; - } - - oldMeta = Migration.Vrm0Meta.FromJsonBytes(json); } catch (Exception ex) { - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, $"vrm0: migration error: {ex}"); + result = new Vrm10Data(default, default, Vrm10FileType.Other, $"error: {ex}"); return false; } + if (!doMigrate) { - var migratedData = new GlbLowLevelParser(data.TargetPath, migrated).Parse(); - if (UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(migratedData.GLTF.extensions, out VRMC_vrm vrm)) + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: not migrated"); + return false; + } + + migrated = MigrationVrm.Migrate(data); + if (migrated == null) + { + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: cannot migrate"); + return false; + } + + oldMeta = Migration.Vrm0Meta.FromJsonBytes(json); + } + catch (Exception ex) + { + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, $"vrm0: migration error: {ex}"); + return false; + } + + { + var migratedData = new GlbLowLevelParser(data.TargetPath, migrated).Parse(); + if (UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(migratedData.GLTF.extensions, out VRMC_vrm vrm)) + { + // success + if (oldMeta == null) { - // success - if (oldMeta == null) - { - throw new NullReferenceException("oldMeta"); - } - byte[] migratedBytes = null; - if (VRMShaders.Symbols.VRM_DEVELOP) - { - // 右手左手座標変換でバッファが破壊的変更されるので、コピーを作っている - migratedBytes = migrated.Select(x => x).ToArray(); - } - - result = new Vrm10Data(migratedData, vrm, Vrm10FileType.Vrm0, - message: "vrm0: migrated", - oldMeta: oldMeta, - migratedBytes: migratedBytes - ); - - return true; + throw new NullReferenceException("oldMeta"); + } + byte[] migratedBytes = null; + if (VRMShaders.Symbols.VRM_DEVELOP) + { + // 右手左手座標変換でバッファが破壊的変更されるので、コピーを作っている + migratedBytes = migrated.Select(x => x).ToArray(); } - result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: migrate but error ?"); - return false; + result = new Vrm10Data(migratedData, vrm, Vrm10FileType.Vrm0, + message: "vrm0: migrated", + oldMeta: oldMeta, + migratedBytes: migratedBytes + ); + + return true; } + + result = new Vrm10Data(default, default, Vrm10FileType.Vrm0, "vrm0: migrate but error ?"); + return false; } } }