|
|
|
[Tool]
|
|
|
|
public partial class TerrainEditingControls
|
|
|
|
: VBoxContainer
|
|
|
|
{
|
|
|
|
public (ToolMode , Button)[] ToolModeButtons { get; private set; }
|
|
|
|
public (ToolShape, Button)[] ToolShapeButtons { 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<Button>("Height" )),
|
|
|
|
(ToolMode.Flatten, GetNode<Button>("Flatten")),
|
|
|
|
(ToolMode.Paint , GetNode<Button>("Paint" )),
|
|
|
|
];
|
|
|
|
ToolShapeButtons = [
|
|
|
|
(ToolShape.Corner, GetNode<Button>("Corner")),
|
|
|
|
(ToolShape.Circle, GetNode<Button>("Circle")),
|
|
|
|
(ToolShape.Square, GetNode<Button>("Square")),
|
|
|
|
];
|
|
|
|
PaintTextureButtons = [
|
|
|
|
GetNode<Button>("Grass"),
|
|
|
|
GetNode<Button>("Dirt"),
|
|
|
|
GetNode<Button>("Rock"),
|
|
|
|
GetNode<Button>("Sand"),
|
|
|
|
];
|
|
|
|
|
|
|
|
foreach (var (mode, button) in ToolModeButtons)
|
|
|
|
button.Pressed += () => SetToolMode(mode);
|
|
|
|
foreach (var (shape, button) in ToolShapeButtons)
|
|
|
|
button.Pressed += () => SetToolShape(shape);
|
|
|
|
foreach (var (i, button) in PaintTextureButtons.Select((b, i) => (i, b)))
|
|
|
|
button.Pressed += () => SetTexture(i + 1);
|
|
|
|
|
|
|
|
var drawSizeLabel = GetNode<Label>("SizeLabel");
|
|
|
|
DrawSizeSlider = GetNode<Slider>("SizeSlider");
|
|
|
|
DrawSizeSlider.ValueChanged += (_) => drawSizeLabel.Text = $"{DrawSize}";
|
|
|
|
|
|
|
|
UpDownToggle = GetNode<Button>("UpDown");
|
|
|
|
ConnectedToggle = GetNode<Button>("Connected");
|
|
|
|
}
|
|
|
|
|
|
|
|
ToolMode GetToolMode()
|
|
|
|
=> ToolModeButtons?.First(x => x.Item2.ButtonPressed).Item1 ?? ToolMode.Height;
|
|
|
|
void SetToolMode(ToolMode value)
|
|
|
|
{
|
|
|
|
if (ToolModeButtons == null) return;
|
|
|
|
foreach (var (mode, button) in ToolModeButtons)
|
|
|
|
button.Flat = !(button.ButtonPressed = value == mode);
|
|
|
|
foreach (var button in PaintTextureButtons)
|
|
|
|
button.Disabled = value != ToolMode.Paint;
|
|
|
|
|
|
|
|
// In paint mode, `ToolShape.Corner` affects a single tile regardless
|
|
|
|
// of `DrawSize`. This changes the button's icon to communicate that.
|
|
|
|
ToolShapeButtons[0].Item2.Icon = (value != ToolMode.Paint)
|
|
|
|
? CornerTextureNormal : CornerTexturePaint;
|
|
|
|
|
|
|
|
UpDownToggle.Disabled = value is ToolMode.Flatten or ToolMode.Paint;
|
|
|
|
ConnectedToggle.Disabled = value is ToolMode.Paint;
|
|
|
|
}
|
|
|
|
|
|
|
|
ToolShape GetToolShape()
|
|
|
|
=> ToolShapeButtons?.First(x => x.Item2.ButtonPressed).Item1 ?? ToolShape.Circle;
|
|
|
|
void SetToolShape(ToolShape value)
|
|
|
|
{
|
|
|
|
if (ToolShapeButtons == null) return;
|
|
|
|
foreach (var (shape, button) in ToolShapeButtons)
|
|
|
|
button.Flat = !(button.ButtonPressed = value == shape);
|
|
|
|
DrawSizeSlider.Editable = value != ToolShape.Corner;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GetDrawSize()
|
|
|
|
=> RoundToInt(-DrawSizeSlider?.Value ?? 1);
|
|
|
|
void SetDrawSize(int value)
|
|
|
|
{
|
|
|
|
if (DrawSizeSlider == null) return;
|
|
|
|
DrawSizeSlider.Value = -value;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GetTexture()
|
|
|
|
=> PaintTextureButtons?
|
|
|
|
.Select((b, i) => (Index: i + 1, Button: b))
|
|
|
|
.First(x => x.Button.ButtonPressed).Index ?? 1;
|
|
|
|
void SetTexture(int value)
|
|
|
|
{
|
|
|
|
if (PaintTextureButtons == null) return;
|
|
|
|
if ((value < 1) || (value > PaintTextureButtons.Length))
|
|
|
|
throw new ArgumentOutOfRangeException(nameof(value));
|
|
|
|
foreach (var (index, button) in PaintTextureButtons.Select((b, i) => (i, b)))
|
|
|
|
button.Flat = !(button.ButtonPressed = value == index + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public enum ToolMode
|
|
|
|
{
|
|
|
|
Height,
|
|
|
|
Flatten,
|
|
|
|
Paint,
|
|
|
|
}
|
|
|
|
|
|
|
|
public enum ToolShape
|
|
|
|
{
|
|
|
|
Corner,
|
|
|
|
Circle,
|
|
|
|
Square,
|
|
|
|
}
|