Browse Source

Merge pull request #107001 from KoBeWi/sneaky_overlay_injection

Make TileMapLayer editor match layer's filter
Rémi Verschelde 2 months ago
parent
commit
d83c797895

+ 26 - 33
editor/plugins/tiles/tile_map_layer_editor.cpp

@@ -803,18 +803,7 @@ bool TileMapLayerEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEven
 
 
 void TileMapLayerEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_overlay) {
 void TileMapLayerEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_overlay) {
 	const TileMapLayer *edited_layer = _get_edited_layer();
 	const TileMapLayer *edited_layer = _get_edited_layer();
-	if (!edited_layer) {
-		return;
-	}
-
 	Ref<TileSet> tile_set = edited_layer->get_tile_set();
 	Ref<TileSet> tile_set = edited_layer->get_tile_set();
-	if (tile_set.is_null()) {
-		return;
-	}
-
-	if (!edited_layer->is_visible_in_tree()) {
-		return;
-	}
 
 
 	Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * edited_layer->get_global_transform_with_canvas();
 	Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * edited_layer->get_global_transform_with_canvas();
 	Vector2 mpos = edited_layer->get_local_mouse_position();
 	Vector2 mpos = edited_layer->get_local_mouse_position();
@@ -3181,18 +3170,7 @@ bool TileMapLayerEditorTerrainsPlugin::forward_canvas_gui_input(const Ref<InputE
 
 
 void TileMapLayerEditorTerrainsPlugin::forward_canvas_draw_over_viewport(Control *p_overlay) {
 void TileMapLayerEditorTerrainsPlugin::forward_canvas_draw_over_viewport(Control *p_overlay) {
 	const TileMapLayer *edited_layer = _get_edited_layer();
 	const TileMapLayer *edited_layer = _get_edited_layer();
-	if (!edited_layer) {
-		return;
-	}
-
 	Ref<TileSet> tile_set = edited_layer->get_tile_set();
 	Ref<TileSet> tile_set = edited_layer->get_tile_set();
-	if (tile_set.is_null()) {
-		return;
-	}
-
-	if (!edited_layer->is_visible_in_tree()) {
-		return;
-	}
 
 
 	Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * edited_layer->get_global_transform_with_canvas();
 	Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * edited_layer->get_global_transform_with_canvas();
 	Vector2 mpos = edited_layer->get_local_mouse_position();
 	Vector2 mpos = edited_layer->get_local_mouse_position();
@@ -3749,6 +3727,12 @@ void TileMapLayerEditor::_notification(int p_what) {
 				_update_bottom_panel();
 				_update_bottom_panel();
 				_update_layers_selector();
 				_update_layers_selector();
 				tabs_plugins[tabs_bar->get_current_tab()]->tile_set_changed();
 				tabs_plugins[tabs_bar->get_current_tab()]->tile_set_changed();
+
+				const TileMapLayer *edited_layer = _get_edited_layer();
+				if (edited_layer && custom_overlay) {
+					custom_overlay->set_texture_filter(edited_layer->get_texture_filter_in_tree());
+				}
+
 				CanvasItemEditor::get_singleton()->update_viewport();
 				CanvasItemEditor::get_singleton()->update_viewport();
 				tile_map_layer_changed_needs_update = false;
 				tile_map_layer_changed_needs_update = false;
 			}
 			}
@@ -4280,8 +4264,21 @@ bool TileMapLayerEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event
 }
 }
 
 
 void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
+	if (!custom_overlay) {
+		custom_overlay = memnew(Control);
+		custom_overlay->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
+		custom_overlay->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
+		custom_overlay->set_clip_contents(true);
+		custom_overlay->set_draw_behind_parent(true);
+		p_overlay->add_child(custom_overlay);
+		custom_overlay->connect(SceneStringName(draw), callable_mp(this, &TileMapLayerEditor::_draw_overlay));
+	}
+	custom_overlay->queue_redraw();
+}
+
+void TileMapLayerEditor::_draw_overlay() {
 	const TileMapLayer *edited_layer = _get_edited_layer();
 	const TileMapLayer *edited_layer = _get_edited_layer();
-	if (!edited_layer) {
+	if (!edited_layer || !edited_layer->is_visible_in_tree()) {
 		return;
 		return;
 	}
 	}
 
 
@@ -4290,10 +4287,6 @@ void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 		return;
 		return;
 	}
 	}
 
 
-	if (!edited_layer->is_visible_in_tree()) {
-		return;
-	}
-
 	Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * edited_layer->get_global_transform_with_canvas();
 	Transform2D xform = CanvasItemEditor::get_singleton()->get_canvas_transform() * edited_layer->get_global_transform_with_canvas();
 	Transform2D xform_inv = xform.affine_inverse();
 	Transform2D xform_inv = xform.affine_inverse();
 	Vector2i tile_shape_size = tile_set->get_tile_size();
 	Vector2i tile_shape_size = tile_set->get_tile_size();
@@ -4328,7 +4321,7 @@ void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 				Transform2D tile_xform;
 				Transform2D tile_xform;
 				tile_xform.set_origin(tile_set->map_to_local(coords));
 				tile_xform.set_origin(tile_set->map_to_local(coords));
 				tile_xform.set_scale(tile_shape_size);
 				tile_xform.set_scale(tile_shape_size);
-				tile_set->draw_tile_shape(p_overlay, xform * tile_xform, color, true, warning_pattern_texture);
+				tile_set->draw_tile_shape(custom_overlay, xform * tile_xform, color, true, warning_pattern_texture);
 
 
 				// Draw the warning icon.
 				// Draw the warning icon.
 				Vector2::Axis min_axis = missing_tile_texture->get_size().min_axis_index();
 				Vector2::Axis min_axis = missing_tile_texture->get_size().min_axis_index();
@@ -4336,7 +4329,7 @@ void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 				icon_size[min_axis] = tile_set->get_tile_size()[min_axis] / 3;
 				icon_size[min_axis] = tile_set->get_tile_size()[min_axis] / 3;
 				icon_size[(min_axis + 1) % 2] = (icon_size[min_axis] * missing_tile_texture->get_size()[(min_axis + 1) % 2] / missing_tile_texture->get_size()[min_axis]);
 				icon_size[(min_axis + 1) % 2] = (icon_size[min_axis] * missing_tile_texture->get_size()[(min_axis + 1) % 2] / missing_tile_texture->get_size()[min_axis]);
 				Rect2 rect = Rect2(xform.xform(tile_set->map_to_local(coords)) - (icon_size * xform.get_scale() / 2), icon_size * xform.get_scale());
 				Rect2 rect = Rect2(xform.xform(tile_set->map_to_local(coords)) - (icon_size * xform.get_scale() / 2), icon_size * xform.get_scale());
-				p_overlay->draw_texture_rect(missing_tile_texture, rect);
+				custom_overlay->draw_texture_rect(missing_tile_texture, rect);
 			}
 			}
 		}
 		}
 	}
 	}
@@ -4345,7 +4338,7 @@ void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 	const int fading = 5;
 	const int fading = 5;
 
 
 	// Determine the drawn area.
 	// Determine the drawn area.
-	Size2 screen_size = p_overlay->get_size();
+	Size2 screen_size = custom_overlay->get_size();
 	Rect2i screen_rect;
 	Rect2i screen_rect;
 	screen_rect.position = tile_set->local_to_map(xform_inv.xform(Vector2()));
 	screen_rect.position = tile_set->local_to_map(xform_inv.xform(Vector2()));
 	screen_rect.expand_to(tile_set->local_to_map(xform_inv.xform(Vector2(0, screen_size.height))));
 	screen_rect.expand_to(tile_set->local_to_map(xform_inv.xform(Vector2(0, screen_size.height))));
@@ -4387,7 +4380,7 @@ void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 				tile_xform.set_scale(tile_shape_size);
 				tile_xform.set_scale(tile_shape_size);
 				Color color = grid_color;
 				Color color = grid_color;
 				color.a = color.a * opacity;
 				color.a = color.a * opacity;
-				tile_set->draw_tile_shape(p_overlay, xform * tile_xform, color, false);
+				tile_set->draw_tile_shape(custom_overlay, xform * tile_xform, color, false);
 			}
 			}
 		}
 		}
 	}
 	}
@@ -4396,12 +4389,12 @@ void TileMapLayerEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 	/*Ref<Font> font = get_theme_font(SceneStringName(font), SNAME("Label"));
 	/*Ref<Font> font = get_theme_font(SceneStringName(font), SNAME("Label"));
 	for (int x = displayed_rect.position.x; x < (displayed_rect.position.x + displayed_rect.size.x); x++) {
 	for (int x = displayed_rect.position.x; x < (displayed_rect.position.x + displayed_rect.size.x); x++) {
 		for (int y = displayed_rect.position.y; y < (displayed_rect.position.y + displayed_rect.size.y); y++) {
 		for (int y = displayed_rect.position.y; y < (displayed_rect.position.y + displayed_rect.size.y); y++) {
-			p_overlay->draw_string(font, xform.xform(tile_set->map_to_local(Vector2(x, y))) + Vector2i(-tile_shape_size.x / 2, 0), vformat("%s", Vector2(x, y)));
+			custom_overlay->draw_string(font, xform.xform(tile_set->map_to_local(Vector2(x, y))) + Vector2i(-tile_shape_size.x / 2, 0), vformat("%s", Vector2(x, y)));
 		}
 		}
 	}*/
 	}*/
 
 
 	// Draw the plugins.
 	// Draw the plugins.
-	tabs_plugins[tabs_bar->get_current_tab()]->forward_canvas_draw_over_viewport(p_overlay);
+	tabs_plugins[tabs_bar->get_current_tab()]->forward_canvas_draw_over_viewport(custom_overlay);
 }
 }
 
 
 void TileMapLayerEditor::edit(Object *p_edited) {
 void TileMapLayerEditor::edit(Object *p_edited) {

+ 3 - 0
editor/plugins/tiles/tile_map_layer_editor.h

@@ -348,6 +348,9 @@ private:
 	void _update_tile_map_layers_in_scene_list_cache();
 	void _update_tile_map_layers_in_scene_list_cache();
 	void _node_change(Node *p_node);
 	void _node_change(Node *p_node);
 
 
+	Control *custom_overlay = nullptr;
+	void _draw_overlay();
+
 	// Vector to keep plugins.
 	// Vector to keep plugins.
 	Vector<TileMapLayerSubEditorPlugin *> tile_map_editor_plugins;
 	Vector<TileMapLayerSubEditorPlugin *> tile_map_editor_plugins;