Browse Source

Merge pull request #74907 from YuriSizov/4.0-cherrypicks

Cherry-picks for the 4.0 branch (future 4.0.1) - 3rd batch
Yuri Sizov 2 years ago
parent
commit
fc7adaab7b
44 changed files with 268 additions and 123 deletions
  1. 4 1
      core/io/json.cpp
  2. 1 0
      doc/classes/OS.xml
  3. 2 2
      doc/classes/String.xml
  4. 1 1
      doc/classes/Window.xml
  5. 18 10
      drivers/gles3/rasterizer_canvas_gles3.cpp
  6. 9 8
      drivers/gles3/storage/mesh_storage.cpp
  7. 1 1
      drivers/vulkan/rendering_device_vulkan.cpp
  8. 28 20
      editor/debugger/script_editor_debugger.cpp
  9. 5 5
      editor/editor_inspector.cpp
  10. 8 6
      editor/editor_node.cpp
  11. 1 1
      editor/editor_properties.cpp
  12. 25 1
      editor/fbx_importer_manager.cpp
  13. 3 0
      editor/fbx_importer_manager.h
  14. 1 1
      editor/plugins/asset_library_editor_plugin.cpp
  15. 1 0
      editor/plugins/canvas_item_editor_plugin.cpp
  16. 8 6
      editor/plugins/node_3d_editor_plugin.cpp
  17. 2 2
      editor/plugins/tiles/tile_data_editors.cpp
  18. 1 1
      editor/plugins/tiles/tile_set_atlas_source_editor.cpp
  19. 5 1
      editor/project_settings_editor.cpp
  20. 1 1
      editor/project_settings_editor.h
  21. 3 0
      editor/renames_map_3_to_4.cpp
  22. 1 1
      modules/gdscript/gdscript_editor.cpp
  23. 1 1
      modules/gdscript/gdscript_parser.cpp
  24. 2 2
      modules/gltf/register_types.cpp
  25. 1 1
      platform/ios/godot_view.mm
  26. 5 3
      platform/linuxbsd/x11/display_server_x11.cpp
  27. 19 4
      platform/linuxbsd/x11/gl_manager_x11.cpp
  28. 1 1
      platform/linuxbsd/x11/gl_manager_x11.h
  29. 34 10
      platform/linuxbsd/x11/key_mapping_x11.cpp
  30. 3 3
      platform/macos/display_server_macos.mm
  31. 1 1
      platform/windows/display_server_windows.cpp
  32. 1 1
      platform/windows/key_mapping_windows.cpp
  33. 1 1
      scene/3d/cpu_particles_3d.cpp
  34. 3 1
      scene/3d/mesh_instance_3d.cpp
  35. 3 2
      scene/gui/link_button.cpp
  36. 1 1
      scene/gui/menu_bar.cpp
  37. 2 2
      scene/resources/sky_material.cpp
  38. 2 2
      servers/register_server_types.cpp
  39. 1 0
      servers/rendering/renderer_canvas_render.h
  40. 18 10
      servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp
  41. 9 8
      servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp
  42. 1 0
      servers/rendering/renderer_scene_cull.cpp
  43. 26 0
      thirdparty/vulkan/patches/VMA-fix-gcc13.patch
  44. 4 0
      thirdparty/vulkan/vk_mem_alloc.h

+ 4 - 1
core/io/json.cpp

@@ -91,9 +91,12 @@ String JSON::_stringify(const Variant &p_var, const String &p_indent, int p_cur_
 		case Variant::PACKED_FLOAT64_ARRAY:
 		case Variant::PACKED_FLOAT64_ARRAY:
 		case Variant::PACKED_STRING_ARRAY:
 		case Variant::PACKED_STRING_ARRAY:
 		case Variant::ARRAY: {
 		case Variant::ARRAY: {
+			Array a = p_var;
+			if (a.size() == 0) {
+				return "[]";
+			}
 			String s = "[";
 			String s = "[";
 			s += end_statement;
 			s += end_statement;
-			Array a = p_var;
 
 
 			ERR_FAIL_COND_V_MSG(p_markers.has(a.id()), "\"[...]\"", "Converting circular structure to JSON.");
 			ERR_FAIL_COND_V_MSG(p_markers.has(a.id()), "\"[...]\"", "Converting circular structure to JSON.");
 			p_markers.insert(a.id());
 			p_markers.insert(a.id());

+ 1 - 0
doc/classes/OS.xml

@@ -634,6 +634,7 @@
 				- [code]OS.shell_open("https://godotengine.org")[/code] opens the default web browser on the official Godot website.
 				- [code]OS.shell_open("https://godotengine.org")[/code] opens the default web browser on the official Godot website.
 				- [code]OS.shell_open("mailto:[email protected]")[/code] opens the default email client with the "To" field set to [code][email protected][/code]. See [url=https://datatracker.ietf.org/doc/html/rfc2368]RFC 2368 - The [code]mailto[/code] URL scheme[/url] for a list of fields that can be added.
 				- [code]OS.shell_open("mailto:[email protected]")[/code] opens the default email client with the "To" field set to [code][email protected][/code]. See [url=https://datatracker.ietf.org/doc/html/rfc2368]RFC 2368 - The [code]mailto[/code] URL scheme[/url] for a list of fields that can be added.
 				Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] or [code]user://[/code] path into a system path for use with this method.
 				Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] or [code]user://[/code] path into a system path for use with this method.
+				[b]Note:[/b] Use [method String.uri_encode] to encode characters within URLs in a URL-safe, portable way. This is especially required for line breaks. Otherwise, [method shell_open] may not work correctly in a project exported to the Web platform.
 				[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux, macOS and Windows.
 				[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux, macOS and Windows.
 			</description>
 			</description>
 		</method>
 		</method>

+ 2 - 2
doc/classes/String.xml

@@ -970,7 +970,7 @@
 		<method name="uri_decode" qualifiers="const">
 		<method name="uri_decode" qualifiers="const">
 			<return type="String" />
 			<return type="String" />
 			<description>
 			<description>
-				Decodes the string from its URL-encoded format. This method is meant to properly decode the parameters in a URL when receiving an HTTP request.
+				Decodes the string from its URL-encoded format. This method is meant to properly decode the parameters in a URL when receiving an HTTP request. See also [method uri_encode].
 				[codeblocks]
 				[codeblocks]
 				[gdscript]
 				[gdscript]
 				var url = "$DOCS_URL/?highlight=Godot%20Engine%3%docs"
 				var url = "$DOCS_URL/?highlight=Godot%20Engine%3%docs"
@@ -986,7 +986,7 @@
 		<method name="uri_encode" qualifiers="const">
 		<method name="uri_encode" qualifiers="const">
 			<return type="String" />
 			<return type="String" />
 			<description>
 			<description>
-				Encodes the string to URL-friendly format. This method is meant to properly encode the parameters in a URL when sending an HTTP request.
+				Encodes the string to URL-friendly format. This method is meant to properly encode the parameters in a URL when sending an HTTP request. See also [method uri_decode].
 				[codeblocks]
 				[codeblocks]
 				[gdscript]
 				[gdscript]
 				var prefix = "$DOCS_URL/?highlight="
 				var prefix = "$DOCS_URL/?highlight="

+ 1 - 1
doc/classes/Window.xml

@@ -530,7 +530,7 @@
 			[b]Note:[/b] Fullscreen mode is not exclusive full screen on Windows and Linux.
 			[b]Note:[/b] Fullscreen mode is not exclusive full screen on Windows and Linux.
 		</member>
 		</member>
 		<member name="mouse_passthrough" type="bool" setter="set_flag" getter="get_flag" default="false">
 		<member name="mouse_passthrough" type="bool" setter="set_flag" getter="get_flag" default="false">
-			If [code]true[/code], all mouse event as passed to the underlying window of the same application. See also [member mouse_passthrough_polygon].
+			If [code]true[/code], all mouse events will be passed to the underlying window of the same application. See also [member mouse_passthrough_polygon].
 			[b]Note:[/b] This property is implemented on Linux (X11), macOS and Windows.
 			[b]Note:[/b] This property is implemented on Linux (X11), macOS and Windows.
 		</member>
 		</member>
 		<member name="mouse_passthrough_polygon" type="PackedVector2Array" setter="set_mouse_passthrough_polygon" getter="get_mouse_passthrough_polygon" default="PackedVector2Array()">
 		<member name="mouse_passthrough_polygon" type="PackedVector2Array" setter="set_mouse_passthrough_polygon" getter="get_mouse_passthrough_polygon" default="PackedVector2Array()">

+ 18 - 10
drivers/gles3/rasterizer_canvas_gles3.cpp

@@ -396,6 +396,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
 
 
 	Item *ci = p_item_list;
 	Item *ci = p_item_list;
 	Item *canvas_group_owner = nullptr;
 	Item *canvas_group_owner = nullptr;
+	bool skip_item = false;
 
 
 	state.last_item_index = 0;
 	state.last_item_index = 0;
 
 
@@ -464,6 +465,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
 					Rect2i group_rect = ci->canvas_group_owner->global_rect_cache;
 					Rect2i group_rect = ci->canvas_group_owner->global_rect_cache;
 					texture_storage->render_target_copy_to_back_buffer(p_to_render_target, group_rect, false);
 					texture_storage->render_target_copy_to_back_buffer(p_to_render_target, group_rect, false);
 					if (ci->canvas_group_owner->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
 					if (ci->canvas_group_owner->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
+						ci->canvas_group_owner->use_canvas_group = false;
 						items[item_count++] = ci->canvas_group_owner;
 						items[item_count++] = ci->canvas_group_owner;
 					}
 					}
 				} else if (!backbuffer_cleared) {
 				} else if (!backbuffer_cleared) {
@@ -478,9 +480,8 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
 			ci->canvas_group_owner = nullptr; //must be cleared
 			ci->canvas_group_owner = nullptr; //must be cleared
 		}
 		}
 
 
-		if (!backbuffer_cleared && canvas_group_owner == nullptr && ci->canvas_group != nullptr && !backbuffer_copy) {
-			texture_storage->render_target_clear_back_buffer(p_to_render_target, Rect2i(), Color(0, 0, 0, 0));
-			backbuffer_cleared = true;
+		if (canvas_group_owner == nullptr && ci->canvas_group != nullptr && ci->canvas_group->mode != RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
+			skip_item = true;
 		}
 		}
 
 
 		if (ci == canvas_group_owner) {
 		if (ci == canvas_group_owner) {
@@ -498,6 +499,11 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
 			canvas_group_owner = nullptr;
 			canvas_group_owner = nullptr;
 			// Backbuffer is dirty now and needs to be re-cleared if another CanvasGroup needs it.
 			// Backbuffer is dirty now and needs to be re-cleared if another CanvasGroup needs it.
 			backbuffer_cleared = false;
 			backbuffer_cleared = false;
+
+			// Tell the renderer to paint this as a canvas group
+			ci->use_canvas_group = true;
+		} else {
+			ci->use_canvas_group = false;
 		}
 		}
 
 
 		if (backbuffer_copy) {
 		if (backbuffer_copy) {
@@ -513,9 +519,9 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
 			texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
 			texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
 
 
 			backbuffer_copy = false;
 			backbuffer_copy = false;
-			backbuffer_gen_mipmaps = false;
 			material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies.
 			material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies.
 			material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps;
 			material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps;
+			backbuffer_gen_mipmaps = false;
 		}
 		}
 
 
 		if (backbuffer_gen_mipmaps) {
 		if (backbuffer_gen_mipmaps) {
@@ -526,14 +532,18 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
 		}
 		}
 
 
 		// just add all items for now
 		// just add all items for now
-		items[item_count++] = ci;
+		if (skip_item) {
+			skip_item = false;
+		} else {
+			items[item_count++] = ci;
+		}
 
 
 		if (!ci->next || item_count == MAX_RENDER_ITEMS - 1) {
 		if (!ci->next || item_count == MAX_RENDER_ITEMS - 1) {
 			if (update_skeletons) {
 			if (update_skeletons) {
 				mesh_storage->update_mesh_instances();
 				mesh_storage->update_mesh_instances();
 				update_skeletons = false;
 				update_skeletons = false;
 			}
 			}
-			_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used);
+			_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, canvas_group_owner != nullptr);
 			//then reset
 			//then reset
 			item_count = 0;
 			item_count = 0;
 		}
 		}
@@ -586,11 +596,9 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
 		}
 		}
 
 
 		RID material = ci->material_owner == nullptr ? ci->material : ci->material_owner->material;
 		RID material = ci->material_owner == nullptr ? ci->material : ci->material_owner->material;
-		if (ci->canvas_group != nullptr) {
+		if (ci->use_canvas_group) {
 			if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
 			if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
-				if (!p_to_backbuffer) {
-					material = default_clip_children_material;
-				}
+				material = default_clip_children_material;
 			} else {
 			} else {
 				if (material.is_null()) {
 				if (material.is_null()) {
 					if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_ONLY) {
 					if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_ONLY) {

+ 9 - 8
drivers/gles3/storage/mesh_storage.cpp

@@ -327,6 +327,7 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
 	} else {
 	} else {
 		mesh->aabb.merge_with(p_surface.aabb);
 		mesh->aabb.merge_with(p_surface.aabb);
 	}
 	}
+	mesh->skeleton_aabb_version = 0;
 
 
 	s->material = p_surface.material;
 	s->material = p_surface.material;
 
 
@@ -541,12 +542,12 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) {
 
 
 					Transform3D mtx;
 					Transform3D mtx;
 
 
-					mtx.basis.rows[0].x = dataptr[0];
-					mtx.basis.rows[1].x = dataptr[1];
+					mtx.basis.rows[0][0] = dataptr[0];
+					mtx.basis.rows[0][1] = dataptr[1];
 					mtx.origin.x = dataptr[3];
 					mtx.origin.x = dataptr[3];
 
 
-					mtx.basis.rows[0].y = dataptr[4];
-					mtx.basis.rows[1].y = dataptr[5];
+					mtx.basis.rows[1][0] = dataptr[4];
+					mtx.basis.rows[1][1] = dataptr[5];
 					mtx.origin.y = dataptr[7];
 					mtx.origin.y = dataptr[7];
 
 
 					AABB baabb = mtx.xform(skbones[j]);
 					AABB baabb = mtx.xform(skbones[j]);
@@ -1438,12 +1439,12 @@ void MeshStorage::_multimesh_re_create_aabb(MultiMesh *multimesh, const float *p
 			t.origin.z = data[11];
 			t.origin.z = data[11];
 
 
 		} else {
 		} else {
-			t.basis.rows[0].x = data[0];
-			t.basis.rows[1].x = data[1];
+			t.basis.rows[0][0] = data[0];
+			t.basis.rows[0][1] = data[1];
 			t.origin.x = data[3];
 			t.origin.x = data[3];
 
 
-			t.basis.rows[0].y = data[4];
-			t.basis.rows[1].y = data[5];
+			t.basis.rows[1][0] = data[4];
+			t.basis.rows[1][1] = data[5];
 			t.origin.y = data[7];
 			t.origin.y = data[7];
 		}
 		}
 
 

+ 1 - 1
drivers/vulkan/rendering_device_vulkan.cpp

@@ -2530,7 +2530,7 @@ Error RenderingDeviceVulkan::_texture_update(RID p_texture, uint32_t p_layer, co
 
 
 		for (uint32_t z = 0; z < depth; z++) { // For 3D textures, depth may be > 0.
 		for (uint32_t z = 0; z < depth; z++) { // For 3D textures, depth may be > 0.
 
 
-			const uint8_t *read_ptr = read_ptr_mipmap + image_size * z / depth;
+			const uint8_t *read_ptr = read_ptr_mipmap + (image_size / depth) * z;
 
 
 			for (uint32_t y = 0; y < height; y += region_size) {
 			for (uint32_t y = 0; y < height; y += region_size) {
 				for (uint32_t x = 0; x < width; x += region_size) {
 				for (uint32_t x = 0; x < width; x += region_size) {

+ 28 - 20
editor/debugger/script_editor_debugger.cpp

@@ -509,6 +509,11 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
 		String tooltip = oe.warning ? TTR("Warning:") : TTR("Error:");
 		String tooltip = oe.warning ? TTR("Warning:") : TTR("Error:");
 
 
 		TreeItem *error = error_tree->create_item(r);
 		TreeItem *error = error_tree->create_item(r);
+		if (oe.warning) {
+			error->set_meta("_is_warning", true);
+		} else {
+			error->set_meta("_is_error", true);
+		}
 		error->set_collapsed(true);
 		error->set_collapsed(true);
 
 
 		error->set_icon(0, get_theme_icon(oe.warning ? SNAME("Warning") : SNAME("Error"), SNAME("EditorIcons")));
 		error->set_icon(0, get_theme_icon(oe.warning ? SNAME("Warning") : SNAME("Error"), SNAME("EditorIcons")));
@@ -798,6 +803,8 @@ void ScriptEditorDebugger::_notification(int p_what) {
 			[[fallthrough]];
 			[[fallthrough]];
 		}
 		}
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {
+			tabs->add_theme_style_override("panel", get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles")));
+
 			skip_breakpoints->set_icon(get_theme_icon(skip_breakpoints_value ? SNAME("DebugSkipBreakpointsOn") : SNAME("DebugSkipBreakpointsOff"), SNAME("EditorIcons")));
 			skip_breakpoints->set_icon(get_theme_icon(skip_breakpoints_value ? SNAME("DebugSkipBreakpointsOn") : SNAME("DebugSkipBreakpointsOff"), SNAME("EditorIcons")));
 			copy->set_icon(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")));
 			copy->set_icon(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")));
 			step->set_icon(get_theme_icon(SNAME("DebugStep"), SNAME("EditorIcons")));
 			step->set_icon(get_theme_icon(SNAME("DebugStep"), SNAME("EditorIcons")));
@@ -809,6 +816,24 @@ void ScriptEditorDebugger::_notification(int p_what) {
 			search->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons")));
 			search->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons")));
 
 
 			reason->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor")));
 			reason->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor")));
+
+			TreeItem *error_root = error_tree->get_root();
+			if (error_root) {
+				TreeItem *error = error_root->get_first_child();
+				while (error) {
+					if (error->has_meta("_is_warning")) {
+						error->set_icon(0, get_theme_icon(SNAME("Warning"), SNAME("EditorIcons")));
+						error->set_custom_color(0, get_theme_color(SNAME("warning_color"), SNAME("Editor")));
+						error->set_custom_color(1, get_theme_color(SNAME("warning_color"), SNAME("Editor")));
+					} else if (error->has_meta("_is_error")) {
+						error->set_icon(0, get_theme_icon(SNAME("Error"), SNAME("EditorIcons")));
+						error->set_custom_color(0, get_theme_color(SNAME("error_color"), SNAME("Editor")));
+						error->set_custom_color(1, get_theme_color(SNAME("error_color"), SNAME("Editor")));
+					}
+
+					error = error->get_next();
+				}
+			}
 		} break;
 		} break;
 
 
 		case NOTIFICATION_PROCESS: {
 		case NOTIFICATION_PROCESS: {
@@ -871,21 +896,6 @@ void ScriptEditorDebugger::_notification(int p_what) {
 				break;
 				break;
 			};
 			};
 		} break;
 		} break;
-
-		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-			if (tabs->has_theme_stylebox_override("panel")) {
-				tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles")));
-			}
-
-			copy->set_icon(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")));
-			step->set_icon(get_theme_icon(SNAME("DebugStep"), SNAME("EditorIcons")));
-			next->set_icon(get_theme_icon(SNAME("DebugNext"), SNAME("EditorIcons")));
-			dobreak->set_icon(get_theme_icon(SNAME("Pause"), SNAME("EditorIcons")));
-			docontinue->set_icon(get_theme_icon(SNAME("DebugContinue"), SNAME("EditorIcons")));
-			vmem_refresh->set_icon(get_theme_icon(SNAME("Reload"), SNAME("EditorIcons")));
-			vmem_export->set_icon(get_theme_icon(SNAME("Save"), SNAME("EditorIcons")));
-			search->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons")));
-		} break;
 	}
 	}
 }
 }
 
 
@@ -1557,9 +1567,9 @@ void ScriptEditorDebugger::_item_menu_id_pressed(int p_option) {
 
 
 			String type;
 			String type;
 
 
-			if (ti->get_icon(0) == get_theme_icon(SNAME("Warning"), SNAME("EditorIcons"))) {
+			if (ti->has_meta("_is_warning")) {
 				type = "W ";
 				type = "W ";
-			} else if (ti->get_icon(0) == get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))) {
+			} else if (ti->has_meta("_is_error")) {
 				type = "E ";
 				type = "E ";
 			}
 			}
 
 
@@ -1700,10 +1710,8 @@ void ScriptEditorDebugger::toggle_profiler(const String &p_profiler, bool p_enab
 
 
 ScriptEditorDebugger::ScriptEditorDebugger() {
 ScriptEditorDebugger::ScriptEditorDebugger() {
 	tabs = memnew(TabContainer);
 	tabs = memnew(TabContainer);
-	tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles")));
-	tabs->connect("tab_changed", callable_mp(this, &ScriptEditorDebugger::_tab_changed));
-
 	add_child(tabs);
 	add_child(tabs);
+	tabs->connect("tab_changed", callable_mp(this, &ScriptEditorDebugger::_tab_changed));
 
 
 	InspectorDock::get_inspector_singleton()->connect("object_id_selected", callable_mp(this, &ScriptEditorDebugger::_remote_object_selected));
 	InspectorDock::get_inspector_singleton()->connect("object_id_selected", callable_mp(this, &ScriptEditorDebugger::_remote_object_selected));
 
 

+ 5 - 5
editor/editor_inspector.cpp

@@ -1687,11 +1687,11 @@ void EditorInspectorArray::_panel_gui_input(Ref<InputEvent> p_event, int p_index
 void EditorInspectorArray::_move_element(int p_element_index, int p_to_pos) {
 void EditorInspectorArray::_move_element(int p_element_index, int p_to_pos) {
 	String action_name;
 	String action_name;
 	if (p_element_index < 0) {
 	if (p_element_index < 0) {
-		action_name = vformat("Add element to property array with prefix %s.", array_element_prefix);
+		action_name = vformat(TTR("Add element to property array with prefix %s."), array_element_prefix);
 	} else if (p_to_pos < 0) {
 	} else if (p_to_pos < 0) {
-		action_name = vformat("Remove element %d from property array with prefix %s.", p_element_index, array_element_prefix);
+		action_name = vformat(TTR("Remove element %d from property array with prefix %s."), p_element_index, array_element_prefix);
 	} else {
 	} else {
-		action_name = vformat("Move element %d to position %d in property array with prefix %s.", p_element_index, p_to_pos, array_element_prefix);
+		action_name = vformat(TTR("Move element %d to position %d in property array with prefix %s."), p_element_index, p_to_pos, array_element_prefix);
 	}
 	}
 	EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
 	EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
 	undo_redo->create_action(action_name);
 	undo_redo->create_action(action_name);
@@ -1838,7 +1838,7 @@ void EditorInspectorArray::_move_element(int p_element_index, int p_to_pos) {
 
 
 void EditorInspectorArray::_clear_array() {
 void EditorInspectorArray::_clear_array() {
 	EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
 	EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
-	undo_redo->create_action(vformat("Clear property array with prefix %s.", array_element_prefix));
+	undo_redo->create_action(vformat(TTR("Clear property array with prefix %s."), array_element_prefix));
 	if (mode == MODE_USE_MOVE_ARRAY_ELEMENT_FUNCTION) {
 	if (mode == MODE_USE_MOVE_ARRAY_ELEMENT_FUNCTION) {
 		for (int i = count - 1; i >= 0; i--) {
 		for (int i = count - 1; i >= 0; i--) {
 			// Call the function.
 			// Call the function.
@@ -1891,7 +1891,7 @@ void EditorInspectorArray::_resize_array(int p_size) {
 	}
 	}
 
 
 	EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
 	EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
-	undo_redo->create_action(vformat("Resize property array with prefix %s.", array_element_prefix));
+	undo_redo->create_action(vformat(TTR("Resize property array with prefix %s."), array_element_prefix));
 	if (p_size > count) {
 	if (p_size > count) {
 		if (mode == MODE_USE_MOVE_ARRAY_ELEMENT_FUNCTION) {
 		if (mode == MODE_USE_MOVE_ARRAY_ELEMENT_FUNCTION) {
 			for (int i = count; i < p_size; i++) {
 			for (int i = count; i < p_size; i++) {

+ 8 - 6
editor/editor_node.cpp

@@ -4750,8 +4750,8 @@ void EditorNode::_dock_floating_close_request(Control *p_control) {
 
 
 	p_control->get_parent()->remove_child(p_control);
 	p_control->get_parent()->remove_child(p_control);
 	dock_slot[window_slot]->add_child(p_control);
 	dock_slot[window_slot]->add_child(p_control);
-	dock_slot[window_slot]->move_child(p_control, MIN((int)window->get_meta("dock_index"), dock_slot[window_slot]->get_tab_count()));
-	dock_slot[window_slot]->set_current_tab(window->get_meta("dock_index"));
+	dock_slot[window_slot]->move_child(p_control, MIN((int)window->get_meta("dock_index"), dock_slot[window_slot]->get_tab_count() - 1));
+	dock_slot[window_slot]->set_current_tab(dock_slot[window_slot]->get_tab_idx_from_control(p_control));
 	dock_slot[window_slot]->set_tab_title(dock_slot[window_slot]->get_tab_idx_from_control(p_control), TTRGET(p_control->get_name()));
 	dock_slot[window_slot]->set_tab_title(dock_slot[window_slot]->get_tab_idx_from_control(p_control), TTRGET(p_control->get_name()));
 
 
 	window->queue_free();
 	window->queue_free();
@@ -4772,7 +4772,7 @@ void EditorNode::_dock_make_float() {
 	Size2 dock_size = dock->get_size() + borders * 2;
 	Size2 dock_size = dock->get_size() + borders * 2;
 	Point2 dock_screen_pos = dock->get_global_position() + get_tree()->get_root()->get_position() - borders;
 	Point2 dock_screen_pos = dock->get_global_position() + get_tree()->get_root()->get_position() - borders;
 
 
-	int dock_index = dock->get_index();
+	int dock_index = dock->get_index(false);
 	dock_slot[dock_popup_selected_idx]->remove_child(dock);
 	dock_slot[dock_popup_selected_idx]->remove_child(dock);
 
 
 	Window *window = memnew(Window);
 	Window *window = memnew(Window);
@@ -6494,13 +6494,15 @@ void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) {
 }
 }
 
 
 void EditorNode::_update_renderer_color() {
 void EditorNode::_update_renderer_color() {
-	if (renderer->get_text() == "Forward+") {
+	String rendering_method = renderer->get_selected_metadata();
+
+	if (rendering_method == "forward_plus") {
 		renderer->add_theme_color_override("font_color", Color::hex(0x5d8c3fff));
 		renderer->add_theme_color_override("font_color", Color::hex(0x5d8c3fff));
 	}
 	}
-	if (renderer->get_text() == "Mobile") {
+	if (rendering_method == "mobile") {
 		renderer->add_theme_color_override("font_color", Color::hex(0xa5557dff));
 		renderer->add_theme_color_override("font_color", Color::hex(0xa5557dff));
 	}
 	}
-	if (renderer->get_text() == "Compatibility") {
+	if (rendering_method == "gl_compatibility") {
 		renderer->add_theme_color_override("font_color", Color::hex(0x5586a4ff));
 		renderer->add_theme_color_override("font_color", Color::hex(0x5586a4ff));
 	}
 	}
 }
 }

+ 1 - 1
editor/editor_properties.cpp

@@ -1210,7 +1210,7 @@ void EditorPropertyLayers::_button_pressed() {
 
 
 void EditorPropertyLayers::_menu_pressed(int p_menu) {
 void EditorPropertyLayers::_menu_pressed(int p_menu) {
 	if (p_menu == grid->layer_count) {
 	if (p_menu == grid->layer_count) {
-		ProjectSettingsEditor::get_singleton()->popup_project_settings();
+		ProjectSettingsEditor::get_singleton()->popup_project_settings(true);
 		ProjectSettingsEditor::get_singleton()->set_general_page(basename);
 		ProjectSettingsEditor::get_singleton()->set_general_page(basename);
 	} else {
 	} else {
 		if (grid->value & (1 << p_menu)) {
 		if (grid->value & (1 << p_menu)) {

+ 25 - 1
editor/fbx_importer_manager.cpp

@@ -30,6 +30,8 @@
 
 
 #include "fbx_importer_manager.h"
 #include "fbx_importer_manager.h"
 
 
+#include "core/config/project_settings.h"
+#include "editor/editor_node.h"
 #include "editor/editor_scale.h"
 #include "editor/editor_scale.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_settings.h"
 #include "scene/gui/link_button.h"
 #include "scene/gui/link_button.h"
@@ -47,9 +49,19 @@ void FBXImporterManager::show_dialog(bool p_exclusive) {
 	fbx_path->set_text(fbx2gltf_path);
 	fbx_path->set_text(fbx2gltf_path);
 	_validate_path(fbx2gltf_path);
 	_validate_path(fbx2gltf_path);
 
 
-	set_flag(Window::FLAG_BORDERLESS, p_exclusive); // Avoid closing accidentally .
+	// If exclusive, we're importing a FBX file, there's no exit.
+	is_importing = p_exclusive;
+	set_flag(Window::FLAG_BORDERLESS, p_exclusive); // Avoid closing accidentally.
 	set_close_on_escape(!p_exclusive);
 	set_close_on_escape(!p_exclusive);
 
 
+	if (is_importing) {
+		get_cancel_button()->set_text(TTR("Disable FBX & Restart"));
+		get_cancel_button()->set_tooltip_text(TTR("Canceling this dialog will disable the FBX importer.\nYou can re-enable it in the Project Settings under Filesystem > Import > FBX > Enabled.\n\nThe editor will restart as importers are registered when the editor starts."));
+	} else {
+		get_cancel_button()->set_text(TTR("Cancel"));
+		get_cancel_button()->set_tooltip_text("");
+	}
+
 	popup_centered();
 	popup_centered();
 }
 }
 
 
@@ -96,6 +108,17 @@ void FBXImporterManager::_path_confirmed() {
 	EditorSettings::get_singleton()->save();
 	EditorSettings::get_singleton()->save();
 }
 }
 
 
+void FBXImporterManager::_cancel_setup() {
+	if (!is_importing) {
+		return; // No worry.
+	}
+	// No escape.
+	ProjectSettings::get_singleton()->set("filesystem/import/fbx/enabled", false);
+	ProjectSettings::get_singleton()->save();
+	EditorNode::get_singleton()->save_all_scenes();
+	EditorNode::get_singleton()->restart_editor();
+}
+
 void FBXImporterManager::_browse_install() {
 void FBXImporterManager::_browse_install() {
 	if (fbx_path->get_text() != String()) {
 	if (fbx_path->get_text() != String()) {
 		browse_dialog->set_current_file(fbx_path->get_text());
 		browse_dialog->set_current_file(fbx_path->get_text());
@@ -140,6 +163,7 @@ FBXImporterManager::FBXImporterManager() {
 	fbx_path->connect("text_changed", callable_mp(this, &FBXImporterManager::_validate_path));
 	fbx_path->connect("text_changed", callable_mp(this, &FBXImporterManager::_validate_path));
 
 
 	get_ok_button()->set_text(TTR("Confirm Path"));
 	get_ok_button()->set_text(TTR("Confirm Path"));
+	get_cancel_button()->connect("pressed", callable_mp(this, &FBXImporterManager::_cancel_setup));
 
 
 	browse_dialog = memnew(EditorFileDialog);
 	browse_dialog = memnew(EditorFileDialog);
 	browse_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);
 	browse_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM);

+ 3 - 0
editor/fbx_importer_manager.h

@@ -38,6 +38,8 @@
 class FBXImporterManager : public ConfirmationDialog {
 class FBXImporterManager : public ConfirmationDialog {
 	GDCLASS(FBXImporterManager, ConfirmationDialog)
 	GDCLASS(FBXImporterManager, ConfirmationDialog)
 
 
+	bool is_importing = false;
+
 	Label *message = nullptr;
 	Label *message = nullptr;
 	LineEdit *fbx_path = nullptr;
 	LineEdit *fbx_path = nullptr;
 	Button *fbx_path_browse = nullptr;
 	Button *fbx_path_browse = nullptr;
@@ -47,6 +49,7 @@ class FBXImporterManager : public ConfirmationDialog {
 	void _validate_path(const String &p_path);
 	void _validate_path(const String &p_path);
 	void _select_file(const String &p_path);
 	void _select_file(const String &p_path);
 	void _path_confirmed();
 	void _path_confirmed();
+	void _cancel_setup();
 	void _browse_install();
 	void _browse_install();
 	void _link_clicked();
 	void _link_clicked();
 
 

+ 1 - 1
editor/plugins/asset_library_editor_plugin.cpp

@@ -1398,7 +1398,7 @@ void EditorAssetLibrary::_asset_open() {
 }
 }
 
 
 void EditorAssetLibrary::_manage_plugins() {
 void EditorAssetLibrary::_manage_plugins() {
-	ProjectSettingsEditor::get_singleton()->popup_project_settings();
+	ProjectSettingsEditor::get_singleton()->popup_project_settings(true);
 	ProjectSettingsEditor::get_singleton()->set_plugins_page();
 	ProjectSettingsEditor::get_singleton()->set_plugins_page();
 }
 }
 
 

+ 1 - 0
editor/plugins/canvas_item_editor_plugin.cpp

@@ -4556,6 +4556,7 @@ void CanvasItemEditor::_popup_callback(int p_op) {
 					undo_redo->add_do_method(root, "remove_meta", "_edit_vertical_guides_");
 					undo_redo->add_do_method(root, "remove_meta", "_edit_vertical_guides_");
 					undo_redo->add_undo_method(root, "set_meta", "_edit_vertical_guides_", vguides);
 					undo_redo->add_undo_method(root, "set_meta", "_edit_vertical_guides_", vguides);
 				}
 				}
+				undo_redo->add_do_method(viewport, "queue_redraw");
 				undo_redo->add_undo_method(viewport, "queue_redraw");
 				undo_redo->add_undo_method(viewport, "queue_redraw");
 				undo_redo->commit_action();
 				undo_redo->commit_action();
 			}
 			}

+ 8 - 6
editor/plugins/node_3d_editor_plugin.cpp

@@ -3693,6 +3693,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() {
 		return;
 		return;
 	}
 	}
 
 
+	bool show_gizmo = spatial_editor->is_gizmo_visible() && !_edit.instant;
 	for (int i = 0; i < 3; i++) {
 	for (int i = 0; i < 3; i++) {
 		Transform3D axis_angle;
 		Transform3D axis_angle;
 		if (xform.basis.get_column(i).normalized().dot(xform.basis.get_column((i + 1) % 3).normalized()) < 1.0) {
 		if (xform.basis.get_column(i).normalized().dot(xform.basis.get_column((i + 1) % 3).normalized()) < 1.0) {
@@ -3701,15 +3702,15 @@ void Node3DEditorViewport::update_transform_gizmo_view() {
 		axis_angle.basis.scale(scale);
 		axis_angle.basis.scale(scale);
 		axis_angle.origin = xform.origin;
 		axis_angle.origin = xform.origin;
 		RenderingServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], axis_angle);
 		RenderingServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], axis_angle);
-		RenderingServer::get_singleton()->instance_set_visible(move_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE));
+		RenderingServer::get_singleton()->instance_set_visible(move_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE));
 		RenderingServer::get_singleton()->instance_set_transform(move_plane_gizmo_instance[i], axis_angle);
 		RenderingServer::get_singleton()->instance_set_transform(move_plane_gizmo_instance[i], axis_angle);
-		RenderingServer::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE));
+		RenderingServer::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE));
 		RenderingServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[i], axis_angle);
 		RenderingServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[i], axis_angle);
-		RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE));
+		RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE));
 		RenderingServer::get_singleton()->instance_set_transform(scale_gizmo_instance[i], axis_angle);
 		RenderingServer::get_singleton()->instance_set_transform(scale_gizmo_instance[i], axis_angle);
-		RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE));
+		RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE));
 		RenderingServer::get_singleton()->instance_set_transform(scale_plane_gizmo_instance[i], axis_angle);
 		RenderingServer::get_singleton()->instance_set_transform(scale_plane_gizmo_instance[i], axis_angle);
-		RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE));
+		RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], show_gizmo && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE));
 		RenderingServer::get_singleton()->instance_set_transform(axis_gizmo_instance[i], xform);
 		RenderingServer::get_singleton()->instance_set_transform(axis_gizmo_instance[i], xform);
 	}
 	}
 
 
@@ -4477,6 +4478,7 @@ void Node3DEditorViewport::begin_transform(TransformMode p_mode, bool instant) {
 		_compute_edit(_edit.mouse_pos);
 		_compute_edit(_edit.mouse_pos);
 		_edit.instant = instant;
 		_edit.instant = instant;
 		_edit.snap = spatial_editor->is_snap_enabled();
 		_edit.snap = spatial_editor->is_snap_enabled();
+		update_transform_gizmo_view();
 	}
 	}
 }
 }
 
 
@@ -4858,9 +4860,9 @@ void Node3DEditorViewport::update_transform(Point2 p_mousepos, bool p_shift) {
 
 
 void Node3DEditorViewport::finish_transform() {
 void Node3DEditorViewport::finish_transform() {
 	spatial_editor->set_local_coords_enabled(_edit.original_local);
 	spatial_editor->set_local_coords_enabled(_edit.original_local);
-	spatial_editor->update_transform_gizmo();
 	_edit.mode = TRANSFORM_NONE;
 	_edit.mode = TRANSFORM_NONE;
 	_edit.instant = false;
 	_edit.instant = false;
+	spatial_editor->update_transform_gizmo();
 	surface->queue_redraw();
 	surface->queue_redraw();
 }
 }
 
 

+ 2 - 2
editor/plugins/tiles/tile_data_editors.cpp

@@ -1233,7 +1233,7 @@ TileDataDefaultEditor::TileDataDefaultEditor() {
 	picker_button = memnew(Button);
 	picker_button = memnew(Button);
 	picker_button->set_flat(true);
 	picker_button->set_flat(true);
 	picker_button->set_toggle_mode(true);
 	picker_button->set_toggle_mode(true);
-	picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P));
+	picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", TTR("Picker"), Key::P));
 	toolbar->add_child(picker_button);
 	toolbar->add_child(picker_button);
 }
 }
 
 
@@ -2720,7 +2720,7 @@ TileDataTerrainsEditor::TileDataTerrainsEditor() {
 	picker_button = memnew(Button);
 	picker_button = memnew(Button);
 	picker_button->set_flat(true);
 	picker_button->set_flat(true);
 	picker_button->set_toggle_mode(true);
 	picker_button->set_toggle_mode(true);
-	picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P));
+	picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", TTR("Picker"), Key::P));
 	toolbar->add_child(picker_button);
 	toolbar->add_child(picker_button);
 
 
 	// Setup
 	// Setup

+ 1 - 1
editor/plugins/tiles/tile_set_atlas_source_editor.cpp

@@ -2561,7 +2561,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
 	tools_settings_erase_button = memnew(Button);
 	tools_settings_erase_button = memnew(Button);
 	tools_settings_erase_button->set_flat(true);
 	tools_settings_erase_button->set_flat(true);
 	tools_settings_erase_button->set_toggle_mode(true);
 	tools_settings_erase_button->set_toggle_mode(true);
-	tools_settings_erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E));
+	tools_settings_erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", TTR("Eraser"), Key::E));
 	tools_settings_erase_button->set_shortcut_context(this);
 	tools_settings_erase_button->set_shortcut_context(this);
 	tool_settings->add_child(tools_settings_erase_button);
 	tool_settings->add_child(tools_settings_erase_button);
 
 

+ 5 - 1
editor/project_settings_editor.cpp

@@ -45,7 +45,7 @@ void ProjectSettingsEditor::connect_filesystem_dock_signals(FileSystemDock *p_fs
 	localization_editor->connect_filesystem_dock_signals(p_fs_dock);
 	localization_editor->connect_filesystem_dock_signals(p_fs_dock);
 }
 }
 
 
-void ProjectSettingsEditor::popup_project_settings() {
+void ProjectSettingsEditor::popup_project_settings(bool p_clear_filter) {
 	// Restore valid window bounds or pop up at default size.
 	// Restore valid window bounds or pop up at default size.
 	Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "project_settings", Rect2());
 	Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "project_settings", Rect2());
 	if (saved_size != Rect2()) {
 	if (saved_size != Rect2()) {
@@ -62,6 +62,10 @@ void ProjectSettingsEditor::popup_project_settings() {
 	autoload_settings->update_autoload();
 	autoload_settings->update_autoload();
 	plugin_settings->update_plugins();
 	plugin_settings->update_plugins();
 	import_defaults_editor->clear();
 	import_defaults_editor->clear();
+
+	if (p_clear_filter) {
+		search_box->clear();
+	}
 }
 }
 
 
 void ProjectSettingsEditor::queue_save() {
 void ProjectSettingsEditor::queue_save() {

+ 1 - 1
editor/project_settings_editor.h

@@ -116,7 +116,7 @@ protected:
 
 
 public:
 public:
 	static ProjectSettingsEditor *get_singleton() { return singleton; }
 	static ProjectSettingsEditor *get_singleton() { return singleton; }
-	void popup_project_settings();
+	void popup_project_settings(bool p_clear_filter = false);
 	void set_plugins_page();
 	void set_plugins_page();
 	void set_general_page(const String &p_category);
 	void set_general_page(const String &p_category);
 	void update_plugins();
 	void update_plugins();

+ 3 - 0
editor/renames_map_3_to_4.cpp

@@ -1096,6 +1096,7 @@ const char *RenamesMap3To4::gdscript_properties_renames[][2] = {
 	{ "margin_top", "offset_top" }, // Control -- Breaks NinePatchRect, StyleBox.
 	{ "margin_top", "offset_top" }, // Control -- Breaks NinePatchRect, StyleBox.
 	{ "mid_height", "height" }, // CapsuleMesh
 	{ "mid_height", "height" }, // CapsuleMesh
 	{ "neighbor_dist", "neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
 	{ "neighbor_dist", "neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D
+	{ "octaves", "fractal_octaves" }, // OpenSimplexNoise -> FastNoiseLite
 	{ "offset_h", "drag_horizontal_offset" }, // Camera2D
 	{ "offset_h", "drag_horizontal_offset" }, // Camera2D
 	{ "offset_v", "drag_vertical_offset" }, // Camera2D
 	{ "offset_v", "drag_vertical_offset" }, // Camera2D
 	{ "off_disabled", "unchecked_disabled" }, // Theme
 	{ "off_disabled", "unchecked_disabled" }, // Theme
@@ -1189,6 +1190,7 @@ const char *RenamesMap3To4::csharp_properties_renames[][2] = {
 	{ "MarginTop", "OffsetTop" }, // Control -- Breaks NinePatchRect, StyleBox.
 	{ "MarginTop", "OffsetTop" }, // Control -- Breaks NinePatchRect, StyleBox.
 	{ "MidHeight", "Height" }, // CapsuleMesh
 	{ "MidHeight", "Height" }, // CapsuleMesh
 	{ "NeighborDist", "NeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
 	{ "NeighborDist", "NeighborDistance" }, // NavigationAgent2D, NavigationAgent3D
+	{ "Octaves", "FractalOctaves" }, // OpenSimplexNoise -> FastNoiseLite
 	{ "OffsetH", "DragHorizontalOffset" }, // Camera2D
 	{ "OffsetH", "DragHorizontalOffset" }, // Camera2D
 	{ "OffsetV", "DragVerticalOffset" }, // Camera2D
 	{ "OffsetV", "DragVerticalOffset" }, // Camera2D
 	{ "OffDisabled", "UncheckedDisabled" }, // Theme
 	{ "OffDisabled", "UncheckedDisabled" }, // Theme
@@ -1525,6 +1527,7 @@ const char *RenamesMap3To4::class_renames[][2] = {
 	{ "NetworkedMultiplayerPeer", "MultiplayerPeer" },
 	{ "NetworkedMultiplayerPeer", "MultiplayerPeer" },
 	{ "Occluder", "OccluderInstance3D" },
 	{ "Occluder", "OccluderInstance3D" },
 	{ "OmniLight", "OmniLight3D" },
 	{ "OmniLight", "OmniLight3D" },
+	{ "OpenSimplexNoise", "FastNoiseLite" },
 	{ "PHashTranslation", "OptimizedTranslation" },
 	{ "PHashTranslation", "OptimizedTranslation" },
 	{ "PacketPeerGDNative", "PacketPeerExtension" },
 	{ "PacketPeerGDNative", "PacketPeerExtension" },
 	{ "PanoramaSky", "Sky" },
 	{ "PanoramaSky", "Sky" },

+ 1 - 1
modules/gdscript/gdscript_editor.cpp

@@ -1956,7 +1956,7 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
 				GDScriptParser::CompletionContext c = p_context;
 				GDScriptParser::CompletionContext c = p_context;
 				c.current_line = type_test->operand->start_line;
 				c.current_line = type_test->operand->start_line;
 				c.current_suite = suite;
 				c.current_suite = suite;
-				if ((!id_type.is_set() || id_type.is_variant()) && type_test->test_datatype.is_hard_type()) {
+				if (type_test->test_datatype.is_hard_type()) {
 					id_type = type_test->test_datatype;
 					id_type = type_test->test_datatype;
 					if (last_assign_line < c.current_line) {
 					if (last_assign_line < c.current_line) {
 						// Override last assignment.
 						// Override last assignment.

+ 1 - 1
modules/gdscript/gdscript_parser.cpp

@@ -1521,7 +1521,7 @@ GDScriptParser::SuiteNode *GDScriptParser::parse_suite(const String &p_context,
 	int error_count = 0;
 	int error_count = 0;
 
 
 	do {
 	do {
-		if (!multiline && previous.type == GDScriptTokenizer::Token::SEMICOLON && check(GDScriptTokenizer::Token::NEWLINE)) {
+		if (is_at_end() || (!multiline && previous.type == GDScriptTokenizer::Token::SEMICOLON && check(GDScriptTokenizer::Token::NEWLINE))) {
 			break;
 			break;
 		}
 		}
 		Node *statement = parse_statement();
 		Node *statement = parse_statement();

+ 2 - 2
modules/gltf/register_types.cpp

@@ -143,8 +143,8 @@ void initialize_gltf_module(ModuleInitializationLevel p_level) {
 		EditorPlugins::add_by_type<SceneExporterGLTFPlugin>();
 		EditorPlugins::add_by_type<SceneExporterGLTFPlugin>();
 
 
 		// Project settings defined here so doctool finds them.
 		// Project settings defined here so doctool finds them.
-		GLOBAL_DEF_RST("filesystem/import/blender/enabled", true);
-		GLOBAL_DEF_RST("filesystem/import/fbx/enabled", true);
+		GLOBAL_DEF_RST_BASIC("filesystem/import/blender/enabled", true);
+		GLOBAL_DEF_RST_BASIC("filesystem/import/fbx/enabled", true);
 		GDREGISTER_CLASS(EditorSceneFormatImporterBlend);
 		GDREGISTER_CLASS(EditorSceneFormatImporterBlend);
 		GDREGISTER_CLASS(EditorSceneFormatImporterFBX);
 		GDREGISTER_CLASS(EditorSceneFormatImporterFBX);
 		// Can't (a priori) run external app on these platforms.
 		// Can't (a priori) run external app on these platforms.

+ 1 - 1
platform/ios/godot_view.mm

@@ -39,7 +39,7 @@
 
 
 #import <CoreMotion/CoreMotion.h>
 #import <CoreMotion/CoreMotion.h>
 
 
-static const int max_touches = 8;
+static const int max_touches = 32;
 static const float earth_gravity = 9.80665;
 static const float earth_gravity = 9.80665;
 
 
 @interface GodotView () {
 @interface GodotView () {

+ 5 - 3
platform/linuxbsd/x11/display_server_x11.cpp

@@ -2917,7 +2917,7 @@ BitField<MouseButtonMask> DisplayServerX11::_get_mouse_button_state(MouseButton
 }
 }
 
 
 void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, LocalVector<XEvent> &p_events, uint32_t &p_event_index, bool p_echo) {
 void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, LocalVector<XEvent> &p_events, uint32_t &p_event_index, bool p_echo) {
-	WindowData wd = windows[p_window];
+	WindowData &wd = windows[p_window];
 	// X11 functions don't know what const is
 	// X11 functions don't know what const is
 	XKeyEvent *xkeyevent = p_event;
 	XKeyEvent *xkeyevent = p_event;
 
 
@@ -4850,7 +4850,7 @@ DisplayServer *DisplayServerX11::create_func(const String &p_rendering_driver, W
 					vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
 					vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
 							"If possible, consider updating your video card drivers or using the OpenGL 3 driver.\n\n"
 							"If possible, consider updating your video card drivers or using the OpenGL 3 driver.\n\n"
 							"You can enable the OpenGL 3 driver by starting the engine from the\n"
 							"You can enable the OpenGL 3 driver by starting the engine from the\n"
-							"command line with the command:\n'%s --rendering-driver opengl3'\n\n"
+							"command line with the command:\n\n    \"%s\" --rendering-driver opengl3\n\n"
 							"If you recently updated your video card drivers, try rebooting.",
 							"If you recently updated your video card drivers, try rebooting.",
 							executable_name),
 							executable_name),
 					"Unable to initialize Vulkan video driver");
 					"Unable to initialize Vulkan video driver");
@@ -4873,7 +4873,9 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V
 
 
 #ifdef GLES3_ENABLED
 #ifdef GLES3_ENABLED
 	if (gl_manager) {
 	if (gl_manager) {
-		visualInfo = gl_manager->get_vi(x11_display);
+		Error err;
+		visualInfo = gl_manager->get_vi(x11_display, err);
+		ERR_FAIL_COND_V_MSG(err != OK, INVALID_WINDOW_ID, "Can't acquire visual info from display.");
 		vi_selected = true;
 		vi_selected = true;
 	}
 	}
 #endif
 #endif

+ 19 - 4
platform/linuxbsd/x11/gl_manager_x11.cpp

@@ -83,8 +83,13 @@ int GLManager_X11::_find_or_create_display(Display *p_x11_display) {
 	d.context = memnew(GLManager_X11_Private);
 	d.context = memnew(GLManager_X11_Private);
 	d.context->glx_context = nullptr;
 	d.context->glx_context = nullptr;
 
 
-	//Error err = _create_context(d);
-	_create_context(d);
+	Error err = _create_context(d);
+
+	if (err != OK) {
+		_displays.remove_at(new_display_id);
+		return -1;
+	}
+
 	return new_display_id;
 	return new_display_id;
 }
 }
 
 
@@ -191,8 +196,14 @@ Error GLManager_X11::_create_context(GLDisplay &gl_display) {
 	return OK;
 	return OK;
 }
 }
 
 
-XVisualInfo GLManager_X11::get_vi(Display *p_display) {
-	return _displays[_find_or_create_display(p_display)].x_vi;
+XVisualInfo GLManager_X11::get_vi(Display *p_display, Error &r_error) {
+	int display_id = _find_or_create_display(p_display);
+	if (display_id < 0) {
+		r_error = FAILED;
+		return XVisualInfo();
+	}
+	r_error = OK;
+	return _displays[display_id].x_vi;
 }
 }
 
 
 Error GLManager_X11::window_create(DisplayServer::WindowID p_window_id, ::Window p_window, Display *p_display, int p_width, int p_height) {
 Error GLManager_X11::window_create(DisplayServer::WindowID p_window_id, ::Window p_window, Display *p_display, int p_width, int p_height) {
@@ -211,6 +222,10 @@ Error GLManager_X11::window_create(DisplayServer::WindowID p_window_id, ::Window
 	win.x11_window = p_window;
 	win.x11_window = p_window;
 	win.gldisplay_id = _find_or_create_display(p_display);
 	win.gldisplay_id = _find_or_create_display(p_display);
 
 
+	if (win.gldisplay_id == -1) {
+		return FAILED;
+	}
+
 	// the display could be invalid .. check NYI
 	// the display could be invalid .. check NYI
 	GLDisplay &gl_display = _displays[win.gldisplay_id];
 	GLDisplay &gl_display = _displays[win.gldisplay_id];
 	::Display *x11_display = gl_display.x11_display;
 	::Display *x11_display = gl_display.x11_display;

+ 1 - 1
platform/linuxbsd/x11/gl_manager_x11.h

@@ -114,7 +114,7 @@ private:
 	Error _create_context(GLDisplay &gl_display);
 	Error _create_context(GLDisplay &gl_display);
 
 
 public:
 public:
-	XVisualInfo get_vi(Display *p_display);
+	XVisualInfo get_vi(Display *p_display, Error &r_error);
 	Error window_create(DisplayServer::WindowID p_window_id, ::Window p_window, Display *p_display, int p_width, int p_height);
 	Error window_create(DisplayServer::WindowID p_window_id, ::Window p_window, Display *p_display, int p_width, int p_height);
 	void window_destroy(DisplayServer::WindowID p_window_id);
 	void window_destroy(DisplayServer::WindowID p_window_id);
 	void window_resize(DisplayServer::WindowID p_window_id, int p_width, int p_height);
 	void window_resize(DisplayServer::WindowID p_window_id, int p_width, int p_height);

+ 34 - 10
platform/linuxbsd/x11/key_mapping_x11.cpp

@@ -85,8 +85,8 @@ void KeyMappingX11::initialize() {
 	xkeysym_map[XK_Begin] = Key::CLEAR;
 	xkeysym_map[XK_Begin] = Key::CLEAR;
 	xkeysym_map[XK_Insert] = Key::INSERT;
 	xkeysym_map[XK_Insert] = Key::INSERT;
 	xkeysym_map[XK_Delete] = Key::KEY_DELETE;
 	xkeysym_map[XK_Delete] = Key::KEY_DELETE;
-	//xkeysym_map[XK_KP_Equal]
-	//xkeysym_map[XK_KP_Separator]
+	xkeysym_map[XK_KP_Equal] = Key::EQUAL;
+	xkeysym_map[XK_KP_Separator] = Key::COMMA;
 	xkeysym_map[XK_KP_Decimal] = Key::KP_PERIOD;
 	xkeysym_map[XK_KP_Decimal] = Key::KP_PERIOD;
 	xkeysym_map[XK_KP_Delete] = Key::KP_PERIOD;
 	xkeysym_map[XK_KP_Delete] = Key::KP_PERIOD;
 	xkeysym_map[XK_KP_Multiply] = Key::KP_MULTIPLY;
 	xkeysym_map[XK_KP_Multiply] = Key::KP_MULTIPLY;
@@ -220,7 +220,7 @@ void KeyMappingX11::initialize() {
 	scancode_map[0x22] = Key::BRACKETLEFT;
 	scancode_map[0x22] = Key::BRACKETLEFT;
 	scancode_map[0x23] = Key::BRACKETRIGHT;
 	scancode_map[0x23] = Key::BRACKETRIGHT;
 	scancode_map[0x24] = Key::ENTER;
 	scancode_map[0x24] = Key::ENTER;
-	scancode_map[0x25] = Key::CTRL;
+	scancode_map[0x25] = Key::CTRL; // Left
 	scancode_map[0x26] = Key::A;
 	scancode_map[0x26] = Key::A;
 	scancode_map[0x27] = Key::S;
 	scancode_map[0x27] = Key::S;
 	scancode_map[0x28] = Key::D;
 	scancode_map[0x28] = Key::D;
@@ -233,7 +233,7 @@ void KeyMappingX11::initialize() {
 	scancode_map[0x2F] = Key::SEMICOLON;
 	scancode_map[0x2F] = Key::SEMICOLON;
 	scancode_map[0x30] = Key::APOSTROPHE;
 	scancode_map[0x30] = Key::APOSTROPHE;
 	scancode_map[0x31] = Key::QUOTELEFT;
 	scancode_map[0x31] = Key::QUOTELEFT;
-	scancode_map[0x32] = Key::SHIFT;
+	scancode_map[0x32] = Key::SHIFT; // Left
 	scancode_map[0x33] = Key::BACKSLASH;
 	scancode_map[0x33] = Key::BACKSLASH;
 	scancode_map[0x34] = Key::Z;
 	scancode_map[0x34] = Key::Z;
 	scancode_map[0x35] = Key::X;
 	scancode_map[0x35] = Key::X;
@@ -245,9 +245,9 @@ void KeyMappingX11::initialize() {
 	scancode_map[0x3B] = Key::COMMA;
 	scancode_map[0x3B] = Key::COMMA;
 	scancode_map[0x3C] = Key::PERIOD;
 	scancode_map[0x3C] = Key::PERIOD;
 	scancode_map[0x3D] = Key::SLASH;
 	scancode_map[0x3D] = Key::SLASH;
-	scancode_map[0x3E] = Key::SHIFT;
+	scancode_map[0x3E] = Key::SHIFT; // Right
 	scancode_map[0x3F] = Key::KP_MULTIPLY;
 	scancode_map[0x3F] = Key::KP_MULTIPLY;
-	scancode_map[0x40] = Key::ALT;
+	scancode_map[0x40] = Key::ALT; // Left
 	scancode_map[0x41] = Key::SPACE;
 	scancode_map[0x41] = Key::SPACE;
 	scancode_map[0x42] = Key::CAPSLOCK;
 	scancode_map[0x42] = Key::CAPSLOCK;
 	scancode_map[0x43] = Key::F1;
 	scancode_map[0x43] = Key::F1;
@@ -275,14 +275,23 @@ void KeyMappingX11::initialize() {
 	scancode_map[0x59] = Key::KP_3;
 	scancode_map[0x59] = Key::KP_3;
 	scancode_map[0x5A] = Key::KP_0;
 	scancode_map[0x5A] = Key::KP_0;
 	scancode_map[0x5B] = Key::KP_PERIOD;
 	scancode_map[0x5B] = Key::KP_PERIOD;
+	//scancode_map[0x5C]
+	//scancode_map[0x5D] // Zenkaku Hankaku
 	scancode_map[0x5E] = Key::SECTION;
 	scancode_map[0x5E] = Key::SECTION;
 	scancode_map[0x5F] = Key::F11;
 	scancode_map[0x5F] = Key::F11;
 	scancode_map[0x60] = Key::F12;
 	scancode_map[0x60] = Key::F12;
+	//scancode_map[0x61] // Romaji
+	//scancode_map[0x62] // Katakana
+	//scancode_map[0x63] // Hiragana
+	//scancode_map[0x64] // Henkan
+	//scancode_map[0x65] // Hiragana Katakana
+	//scancode_map[0x66] // Muhenkan
+	scancode_map[0x67] = Key::COMMA; // KP_Separator
 	scancode_map[0x68] = Key::KP_ENTER;
 	scancode_map[0x68] = Key::KP_ENTER;
-	scancode_map[0x69] = Key::CTRL;
+	scancode_map[0x69] = Key::CTRL; // Right
 	scancode_map[0x6A] = Key::KP_DIVIDE;
 	scancode_map[0x6A] = Key::KP_DIVIDE;
 	scancode_map[0x6B] = Key::PRINT;
 	scancode_map[0x6B] = Key::PRINT;
-	scancode_map[0x6C] = Key::ALT;
+	scancode_map[0x6C] = Key::ALT; // Right
 	scancode_map[0x6D] = Key::ENTER;
 	scancode_map[0x6D] = Key::ENTER;
 	scancode_map[0x6E] = Key::HOME;
 	scancode_map[0x6E] = Key::HOME;
 	scancode_map[0x6F] = Key::UP;
 	scancode_map[0x6F] = Key::UP;
@@ -294,13 +303,28 @@ void KeyMappingX11::initialize() {
 	scancode_map[0x75] = Key::PAGEDOWN;
 	scancode_map[0x75] = Key::PAGEDOWN;
 	scancode_map[0x76] = Key::INSERT;
 	scancode_map[0x76] = Key::INSERT;
 	scancode_map[0x77] = Key::KEY_DELETE;
 	scancode_map[0x77] = Key::KEY_DELETE;
+	//scancode_map[0x78] // Macro
 	scancode_map[0x79] = Key::VOLUMEMUTE;
 	scancode_map[0x79] = Key::VOLUMEMUTE;
 	scancode_map[0x7A] = Key::VOLUMEDOWN;
 	scancode_map[0x7A] = Key::VOLUMEDOWN;
 	scancode_map[0x7B] = Key::VOLUMEUP;
 	scancode_map[0x7B] = Key::VOLUMEUP;
+	//scancode_map[0x7C] // Power
+	scancode_map[0x7D] = Key::EQUAL; // KP_Equal
+	//scancode_map[0x7E] // KP_PlusMinus
 	scancode_map[0x7F] = Key::PAUSE;
 	scancode_map[0x7F] = Key::PAUSE;
-	scancode_map[0x85] = Key::META;
-	scancode_map[0x86] = Key::META;
+	scancode_map[0x80] = Key::LAUNCH0;
+	scancode_map[0x81] = Key::COMMA; // KP_Comma
+	//scancode_map[0x82] // Hangul
+	//scancode_map[0x83] // Hangul_Hanja
+	scancode_map[0x84] = Key::YEN;
+	scancode_map[0x85] = Key::META; // Left
+	scancode_map[0x86] = Key::META; // Right
 	scancode_map[0x87] = Key::MENU;
 	scancode_map[0x87] = Key::MENU;
+
+	scancode_map[0xA6] = Key::BACK; // On Chromebooks
+	scancode_map[0xA7] = Key::FORWARD; // On Chromebooks
+
+	scancode_map[0xB5] = Key::REFRESH; // On Chromebooks
+
 	scancode_map[0xBF] = Key::F13;
 	scancode_map[0xBF] = Key::F13;
 	scancode_map[0xC0] = Key::F14;
 	scancode_map[0xC0] = Key::F14;
 	scancode_map[0xC1] = Key::F15;
 	scancode_map[0xC1] = Key::F15;

+ 3 - 3
platform/macos/display_server_macos.mm

@@ -3617,15 +3617,15 @@ DisplayServer *DisplayServerMacOS::create_func(const String &p_rendering_driver,
 		if (p_rendering_driver == "vulkan") {
 		if (p_rendering_driver == "vulkan") {
 			String executable_command;
 			String executable_command;
 			if (OS::get_singleton()->get_bundle_resource_dir() == OS::get_singleton()->get_executable_path().get_base_dir()) {
 			if (OS::get_singleton()->get_bundle_resource_dir() == OS::get_singleton()->get_executable_path().get_base_dir()) {
-				executable_command = vformat("%s --rendering-driver opengl3", OS::get_singleton()->get_executable_path());
+				executable_command = vformat("\"%s\" --rendering-driver opengl3", OS::get_singleton()->get_executable_path());
 			} else {
 			} else {
-				executable_command = vformat("open %s --args --rendering-driver opengl3", OS::get_singleton()->get_bundle_resource_dir().path_join("../..").simplify_path());
+				executable_command = vformat("open \"%s\" --args --rendering-driver opengl3", OS::get_singleton()->get_bundle_resource_dir().path_join("../..").simplify_path());
 			}
 			}
 			OS::get_singleton()->alert(
 			OS::get_singleton()->alert(
 					vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
 					vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
 							"If possible, consider updating your macOS version or using the OpenGL 3 driver.\n\n"
 							"If possible, consider updating your macOS version or using the OpenGL 3 driver.\n\n"
 							"You can enable the OpenGL 3 driver by starting the engine from the\n"
 							"You can enable the OpenGL 3 driver by starting the engine from the\n"
-							"command line with the command:\n'%s'",
+							"command line with the command:\n\n    %s",
 							executable_command),
 							executable_command),
 					"Unable to initialize Vulkan video driver");
 					"Unable to initialize Vulkan video driver");
 		} else {
 		} else {

+ 1 - 1
platform/windows/display_server_windows.cpp

@@ -4312,7 +4312,7 @@ DisplayServer *DisplayServerWindows::create_func(const String &p_rendering_drive
 					vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
 					vformat("Your video card drivers seem not to support the required Vulkan version.\n\n"
 							"If possible, consider updating your video card drivers or using the OpenGL 3 driver.\n\n"
 							"If possible, consider updating your video card drivers or using the OpenGL 3 driver.\n\n"
 							"You can enable the OpenGL 3 driver by starting the engine from the\n"
 							"You can enable the OpenGL 3 driver by starting the engine from the\n"
-							"command line with the command:\n'%s --rendering-driver opengl3'\n\n"
+							"command line with the command:\n\n    \"%s\" --rendering-driver opengl3\n\n"
 							"If you have recently updated your video card drivers, try rebooting.",
 							"If you have recently updated your video card drivers, try rebooting.",
 							executable_name),
 							executable_name),
 					"Unable to initialize Vulkan video driver");
 					"Unable to initialize Vulkan video driver");

+ 1 - 1
platform/windows/key_mapping_windows.cpp

@@ -315,7 +315,7 @@ void KeyMappingWindows::initialize() {
 	scansym_map[0x51] = Key::KP_3;
 	scansym_map[0x51] = Key::KP_3;
 	scansym_map[0x52] = Key::KP_0;
 	scansym_map[0x52] = Key::KP_0;
 	scansym_map[0x53] = Key::KP_PERIOD;
 	scansym_map[0x53] = Key::KP_PERIOD;
-	scansym_map[0x57] = Key::SECTION;
+	scansym_map[0x56] = Key::SECTION;
 	scansym_map[0x57] = Key::F11;
 	scansym_map[0x57] = Key::F11;
 	scansym_map[0x58] = Key::F12;
 	scansym_map[0x58] = Key::F12;
 	scansym_map[0x5B] = Key::META;
 	scansym_map[0x5B] = Key::META;

+ 1 - 1
scene/3d/cpu_particles_3d.cpp

@@ -1207,7 +1207,7 @@ void CPUParticles3D::_update_particle_data_buffer() {
 			ptr[10] = t.basis.rows[2][2];
 			ptr[10] = t.basis.rows[2][2];
 			ptr[11] = t.origin.z;
 			ptr[11] = t.origin.z;
 		} else {
 		} else {
-			memset(ptr, 0, sizeof(Transform3D));
+			memset(ptr, 0, sizeof(float) * 12);
 		}
 		}
 
 
 		Color c = r[idx].color;
 		Color c = r[idx].color;

+ 3 - 1
scene/3d/mesh_instance_3d.cpp

@@ -117,8 +117,10 @@ void MeshInstance3D::set_mesh(const Ref<Mesh> &p_mesh) {
 	mesh = p_mesh;
 	mesh = p_mesh;
 
 
 	if (mesh.is_valid()) {
 	if (mesh.is_valid()) {
-		mesh->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &MeshInstance3D::_mesh_changed));
+		// If mesh is a PrimitiveMesh, calling get_rid on it can trigger a changed callback
+		// so do this before connecting _mesh_changed.
 		set_base(mesh->get_rid());
 		set_base(mesh->get_rid());
+		mesh->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &MeshInstance3D::_mesh_changed));
 		_mesh_changed();
 		_mesh_changed();
 	} else {
 	} else {
 		blend_shape_tracks.clear();
 		blend_shape_tracks.clear();

+ 3 - 2
scene/gui/link_button.cpp

@@ -243,11 +243,12 @@ void LinkButton::_notification(int p_what) {
 			if (do_underline) {
 			if (do_underline) {
 				int underline_spacing = theme_cache.underline_spacing + text_buf->get_line_underline_position();
 				int underline_spacing = theme_cache.underline_spacing + text_buf->get_line_underline_position();
 				int y = text_buf->get_line_ascent() + underline_spacing;
 				int y = text_buf->get_line_ascent() + underline_spacing;
+				int underline_thickness = MAX(1, text_buf->get_line_underline_thickness());
 
 
 				if (is_layout_rtl()) {
 				if (is_layout_rtl()) {
-					draw_line(Vector2(size.width - width, y), Vector2(size.width, y), color, text_buf->get_line_underline_thickness());
+					draw_line(Vector2(size.width - width, y), Vector2(size.width, y), color, underline_thickness);
 				} else {
 				} else {
-					draw_line(Vector2(0, y), Vector2(width, y), color, text_buf->get_line_underline_thickness());
+					draw_line(Vector2(0, y), Vector2(width, y), color, underline_thickness);
 				}
 				}
 			}
 			}
 		} break;
 		} break;

+ 1 - 1
scene/gui/menu_bar.cpp

@@ -666,7 +666,7 @@ void MenuBar::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_menu_popup", "menu"), &MenuBar::get_menu_popup);
 	ClassDB::bind_method(D_METHOD("get_menu_popup", "menu"), &MenuBar::get_menu_popup);
 
 
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flat"), "set_flat", "is_flat");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flat"), "set_flat", "is_flat");
-	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "start_index"), "set_start_index", "get_start_index");
+	ADD_PROPERTY(PropertyInfo(Variant::INT, "start_index"), "set_start_index", "get_start_index");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "switch_on_hover"), "set_switch_on_hover", "is_switch_on_hover");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "switch_on_hover"), "set_switch_on_hover", "is_switch_on_hover");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "prefer_global_menu"), "set_prefer_global_menu", "is_prefer_global_menu");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "prefer_global_menu"), "set_prefer_global_menu", "is_prefer_global_menu");
 
 

+ 2 - 2
scene/resources/sky_material.cpp

@@ -269,7 +269,7 @@ uniform vec4 sky_top_color : source_color = vec4(0.385, 0.454, 0.55, 1.0);
 uniform vec4 sky_horizon_color : source_color = vec4(0.646, 0.656, 0.67, 1.0);
 uniform vec4 sky_horizon_color : source_color = vec4(0.646, 0.656, 0.67, 1.0);
 uniform float sky_curve : hint_range(0, 1) = 0.15;
 uniform float sky_curve : hint_range(0, 1) = 0.15;
 uniform float sky_energy = 1.0; // In Lux.
 uniform float sky_energy = 1.0; // In Lux.
-uniform sampler2D sky_cover : source_color, hint_default_black;
+uniform sampler2D sky_cover : filter_linear, source_color, hint_default_black;
 uniform vec4 sky_cover_modulate : source_color = vec4(1.0, 1.0, 1.0, 1.0);
 uniform vec4 sky_cover_modulate : source_color = vec4(1.0, 1.0, 1.0, 1.0);
 uniform vec4 ground_bottom_color : source_color = vec4(0.2, 0.169, 0.133, 1.0);
 uniform vec4 ground_bottom_color : source_color = vec4(0.2, 0.169, 0.133, 1.0);
 uniform vec4 ground_horizon_color : source_color = vec4(0.646, 0.656, 0.67, 1.0);
 uniform vec4 ground_horizon_color : source_color = vec4(0.646, 0.656, 0.67, 1.0);
@@ -676,7 +676,7 @@ uniform float sun_disk_scale : hint_range(0, 360) = 1.0;
 uniform vec4 ground_color : source_color = vec4(0.1, 0.07, 0.034, 1.0);
 uniform vec4 ground_color : source_color = vec4(0.1, 0.07, 0.034, 1.0);
 uniform float exposure : hint_range(0, 128) = 1.0;
 uniform float exposure : hint_range(0, 128) = 1.0;
 
 
-uniform sampler2D night_sky : source_color, hint_default_black;
+uniform sampler2D night_sky : filter_linear, source_color, hint_default_black;
 
 
 const vec3 UP = vec3( 0.0, 1.0, 0.0 );
 const vec3 UP = vec3( 0.0, 1.0, 0.0 );
 
 

+ 2 - 2
servers/register_server_types.cpp

@@ -158,8 +158,8 @@ void register_server_types() {
 	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionRayResult, "Vector3 position;Vector3 normal;RID rid;ObjectID collider_id;Object *collider;int shape");
 	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionRayResult, "Vector3 position;Vector3 normal;RID rid;ObjectID collider_id;Object *collider;int shape");
 	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionShapeResult, "RID rid;ObjectID collider_id;Object *collider;int shape");
 	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionShapeResult, "RID rid;ObjectID collider_id;Object *collider;int shape");
 	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionShapeRestInfo, "Vector3 point;Vector3 normal;RID rid;ObjectID collider_id;int shape;Vector3 linear_velocity");
 	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionShapeRestInfo, "Vector3 point;Vector3 normal;RID rid;ObjectID collider_id;int shape;Vector3 linear_velocity");
-	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionCollision, "Vector3 position;Vector3 normal;Vector3 collider_velocity;real_t depth;int local_shape;ObjectID collider_id;RID collider;int collider_shape");
-	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionResult, "Vector3 travel;Vector3 remainder;real_t collision_safe_fraction;real_t collision_unsafe_fraction;PhysicsServer3DExtensionMotionCollision collisions[32];int collision_count");
+	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionCollision, "Vector3 position;Vector3 normal;Vector3 collider_velocity;Vector3 collider_angular_velocity;real_t depth;int local_shape;ObjectID collider_id;RID collider;int collider_shape");
+	GDREGISTER_NATIVE_STRUCT(PhysicsServer3DExtensionMotionResult, "Vector3 travel;Vector3 remainder;real_t collision_depth;real_t collision_safe_fraction;real_t collision_unsafe_fraction;PhysicsServer3DExtensionMotionCollision collisions[32];int collision_count");
 
 
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer2D);
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer2D);
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer3D);
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer3D);

+ 1 - 0
servers/rendering/renderer_canvas_render.h

@@ -321,6 +321,7 @@ public:
 		};
 		};
 
 
 		CanvasGroup *canvas_group = nullptr;
 		CanvasGroup *canvas_group = nullptr;
+		bool use_canvas_group = false;
 		int light_mask;
 		int light_mask;
 		int z_final;
 		int z_final;
 
 

+ 18 - 10
servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp

@@ -1110,11 +1110,9 @@ void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_co
 
 
 		RID material = ci->material_owner == nullptr ? ci->material : ci->material_owner->material;
 		RID material = ci->material_owner == nullptr ? ci->material : ci->material_owner->material;
 
 
-		if (ci->canvas_group != nullptr) {
+		if (ci->use_canvas_group) {
 			if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
 			if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
-				if (!p_to_backbuffer) {
-					material = default_clip_children_material;
-				}
+				material = default_clip_children_material;
 			} else {
 			} else {
 				if (material.is_null()) {
 				if (material.is_null()) {
 					if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_ONLY) {
 					if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_ONLY) {
@@ -1381,6 +1379,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
 	bool backbuffer_gen_mipmaps = false;
 	bool backbuffer_gen_mipmaps = false;
 
 
 	Item *canvas_group_owner = nullptr;
 	Item *canvas_group_owner = nullptr;
+	bool skip_item = false;
 
 
 	bool update_skeletons = false;
 	bool update_skeletons = false;
 	bool time_used = false;
 	bool time_used = false;
@@ -1453,6 +1452,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
 					Rect2i group_rect = ci->canvas_group_owner->global_rect_cache;
 					Rect2i group_rect = ci->canvas_group_owner->global_rect_cache;
 					texture_storage->render_target_copy_to_back_buffer(p_to_render_target, group_rect, false);
 					texture_storage->render_target_copy_to_back_buffer(p_to_render_target, group_rect, false);
 					if (ci->canvas_group_owner->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
 					if (ci->canvas_group_owner->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
+						ci->canvas_group_owner->use_canvas_group = false;
 						items[item_count++] = ci->canvas_group_owner;
 						items[item_count++] = ci->canvas_group_owner;
 					}
 					}
 				} else if (!backbuffer_cleared) {
 				} else if (!backbuffer_cleared) {
@@ -1467,9 +1467,8 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
 			ci->canvas_group_owner = nullptr; //must be cleared
 			ci->canvas_group_owner = nullptr; //must be cleared
 		}
 		}
 
 
-		if (!backbuffer_cleared && canvas_group_owner == nullptr && ci->canvas_group != nullptr && !backbuffer_copy) {
-			texture_storage->render_target_clear_back_buffer(p_to_render_target, Rect2i(), Color(0, 0, 0, 0));
-			backbuffer_cleared = true;
+		if (canvas_group_owner == nullptr && ci->canvas_group != nullptr && ci->canvas_group->mode != RS::CANVAS_GROUP_MODE_CLIP_AND_DRAW) {
+			skip_item = true;
 		}
 		}
 
 
 		if (ci == canvas_group_owner) {
 		if (ci == canvas_group_owner) {
@@ -1488,6 +1487,11 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
 			canvas_group_owner = nullptr;
 			canvas_group_owner = nullptr;
 			// Backbuffer is dirty now and needs to be re-cleared if another CanvasGroup needs it.
 			// Backbuffer is dirty now and needs to be re-cleared if another CanvasGroup needs it.
 			backbuffer_cleared = false;
 			backbuffer_cleared = false;
+
+			// Tell the renderer to paint this as a canvas group
+			ci->use_canvas_group = true;
+		} else {
+			ci->use_canvas_group = false;
 		}
 		}
 
 
 		if (backbuffer_copy) {
 		if (backbuffer_copy) {
@@ -1503,9 +1507,9 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
 			texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
 			texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
 
 
 			backbuffer_copy = false;
 			backbuffer_copy = false;
-			backbuffer_gen_mipmaps = false;
 			material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies.
 			material_screen_texture_cached = true; // After a backbuffer copy, screen texture makes no further copies.
 			material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps;
 			material_screen_texture_mipmaps_cached = backbuffer_gen_mipmaps;
+			backbuffer_gen_mipmaps = false;
 		}
 		}
 
 
 		if (backbuffer_gen_mipmaps) {
 		if (backbuffer_gen_mipmaps) {
@@ -1515,7 +1519,11 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
 			material_screen_texture_mipmaps_cached = true;
 			material_screen_texture_mipmaps_cached = true;
 		}
 		}
 
 
-		items[item_count++] = ci;
+		if (skip_item) {
+			skip_item = false;
+		} else {
+			items[item_count++] = ci;
+		}
 
 
 		if (!ci->next || item_count == MAX_RENDER_ITEMS - 1) {
 		if (!ci->next || item_count == MAX_RENDER_ITEMS - 1) {
 			if (update_skeletons) {
 			if (update_skeletons) {
@@ -1523,7 +1531,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
 				update_skeletons = false;
 				update_skeletons = false;
 			}
 			}
 
 
-			_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false);
+			_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, canvas_group_owner != nullptr);
 			//then reset
 			//then reset
 			item_count = 0;
 			item_count = 0;
 		}
 		}

+ 9 - 8
servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp

@@ -438,6 +438,7 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
 	} else {
 	} else {
 		mesh->aabb.merge_with(p_surface.aabb);
 		mesh->aabb.merge_with(p_surface.aabb);
 	}
 	}
+	mesh->skeleton_aabb_version = 0;
 
 
 	s->material = p_surface.material;
 	s->material = p_surface.material;
 
 
@@ -634,12 +635,12 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) {
 
 
 					Transform3D mtx;
 					Transform3D mtx;
 
 
-					mtx.basis.rows[0].x = dataptr[0];
-					mtx.basis.rows[1].x = dataptr[1];
+					mtx.basis.rows[0][0] = dataptr[0];
+					mtx.basis.rows[0][1] = dataptr[1];
 					mtx.origin.x = dataptr[3];
 					mtx.origin.x = dataptr[3];
 
 
-					mtx.basis.rows[0].y = dataptr[4];
-					mtx.basis.rows[1].y = dataptr[5];
+					mtx.basis.rows[1][0] = dataptr[4];
+					mtx.basis.rows[1][1] = dataptr[5];
 					mtx.origin.y = dataptr[7];
 					mtx.origin.y = dataptr[7];
 
 
 					AABB baabb = mtx.xform(skbones[j]);
 					AABB baabb = mtx.xform(skbones[j]);
@@ -1501,12 +1502,12 @@ void MeshStorage::_multimesh_re_create_aabb(MultiMesh *multimesh, const float *p
 			t.origin.z = data[11];
 			t.origin.z = data[11];
 
 
 		} else {
 		} else {
-			t.basis.rows[0].x = data[0];
-			t.basis.rows[1].x = data[1];
+			t.basis.rows[0][0] = data[0];
+			t.basis.rows[0][1] = data[1];
 			t.origin.x = data[3];
 			t.origin.x = data[3];
 
 
-			t.basis.rows[0].y = data[4];
-			t.basis.rows[1].y = data[5];
+			t.basis.rows[1][0] = data[4];
+			t.basis.rows[1][1] = data[5];
 			t.origin.y = data[7];
 			t.origin.y = data[7];
 		}
 		}
 
 

+ 1 - 0
servers/rendering/renderer_scene_cull.cpp

@@ -653,6 +653,7 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) {
 				geom->geometry_instance->set_use_baked_light(instance->baked_light);
 				geom->geometry_instance->set_use_baked_light(instance->baked_light);
 				geom->geometry_instance->set_use_dynamic_gi(instance->dynamic_gi);
 				geom->geometry_instance->set_use_dynamic_gi(instance->dynamic_gi);
 				geom->geometry_instance->set_use_lightmap(RID(), instance->lightmap_uv_scale, instance->lightmap_slice_index);
 				geom->geometry_instance->set_use_lightmap(RID(), instance->lightmap_uv_scale, instance->lightmap_slice_index);
+				geom->geometry_instance->set_instance_shader_uniforms_offset(instance->instance_allocated_shader_uniforms_offset);
 				geom->geometry_instance->set_cast_double_sided_shadows(instance->cast_shadows == RS::SHADOW_CASTING_SETTING_DOUBLE_SIDED);
 				geom->geometry_instance->set_cast_double_sided_shadows(instance->cast_shadows == RS::SHADOW_CASTING_SETTING_DOUBLE_SIDED);
 				if (instance->lightmap_sh.size() == 9) {
 				if (instance->lightmap_sh.size() == 9) {
 					geom->geometry_instance->set_lightmap_capture(instance->lightmap_sh.ptr());
 					geom->geometry_instance->set_lightmap_capture(instance->lightmap_sh.ptr());

+ 26 - 0
thirdparty/vulkan/patches/VMA-fix-gcc13.patch

@@ -0,0 +1,26 @@
+From 29d492b60c84ca784ea0943efc7d2e6e0f3bdaac Mon Sep 17 00:00:00 2001
+From: Adam Sawicki <[email protected]>
+Date: Thu, 19 Jan 2023 13:19:55 +0100
+Subject: [PATCH] Added missing #include <cstdio>
+
+For snprintf, for compatibility with GCC 13.
+Fixes #312 - thanks @marxin !
+---
+ thirdparty/vulkan/vk_mem_alloc.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/thirdparty/vulkan/vk_mem_alloc.h b/thirdparty/vulkan/vk_mem_alloc.h
+index b787c36..0fe459b 100644
+--- a/thirdparty/vulkan/vk_mem_alloc.h
++++ b/thirdparty/vulkan/vk_mem_alloc.h
+@@ -2614,6 +2614,10 @@ VMA_CALL_PRE void VMA_CALL_POST vmaFreeStatsString(
+     #include <bit> // For std::popcount
+ #endif
+ 
++#if VMA_STATS_STRING_ENABLED
++    #include <cstdio> // For snprintf
++#endif
++
+ /*******************************************************************************
+ CONFIGURATION SECTION
+ 

+ 4 - 0
thirdparty/vulkan/vk_mem_alloc.h

@@ -2582,6 +2582,10 @@ VMA_CALL_PRE void VMA_CALL_POST vmaFreeStatsString(
     #include <bit> // For std::popcount
     #include <bit> // For std::popcount
 #endif
 #endif
 
 
+#if VMA_STATS_STRING_ENABLED
+    #include <cstdio> // For snprintf
+#endif
+
 /*******************************************************************************
 /*******************************************************************************
 CONFIGURATION SECTION
 CONFIGURATION SECTION