Improve camera panning

* add camera panning speed option to camera settings context menu
* add relative panning speed based on distance to camera target to camera settings context menu
* add relative panning option to camera settings context menu

* fix float comparisons
* remove invert panning entry from view widget
* remove unused show/hide method for camera widget
This commit is contained in:
Christopher Rothert
2023-10-04 21:05:21 +02:00
parent 3dcd1a5ffb
commit 67536f04e9
2 changed files with 74 additions and 42 deletions

View File

@@ -259,7 +259,10 @@ namespace FlaxEditor.Viewport.Cameras
// Pan // Pan
if (input.IsPanning) if (input.IsPanning)
{ {
var panningSpeed = 0.8f; var panningSpeed = (Viewport.RelativePanning)
? Mathf.Abs((position - TargetPoint).Length) * 0.005f
: Viewport.PanningSpeed;
if (Viewport.InvertPanning) if (Viewport.InvertPanning)
{ {
position += up * (mouseDelta.Y * panningSpeed); position += up * (mouseDelta.Y * panningSpeed);

View File

@@ -181,6 +181,8 @@ namespace FlaxEditor.Viewport
private float _orthoSize; private float _orthoSize;
private bool _isOrtho; private bool _isOrtho;
private float _wheelMovementChangeDeltaSum = 0; private float _wheelMovementChangeDeltaSum = 0;
private float _panningSpeed;
private bool _relativePanning;
private bool _invertPanning; private bool _invertPanning;
/// <summary> /// <summary>
@@ -412,6 +414,15 @@ namespace FlaxEditor.Viewport
set => _isOrtho = value; set => _isOrtho = value;
} }
/// <summary>
/// Gets or sets if the panning speed should be relative to the camera target.
/// </summary>
public bool RelativePanning
{
get => _relativePanning;
set => _relativePanning = value;
}
/// <summary> /// <summary>
/// Gets or sets if the panning direction is inverted. /// Gets or sets if the panning direction is inverted.
/// </summary> /// </summary>
@@ -421,6 +432,15 @@ namespace FlaxEditor.Viewport
set => _invertPanning = value; set => _invertPanning = value;
} }
/// <summary>
/// Gets or sets the camera panning speed.
/// </summary>
public float PanningSpeed
{
get => _panningSpeed;
set => _panningSpeed = value;
}
/// <summary> /// <summary>
/// The input actions collection to processed during user input. /// The input actions collection to processed during user input.
/// </summary> /// </summary>
@@ -508,7 +528,7 @@ namespace FlaxEditor.Viewport
maxCamSpeedValue.MinValue = minCamSpeedValue.Value; maxCamSpeedValue.MinValue = minCamSpeedValue.Value;
if (camSpeedValue.MinValue != minCamSpeedValue.Value) if (Math.Abs(camSpeedValue.MinValue - minCamSpeedValue.Value) > Mathf.Epsilon)
camSpeedValue.MinValue = minCamSpeedValue.Value; camSpeedValue.MinValue = minCamSpeedValue.Value;
}; };
cameraCM.VisibleChanged += control => minCamSpeedValue.Value = _minMovementSpeed; cameraCM.VisibleChanged += control => minCamSpeedValue.Value = _minMovementSpeed;
@@ -518,11 +538,48 @@ namespace FlaxEditor.Viewport
minCamSpeedValue.MaxValue = maxCamSpeedValue.Value; minCamSpeedValue.MaxValue = maxCamSpeedValue.Value;
if (camSpeedValue.MaxValue != maxCamSpeedValue.Value) if (Math.Abs(camSpeedValue.MaxValue - maxCamSpeedValue.Value) > Mathf.Epsilon)
camSpeedValue.MaxValue = maxCamSpeedValue.Value; camSpeedValue.MaxValue = maxCamSpeedValue.Value;
}; };
cameraCM.VisibleChanged += control => maxCamSpeedValue.Value = _maxMovementSpeed; cameraCM.VisibleChanged += control => maxCamSpeedValue.Value = _maxMovementSpeed;
// Panning Speed
{
var panningSpeed = cameraCM.AddButton("Panning Speed");
panningSpeed.CloseMenuOnClick = false;
var panningSpeedValue = new FloatValueBox(_panningSpeed, xLocationForExtras, 2, 70.0f, 0.01f, 128.0f, 0.1f)
{
Parent = panningSpeed
};
panningSpeedValue.ValueChanged += () => OnPanningSpeedChanged(panningSpeedValue);
cameraCM.VisibleChanged += control =>
{
panningSpeed.Visible = !_relativePanning;
panningSpeedValue.Value = _panningSpeed;
};
}
// Relative Panning
{
var relativePanning = cameraCM.AddButton("Relative Panning");
relativePanning.CloseMenuOnClick = false;
var relativePanningValue = new CheckBox(xLocationForExtras, 2, _relativePanning)
{
Parent = relativePanning
};
relativePanningValue.StateChanged += checkBox =>
{
if (checkBox.Checked != _relativePanning)
{
OnRelativePanningToggled(checkBox);
cameraCM.Hide();
}
};
cameraCM.VisibleChanged += control => relativePanningValue.Checked = _relativePanning;
}
// Invert Panning // Invert Panning
{ {
var invertPanning = cameraCM.AddButton("Invert Panning"); var invertPanning = cameraCM.AddButton("Invert Panning");
@@ -736,25 +793,6 @@ namespace FlaxEditor.Viewport
ViewWidgetButtonMenu.VisibleChanged += control => resolutionValue.Value = ResolutionScale; ViewWidgetButtonMenu.VisibleChanged += control => resolutionValue.Value = ResolutionScale;
} }
#endregion View mode widget #endregion View mode widget
// Invert Panning
{
var invert = ViewWidgetButtonMenu.AddButton("Invert Panning");
invert.CloseMenuOnClick = false;
var invertValue = new CheckBox(xLocationForExtras, 2, _invertPanning)
{
Parent = invert
};
invertValue.StateChanged += checkBox =>
{
if (checkBox.Checked != _invertPanning)
{
_invertPanning = checkBox.Checked;
}
};
ViewWidgetButtonMenu.VisibleChanged += control => invertValue.Checked = _invertPanning;
}
} }
InputActions.Add(options => options.ViewpointTop, () => OrientViewport(Quaternion.Euler(EditorViewportCameraViewpointValues.First(vp => vp.Name == "Top").Orientation))); InputActions.Add(options => options.ViewpointTop, () => OrientViewport(Quaternion.Euler(EditorViewportCameraViewpointValues.First(vp => vp.Name == "Top").Orientation)));
@@ -794,7 +832,16 @@ namespace FlaxEditor.Viewport
if (_movementSpeed > value) if (_movementSpeed > value)
_movementSpeed = value; _movementSpeed = value;
} }
private void OnPanningSpeedChanged(FloatValueBox control)
{
_panningSpeed = control.Value;
}
private void OnRelativePanningToggled(Control control)
{
_relativePanning = !_relativePanning;
}
private void OnInvertPanningToggled(Control control) private void OnInvertPanningToggled(Control control)
{ {
@@ -1636,24 +1683,6 @@ namespace FlaxEditor.Viewport
new ViewModeOptions(ViewMode.GlobalIllumination, "Global Illumination"), new ViewModeOptions(ViewMode.GlobalIllumination, "Global Illumination"),
}; };
private void WidgetCamSpeedShowHide(Control cm)
{
if (cm.Visible == false)
return;
var ccm = (ContextMenu)cm;
foreach (var e in ccm.Items)
{
if (e is ContextMenuButton b)
{
var v = (float)b.Tag;
b.Icon = Mathf.Abs(MovementSpeed - v) < 0.001f
? Style.Current.CheckBoxTick
: SpriteHandle.Invalid;
}
}
}
private void WidgetViewModeShowHideClicked(ContextMenuButton button) private void WidgetViewModeShowHideClicked(ContextMenuButton button)
{ {
if (button.Tag is ViewMode v) if (button.Tag is ViewMode v)