예제 #1
0
    // Use this for initialization
    void Start()
    {
        //check for a rigid body and if there is one create a timeRigidBody
        if (!rigidBody)
        {
            rigidBody = GetComponent <Rigidbody>();
        }
        if (rigidBody)
        {
            timeRigidBody = new TimeRigidBody(this, rigidBody);
        }

        //initialize timeScale
        timeScale = (bOnLocalTime)? localTimeScale : TimeManager.global.timeScale;

        positionHistory = new TimeHistory <Vector3>(transform.position, capturePerSecond);
        rotationHistory = new TimeHistory <Quaternion>(transform.rotation, capturePerSecond);
        scaleHistory    = new TimeHistory <Vector3>(transform.localScale, capturePerSecond);

        if (timeRigidBody != null)
        {
            realVelocityHistory        = new TimeHistory <Vector3>(Vector3.zero, capturePerSecond);
            realAngularVelocityHistory = new TimeHistory <Vector3>(Vector3.zero, capturePerSecond);
        }
    }
예제 #2
0
 public static void ForwardUpdate <T>(TimeHistory <T> timeHistory, float time, T value)
 {
     if (timeHistory.bInterpolate)
     {
         List <TimeInfoInterp <T> > hist = timeHistory.historyInterp;
         if (time - hist[hist.Count - 1].time > timeHistory.snapshotInterval)
         {
             if (!value.Equals(hist[hist.Count - 1].data))
             {
                 hist.Add(new TimeInfoInterp <T>(value, time));
             }
             else
             {
                 hist[hist.Count - 1].time = time;
             }
         }
     }
     else
     {
         List <TimeInfo <T> > hist = timeHistory.history;
         if (time - hist[hist.Count - 1].time > timeHistory.snapshotInterval)
         {
             if (!value.Equals(hist[hist.Count - 1].data))
             {
                 hist.Add(new TimeInfo <T>(value, time));
             }
             else
             {
                 hist[hist.Count - 1].time = time;
             }
         }
     }
 }
예제 #3
0
    //TODO: return interpolate struct since C# can't into generics arithmatic
    public static TimeInfo <T> RewindTo <T>(TimeHistory <T> timeHistory, float time)
    {
        float clampedTime = (time >= 0f)? time : 0f;

        if (timeHistory.bInterpolate)
        {
            List <TimeInfoInterp <T> > hist = timeHistory.historyInterp;
            while (hist.Count > 1 && hist[hist.Count - 2].time >= clampedTime)
            {
                hist.RemoveAt(hist.Count - 1);
            }
            hist[hist.Count - 1].time = clampedTime;
            TimeInfo <T> valueAt = new TimeInfo <T>(hist[hist.Count - 1].data, hist[hist.Count - 1].time);
            return(valueAt);
        }
        else
        {
            List <TimeInfo <T> > hist = timeHistory.history;
            while (hist.Count > 1 && hist[hist.Count - 2].time >= clampedTime)
            {
                hist.RemoveAt(hist.Count - 1);
            }
            hist[hist.Count - 1].time = clampedTime;
            TimeInfo <T> valueAt = new TimeInfo <T>(hist[hist.Count - 1].data, hist[hist.Count - 1].time);
            return(valueAt);
        }
    }
예제 #4
0
    void ForwardUpdate()
    {
        TimeHistory <Vector3> .ForwardUpdate(positionHistory, time, transform.position);

        TimeHistory <Quaternion> .ForwardUpdate(rotationHistory, time, transform.rotation);

        TimeHistory <Vector3> .ForwardUpdate(scaleHistory, time, transform.localScale);

        //update rigidbody info
        if (timeRigidBody != null)
        {
            TimeHistory <Vector3> .ForwardUpdate(realVelocityHistory, time, timeRigidBody.realVelocity);

            TimeHistory <Vector3> .ForwardUpdate(realAngularVelocityHistory, time, timeRigidBody.realAngularVelocity);
        }

        //TODO: update animation info
    }
예제 #5
0
    void RewindUpdate()
    {
        TimeInfo <Vector3> posTimeInfo = TimeHistory <Vector3> .RewindTo(positionHistory, time);        //used to set object's time

        //rewind transform
        transform.position = posTimeInfo.data;
        transform.rotation = TimeHistory <Quaternion> .RewindTo(rotationHistory, time).data;

        transform.localScale = TimeHistory <Vector3> .RewindTo(scaleHistory, time).data;

        //rewind rigidbody
        if (timeRigidBody != null)
        {
            timeRigidBody.realVelocity = TimeHistory <Vector3> .RewindTo(realVelocityHistory, time).data;

            timeRigidBody.realAngularVelocity = TimeHistory <Vector3> .RewindTo(realAngularVelocityHistory, time).data;
        }

        //TODO: rewind animation

        time = posTimeInfo.time;
    }
예제 #6
0
    public void RewindBy(float seconds)
    {
        float clampedSeconds = (seconds >= 0f)? seconds : 0f;                                                     //function isn't meant for fastforwarding'

        TimeInfo <Vector3> posTimeInfo = TimeHistory <Vector3> .RewindTo(positionHistory, time - clampedSeconds); //used to set object's time

        //rewind transform
        transform.position = posTimeInfo.data;
        transform.rotation = TimeHistory <Quaternion> .RewindTo(rotationHistory, time - clampedSeconds).data;

        transform.localScale = TimeHistory <Vector3> .RewindTo(scaleHistory, time - clampedSeconds).data;

        //rewind rigidbody
        if (timeRigidBody != null)
        {
            timeRigidBody.realVelocity = TimeHistory <Vector3> .RewindTo(realVelocityHistory, time - clampedSeconds).data;

            timeRigidBody.realAngularVelocity = TimeHistory <Vector3> .RewindTo(realAngularVelocityHistory, time - clampedSeconds).data;
        }

        //TODO: rewind animation
        time = posTimeInfo.time;
    }