private void RegisterEditorHotkeys() { InputUtils.RegisterHotkey(Hotkey.EditorPencilTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.PencilTool); }); InputUtils.RegisterHotkey(Hotkey.EditorLineTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.LineTool); }); InputUtils.RegisterHotkey(Hotkey.EditorEraserTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.EraserTool); }); InputUtils.RegisterHotkey(Hotkey.EditorSelectTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.MoveTool); }); InputUtils.RegisterHotkey(Hotkey.EditorPanTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.HandTool); }); InputUtils.RegisterHotkey(Hotkey.EditorQuickPan, () => !Track.Playing && !Canvas.IsModalOpen, () => { CurrentTools.QuickPan = true; Invalidate(); UpdateCursor(); }, () => { CurrentTools.QuickPan = false; Invalidate(); UpdateCursor(); }); InputUtils.RegisterHotkey(Hotkey.EditorDragCanvas, () => !Track.Playing && !Canvas.IsModalOpen, () => { var mouse = InputUtils.GetMouse(); CurrentTools.QuickPan = true; CurrentTools.HandTool.OnMouseDown(new Vector2d(mouse.X, mouse.Y)); }, () => { if (CurrentTools.QuickPan) { var mouse = InputUtils.GetMouse(); CurrentTools.HandTool.OnMouseUp(new Vector2d(mouse.X, mouse.Y)); CurrentTools.QuickPan = false; } }); InputUtils.RegisterHotkey(Hotkey.EditorUndo, () => !Track.Playing, () => { CurrentTools.SelectedTool.Cancel(); var hint = Track.UndoManager.Undo(); CurrentTools.SelectedTool.OnUndoRedo(true, hint); Invalidate(); }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.EditorRedo, () => !Track.Playing, () => { CurrentTools.SelectedTool.Cancel(); var hint = Track.UndoManager.Redo(); CurrentTools.SelectedTool.OnUndoRedo(false, hint); Invalidate(); }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.EditorRemoveLatestLine, () => !Track.Playing, () => { if (!Track.Playing) { StopTools(); using (var trk = Track.CreateTrackWriter()) { CurrentTools.SelectedTool.Stop(); var l = trk.GetNewestLine(); if (l != null) { Track.UndoManager.BeginAction(); trk.RemoveLine(l); Track.UndoManager.EndAction(); } Track.NotifyTrackChanged(); Invalidate(); } } }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.EditorFocusStart, () => !Track.Playing, () => { using (var trk = Track.CreateTrackReader()) { var l = trk.GetOldestLine(); if (l != null) { Track.Camera.SetFrameCenter(l.Position); Invalidate(); } } }); InputUtils.RegisterHotkey(Hotkey.EditorFocusLastLine, () => !Track.Playing, () => { using (var trk = Track.CreateTrackReader()) { var l = trk.GetNewestLine(); if (l != null) { Track.Camera.SetFrameCenter(l.Position); Invalidate(); } } }); InputUtils.RegisterHotkey(Hotkey.EditorCycleToolSetting, () => !Track.Playing, () => { if (CurrentTools.SelectedTool.ShowSwatch) { CurrentTools.SelectedTool.Swatch.IncrementSelectedMultiplier(); Invalidate(); } }); InputUtils.RegisterHotkey(Hotkey.ToolToggleOverlay, () => !Track.Playing, () => { Settings.Local.TrackOverlay = !Settings.Local.TrackOverlay; }); InputUtils.RegisterHotkey(Hotkey.EditorToolColor1, () => !Track.Playing, () => { var swatch = CurrentTools.SelectedTool.Swatch; if (swatch != null) { swatch.Selected = LineType.Blue; } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorToolColor2, () => !Track.Playing, () => { var swatch = CurrentTools.SelectedTool.Swatch; if (swatch != null) { swatch.Selected = LineType.Red; } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorToolColor3, () => !Track.Playing, () => { var swatch = CurrentTools.SelectedTool.Swatch; if (swatch != null) { swatch.Selected = LineType.Scenery; } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorFocusFlag, () => !Track.Playing, () => { var flag = Track.GetFlag(); if (flag != null) { Track.Camera.SetFrameCenter(flag.State.CalculateCenter()); Invalidate(); } }); InputUtils.RegisterHotkey(Hotkey.EditorFocusRider, () => !Track.Playing, () => { Track.Camera.SetFrameCenter(Track.RenderRider.CalculateCenter()); Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorCancelTool, () => CurrentTools.SelectedTool.Active, () => { var tool = CurrentTools.SelectedTool; var selecttool = CurrentTools.SelectTool; if (tool == selecttool) { selecttool.CancelSelection(); } else { tool.Cancel(); } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.ToolCopy, () => !Track.Playing && CurrentTools.SelectedTool == CurrentTools.SelectTool, () => { CurrentTools.SelectTool.Copy(); Invalidate(); }, null, repeat: false); InputUtils.RegisterHotkey(Hotkey.ToolCut, () => !Track.Playing && CurrentTools.SelectedTool == CurrentTools.SelectTool, () => { CurrentTools.SelectTool.Cut(); Invalidate(); }, null, repeat: false); InputUtils.RegisterHotkey(Hotkey.ToolPaste, () => !Track.Playing && (CurrentTools.SelectedTool == CurrentTools.SelectTool || CurrentTools.SelectedTool == CurrentTools.MoveTool), () => { CurrentTools.SelectTool.Paste(); Invalidate(); }, null, repeat: false); InputUtils.RegisterHotkey(Hotkey.ToolDelete, () => !Track.Playing && CurrentTools.SelectedTool == CurrentTools.SelectTool, () => { CurrentTools.SelectTool.Delete(); Invalidate(); }, null, repeat: false); }
public void Render(float blend = 1) { bool shouldrender = _invalidated || Canvas.NeedsRedraw || (Track.Playing) || Canvas.Loading || Track.NeedsDraw || CurrentTools.SelectedTool.NeedsRender; if (shouldrender) { _invalidated = false; BeginOrtho(); if (blend == 1 && Settings.SmoothPlayback && Track.Playing && !Canvas.Scrubbing) { blend = Math.Min(1, (float)Track.Scheduler.ElapsedPercent); if (ReversePlayback) { blend = 1 - blend; } Track.Camera.BeginFrame(blend, Track.Zoom); } else { Track.Camera.BeginFrame(blend, Track.Zoom); } if (Track.Playing && CurrentTools.PencilTool.Active) { CurrentTools.PencilTool.OnMouseMoved(InputUtils.GetMouse()); } GL.ClearColor(Settings.NightMode ? Constants.ColorNightMode : (Settings.WhiteBG ? Constants.ColorWhite : Constants.ColorOffwhite)); MSAABuffer.Use(RenderSize.Width, RenderSize.Height); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); GL.Clear(ClearBufferMask.ColorBufferBit); GL.Enable(EnableCap.Blend); #if debuggrid if (this.Keyboard.GetState().IsKeyDown(Key.C)) { GameRenderer.DbgDrawGrid(); } #endif Track.Render(blend); #if debugcamera if (this.Keyboard.GetState().IsKeyDown(Key.C)) { GameRenderer.DbgDrawCamera(); } #endif Canvas.RenderCanvas(); MSAABuffer.End(); if (Settings.NightMode) { StaticRenderer.RenderRect(new FloatRect(0, 0, RenderSize.Width, RenderSize.Height), Color.FromArgb(40, 0, 0, 0)); } SwapBuffers(); //there are machines and cases where a refresh may not hit the screen without calling glfinish... GL.Finish(); var seconds = Track.FramerateWatch.Elapsed.TotalSeconds; Track.FramerateCounter.AddFrame(seconds); Track.FramerateWatch.Restart(); } if (!Focused && !TrackRecorder.Recording) { Thread.Sleep(16); } else if (!Track.Playing && !Canvas.NeedsRedraw && !Track.NeedsDraw && !CurrentTools.SelectedTool.Active) { Thread.Sleep(10); } }
private void RegisterPlaybackHotkeys() { InputUtils.RegisterHotkey(Hotkey.PlaybackStartSlowmo, () => true, () => { StopTools(); Track.StartFromFlag(); Track.Scheduler.UpdatesPerSecond = Settings.SlowmoSpeed; }); InputUtils.RegisterHotkey(Hotkey.PlaybackStartIgnoreFlag, () => true, () => { StopTools(); Track.StartIgnoreFlag(); Track.ResetSpeedDefault(); }); // InputUtils.RegisterHotkey(Hotkey.PlaybackStartGhostFlag, () => true, () => // { // StopTools(); // Track.ResumeFromFlag(); // Track.ResetSpeedDefault(); // }); InputUtils.RegisterHotkey(Hotkey.PlaybackStart, () => true, () => { StopTools(); Track.StartFromFlag(); Track.ResetSpeedDefault(); }); InputUtils.RegisterHotkey(Hotkey.PlaybackStop, () => true, () => { StopTools(); Track.Stop(); }); InputUtils.RegisterHotkey(Hotkey.PlaybackFlag, () => true, () => { Track.Flag(Track.Offset); }); InputUtils.RegisterHotkey(Hotkey.PlaybackForward, () => true, () => { StopTools(); if (Track.Paused) { Track.TogglePause(); } ReversePlayback = false; UpdateCursor(); }, () => { if (!Track.Paused) { Track.TogglePause(); } ReversePlayback = false; Track.UpdateCamera(); UpdateCursor(); }); InputUtils.RegisterHotkey(Hotkey.PlaybackBackward, () => true, () => { StopTools(); if (Track.Paused) { Track.TogglePause(); } ReversePlayback = true; UpdateCursor(); }, () => { if (!Track.Paused) { Track.TogglePause(); } ReversePlayback = false; Track.UpdateCamera(); UpdateCursor(); }); InputUtils.RegisterHotkey(Hotkey.PlaybackFrameNext, () => true, () => { StopHandTool(); if (!Track.Paused) { Track.TogglePause(); } Track.NextFrame(); Invalidate(); Track.UpdateCamera(); if (CurrentTools.SelectedTool.IsMouseButtonDown) { CurrentTools.SelectedTool.OnMouseMoved(InputUtils.GetMouse()); } }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.PlaybackFramePrev, () => true, () => { StopHandTool(); if (!Track.Paused) { Track.TogglePause(); } Track.PreviousFrame(); Invalidate(); Track.UpdateCamera(true); if (CurrentTools.SelectedTool.IsMouseButtonDown) { CurrentTools.SelectedTool.OnMouseMoved(InputUtils.GetMouse()); } }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.PlaybackSpeedUp, () => true, () => { Track.PlaybackSpeedUp(); }); InputUtils.RegisterHotkey(Hotkey.PlaybackSpeedDown, () => true, () => { Track.PlaybackSpeedDown(); }); InputUtils.RegisterHotkey(Hotkey.PlaybackSlowmo, () => true, () => { if (Track.Scheduler.UpdatesPerSecond != Settings.SlowmoSpeed) { Track.Scheduler.UpdatesPerSecond = Settings.SlowmoSpeed; } else { Track.ResetSpeedDefault(false); } }); InputUtils.RegisterHotkey(Hotkey.PlaybackTogglePause, () => true, () => { StopTools(); Track.TogglePause(); }, null, repeat: false); InputUtils.RegisterHotkey(Hotkey.PlaybackIterationNext, () => !Track.Playing, () => { StopTools(); if (!Track.Paused) { Track.TogglePause(); } if (Track.IterationsOffset != 6) { Track.IterationsOffset++; } else { Track.NextFrame(); Track.IterationsOffset = 0; Track.UpdateCamera(); } Track.InvalidateRenderRider(); }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.PlaybackIterationPrev, () => !Track.Playing, () => { if (Track.Offset != 0) { StopTools(); if (Track.IterationsOffset > 0) { Track.IterationsOffset--; } else { Track.PreviousFrame(); Track.IterationsOffset = 6; Invalidate(); Track.UpdateCamera(); } Track.InvalidateRenderRider(); } }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.PlaybackResetCamera, () => true, () => { Track.Zoom = Track.Timeline.GetFrameZoom(Track.Offset); Track.UseUserZoom = false; Track.UpdateCamera(); }); }
private void RegisterEditorHotkeys() { InputUtils.RegisterHotkey(Hotkey.ToggleAll, () => !Track.Playing, () => { if (Settings.ToggleConfig) { if (Settings.ConfigTContactPoints) { Settings.Editor.DrawContactPoints = true; } if (Settings.ConfigTGravityWells) { Settings.Editor.RenderGravityWells = true; } if (Settings.ConfigTHitTest) { Settings.Editor.HitTest = true; } if (Settings.ConfigTMomentumVectors) { Settings.Editor.MomentumVectors = true; } if (Settings.ConfigTOnionSkinning) { Settings.OnionSkinning = true; } Settings.ToggleConfig = false; } else { if (Settings.ConfigTContactPoints) { Settings.Editor.DrawContactPoints = false; } if (Settings.ConfigTGravityWells) { Settings.Editor.RenderGravityWells = false; } if (Settings.ConfigTHitTest) { Settings.Editor.HitTest = false; } if (Settings.ConfigTMomentumVectors) { Settings.Editor.MomentumVectors = false; } if (Settings.ConfigTOnionSkinning) { Settings.OnionSkinning = false; } Settings.ToggleConfig = true; } }); InputUtils.RegisterHotkey(Hotkey.ScenerySetSmall, () => !Track.Playing, () => { var toolswatch = CurrentTools.SelectedTool.Swatch; toolswatch.GreenMultiplier = 0.1f; }); InputUtils.RegisterHotkey(Hotkey.SceneryIncreaseBig, () => !Track.Playing, () => { var toolswatch = CurrentTools.SelectedTool.Swatch; toolswatch.GreenMultiplier = (float)Math.Round(Math.Min(25.5f, toolswatch.GreenMultiplier + 0.10f), 2); }); InputUtils.RegisterHotkey(Hotkey.SceneryDecreaseBig, () => !Track.Playing, () => { var toolswatch = CurrentTools.SelectedTool.Swatch; toolswatch.GreenMultiplier = (float)Math.Round(Math.Max(0.1f, toolswatch.GreenMultiplier - 0.10f), 2); }); InputUtils.RegisterHotkey(Hotkey.AccelerationSetSmall, () => !Track.Playing, () => { var toolswatch = CurrentTools.SelectedTool.Swatch; toolswatch.RedMultiplier = 1; }); InputUtils.RegisterHotkey(Hotkey.AccelerationSetMedium, () => !Track.Playing, () => { var toolswatch = CurrentTools.SelectedTool.Swatch; toolswatch.RedMultiplier = 100; }); InputUtils.RegisterHotkey(Hotkey.AccelerationSetLarge, () => !Track.Playing, () => { var toolswatch = CurrentTools.SelectedTool.Swatch; toolswatch.RedMultiplier = 200; }); InputUtils.RegisterHotkey(Hotkey.AccelerationSetMax, () => !Track.Playing, () => { var toolswatch = CurrentTools.SelectedTool.Swatch; toolswatch.RedMultiplier = 255; }); InputUtils.RegisterHotkey(Hotkey.EditorPencilTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.PencilTool); }); InputUtils.RegisterHotkey(Hotkey.EditorLineTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.LineTool); }); InputUtils.RegisterHotkey(Hotkey.EditorEraserTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.EraserTool); }); InputUtils.RegisterHotkey(Hotkey.EditorSelectTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.MoveTool); }); InputUtils.RegisterHotkey(Hotkey.EditorPanTool, () => !Track.Playing, () => { CurrentTools.SetTool(CurrentTools.HandTool); }); InputUtils.RegisterHotkey(Hotkey.EditorQuickPan, () => !Track.Playing && !Canvas.IsModalOpen, () => { CurrentTools.QuickPan = true; Invalidate(); UpdateCursor(); }, () => { CurrentTools.QuickPan = false; Invalidate(); UpdateCursor(); }); InputUtils.RegisterHotkey(Hotkey.EditorDragCanvas, () => !Track.Playing && !Canvas.IsModalOpen, () => { var mouse = InputUtils.GetMouse(); CurrentTools.QuickPan = true; CurrentTools.HandTool.OnMouseDown(new Vector2d(mouse.X, mouse.Y)); }, () => { if (CurrentTools.QuickPan) { var mouse = InputUtils.GetMouse(); CurrentTools.HandTool.OnMouseUp(new Vector2d(mouse.X, mouse.Y)); CurrentTools.QuickPan = false; } }); InputUtils.RegisterHotkey(Hotkey.EditorUndo, () => !Track.Playing, () => { CurrentTools.SelectedTool.Cancel(); var hint = Track.UndoManager.Undo(); CurrentTools.SelectedTool.OnUndoRedo(true, hint); Invalidate(); }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.EditorRedo, () => !Track.Playing, () => { CurrentTools.SelectedTool.Cancel(); var hint = Track.UndoManager.Redo(); CurrentTools.SelectedTool.OnUndoRedo(false, hint); Invalidate(); }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.EditorRemoveLatestLine, () => !Track.Playing, () => { if (!Track.Playing) { StopTools(); using (var trk = Track.CreateTrackWriter()) { CurrentTools.SelectedTool.Stop(); var l = trk.GetNewestLine(); if (l != null) { Track.UndoManager.BeginAction(); trk.RemoveLine(l); Track.UndoManager.EndAction(); } Track.NotifyTrackChanged(); Invalidate(); } } }, null, repeat: true); InputUtils.RegisterHotkey(Hotkey.EditorFocusStart, () => !Track.Playing, () => { using (var trk = Track.CreateTrackReader()) { var l = trk.GetOldestLine(); if (l != null) { Track.Camera.SetFrameCenter(l.Position); Invalidate(); } } }); InputUtils.RegisterHotkey(Hotkey.EditorFocusLastLine, () => !Track.Playing, () => { using (var trk = Track.CreateTrackReader()) { var l = trk.GetNewestLine(); if (l != null) { Track.Camera.SetFrameCenter(l.Position); Invalidate(); } } }); InputUtils.RegisterHotkey(Hotkey.EditorCycleToolSetting, () => !Track.Playing, () => { if (CurrentTools.SelectedTool.ShowSwatch) { CurrentTools.SelectedTool.Swatch.IncrementSelectedMultiplier(); Invalidate(); } }); InputUtils.RegisterHotkey(Hotkey.ToolToggleOverlay, () => !Track.Playing, () => { Settings.Local.TrackOverlay = !Settings.Local.TrackOverlay; }); InputUtils.RegisterHotkey(Hotkey.EditorToolColor1, () => !Track.Playing, () => { var swatch = CurrentTools.SelectedTool.Swatch; if (swatch != null) { swatch.Selected = LineType.Blue; } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorToolColor2, () => !Track.Playing, () => { var swatch = CurrentTools.SelectedTool.Swatch; if (swatch != null) { swatch.Selected = LineType.Red; } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorToolColor3, () => !Track.Playing, () => { var swatch = CurrentTools.SelectedTool.Swatch; if (swatch != null) { swatch.Selected = LineType.Scenery; } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorFocusFlag, () => !Track.Playing, () => { var flag = Track.GetFlag(); if (flag != null) { Track.Camera.SetFrameCenter(flag.State.CalculateCenter()); Invalidate(); } }); InputUtils.RegisterHotkey(Hotkey.EditorFocusRider, () => !Track.Playing, () => { Track.Camera.SetFrameCenter(Track.RenderRider.CalculateCenter()); Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.EditorCancelTool, () => CurrentTools.SelectedTool.Active, () => { var tool = CurrentTools.SelectedTool; var selecttool = CurrentTools.SelectTool; if (tool == selecttool) { selecttool.CancelSelection(); } else { tool.Cancel(); } Invalidate(); }); InputUtils.RegisterHotkey(Hotkey.ToolCopy, () => !Track.Playing && CurrentTools.SelectedTool == CurrentTools.SelectTool, () => { CurrentTools.SelectTool.Copy(); Invalidate(); }, null, repeat: false); InputUtils.RegisterHotkey(Hotkey.ToolCut, () => !Track.Playing && CurrentTools.SelectedTool == CurrentTools.SelectTool, () => { CurrentTools.SelectTool.Cut(); Invalidate(); }, null, repeat: false); InputUtils.RegisterHotkey(Hotkey.ToolPaste, () => !Track.Playing && (CurrentTools.SelectedTool == CurrentTools.SelectTool || CurrentTools.SelectedTool == CurrentTools.MoveTool), () => { CurrentTools.SelectTool.Paste(); Invalidate(); }, null, repeat: false); InputUtils.RegisterHotkey(Hotkey.ToolDelete, () => !Track.Playing && CurrentTools.SelectedTool == CurrentTools.SelectTool, () => { CurrentTools.SelectTool.Delete(); Invalidate(); }, null, repeat: false); }