// Redraw scene instantly and optionally re-sort by timestamp-- will drop frames and thrash mem.
 // For use by internal tools which mutate MemoryObjects.
 public void Redraw(bool doSort)
 {
     ClearRedo();
     if (m_ScenePlayback == null)
     {
         foreach (var obj in m_MemoryList)
         {
             SketchMemoryScript.m_Instance.UnrenderStrokeMemoryObject(obj);
         }
         if (doSort)
         {
             SortMemoryList();
         }
         m_ScenePlayback = new ScenePlaybackByStrokeDistance(m_MemoryList);
         m_ScenePlayback.QuickLoadRemaining();
         m_ScenePlayback.Update();
         m_ScenePlayback = null;
     }
     else // timeline edit mode
     {
         var savedSketchTime = App.Instance.CurrentSketchTime;
         App.Instance.CurrentSketchTime = 0;
         m_ScenePlayback.Update();
         if (doSort)
         {
             SortMemoryList();
         }
         m_ScenePlayback = new ScenePlaybackByTimeLayered(m_MemoryList);
         App.Instance.CurrentSketchTime = savedSketchTime;
         m_ScenePlayback.Update();
     }
 }
        /// timeline edit mode: if forEdit is true, play audio countdown and keep user pointers enabled
        public void BeginDrawingFromMemory(bool bDrawFromStart, bool forEdit = false)
        {
            if (bDrawFromStart)
            {
                switch (m_PlaybackMode)
                {
                case PlaybackMode.Distance:
                default:
                    m_ScenePlayback = new ScenePlaybackByStrokeDistance(m_MemoryList);
                    PointerManager.m_Instance.SetPointersAudioForPlayback();
                    break;

                case PlaybackMode.Timestamps:
                    App.Instance.CurrentSketchTime = GetEarliestTimestamp();
                    m_ScenePlayback = new ScenePlaybackByTimeLayered(m_MemoryList);
                    break;
                }
                m_IsInitialPlay = true;
            }

            if (!forEdit)
            {
                PointerManager.m_Instance.SetInPlaybackMode(true);
                PointerManager.m_Instance.RequestPointerRendering(false);
            }
        }
 public void ClearMemory()
 {
     if (m_ScenePlayback != null)
     {
         // Ensure scene playback completes so that geometry is in state expected by rest of system.
         // TODO: Lift this restriction.  Artifact observed is a ghost stroke from previously deleted
         // scene appearing briefly.
         App.Instance.CurrentSketchTime = float.MaxValue;
         m_ScenePlayback.Update();
         m_ScenePlayback = null;
     }
     SelectionManager.m_Instance.ForgetStrokesInSelectionCanvas();
     ClearRedo();
     foreach (var item in m_MemoryList)
     {
         //skip batched strokes here because they'll all get dumped in ResetPools()
         if (item.m_Type != Stroke.Type.BatchedBrushStroke)
         {
             item.DestroyStroke();
         }
     }
     m_OperationStack.Clear();
     if (OperationStackChanged != null)
     {
         OperationStackChanged();
     }
     m_LastOperationStackCount = 0;
     m_MemoryList.Clear();
     App.GroupManager.ResetGroups();
     SelectionManager.m_Instance.OnFinishReset();
     m_CurrentNodeByTime = null;
     foreach (var canvas in App.Scene.AllCanvases)
     {
         canvas.BatchManager.ResetPools();
     }
     TiltMeterScript.m_Instance.ResetMeter();
     App.Instance.CurrentSketchTime         = 0;
     App.Instance.AutosaveRestoreFileExists = false;
     m_HasVisibleObjects    = false;
     m_MemoryExceeded       = false;
     m_LastCheckedVertCount = 0;
     MemoryWarningAccepted  = false;
     App.Switchboard.TriggerMemoryExceededChanged();
     SaveLoadScript.m_Instance.MarkAsAutosaveDone();
     SaveLoadScript.m_Instance.NewAutosaveFile();
     m_xfSketchInitial_RS = TrTransform.identity;
     Resources.UnloadUnusedAssets();
 }
 /// returns true if there is more to draw
 public bool ContinueDrawingFromMemory()
 {
     if (m_ScenePlayback != null && !m_ScenePlayback.Update())
     {
         if (m_IsInitialPlay)
         {
             m_IsInitialPlay = false;
             if (m_ScenePlayback.MaxPointerUnderrun > 0)
             {
                 Debug.LogFormat("Parallel pointer underrun during playback: deficient {0} pointers",
                                 m_ScenePlayback.MaxPointerUnderrun);
             }
             // we're done-- however in timeline edit mode we keep playback alive to allow scrubbing
             PointerManager.m_Instance.SetInPlaybackMode(false);
             PointerManager.m_Instance.RequestPointerRendering(true);
             m_ScenePlayback = null;
         }
         return(false);
     }
     return(true);
 }