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