diff --git a/Assets/UniGLTF/Runtime/Extensions/UnityExtensions.cs b/Assets/UniGLTF/Runtime/Extensions/UnityExtensions.cs index d92808d9b..4da051b41 100644 --- a/Assets/UniGLTF/Runtime/Extensions/UnityExtensions.cs +++ b/Assets/UniGLTF/Runtime/Extensions/UnityExtensions.cs @@ -30,12 +30,31 @@ namespace UniGLTF public BlendShape(string name) { - Name = name; + Positions = new List(); + Normals = new List(); + Tangents = new List(); } - public List Positions = new List(); - public List Normals = new List(); - public List Tangents = new List(); + public BlendShape(string name, int vertexCount, bool hasPositions, bool hasNormals, bool hasTangents) + { + Name = name; + if (hasPositions) + { + Positions = new List(vertexCount); + } + if (hasNormals) + { + Normals = new List(vertexCount); + } + if (hasTangents) + { + Tangents = new List(vertexCount); + } + } + + public List Positions { get; private set; } + public List Normals { get; private set; } + public List Tangents { get; private set; } } public static class UnityExtensions diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs index af6fef0a8..3b5f9c050 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshContext.cs @@ -414,35 +414,38 @@ namespace UniGLTF { for (int i = 0; i < primitives.targets.Count; ++i) { - var blendShape = new BlendShape(i.ToString()); + var primTarget = primitives.targets[i]; + var blendShape = new BlendShape(i.ToString(), positions.Length, primTarget.POSITION != -1, primTarget.NORMAL != -1, primTarget.TANGENT != -1); _blendShapes.Add(blendShape); - var primTarget = primitives.targets[i]; if (primTarget.POSITION != -1) { - blendShape.Positions = data.GetArrayFromAccessor(primTarget.POSITION).ToList(); + var morphPositions = data.GetArrayFromAccessor(primTarget.POSITION); + blendShape.Positions.Capacity = morphPositions.Length; for (var j = 0; j < blendShape.Positions.Count; ++j) { - blendShape.Positions[j] = inverter.InvertVector3(blendShape.Positions[j]); + blendShape.Positions.Add(inverter.InvertVector3(morphPositions[j])); } } if (primTarget.NORMAL != -1) { - blendShape.Normals = data.GetArrayFromAccessor(primTarget.NORMAL).ToList(); + var morphNormals = data.GetArrayFromAccessor(primTarget.NORMAL); + blendShape.Normals.Capacity = morphNormals.Length; for (var j = 0; j < blendShape.Positions.Count; ++j) { - blendShape.Normals[j] = inverter.InvertVector3(blendShape.Normals[j]); + blendShape.Normals.Add(inverter.InvertVector3(morphNormals[j])); } } if (primTarget.TANGENT != -1) { - blendShape.Tangents = data.GetArrayFromAccessor(primTarget.TANGENT).ToList(); + var morphTangents = data.GetArrayFromAccessor(primTarget.TANGENT); + blendShape.Tangents.Capacity = morphTangents.Length; for (var j = 0; j < blendShape.Tangents.Count; ++j) { - blendShape.Tangents[j] = inverter.InvertVector3(blendShape.Tangents[j]); + blendShape.Tangents.Add(inverter.InvertVector3(morphTangents[j])); } } }