Browse Source

Propagate error correctly when max texture size for lightmaps is too small.

Add error handling for BAKE_ERROR_LIGHTMAP_TOO_SMALL, which was previously ignored. Fixes #81453.

(cherry picked from commit 7dfb854556f0a69672f5e112e3bfbe7f507db3b0)
Dario 1 year ago
parent
commit
f6f2b0897a

+ 3 - 0
doc/classes/LightmapGI.xml

@@ -117,6 +117,9 @@
 		<constant name="BAKE_ERROR_USER_ABORTED" value="8" enum="BakeError">
 		<constant name="BAKE_ERROR_USER_ABORTED" value="8" enum="BakeError">
 			The user aborted the lightmap baking operation (typically by clicking the [b]Cancel[/b] button in the progress dialog).
 			The user aborted the lightmap baking operation (typically by clicking the [b]Cancel[/b] button in the progress dialog).
 		</constant>
 		</constant>
+		<constant name="BAKE_ERROR_TEXTURE_SIZE_TOO_SMALL" value="9" enum="BakeError">
+			Lightmap baking failed as the maximum texture size is too small to fit some of the meshes marked for baking.
+		</constant>
 		<constant name="ENVIRONMENT_MODE_DISABLED" value="0" enum="EnvironmentMode">
 		<constant name="ENVIRONMENT_MODE_DISABLED" value="0" enum="EnvironmentMode">
 			Ignore environment lighting when baking lightmaps.
 			Ignore environment lighting when baking lightmaps.
 		</constant>
 		</constant>

+ 3 - 0
editor/plugins/lightmap_gi_editor_plugin.cpp

@@ -103,6 +103,9 @@ void LightmapGIEditorPlugin::_bake_select_file(const String &p_file) {
 			case LightmapGI::BAKE_ERROR_FOREIGN_DATA: {
 			case LightmapGI::BAKE_ERROR_FOREIGN_DATA: {
 				EditorNode::get_singleton()->show_warning(TTR("Lightmap data is not local to the scene."));
 				EditorNode::get_singleton()->show_warning(TTR("Lightmap data is not local to the scene."));
 			} break;
 			} break;
+			case LightmapGI::BAKE_ERROR_TEXTURE_SIZE_TOO_SMALL: {
+				EditorNode::get_singleton()->show_warning(TTR("Maximum texture size is too small for the lightmap images."));
+			} break;
 			default: {
 			default: {
 			} break;
 			} break;
 		}
 		}

+ 4 - 1
scene/3d/lightmap_gi.cpp

@@ -1081,7 +1081,9 @@ LightmapGI::BakeError LightmapGI::bake(Node *p_from_node, String p_image_data_pa
 
 
 	Lightmapper::BakeError bake_err = lightmapper->bake(Lightmapper::BakeQuality(bake_quality), use_denoiser, bounces, bias, max_texture_size, directional, Lightmapper::GenerateProbes(gen_probes), environment_image, environment_transform, _lightmap_bake_step_function, &bsud, exposure_normalization);
 	Lightmapper::BakeError bake_err = lightmapper->bake(Lightmapper::BakeQuality(bake_quality), use_denoiser, bounces, bias, max_texture_size, directional, Lightmapper::GenerateProbes(gen_probes), environment_image, environment_transform, _lightmap_bake_step_function, &bsud, exposure_normalization);
 
 
-	if (bake_err == Lightmapper::BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES) {
+	if (bake_err == Lightmapper::BAKE_ERROR_LIGHTMAP_TOO_SMALL) {
+		return BAKE_ERROR_TEXTURE_SIZE_TOO_SMALL;
+	} else if (bake_err == Lightmapper::BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES) {
 		return BAKE_ERROR_MESHES_INVALID;
 		return BAKE_ERROR_MESHES_INVALID;
 	}
 	}
 
 
@@ -1565,6 +1567,7 @@ void LightmapGI::_bind_methods() {
 	BIND_ENUM_CONSTANT(BAKE_ERROR_MESHES_INVALID);
 	BIND_ENUM_CONSTANT(BAKE_ERROR_MESHES_INVALID);
 	BIND_ENUM_CONSTANT(BAKE_ERROR_CANT_CREATE_IMAGE);
 	BIND_ENUM_CONSTANT(BAKE_ERROR_CANT_CREATE_IMAGE);
 	BIND_ENUM_CONSTANT(BAKE_ERROR_USER_ABORTED);
 	BIND_ENUM_CONSTANT(BAKE_ERROR_USER_ABORTED);
+	BIND_ENUM_CONSTANT(BAKE_ERROR_TEXTURE_SIZE_TOO_SMALL);
 
 
 	BIND_ENUM_CONSTANT(ENVIRONMENT_MODE_DISABLED);
 	BIND_ENUM_CONSTANT(ENVIRONMENT_MODE_DISABLED);
 	BIND_ENUM_CONSTANT(ENVIRONMENT_MODE_SCENE);
 	BIND_ENUM_CONSTANT(ENVIRONMENT_MODE_SCENE);

+ 1 - 0
scene/3d/lightmap_gi.h

@@ -132,6 +132,7 @@ public:
 		BAKE_ERROR_MESHES_INVALID,
 		BAKE_ERROR_MESHES_INVALID,
 		BAKE_ERROR_CANT_CREATE_IMAGE,
 		BAKE_ERROR_CANT_CREATE_IMAGE,
 		BAKE_ERROR_USER_ABORTED,
 		BAKE_ERROR_USER_ABORTED,
+		BAKE_ERROR_TEXTURE_SIZE_TOO_SMALL,
 	};
 	};
 
 
 	enum EnvironmentMode {
 	enum EnvironmentMode {