diff options
| -rw-r--r-- | core/math/vector3.cpp | 2 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_canvas_gles3.cpp | 2 | ||||
| -rw-r--r-- | drivers/gles3/storage/material_storage.cpp | 1 | ||||
| -rw-r--r-- | editor/editor_help.cpp | 4 | ||||
| -rw-r--r-- | editor/plugins/script_editor_plugin.cpp | 82 | ||||
| -rw-r--r-- | editor/plugins/script_editor_plugin.h | 18 | ||||
| -rw-r--r-- | editor/plugins/text_editor.cpp | 71 | ||||
| -rw-r--r-- | editor/plugins/text_editor.h | 2 | ||||
| -rw-r--r-- | modules/navigation/godot_navigation_server.cpp | 2 | ||||
| -rw-r--r-- | scene/2d/tile_map.cpp | 7 | ||||
| -rw-r--r-- | scene/2d/tile_map.h | 1 | ||||
| -rw-r--r-- | scene/gui/popup.cpp | 11 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/storage_rd/material_storage.cpp | 1 | 
13 files changed, 173 insertions, 31 deletions
diff --git a/core/math/vector3.cpp b/core/math/vector3.cpp index d732f1e8b2..ae009fc4ef 100644 --- a/core/math/vector3.cpp +++ b/core/math/vector3.cpp @@ -108,7 +108,9 @@ Vector3 Vector3::octahedron_decode(const Vector2 &p_oct) {  }  Vector2 Vector3::octahedron_tangent_encode(const float sign) const { +	const float bias = 1.0f / 32767.0f;  	Vector2 res = this->octahedron_encode(); +	res.y = MAX(res.y, bias);  	res.y = res.y * 0.5f + 0.5f;  	res.y = sign >= 0.0f ? res.y : 1 - res.y;  	return res; diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 3c5441f3c4..2a524e8c3a 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -566,6 +566,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou  	uint32_t index = 0;  	Item *current_clip = nullptr; +	GLES3::CanvasShaderData *shader_data_cache = nullptr;  	// Record Batches.  	// First item always forms its own batch. @@ -602,7 +603,6 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou  			}  		} -		GLES3::CanvasShaderData *shader_data_cache = nullptr;  		if (material != state.canvas_instance_batches[state.current_batch_index].material) {  			_new_batch(batch_broken); diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index aa8df606cf..2c530e3ae6 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -2881,6 +2881,7 @@ void MaterialStorage::material_set_render_priority(RID p_material, int priority)  	if (material->data) {  		material->data->set_render_priority(priority);  	} +	material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);  }  bool MaterialStorage::material_is_animated(RID p_material) { diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 0c7ea33b54..acbc3ce0dc 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -1540,6 +1540,10 @@ void EditorHelp::_update_doc() {  			if (cd.properties[i].overridden) {  				continue;  			} +			// Ignore undocumented private. +			if (cd.properties[i].name.begins_with("_") && cd.properties[i].description.strip_edges().is_empty()) { +				continue; +			}  			property_line[cd.properties[i].name] = class_desc->get_paragraph_count() - 2; diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 74d82aa4a2..6d747ba6a8 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -33,6 +33,7 @@  #include "core/config/project_settings.h"  #include "core/input/input.h"  #include "core/io/file_access.h" +#include "core/io/json.h"  #include "core/io/resource_loader.h"  #include "core/os/keyboard.h"  #include "core/os/os.h" @@ -209,6 +210,27 @@ Ref<EditorSyntaxHighlighter> EditorPlainTextSyntaxHighlighter::_create() const {  	return syntax_highlighter;  } +//// + +void EditorJSONSyntaxHighlighter::_update_cache() { +	highlighter->set_text_edit(text_edit); +	highlighter->clear_keyword_colors(); +	highlighter->clear_member_keyword_colors(); +	highlighter->clear_color_regions(); + +	highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color")); +	highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color")); + +	const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color"); +	highlighter->add_color_region("\"", "\"", string_color); +} + +Ref<EditorSyntaxHighlighter> EditorJSONSyntaxHighlighter::_create() const { +	Ref<EditorJSONSyntaxHighlighter> syntax_highlighter; +	syntax_highlighter.instantiate(); +	return syntax_highlighter; +} +  ////////////////////////////////////////////////////////////////////////////////  /*** SCRIPT EDITOR ****/ @@ -702,9 +724,10 @@ void ScriptEditor::_open_recent_script(int p_idx) {  	if (FileAccess::exists(path)) {  		List<String> extensions;  		ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); +		ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);  		if (extensions.find(path.get_extension())) { -			Ref<Script> scr = ResourceLoader::load(path); +			Ref<Resource> scr = ResourceLoader::load(path);  			if (scr.is_valid()) {  				edit(scr, true);  				return; @@ -1182,6 +1205,7 @@ void ScriptEditor::_menu_option(int p_option) {  			List<String> extensions;  			ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); +			ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);  			bool built_in = !path.is_resource_file();  			if (extensions.find(path.get_extension()) || built_in) { @@ -1196,7 +1220,7 @@ void ScriptEditor::_menu_option(int p_option) {  					}  				} -				Ref<Script> scr = ResourceLoader::load(path); +				Ref<Resource> scr = ResourceLoader::load(path);  				if (!scr.is_valid()) {  					EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!"));  					file_dialog_option = -1; @@ -2319,12 +2343,23 @@ bool ScriptEditor::edit(const Ref<Resource> &p_resource, int p_line, int p_col,  		}  		se->add_syntax_highlighter(highlighter); -		if (scr != nullptr && !highlighter_set) { -			PackedStringArray languages = highlighter->_get_supported_languages(); +		if (highlighter_set) { +			continue; +		} + +		PackedStringArray languages = highlighter->_get_supported_languages(); +		// If script try language, else use extension. +		if (scr != nullptr) {  			if (languages.has(scr->get_language()->get_name())) {  				se->set_syntax_highlighter(highlighter);  				highlighter_set = true;  			} +			continue; +		} + +		if (languages.has(p_resource->get_path().get_extension())) { +			se->set_syntax_highlighter(highlighter); +			highlighter_set = true;  		}  	} @@ -2536,6 +2571,14 @@ void ScriptEditor::reload_scripts(bool p_refresh_only) {  				scr->reload(true);  			} +			Ref<JSON> json = edited_res; +			if (json != nullptr) { +				Ref<JSON> rel_json = ResourceLoader::load(json->get_path(), json->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); +				ERR_CONTINUE(!rel_json.is_valid()); +				json->parse(rel_json->get_parsed_text(), true); +				json->set_last_modified_time(rel_json->get_last_modified_time()); +			} +  			Ref<TextFile> text_file = edited_res;  			if (text_file.is_valid()) {  				text_file->reload_from_file(); @@ -2564,8 +2607,9 @@ void ScriptEditor::open_text_file_create_dialog(const String &p_base_path, const  Ref<Resource> ScriptEditor::open_file(const String &p_file) {  	List<String> extensions;  	ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); +	ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);  	if (extensions.find(p_file.get_extension())) { -		Ref<Script> scr = ResourceLoader::load(p_file); +		Ref<Resource> scr = ResourceLoader::load(p_file);  		if (!scr.is_valid()) {  			EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!"));  			return Ref<Resource>(); @@ -2866,8 +2910,8 @@ bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data  			if (file.is_empty() || !FileAccess::exists(file)) {  				continue;  			} -			if (ResourceLoader::exists(file, "Script")) { -				Ref<Script> scr = ResourceLoader::load(file); +			if (ResourceLoader::exists(file, "Script") || ResourceLoader::exists(file, "JSON")) { +				Ref<Resource> scr = ResourceLoader::load(file);  				if (scr.is_valid()) {  					return true;  				} @@ -2947,7 +2991,7 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co  				continue;  			} -			if (!ResourceLoader::exists(file, "Script") && !textfile_extensions.has(file.get_extension())) { +			if (!ResourceLoader::exists(file, "Script") && !ResourceLoader::exists(file, "JSON") && !textfile_extensions.has(file.get_extension())) {  				continue;  			} @@ -3105,6 +3149,7 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {  	HashSet<String> loaded_scripts;  	List<String> extensions;  	ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); +	ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions);  	for (int i = 0; i < scripts.size(); i++) {  		String path = scripts[i]; @@ -3123,7 +3168,7 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {  		loaded_scripts.insert(path);  		if (extensions.find(path.get_extension())) { -			Ref<Script> scr = ResourceLoader::load(path); +			Ref<Resource> scr = ResourceLoader::load(path);  			if (!scr.is_valid()) {  				continue;  			} @@ -3477,6 +3522,12 @@ void ScriptEditor::_open_script_request(const String &p_path) {  		return;  	} +	Ref<JSON> json = ResourceLoader::load(p_path); +	if (json.is_valid()) { +		script_editor->edit(json, false); +		return; +	} +  	Error err;  	Ref<TextFile> text_file = script_editor->_load_text_file(p_path, &err);  	if (text_file.is_valid()) { @@ -3539,7 +3590,8 @@ void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_numb  			return;  		} else {  			Ref<Script> scr = res; -			if (scr.is_valid()) { +			Ref<JSON> json = res; +			if (scr.is_valid() || json.is_valid()) {  				edit(scr);  				ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(_get_current_editor()); @@ -3942,6 +3994,10 @@ ScriptEditor::ScriptEditor() {  	add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles")));  	tab_container->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles"))); + +	Ref<EditorJSONSyntaxHighlighter> json_syntax_highlighter; +	json_syntax_highlighter.instantiate(); +	register_syntax_highlighter(json_syntax_highlighter);  }  ScriptEditor::~ScriptEditor() { @@ -3963,6 +4019,8 @@ void ScriptEditorPlugin::edit(Object *p_object) {  			}  		}  		script_editor->edit(p_script); +	} else if (Object::cast_to<JSON>(p_object)) { +		script_editor->edit(Object::cast_to<JSON>(p_object));  	} else if (Object::cast_to<TextFile>(p_object)) {  		script_editor->edit(Object::cast_to<TextFile>(p_object));  	} @@ -3977,6 +4035,10 @@ bool ScriptEditorPlugin::handles(Object *p_object) const {  		return true;  	} +	if (Object::cast_to<JSON>(p_object)) { +		return true; +	} +  	return p_object->is_class("Script");  } diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 988d07621c..f8e684ae34 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -96,6 +96,24 @@ public:  	virtual Ref<EditorSyntaxHighlighter> _create() const override;  }; +class EditorJSONSyntaxHighlighter : public EditorSyntaxHighlighter { +	GDCLASS(EditorJSONSyntaxHighlighter, EditorSyntaxHighlighter) + +private: +	Ref<CodeHighlighter> highlighter; + +public: +	virtual void _update_cache() override; +	virtual Dictionary _get_line_syntax_highlighting_impl(int p_line) override { return highlighter->get_line_syntax_highlighting(p_line); } + +	virtual PackedStringArray _get_supported_languages() const override { return PackedStringArray{ "json" }; } +	virtual String _get_name() const override { return TTR("JSON"); } + +	virtual Ref<EditorSyntaxHighlighter> _create() const override; + +	EditorJSONSyntaxHighlighter() { highlighter.instantiate(); } +}; +  ///////////////////////////////////////////////////////////////////////////////  class ScriptEditorQuickOpen : public ConfirmationDialog { diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index a376699e54..ceb170d7d8 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -30,6 +30,7 @@  #include "text_editor.h" +#include "core/io/json.h"  #include "core/os/keyboard.h"  #include "editor/editor_node.h"  #include "editor/editor_settings.h" @@ -67,12 +68,12 @@ void TextEditor::_load_theme_settings() {  String TextEditor::get_name() {  	String name; -	name = text_file->get_path().get_file(); +	name = edited_res->get_path().get_file();  	if (name.is_empty()) {  		// This appears for newly created built-in text_files before saving the scene.  		name = TTR("[unsaved]"); -	} else if (text_file->is_built_in()) { -		const String &text_file_name = text_file->get_name(); +	} else if (edited_res->is_built_in()) { +		const String &text_file_name = edited_res->get_name();  		if (!text_file_name.is_empty()) {  			// If the built-in text_file has a custom resource name defined,  			// display the built-in text_file name as follows: `ResourceName (scene_file.tscn)` @@ -88,20 +89,29 @@ String TextEditor::get_name() {  }  Ref<Texture2D> TextEditor::get_theme_icon() { -	return EditorNode::get_singleton()->get_object_icon(text_file.ptr(), ""); +	return EditorNode::get_singleton()->get_object_icon(edited_res.ptr(), "TextFile");  }  Ref<Resource> TextEditor::get_edited_resource() const { -	return text_file; +	return edited_res;  }  void TextEditor::set_edited_resource(const Ref<Resource> &p_res) { -	ERR_FAIL_COND(text_file.is_valid()); +	ERR_FAIL_COND(edited_res.is_valid());  	ERR_FAIL_COND(p_res.is_null()); -	text_file = p_res; +	edited_res = p_res; + +	Ref<TextFile> text_file = edited_res; +	if (text_file != nullptr) { +		code_editor->get_text_editor()->set_text(text_file->get_text()); +	} + +	Ref<JSON> json_file = edited_res; +	if (json_file != nullptr) { +		code_editor->get_text_editor()->set_text(json_file->get_parsed_text()); +	} -	code_editor->get_text_editor()->set_text(text_file->get_text());  	code_editor->get_text_editor()->clear_undo_history();  	code_editor->get_text_editor()->tag_saved_version(); @@ -118,6 +128,8 @@ void TextEditor::enable_editor(Control *p_shortcut_context) {  	_load_theme_settings(); +	_validate_script(); +  	if (p_shortcut_context) {  		for (int i = 0; i < edit_hb->get_child_count(); ++i) {  			Control *c = cast_to<Control>(edit_hb->get_child(i)); @@ -143,7 +155,7 @@ PackedInt32Array TextEditor::get_breakpoints() {  }  void TextEditor::reload_text() { -	ERR_FAIL_COND(text_file.is_null()); +	ERR_FAIL_COND(edited_res.is_null());  	CodeEdit *te = code_editor->get_text_editor();  	int column = te->get_caret_column(); @@ -151,7 +163,16 @@ void TextEditor::reload_text() {  	int h = te->get_h_scroll();  	int v = te->get_v_scroll(); -	te->set_text(text_file->get_text()); +	Ref<TextFile> text_file = edited_res; +	if (text_file != nullptr) { +		te->set_text(text_file->get_text()); +	} + +	Ref<JSON> json_file = edited_res; +	if (json_file != nullptr) { +		te->set_text(json_file->get_parsed_text()); +	} +  	te->set_caret_line(row);  	te->set_caret_column(column);  	te->set_h_scroll(h); @@ -166,6 +187,20 @@ void TextEditor::reload_text() {  void TextEditor::_validate_script() {  	emit_signal(SNAME("name_changed"));  	emit_signal(SNAME("edited_script_changed")); + +	Ref<JSON> json_file = edited_res; +	if (json_file != nullptr) { +		CodeEdit *te = code_editor->get_text_editor(); + +		te->set_line_background_color(code_editor->get_error_pos().x, Color(0, 0, 0, 0)); +		code_editor->set_error(""); + +		if (json_file->parse(te->get_text(), true) != OK) { +			code_editor->set_error(json_file->get_error_message()); +			code_editor->set_error_pos(json_file->get_error_line(), 0); +			te->set_line_background_color(code_editor->get_error_pos().x, EDITOR_GET("text_editor/theme/highlighting/mark_color")); +		} +	}  }  void TextEditor::_update_bookmark_list() { @@ -204,13 +239,22 @@ void TextEditor::_bookmark_item_pressed(int p_idx) {  }  void TextEditor::apply_code() { -	text_file->set_text(code_editor->get_text_editor()->get_text()); +	Ref<TextFile> text_file = edited_res; +	if (text_file != nullptr) { +		text_file->set_text(code_editor->get_text_editor()->get_text()); +	} + +	Ref<JSON> json_file = edited_res; +	if (json_file != nullptr) { +		json_file->parse(code_editor->get_text_editor()->get_text(), true); +	} +	code_editor->get_text_editor()->get_syntax_highlighter()->update_cache();  }  bool TextEditor::is_unsaved() {  	const bool unsaved =  			code_editor->get_text_editor()->get_version() != code_editor->get_text_editor()->get_saved_version() || -			text_file->get_path().is_empty(); // In memory. +			edited_res->get_path().is_empty(); // In memory.  	return unsaved;  } @@ -431,7 +475,7 @@ void TextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) {  }  static ScriptEditorBase *create_editor(const Ref<Resource> &p_resource) { -	if (Object::cast_to<TextFile>(*p_resource)) { +	if (Object::cast_to<TextFile>(*p_resource) || Object::cast_to<JSON>(*p_resource)) {  		return memnew(TextEditor);  	}  	return nullptr; @@ -656,4 +700,5 @@ TextEditor::~TextEditor() {  }  void TextEditor::validate() { +	this->code_editor->validate_script();  } diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index 6db81508b3..85e0fee627 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -41,7 +41,7 @@ class TextEditor : public ScriptEditorBase {  private:  	CodeTextEditor *code_editor = nullptr; -	Ref<TextFile> text_file; +	Ref<Resource> edited_res;  	bool editor_enabled = false;  	HBoxContainer *edit_hb = nullptr; diff --git a/modules/navigation/godot_navigation_server.cpp b/modules/navigation/godot_navigation_server.cpp index c3cb1c5f13..79e8c3a6d6 100644 --- a/modules/navigation/godot_navigation_server.cpp +++ b/modules/navigation/godot_navigation_server.cpp @@ -757,7 +757,7 @@ COMMAND_1(free, RID, p_object) {  		agent_owner.free(p_object);  	} else { -		ERR_FAIL_COND("Invalid ID."); +		ERR_FAIL_COND("Attempted to free a NavigationServer RID that did not exist (or was already freed).");  	}  } diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 2e0b16388f..11e59d9858 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -754,8 +754,9 @@ TileMap::VisibilityMode TileMap::get_navigation_visibility_mode() {  void TileMap::set_navigation_map(int p_layer, RID p_map) {  	ERR_FAIL_INDEX(p_layer, (int)layers.size()); - +	ERR_FAIL_COND_MSG(!is_inside_tree(), "A TileMap navigation map can only be changed while inside the SceneTree.");  	layers[p_layer].navigation_map = p_map; +	layers[p_layer].uses_world_navigation_map = p_map == get_world_2d()->get_navigation_map();  }  RID TileMap::get_navigation_map(int p_layer) const { @@ -1111,10 +1112,12 @@ void TileMap::_navigation_update_layer(int p_layer) {  		if (p_layer == 0 && is_inside_tree()) {  			// Use the default World2D navigation map for the first layer when empty.  			layers[p_layer].navigation_map = get_world_2d()->get_navigation_map(); +			layers[p_layer].uses_world_navigation_map = true;  		} else {  			RID new_layer_map = NavigationServer2D::get_singleton()->map_create();  			NavigationServer2D::get_singleton()->map_set_active(new_layer_map, true);  			layers[p_layer].navigation_map = new_layer_map; +			layers[p_layer].uses_world_navigation_map = false;  		}  	}  } @@ -1124,7 +1127,7 @@ void TileMap::_navigation_cleanup_layer(int p_layer) {  	ERR_FAIL_NULL(NavigationServer2D::get_singleton());  	if (layers[p_layer].navigation_map.is_valid()) { -		if (is_inside_tree() && layers[p_layer].navigation_map == get_world_2d()->get_navigation_map()) { +		if (layers[p_layer].uses_world_navigation_map) {  			// Do not delete the World2D default navigation map.  			return;  		} diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index 62d7612be2..e9c1cb0c11 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -212,6 +212,7 @@ private:  		HashMap<Vector2i, TileMapQuadrant> quadrant_map;  		SelfList<TileMapQuadrant>::List dirty_quadrant_list;  		RID navigation_map; +		bool uses_world_navigation_map = false;  	};  	LocalVector<TileMapLayer> layers;  	int selected_layer = -1; diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index 2ea1b93810..432004dedc 100644 --- a/scene/gui/popup.cpp +++ b/scene/gui/popup.cpp @@ -36,7 +36,7 @@  void Popup::_input_from_window(const Ref<InputEvent> &p_event) {  	Ref<InputEventKey> key = p_event; -	if (key.is_valid() && key->is_pressed() && key->get_keycode() == Key::ESCAPE) { +	if (get_flag(FLAG_POPUP) && key.is_valid() && key->is_pressed() && key->get_keycode() == Key::ESCAPE) {  		_close_pressed();  	}  } @@ -102,12 +102,17 @@ void Popup::_notification(int p_what) {  			}  		} break; -		case NOTIFICATION_WM_CLOSE_REQUEST: -		case NOTIFICATION_APPLICATION_FOCUS_OUT: { +		case NOTIFICATION_WM_CLOSE_REQUEST: {  			if (!is_in_edited_scene_root()) {  				_close_pressed();  			}  		} break; + +		case NOTIFICATION_APPLICATION_FOCUS_OUT: { +			if (!is_in_edited_scene_root() && get_flag(FLAG_POPUP)) { +				_close_pressed(); +			} +		} break;  	}  } diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp index d631a89dd2..6f67d628a9 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -2803,6 +2803,7 @@ void MaterialStorage::material_set_render_priority(RID p_material, int priority)  	if (material->data) {  		material->data->set_render_priority(priority);  	} +	material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL);  }  bool MaterialStorage::material_is_animated(RID p_material) {  |