From 1f8e251732b1c5cfdf3bfef7ff8ca6821ed7a4a6 Mon Sep 17 00:00:00 2001 From: Andrey Viktorov Date: Thu, 13 Jun 2013 19:56:29 +0700 Subject: [PATCH] Code cleanup, fixed empty skeleton data errors, renderer materials are updated once with submeshes cached --- spine-tk2d/Code/tk2dSpineAnimation.cs | 18 +++++++------ spine-tk2d/Code/tk2dSpineSkeleton.cs | 35 +++++++++++++------------- spine-tk2d/Example/Example.unity | Bin 38104 -> 19032 bytes 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/spine-tk2d/Code/tk2dSpineAnimation.cs b/spine-tk2d/Code/tk2dSpineAnimation.cs index ed86ad554..f0639c4c6 100644 --- a/spine-tk2d/Code/tk2dSpineAnimation.cs +++ b/spine-tk2d/Code/tk2dSpineAnimation.cs @@ -11,11 +11,11 @@ public class tk2dSpineAnimation : MonoBehaviour { public float animationSpeed = 1; public Spine.AnimationState state; - private tk2dSpineSkeleton spineSkeleton; + private tk2dSpineSkeleton cachedSpineSkeleton; void Start () { - spineSkeleton = GetComponent(); - state = new Spine.AnimationState(spineSkeleton.skeletonDataAsset.GetAnimationStateData()); + cachedSpineSkeleton = GetComponent(); + state = new Spine.AnimationState(cachedSpineSkeleton.skeletonDataAsset.GetAnimationStateData()); } void Update () { @@ -26,17 +26,19 @@ public class tk2dSpineAnimation : MonoBehaviour { // Check if we need to stop current animation if (state.Animation != null && animationName == null) { state.ClearAnimation(); - } else if (state.Animation == null || animationName != state.Animation.Name) { - // Check for different animation name or animation end - Spine.Animation animation = spineSkeleton.skeleton.Data.FindAnimation(animationName); + } + + // Check for different animation name or animation end + else if (state.Animation == null || animationName != state.Animation.Name) { + Spine.Animation animation = cachedSpineSkeleton.skeleton.Data.FindAnimation(animationName); if (animation != null) state.SetAnimation(animation,loop); } state.Loop = loop; // Update animation - spineSkeleton.skeleton.Update(Time.deltaTime * animationSpeed); + cachedSpineSkeleton.skeleton.Update(Time.deltaTime * animationSpeed); state.Update(Time.deltaTime * animationSpeed); - state.Apply(spineSkeleton.skeleton); + state.Apply(cachedSpineSkeleton.skeleton); } } diff --git a/spine-tk2d/Code/tk2dSpineSkeleton.cs b/spine-tk2d/Code/tk2dSpineSkeleton.cs index 0b577e25b..ca1031f25 100644 --- a/spine-tk2d/Code/tk2dSpineSkeleton.cs +++ b/spine-tk2d/Code/tk2dSpineSkeleton.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using UnityEngine; using Spine; -// TODO: multiple atlas support - [ExecuteInEditMode] [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] @@ -19,12 +17,14 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor private float[] vertexPositions; private List submeshMaterials = new List(); private List submeshIndices = new List(); + private Color cachedCurrentColor; void Awake() { vertexPositions = new float[8]; submeshMaterials = new List(); submeshIndices = new List(); + cachedCurrentColor = new Color(); } void Start () { @@ -38,7 +38,7 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor return; } - if(skeleton == null || skeleton.Data != skeletonData) Initialize(); + if (skeleton == null || skeleton.Data != skeletonData) Initialize(); skeleton.UpdateWorldTransform(); @@ -51,8 +51,6 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor DestroyImmediate(mesh); mesh = null; - renderer.sharedMaterials = null; - skeleton = null; } @@ -62,13 +60,14 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor mesh.name = "tk2dSkeleton Mesh"; mesh.hideFlags = HideFlags.HideAndDontSave; - skeleton = new Skeleton(skeletonDataAsset.GetSkeletonData()); + if(skeletonDataAsset != null) { + skeleton = new Skeleton(skeletonDataAsset.GetSkeletonData()); + } } private void UpdateMesh() { int quadIndex = 0; int drawCount = skeleton.DrawOrder.Count; - Color currentColor = new Color(); for (int i = 0; i < drawCount; i++) { Slot slot = skeleton.DrawOrder[i]; @@ -91,15 +90,15 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor uvs[vertexIndex + 2] = new Vector2(regionUVs[RegionAttachment.X2],regionUVs[RegionAttachment.Y2]); uvs[vertexIndex + 3] = new Vector2(regionUVs[RegionAttachment.X3],regionUVs[RegionAttachment.Y3]); - currentColor.a = skeleton.A * slot.A; - currentColor.r = skeleton.R * slot.R * slot.A; - currentColor.g = skeleton.G * slot.G * slot.A; - currentColor.b = skeleton.B * slot.B * slot.A; + cachedCurrentColor.a = skeleton.A * slot.A; + cachedCurrentColor.r = skeleton.R * slot.R * slot.A; + cachedCurrentColor.g = skeleton.G * slot.G * slot.A; + cachedCurrentColor.b = skeleton.B * slot.B * slot.A; - colors[vertexIndex] = currentColor; - colors[vertexIndex + 1] = currentColor; - colors[vertexIndex + 2] = currentColor; - colors[vertexIndex + 3] = currentColor; + colors[vertexIndex] = cachedCurrentColor; + colors[vertexIndex + 1] = cachedCurrentColor; + colors[vertexIndex + 2] = cachedCurrentColor; + colors[vertexIndex + 3] = cachedCurrentColor; quadIndex++; } @@ -118,7 +117,7 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor if (skeletonDataAsset.normalGenerationMode != tk2dSpriteCollection.NormalGenerationMode.None) { mesh.RecalculateNormals(); - + if (skeletonDataAsset.normalGenerationMode == tk2dSpriteCollection.NormalGenerationMode.NormalsAndTangents) { Vector4[] tangents = new Vector4[mesh.normals.Length]; for (int i = 0; i < tangents.Length; i++) { @@ -127,8 +126,6 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor mesh.tangents = tangents; } } - - renderer.sharedMaterials = submeshMaterials.ToArray(); } private void UpdateCache() { @@ -189,6 +186,8 @@ public class tk2dSpineSkeleton : MonoBehaviour, tk2dRuntime.ISpriteCollectionFor submeshIndices.Add(currentSubmesh.ToArray()); submeshMaterials.Add(oldMaterial); + + renderer.sharedMaterials = submeshMaterials.ToArray(); } diff --git a/spine-tk2d/Example/Example.unity b/spine-tk2d/Example/Example.unity index 1467fe69e4376f2715e6bd572f9220ec9ad6fb2e..bc7e18b13510145ff3cc055ed78ee54a274620fc 100644 GIT binary patch delta 725 zcmZXRPe>GD7{=e3-9eWOlK!Y5I*W#3uuY|_hs8hGq3ogvp|*a2vZMrw zo@^7fcN0+na|WI2LPp4lH_(OSIK@1xh3qeZW*;vF?%P}151)Ne6b{;x4}X^_H+kTB ze`;F&IASP7Ggyn}Y6k2pOb5K*QyT1sN;C|A%hN2_1egxr>1hsZ#bZ%0(Y$=mWAETa z-@^Z_tV$``fXQ$C9dN-%)B=Y5&M5jGSO%;Svm8p;K3E}=Rbvi%%77VQ@8L^49f0kE zT|LMlSgA&2;GJ{lLGFV`fKLHi09!p3pi^YE@vi=Ny?y<|@?`k)qRPK|EI#bH!;kw) z?5W<6qG(*7Zsv(}2XDUg+nIE^l9H9!)h&r2aik=o#FdgG$Wf%^i1}HrAU{h~Nh2i* zrI$li;?Zlp>&;-&)LWB-!>=q8Hen8#)=09Dh^zYQ{c^wjCmJb}L6Max`~%94e{yFZ zzl~MqUMo&iayF{v%ucK{DB<;MI^jm#{-5Wcu^K*(*X5RE;}u-nUn>`I{pxlFd}dbN c6XNbD4DYGscZoGHo(-9- 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 g7E>Q|yjJR+=F^U!u<`A?TFiGNnkW6teC_D}0