Browse Source

Merge pull request #100792 from lyuma/post_import_plugin_subresources

Allow post-import plugins to modify `_subresources`
Rémi Verschelde 7 months ago
parent
commit
a7d84fa022

+ 1 - 0
doc/classes/EditorScenePostImportPlugin.xml

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

+ 31 - 26
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 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;
 	Error err = OK;
 
 
 	// Check whether any of the meshes or animations have nonexistent save paths
 	// Check whether any of the meshes or animations have nonexistent save paths
 	// and if they do, fail the import immediately.
 	// 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
 	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);
 		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;
 	float fps = 30;
 	if (p_options.has(SNAME("animation/fps"))) {
 	if (p_options.has(SNAME("animation/fps"))) {
 		fps = (float)p_options[SNAME("animation/fps")];
 		fps = (float)p_options[SNAME("animation/fps")];