Skip to content

Commit

Permalink
Fix upgrade version handling
Browse files Browse the repository at this point in the history
  • Loading branch information
TokisanGames committed Oct 30, 2023
1 parent 6f73310 commit 0757a5a
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 28 deletions.
6 changes: 3 additions & 3 deletions project/addons/terrain_3d/plugin.cfg
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[plugin]

name="Terrain3D"
description="Editable Terrain System for Godot 4"
author="Roope Palmroos & Cory Petkovsek"
version="0.8.3-alpha"
description="A high performance, editable terrain system for Godot 4."
author="Cory Petkovsek & Roope Palmroos"
version="0.8.4-dev"
script="editor/editor.gd"
16 changes: 8 additions & 8 deletions src/terrain_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ void Terrain3D::_initialize() {
if (_storage.is_null()) {
LOG(DEBUG, "Creating blank storage");
_storage.instantiate();
_storage->set_version(Terrain3DStorage::CURRENT_VERSION);
} else if (_texture_list.is_null() && _storage->get_version() < 0.83f) {
// DEPREPCATED 0.8.3, remove 0.9
_texture_list = _storage->get_texture_list();
Expand Down Expand Up @@ -75,12 +76,6 @@ void Terrain3D::_initialize() {

void Terrain3D::__ready() {
_initialize();
if (_storage->get_version() < Terrain3DStorage::CURRENT_VERSION) {
LOG(WARN, "Storage version ", vformat("%.2f", _storage->get_version()), " will be updated upon save");
_storage->set_modified();
} else {
_storage->clear_modified();
}
set_process(true);
}

Expand Down Expand Up @@ -515,12 +510,15 @@ void Terrain3D::set_material(const Ref<Terrain3DMaterial> &p_material) {
}
}

// This is run after the object has loaded and initialized
void Terrain3D::set_storage(const Ref<Terrain3DStorage> &p_storage) {
if (_storage != p_storage) {
LOG(INFO, "Setting storage");
_storage = p_storage;
if (_storage.is_valid()) {
LOG(INFO, "Loaded storage version: ", vformat("%.2f", p_storage->get_version()));
// DEPRECATED 0.8.4 remove 0.9 - Version redundant w/ set_version after 0.8.4
LOG(INFO, "Loaded storage version: ", vformat("%.3f", p_storage->get_version()));
} else {
LOG(INFO, "Clearing storage");
}
_clear();
_initialize();
Expand Down Expand Up @@ -842,6 +840,7 @@ void Terrain3D::_notification(int p_what) {
}

void Terrain3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_version"), &Terrain3D::get_version);
ClassDB::bind_method(D_METHOD("set_debug_level", "level"), &Terrain3D::set_debug_level);
ClassDB::bind_method(D_METHOD("get_debug_level"), &Terrain3D::get_debug_level);
ClassDB::bind_method(D_METHOD("set_clipmap_levels", "count"), &Terrain3D::set_clipmap_levels);
Expand Down Expand Up @@ -888,6 +887,7 @@ void Terrain3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("update_aabbs"), &Terrain3D::update_aabbs);
ClassDB::bind_method(D_METHOD("get_intersection", "position", "direction"), &Terrain3D::get_intersection);

ADD_PROPERTY(PropertyInfo(Variant::STRING, "version", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY), "", "get_version");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "storage", PROPERTY_HINT_RESOURCE_TYPE, "Terrain3DStorage"), "set_storage", "get_storage");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "Terrain3DMaterial"), "set_material", "get_material");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_list", PROPERTY_HINT_RESOURCE_TYPE, "Terrain3DTextureList"), "set_texture_list", "get_texture_list");
Expand Down
2 changes: 2 additions & 0 deletions src/terrain_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class Terrain3D : public Node3D {
static inline const char *__class__ = "Terrain3D";

// Terrain state
String _version = "0.8.4-dev";
bool _is_inside_world = false;
bool _initialized = false;

Expand Down Expand Up @@ -88,6 +89,7 @@ class Terrain3D : public Node3D {
~Terrain3D();

// Terrain settings
String get_version() const { return _version; }
void set_debug_level(int p_level);
int get_debug_level() const { return _debug_level; }
void set_clipmap_levels(int p_count);
Expand Down
48 changes: 35 additions & 13 deletions src/terrain_3d_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,31 @@ Terrain3DStorage::~Terrain3DStorage() {
_clear();
}

// Lots of the upgrade process requires this to run first
// It only runs if the version is saved in the file, which only happens if it was
// different from the in the file is different from _version
inline void Terrain3DStorage::set_version(real_t p_version) {
LOG(INFO, vformat("%.3f", p_version));
_version = p_version;
if (_version >= 0.841f) {
_841_colormap_upgraded = true;
}
if (_version < CURRENT_VERSION) {
LOG(WARN, "Storage version ", vformat("%.3f", _version), " will be updated to ", vformat("%.3f", CURRENT_VERSION), " upon save");
_modified = true;
}
}

inline void Terrain3DStorage::set_save_16_bit(bool p_enabled) {
LOG(INFO, p_enabled);
_save_16_bit = p_enabled;
}

inline void Terrain3DStorage::set_height_range(Vector2 p_range) {
LOG(INFO, vformat("%.2v", p_range));
_height_range = p_range;
}

void Terrain3DStorage::update_heights(real_t p_height) {
if (p_height < _height_range.x) {
_height_range.x = p_height;
Expand Down Expand Up @@ -114,7 +139,7 @@ void Terrain3DStorage::update_height_range() {
}

void Terrain3DStorage::set_region_size(RegionSize p_size) {
LOG(INFO, "Setting region size: ", p_size);
LOG(INFO, p_size);
//ERR_FAIL_COND(p_size < SIZE_64);
//ERR_FAIL_COND(p_size > SIZE_2048);
ERR_FAIL_COND(p_size != SIZE_1024);
Expand Down Expand Up @@ -377,12 +402,11 @@ void Terrain3DStorage::set_control_maps(const TypedArray<Image> &p_maps) {

void Terrain3DStorage::set_color_maps(const TypedArray<Image> &p_maps) {
LOG(INFO, "Setting color maps: ", p_maps.size());

TypedArray<Image> maps = p_maps;
// DEPRECATED 0.8.4 Remove 0.9
// Convert colormap from linear <0.8.4 to srgb 0.8.41
if (_version < CURRENT_VERSION && maps.size() > 0) {
LOG(WARN, "Color maps are being converted from linear to srgb. Upgrading: ", vformat("%.2f", _version), "->", vformat("%.2f", CURRENT_VERSION));
// Convert colormap from linear <0.84 to srgb 0.841
if (_version < 0.841 && !_841_colormap_upgraded && maps.size() > 0) {
LOG(WARN, "Converting color maps from linear to srgb. ", vformat("%.3f", _version), "->", vformat("%.3f", CURRENT_VERSION));
for (int i = 0; i < maps.size(); i++) {
Ref<Image> img = maps[i];
for (int x = 0; x < img->get_width(); x++) {
Expand All @@ -393,7 +417,7 @@ void Terrain3DStorage::set_color_maps(const TypedArray<Image> &p_maps) {
}
maps[i] = img;
}
_version = CURRENT_VERSION; // Prevent running again on focus
_841_colormap_upgraded = true;
}
_color_maps = sanitize_maps(TYPE_COLOR, maps);
force_update_maps(TYPE_COLOR);
Expand Down Expand Up @@ -517,14 +541,14 @@ void Terrain3DStorage::force_update_maps(MapType p_map_type) {

void Terrain3DStorage::save() {
if (!_modified) {
LOG(DEBUG, "Save requested, but not modified. Skipping");
LOG(INFO, "Save requested, but not modified. Skipping");
return;
}
String path = get_path();
// Initiate save to external file. The scene will save itself.
if (path.get_extension() == "tres" || path.get_extension() == "res") {
LOG(DEBUG, "Attempting to save terrain data to external file: " + path);
LOG(DEBUG, "Saving storage version: ", vformat("%.2f", CURRENT_VERSION));
LOG(DEBUG, "Saving storage version: ", vformat("%.3f", CURRENT_VERSION));
set_version(CURRENT_VERSION);
Error err;
if (_save_16_bit) {
Expand All @@ -551,7 +575,7 @@ void Terrain3DStorage::save() {
}
LOG(INFO, "Finished saving terrain data");
} else {
LOG(WARN, "Storage resource is saving in the scene file. Save it as an external binary .res file");
LOG(WARN, "Storage resource saved in the scene file. Save it as an external, binary .res file");
}
}

Expand Down Expand Up @@ -871,7 +895,6 @@ void Terrain3DStorage::print_audit_data() {
// DEPRECATED 0.8.3, remove 0.9
void Terrain3DStorage::set_surfaces(const TypedArray<Terrain3DSurface> &p_surfaces) {
LOG(WARN, "Converting old Surfaces to separate TextureList resource");
_version = 0.8;
_texture_list.instantiate();
TypedArray<Terrain3DTexture> textures;
textures.resize(p_surfaces.size());
Expand Down Expand Up @@ -958,12 +981,11 @@ void Terrain3DStorage::_bind_methods() {
ClassDB::bind_method(D_METHOD("export_image", "file_name", "map_type"), &Terrain3DStorage::export_image);
ClassDB::bind_method(D_METHOD("layered_to_image", "map_type"), &Terrain3DStorage::layered_to_image);

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::INT, "region_size", PROPERTY_HINT_ENUM, "64:64, 128:128, 256:256, 512:512, 1024:1024, 2048:2048"), "set_region_size", "get_region_size");
ADD_PROPERTY(PropertyInfo(Variant::INT, "region_size", PROPERTY_HINT_ENUM, "1024:1024"), "set_region_size", "get_region_size");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "save_16_bit", PROPERTY_HINT_NONE), "set_save_16_bit", "get_save_16_bit");

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::VECTOR2, "height_range", PROPERTY_HINT_NONE, "", ro_flags), "set_height_range", "get_height_range");
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "region_offsets", PROPERTY_HINT_ARRAY_TYPE, vformat("%tex_size/%tex_size:%tex_size", Variant::VECTOR2, PROPERTY_HINT_NONE), ro_flags), "set_region_offsets", "get_region_offsets");
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "height_maps", PROPERTY_HINT_ARRAY_TYPE, vformat("%tex_size/%tex_size:%tex_size", Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE, "Image"), ro_flags), "set_height_maps", "get_height_maps");
Expand Down
10 changes: 6 additions & 4 deletions src/terrain_3d_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class Terrain3DStorage : public Resource {

// Storage Settings & flags

real_t _version = CURRENT_VERSION;
real_t _version = 0.8; // Set to ensure Godot always saves this
bool _modified = false;
bool _save_16_bit = false;
RegionSize _region_size = SIZE_1024;
Expand Down Expand Up @@ -98,17 +98,19 @@ class Terrain3DStorage : public Resource {

// DEPRECATED 0.8.3, remove 0.9
Ref<Terrain3DTextureList> _texture_list;
// DEPRECATED 0.8.4, remove 0.9
bool _841_colormap_upgraded = false;

public:
Terrain3DStorage();
~Terrain3DStorage();

inline void set_version(real_t p_version) { _version = p_version; }
inline void set_version(real_t p_version);
inline real_t get_version() const { return _version; }
inline void set_save_16_bit(bool p_enabled) { _save_16_bit = p_enabled; }
inline void set_save_16_bit(bool p_enabled);
inline bool get_save_16_bit() const { return _save_16_bit; }

inline void set_height_range(Vector2 p_range) { _height_range = p_range; }
inline void set_height_range(Vector2 p_range);
inline Vector2 get_height_range() const { return _height_range; }
void update_heights(real_t p_height);
void update_heights(Vector2 p_heights);
Expand Down

0 comments on commit 0757a5a

Please sign in to comment.