From be477542b8c3fbe5d97ccf355093066bc8ca4db7 Mon Sep 17 00:00:00 2001 From: copygirl Date: Sun, 29 Sep 2024 20:17:55 +0200 Subject: [PATCH] Changes to terrain editing controls - Added new buttons: - Flatten tool mode (not implemented) - Up / down toggle modifier Switches between moving terrain up or down - Connected toggle modifier Used to cause corners to be disconnected - Added ModifierToggleButton script Inversed by holding modifier button - "Corner" tool shape button switches to single tile texture in paint mode - Modify editing code to use modifier buttons --- .../terrain/editing/connected_off.png | Bin 0 -> 139 bytes .../terrain/editing/connected_off.png.import | 34 +++++++++++ .../textures/terrain/editing/connected_on.png | Bin 0 -> 133 bytes .../terrain/editing/connected_on.png.import | 34 +++++++++++ .../terrain/editing/corner.png.import | 2 +- .../textures/terrain/editing/corner_paint.png | Bin 0 -> 124 bytes .../terrain/editing/corner_paint.png.import | 34 +++++++++++ assets/textures/terrain/editing/flatten.png | Bin 0 -> 113 bytes .../terrain/editing/flatten.png.import | 34 +++++++++++ .../textures/terrain/editing/height_down.png | Bin 0 -> 135 bytes .../terrain/editing/height_down.png.import | 34 +++++++++++ assets/textures/terrain/editing/height_up.png | Bin 0 -> 149 bytes .../terrain/editing/height_up.png.import | 34 +++++++++++ terrain/editing/ModifierToggleButton.cs | 17 ++++++ .../editing/TerrainEditingControls+Editing.cs | 54 +++++++++--------- terrain/editing/TerrainEditingControls.cs | 25 +++++++- terrain/editing/TerrainEditingControls.tscn | 44 +++++++++++++- 17 files changed, 312 insertions(+), 34 deletions(-) create mode 100644 assets/textures/terrain/editing/connected_off.png create mode 100644 assets/textures/terrain/editing/connected_off.png.import create mode 100644 assets/textures/terrain/editing/connected_on.png create mode 100644 assets/textures/terrain/editing/connected_on.png.import create mode 100644 assets/textures/terrain/editing/corner_paint.png create mode 100644 assets/textures/terrain/editing/corner_paint.png.import create mode 100644 assets/textures/terrain/editing/flatten.png create mode 100644 assets/textures/terrain/editing/flatten.png.import create mode 100644 assets/textures/terrain/editing/height_down.png create mode 100644 assets/textures/terrain/editing/height_down.png.import create mode 100644 assets/textures/terrain/editing/height_up.png create mode 100644 assets/textures/terrain/editing/height_up.png.import create mode 100644 terrain/editing/ModifierToggleButton.cs diff --git a/assets/textures/terrain/editing/connected_off.png b/assets/textures/terrain/editing/connected_off.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1e59e51c57f2a02a33e66c2cfa2e208fb36538 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar`%7CpvN+P~c%nKl;Dk zGEQVo%Os7Z=QLYVJtB4p8E?+mwx`mM^|*M;iV43fT`#}!eDbD<@q_*pl^6OhFMhU* n2Sgayynggw$~Y(duP(33M*-pJDe@R??62SBG|9^YtNl|O2ZGKQBIIGdZSMrC$k{b+3 f3>P;V8!#~ZIm$0ka`fqPpt%g5u6{1-oD!MvzXXs&< zE=7-`0#gaL2SzN@4{ETvw6Z5(Z8(#bl5*s!14joB_pg3#hq-H> zpC;1U(-UzuN%Tmnwwbd5%LLQISCnVB=Wz%tp5@`;=?Q#zkR_IVdW%*=qD2P}_pg4n v{<{o0vo7);%w#wtQ!{B|q9Y5hL?#0RUxe#D=ZfSSpgjzpu6{1-oD!M Toggled += (on) => Icon = on ? OnTexture : OffTexture; + + public override void _Input(InputEvent ev) + { + if ((ev is InputEventKey { Keycode: var key }) && (key == ModifierKey)) + ButtonPressed = !ButtonPressed; + } +} diff --git a/terrain/editing/TerrainEditingControls+Editing.cs b/terrain/editing/TerrainEditingControls+Editing.cs index e5c42ad..3539871 100644 --- a/terrain/editing/TerrainEditingControls+Editing.cs +++ b/terrain/editing/TerrainEditingControls+Editing.cs @@ -74,43 +74,43 @@ public partial class TerrainEditingControls _ => throw new InvalidOperationException(), }).ToHashSet(); - // TODO: Handle different tool modes, such as painting. - // TODO: Add a flatten tool mode: Flattens everything selected to nearest corner height. + // TODO: Handle different tool modes, such as flatten and painting. // TODO: Allow click-dragging which doesn't affect already changed tiles / corners. // TODO: Support undo and redo. - // TODO: Support "disconnected" mode which can create vertical cliffs. + // TODO: Make mesh generation generate vertical walls between disconnected corners. + // TODO: Use ArrayMesh instead of ImmediateMesh. // Raise / lower the terrain if left / right mouse button is pressed. - if ((mouse is InputEventMouseButton { ButtonIndex: var button, Pressed: true }) - && (button is MouseButton.Left or MouseButton.Right)) - { + if (mouse is InputEventMouseButton { ButtonIndex: MouseButton.Left, Pressed: true }) { GetViewport().SetInputAsHandled(); const float AdjustHeight = 0.5f; - var amount = (button == MouseButton.Left) - ? AdjustHeight : -AdjustHeight; - - // Find corners that are "connected" and should be raised. - var corners = new HashSet<(TilePos Position, Corner Corner)>(); - foreach (var pos in tiles) { - var tile2 = terrain.GetTile(pos); - foreach (var corner2 in Enum.GetValues()) { - var height = tile2.Height[corner2]; - foreach (var (neighborPos, neighborCorner) in GetNeighbors(pos, corner2)) { - if (tiles.Contains(neighborPos)) continue; - var neighborHeight = terrain.GetTile(neighborPos).Height[neighborCorner]; - if (neighborHeight == height) corners.Add((neighborPos, neighborCorner)); + var amount = UpDownToggle.ButtonPressed ? AdjustHeight : -AdjustHeight; + + // If the Connected toggle button is active, move "connected" corners. + // Connected corners are the ones that are at the same height as ones already being moved. + if (ConnectedToggle.ButtonPressed) { + var corners = new HashSet<(TilePos Position, Corner Corner)>(); + foreach (var pos in tiles) { + var tile2 = terrain.GetTile(pos); + foreach (var corner2 in Enum.GetValues()) { + var height = tile2.Height[corner2]; + foreach (var (neighborPos, neighborCorner) in GetNeighbors(pos, corner2)) { + if (tiles.Contains(neighborPos)) continue; + var neighborHeight = terrain.GetTile(neighborPos).Height[neighborCorner]; + if (neighborHeight == height) corners.Add((neighborPos, neighborCorner)); + } } } - } - // Raise connected corners. - foreach (var group in corners.GroupBy(e => e.Position, e => e.Corner)) { - var pos = group.Key; - var tile2 = terrain.GetTile(pos); - foreach (var corner2 in group) - tile2.Height[corner2] += amount; - terrain.SetTile(pos, tile2); + // Raise connected corners. + foreach (var group in corners.GroupBy(e => e.Position, e => e.Corner)) { + var pos = group.Key; + var tile2 = terrain.GetTile(pos); + foreach (var corner2 in group) + tile2.Height[corner2] += amount; + terrain.SetTile(pos, tile2); + } } // Raise selected tiles themselves. diff --git a/terrain/editing/TerrainEditingControls.cs b/terrain/editing/TerrainEditingControls.cs index 163b222..cd4bf7e 100644 --- a/terrain/editing/TerrainEditingControls.cs +++ b/terrain/editing/TerrainEditingControls.cs @@ -4,19 +4,26 @@ public partial class TerrainEditingControls { public (ToolMode , Button)[] ToolModeButtons { get; private set; } public (ToolShape, Button)[] ToolShapeButtons { get; private set; } - public Button[] PaintTextureButtons { get; private set; } public Slider DrawSizeSlider { get; private set; } + public Button[] PaintTextureButtons { get; private set; } + + public Button UpDownToggle { get; private set; } + public Button ConnectedToggle { get; private set; } public ToolMode ToolMode { get => GetToolMode (); set => SetToolMode (value); } public ToolShape ToolShape { get => GetToolShape(); set => SetToolShape(value); } public int DrawSize { get => GetDrawSize (); set => SetDrawSize (value); } public int Texture { get => GetTexture (); set => SetTexture (value); } + [Export] public Texture2D CornerTextureNormal { get; set; } + [Export] public Texture2D CornerTexturePaint { get; set; } + public override void _Ready() { ToolModeButtons = [ - (ToolMode.Height, GetNode