예제 #1
0
        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);
 }
예제 #4
0
        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);
        }
예제 #6
0
        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;
            }
        }