protected virtual SpriterVarValue GetVariableValue(SpriterAnimation animation, SpriterVarDef varDef, SpriterVarline varline, float targetTime) { SpriterVarlineKey[] keys = varline.Keys; if (keys == null) { return(varDef.VariableValue); } SpriterVarlineKey keyA = keys.GetLastKey(targetTime) ?? keys[keys.Length - 1]; if (keyA == null) { return(varDef.VariableValue); } SpriterVarlineKey keyB = varline.Keys.GetNextKey(keyA, animation.Looping); if (keyB == null) { return(keyA.VariableValue); } float adjustedTime = keyA.Time == keyB.Time ? targetTime : SpriterHelper.AdjustTime(targetTime, keyA, keyB, animation.Length); float factor = SpriterHelper.GetFactor(keyA, keyB, animation.Length, adjustedTime); SpriterVarValue varVal = Pool.GetObject <SpriterVarValue>(); varVal.Interpolate(keyA.VariableValue, keyB.VariableValue, factor); return(varVal); }
public virtual FrameData GetFrameData(SpriterAnimation animation, float targetTime, float deltaTime, SpriterSpatial parentInfo = null) { if (parentInfo == null) { FrameData.Clear(); } SpriterMainlineKey keyA; SpriterMainlineKey keyB; GetMainlineKeys(animation.MainlineKeys, targetTime, out keyA, out keyB); float adjustedTime = SpriterHelper.AdjustTime(targetTime, keyA, keyB, animation.Length); SpriterSpatial[] boneInfos = GetBoneInfos(keyA, animation, adjustedTime, parentInfo); if (keyA.ObjectRefs == null) { Pool.ReturnObject(boneInfos); return(FrameData); } for (int i = 0; i < keyA.ObjectRefs.Length; ++i) { SpriterObjectRef objectRef = keyA.ObjectRefs[i]; var timeline = animation.Timelines[objectRef.TimelineId]; SpriterObject interpolated = GetObjectInfo(objectRef, animation, adjustedTime); interpolated.Name = timeline.Name; if (boneInfos != null && objectRef.ParentId >= 0) { interpolated.ApplyParentTransform(boneInfos[objectRef.ParentId]); } else if (parentInfo != null) { interpolated.ApplyParentTransform(parentInfo); } AddSpatialData(interpolated, timeline, animation.Entity.Spriter, deltaTime); } Pool.ReturnObject(boneInfos); if (Config.MetadataEnabled) { UpdateMetadata(animation, targetTime, deltaTime); } return(FrameData); }
protected virtual SpriterObject GetObjectInfo(SpriterRef spriterRef, SpriterAnimation animation, float targetTime) { SpriterTimelineKey[] keys = animation.Timelines[spriterRef.TimelineId].Keys; SpriterTimelineKey keyA = keys[spriterRef.KeyId]; SpriterTimelineKey keyB = keys.GetNextKey(keyA, animation.Looping); if (keyB == null) { return(Copy(keyA.ObjectInfo)); } float factor = SpriterHelper.GetFactor(keyA, keyB, animation.Length, targetTime); return(Interpolate(keyA.ObjectInfo, keyB.ObjectInfo, factor, keyA.Spin)); }
public virtual FrameData GetFrameData(SpriterAnimation first, SpriterAnimation second, float targetTime, float deltaTime, float factor) { FrameData.Clear(); if (first == second) { GetFrameData(first, targetTime, deltaTime); return(FrameData); } float targetTimeSecond = targetTime / first.Length * second.Length; SpriterMainlineKey firstKeyA; SpriterMainlineKey firstKeyB; GetMainlineKeys(first.MainlineKeys, targetTime, out firstKeyA, out firstKeyB); SpriterMainlineKey secondKeyA; SpriterMainlineKey secondKeyB; GetMainlineKeys(second.MainlineKeys, targetTimeSecond, out secondKeyA, out secondKeyB); if (!SpriterHelper.WillItBlend(firstKeyA, secondKeyA) || !SpriterHelper.WillItBlend(firstKeyB, secondKeyB)) { GetFrameData(first, targetTime, deltaTime); return(FrameData); } float adjustedTimeFirst = SpriterHelper.AdjustTime(targetTime, firstKeyA, firstKeyB, first.Length); float adjustedTimeSecond = SpriterHelper.AdjustTime(targetTimeSecond, secondKeyA, secondKeyB, second.Length); SpriterSpatial[] boneInfosA = GetBoneInfos(firstKeyA, first, adjustedTimeFirst); SpriterSpatial[] boneInfosB = GetBoneInfos(secondKeyA, second, adjustedTimeSecond); SpriterSpatial[] boneInfos = null; if (boneInfosA != null && boneInfosB != null) { boneInfos = Pool.GetArray <SpriterSpatial>(boneInfosA.Length); for (int i = 0; i < boneInfosA.Length; ++i) { SpriterSpatial boneA = boneInfosA[i]; SpriterSpatial boneB = boneInfosB[i]; SpriterSpatial interpolated = Interpolate(boneA, boneB, factor, 1); interpolated.Angle = MathHelper.CloserAngleLinear(boneA.Angle, boneB.Angle, factor); boneInfos[i] = interpolated; } } SpriterMainlineKey baseKey = factor < 0.5f ? firstKeyA : firstKeyB; SpriterAnimation currentAnimation = factor < 0.5f ? first : second; for (int i = 0; i < baseKey.ObjectRefs.Length; ++i) { SpriterObjectRef objectRefFirst = baseKey.ObjectRefs[i]; SpriterObject interpolatedFirst = GetObjectInfo(objectRefFirst, first, adjustedTimeFirst); SpriterObjectRef objectRefSecond = secondKeyA.ObjectRefs[i]; SpriterObject interpolatedSecond = GetObjectInfo(objectRefSecond, second, adjustedTimeSecond); SpriterObject info = Interpolate(interpolatedFirst, interpolatedSecond, factor, 1); info.Angle = MathHelper.CloserAngleLinear(interpolatedFirst.Angle, interpolatedSecond.Angle, factor); info.PivotX = MathHelper.Linear(interpolatedFirst.PivotX, interpolatedSecond.PivotX, factor); info.PivotY = MathHelper.Linear(interpolatedFirst.PivotY, interpolatedSecond.PivotY, factor); if (boneInfos != null && objectRefFirst.ParentId >= 0) { info.ApplyParentTransform(boneInfos[objectRefFirst.ParentId]); } AddSpatialData(info, currentAnimation.Timelines[objectRefFirst.TimelineId], currentAnimation.Entity.Spriter, deltaTime); Pool.ReturnObject(interpolatedFirst); Pool.ReturnObject(interpolatedSecond); } Pool.ReturnObject(boneInfosA); Pool.ReturnObject(boneInfosB); Pool.ReturnObject(boneInfos); if (Config.MetadataEnabled) { UpdateMetadata(currentAnimation, targetTime, deltaTime); } return(FrameData); }