Skip to content

Commit

Permalink
Change storage map regeneration signals
Browse files Browse the repository at this point in the history
  • Loading branch information
TokisanGames committed Aug 1, 2024
1 parent f76ceec commit 8d93422
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 41 deletions.
10 changes: 5 additions & 5 deletions project/addons/terrain_3d/editor.gd
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,13 @@ func _edit(p_object: Object) -> void:
terrain.set_editor(editor)
ui.set_visible(true)

# Connect to new Assets resource
# Get alerted when a new asset list is loaded
if not terrain.assets_changed.is_connected(asset_dock.update_assets):
terrain.assets_changed.connect(asset_dock.update_assets)
asset_dock.update_assets()
# Connect to new Storage resource
if not terrain.storage_changed.is_connected(update_region_grid):
terrain.storage_changed.connect(update_region_grid)
# Get alerted when the region map changes
if not terrain.get_storage().region_map_changed.is_connected(update_region_grid):
terrain.get_storage().region_map_changed.connect(update_region_grid)
update_region_grid()
else:
_clear()
Expand All @@ -115,7 +115,7 @@ func _edit(p_object: Object) -> void:

func _clear() -> void:
if is_terrain_valid():
terrain.storage_changed.disconnect(update_region_grid)
terrain.get_storage().region_map_changed.disconnect(update_region_grid)

terrain.clear_gizmos()
terrain = null
Expand Down
22 changes: 11 additions & 11 deletions src/terrain_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,26 +51,26 @@ void Terrain3D::_initialize() {
}

// Connect signals
// Texture assets changed, update material
if (!_assets->is_connected("textures_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_texture_arrays))) {
LOG(DEBUG, "Connecting _assets.textures_changed to _material->_update_texture_arrays()");
_assets->connect("textures_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_texture_arrays));
}
// Region size changed, update material
if (!_storage->is_connected("region_size_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_regions))) {
if (!_storage->is_connected("region_size_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_maps))) {
LOG(DEBUG, "Connecting region_size_changed signal to _material->_update_regions()");
_storage->connect("region_size_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_regions));
_storage->connect("region_size_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_maps));
}
// Any map was regenerated or region locations changed, update material
if (!_storage->is_connected("regions_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_regions))) {
LOG(DEBUG, "Connecting _storage::regions_changed signal to _material->_update_regions()");
_storage->connect("regions_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_regions));
// Any map was regenerated or regions changed, update material
if (!_storage->is_connected("maps_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_maps))) {
LOG(DEBUG, "Connecting _storage::maps_changed signal to _material->_update_maps()");
_storage->connect("maps_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_maps));
}
// Height map was regenerated - update aabbs - Probably remove and just use maps_edited
if (!_storage->is_connected("height_maps_changed", callable_mp(this, &Terrain3D::update_aabbs))) {
LOG(DEBUG, "Connecting _storage::height_maps_changed signal to update_aabbs()");
_storage->connect("height_maps_changed", callable_mp(this, &Terrain3D::update_aabbs));
}
// Texture assets changed, update material
if (!_assets->is_connected("textures_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_texture_arrays))) {
LOG(DEBUG, "Connecting _assets.textures_changed to _material->_update_texture_arrays()");
_assets->connect("textures_changed", callable_mp(_material.ptr(), &Terrain3DMaterial::_update_texture_arrays));
}
// MeshAssets changed, update instancer
if (!_assets->is_connected("meshes_changed", callable_mp(_instancer, &Terrain3DInstancer::_update_mmis).bind(Vector2i(INT32_MAX, INT32_MAX), -1))) {
LOG(DEBUG, "Connecting _assets.meshes_changed to _instancer->_update_mmis()");
Expand Down
8 changes: 4 additions & 4 deletions src/terrain_3d_material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,9 @@ void Terrain3DMaterial::_update_shader() {
notify_property_list_changed();
}

void Terrain3DMaterial::_update_regions() {
void Terrain3DMaterial::_update_maps() {
IS_STORAGE_INIT(VOID);
LOG(DEBUG_CONT, "Updating region maps in shader");
LOG(DEBUG_CONT, "Updating maps in shader");

Ref<Terrain3DStorage> storage = _terrain->get_storage();
RS->material_set_param(_material, "_height_maps", storage->get_height_rid());
Expand Down Expand Up @@ -419,7 +419,7 @@ void Terrain3DMaterial::initialize(Terrain3D *p_terrain) {
_shader_tmp.instantiate();
LOG(DEBUG, "Mat RID: ", _material, ", _shader RID: ", _shader);
_update_shader();
_update_regions();
_update_maps();
}

Terrain3DMaterial::~Terrain3DMaterial() {
Expand All @@ -432,7 +432,7 @@ Terrain3DMaterial::~Terrain3DMaterial() {

void Terrain3DMaterial::update() {
_update_shader();
_update_regions();
_update_maps();
}

RID Terrain3DMaterial::get_shader_rid() const {
Expand Down
2 changes: 1 addition & 1 deletion src/terrain_3d_material.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class Terrain3DMaterial : public Resource {
String _generate_shader_code() const;
String _inject_editor_code(const String &p_shader) const;
void _update_shader();
void _update_regions();
void _update_maps();
void _generate_region_blend_map();
void _update_texture_arrays();
void _set_shader_parameters(const Dictionary &p_dict);
Expand Down
41 changes: 22 additions & 19 deletions src/terrain_3d_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ void Terrain3DStorage::initialize(Terrain3D *p_terrain) {
}
LOG(INFO, "Initializing storage");
_region_map.resize(REGION_MAP_SIZE * REGION_MAP_SIZE);
update_regions(true); // generate map arrays
update_maps(); // generate map arrays
}

Terrain3DStorage::~Terrain3DStorage() {
Expand Down Expand Up @@ -127,7 +127,7 @@ void Terrain3DStorage::set_region_locations(const TypedArray<Vector2i> &p_locati
LOG(INFO, "Setting _region_locations with array sized: ", p_locations.size());
_region_locations = p_locations;
_region_map_dirty = true;
update_regions();
update_maps();
}

/** Returns a region location given a global position*/
Expand Down Expand Up @@ -226,11 +226,11 @@ Error Terrain3DStorage::add_region(const Vector3 &p_global_position, const Typed
_generated_height_maps.clear();
_generated_control_maps.clear();
_generated_color_maps.clear();
update_regions();
update_maps();
notify_property_list_changed();
emit_changed();
} else {
update_regions();
update_maps();
}
return OK;
}
Expand Down Expand Up @@ -261,30 +261,30 @@ void Terrain3DStorage::remove_region(const Vector3 &p_global_position, const boo
_generated_height_maps.clear();
_generated_control_maps.clear();
_generated_color_maps.clear();
update_regions();
update_maps();
notify_property_list_changed();
emit_changed();
} else {
update_regions();
update_maps();
}
}

void Terrain3DStorage::update_regions(const bool p_force_emit) {
bool force_emit = p_force_emit;

void Terrain3DStorage::update_maps() {
bool any_changed = false;
if (_generated_height_maps.is_dirty()) {
LOG(DEBUG_CONT, "Regenerating height layered texture from ", _height_maps.size(), " maps");
_generated_height_maps.create(_height_maps);
force_emit = true;
_modified = true;
any_changed = true;
emit_signal("height_maps_changed");
}

if (_generated_control_maps.is_dirty()) {
LOG(DEBUG_CONT, "Regenerating control layered texture from ", _control_maps.size(), " maps");
_generated_control_maps.create(_control_maps);
force_emit = true;
_modified = true;
any_changed = true;
emit_signal("control_maps_changed");
}

if (_generated_color_maps.is_dirty()) {
Expand All @@ -294,8 +294,9 @@ void Terrain3DStorage::update_regions(const bool p_force_emit) {
map->generate_mipmaps();
}
_generated_color_maps.create(_color_maps);
force_emit = true;
_modified = true;
any_changed = true;
emit_signal("color_maps_changed");
}

if (_region_map_dirty) {
Expand All @@ -309,13 +310,12 @@ void Terrain3DStorage::update_regions(const bool p_force_emit) {
_region_map[map_index] = i + 1; // Begin at 1 since 0 = no region
}
}
force_emit = true;
_modified = true;
any_changed = true;
emit_signal("region_map_changed");
}

// Emit if requested or changes were made
if (force_emit) {
emit_signal("regions_changed");
if (any_changed) {
emit_signal("maps_changed");
}
}

Expand Down Expand Up @@ -660,7 +660,7 @@ void Terrain3DStorage::force_update_maps(const MapType p_map_type) {
_generated_color_maps.clear();
break;
}
update_regions();
update_maps();
}

void Terrain3DStorage::set_multimeshes(const Dictionary &p_multimeshes) {
Expand Down Expand Up @@ -1139,9 +1139,12 @@ void Terrain3DStorage::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "color_maps", PROPERTY_HINT_ARRAY_TYPE, vformat("%tex_size/%tex_size:%tex_size", Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE, "Image"), ro_flags), "set_color_maps", "get_color_maps");
ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "multimeshes", PROPERTY_HINT_NONE, "", ro_flags), "set_multimeshes", "get_multimeshes");

ADD_SIGNAL(MethodInfo("maps_changed"));
ADD_SIGNAL(MethodInfo("region_map_changed"));
ADD_SIGNAL(MethodInfo("height_maps_changed"));
ADD_SIGNAL(MethodInfo("control_maps_changed"));
ADD_SIGNAL(MethodInfo("color_maps_changed"));
ADD_SIGNAL(MethodInfo("region_size_changed"));
ADD_SIGNAL(MethodInfo("regions_changed"));
ADD_SIGNAL(MethodInfo("maps_edited", PropertyInfo(Variant::AABB, "edited_area")));
ADD_SIGNAL(MethodInfo("multimeshes_changed"));
}
2 changes: 1 addition & 1 deletion src/terrain_3d_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ class Terrain3DStorage : public Resource {
bool has_region(const Vector3 &p_global_position) const { return get_region_id(p_global_position) != -1; }
Error add_region(const Vector3 &p_global_position, const TypedArray<Image> &p_images = TypedArray<Image>(), const bool p_update = true);
void remove_region(const Vector3 &p_global_position, const bool p_update = true);
void update_regions(const bool p_force_emit = false);
void update_maps();

// Maps
void set_map_region(const MapType p_map_type, const int p_region_id, const Ref<Image> &p_image);
Expand Down

0 comments on commit 8d93422

Please sign in to comment.