public static void TransformAnimationData(AnimationData animationData, ArmatureData armatureData)
		{
			SkinData skinData = armatureData.GetSkinData(null);
			List<BoneData> boneDataList = armatureData.BoneDataList;
			List<SlotData> slotDataList = skinData.SlotDataList;
			int i = boneDataList.Count;
			
			BoneData boneData;
			TransformTimeline timeline;
			SlotData slotData;
			DisplayData displayData;
			TransformTimeline parentTimeline;
			List<Frame> frameList;
			DBTransform originTransform;
			Point originPivot;
			TransformFrame prevFrame;
			uint frameListLength;
			TransformFrame frame;
			
			while(i -- >0)
			{
				boneData = boneDataList[i];
				timeline = animationData.GetTimeline(boneData.Name);
				if(timeline == null)
				{
					continue;
				}
				
				slotData = null;
				foreach(SlotData slotDataObj in slotDataList)
				{
					if(slotDataObj.Parent == boneData.Name)
					{

						slotData = slotDataObj;
						break;
					}
				}
				
				parentTimeline = boneData.Parent!=null?animationData.GetTimeline(boneData.Parent):null;
				
				frameList = timeline.FrameList;
				
				originTransform = null;
				originPivot = null;
				prevFrame = null;
				frameListLength = (uint)frameList.Count;
				for(int j = 0;j < frameListLength;j ++)
				{
					frame = frameList[j] as TransformFrame;
					if(parentTimeline!=null)
					{
						//tweenValues to transform.
						_helpTransform1.Copy(frame.Global);
						
						//get transform from parent timeline.
						GetTimelineTransform(parentTimeline, frame.Position, _helpTransform2);
						TransformUtil.TransformPointWithParent(_helpTransform1, _helpTransform2);
						
						//transform to tweenValues.
						frame.Transform.Copy(_helpTransform1);
					}
					else
					{
						frame.Transform.Copy(frame.Global);
					}

					frame.Transform.X -= boneData.Transform.X;
					frame.Transform.Y -= boneData.Transform.Y;
					frame.Transform.SkewX -= boneData.Transform.SkewX;
					frame.Transform.SkewY -= boneData.Transform.SkewY;
					frame.Transform.ScaleX -= boneData.Transform.ScaleX;
					frame.Transform.ScaleY -= boneData.Transform.ScaleY;
					
					if(!timeline.Transformed)
					{
						if(slotData!=null)
						{
							frame.ZOrder -= slotData.ZOrder;
						}
					}
					
					if(originTransform == null)
					{
						originTransform = timeline.OriginTransform;
						originTransform.Copy(frame.Transform);
						originTransform.SkewX = TransformUtil.FormatRadian(originTransform.SkewX);
						originTransform.SkewY = TransformUtil.FormatRadian(originTransform.SkewY);
						originPivot = timeline.OriginPivot;
						originPivot.X = frame.Pivot.X;
						originPivot.Y = frame.Pivot.Y;
					}
					
					frame.Transform.X -= originTransform.X;
					frame.Transform.Y -= originTransform.Y;
					frame.Transform.SkewX = TransformUtil.FormatRadian(frame.Transform.SkewX - originTransform.SkewX);
					frame.Transform.SkewY = TransformUtil.FormatRadian(frame.Transform.SkewY - originTransform.SkewY);
					frame.Transform.ScaleX -= originTransform.ScaleX;
					frame.Transform.ScaleY -= originTransform.ScaleY;

					if(!timeline.Transformed)
					{
						frame.Pivot.Y -= originPivot.X;
						frame.Pivot.Y -= originPivot.Y;
					}
					
					if(prevFrame!=null)
					{
						float dLX = frame.Transform.SkewX - prevFrame.Transform.SkewX;
						
						if(prevFrame.TweenRotate!=0)
						{
							
							if(prevFrame.TweenRotate > 0)
							{
								if(dLX < 0)
								{
									frame.Transform.SkewX += (float)Math.PI * 2f;
									frame.Transform.SkewY += (float)Math.PI * 2f;
								}
								
								if(prevFrame.TweenRotate > 1)
								{
									frame.Transform.SkewX += (float)Math.PI * 2f * ((float)prevFrame.TweenRotate - 1f);
									frame.Transform.SkewY += (float)Math.PI * 2f * ((float)prevFrame.TweenRotate - 1f);
								}
							}
							else
							{
								if(dLX > 0)
								{
									frame.Transform.SkewX -= (float)Math.PI * 2f;
									frame.Transform.SkewY -= (float)Math.PI * 2f;
								}
								
								if(prevFrame.TweenRotate < 1)
								{
									frame.Transform.SkewX += (float)Math.PI * 2f * ((float)prevFrame.TweenRotate + 1f);
									frame.Transform.SkewY += (float)Math.PI * 2f * ((float)prevFrame.TweenRotate + 1f);
								}
							}
						}
						else
						{
							frame.Transform.SkewX = prevFrame.Transform.SkewX + TransformUtil.FormatRadian(frame.Transform.SkewX - prevFrame.Transform.SkewX);
							frame.Transform.SkewY = prevFrame.Transform.SkewY + TransformUtil.FormatRadian(frame.Transform.SkewY - prevFrame.Transform.SkewY);
						}
					}
					
					prevFrame = frame;
				}
				timeline.Transformed = true;
			}
		}
		public static void AddHideTimeline(AnimationData animationData, ArmatureData armatureData)
		{
			List<BoneData> boneDataList =armatureData.BoneDataList;
			int i = boneDataList.Count;
			
			BoneData boneData;
			string boneName;
			while(i -- >0)
			{
				boneData = boneDataList[i];
				boneName = boneData.Name;
				if(animationData.GetTimeline(boneName)==null)
				{
					animationData.AddTimeline(TransformTimeline.HIDE_TIMELINE, boneName);
				}
			}
		}
		private static AnimationData parseAnimationData(Dictionary<String, Object> animationObject, ArmatureData armatureData, uint frameRate)
		{
			AnimationData animationData = new AnimationData();
			animationData.Name = animationObject[ConstValues.A_NAME] as String;
			animationData.FrameRate = (uint)frameRate;

			animationData.Loop = int.Parse(animationObject[ConstValues.A_LOOP].ToString());
			animationData.FadeInTime = (float)animationObject[ConstValues.A_FADE_IN_TIME];
			animationData.Duration = (float)animationObject [ConstValues.A_DURATION] /frameRate;
			animationData.Scale = (float)animationObject[ConstValues.A_SCALE];
			
			if(animationObject.ContainsKey(ConstValues.A_TWEEN_EASING))
			{
				Object tweenEase = animationObject[ConstValues.A_TWEEN_EASING];
				if(
					tweenEase == null
					)
				{
					animationData.TweenEasing = float.NaN;
				}
				else
				{
					animationData.TweenEasing = (float)tweenEase;
				}
			}
			else
			{
				animationData.TweenEasing = float.NaN;
			}
			
			parseTimeline(animationObject as Dictionary<string, object>, animationData, parseMainFrame, frameRate);
			
			TransformTimeline timeline;
			string timelineName;
			foreach(Dictionary<String, Object> timelineObject in animationObject[ConstValues.TIMELINE] as List<object>)
			{
				timeline = parseTransformTimeline(timelineObject as Dictionary<string, object>, animationData.Duration, frameRate);
				timelineName = (timelineObject as Dictionary<string, object>)[ConstValues.A_NAME] as String;
				animationData.AddTimeline(timeline, timelineName);
			}
			
			DBDataUtil.AddHideTimeline(animationData, armatureData);
			DBDataUtil.TransformAnimationData(animationData, armatureData);
			
			return animationData;
		}
		private void clearVaribles()
		{
			_armature = null;
			_currentFrame = null;
			_clip = null;
			_mixingTransforms = null;

			String[] keys = new string[_timelineStates.Count];
			int i = 0;
			
			foreach(KeyValuePair<string, TimelineState> timelineState in _timelineStates)
			{
				keys[i] = timelineState.Key;
				i++;
				//removeTimelineState(timelineState.Key);
			}

			for(int j=0;j<keys.Length;j++)
			{
				removeTimelineState(keys[j]);
			}
		}
		/** @private */
		public void fadeIn(Armature armature, AnimationData clip, float fadeInTime, float timeScale, int loop, uint layer, bool displayControl, bool pauseBeforeFadeInComplete)
		{

			_armature = armature;
			_clip = clip;
			_name = _clip.Name;
			_layer = layer;
			
			_totalTime = _clip.Duration;
			if(Math.Round(_clip.Duration * _clip.FrameRate) < 2 || timeScale == float.PositiveInfinity)
			{
				_timeScale = 1;
				_currentTime = _totalTime;
				if(_loop >= 0)
				{
					_loop = 1;
				}
				else
				{
					_loop = -1;
				}
			}
			else
			{
				_timeScale = timeScale;
				_currentTime = 0;
				_loop = loop;
			}
			
			if(pauseBeforeFadeInComplete)
			{
				_pauseBeforeFadeInCompleteState = -1;
			}
			else
			{
				_pauseBeforeFadeInCompleteState = 1;
			}
			
			_fadeInTime = fadeInTime * _timeScale;
			
			
			_loopCount = -1;
			_fadeState = 1;
			_fadeOutBeginTime = 0;
			_fadeOutWeight = -1;
			_fadeWeight = 0;
			_isPlaying = true;
			_isComplete = false;
			_fadeIn = true;
			_fadeOut = false;
			
			this.DisplayControl = displayControl;
			
			Weight = 1;
			Blend = true;
			TweenEnabled = true;
			
			updateTimelineStates();

		}
		public void AddAnimationData(AnimationData animationData)
		{
			if(animationData == null)
			{
				throw new ArgumentException();
			}
			
			if(_animationDataList.IndexOf(animationData) < 0)
			{
				_animationDataList.Add(animationData);

			}
		}