public static void BakeTransforms(this Ref childRef, out Vector3 localPosition, out Vector3 localEulerAngles, out Vector3 localScale) { TimelineKey key = childRef.Referenced; localPosition = Vector3.zero; localScale = Vector3.one; localEulerAngles = Vector3.zero; var unmapped = childRef.Unmapped; var spatial = childRef.Referenced as SpatialTimelineKey; if (spatial != null) { localPosition = unmapped.Position; var spriteKey = key as SpriteTimelineKey; if (spriteKey != null) { var sinA = Mathf.Sin(unmapped.Angle); var cosA = Mathf.Cos(unmapped.Angle); var pvt = spriteKey.GetPivotOffetFromMiddle(); pvt.x *= unmapped.Scale.x; pvt.y *= unmapped.Scale.y; var rotPX = pvt.x * cosA - pvt.y * sinA; var rotPY = pvt.x * sinA + pvt.y * cosA; localPosition.x += rotPX; localPosition.y += rotPY; localScale.x = unmapped.Scale.x; localScale.y = unmapped.Scale.y; localPosition.z = ((ObjectRef)childRef).ZIndex * -Z_SPACING; } localPosition *= PIXEL_SCALE; localEulerAngles = new Vector3(0, 0, unmapped.Angle_Deg); } }
private void UpdateTransformCurve(ObjectCurves obj, Transform current, float time, TimelineKey lastTimelineKey, int zIndex = -1) { float val; //IsActive curve val = (current.gameObject.activeSelf) ? 1.0f : 0.0f; obj.Curves[(int)AnimationCurveIndex.IsActive].AddKey(new Keyframe(time, val, float.PositiveInfinity, float.PositiveInfinity) { tangentMode = 0 }); //Position curves obj.Curves[(int)AnimationCurveIndex.LocalPositionX].AddKey(new Keyframe(time, current.localPosition.x) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.LocalPositionY].AddKey(new Keyframe(time, current.localPosition.y) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.LocalPositionZ].AddKey(new Keyframe(time, current.localPosition.z, float.PositiveInfinity, float.PositiveInfinity)); //Z value always has instant transition //Rotation curves var quat = Quaternion.Euler(current.localEulerAngles); obj.Curves[(int)AnimationCurveIndex.LocalRotationX].AddKey(new Keyframe(time, quat.x) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.LocalRotationY].AddKey(new Keyframe(time, quat.y) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.LocalRotationZ].AddKey(new Keyframe(time, quat.z) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.LocalRotationW].AddKey(new Keyframe(time, quat.w) { tangentMode = 0 }, lastTimelineKey); //Scale curves obj.Curves[(int)AnimationCurveIndex.LocalScaleX].AddKey(new Keyframe(time, current.localScale.x) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.LocalScaleY].AddKey(new Keyframe(time, current.localScale.y) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.LocalScaleZ].AddKey(new Keyframe(time, current.localScale.z) { tangentMode = 0 }, lastTimelineKey); //Sprite Curves var spriteTimelineKey = lastTimelineKey as SpriteTimelineKey; if (spriteTimelineKey != null) { obj.IsSpriteKey = true; obj.Curves[(int)AnimationCurveIndex.ColorR].AddKey(new Keyframe(time, spriteTimelineKey.Tint.r) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.ColorG].AddKey(new Keyframe(time, spriteTimelineKey.Tint.g) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.ColorB].AddKey(new Keyframe(time, spriteTimelineKey.Tint.b) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.ColorA].AddKey(new Keyframe(time, spriteTimelineKey.Tint.a) { tangentMode = 0 }, lastTimelineKey); obj.Curves[(int)AnimationCurveIndex.ZIndex].AddKey(new Keyframe(time, zIndex, float.PositiveInfinity, float.PositiveInfinity)); } }
public void SetCurve(Transform root, Transform current, float time, TimelineKey lastTimelineKey, int zIndex = -1) { var path = AnimationUtility.CalculateTransformPath(current, root); var curves = GetOrCreateAnimationCurves(path); UpdateTransformCurve(curves, current, time, lastTimelineKey, zIndex); }
public static void AddKey(this AnimationCurve curve, Keyframe keyframe, TimelineKey lastKey) { var keys = curve.keys; //Early out - if this is the first key on this curve just add it if (keys.Length == 0) { curve.AddKey(keyframe); return; } if(lastKey == null) { Debug.Log(string.Format("ERROR: NULL lastkey passed to AddKey when curve contains {0} keys", keys.Length)); return; } //Get the last keyframe Keyframe lastKeyframe = keys[keys.Length - 1]; //If no TimelineKey is supplied, default to Linear curve CurveType curveType = lastKey.CurveType; switch (curveType) { case CurveType.Instant: lastKeyframe.outTangent = 0; curve.MoveKey(keys.Length - 1, lastKeyframe); keyframe.inTangent = float.PositiveInfinity; curve.AddKey(keyframe); break; case CurveType.Linear: var val = (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); lastKeyframe.outTangent = val; curve.MoveKey(keys.Length - 1, lastKeyframe); keyframe.inTangent = val; curve.AddKey(keyframe); break; case CurveType.Quadratic: { //Increase to cubic var c1 = (2 * lastKey.CurveParams[0]) / 3; var c2 = 1 - (2 * lastKey.CurveParams[0] + 1) / 3; //Convert [0,1] into unity-acceptable tangents c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); //Set the out tangent for the previous frame and update lastKeyframe.outTangent = c1; curve.MoveKey(keys.Length - 1, lastKeyframe); //Set the in tangent for the current frame and add keyframe.inTangent = c2; curve.AddKey(keyframe); break; } case CurveType.Cubic: { //Get curve parameters var c1 = lastKey.CurveParams[0]; var c2 = 1 - lastKey.CurveParams[1]; //Convert [0,1] into unity-acceptable tangents c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); //Set the out tangent for the previous frame and update lastKeyframe.outTangent = c1; curve.MoveKey(keys.Length - 1, lastKeyframe); //Set the in tangent for the current frame and add keyframe.inTangent = c2; curve.AddKey(keyframe); break; } default: Debug.LogWarning("CurveType " + curveType.ToString() + " not yet supported!"); break; } }
private void UpdateTransformCurve(AnimationCurve[] curves, Transform current, float time, TimelineKey lastTimelineKey) { float val; //IsActive curve val = (current.gameObject.activeSelf) ? 1.0f : 0.0f; curves[(int)AnimationCurveIndex.IsActive].AddKey(new Keyframe(time, val, float.PositiveInfinity, float.PositiveInfinity) { tangentMode = 0 }); //Position curves curves[(int)AnimationCurveIndex.LocalPositionX].AddKey(new Keyframe(time, current.localPosition.x) { tangentMode = 0 }, lastTimelineKey); curves[(int)AnimationCurveIndex.LocalPositionY].AddKey(new Keyframe(time, current.localPosition.y) { tangentMode = 0 }, lastTimelineKey); curves[(int)AnimationCurveIndex.LocalPositionZ].AddKey(new Keyframe(time, current.localPosition.z, float.PositiveInfinity, float.PositiveInfinity)); //Z value always has instant transition //Rotation curves var quat = Quaternion.Euler(current.localEulerAngles); curves[(int)AnimationCurveIndex.LocalRotationX].AddKey(new Keyframe(time, quat.x) { tangentMode = 0 }, lastTimelineKey); curves[(int)AnimationCurveIndex.LocalRotationY].AddKey(new Keyframe(time, quat.y) { tangentMode = 0 }, lastTimelineKey); curves[(int)AnimationCurveIndex.LocalRotationZ].AddKey(new Keyframe(time, quat.z) { tangentMode = 0 }, lastTimelineKey); curves[(int)AnimationCurveIndex.LocalRotationW].AddKey(new Keyframe(time, quat.w) { tangentMode = 0 }, lastTimelineKey); //Scale curves curves[(int)AnimationCurveIndex.LocalScaleX].AddKey(new Keyframe(time, current.localScale.x) { tangentMode = 0 }, lastTimelineKey); curves[(int)AnimationCurveIndex.LocalScaleY].AddKey(new Keyframe(time, current.localScale.y) { tangentMode = 0 }, lastTimelineKey); curves[(int)AnimationCurveIndex.LocalScaleZ].AddKey(new Keyframe(time, current.localScale.z) { tangentMode = 0 }, lastTimelineKey); }
public static void AddKey(this AnimationCurve curve, Keyframe keyframe, TimelineKey lastKey) { var keys = curve.keys; //Early out - if this is the first key on this curve just add it if (keys.Length == 0) { curve.AddKey(keyframe); return; } if (lastKey == null) { Debug.Log(string.Format("ERROR: NULL lastkey passed to AddKey when curve contains {0} keys", keys.Length)); return; } //Get the last keyframe Keyframe lastKeyframe = keys[keys.Length - 1]; //If no TimelineKey is supplied, default to Linear curve CurveType curveType = lastKey.CurveType; switch (curveType) { case CurveType.Instant: lastKeyframe.outTangent = 0; curve.MoveKey(keys.Length - 1, lastKeyframe); keyframe.inTangent = float.PositiveInfinity; curve.AddKey(keyframe); break; case CurveType.Linear: var val = (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); lastKeyframe.outTangent = val; curve.MoveKey(keys.Length - 1, lastKeyframe); keyframe.inTangent = val; curve.AddKey(keyframe); break; case CurveType.Quadratic: { //Increase to cubic var c1 = (2 * lastKey.CurveParams[0]) / 3; var c2 = 1 - (2 * lastKey.CurveParams[0] + 1) / 3; //Convert [0,1] into unity-acceptable tangents c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); //Set the out tangent for the previous frame and update lastKeyframe.outTangent = c1; curve.MoveKey(keys.Length - 1, lastKeyframe); //Set the in tangent for the current frame and add keyframe.inTangent = c2; curve.AddKey(keyframe); break; } case CurveType.Cubic: { //Get curve parameters var c1 = lastKey.CurveParams[0]; var c2 = 1 - lastKey.CurveParams[1]; //Convert [0,1] into unity-acceptable tangents c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time); //Set the out tangent for the previous frame and update lastKeyframe.outTangent = c1; curve.MoveKey(keys.Length - 1, lastKeyframe); //Set the in tangent for the current frame and add keyframe.inTangent = c2; curve.AddKey(keyframe); break; } default: Debug.LogWarning("CurveType " + curveType.ToString() + " not yet supported!"); break; } }