public void GameUpdate() { GameUpdateHandleInput(); var updates = Track.Scheduler.UnqueueUpdates(); if (updates > 0) { Invalidate(); if (Track.Playing) { if (InputUtils.Check(Hotkey.PlaybackZoom)) { Track.ZoomBy(0.08f); } else if (InputUtils.Check(Hotkey.PlaybackUnzoom)) { Track.ZoomBy(-0.08f); } } } if (_autosavewatch.Elapsed.TotalMinutes >= 5) { _autosavewatch.Restart(); new Thread(() => { Track.BackupTrack(false); }).Start(); } if (Track.Playing) { if (ReversePlayback) { for (int i = 0; i < updates; i++) { Track.PreviousFrame(); Track.UpdateCamera(true); } } else { Track.Update(updates); } } AudioService.EnsureSync(); if (Program.NewVersion != null) { Canvas.ShowOutOfDate(); } }
private bool SelectLine(Vector2d gamepos) { using (var trk = game.Track.CreateTrackReader()) { var line = SelectLine(trk, gamepos, out bool knob); if (line != null) { _clickstart = gamepos; _active = true; //is it a knob? if (knob) { if (InputUtils.Check(Hotkey.ToolSelectBothJoints)) { _selection = new LineSelection(line, bothjoints: true); } else { var knobpos = Utility.CloserPoint( gamepos, line.Position, line.Position2); _selection = new LineSelection(line, knobpos); _hoverclick = true; _hovertime.Restart(); foreach (var snap in LineEndsInRadius(trk, knobpos, 1)) { if ((snap.Position == knobpos || snap.Position2 == knobpos) && snap != line) { _selection.snapped.Add(new LineSelection(snap, knobpos)); } } } return(true); } else { _selection = new LineSelection(line, true); return(true); } } } return(false); }
public void GameUpdate() { GameUpdateHandleInput(); var updates = Scheduler.UnqueueUpdates(); if (updates > 0) { Invalidate(); if (Track.Playing) { if (InputUtils.Check(Hotkey.PlaybackZoom)) { Zoom(0.08f); } else if (InputUtils.Check(Hotkey.PlaybackUnzoom)) { Zoom(-0.08f); } } } var qp = (!Track.PlaybackMode) ? InputUtils.Check(Hotkey.EditorQuickPan) : false; if (qp != _handToolOverride) { _handToolOverride = qp; if (_handToolOverride == false) { HandTool.Stop(); } Invalidate(); UpdateCursor(); } if (_autosavewatch.Elapsed.TotalMinutes >= 5) { _autosavewatch.Restart(); new Thread(() => { Track.BackupTrack(false); }).Start(); } if (Canvas.GetOpenWindows().Count != 0) { Invalidate(); } if (Track.Playing) { if (ReversePlayback) { Track.ActiveTriggers.Clear();//we don't want wonky unpredictable behavior for (int i = 0; i < updates; i++) { Track.PreviousFrame(); Track.UpdateCamera(true); } } else { Track.Update(updates); } } AudioService.EnsureSync(); if (Program.NewVersion != null) { Canvas.ShowOutOfDate(); } }
private void GameUpdateHandleInput() { if (InputUtils.HandleMouseMove(out int x, out int y) && !Canvas.IsModalOpen) { if (_handToolOverride) { HandTool.OnMouseMoved(new Vector2d(x, y)); } else { SelectedTool.OnMouseMoved(new Vector2d(x, y)); } } if (InputUtils.Check(Hotkey.PlaybackForward)) { if (!_playbacktemp || (ReversePlayback && !InputUtils.Check(Hotkey.PlaybackBackward))) { StopTools(); if (!Track.PlaybackMode) { Track.StartFromFlag(); Scheduler.DefaultSpeed(); } if (Track.Paused) { Track.TogglePause(); } Scheduler.Reset(); ReversePlayback = false; _playbacktemp = true; } } else if (InputUtils.Check(Hotkey.PlaybackBackward)) { if (!_playbacktemp || (!ReversePlayback && !InputUtils.Check(Hotkey.PlaybackForward))) { StopTools(); if (!Track.PlaybackMode) { Track.StartFromFlag(); Scheduler.DefaultSpeed(); } if (Track.Paused) { Track.TogglePause(); } Scheduler.Reset(); ReversePlayback = true; _playbacktemp = true; } } else if (_playbacktemp) { if (!Track.Paused) { Track.TogglePause(); } _playbacktemp = false; ReversePlayback = false; Track.UpdateCamera(); } }
public bool ShouldXySnap() { return(Settings.Local.ForceXySnap || InputUtils.Check(Hotkey.ToolXYSnap)); }
public override void OnMouseDown(Vector2d mousepos) { Stop();//double check var gamepos = ScreenToGameCoords(mousepos); using (var trk = game.Track.CreateTrackWriter()) { var line = SelectLine(trk, gamepos, out bool knob); if (line != null) { var point = Utility.CloserPoint( gamepos, line.Position, line.Position2); //is it a knob? if (knob) { _selection = new SelectInfo(); _selection.snapped = new List <SelectInfo>(); _selection.line = line; _selection.clone = line.Clone(); _clickstart = gamepos; if (InputUtils.Check(Hotkey.ToolSelectBothJoints)) { _selection.joint1 = _selection.joint2 = true; } else { if (line.Position == point) { _selection.joint1 = true; } else { _selection.joint2 = true; Debug.Assert( line.Position2 == point, "Right joint didn't match but was assigned"); } var snapcandidates = this.LineEndsInRadius(trk, point, 1); foreach (var v in snapcandidates) { if (v == line) { continue; } if (v.Position == point || v.Position2 == point) { _selection.snapped.Add(new SelectInfo() { joint1 = v.Position == point, joint2 = v.Position2 == point, line = v, clone = v.Clone() }); } } } Active = true; UpdateTooltip(); } else { _selection = new SelectInfo(); _selection.snapped = new List <SelectInfo>(); _selection.line = line; _selection.clone = line.Clone(); _clickstart = gamepos; _selection.joint1 = _selection.joint2 = true; Active = true; UpdateTooltip(); } } } base.OnMouseDown(gamepos); }
protected override void OnMouseDown(MouseButtonEventArgs e) { base.OnMouseDown(e); try { InputUtils.UpdateMouse(e.Mouse); if (linerider.IO.TrackRecorder.Recording) { return; } var r = _input.ProcessMouseMessage(e); _uicursor = _input.MouseCaptured; if (Canvas.GetOpenWindows().Count != 0) { UpdateCursor(); return; } if (!r) { InputUtils.ProcessMouseHotkeys(); if (!Track.Playing) { bool dragstart = false; if (Track.Offset == 0 && e.Button == MouseButton.Left && InputUtils.Check(Hotkey.EditorMoveStart)) { var gamepos = ScreenPosition + (new Vector2d(e.X, e.Y) / Track.Zoom); dragstart = Game.Rider.GetBounds( Track.GetStart()).Contains( gamepos.X, gamepos.Y); if (dragstart) { // 5 is arbitrary, but i assume that's a decent // place to assume the user has done "work" if (!Track.MoveStartWarned && Track.LineCount > 5) { var popup = MessageBox.Show(Canvas, "You're about to move the start position of the rider." + " This cannot be undone, and may drastically change how your track plays." + "\nAre you sure you want to do this?", "Warning", MessageBox.ButtonType.OkCancel); popup.RenameButtons("I understand"); popup.Dismissed += (o, args) => { if (popup.Result == Gwen.DialogResult.OK) { Track.MoveStartWarned = true; } }; } else { _dragRider = dragstart; } } } if (!_dragRider && !dragstart) { if (e.Button == MouseButton.Left) { CurrentTools.SelectedTool.OnMouseDown(new Vector2d(e.X, e.Y)); } else if (e.Button == MouseButton.Right) { CurrentTools.SelectedTool.OnMouseRightDown(new Vector2d(e.X, e.Y)); } } } else if (CurrentTools.SelectedTool == CurrentTools.PencilTool && CurrentTools.PencilTool.DrawingScenery) { if (e.Button == MouseButton.Left) { CurrentTools.PencilTool.OnMouseDown(new Vector2d(e.X, e.Y)); } } } UpdateCursor(); Invalidate(); } catch (Exception ex) { // SDL2 backend eats exceptions. // we have to manually crash. Program.Crash(ex, true); Close(); } }