feat: deleting primitives at runtime

This commit is contained in:
Sara Gerretsen 2025-12-15 12:34:46 +01:00
parent 5f7e0853b1
commit 5953ff49a1
3 changed files with 24 additions and 0 deletions

View file

@ -24,6 +24,9 @@ void TerrainMeshGenerator::_bind_methods() {
ADD_SIGNAL(MethodInfo(sig_primitives_changed)); ADD_SIGNAL(MethodInfo(sig_primitives_changed));
ADD_SIGNAL(MethodInfo(sig_primitive_list_changed, PropertyInfo(Variant::ARRAY, "array", PROPERTY_HINT_ARRAY_TYPE, vformat("%s/%s:TerrainPrimitive", Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE)))); ADD_SIGNAL(MethodInfo(sig_primitive_list_changed, PropertyInfo(Variant::ARRAY, "array", PROPERTY_HINT_ARRAY_TYPE, vformat("%s/%s:TerrainPrimitive", Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE))));
ClassDB::bind_method(D_METHOD("push_task", "area", "out_mesh", "side_points"), &self_type::push_task); ClassDB::bind_method(D_METHOD("push_task", "area", "out_mesh", "side_points"), &self_type::push_task);
ClassDB::bind_method(D_METHOD("add_primitive", "primitive"), &self_type::add_primitive);
ClassDB::bind_method(D_METHOD("insert_primitive", "primitive", "idx"), &self_type::insert_primitive);
ClassDB::bind_method(D_METHOD("remove_primitive", "primitive"), &self_type::remove_primitive);
} }
void TerrainMeshGenerator::enter_tree() { void TerrainMeshGenerator::enter_tree() {
@ -263,6 +266,12 @@ void TerrainMeshGenerator::add_primitive(Ref<TerrainPrimitive> primitive) {
set_primitives(list); set_primitives(list);
} }
void TerrainMeshGenerator::insert_primitive(Ref<TerrainPrimitive> primitive, int idx) {
Array list = get_primitives();
list.insert(idx, primitive);
set_primitives(list);
}
void TerrainMeshGenerator::remove_primitive(Ref<TerrainPrimitive> primitive) { void TerrainMeshGenerator::remove_primitive(Ref<TerrainPrimitive> primitive) {
Array list = get_primitives(); Array list = get_primitives();
int idx{ list.find(primitive) }; int idx{ list.find(primitive) };

View file

@ -38,6 +38,7 @@ protected:
public: public:
void push_task(Rect2 area, Ref<ArrayMesh> mesh, size_t side_points, Callable callback = Callable()); void push_task(Rect2 area, Ref<ArrayMesh> mesh, size_t side_points, Callable callback = Callable());
void add_primitive(Ref<TerrainPrimitive> primitive); void add_primitive(Ref<TerrainPrimitive> primitive);
void insert_primitive(Ref<TerrainPrimitive> primitive, int idx);
void remove_primitive(Ref<TerrainPrimitive> primitive); void remove_primitive(Ref<TerrainPrimitive> primitive);
void set_primitives(Array array); void set_primitives(Array array);
Array get_primitives() const; Array get_primitives() const;

View file

@ -22,6 +22,19 @@ func _on_item_selected(index: int) -> void:
EditHistory.push_action(primitive.set_blend_mode.bind(index), primitive.set_blend_mode.bind(before)) EditHistory.push_action(primitive.set_blend_mode.bind(index), primitive.set_blend_mode.bind(before))
" "
[sub_resource type="GDScript" id="GDScript_ivj30"]
resource_name = "DeletePrimitive"
script/source = "extends Button
@onready var terrain : TerrainMeshEditor = ($\"../../../..\" as LayerEditor).terrain
@onready var primitive : TerrainPrimitive = terrain.current_selected
func _pressed() -> void:
var idx : int = terrain.primitives.find(primitive)
EditHistory.push_action(terrain.remove_primitive.bind(primitive), terrain.insert_primitive.bind(primitive, idx))
terrain.current_selected = null
"
[node name="Primitive" type="MarginContainer" unique_id=905749607] [node name="Primitive" type="MarginContainer" unique_id=905749607]
offset_right = 302.0 offset_right = 302.0
offset_bottom = 230.0 offset_bottom = 230.0
@ -76,6 +89,7 @@ layout_mode = 2
icon = ExtResource("1_h3glg") icon = ExtResource("1_h3glg")
icon_alignment = 1 icon_alignment = 1
expand_icon = true expand_icon = true
script = SubResource("GDScript_ivj30")
[connection signal="item_selected" from="VBoxContainer/BlendModeSelector" to="VBoxContainer/BlendModeSelector" method="_on_item_selected"] [connection signal="item_selected" from="VBoxContainer/BlendModeSelector" to="VBoxContainer/BlendModeSelector" method="_on_item_selected"]