// 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); }