public override void UpdateInfo(SynctoryFrameInfo info)
        {
            if (!enabled) return;

                string clipName = string.Format("{0}", info.Unit.Key);
                switch (BakeMode) {
                    case BakeOption.NONE:
                        //TODO: Cache existence
                        if (HadClipAtStartup(clipName)) {
                            PlayClip(clipName, StampUtils.InfoToSeconds(info));
                        } else {
                            OnNoAnimation();
                        }
                        break;
                    case BakeOption.MISSING_ANIMATIONS:
                        if (HadClipAtStartup(clipName)) {
                            PlayClip(clipName, StampUtils.InfoToSeconds(info));
                        } else {
                            BakeAnimation(info);
                        }
                        break;
                    case BakeOption.OVERWRITE_ANIMATIONS:
                        if (HadClipAtStartup(clipName)) {
                            OverwriteAnimation(info);
                        } else {
                            BakeAnimation(info);
                        }
                        break;
                }
        }
 public override void UpdateInfo(SynctoryFrameInfo info)
 {
     int hash = GetHash(info.Unit.Key);
         switch (BakeMode) {
             case BakeOption.NONE:
                 //TODO: Cache existence
                 if (HasStateHash(hash)) {
                     PlayAnimHash(hash, info.UnitProgression);
                 } else {
                     OnNoAnimation();
                 }
                 break;
             case BakeOption.MISSING_ANIMATIONS:
                 if (HasStateHash(hash)) {
                     PlayAnimHash(hash, info.UnitProgression);
                 } else {
                     BakeAnimation(info);
                 }
                 break;
             case BakeOption.OVERWRITE_ANIMATIONS:
                 if (HasStateHash(hash)) {
                     OverwriteAnimation(info);
                 } else {
                     BakeAnimation(info);
                 }
                 break;
         }
 }
        //NOTE: Units MUST be in order
        ////TODO: also need to check steps are all sequetial (in timestamps) too
        public SynctoryFrameInfo UpdateTime(TimeSpan time)
        {
            if (CachedUnits.Count == 0) {
                Debug.LogError("[Location] No cached units in location");
                return null;
            }

            TimeSpan unitEnd = TimeSpan.MaxValue;
            Unit candidateUnit = null;

            foreach (Unit unit in CachedUnits) {
                if (time >= unit.StartTime) {
                    candidateUnit = unit;
                } else {
                    unitEnd = unit.StartTime;
                    break;
                }
            }

            CurrentUnit = candidateUnit;

            SynctoryFrameInfo info = new SynctoryFrameInfo();
            info.Unit = CurrentUnit;
            info.Ticks = time.Ticks - CurrentUnit.StartTime.Ticks;
            info.TotalTicks = unitEnd.Ticks - CurrentUnit.StartTime.Ticks;
            LastFrameInfo = info;

            CurrentUnitProgression = LastFrameInfo.UnitProgression;

            return LastFrameInfo;
        }
        protected void UpdateBinders(SynctoryFrameInfo info)
        {
            if (!Application.isPlaying) {
                return;
            }

            foreach (SynctoryBinder binder in _Binders) {
                binder.UpdateInfo(info);
            }
        }
        private void PlayClip(SynctoryFrameInfo info)
        {
            UpdateTime(info);
                UpdatePitch(info);

                //TODO: skip time if delta too large
                //_AudioSource.time = (float) TimeSpan.FromTicks((long) info.Ticks).TotalSeconds;
                if (!_AudioSource.isPlaying) {
                    _AudioSource.Play();
                }
        }
        public override void UpdateInfo(SynctoryFrameInfo info)
        {
            if (!Synctory.Clock.IsPlaying()) {
                    _AudioSource.Stop();
                    return;
                }

                if (!TryUpdateClip(info.Unit.Key)) {
                    return;
                }

                float seconds = (float) TimeSpan.FromTicks((long) info.Ticks).TotalSeconds;
                if (seconds > _AudioSource.clip.length) {
                    OnClipEnd();
                } else {
                    PlayClip(info);
                }
        }
 private void UpdateTime(SynctoryFrameInfo info)
 {
     float syncSeconds= (float) TimeSpan.FromTicks((long) info.Ticks).TotalSeconds;
         float playbackDelta = _AudioSource.time - syncSeconds;
         if (Mathf.Abs(playbackDelta) >= SKIP_DELTA_THRESHOLD) {
             _AudioSource.time = (float) TimeSpan.FromTicks((long) info.Ticks).TotalSeconds;
         }
 }
        private void UpdatePitch(SynctoryFrameInfo info)
        {
            float syncSeconds= (float) TimeSpan.FromTicks((long) info.Ticks).TotalSeconds;
                float playbackDelta = _AudioSource.time - syncSeconds;

                float deltaTime = Time.smoothDeltaTime;
                float targetPitch = (deltaTime - playbackDelta) / deltaTime;

                _TargetPitch = Mathf.Min(MAX_PITCH, Mathf.Max(MIN_PITCH, targetPitch));
                _AudioSource.pitch += (_TargetPitch - _AudioSource.pitch) / PITCH_SEEK_DAMPENER;

                //Debug.Log("[AUDIO] Playback delta: " + playbackDelta + " pitch: " + _AudioSource.pitch);
        }
 public void TimeUpdated(SynctoryFrameInfo info)
 {
     UpdateBinders(info);
 }
 private void BakeAnimation(SynctoryFrameInfo info)
 {
 }
 private void OverwriteAnimation(SynctoryFrameInfo info)
 {
 }
 public override void UpdateInfo(SynctoryFrameInfo info)
 {
     int locationKey = info.Unit.Location.Key;
         _Agent.SetDestination(_Locations[locationKey].transform.position);
 }
        private void BakeAnimation(SynctoryFrameInfo info)
        {
            string clipName = string.Format("{0}", info.Unit.Key);

                AnimationClip clip = GetAnimationClip(clipName);

                float currentTime = StampUtils.InfoToSeconds(info);

                AnimUtils.AddTransformCurve("m_LocalPosition.x", clip,
                        _PrevTime, _PrevXPosition,
                        currentTime, transform.localPosition.x);
                AnimUtils.AddTransformCurve("m_LocalPosition.z", clip,
                        _PrevTime, _PrevZPosition,
                        currentTime, transform.localPosition.z);

                _PrevXPosition = transform.localPosition.x;
                _PrevZPosition = transform.localPosition.z;
                _PrevTime = currentTime;
        }
 public abstract void UpdateInfo(SynctoryFrameInfo info);