diff --git a/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs b/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs index e764f4f4e8..de13764da5 100644 --- a/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs +++ b/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs @@ -89,7 +89,7 @@ public void Dispose() public static class ArrayExtensions { - public static int MarshalCoyTo(this ArraySegment src, T[] dst) where T : struct + public static int MarshalCopyTo(this ArraySegment src, T[] dst) where T : struct { var size = dst.Length * Marshal.SizeOf(typeof(T)); using (var pin = Pin.Create(dst)) @@ -114,6 +114,21 @@ public static T[] SelectInplace(this T[] src, Func pred) } return src; } + + public static void Copy(ArraySegment src, ArraySegment dst) + where TFrom: struct + where TTo : struct + { + var bytes = new byte[src.Count() * Marshal.SizeOf(typeof(TFrom))]; + using (var pin = Pin.Create(src)) + { + Marshal.Copy(pin.Ptr, bytes, 0, bytes.Length); + }; + using (var pin = Pin.Create(dst)) + { + Marshal.Copy(bytes, 0, pin.Ptr, bytes.Length); + }; + } } public static class ListExtensions diff --git a/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs.meta b/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs.meta index e6658a3ffb..5744a8da95 100644 --- a/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs.meta +++ b/Assets/VRM/UniGLTF/Scripts/Extensions/ArrayExtensions.cs.meta @@ -1,7 +1,5 @@ fileFormatVersion: 2 -guid: e843bb7270bc9f54f8495e1e35f82e8d -timeCreated: 1514252357 -licenseType: Free +guid: a942ac1d32b5c604988565d1d5442237 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM/UniGLTF/Scripts/Format/glTF.cs b/Assets/VRM/UniGLTF/Scripts/Format/glTF.cs index 17252adbbb..b1c68f9782 100644 --- a/Assets/VRM/UniGLTF/Scripts/Format/glTF.cs +++ b/Assets/VRM/UniGLTF/Scripts/Format/glTF.cs @@ -59,10 +59,9 @@ T[] GetAttrib(glTFAccessor accessor, glTFBufferView view) where T : struct T[] GetAttrib(int count, int byteOffset, glTFBufferView view) where T : struct { var attrib = new T[count]; - // var segment = buffers[view.buffer].GetBytes(); var bytes = new ArraySegment(segment.Array, segment.Offset + view.byteOffset + byteOffset, count * view.byteStride); - bytes.MarshalCoyTo(attrib); + bytes.MarshalCopyTo(attrib); return attrib; } @@ -166,35 +165,6 @@ public T[] GetArrayFromAccessor(int accessorIndex) where T : struct } return result; } - - public float[] GetArrayFromAccessorAsFloat(int accessorIndex) - { - var vertexAccessor = accessors[accessorIndex]; - - if (vertexAccessor.count <= 0) return new float[] { }; - - var bufferCount = vertexAccessor.count * vertexAccessor.TypeCount; - var result = (vertexAccessor.bufferView != -1) - ? GetAttrib(bufferCount, vertexAccessor.byteOffset, bufferViews[vertexAccessor.bufferView]) - : new float[bufferCount] - ; - - var sparse = vertexAccessor.sparse; - if (sparse != null && sparse.count > 0) - { - // override sparse values - var indices = _GetIndices(bufferViews[sparse.indices.bufferView], sparse.count, sparse.indices.byteOffset, sparse.indices.componentType); - var values = GetAttrib(sparse.count * vertexAccessor.TypeCount, sparse.values.byteOffset, bufferViews[sparse.values.bufferView]); - - var it = indices.GetEnumerator(); - for (int i = 0; i < sparse.count; ++i) - { - it.MoveNext(); - result[it.Current] = values[i]; - } - } - return result; - } #endregion [JsonSchema(MinItems = 1, ExplicitIgnorableItemLength = 0)] diff --git a/Assets/VRM/UniGLTF/Scripts/IO/AnimationImporter.cs b/Assets/VRM/UniGLTF/Scripts/IO/AnimationImporter.cs index e6e8e530e6..0af09dfd9a 100644 --- a/Assets/VRM/UniGLTF/Scripts/IO/AnimationImporter.cs +++ b/Assets/VRM/UniGLTF/Scripts/IO/AnimationImporter.cs @@ -186,7 +186,11 @@ public static List ImportAnimationClip(ImporterContext ctx) { var sampler = animation.samplers[channel.sampler]; var input = ctx.GLTF.GetArrayFromAccessor(sampler.input); - var output = ctx.GLTF.GetArrayFromAccessorAsFloat(sampler.output); + var outputVector = ctx.GLTF.GetArrayFromAccessor(sampler.output); + var output = new float[outputVector.Count() * 3]; + ArrayExtensions.Copy( + new ArraySegment(outputVector), + new ArraySegment(output)); AnimationImporter.SetAnimationCurve( clip, @@ -209,7 +213,11 @@ public static List ImportAnimationClip(ImporterContext ctx) { var sampler = animation.samplers[channel.sampler]; var input = ctx.GLTF.GetArrayFromAccessor(sampler.input); - var output = ctx.GLTF.GetArrayFromAccessorAsFloat(sampler.output); + var outputVector = ctx.GLTF.GetArrayFromAccessor(sampler.output); + var output = new float[outputVector.Count() * 4]; + ArrayExtensions.Copy( + new ArraySegment(outputVector), + new ArraySegment(output)); AnimationImporter.SetAnimationCurve( clip, @@ -235,7 +243,11 @@ public static List ImportAnimationClip(ImporterContext ctx) { var sampler = animation.samplers[channel.sampler]; var input = ctx.GLTF.GetArrayFromAccessor(sampler.input); - var output = ctx.GLTF.GetArrayFromAccessorAsFloat(sampler.output); + var outputVector = ctx.GLTF.GetArrayFromAccessor(sampler.output); + var output = new float[outputVector.Count() * 3]; + ArrayExtensions.Copy( + new ArraySegment(outputVector), + new ArraySegment(output)); AnimationImporter.SetAnimationCurve( clip, diff --git a/Assets/VRM/UniGLTF/Scripts/IO/BytesReader.cs b/Assets/VRM/UniGLTF/Scripts/IO/BytesReader.cs index 249c08671b..d3e8e58a1d 100644 --- a/Assets/VRM/UniGLTF/Scripts/IO/BytesReader.cs +++ b/Assets/VRM/UniGLTF/Scripts/IO/BytesReader.cs @@ -63,7 +63,7 @@ public int ReadInt32() public void ReadToArray(T[] dst) where T : struct { - var size = new ArraySegment(m_bytes, m_pos, m_bytes.Length - m_pos).MarshalCoyTo(dst); + var size = new ArraySegment(m_bytes, m_pos, m_bytes.Length - m_pos).MarshalCopyTo(dst); m_pos += size; } diff --git a/Assets/VRM/UniGLTF/Scripts/IO/ImporterContext.cs b/Assets/VRM/UniGLTF/Scripts/IO/ImporterContext.cs index 149c6c03c5..4b8ad2a3ef 100644 --- a/Assets/VRM/UniGLTF/Scripts/IO/ImporterContext.cs +++ b/Assets/VRM/UniGLTF/Scripts/IO/ImporterContext.cs @@ -649,9 +649,9 @@ IEnumerator LoadNodes() { using (MeasureTime("LoadNodes")) { - foreach (var x in GLTF.nodes) + for (int i = 0; i < GLTF.nodes.Count; i++) { - Nodes.Add(NodeImporter.ImportNode(x).transform); + Nodes.Add(NodeImporter.ImportNode(GLTF.nodes[i], i).transform); } } diff --git a/Assets/VRM/UniGLTF/Scripts/IO/NodeImporter.cs b/Assets/VRM/UniGLTF/Scripts/IO/NodeImporter.cs index 7b8b245b69..b0782b1fac 100644 --- a/Assets/VRM/UniGLTF/Scripts/IO/NodeImporter.cs +++ b/Assets/VRM/UniGLTF/Scripts/IO/NodeImporter.cs @@ -8,7 +8,7 @@ namespace UniGLTF { public static class NodeImporter { - public static GameObject ImportNode(glTFNode node) + public static GameObject ImportNode(glTFNode node, int nodeIndex) { var nodeName = node.name; if (!string.IsNullOrEmpty(nodeName) && nodeName.Contains("/")) @@ -16,6 +16,10 @@ public static GameObject ImportNode(glTFNode node) Debug.LogWarningFormat("node {0} contains /. replace _", node.name); nodeName = nodeName.Replace("/", "_"); } + if(string.IsNullOrEmpty(nodeName)) + { + nodeName = string.Format("nodeIndex_{0}", nodeIndex); + } var go = new GameObject(nodeName); //