From 009929bbc9a88a68b6d539cb3a8fc8102ec7ce98 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 6 Feb 2019 19:13:03 +0100 Subject: [PATCH] [unity] Fixed SkeletonPartsRenderer mesh tangent error. Also fixed another potential size mismatch at mesh normals or tangents vs vertices. Closes #1265. --- .../spine-unity/Mesh Generation/SpineMesh.cs | 25 +++++++++---------- .../SkeletonPartsRenderer.cs | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Mesh Generation/SpineMesh.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Mesh Generation/SpineMesh.cs index 67a69c2b2..4108eef62 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Mesh Generation/SpineMesh.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Mesh Generation/SpineMesh.cs @@ -1009,19 +1009,18 @@ namespace Spine.Unity { } { - int vertexCount = this.vertexBuffer.Count; if (settings.addNormals) { int oldLength = 0; if (normals == null) - normals = new Vector3[vertexCount]; + normals = new Vector3[vbiLength]; else oldLength = normals.Length; - if (oldLength < vertexCount) { - Array.Resize(ref this.normals, vertexCount); + if (oldLength != vbiLength) { + Array.Resize(ref this.normals, vbiLength); var localNormals = this.normals; - for (int i = oldLength; i < vertexCount; i++) localNormals[i] = Vector3.back; + for (int i = oldLength; i < vbiLength; i++) localNormals[i] = Vector3.back; } mesh.normals = this.normals; } @@ -1029,7 +1028,7 @@ namespace Spine.Unity { if (settings.tintBlack) { if (uv2 != null) { // Sometimes, the vertex buffer becomes smaller. We need to trim the size of the tint black buffers to match. - if (vbiLength > uv2.Items.Length) { + if (vbiLength != uv2.Items.Length) { Array.Resize(ref uv2.Items, vbiLength); Array.Resize(ref uv3.Items, vbiLength); uv2.Count = uv3.Count = vbiLength; @@ -1049,7 +1048,7 @@ namespace Spine.Unity { var vbi = vertexBuffer.Items; var ubi = uvBuffer.Items; - MeshGenerator.SolveTangents2DEnsureSize(ref this.tangents, ref this.tempTanBuffer, vertexCount); + MeshGenerator.SolveTangents2DEnsureSize(ref this.tangents, ref this.tempTanBuffer, vertexCount, vbi.Length); for (int i = 0; i < submeshCount; i++) { var submesh = sbi[i].Items; int triangleCount = sbi[i].Count; @@ -1115,9 +1114,9 @@ namespace Spine.Unity { if (uv2 != null) uv2.TrimExcess(); if (uv3 != null) uv3.TrimExcess(); - int count = vertexBuffer.Count; - if (normals != null) Array.Resize(ref normals, count); - if (tangents != null) Array.Resize(ref tangents, count); + int vbiLength = vertexBuffer.Items.Length; + if (normals != null) Array.Resize(ref normals, vbiLength); + if (tangents != null) Array.Resize(ref tangents, vbiLength); } #region TangentSolver2D @@ -1127,9 +1126,9 @@ namespace Spine.Unity { /// Eventual Vector4[] tangent buffer to assign to Mesh.tangents. /// Temporary Vector2 buffer for calculating directions. /// Number of vertices that require tangents (or the size of the vertex array) - internal static void SolveTangents2DEnsureSize (ref Vector4[] tangentBuffer, ref Vector2[] tempTanBuffer, int vertexCount) { - if (tangentBuffer == null || tangentBuffer.Length < vertexCount) - tangentBuffer = new Vector4[vertexCount]; + internal static void SolveTangents2DEnsureSize (ref Vector4[] tangentBuffer, ref Vector2[] tempTanBuffer, int vertexCount, int vertexBufferLength) { + if (tangentBuffer == null || tangentBuffer.Length != vertexBufferLength) + tangentBuffer = new Vector4[vertexBufferLength]; if (tempTanBuffer == null || tempTanBuffer.Length < vertexCount * 2) tempTanBuffer = new Vector2[vertexCount * 2]; // two arrays in one. diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs index 3af331ca6..64a9a5a4b 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs @@ -116,8 +116,8 @@ namespace Spine.Unity.Modules { } else if (buffers.MaterialsChangedInLastUpdate()) { meshRenderer.sharedMaterials = buffers.GetUpdatedSharedMaterialsArray(); } + meshGenerator.FillLateVertexData(mesh); } - meshGenerator.FillLateVertexData(mesh); meshFilter.sharedMesh = mesh; smartMesh.instructionUsed.Set(currentInstructions);