Files
FlaxEngine/Source/Editor/Tools/Terrain/EditTerrainGizmoMode.cs
2024-02-26 19:00:48 +01:00

125 lines
3.3 KiB
C#

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
using System;
using FlaxEditor.Gizmo;
using FlaxEditor.Viewport;
using FlaxEditor.Viewport.Modes;
using FlaxEngine;
namespace FlaxEditor.Tools.Terrain
{
/// <summary>
/// Terrain management and editing tool.
/// </summary>
/// <seealso cref="FlaxEditor.Viewport.Modes.EditorGizmoMode" />
[HideInEditor]
public class EditTerrainGizmoMode : EditorGizmoMode
{
/// <summary>
/// The terrain properties editing modes.
/// </summary>
public enum Modes
{
/// <summary>
/// Terrain chunks editing mode.
/// </summary>
Edit,
/// <summary>
/// Terrain patches adding mode.
/// </summary>
Add,
/// <summary>
/// Terrain patches removing mode.
/// </summary>
Remove,
/// <summary>
/// Terrain exporting mode.
/// </summary>
Export,
}
private Modes _mode;
/// <summary>
/// The terrain editing gizmo.
/// </summary>
public EditTerrainGizmo Gizmo;
/// <summary>
/// The patch coordinates of the last picked patch.
/// </summary>
public Int2 SelectedPatchCoord { get; private set; }
/// <summary>
/// The chunk coordinates (relative to the patch) of the last picked chunk.
/// </summary>
public Int2 SelectedChunkCoord { get; private set; }
/// <summary>
/// Occurs when mode gets changed.
/// </summary>
public event Action ModeChanged;
/// <summary>
/// The active edit mode.
/// </summary>
public Modes EditMode
{
get => _mode;
set
{
if (_mode != value)
{
_mode = value;
ModeChanged?.Invoke();
}
}
}
/// <summary>
/// Occurs when selected patch or/and chunk coord gets changed (after picking by user).
/// </summary>
public event Action SelectedChunkCoordChanged;
/// <inheritdoc />
public override void Init(IGizmoOwner owner)
{
base.Init(owner);
EditMode = Modes.Edit;
Gizmo = new EditTerrainGizmo(owner, this);
}
/// <inheritdoc />
public override void OnActivated()
{
base.OnActivated();
Owner.Gizmos.Active = Gizmo;
}
/// <summary>
/// Sets the selected chunk coordinates.
/// </summary>
/// <param name="patchCoord">The patch coord.</param>
/// <param name="chunkCoord">The chunk coord.</param>
public void SetSelectedChunk(ref Int2 patchCoord, ref Int2 chunkCoord)
{
if (SelectedPatchCoord != patchCoord || SelectedChunkCoord != chunkCoord)
{
SelectedPatchCoord = patchCoord;
SelectedChunkCoord = chunkCoord;
OnSelectedTerrainChunkChanged();
}
}
private void OnSelectedTerrainChunkChanged()
{
SelectedChunkCoordChanged?.Invoke();
}
}
}