Skip to content

Commit 04f211e

Browse files
committed
Fix update_transforms running on non-height tool
1 parent e81483a commit 04f211e

7 files changed

+29
-22
lines changed

project/addons/terrain_3d/utils/terrain_3d_objects.gd

+10-10
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ func get_terrain() -> Terrain3D:
5050
terrain = terrains[0]
5151
_terrain_id = terrain.get_instance_id() if terrain else 0
5252

53-
if terrain and terrain.data and not terrain.data.maps_edited.is_connected(_on_maps_edited):
54-
terrain.data.maps_edited.connect(_on_maps_edited)
53+
if terrain and terrain.data and not terrain.data.map_edited.is_connected(_on_map_edited):
54+
terrain.data.map_edited.connect(_on_map_edited)
5555

5656
return terrain
5757

@@ -180,12 +180,12 @@ func _update_child_position(p_node: Node3D) -> void:
180180
p_node.position = new_position
181181

182182

183-
func _on_maps_edited(p_edited_aabb: AABB) -> void:
184-
var edited_area: AABB = p_edited_aabb.grow(1)
185-
edited_area.position.y = -INF
186-
edited_area.end.y = INF
183+
func _on_map_edited(p_edited_aabb: AABB, p_map_type: int) -> void:
184+
if p_map_type == Terrain3DRegion.MapType.TYPE_HEIGHT:
185+
var edited_area: AABB = p_edited_aabb.grow(1)
186+
edited_area.position.y = -INF
187+
edited_area.end.y = INF
187188

188-
for child in get_children():
189-
var node := child as Node3D
190-
if node && edited_area.has_point(node.global_position):
191-
_update_child_position(node)
189+
for child in get_children():
190+
if child is Node3D and edited_area.has_point(child.global_position):
191+
_update_child_position(child)

src/terrain_3d.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ void Terrain3D::_initialize() {
7272
_data->connect("height_maps_changed", callable_mp(this, &Terrain3D::update_aabbs));
7373
}
7474
// Connect height changes to update instances
75-
if (!_data->is_connected("maps_edited", callable_mp(_instancer, &Terrain3DInstancer::update_transforms))) {
76-
LOG(DEBUG, "Connecting maps_edited signal to update_transforms()");
77-
_data->connect("maps_edited", callable_mp(_instancer, &Terrain3DInstancer::update_transforms));
75+
if (!_data->is_connected("map_edited", callable_mp(_instancer, &Terrain3DInstancer::update_transforms))) {
76+
LOG(DEBUG, "Connecting map_edited signal to update_transforms()");
77+
_data->connect("map_edited", callable_mp(_instancer, &Terrain3DInstancer::update_transforms));
7878
}
7979
// Texture assets changed, update material
8080
if (!_assets->is_connected("textures_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_texture_arrays))) {

src/terrain_3d_data.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -796,13 +796,13 @@ Vector3 Terrain3DData::get_mesh_vertex(const int32_t p_lod, const HeightFilter p
796796
return Vector3(p_global_position.x, height, p_global_position.z);
797797
}
798798

799-
void Terrain3DData::add_edited_area(const AABB &p_area) {
799+
void Terrain3DData::add_edited_area(const AABB &p_area, const MapType p_map_type) {
800800
if (_edited_area.has_surface()) {
801801
_edited_area = _edited_area.merge(p_area);
802802
} else {
803803
_edited_area = p_area;
804804
}
805-
emit_signal("maps_edited", p_area);
805+
emit_signal("map_edited", p_area, p_map_type);
806806
}
807807

808808
// Recalculates master height range from all active regions current height ranges
@@ -1207,5 +1207,5 @@ void Terrain3DData::_bind_methods() {
12071207
ADD_SIGNAL(MethodInfo("height_maps_changed"));
12081208
ADD_SIGNAL(MethodInfo("control_maps_changed"));
12091209
ADD_SIGNAL(MethodInfo("color_maps_changed"));
1210-
ADD_SIGNAL(MethodInfo("maps_edited", PropertyInfo(Variant::AABB, "edited_area")));
1210+
ADD_SIGNAL(MethodInfo("map_edited", PropertyInfo(Variant::AABB, "edited_area"), PropertyInfo(Variant::INT, "map_type")));
12111211
}

src/terrain_3d_data.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class Terrain3DData : public Object {
171171
Vector3 get_texture_id(const Vector3 &p_global_position) const;
172172
Vector3 get_mesh_vertex(const int32_t p_lod, const HeightFilter p_filter, const Vector3 &p_global_position) const;
173173

174-
void add_edited_area(const AABB &p_area);
174+
void add_edited_area(const AABB &p_area, const MapType p_map_type = TYPE_HEIGHT);
175175
void clear_edited_area() { _edited_area = AABB(); }
176176
AABB get_edited_area() const { return _edited_area; }
177177

src/terrain_3d_editor.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ void Terrain3DEditor::_operate_map(const Vector3 &p_global_position, const real_
222222
if (map_type == TYPE_HEIGHT) {
223223
real_t srcf = src.r;
224224
// In case data in existing map has nan or inf saved, check, and reset to real number if required.
225-
srcf = std::isnan(srcf) || std::isnan(srcf) ? 0.f : srcf;
225+
srcf = std::isnan(srcf) || std::isnan(srcf) ? 0.f : srcf;
226226
real_t destf = srcf;
227227

228228
switch (_operation) {
@@ -521,7 +521,11 @@ void Terrain3DEditor::_operate_map(const Vector3 &p_global_position, const real_
521521
// If region qty was changed, must fully rebuild the maps
522522
data->force_update_maps(map_type);
523523
}
524-
data->add_edited_area(edited_area);
524+
data->add_edited_area(edited_area, map_type);
525+
if (_tool == HOLES) {
526+
// Holes will send out the signal for control and now height
527+
data->add_edited_area(edited_area, TYPE_HEIGHT);
528+
}
525529
}
526530

527531
void Terrain3DEditor::_store_undo() {

src/terrain_3d_instancer.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,10 @@ void Terrain3DInstancer::append_region(const Ref<Terrain3DRegion> &p_region, con
749749
}
750750

751751
// Review all transforms in one area and adjust their transforms w/ the current height
752-
void Terrain3DInstancer::update_transforms(const AABB &p_aabb) {
752+
void Terrain3DInstancer::update_transforms(const AABB &p_aabb, const MapType p_map_type) {
753+
if (p_map_type != TYPE_HEIGHT) {
754+
return;
755+
}
753756
IS_DATA_INIT_MESG("Instancer isn't initialized.", VOID);
754757
Rect2 brush_rect = aabb2rect(p_aabb);
755758
Vector2 global_position = brush_rect.get_center();
@@ -1044,7 +1047,7 @@ void Terrain3DInstancer::_bind_methods() {
10441047
ClassDB::bind_method(D_METHOD("add_transforms", "mesh_id", "transforms", "colors", "update"), &Terrain3DInstancer::add_transforms, DEFVAL(PackedColorArray()), DEFVAL(true));
10451048
ClassDB::bind_method(D_METHOD("append_location", "region_location", "mesh_id", "transforms", "colors", "update"), &Terrain3DInstancer::append_location, DEFVAL(true));
10461049
ClassDB::bind_method(D_METHOD("append_region", "region", "mesh_id", "transforms", "colors", "update"), &Terrain3DInstancer::append_region, DEFVAL(true));
1047-
ClassDB::bind_method(D_METHOD("update_transforms", "aabb"), &Terrain3DInstancer::update_transforms);
1050+
ClassDB::bind_method(D_METHOD("update_transforms", "aabb", "map_type"), &Terrain3DInstancer::update_transforms, DEFVAL(TYPE_HEIGHT));
10481051
ClassDB::bind_method(D_METHOD("force_update_mmis"), &Terrain3DInstancer::force_update_mmis);
10491052
ClassDB::bind_method(D_METHOD("swap_ids", "src_id", "dest_id"), &Terrain3DInstancer::swap_ids);
10501053
ClassDB::bind_method(D_METHOD("dump_data"), &Terrain3DInstancer::dump_data);

src/terrain_3d_instancer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class Terrain3DInstancer : public Object {
6969
const PackedColorArray &p_colors, const bool p_update = true);
7070
void append_region(const Ref<Terrain3DRegion> &p_region, const int p_mesh_id, const TypedArray<Transform3D> &p_xforms,
7171
const PackedColorArray &p_colors, const bool p_update = true);
72-
void update_transforms(const AABB &p_aabb);
72+
void update_transforms(const AABB &p_aabb, const MapType p_map_type = TYPE_HEIGHT);
7373
void copy_paste_dfr(const Terrain3DRegion *p_src_region, const Rect2i &p_src_rect, const Terrain3DRegion *p_dst_region);
7474

7575
void swap_ids(const int p_src_id, const int p_dst_id);

0 commit comments

Comments
 (0)