Browse Source

Fix a crash bug in LightmapGI::_assign_lightmaps triggered after reparenting

After reparenting the LightmapGI node, the following `node` would be
initialized to null:

Node *node = get_node(light_data->get_user_path(i));

Which would then crash when de-referenced further down. This fix detects
which the node has been reparented and clears its users.
James 7 months ago
parent
commit
80096e9e62
2 changed files with 7 additions and 0 deletions
  1. 6 0
      scene/3d/lightmap_gi.cpp
  2. 1 0
      scene/3d/lightmap_gi.h

+ 6 - 0
scene/3d/lightmap_gi.cpp

@@ -1491,11 +1491,17 @@ void LightmapGI::_notification(int p_what) {
 								"%s (%s): The directional lightmap textures are stored in a format that isn't supported anymore. Please bake lightmaps again to make lightmaps display from this node again.",
 								get_light_data()->get_path(), get_name()));
 
+				if (last_owner && last_owner != get_owner()) {
+					light_data->clear_users();
+				}
+
 				_assign_lightmaps();
 			}
 		} break;
 
 		case NOTIFICATION_EXIT_TREE: {
+			last_owner = get_owner();
+
 			if (light_data.is_valid()) {
 				_clear_lightmaps();
 			}

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

@@ -206,6 +206,7 @@ private:
 	Ref<CameraAttributes> camera_attributes;
 
 	Ref<LightmapGIData> light_data;
+	Node *last_owner = nullptr;
 
 	struct LightsFound {
 		Transform3D xform;