From 8ebf27de24b6886908c86d2afe9f1953eec05a09 Mon Sep 17 00:00:00 2001 From: Serhii Yolkin Date: Sat, 21 Nov 2015 17:56:14 +0100 Subject: [PATCH 1/2] some refactoring --- .../Assets/spine-unity/SkeletonRenderer.cs | 134 ++++++++---------- 1 file changed, 59 insertions(+), 75 deletions(-) diff --git a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs index 3a36eded3..7f1024216 100644 --- a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs +++ b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs @@ -71,7 +71,7 @@ public class SkeletonRenderer : MonoBehaviour { private readonly ExposedList submeshMaterials = new ExposedList(); private readonly ExposedList submeshes = new ExposedList(); private SkeletonUtilitySubmeshRenderer[] submeshRenderers; - private LastState lastState = new LastState(); + private MeshState meshState = new MeshState(); public virtual void Reset () { if (meshFilter != null) @@ -94,7 +94,7 @@ public class SkeletonRenderer : MonoBehaviour { DestroyImmediate(mesh2); } - lastState = new LastState(); + meshState = new MeshState(); mesh1 = null; mesh2 = null; vertices = null; @@ -193,15 +193,10 @@ public class SkeletonRenderer : MonoBehaviour { bool renderMeshes = this.renderMeshes; // Clear last state of attachments and submeshes - ExposedList attachmentsTriangleCountTemp = lastState.attachmentsTriangleCountTemp; - attachmentsTriangleCountTemp.GrowIfNeeded(drawOrderCount); - attachmentsTriangleCountTemp.Count = drawOrderCount; - ExposedList attachmentsFlipStateTemp = lastState.attachmentsFlipStateTemp; - attachmentsFlipStateTemp.GrowIfNeeded(drawOrderCount); - attachmentsFlipStateTemp.Count = drawOrderCount; + MeshState.SingleMeshState stateTemp = meshState.stateTemp; + stateTemp.UpdateDrawOrderCount(drawOrderCount); - ExposedList addSubmeshArgumentsTemp = lastState.addSubmeshArgumentsTemp; - addSubmeshArgumentsTemp.Clear(false); + stateTemp.addSubmeshArguments.Clear(false); for (int i = 0; i < drawOrderCount; i++) { Slot slot = drawOrder.Items[i]; Bone bone = slot.bone; @@ -214,9 +209,9 @@ public class SkeletonRenderer : MonoBehaviour { bool worldScaleIsSameSigns = (worldScaleXIsPositive && worldScaleYIsPositive) || (!worldScaleXIsPositive && !worldScaleYIsPositive); bool flip = frontFacing && ((bone.worldFlipX != bone.worldFlipY) == worldScaleIsSameSigns); - attachmentsFlipStateTemp.Items[i] = flip; + stateTemp.attachmentsFlipState.Items[i] = flip; - attachmentsTriangleCountTemp.Items[i] = -1; + stateTemp.attachmentsTriangleCount.Items[i] = -1; RegionAttachment regionAttachment = attachment as RegionAttachment; if (regionAttachment != null) { rendererObject = regionAttachment.RendererObject; @@ -249,8 +244,8 @@ public class SkeletonRenderer : MonoBehaviour { #endif if ((lastMaterial != null && lastMaterial.GetInstanceID() != material.GetInstanceID()) || (submeshSeparatorSlotsCount > 0 && submeshSeparatorSlots.Contains(slot))) { - addSubmeshArgumentsTemp.Add( - new LastState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, i, submeshTriangleCount, submeshFirstVertex, false) + stateTemp.addSubmeshArguments.Add( + new MeshState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, i, submeshTriangleCount, submeshFirstVertex, false) ); submeshTriangleCount = 0; submeshFirstVertex = vertexCount; @@ -261,17 +256,17 @@ public class SkeletonRenderer : MonoBehaviour { submeshTriangleCount += attachmentTriangleCount; vertexCount += attachmentVertexCount; - attachmentsTriangleCountTemp.Items[i] = attachmentTriangleCount; + stateTemp.attachmentsTriangleCount.Items[i] = attachmentTriangleCount; } - addSubmeshArgumentsTemp.Add( - new LastState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, drawOrderCount, submeshTriangleCount, submeshFirstVertex, true) + stateTemp.addSubmeshArguments.Add( + new MeshState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, drawOrderCount, submeshTriangleCount, submeshFirstVertex, true) ); - bool mustUpdateMeshStructure = CheckIfMustUpdateMeshStructure(attachmentsTriangleCountTemp, attachmentsFlipStateTemp, addSubmeshArgumentsTemp); + bool mustUpdateMeshStructure = CheckIfMustUpdateMeshStructure(stateTemp.attachmentsTriangleCount, stateTemp.attachmentsFlipState, stateTemp.addSubmeshArguments); if (mustUpdateMeshStructure) { submeshMaterials.Clear(); - for (int i = 0, n = addSubmeshArgumentsTemp.Count; i < n; i++) { - LastState.AddSubmeshArguments arguments = addSubmeshArgumentsTemp.Items[i]; + for (int i = 0, n = stateTemp.addSubmeshArguments.Count; i < n; i++) { + MeshState.AddSubmeshArguments arguments = stateTemp.addSubmeshArguments.Items[i]; AddSubmesh( arguments.material, arguments.startSlot, @@ -279,7 +274,7 @@ public class SkeletonRenderer : MonoBehaviour { arguments.triangleCount, arguments.firstVertex, arguments.lastSubmesh, - attachmentsFlipStateTemp + stateTemp.attachmentsFlipState ); } @@ -305,10 +300,10 @@ public class SkeletonRenderer : MonoBehaviour { } else { // Too many vertices, zero the extra. Vector3 zero = Vector3.zero; - for (int i = vertexCount, n = lastState.vertexCount; i < n; i++) + for (int i = vertexCount, n = meshState.vertexCount; i < n; i++) vertices[i] = zero; } - lastState.vertexCount = vertexCount; + meshState.vertexCount = vertexCount; // Setup mesh. float zSpacing = this.zSpacing; @@ -534,32 +529,20 @@ public class SkeletonRenderer : MonoBehaviour { } // Update previous state - ExposedList attachmentsTriangleCountCurrentMesh; - ExposedList attachmentsFlipStateCurrentMesh; - ExposedList addSubmeshArgumentsCurrentMesh; - if (useMesh1) { - attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh1; - addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh1; - attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh1; - lastState.immutableTrianglesMesh1 = immutableTriangles; - } else { - attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh2; - addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh2; - attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh2; - lastState.immutableTrianglesMesh2 = immutableTriangles; - } + MeshState.SingleMeshState currentMeshState = useMesh1 ? meshState.stateMesh1 : meshState.stateMesh2; + currentMeshState.immutableTriangles = immutableTriangles; - attachmentsTriangleCountCurrentMesh.GrowIfNeeded(attachmentsTriangleCountTemp.Capacity); - attachmentsTriangleCountCurrentMesh.Count = attachmentsTriangleCountTemp.Count; - attachmentsTriangleCountTemp.CopyTo(attachmentsTriangleCountCurrentMesh.Items, 0); + currentMeshState.attachmentsTriangleCount.GrowIfNeeded(stateTemp.attachmentsTriangleCount.Capacity); + currentMeshState.attachmentsTriangleCount.Count = stateTemp.attachmentsTriangleCount.Count; + stateTemp.attachmentsTriangleCount.CopyTo(currentMeshState.attachmentsTriangleCount.Items); - attachmentsFlipStateCurrentMesh.GrowIfNeeded(attachmentsFlipStateTemp.Capacity); - attachmentsFlipStateCurrentMesh.Count = attachmentsFlipStateTemp.Count; - attachmentsFlipStateTemp.CopyTo(attachmentsFlipStateCurrentMesh.Items, 0); + currentMeshState.attachmentsFlipState.GrowIfNeeded(stateTemp.attachmentsFlipState.Capacity); + currentMeshState.attachmentsFlipState.Count = stateTemp.attachmentsFlipState.Count; + stateTemp.attachmentsFlipState.CopyTo(currentMeshState.attachmentsFlipState.Items); - addSubmeshArgumentsCurrentMesh.GrowIfNeeded(addSubmeshArgumentsTemp.Count); - addSubmeshArgumentsCurrentMesh.Count = addSubmeshArgumentsTemp.Count; - addSubmeshArgumentsTemp.CopyTo(addSubmeshArgumentsCurrentMesh.Items); + currentMeshState.addSubmeshArguments.GrowIfNeeded(stateTemp.addSubmeshArguments.Capacity); + currentMeshState.addSubmeshArguments.Count = stateTemp.addSubmeshArguments.Count; + stateTemp.addSubmeshArguments.CopyTo(currentMeshState.addSubmeshArguments.Items); if (submeshRenderers.Length > 0) { for (int i = 0; i < submeshRenderers.Length; i++) { @@ -575,31 +558,25 @@ public class SkeletonRenderer : MonoBehaviour { useMesh1 = !useMesh1; } - private bool CheckIfMustUpdateMeshStructure (ExposedList attachmentsTriangleCountTemp, ExposedList attachmentsFlipStateTemp, ExposedList addSubmeshArgumentsTemp) { + private bool CheckIfMustUpdateMeshStructure (ExposedList attachmentsTriangleCountTemp, ExposedList attachmentsFlipStateTemp, ExposedList addSubmeshArgumentsTemp) { +#if UNITY_EDITOR + if (!Application.isPlaying) + return true; +#endif + // Check if any mesh settings were changed bool mustUpdateMeshStructure = - immutableTriangles != (useMesh1 ? lastState.immutableTrianglesMesh1 : lastState.immutableTrianglesMesh2); -#if UNITY_EDITOR - mustUpdateMeshStructure |= !Application.isPlaying; -#endif + immutableTriangles != (useMesh1 ? meshState.stateMesh1.immutableTriangles : meshState.stateMesh2.immutableTriangles); if (mustUpdateMeshStructure) return true; // Check if any attachments were enabled/disabled // or submesh structures has changed - ExposedList attachmentsTriangleCountCurrentMesh; - ExposedList attachmentsFlipStateCurrentMesh; - ExposedList addSubmeshArgumentsCurrentMesh; - if (useMesh1) { - attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh1; - addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh1; - attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh1; - } else { - attachmentsTriangleCountCurrentMesh = lastState.attachmentsTriangleCountMesh2; - addSubmeshArgumentsCurrentMesh = lastState.addSubmeshArgumentsMesh2; - attachmentsFlipStateCurrentMesh = lastState.attachmentsFlipStateMesh2; - } + MeshState.SingleMeshState currentMeshState = useMesh1 ? meshState.stateMesh1 : meshState.stateMesh2; + ExposedList attachmentsTriangleCountCurrentMesh = currentMeshState.attachmentsTriangleCount; + ExposedList addSubmeshArgumentsCurrentMesh = currentMeshState.addSubmeshArguments; + ExposedList attachmentsFlipStateCurrentMesh = currentMeshState.attachmentsFlipState; // Check attachments int attachmentCount = attachmentsTriangleCountTemp.Count; @@ -749,19 +726,26 @@ public class SkeletonRenderer : MonoBehaviour { } #endif - private class LastState { - public bool immutableTrianglesMesh1; - public bool immutableTrianglesMesh2; + private class MeshState { public int vertexCount; - public readonly ExposedList attachmentsFlipStateTemp = new ExposedList(); - public readonly ExposedList attachmentsFlipStateMesh1 = new ExposedList(); - public readonly ExposedList attachmentsFlipStateMesh2 = new ExposedList(); - public readonly ExposedList attachmentsTriangleCountTemp = new ExposedList(); - public readonly ExposedList attachmentsTriangleCountMesh1 = new ExposedList(); - public readonly ExposedList attachmentsTriangleCountMesh2 = new ExposedList(); - public readonly ExposedList addSubmeshArgumentsTemp = new ExposedList(); - public readonly ExposedList addSubmeshArgumentsMesh1 = new ExposedList(); - public readonly ExposedList addSubmeshArgumentsMesh2 = new ExposedList(); + public readonly SingleMeshState stateTemp = new SingleMeshState(); + public readonly SingleMeshState stateMesh1 = new SingleMeshState(); + public readonly SingleMeshState stateMesh2 = new SingleMeshState(); + + public class SingleMeshState { + public bool immutableTriangles; + public readonly ExposedList attachmentsFlipState = new ExposedList(); + public readonly ExposedList attachmentsTriangleCount = new ExposedList(); + public readonly ExposedList addSubmeshArguments = new ExposedList(); + + public void UpdateDrawOrderCount(int drawOrderCount) { + attachmentsFlipState.GrowIfNeeded(drawOrderCount); + attachmentsFlipState.Count = drawOrderCount; + + attachmentsTriangleCount.GrowIfNeeded(drawOrderCount); + attachmentsTriangleCount.Count = drawOrderCount; + } + } public struct AddSubmeshArguments { public Material material; From 3218c78239bd2f48f896020b68841c32ad929235 Mon Sep 17 00:00:00 2001 From: Serhii Yolkin Date: Sat, 21 Nov 2015 18:08:17 +0100 Subject: [PATCH 2/2] compare references to attachments instead of comparing attachment properties --- .../Assets/spine-unity/SkeletonRenderer.cs | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs index 7f1024216..de919317e 100644 --- a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs +++ b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs @@ -194,6 +194,7 @@ public class SkeletonRenderer : MonoBehaviour { // Clear last state of attachments and submeshes MeshState.SingleMeshState stateTemp = meshState.stateTemp; + stateTemp.attachments.Clear(true); stateTemp.UpdateDrawOrderCount(drawOrderCount); stateTemp.addSubmeshArguments.Clear(false); @@ -211,7 +212,7 @@ public class SkeletonRenderer : MonoBehaviour { bool flip = frontFacing && ((bone.worldFlipX != bone.worldFlipY) == worldScaleIsSameSigns); stateTemp.attachmentsFlipState.Items[i] = flip; - stateTemp.attachmentsTriangleCount.Items[i] = -1; + stateTemp.attachments.Items[i] = attachment; RegionAttachment regionAttachment = attachment as RegionAttachment; if (regionAttachment != null) { rendererObject = regionAttachment.RendererObject; @@ -255,14 +256,12 @@ public class SkeletonRenderer : MonoBehaviour { submeshTriangleCount += attachmentTriangleCount; vertexCount += attachmentVertexCount; - - stateTemp.attachmentsTriangleCount.Items[i] = attachmentTriangleCount; } stateTemp.addSubmeshArguments.Add( new MeshState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, drawOrderCount, submeshTriangleCount, submeshFirstVertex, true) ); - bool mustUpdateMeshStructure = CheckIfMustUpdateMeshStructure(stateTemp.attachmentsTriangleCount, stateTemp.attachmentsFlipState, stateTemp.addSubmeshArguments); + bool mustUpdateMeshStructure = CheckIfMustUpdateMeshStructure(stateTemp.attachments, stateTemp.attachmentsFlipState, stateTemp.addSubmeshArguments); if (mustUpdateMeshStructure) { submeshMaterials.Clear(); for (int i = 0, n = stateTemp.addSubmeshArguments.Count; i < n; i++) { @@ -532,9 +531,10 @@ public class SkeletonRenderer : MonoBehaviour { MeshState.SingleMeshState currentMeshState = useMesh1 ? meshState.stateMesh1 : meshState.stateMesh2; currentMeshState.immutableTriangles = immutableTriangles; - currentMeshState.attachmentsTriangleCount.GrowIfNeeded(stateTemp.attachmentsTriangleCount.Capacity); - currentMeshState.attachmentsTriangleCount.Count = stateTemp.attachmentsTriangleCount.Count; - stateTemp.attachmentsTriangleCount.CopyTo(currentMeshState.attachmentsTriangleCount.Items); + currentMeshState.attachments.Clear(true); + currentMeshState.attachments.GrowIfNeeded(stateTemp.attachments.Capacity); + currentMeshState.attachments.Count = stateTemp.attachments.Count; + stateTemp.attachments.CopyTo(currentMeshState.attachments.Items); currentMeshState.attachmentsFlipState.GrowIfNeeded(stateTemp.attachmentsFlipState.Capacity); currentMeshState.attachmentsFlipState.Count = stateTemp.attachmentsFlipState.Count; @@ -558,7 +558,7 @@ public class SkeletonRenderer : MonoBehaviour { useMesh1 = !useMesh1; } - private bool CheckIfMustUpdateMeshStructure (ExposedList attachmentsTriangleCountTemp, ExposedList attachmentsFlipStateTemp, ExposedList addSubmeshArgumentsTemp) { + private bool CheckIfMustUpdateMeshStructure (ExposedList attachmentsTemp, ExposedList attachmentsFlipStateTemp, ExposedList addSubmeshArgumentsTemp) { #if UNITY_EDITOR if (!Application.isPlaying) return true; @@ -574,17 +574,17 @@ public class SkeletonRenderer : MonoBehaviour { // Check if any attachments were enabled/disabled // or submesh structures has changed MeshState.SingleMeshState currentMeshState = useMesh1 ? meshState.stateMesh1 : meshState.stateMesh2; - ExposedList attachmentsTriangleCountCurrentMesh = currentMeshState.attachmentsTriangleCount; + ExposedList attachmentsCurrentMesh = currentMeshState.attachments; ExposedList addSubmeshArgumentsCurrentMesh = currentMeshState.addSubmeshArguments; ExposedList attachmentsFlipStateCurrentMesh = currentMeshState.attachmentsFlipState; // Check attachments - int attachmentCount = attachmentsTriangleCountTemp.Count; - if (attachmentsTriangleCountCurrentMesh.Count != attachmentCount) + int attachmentCount = attachmentsTemp.Count; + if (attachmentsCurrentMesh.Count != attachmentCount) return true; for (int i = 0; i < attachmentCount; i++) { - if (attachmentsTriangleCountCurrentMesh.Items[i] != attachmentsTriangleCountTemp.Items[i]) + if (attachmentsCurrentMesh.Items[i] != attachmentsTemp.Items[i]) return true; } @@ -734,16 +734,16 @@ public class SkeletonRenderer : MonoBehaviour { public class SingleMeshState { public bool immutableTriangles; + public readonly ExposedList attachments = new ExposedList(); public readonly ExposedList attachmentsFlipState = new ExposedList(); - public readonly ExposedList attachmentsTriangleCount = new ExposedList(); public readonly ExposedList addSubmeshArguments = new ExposedList(); public void UpdateDrawOrderCount(int drawOrderCount) { attachmentsFlipState.GrowIfNeeded(drawOrderCount); attachmentsFlipState.Count = drawOrderCount; - attachmentsTriangleCount.GrowIfNeeded(drawOrderCount); - attachmentsTriangleCount.Count = drawOrderCount; + attachments.GrowIfNeeded(drawOrderCount); + attachments.Count = drawOrderCount; } }