diff --git a/assets/icons/delete.svg b/assets/icons/delete.svg
new file mode 100644
index 00000000..6e85a8a5
--- /dev/null
+++ b/assets/icons/delete.svg
@@ -0,0 +1,54 @@
+
+
+
+
diff --git a/project/assets/icons/delete.svg b/project/assets/icons/delete.svg
new file mode 100644
index 00000000..49dca652
--- /dev/null
+++ b/project/assets/icons/delete.svg
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/project/assets/icons/delete.svg.import b/project/assets/icons/delete.svg.import
new file mode 100644
index 00000000..48c74338
--- /dev/null
+++ b/project/assets/icons/delete.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bt72qid068u8u"
+path="res://.godot/imported/delete.svg-e643415b9eb11db5bc3eead7997989c4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/icons/delete.svg"
+dest_files=["res://.godot/imported/delete.svg-e643415b9eb11db5bc3eead7997989c4.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/project/objects/primitive_nodes/point_primitive_node.tscn b/project/objects/primitive_nodes/point_primitive_node.tscn
index 839a4079..1219b926 100644
--- a/project/objects/primitive_nodes/point_primitive_node.tscn
+++ b/project/objects/primitive_nodes/point_primitive_node.tscn
@@ -4,6 +4,7 @@
[ext_resource type="Material" uid="uid://b4ip0oq8o76mc" path="res://assets/materials/peak_handle_depth_tested.tres" id="2_mx0s0"]
[sub_resource type="GDScript" id="GDScript_njtj3"]
+resource_name = "HeightHandle"
script/source = "extends Area3D
var dragged : bool = false
@@ -43,6 +44,7 @@ height = 9.59302
radius = 5.78125
[sub_resource type="GDScript" id="GDScript_s814u"]
+resource_name = "SlopeHandle"
script/source = "extends Area3D
var dragged : bool = false
@@ -85,6 +87,7 @@ func _input_event(_camera: Camera3D, event: InputEvent, _event_position: Vector3
"
[sub_resource type="GDScript" id="GDScript_mx0s0"]
+resource_name = "PositionHandle"
script/source = "extends Area3D
var dragged : bool = false
diff --git a/project/scenes/editor.tscn b/project/scenes/editor.tscn
index 375d9a05..e04f7172 100644
--- a/project/scenes/editor.tscn
+++ b/project/scenes/editor.tscn
@@ -8,6 +8,7 @@
[ext_resource type="Texture2D" uid="uid://bl3gn6qruuy8w" path="res://assets/icons/plane.svg" id="4_xg7d5"]
[ext_resource type="Texture2D" uid="uid://d1te42w7wpkrx" path="res://assets/icons/noise.svg" id="5_eqbpn"]
[ext_resource type="PackedScene" uid="uid://bsvvhue5x4rb" path="res://ui/primitive_inspectors/point_primitive_inspector.tscn" id="8_5tm2q"]
+[ext_resource type="PackedScene" uid="uid://bl16us512blpp" path="res://ui/primitive_inspectors/base_primitive_inspector.tscn" id="9_j8y2p"]
[sub_resource type="PointPrimitive" id="PointPrimitive_5tm2q"]
@@ -75,6 +76,7 @@ volumetric_fog_sky_affect = 0.904
volumetric_fog_temporal_reprojection_amount = 0.99
[sub_resource type="GDScript" id="GDScript_b1cmn"]
+resource_name = "EditorCamera"
script/source = "extends Camera3D
var pan_speed = .001
@@ -157,7 +159,7 @@ script = SubResource("GDScript_b1cmn")
[node name="LeftPanel" type="Panel" parent="." unique_id=1768834661]
anchors_preset = 9
anchor_bottom = 1.0
-offset_right = 258.0
+offset_right = 326.0
grow_vertical = 2
theme = ExtResource("3_ba0ut")
@@ -229,6 +231,9 @@ icons = {
layout_mode = 2
size_flags_vertical = 3
inspectors = {
+&"ExpressionPrimitive": ExtResource("9_j8y2p"),
+&"NoisePrimitive": ExtResource("9_j8y2p"),
+&"PlanePrimitive": ExtResource("9_j8y2p"),
&"PointPrimitive": ExtResource("8_5tm2q")
}
terrain = NodePath("../../../TerrainMeshEditor")
diff --git a/project/ui/editor_elements/float_editor.tscn b/project/ui/editor_elements/float_editor.tscn
index 338db281..d8ea3b7e 100644
--- a/project/ui/editor_elements/float_editor.tscn
+++ b/project/ui/editor_elements/float_editor.tscn
@@ -1,37 +1,51 @@
[gd_scene format=3 uid="uid://cwby0in0f2wi2"]
[sub_resource type="GDScript" id="GDScript_aclmm"]
+resource_name = "FloatEditor"
script/source = "extends HBoxContainer
@export var changes_value : String = \"height\"
@onready var terrain : TerrainMeshEditor = $\"../../..\".terrain
@onready var primitive : TerrainPrimitive = terrain.current_selected
var value_before : float = 0.0
+var dragging := false
-func _ready() -> void:
+func connect_changes():
$HSlider.connect(\"drag_ended\", _drag_ended)
$HSlider.connect(\"drag_started\", _drag_started)
$HSlider.connect(\"value_changed\", _slider_value_changed)
$SpinBox.connect(\"value_changed\", _spin_value_changed)
+
+func disconnect_changes():
+ $HSlider.disconnect(\"drag_ended\", _drag_ended)
+ $HSlider.disconnect(\"drag_started\", _drag_started)
+ $HSlider.disconnect(\"value_changed\", _slider_value_changed)
+ $SpinBox.disconnect(\"value_changed\", _spin_value_changed)
+
+func _ready() -> void:
primitive.changed.connect(_primitive_changed)
+ connect_changes()
_primitive_changed();
func _primitive_changed():
var value = primitive.get(changes_value)
- $HSlider.value = value
- $SpinBox.value = value
+ $HSlider.set_value_no_signal(value)
+ $SpinBox.set_value_no_signal(value)
func _spin_value_changed(value : float):
- EditHistory.push_action(primitive.set.bind(changes_value, $SpinBox.value), primitive.set.bind(changes_value, primitive.get(changes_value)))
+ var old : float = primitive.get(changes_value)
+ var new : float = $SpinBox.value
+ EditHistory.push_action(primitive.set.bind(changes_value, new), primitive.set.bind(changes_value, old))
func _drag_started():
+ dragging = true
value_before = primitive.get(changes_value)
func _slider_value_changed(value : float):
primitive.set(changes_value, value)
- $SpinBox.value = value
func _drag_ended(changed : bool):
+ dragging = false
if changed:
EditHistory.push_action(primitive.set.bind(changes_value, $HSlider.value), primitive.set.bind(changes_value, value_before))
"
diff --git a/project/ui/primitive_inspectors/base_primitive_inspector.tscn b/project/ui/primitive_inspectors/base_primitive_inspector.tscn
new file mode 100644
index 00000000..bc51df25
--- /dev/null
+++ b/project/ui/primitive_inspectors/base_primitive_inspector.tscn
@@ -0,0 +1,76 @@
+[gd_scene format=3 uid="uid://bl16us512blpp"]
+
+[ext_resource type="PackedScene" uid="uid://cwby0in0f2wi2" path="res://ui/editor_elements/float_editor.tscn" id="1_dildi"]
+[ext_resource type="Texture2D" uid="uid://bt72qid068u8u" path="res://assets/icons/delete.svg" id="1_h3glg"]
+
+[sub_resource type="GDScript" id="GDScript_h3glg"]
+resource_name = "BlendModeSelector"
+script/source = "extends OptionButton
+
+@onready var terrain : TerrainMeshEditor = $\"../../..\".terrain
+@onready var primitive : TerrainPrimitive = terrain.current_selected
+
+
+func _on_item_selected(index: int) -> void:
+ var before : int = primitive.blend_mode
+ EditHistory.push_action(primitive.set_blend_mode.bind(index), primitive.set_blend_mode.bind(before))
+"
+
+[node name="PointPrimitive" type="MarginContainer" unique_id=905749607]
+offset_right = 302.0
+offset_bottom = 230.0
+theme_override_constants/margin_left = 5
+theme_override_constants/margin_top = 5
+theme_override_constants/margin_right = 5
+theme_override_constants/margin_bottom = 5
+metadata/_tab_index = 0
+
+[node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=236606520]
+layout_mode = 2
+
+[node name="BlendRange" type="Label" parent="VBoxContainer" unique_id=455258354]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Blend Range"
+
+[node name="FloatEditor3" parent="VBoxContainer" unique_id=1730998858 instance=ExtResource("1_dildi")]
+layout_mode = 2
+changes_value = "blend_range"
+
+[node name="SpinBox" parent="VBoxContainer/FloatEditor3" index="0" unique_id=580598896]
+min_value = 0.0
+max_value = 1000.0
+
+[node name="HSlider" parent="VBoxContainer/FloatEditor3" index="1" unique_id=163542019]
+max_value = 100.0
+value = 100.0
+exp_edit = true
+tick_count = 11
+ticks_on_borders = true
+
+[node name="BlendModeSelector" type="OptionButton" parent="VBoxContainer" unique_id=1342650865]
+layout_mode = 2
+selected = 0
+item_count = 3
+popup/item_0/text = "Peaks"
+popup/item_0/id = 0
+popup/item_1/text = "Valleys"
+popup/item_1/id = 1
+popup/item_2/text = "Both"
+popup/item_2/id = 2
+script = SubResource("GDScript_h3glg")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer" unique_id=274380821]
+layout_mode = 2
+alignment = 2
+
+[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer" unique_id=1514690251]
+custom_minimum_size = Vector2(32, 32)
+layout_mode = 2
+icon = ExtResource("1_h3glg")
+icon_alignment = 1
+expand_icon = true
+
+[connection signal="item_selected" from="VBoxContainer/BlendModeSelector" to="VBoxContainer/BlendModeSelector" method="_on_item_selected"]
+
+[editable path="VBoxContainer/FloatEditor3"]
diff --git a/project/ui/primitive_inspectors/point_primitive_inspector.tscn b/project/ui/primitive_inspectors/point_primitive_inspector.tscn
index 7e9c489b..88af3138 100644
--- a/project/ui/primitive_inspectors/point_primitive_inspector.tscn
+++ b/project/ui/primitive_inspectors/point_primitive_inspector.tscn
@@ -1,8 +1,10 @@
[gd_scene format=3 uid="uid://bsvvhue5x4rb"]
[ext_resource type="PackedScene" uid="uid://cwby0in0f2wi2" path="res://ui/editor_elements/float_editor.tscn" id="1_qb00w"]
+[ext_resource type="PackedScene" uid="uid://bl16us512blpp" path="res://ui/primitive_inspectors/base_primitive_inspector.tscn" id="1_tqa7h"]
-[sub_resource type="GDScript" id="GDScript_qb00w"]
+[sub_resource type="GDScript" id="GDScript_qfu2v"]
+resource_name = "PositionEditor"
script/source = "extends HBoxContainer
@onready var terrain : TerrainMeshEditor = $\"../../..\".terrain
@@ -15,8 +17,8 @@ func _ready():
func _primitive_changed():
var new_position : Vector2 = primitive.center
- $XBox.value = new_position.x
- $YBox.value = new_position.y
+ $XBox.set_value_no_signal(new_position.x)
+ $YBox.set_value_no_signal(new_position.y)
func _x_changed(value : float):
var old : Vector2 = primitive.center
@@ -27,64 +29,55 @@ func _y_changed(value : float):
EditHistory.push_action(primitive.set.bind(\"center\", Vector2(old.x, value)), primitive.set.bind(\"center\", old))
"
-[node name="PointPrimitive" type="MarginContainer" unique_id=905749607]
-offset_right = 302.0
-offset_bottom = 230.0
-theme_override_constants/margin_left = 5
-theme_override_constants/margin_top = 5
-theme_override_constants/margin_right = 5
-theme_override_constants/margin_bottom = 5
-metadata/_tab_index = 0
+[node name="PointPrimitive" unique_id=905749607 instance=ExtResource("1_tqa7h")]
-[node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=236606520]
-layout_mode = 2
-
-[node name="HeightLabel" type="Label" parent="VBoxContainer" unique_id=1478707845]
+[node name="HeightLabel" type="Label" parent="VBoxContainer" parent_id_path=PackedInt32Array(236606520) index="0" unique_id=1675918554]
layout_mode = 2
size_flags_horizontal = 3
text = "Height"
-[node name="FloatEditor" parent="VBoxContainer" unique_id=1730998858 instance=ExtResource("1_qb00w")]
+[node name="FloatEditor" parent="VBoxContainer" parent_id_path=PackedInt32Array(236606520) index="1" unique_id=1730998858 instance=ExtResource("1_qb00w")]
layout_mode = 2
-[node name="Slope" type="Label" parent="VBoxContainer" unique_id=303736827]
+[node name="Slope" type="Label" parent="VBoxContainer" parent_id_path=PackedInt32Array(236606520) index="2" unique_id=1362885374]
layout_mode = 2
size_flags_horizontal = 3
text = "Slope"
-[node name="FloatEditor2" parent="VBoxContainer" unique_id=1151227800 instance=ExtResource("1_qb00w")]
+[node name="FloatEditor2" parent="VBoxContainer" parent_id_path=PackedInt32Array(236606520) index="3" unique_id=739098632 instance=ExtResource("1_qb00w")]
layout_mode = 2
changes_value = "slope"
-[node name="HSlider" parent="VBoxContainer/FloatEditor2" index="0" unique_id=163542019]
+[node name="SpinBox" parent="VBoxContainer/FloatEditor2" index="0" unique_id=580598896]
+step = 0.1
+
+[node name="HSlider" parent="VBoxContainer/FloatEditor2" index="1" unique_id=163542019]
min_value = -2.0
max_value = 2.0
value = -0.5
tick_count = 5
ticks_on_borders = true
-[node name="SpinBox" parent="VBoxContainer/FloatEditor2" index="1" unique_id=580598896]
-step = 0.1
-
-[node name="Position" type="Label" parent="VBoxContainer" unique_id=200995882]
+[node name="Position" type="Label" parent="VBoxContainer" parent_id_path=PackedInt32Array(236606520) index="4" unique_id=527506771]
layout_mode = 2
size_flags_horizontal = 3
text = "Position"
-[node name="HSplitContainer" type="HBoxContainer" parent="VBoxContainer" unique_id=1958091184]
+[node name="HSplitContainer" type="HBoxContainer" parent="VBoxContainer" parent_id_path=PackedInt32Array(236606520) index="5" unique_id=2016506236]
layout_mode = 2
-script = SubResource("GDScript_qb00w")
+script = SubResource("GDScript_qfu2v")
-[node name="XBox" type="SpinBox" parent="VBoxContainer/HSplitContainer" unique_id=2044129298]
+[node name="XBox" type="SpinBox" parent="VBoxContainer/HSplitContainer" index="0" unique_id=1149105773]
layout_mode = 2
min_value = -10000.0
max_value = 10000.0
prefix = "x"
-[node name="YBox" type="SpinBox" parent="VBoxContainer/HSplitContainer" unique_id=1865142111]
+[node name="YBox" type="SpinBox" parent="VBoxContainer/HSplitContainer" index="1" unique_id=1897326873]
layout_mode = 2
min_value = -10000.0
max_value = 10000.0
prefix = "y"
[editable path="VBoxContainer/FloatEditor2"]
+[editable path="VBoxContainer/FloatEditor3"]
diff --git a/test-terrains/highland.terrain.res b/test-terrains/highland.terrain.res
index ba3c005a..ce7d50af 100644
Binary files a/test-terrains/highland.terrain.res and b/test-terrains/highland.terrain.res differ