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);
}
}