BrashMonkey.Spriter.DataPlugins.SpriterDataUnity.SetObject C# (CSharp) Method

SetObject() private method

private SetObject ( SpriterAnimation anim, Transform characterRoot, bool lastFrame, float currentTime, float frameRate, AnimationCurve>.Dictionary curves, List processedSprites, ISpriterTimelineBone obj1, Transform>.Dictionary bones, Vector2>.Dictionary scales, SpriterMainlineBoneBase boneBase = null, SpriterMainlineObjectBase obj = null ) : void
anim SpriterAnimation
characterRoot UnityEngine.Transform
lastFrame bool
currentTime float
frameRate float
curves AnimationCurve>.Dictionary
processedSprites List
obj1 ISpriterTimelineBone
bones Transform>.Dictionary
scales Vector2>.Dictionary
boneBase BrashMonkey.Spriter.Data.ObjectModel.SpriterMainlineBoneBase
obj BrashMonkey.Spriter.Data.ObjectModel.SpriterMainlineObjectBase
return void
        private void SetObject(SpriterAnimation anim, Transform characterRoot, bool lastFrame, float currentTime,
		                       float frameRate, Dictionary<string, AnimationCurve>[] curves, List<Component> processedSprites,
							   ISpriterTimelineBone obj1, Dictionary<int, Transform> bones, Dictionary<int, Vector2> scales, SpriterMainlineBoneBase boneBase = null,
		                       SpriterMainlineObjectBase obj = null)
        {
            // Find the sprite object
            SpriterTimelineKey spriterTimelineKey = null;

            bool isTransient = false;

            string timelineName = null;
            int id = -1;

            var mainlineObjectRef = obj as SpriterMainlineObjectRef;
            var mainlineObject = obj as SpriterMainlineObject;
            if (mainlineObjectRef != null)
            {
                SpriterTimeline spriterTimeline = anim.timelines.Find(timeline => mainlineObjectRef.timeline == timeline.ID);
                spriterTimelineKey = spriterTimeline.keys.Find(key => key.ID == mainlineObjectRef.key);
                timelineName = spriterTimeline.name;
                id = mainlineObjectRef.ID;
            }
            if (mainlineObject != null)
            {
                timelineName = mainlineObject.name;
                id = mainlineObject.ID;
                isTransient = true;
            }
            var boneRef = boneBase as SpriterMainlineBoneRef;
            var bone = boneBase as SpriterMainlineBone;
            if (boneRef != null)
            {
                SpriterTimeline spriterTimeline = anim.timelines.Find(timeline => boneRef.timeline == timeline.ID);
                spriterTimelineKey = spriterTimeline.keys.Find(key => key.ID == boneRef.key);
                timelineName = spriterTimeline.name;
                id = boneRef.ID;
                isTransient = false;
            }
            if (bone != null)
            {
                timelineName = "trans_bone_";
                id = bone.ID;
                isTransient = true;
            }
            //UISprite uiSprite = FindSpriteObject(characterRoot, obj1, timelineName, id);
            //var uiSprite = colorHelper.GetComponent<UISprite>();
            int parent = -1;
            if (obj != null) parent = obj.parent;
            else if (boneRef != null) parent = boneRef.parent;
            else if (bone != null) parent = bone.parent;

            Transform parentT = characterRoot;
            Vector2 localScale = Vector2.one;

            if (parent != -1)
            {
                if (!bones.TryGetValue(parent, out parentT))
                    Debug.LogError("Parent " + parent + " does not exist");
                scales.TryGetValue(parent, out localScale);
            }

            Transform animObj = FindObject(parentT, timelineName, id);
            Transform animSpriteObj = null;
            SpriterNGUIColorHelper colorHelper = null;

            animObj.localPosition = new Vector2(obj1.position.x * localScale.x, obj1.position.y * localScale.y);
            localScale.x *= obj1.scale.x;
            localScale.y *= obj1.scale.y;

            if (boneBase != null)
            {
                bones.Add(boneBase.ID, animObj);
                scales.Add(boneBase.ID, localScale);
            }

            var animKeyName = GetRelativeName(animObj, characterRoot);
            string animSpriteKeyName = null;

            //animObj.localScale = obj1.scale;

            var sprObj = obj1 as ISpriterTimelineObject;
            if (sprObj != null)
            {
                System.Diagnostics.Debug.Assert(obj != null, "obj != null");

                colorHelper = FindChildSpriteObject(animObj, (ISpriterTimelineObject)obj1);

                animSpriteObj = colorHelper.transform;
                animSpriteKeyName = GetRelativeName(colorHelper, characterRoot);

                //set this here so that bones don't get screwed with
                animObj.localScale = localScale;

                Vector2 paddingTL;
                Vector2 paddingBR;
                Vector2 size;
                GetSpriteInfo(colorHelper, out paddingTL, out paddingBR, out size);

                float pW = paddingTL.x + paddingBR.x;
                float pH = paddingTL.y + paddingBR.y;

                float w = sprObj.targetFile.width - pW;
                float h = sprObj.targetFile.height - pH;

                Vector2 pivot = sprObj.pivot;
                //check if the pivot is the default
                if ((pivot - new Vector2(0, 1)).sqrMagnitude < 0.001f)
                {
                    pivot = sprObj.targetFile.pivot;
                }

                colorHelper.transform.localRotation = Quaternion.identity;
                colorHelper.transform.localPosition = new Vector2(-pivot.x*sprObj.targetFile.width,
                                                                  (1 - pivot.y)*sprObj.targetFile.height)
                                                      + new Vector2(paddingTL.x, -paddingTL.y);

                colorHelper.transform.localScale = new Vector3(w, h, 1);

                colorHelper.color = obj1.color;

                colorHelper.depth = obj.zIndex;
            }

            if (spriterTimelineKey != null)
            {
                float lastRot = animObj.localEulerAngles.z;
                float targetRot = ((obj1.angle + 180)%360) - 180;

                //TODO: fix rotation

                if (targetRot - 180 > lastRot)
                    targetRot -= 360;
                if (targetRot + 180 < lastRot)
                    targetRot += 360;

                /*if (spriterTimelineKey.spin != -1)
                    {
                        //clockwise
                        while (targetRot < lastRot - 5)
                            targetRot += 360;
                    }
                    else
                    {
                        //counterclockwise
                        while (targetRot > lastRot + 5)
                            targetRot -= 360;
                    }*/

                animObj.localRotation = Quaternion.Euler(0, 0, targetRot);
            }
            else
                animObj.localRotation = Quaternion.Euler(0, 0, ((obj1.angle + 180)%360) - 180);

            AnimationCurve currentCurveXPos;
            AnimationCurve currentCurveYPos;
            //AnimationCurve currentCurveZPos;
            AnimationCurve currentCurveXScale;
            AnimationCurve currentCurveYScale;
            //AnimationCurve currentCurveZScale;
            AnimationCurve currentCurveXRot;
            AnimationCurve currentCurveYRot;
            AnimationCurve currentCurveZRot;
            AnimationCurve currentCurveWRot;
            AnimationCurve currentCurveColorR = null;
            AnimationCurve currentCurveColorG = null;
            AnimationCurve currentCurveColorB = null;

            AnimationCurve currentCurveSpriteXPos = null;
            AnimationCurve currentCurveSpriteYPos = null;

            if (!curves[0].ContainsKey(animKeyName))
            {
                // New object, create new animation curves
                currentCurveXPos = new AnimationCurve();
                currentCurveYPos = new AnimationCurve();
                //currentCurveZPos = new AnimationCurve();
                currentCurveXScale = new AnimationCurve();
                currentCurveYScale = new AnimationCurve();
                //currentCurveZScale = new AnimationCurve();
                currentCurveXRot = new AnimationCurve();
                currentCurveYRot = new AnimationCurve();
                currentCurveZRot = new AnimationCurve();
                currentCurveWRot = new AnimationCurve();

                curves[0].Add(animKeyName, currentCurveXPos);
                curves[1].Add(animKeyName, currentCurveYPos);
                //curves[2].Add(animKeyName, currentCurveZPos);
                curves[3].Add(animKeyName, currentCurveXScale);
                curves[4].Add(animKeyName, currentCurveYScale);
                //curves[5].Add(animKeyName, currentCurveZScale);
                curves[6].Add(animKeyName, currentCurveXRot);
                curves[7].Add(animKeyName, currentCurveYRot);
                curves[8].Add(animKeyName, currentCurveZRot);
                curves[9].Add(animKeyName, currentCurveWRot);
            }
            else
            {
                // Get the current animation curves
                currentCurveXPos = curves[0][animKeyName];
                currentCurveYPos = curves[1][animKeyName];
                //currentCurveZPos = curves[2][animKeyName];
                currentCurveXScale = curves[3][animKeyName];
                currentCurveYScale = curves[4][animKeyName];
                //currentCurveZScale = curves[5][animKeyName];
                currentCurveXRot = curves[6][animKeyName];
                currentCurveYRot = curves[7][animKeyName];
                currentCurveZRot = curves[8][animKeyName];
                currentCurveWRot = curves[9][animKeyName];
            }

            if (animSpriteKeyName != null)
            {
                if (!curves[0].ContainsKey(animSpriteKeyName))
                {
                    currentCurveSpriteXPos = new AnimationCurve();
                    currentCurveSpriteYPos = new AnimationCurve();

                    currentCurveColorR = new AnimationCurve();
                    currentCurveColorG = new AnimationCurve();
                    currentCurveColorB = new AnimationCurve();

                    curves[0].Add(animSpriteKeyName, currentCurveSpriteXPos);
                    curves[1].Add(animSpriteKeyName, currentCurveSpriteYPos);

                    curves[11].Add(animSpriteKeyName, currentCurveColorR);
                    curves[12].Add(animSpriteKeyName, currentCurveColorG);
                    curves[13].Add(animSpriteKeyName, currentCurveColorB);
                }
                else
                {
                    currentCurveSpriteXPos = curves[0][animSpriteKeyName];
                    currentCurveSpriteYPos = curves[1][animSpriteKeyName];

                    currentCurveColorR = curves[11][animSpriteKeyName];
                    currentCurveColorG = curves[12][animSpriteKeyName];
                    currentCurveColorB = curves[13][animSpriteKeyName];
                }

                AnimationCurve currentCurveToggle;
                if (!curves[10].ContainsKey(animSpriteKeyName))
                {
                    currentCurveToggle = new AnimationCurve();
                    curves[10].Add(animSpriteKeyName, currentCurveToggle);

                    if (currentTime > 0)
                        currentCurveToggle.AddKey(SteppedKeyframe(0, 0));
                }
                else
                {
                    currentCurveToggle = curves[10][animSpriteKeyName];
                }

                int keyPos = currentCurveToggle.AddKey(SteppedKeyframe(currentTime, colorHelper.color.a));

                if (keyPos > 0)
                {
                    // Check if sprite was previously turned off
                    if (currentCurveToggle.keys[keyPos - 1].value < 0.01f)
                    {
                        currentCurveToggle.AddKey(SteppedKeyframe(currentTime - (.001f/frameRate), 0));
                    }
                }
            }
            if (isTransient)
            {
                DuplicateLast(currentTime, frameRate, currentCurveXPos);
                DuplicateLast(currentTime, frameRate, currentCurveYPos);

                DuplicateLast(currentTime, frameRate, currentCurveXScale);
                DuplicateLast(currentTime, frameRate, currentCurveYScale);

                DuplicateLast(currentTime, frameRate, currentCurveXRot);
                DuplicateLast(currentTime, frameRate, currentCurveYRot);
                DuplicateLast(currentTime, frameRate, currentCurveZRot);
                DuplicateLast(currentTime, frameRate, currentCurveWRot);
            }

            currentCurveXPos.AddKey(LinearKeyframe(currentTime, animObj.localPosition.x));
            currentCurveYPos.AddKey(LinearKeyframe(currentTime, animObj.localPosition.y));

            currentCurveXScale.AddKey(LinearKeyframe(currentTime, animObj.localScale.x));
            currentCurveYScale.AddKey(LinearKeyframe(currentTime, animObj.localScale.y));

            currentCurveXRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.x));
            currentCurveYRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.y));
            currentCurveZRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.z));
            currentCurveWRot.AddKey(LinearKeyframe(currentTime, animObj.localRotation.w));

            if (animSpriteKeyName != null)
            {
                if (isTransient)
                {
                    DuplicateLast(currentTime, frameRate, currentCurveColorR);
                    DuplicateLast(currentTime, frameRate, currentCurveColorG);
                    DuplicateLast(currentTime, frameRate, currentCurveColorB);

                    DuplicateLast(currentTime, frameRate, currentCurveSpriteXPos);
                    DuplicateLast(currentTime, frameRate, currentCurveSpriteYPos);
                }
                currentCurveColorR.AddKey(LinearKeyframe(currentTime, colorHelper.color.r));
                currentCurveColorG.AddKey(LinearKeyframe(currentTime, colorHelper.color.g));
                currentCurveColorB.AddKey(LinearKeyframe(currentTime, colorHelper.color.b));

                currentCurveSpriteXPos.AddKey(LinearKeyframe(currentTime, animSpriteObj.localPosition.x));
                currentCurveSpriteYPos.AddKey(LinearKeyframe(currentTime, animSpriteObj.localPosition.y));
            }

            if (colorHelper != null)
            {
                colorHelper.color = lastFrame ? obj1.color : new Color(obj1.color.r, obj1.color.g, obj1.color.b, 0);

                // Mark as processed
                processedSprites.Add(colorHelper);
            }
        }