From dcab4d975b52e70c31a455b383b203a52c2ec903 Mon Sep 17 00:00:00 2001 From: ZimM Date: Wed, 20 May 2015 02:45:15 +0300 Subject: [PATCH] fixed frontFacing stuff --- .../Assets/spine-unity/SkeletonRenderer.cs | 91 +++++++++++-------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs index cac9778c2..d53bd8efe 100644 --- a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs +++ b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs @@ -183,15 +183,25 @@ public class SkeletonRenderer : MonoBehaviour { ExposedList attachmentsTriangleCountTemp = lastState.attachmentsTriangleCountTemp; attachmentsTriangleCountTemp.GrowIfNeeded(drawOrderCount); attachmentsTriangleCountTemp.Count = drawOrderCount; + ExposedList attachmentsFlipStateTemp = lastState.attachmentsFlipStateTemp; + attachmentsFlipStateTemp.GrowIfNeeded(drawOrderCount); + attachmentsFlipStateTemp.Count = drawOrderCount; ExposedList addSubmeshArgumentsTemp = lastState.addSubmeshArgumentsTemp; addSubmeshArgumentsTemp.Clear(false); for (int i = 0; i < drawOrderCount; i++) { Slot slot = drawOrder.Items[i]; + Bone bone = slot.bone; Attachment attachment = slot.attachment; object rendererObject; int attachmentVertexCount, attachmentTriangleCount; + bool worldScaleXIsPositive = bone.worldScaleX >= 0f; + bool worldScaleYIsPositive = bone.worldScaleY >= 0f; + bool worldScaleIsSameSigns = (worldScaleXIsPositive && worldScaleYIsPositive) || + (!worldScaleXIsPositive && !worldScaleYIsPositive); + bool flip = frontFacing && ((bone.worldFlipX != bone.worldFlipY) == worldScaleIsSameSigns); + attachmentsFlipStateTemp.Items[i] = flip; attachmentsTriangleCountTemp.Items[i] = -1; RegionAttachment regionAttachment = attachment as RegionAttachment; @@ -240,7 +250,7 @@ public class SkeletonRenderer : MonoBehaviour { new LastState.AddSubmeshArguments(lastMaterial, submeshStartSlotIndex, drawOrderCount, submeshTriangleCount, submeshFirstVertex, true) ); - bool mustUpdateMeshStructure = MustUpdateMeshStructure(attachmentsTriangleCountTemp, addSubmeshArgumentsTemp); + bool mustUpdateMeshStructure = CheckIfMustUpdateMeshStructure(attachmentsTriangleCountTemp, attachmentsFlipStateTemp, addSubmeshArgumentsTemp); if (mustUpdateMeshStructure) { submeshMaterials.Clear(); for (int i = 0, n = addSubmeshArgumentsTemp.Count; i < n; i++) { @@ -251,7 +261,8 @@ public class SkeletonRenderer : MonoBehaviour { arguments.endSlot, arguments.triangleCount, arguments.firstVertex, - arguments.lastSubmesh + arguments.lastSubmesh, + attachmentsFlipStateTemp ); } @@ -487,38 +498,39 @@ public class SkeletonRenderer : MonoBehaviour { } // Update previous state - ExposedList attachmentsTriangleCountCurrentMesh = - useMesh1 ? - lastState.attachmentsTriangleCountMesh1 : - lastState.attachmentsTriangleCountMesh2; - ExposedList addSubmeshArgumentsCurrentMesh = - useMesh1 ? - lastState.addSubmeshArgumentsMesh1 : - lastState.addSubmeshArgumentsMesh2; + 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; + } attachmentsTriangleCountCurrentMesh.GrowIfNeeded(attachmentsTriangleCountTemp.Capacity); attachmentsTriangleCountCurrentMesh.Count = attachmentsTriangleCountTemp.Count; attachmentsTriangleCountTemp.CopyTo(attachmentsTriangleCountCurrentMesh.Items, 0); + attachmentsFlipStateCurrentMesh.GrowIfNeeded(attachmentsFlipStateTemp.Capacity); + attachmentsFlipStateCurrentMesh.Count = attachmentsFlipStateTemp.Count; + attachmentsFlipStateTemp.CopyTo(attachmentsFlipStateCurrentMesh.Items, 0); + addSubmeshArgumentsCurrentMesh.GrowIfNeeded(addSubmeshArgumentsTemp.Count); addSubmeshArgumentsCurrentMesh.Count = addSubmeshArgumentsTemp.Count; addSubmeshArgumentsTemp.CopyTo(addSubmeshArgumentsCurrentMesh.Items); - if (useMesh1) { - lastState.frontFacingMesh1 = frontFacing; - lastState.immutableTrianglesMesh1 = immutableTriangles; - } else { - lastState.frontFacingMesh2 = frontFacing; - lastState.immutableTrianglesMesh2 = immutableTriangles; - } - useMesh1 = !useMesh1; } - private bool MustUpdateMeshStructure(ExposedList attachmentsTriangleCountTemp, ExposedList addSubmeshArgumentsTemp) { + private bool CheckIfMustUpdateMeshStructure(ExposedList attachmentsTriangleCountTemp, ExposedList attachmentsFlipStateTemp, ExposedList addSubmeshArgumentsTemp) { // Check if any mesh settings were changed bool mustUpdateMeshStructure = - frontFacing != (useMesh1 ? lastState.frontFacingMesh1 : lastState.frontFacingMesh2) || immutableTriangles != (useMesh1 ? lastState.immutableTrianglesMesh1 : lastState.immutableTrianglesMesh2); #if UNITY_EDITOR mustUpdateMeshStructure |= !Application.isPlaying; @@ -529,14 +541,18 @@ public class SkeletonRenderer : MonoBehaviour { // Check if any attachments were enabled/disabled // or submesh structures has changed - ExposedList attachmentsTriangleCountCurrentMesh = - useMesh1 ? - lastState.attachmentsTriangleCountMesh1 : - lastState.attachmentsTriangleCountMesh2; - ExposedList addSubmeshArgumentsCurrentMesh = - useMesh1 ? - lastState.addSubmeshArgumentsMesh1 : - lastState.addSubmeshArgumentsMesh2; + 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; + } // Check attachments int attachmentCount = attachmentsTriangleCountTemp.Count; @@ -548,6 +564,12 @@ public class SkeletonRenderer : MonoBehaviour { return true; } + // Check flip state + for (int i = 0; i < attachmentCount; i++) { + if (attachmentsFlipStateCurrentMesh.Items[i] != attachmentsFlipStateTemp.Items[i]) + return true; + } + // Check submeshes int submeshCount = addSubmeshArgumentsTemp.Count; if (addSubmeshArgumentsCurrentMesh.Count != submeshCount) @@ -562,7 +584,7 @@ public class SkeletonRenderer : MonoBehaviour { } /** Stores vertices and triangles for a single material. */ - private void AddSubmesh (Material material, int startSlot, int endSlot, int triangleCount, int firstVertex, bool lastSubmesh) { + private void AddSubmesh (Material material, int startSlot, int endSlot, int triangleCount, int firstVertex, bool lastSubmesh, ExposedList flipStates) { int submeshIndex = submeshMaterials.Count; submeshMaterials.Add(material); @@ -611,11 +633,7 @@ public class SkeletonRenderer : MonoBehaviour { Attachment attachment = slot.attachment; Bone bone = slot.bone; - bool worldScaleXIsPositive = bone.worldScaleX >= 0f; - bool worldScaleYIsPositive = bone.worldScaleY >= 0f; - bool worldScaleIsSameSigns = (worldScaleXIsPositive && worldScaleYIsPositive) || - (!worldScaleXIsPositive && !worldScaleYIsPositive); - bool flip = frontFacing && ((bone.worldFlipX != bone.worldFlipY) != worldScaleIsSameSigns); + bool flip = flipStates.Items[i]; if (attachment is RegionAttachment) { if (!flip) { @@ -686,11 +704,12 @@ public class SkeletonRenderer : MonoBehaviour { #endif private class LastState { - public bool frontFacingMesh1; - public bool frontFacingMesh2; public bool immutableTrianglesMesh1; public bool immutableTrianglesMesh2; 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();