From 58076b9ccba547e607ed2fe96a07fe94504735c9 Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Tue, 31 Oct 2023 17:55:15 -0500 Subject: [PATCH] Implement glTF compat version system for files from older Godot versions --- core/io/resource_importer.h | 1 + editor/editor_file_system.cpp | 5 +++ editor/import/resource_importer_scene.cpp | 10 ++++- editor/import/resource_importer_scene.h | 2 + .../editor/editor_scene_importer_gltf.cpp | 13 +++++++ .../gltf/editor/editor_scene_importer_gltf.h | 1 + modules/gltf/gltf_document.cpp | 37 ++++++++++++++++--- modules/gltf/gltf_document.h | 3 ++ 8 files changed, 64 insertions(+), 8 deletions(-) diff --git a/core/io/resource_importer.h b/core/io/resource_importer.h index 0089544caaa..e17644058ab 100644 --- a/core/io/resource_importer.h +++ b/core/io/resource_importer.h @@ -136,6 +136,7 @@ public: virtual void get_import_options(const String &p_path, List *r_options, int p_preset = 0) const = 0; virtual bool get_option_visibility(const String &p_path, const String &p_option, const HashMap &p_options) const = 0; + virtual void handle_compatibility_options(HashMap &p_import_params) const {} virtual String get_option_group_file() const { return String(); } virtual Error import(const String &p_source_file, const String &p_save_path, const HashMap &p_options, List *r_platform_variants, List *r_gen_files = nullptr, Variant *r_metadata = nullptr) = 0; diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index db541796331..b1d591d0f35 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -2012,6 +2012,11 @@ Error EditorFileSystem::_reimport_file(const String &p_file, const HashMaphandle_compatibility_options(params); + } + //mix with default params, in case a parameter is missing List opts; diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 8e277a8b6c7..d5da1183fb2 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -1954,6 +1954,12 @@ void ResourceImporterScene::get_import_options(const String &p_path, List &p_import_params) const { + for (Ref importer_elem : importers) { + importer_elem->handle_compatibility_options(p_import_params); + } +} + void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner) { if (p_node != p_new_owner && p_node->get_owner() == p_scene) { p_node->set_owner(p_new_owner); @@ -2658,10 +2664,10 @@ ResourceImporterScene *ResourceImporterScene::animation_singleton = nullptr; Vector> ResourceImporterScene::importers; Vector> ResourceImporterScene::post_importer_plugins; -bool ResourceImporterScene::ResourceImporterScene::has_advanced_options() const { +bool ResourceImporterScene::has_advanced_options() const { return true; } -void ResourceImporterScene::ResourceImporterScene::show_advanced_options(const String &p_path) { +void ResourceImporterScene::show_advanced_options(const String &p_path) { SceneImportSettings::get_singleton()->open_settings(p_path, animation_importer); } diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index 70060c3d0e6..17681387e69 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -79,6 +79,7 @@ public: virtual Node *import_scene(const String &p_path, uint32_t p_flags, const HashMap &p_options, List *r_missing_deps, Error *r_err = nullptr); virtual void get_import_options(const String &p_path, List *r_options); virtual Variant get_option_visibility(const String &p_path, bool p_for_animation, const String &p_option, const HashMap &p_options); + virtual void handle_compatibility_options(HashMap &p_import_params) const {} EditorSceneFormatImporter() {} }; @@ -276,6 +277,7 @@ public: virtual void get_import_options(const String &p_path, List *r_options, int p_preset = 0) const override; virtual bool get_option_visibility(const String &p_path, const String &p_option, const HashMap &p_options) const override; + virtual void handle_compatibility_options(HashMap &p_import_params) const override; // Import scenes *after* everything else (such as textures). virtual int get_import_order() const override { return ResourceImporter::IMPORT_ORDER_SCENE; } diff --git a/modules/gltf/editor/editor_scene_importer_gltf.cpp b/modules/gltf/editor/editor_scene_importer_gltf.cpp index ae2bd1f580d..e35c0e9b9be 100644 --- a/modules/gltf/editor/editor_scene_importer_gltf.cpp +++ b/modules/gltf/editor/editor_scene_importer_gltf.cpp @@ -51,6 +51,10 @@ Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t gltf.instantiate(); Ref state; state.instantiate(); + if (p_options.has("gltf/naming_version")) { + int naming_version = p_options["gltf/naming_version"]; + gltf->set_naming_version(naming_version); + } if (p_options.has("gltf/embedded_image_handling")) { int32_t enum_option = p_options["gltf/embedded_image_handling"]; state->set_handle_binary_image(enum_option); @@ -77,7 +81,16 @@ Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t void EditorSceneFormatImporterGLTF::get_import_options(const String &p_path, List *r_options) { + r_options->push_back(ResourceImporterScene::ImportOption(PropertyInfo(Variant::INT, "gltf/naming_version", PROPERTY_HINT_ENUM, "Godot 4.1 or 4.0,Godot 4.2 or later"), 1)); r_options->push_back(ResourceImporterScene::ImportOption(PropertyInfo(Variant::INT, "gltf/embedded_image_handling", PROPERTY_HINT_ENUM, "Discard All Textures,Extract Textures,Embed as Basis Universal,Embed as Uncompressed", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), GLTFState::HANDLE_BINARY_EXTRACT_TEXTURES)); } +void EditorSceneFormatImporterGLTF::handle_compatibility_options(HashMap &p_import_params) const { + if (!p_import_params.has("gltf/naming_version")) { + // If an existing import file is missing the glTF + // compatibility version, we need to use version 0. + p_import_params["gltf/naming_version"] = 0; + } +} + #endif // TOOLS_ENABLED diff --git a/modules/gltf/editor/editor_scene_importer_gltf.h b/modules/gltf/editor/editor_scene_importer_gltf.h index ed57ec8cdbc..7726c845bf8 100644 --- a/modules/gltf/editor/editor_scene_importer_gltf.h +++ b/modules/gltf/editor/editor_scene_importer_gltf.h @@ -49,6 +49,7 @@ public: List *r_missing_deps, Error *r_err = nullptr) override; virtual void get_import_options(const String &p_path, List *r_options) override; + virtual void handle_compatibility_options(HashMap &p_import_params) const override; }; #endif // TOOLS_ENABLED diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 90280e03729..b5adea7da02 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -576,6 +576,9 @@ Error GLTFDocument::_parse_scenes(Ref p_state) { } else { p_state->scene_name = p_state->filename; } + if (_naming_version == 0) { + p_state->scene_name = _gen_unique_name(p_state, p_state->scene_name); + } } return OK; @@ -3023,6 +3026,14 @@ Error GLTFDocument::_parse_meshes(Ref p_state) { return OK; } +void GLTFDocument::set_naming_version(int p_version) { + _naming_version = p_version; +} + +int GLTFDocument::get_naming_version() const { + return _naming_version; +} + void GLTFDocument::set_image_format(const String &p_image_format) { _image_format = p_image_format; } @@ -5358,12 +5369,22 @@ void GLTFDocument::_assign_node_names(Ref p_state) { } String gltf_node_name = gltf_node->get_name(); if (gltf_node_name.is_empty()) { - if (gltf_node->mesh >= 0) { - gltf_node_name = "Mesh"; - } else if (gltf_node->camera >= 0) { - gltf_node_name = "Camera"; + if (_naming_version == 0) { + if (gltf_node->mesh >= 0) { + gltf_node_name = _gen_unique_name(p_state, "Mesh"); + } else if (gltf_node->camera >= 0) { + gltf_node_name = _gen_unique_name(p_state, "Camera3D"); + } else { + gltf_node_name = _gen_unique_name(p_state, "Node"); + } } else { - gltf_node_name = "Node"; + if (gltf_node->mesh >= 0) { + gltf_node_name = "Mesh"; + } else if (gltf_node->camera >= 0) { + gltf_node_name = "Camera"; + } else { + gltf_node_name = "Node"; + } } } gltf_node->set_name(_gen_unique_name(p_state, gltf_node_name)); @@ -7405,7 +7426,11 @@ Node *GLTFDocument::_generate_scene_node_tree(Ref p_state) { if (unlikely(p_state->scene_name.is_empty())) { p_state->scene_name = single_root->get_name(); } else if (single_root->get_name() == StringName()) { - single_root->set_name(_gen_unique_name(p_state, p_state->scene_name)); + if (_naming_version == 0) { + single_root->set_name(p_state->scene_name); + } else { + single_root->set_name(_gen_unique_name(p_state, p_state->scene_name)); + } } return single_root; } diff --git a/modules/gltf/gltf_document.h b/modules/gltf/gltf_document.h index 828d650cff3..7e378fe94db 100644 --- a/modules/gltf/gltf_document.h +++ b/modules/gltf/gltf_document.h @@ -73,6 +73,7 @@ public: private: const float BAKE_FPS = 30.0f; + int _naming_version = 1; String _image_format = "PNG"; float _lossy_quality = 0.75f; Ref _image_save_extension; @@ -86,6 +87,8 @@ public: static void unregister_gltf_document_extension(Ref p_extension); static void unregister_all_gltf_document_extensions(); + void set_naming_version(int p_version); + int get_naming_version() const; void set_image_format(const String &p_image_format); String get_image_format() const; void set_lossy_quality(float p_lossy_quality);