diff --git a/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs b/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs index 96ce3084d..fb373bd69 100644 --- a/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs +++ b/spine-unity/Assets/spine-unity/Mesh Generation/SpineMesh.cs @@ -38,7 +38,6 @@ using System.Collections.Generic; namespace Spine.Unity { public static class SpineMesh { - internal const HideFlags MeshHideflags = HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor; /// Factory method for creating a new mesh for use in Spine components. This can be called in field initializers. @@ -132,6 +131,8 @@ namespace Spine.Unity { [NonSerialized] ExposedList uv3; #endregion + public int VertexCount { get { return vertexBuffer.Count; } } + #region Step 1 : Generate Instructions public static void GenerateSingleSubmeshInstruction (SkeletonRendererInstruction instructionOutput, Skeleton skeleton, Material material) { ExposedList drawOrder = skeleton.drawOrder; @@ -295,7 +296,7 @@ namespace Spine.Unity { } if (noRender) { - if (current.forceSeparate && current.rawVertexCount > 0 && generateMeshOverride) { + if (current.forceSeparate && generateMeshOverride && current.rawVertexCount > 0) { { // Add current.endSlot = i; current.preActiveClippingSlotSource = lastPreActiveClipping; @@ -305,6 +306,7 @@ namespace Spine.Unity { submeshIndex++; } + current.startSlot = i; lastPreActiveClipping = clippingAttachmentSource; #if SPINE_TRIANGLECHECK @@ -327,7 +329,7 @@ namespace Spine.Unity { Material material = (rendererObject.GetType() == typeof(Material)) ? (Material)rendererObject : (Material)((AtlasRegion)rendererObject).page.rendererObject; #endif - if (current.rawVertexCount > 0 && (current.forceSeparate || !System.Object.ReferenceEquals(current.material, material))) { // Material changed. Add the previous submesh. + if (current.forceSeparate || (current.rawVertexCount > 0 && !System.Object.ReferenceEquals(current.material, material))) { // Material changed. Add the previous submesh. { // Add current.endSlot = i; current.preActiveClippingSlotSource = lastPreActiveClipping; diff --git a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs index 4f52f0e42..e89f2c5c1 100644 --- a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs +++ b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/SkeletonPartsRenderer.cs @@ -104,12 +104,18 @@ namespace Spine.Unity.Modules { // STEP 3: modify mesh. var mesh = smartMesh.mesh; - meshGenerator.FillVertexData(mesh); - if (updateTriangles) { - meshGenerator.FillTriangles(mesh); - meshRenderer.sharedMaterials = buffers.GetUpdatedShaderdMaterialsArray(); - } else if (buffers.MaterialsChangedInLastUpdate()) { - meshRenderer.sharedMaterials = buffers.GetUpdatedShaderdMaterialsArray(); + + if (meshGenerator.VertexCount <= 0) { // Clear an empty mesh + updateTriangles = false; + mesh.Clear(); + } else { + meshGenerator.FillVertexData(mesh); + if (updateTriangles) { + meshGenerator.FillTriangles(mesh); + meshRenderer.sharedMaterials = buffers.GetUpdatedShaderdMaterialsArray(); + } else if (buffers.MaterialsChangedInLastUpdate()) { + meshRenderer.sharedMaterials = buffers.GetUpdatedShaderdMaterialsArray(); + } } meshFilter.sharedMesh = mesh;