summaryrefslogtreecommitdiffstats
path: root/editor
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-02-13 17:23:03 +0100
committerRémi Verschelde <rverschelde@gmail.com>2024-02-13 17:23:03 +0100
commite53e60e0fe0f69c6aba5f163d5a5f747ee20f4be (patch)
tree548172cb69dac77a8adb9d8f4ffee1d8aba7f965 /editor
parent473c27904acd74b4e42e49e80af0ad6c4f83a612 (diff)
parentcd87916d98ad2d17e1a6282ee33be5234c336436 (diff)
downloadredot-engine-e53e60e0fe0f69c6aba5f163d5a5f747ee20f4be.tar.gz
Merge pull request #83856 from BlueCube3310/animation-import-crash
Fix Scene Importer crashing when animation or mesh save paths are invalid
Diffstat (limited to 'editor')
-rw-r--r--editor/import/3d/resource_importer_scene.cpp71
-rw-r--r--editor/import/3d/resource_importer_scene.h1
2 files changed, 52 insertions, 20 deletions
diff --git a/editor/import/3d/resource_importer_scene.cpp b/editor/import/3d/resource_importer_scene.cpp
index dfb14c6741..f7fd7d0589 100644
--- a/editor/import/3d/resource_importer_scene.cpp
+++ b/editor/import/3d/resource_importer_scene.cpp
@@ -31,6 +31,7 @@
#include "resource_importer_scene.h"
#include "core/error/error_macros.h"
+#include "core/io/dir_access.h"
#include "core/io/resource_saver.h"
#include "core/object/script_language.h"
#include "editor/editor_node.h"
@@ -2390,6 +2391,21 @@ Node *ResourceImporterScene::pre_import(const String &p_source_file, const HashM
return scene;
}
+Error ResourceImporterScene::_check_resource_save_paths(const Dictionary &p_data) {
+ Array keys = p_data.keys();
+ for (int i = 0; i < keys.size(); i++) {
+ const Dictionary &settings = p_data[keys[i]];
+
+ if (bool(settings.get("save_to_file/enabled", false)) && settings.has("save_to_file/path")) {
+ const String &save_path = settings["save_to_file/path"];
+
+ ERR_FAIL_COND_V(!save_path.is_empty() && !DirAccess::exists(save_path.get_base_dir()), ERR_FILE_BAD_PATH);
+ }
+ }
+
+ return OK;
+}
+
Error ResourceImporterScene::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
const String &src_path = p_source_file;
@@ -2442,7 +2458,42 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
import_flags |= EditorSceneFormatImporter::IMPORT_FORCE_DISABLE_MESH_COMPRESSION;
}
+ Dictionary subresources = p_options["_subresources"];
+
+ Dictionary node_data;
+ if (subresources.has("nodes")) {
+ node_data = subresources["nodes"];
+ }
+
+ Dictionary material_data;
+ if (subresources.has("materials")) {
+ material_data = subresources["materials"];
+ }
+
+ Dictionary animation_data;
+ if (subresources.has("animations")) {
+ animation_data = subresources["animations"];
+ }
+
+ Dictionary mesh_data;
+ if (subresources.has("meshes")) {
+ mesh_data = subresources["meshes"];
+ }
+
Error err = OK;
+
+ // Check whether any of the meshes or animations have nonexistent save paths
+ // and if they do, fail the import immediately.
+ err = _check_resource_save_paths(mesh_data);
+ if (err != OK) {
+ return err;
+ }
+
+ err = _check_resource_save_paths(animation_data);
+ if (err != OK) {
+ return err;
+ }
+
List<String> missing_deps; // for now, not much will be done with this
Node *scene = importer->import_scene(src_path, import_flags, p_options, &missing_deps, &err);
if (!scene || err != OK) {
@@ -2466,22 +2517,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
scene_3d->scale(scale);
}
}
- Dictionary subresources = p_options["_subresources"];
-
- Dictionary node_data;
- if (subresources.has("nodes")) {
- node_data = subresources["nodes"];
- }
-
- Dictionary material_data;
- if (subresources.has("materials")) {
- material_data = subresources["materials"];
- }
-
- Dictionary animation_data;
- if (subresources.has("animations")) {
- animation_data = subresources["animations"];
- }
HashSet<Ref<ImporterMesh>> scanned_meshes;
HashMap<Ref<ImporterMesh>, Vector<Ref<Shape3D>>> collision_map;
@@ -2561,10 +2596,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
}
}
- Dictionary mesh_data;
- if (subresources.has("meshes")) {
- mesh_data = subresources["meshes"];
- }
scene = _generate_meshes(scene, mesh_data, gen_lods, create_shadow_meshes, LightBakeMode(light_bake_mode), lightmap_texel_size, src_lightmap_cache, mesh_lightmap_caches);
if (mesh_lightmap_caches.size()) {
diff --git a/editor/import/3d/resource_importer_scene.h b/editor/import/3d/resource_importer_scene.h
index 6ea4d1af7d..f82a5aa9e9 100644
--- a/editor/import/3d/resource_importer_scene.h
+++ b/editor/import/3d/resource_importer_scene.h
@@ -214,6 +214,7 @@ class ResourceImporterScene : public ResourceImporter {
SHAPE_TYPE_CAPSULE,
};
+ static Error _check_resource_save_paths(const Dictionary &p_data);
Array _get_skinned_pose_transforms(ImporterMeshInstance3D *p_src_mesh_node);
void _replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner);
Node *_generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<Vector<uint8_t>> &r_lightmap_caches);