diff --git a/doc/classes/EditorScenePostImportPlugin.xml b/doc/classes/EditorScenePostImportPlugin.xml
index 0004ec65c646..ddcbb757ad32 100644
--- a/doc/classes/EditorScenePostImportPlugin.xml
+++ b/doc/classes/EditorScenePostImportPlugin.xml
@@ -71,6 +71,7 @@
Pre Process the scene. This function is called right after the scene format loader loaded the scene and no changes have been made.
+ Pre process may be used to adjust internal import options in the [code]"nodes"[/code], [code]"meshes"[/code], [code]"animations"[/code] or [code]"materials"[/code] keys inside [code]get_option_value("_subresources")[/code].
diff --git a/editor/import/3d/resource_importer_scene.cpp b/editor/import/3d/resource_importer_scene.cpp
index b85857b4f4e8..4b5c1011059f 100644
--- a/editor/import/3d/resource_importer_scene.cpp
+++ b/editor/import/3d/resource_importer_scene.cpp
@@ -2934,38 +2934,22 @@ Error ResourceImporterScene::import(ResourceUID::ID p_source_id, const String &p
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;
+ if (subresources.has("meshes")) {
+ err = _check_resource_save_paths(subresources["meshes"]);
+ if (err != OK) {
+ return err;
+ }
}
- err = _check_resource_save_paths(animation_data);
- if (err != OK) {
- return err;
+ if (subresources.has("animations")) {
+ err = _check_resource_save_paths(subresources["animations"]);
+ if (err != OK) {
+ return err;
+ }
}
List missing_deps; // for now, not much will be done with this
@@ -3005,6 +2989,27 @@ Error ResourceImporterScene::import(ResourceUID::ID p_source_id, const String &p
post_importer_plugins.write[i]->pre_process(scene, p_options);
}
+ // data in _subresources may be modified by pre_process(), so wait until now to check.
+ 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"];
+ }
+
float fps = 30;
if (p_options.has(SNAME("animation/fps"))) {
fps = (float)p_options[SNAME("animation/fps")];