diff --git a/spine-unity/Assets/spine-unity/Components/SkeletonRenderer.cs b/spine-unity/Assets/spine-unity/Components/SkeletonRenderer.cs index fbce68644..811cfcb92 100644 --- a/spine-unity/Assets/spine-unity/Components/SkeletonRenderer.cs +++ b/spine-unity/Assets/spine-unity/Components/SkeletonRenderer.cs @@ -317,6 +317,7 @@ namespace Spine.Unity { meshRenderer.sharedMaterials = rendererBuffers.GetUpdatedSharedMaterialsArray(); } + meshGenerator.FillLateVertexData(currentMesh); // STEP 4. The UnityEngine.Mesh is ready. Set it as the MeshFilter's mesh. Store the instructions used for that mesh. =========== meshFilter.sharedMesh = currentMesh; diff --git a/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs b/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs index 40be3a896..1cb0e0988 100644 --- a/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs +++ b/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs @@ -50,13 +50,13 @@ namespace Spine.Unity { } } - /// Instructions for how to generate a mesh or submesh out of a range of slots in a given skeleton. + /// Instructions for how to generate a mesh or submesh: "Render this skeleton's slots: start slot, up to but not including endSlot, using this material." public struct SubmeshInstruction { public Skeleton skeleton; public int startSlot; public int endSlot; - public Material material; + public bool forceSeparate; public int preActiveClippingSlotSource; @@ -206,35 +206,35 @@ namespace Spine.Unity { bool skeletonHasClipping = false; var drawOrderItems = drawOrder.Items; for (int i = 0; i < drawOrderCount; i++) { - Slot slot = drawOrderItems[i]; - Attachment attachment = slot.attachment; + Slot slot = drawOrderItems[i]; + Attachment attachment = slot.attachment; - workingAttachmentsItems[i] = attachment; - int attachmentTriangleCount; - int attachmentVertexCount; + workingAttachmentsItems[i] = attachment; + int attachmentTriangleCount; + int attachmentVertexCount; - var regionAttachment = attachment as RegionAttachment; - if (regionAttachment != null) { - attachmentVertexCount = 4; - attachmentTriangleCount = 6; - } else { - var meshAttachment = attachment as MeshAttachment; - if (meshAttachment != null) { - attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; - attachmentTriangleCount = meshAttachment.triangles.Length; - } else { - var clippingAttachment = attachment as ClippingAttachment; - if (clippingAttachment != null) { - current.hasClipping = true; - skeletonHasClipping = true; - } - attachmentVertexCount = 0; - attachmentTriangleCount = 0; - } - } - current.rawTriangleCount += attachmentTriangleCount; - current.rawVertexCount += attachmentVertexCount; - totalRawVertexCount += attachmentVertexCount; + var regionAttachment = attachment as RegionAttachment; + if (regionAttachment != null) { + attachmentVertexCount = 4; + attachmentTriangleCount = 6; + } else { + var meshAttachment = attachment as MeshAttachment; + if (meshAttachment != null) { + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; + attachmentTriangleCount = meshAttachment.triangles.Length; + } else { + var clippingAttachment = attachment as ClippingAttachment; + if (clippingAttachment != null) { + current.hasClipping = true; + skeletonHasClipping = true; + } + attachmentVertexCount = 0; + attachmentTriangleCount = 0; + } + } + current.rawTriangleCount += attachmentTriangleCount; + current.rawVertexCount += attachmentVertexCount; + totalRawVertexCount += attachmentVertexCount; } @@ -448,9 +448,9 @@ namespace Spine.Unity { meshBoundsThickness = 0f; } - submeshes.Count = 1; - submeshes.Items[0].Clear(false); submeshIndex = 0; + submeshes.Count = 1; + //submeshes.Items[0].Clear(false); } public void AddSubmesh (SubmeshInstruction instruction, bool updateTriangles = true) { @@ -500,7 +500,7 @@ namespace Spine.Unity { int attachmentIndexCount; Color c = default(Color); - + // Identify and prepare values. var region = attachment as RegionAttachment; if (region != null) { @@ -1020,18 +1020,26 @@ namespace Spine.Unity { if (settings.tintBlack) { mesh.uv2 = this.uv2.Items; mesh.uv3 = this.uv3.Items; - } + } + } + } - if (settings.calculateTangents) { - MeshGenerator.SolveTangents2DEnsureSize(ref this.tangents, ref this.tempTanBuffer, vertexCount); - for (int i = 0; i < submeshCount; i++) { - var submesh = sbi[i].Items; - int triangleCount = sbi[i].Count; - MeshGenerator.SolveTangents2DTriangles(this.tempTanBuffer, submesh, triangleCount, vbi, ubi, vertexCount); - } - MeshGenerator.SolveTangents2DBuffer(this.tangents, this.tempTanBuffer, vertexCount); - mesh.tangents = this.tangents; + public void FillLateVertexData (Mesh mesh) { + if (settings.calculateTangents) { + int vertexCount = this.vertexBuffer.Count; + var sbi = submeshes.Items; + int submeshCount = submeshes.Count; + var vbi = vertexBuffer.Items; + var ubi = uvBuffer.Items; + + MeshGenerator.SolveTangents2DEnsureSize(ref this.tangents, ref this.tempTanBuffer, vertexCount); + for (int i = 0; i < submeshCount; i++) { + var submesh = sbi[i].Items; + int triangleCount = sbi[i].Count; + MeshGenerator.SolveTangents2DTriangles(this.tempTanBuffer, submesh, triangleCount, vbi, ubi, vertexCount); } + MeshGenerator.SolveTangents2DBuffer(this.tangents, this.tempTanBuffer, vertexCount); + mesh.tangents = this.tangents; } } diff --git a/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs b/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs index 3e04344b0..622f21c15 100644 --- a/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs +++ b/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs @@ -287,6 +287,7 @@ namespace Spine.Unity { var mesh = smartMesh.mesh; meshGenerator.FillVertexData(mesh); if (updateTriangles) meshGenerator.FillTrianglesSingle(mesh); + meshGenerator.FillLateVertexData(mesh); canvasRenderer.SetMesh(mesh); smartMesh.instructionUsed.Set(currentInstructions); diff --git a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs index f1fc26685..6660bea93 100644 --- a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs +++ b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs @@ -117,6 +117,7 @@ namespace Spine.Unity.Modules { meshRenderer.sharedMaterials = buffers.GetUpdatedSharedMaterialsArray(); } } + meshGenerator.FillLateVertexData(mesh); meshFilter.sharedMesh = mesh; smartMesh.instructionUsed.Set(currentInstructions);