Skip to content

Commit

Permalink
Organize region
Browse files Browse the repository at this point in the history
  • Loading branch information
TokisanGames committed Jul 28, 2024
1 parent ff428f9 commit 98f2baf
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 31 deletions.
2 changes: 1 addition & 1 deletion src/terrain_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ class Terrain3D : public Node3D {
Ref<Mesh> bake_mesh(const int p_lod, const Terrain3DStorage::HeightFilter p_filter = Terrain3DStorage::HEIGHT_FILTER_NEAREST) const;
PackedVector3Array generate_nav_mesh_source_geometry(const AABB &p_global_aabb, const bool p_require_nav = true) const;

// Misc
// Godot Callbacks
PackedStringArray _get_configuration_warnings() const override;

// DEPRECATED 0.9.2 - Remove 0.9.3+
Expand Down
14 changes: 8 additions & 6 deletions src/terrain_3d_region.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Error Terrain3DRegion::save(const String &p_path, const bool p_16_bit) {
path = get_path();
}
set_version(Terrain3DStorage::CURRENT_VERSION);
LOG(INFO, "Writing", (p_16_bit) ? " 16-bit" : "", " region ", _region_loc, " to ", path);
LOG(INFO, "Writing", (p_16_bit) ? " 16-bit" : "", " region ", _location, " to ", path);

Error err;
if (p_16_bit) {
Expand Down Expand Up @@ -76,8 +76,6 @@ Error Terrain3DRegion::save(const String &p_path, const bool p_16_bit) {
void Terrain3DRegion::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_version"), &Terrain3DRegion::set_version);
ClassDB::bind_method(D_METHOD("get_version"), &Terrain3DRegion::get_version);
ClassDB::bind_method(D_METHOD("is_modified"), &Terrain3DRegion::is_modified);
ClassDB::bind_method(D_METHOD("get_region_loc"), &Terrain3DRegion::get_region_loc);

ClassDB::bind_method(D_METHOD("set_height_map", "map"), &Terrain3DRegion::set_height_map);
ClassDB::bind_method(D_METHOD("get_height_map"), &Terrain3DRegion::get_height_map);
Expand All @@ -90,14 +88,18 @@ void Terrain3DRegion::_bind_methods() {

ClassDB::bind_method(D_METHOD("save", "path", "16-bit"), &Terrain3DRegion::save, DEFVAL(""), DEFVAL(false));

// These two show what's on the disk (defaults) not what is in memory, so hide them
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "modified", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "is_modified");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "location", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "get_region_loc");
ClassDB::bind_method(D_METHOD("is_modified"), &Terrain3DRegion::is_modified);
ClassDB::bind_method(D_METHOD("set_location"), &Terrain3DRegion::set_location);
ClassDB::bind_method(D_METHOD("get_location"), &Terrain3DRegion::get_location);

int ro_flags = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY;
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "version", PROPERTY_HINT_NONE, "", ro_flags), "set_version", "get_version");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "heightmap", PROPERTY_HINT_RESOURCE_TYPE, "Image", ro_flags), "set_height_map", "get_height_map");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "controlmap", PROPERTY_HINT_RESOURCE_TYPE, "Image", ro_flags), "set_control_map", "get_control_map");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "colormap", PROPERTY_HINT_RESOURCE_TYPE, "Image", ro_flags), "set_color_map", "get_color_map");
ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "multimeshes", PROPERTY_HINT_NONE, "", ro_flags), "set_multimeshes", "get_multimeshes");

// The inspector only shows what's on disk, not what is in memory, so hide them. Being generated, they only show defaults
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "modified", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "is_modified");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "location", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_location", "get_location");
}
18 changes: 11 additions & 7 deletions src/terrain_3d_region.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,22 @@ class Terrain3DRegion : public Resource {
CLASS_NAME();

private:
// Saved data
real_t _version = 0.8f; // Set to first version to ensure Godot always upgrades this
bool _modified = false;
Vector2i _region_loc = Vector2i(INT32_MIN, INT32_MIN);
// Maps
Ref<Image> _height_map;
Ref<Image> _control_map;
Ref<Image> _color_map;
// Instancer MultiMeshes saved to disk
// Dictionary[mesh_id:int] -> MultiMesh
Dictionary _multimeshes;

// Workind data not saved to disk
Vector2i _location = Vector2i(INT32_MAX, INT32_MAX);
bool _modified = false;

public:
void set_version(const real_t p_version);
real_t get_version() const { return _version; }
void set_modified(const bool p_modified) { _modified = p_modified; }
bool is_modified() const { return _modified; }
void set_region_loc(const Vector2i &p_region_loc) { _region_loc = p_region_loc; }
Vector2i get_region_loc() const { return _region_loc; }

// Maps
void set_height_map(const Ref<Image> &p_map);
Expand All @@ -46,6 +44,12 @@ class Terrain3DRegion : public Resource {
// File I/O
Error save(const String &p_path = "", const bool p_16_bit = false);

// Working
void set_modified(const bool p_modified) { _modified = p_modified; }
bool is_modified() const { return _modified; }
void set_location(const Vector2i &p_location) { _location = p_location; }
Vector2i get_location() const { return _location; }

protected:
static void _bind_methods();
};
Expand Down
26 changes: 13 additions & 13 deletions src/terrain_3d_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -362,29 +362,28 @@ void Terrain3DStorage::load_region(const String &p_dir, const Vector2i &p_region
LOG(ERROR, "Could not load region at ", path, " at location", p_region_loc);
return;
}
register_region(region, p_region_loc);
register_region(region);
}

void Terrain3DStorage::register_region(const Ref<Terrain3DRegion> &p_region, const Vector2i &p_region_loc) {
Vector3 global_position = Vector3(_region_size * p_region_loc.x, 0.0f, _region_size * p_region_loc.y);
void Terrain3DStorage::register_region(const Ref<Terrain3DRegion> &p_region) {
Vector3 global_position = Vector3(p_region->get_location().x, 0.0f, p_region->get_location().y) * _region_size;
TypedArray<Image> maps = TypedArray<Image>();
maps.resize(3);
if (p_region->get_height_map().is_valid()) {
maps[0] = p_region->get_height_map()->duplicate();
maps[0] = p_region->get_height_map();
}
if (p_region->get_control_map().is_valid()) {
maps[1] = p_region->get_control_map()->duplicate();
maps[1] = p_region->get_control_map();
}
if (p_region->get_color_map().is_valid()) {
maps[2] = p_region->get_color_map()->duplicate();
maps[2] = p_region->get_color_map();
}
// 3 - Add to region map
add_region(global_position, maps);

// Store region
p_region->set_region_loc(p_region_loc);
LOG(INFO, "Registered region ", p_region->get_path(), " at ", p_region->get_region_loc(), " - ", p_region_loc);
_regions[p_region_loc] = p_region;
LOG(INFO, "Registered region ", p_region->get_path(), " at ", p_region->get_location());
_regions[p_region->get_location()] = p_region;
}

TypedArray<int> Terrain3DStorage::get_regions_under_aabb(const AABB &p_aabb) {
Expand Down Expand Up @@ -1092,10 +1091,11 @@ void Terrain3DStorage::load_directory(const String &p_dir) {
LOG(ERROR, "Cannot read Terrain3D data directory: ", p_dir);
return;
}
LOG(INFO, "Loading region files from ", p_dir);
_clear();
_region_map.resize(REGION_MAP_SIZE * REGION_MAP_SIZE);
_loading = true;
_loading = true; // don't update until done

LOG(INFO, "Loading region files from ", p_dir);
PackedStringArray files = da->get_files();
for (int i = 0; i < files.size(); i++) {
String fname = files[i];
Expand All @@ -1116,9 +1116,9 @@ void Terrain3DStorage::load_directory(const String &p_dir) {
continue;
}
LOG(DEBUG, "Region version: ", region->get_version(), " location: ", loc);
region->set_region_loc(loc);
region->set_location(loc);
region->set_version(CURRENT_VERSION); // Sends upgrade warning if old version
register_region(region, loc);
register_region(region);
}
_loading = false;
force_update_maps();
Expand Down
8 changes: 4 additions & 4 deletions src/terrain_3d_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ class Terrain3DStorage : public Object {
// Storage Settings & flags
RegionSize _region_size = SIZE_1024;
Vector2i _region_sizev = Vector2i(_region_size, _region_size);
bool _loading = false; // I am a little hesitant to include state like this.
bool _loading = false; // tracking when we're loading so we don't add_region w/ update

// TODO: Should be in Terrain3D so its saved
// TODO: Should be in Terrain3D or per region so its saved
Vector2 _height_range = Vector2(0.f, 0.f);

// Work data
Expand Down Expand Up @@ -190,10 +190,10 @@ class Terrain3DStorage : public Object {
// File I/O
void save_directory(const String &p_dir);
void load_directory(const String &p_dir);

void save_region(const String &p_dir, const Vector2i &p_region_loc, const bool p_16_bit = false);
void load_region(const String &p_dir, const Vector2i &p_region_loc);
void register_region(const Ref<Terrain3DRegion> &p_region, const Vector2i &p_region_loc);

void register_region(const Ref<Terrain3DRegion> &p_region);
TypedArray<int> get_regions_under_aabb(const AABB &p_aabb);

void import_images(const TypedArray<Image> &p_images, const Vector3 &p_global_position = Vector3(0.f, 0.f, 0.f),
Expand Down

0 comments on commit 98f2baf

Please # to comment.