Allow post-import plugins to modify _subresources

The old code fetched some data before the `EditorScenePostImportPlugin._pre_process` callback.
While the callback could modify existing keys, this prevented users from adding new data on a fresh import.

By fetching the keys after pre_process, this means users can consistently modify import options for nodes, meshes, materials and animations in a post-import plugin.
This commit is contained in:
Lyuma 2024-12-24 07:34:24 -08:00
parent 0f95e9f8e6
commit 637fe3ccdd
2 changed files with 32 additions and 26 deletions

View file

@ -71,6 +71,7 @@
<param index="0" name="scene" type="Node" />
<description>
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].
</description>
</method>
<method name="add_import_option">

View file

@ -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<String> 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")];