diff --git a/addons/terrain-editing/TerrainEditingControls+Editing.cs b/addons/terrain-editing/TerrainEditingControls+Editing.cs index 91e7dae..fd4e29c 100644 --- a/addons/terrain-editing/TerrainEditingControls+Editing.cs +++ b/addons/terrain-editing/TerrainEditingControls+Editing.cs @@ -6,7 +6,7 @@ public partial class TerrainEditingControls (TilePos, TilePos)? _selection = null; Material _editToolMaterial; - void OnEditingReady() + public override void _EnterTree() { _editToolMaterial = new StandardMaterial3D { VertexColorUseAsAlbedo = true, diff --git a/addons/terrain-editing/TerrainEditingControls.cs b/addons/terrain-editing/TerrainEditingControls.cs index 11179ac..414e1ee 100644 --- a/addons/terrain-editing/TerrainEditingControls.cs +++ b/addons/terrain-editing/TerrainEditingControls.cs @@ -5,12 +5,11 @@ 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 Slider DrawSizeSlider { get; private set; } - - ToolMode _toolMode; - ToolShape _toolShape; - int _texture; + ToolMode _toolMode = ToolMode.Height; + ToolShape _toolShape = ToolShape.Circle; + int _texture = 1; public ToolMode ToolMode { get => _toolMode ; set => SetToolMode (value); } public ToolShape ToolShape { get => _toolShape; set => SetToolShape(value); } @@ -52,16 +51,17 @@ public partial class TerrainEditingControls DrawSizeSlider = GetNode("SizeSlider"); DrawSizeSlider.ValueChanged += (_) => drawSizeLabel.Text = $"{DrawSize}"; - SetToolMode(ToolMode.Height); - SetToolShape(ToolShape.Circle); - SetTexture(1); - - OnEditingReady(); + SetToolMode(_toolMode); + SetToolShape(_toolShape); + SetTexture(_texture); } void SetToolMode(ToolMode value) { + // Ignore if _Ready hasn't been called yet. + if (ToolModeButtons == null) return; + foreach (var (mode, button) in ToolModeButtons) button.Flat = button.ButtonPressed = value != mode; foreach (var button in PaintTextureButtons) @@ -71,6 +71,9 @@ public partial class TerrainEditingControls void SetToolShape(ToolShape value) { + // Ignore if _Ready hasn't been called yet. + if (ToolShapeButtons == null) return; + foreach (var (shape, button) in ToolShapeButtons) button.Flat = button.ButtonPressed = value != shape; DrawSizeSlider.Editable = value != ToolShape.Corner; @@ -79,6 +82,9 @@ public partial class TerrainEditingControls void SetTexture(int value) { + // Ignore if _Ready hasn't been called yet. + if (PaintTextureButtons == null) return; + if ((value < 1) || (value > PaintTextureButtons.Length)) throw new ArgumentOutOfRangeException(nameof(value)); foreach (var (i, button) in PaintTextureButtons.Select((b, i) => (i, b))) diff --git a/addons/terrain-editing/TerrainEditingPlugin.cs b/addons/terrain-editing/TerrainEditingPlugin.cs index 20f0668..6c8f0cf 100644 --- a/addons/terrain-editing/TerrainEditingPlugin.cs +++ b/addons/terrain-editing/TerrainEditingPlugin.cs @@ -1,9 +1,13 @@ #if TOOLS - [Tool] public partial class TerrainEditingPlugin : EditorPlugin { + const string ScenePath = "res://addons/terrain-editing/TerrainEditingControls.tscn"; + // The container to which the editing controls get added to when Terrain is selected. + const CustomControlContainer Container = CustomControlContainer.SpatialEditorSideRight; + + TerrainEditingControls _controls; public override bool _Handles(GodotObject obj) @@ -11,24 +15,25 @@ public partial class TerrainEditingPlugin public override void _EnterTree() { - var scene = GD.Load("res://addons/terrain-editing/TerrainEditingControls.tscn"); + var scene = GD.Load(ScenePath); _controls = scene.Instantiate(); } public override void _ExitTree() { if (_controls == null) return; - _controls.QueueFree(); + if (_controls.GetParent() != null) + RemoveControlFromContainer(Container, _controls); + _controls.Free(); _controls = null; } public override void _MakeVisible(bool visible) { - var container = CustomControlContainer.SpatialEditorSideRight; if (visible) - AddControlToContainer(container, _controls); - else if (_controls != null) - RemoveControlFromContainer(container, _controls); + AddControlToContainer(Container, _controls); + else if (_controls.GetParent() != null) + RemoveControlFromContainer(Container, _controls); } } #endif