Skip to content

Commit 26fec37

Browse files
committed
Merge pull request #99942 from kitbdev/fix-invisible-subviewport-editor
Fix selecting and editing invisble items in SubViewports
2 parents 82d51a3 + 93e06ff commit 26fec37

File tree

8 files changed

+87
-3
lines changed

8 files changed

+87
-3
lines changed

editor/plugins/abstract_polygon_2d_editor.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,11 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
260260
return false;
261261
}
262262

263+
Viewport *vp = _get_node()->get_viewport();
264+
if (vp && !vp->is_visible_subviewport()) {
265+
return false;
266+
}
267+
263268
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
264269
Ref<InputEventMouseButton> mb = p_event;
265270

@@ -501,6 +506,11 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
501506
return;
502507
}
503508

509+
Viewport *vp = _get_node()->get_viewport();
510+
if (vp && !vp->is_visible_subviewport()) {
511+
return;
512+
}
513+
504514
Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_screen_transform();
505515
// All polygon points are sharp, so use the sharp handle icon
506516
const Ref<Texture2D> handle = get_editor_theme_icon(SNAME("EditorPathSharpHandle"));

editor/plugins/canvas_item_editor_plugin.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,9 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no
618618
if (CanvasLayer *cl = Object::cast_to<CanvasLayer>(p_node)) {
619619
xform = cl->get_transform();
620620
} else if (Viewport *vp = Object::cast_to<Viewport>(p_node)) {
621+
if (!vp->is_visible_subviewport()) {
622+
return;
623+
}
621624
xform = vp->get_popup_base_transform();
622625
if (!vp->get_visible_rect().has_point(xform.xform_inv(p_pos))) {
623626
return;
@@ -718,6 +721,9 @@ void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_n
718721
if (CanvasLayer *cl = Object::cast_to<CanvasLayer>(p_node)) {
719722
xform = cl->get_transform();
720723
} else if (Viewport *vp = Object::cast_to<Viewport>(p_node)) {
724+
if (!vp->is_visible_subviewport()) {
725+
return;
726+
}
721727
xform = vp->get_popup_base_transform();
722728
if (!vp->get_visible_rect().intersects(xform.xform_inv(p_rect))) {
723729
return;
@@ -797,6 +803,10 @@ List<CanvasItem *> CanvasItemEditor::_get_edited_canvas_items(bool p_retrieve_lo
797803
CanvasItem *ci = Object::cast_to<CanvasItem>(E.key);
798804
if (ci) {
799805
if (ci->is_visible_in_tree() && (p_retrieve_locked || !_is_node_locked(ci))) {
806+
Viewport *vp = ci->get_viewport();
807+
if (vp && !vp->is_visible_subviewport()) {
808+
continue;
809+
}
800810
CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(ci);
801811
if (se) {
802812
selection.push_back(ci);
@@ -3819,6 +3829,9 @@ void CanvasItemEditor::_draw_invisible_nodes_positions(Node *p_node, const Trans
38193829
parent_xform = Transform2D();
38203830
canvas_xform = cl->get_transform();
38213831
} else if (Viewport *vp = Object::cast_to<Viewport>(p_node)) {
3832+
if (!vp->is_visible_subviewport()) {
3833+
return;
3834+
}
38223835
parent_xform = Transform2D();
38233836
canvas_xform = vp->get_popup_base_transform();
38243837
}
@@ -3947,10 +3960,15 @@ void CanvasItemEditor::_draw_locks_and_groups(Node *p_node, const Transform2D &p
39473960

39483961
if (ci && !ci->is_set_as_top_level()) {
39493962
parent_xform = parent_xform * ci->get_transform();
3950-
} else {
3951-
CanvasLayer *cl = Object::cast_to<CanvasLayer>(p_node);
3963+
} else if (CanvasLayer *cl = Object::cast_to<CanvasLayer>(p_node)) {
3964+
parent_xform = Transform2D();
3965+
canvas_xform = cl->get_transform();
3966+
} else if (Viewport *vp = Object::cast_to<Viewport>(p_node)) {
3967+
if (!vp->is_visible_subviewport()) {
3968+
return;
3969+
}
39523970
parent_xform = Transform2D();
3953-
canvas_xform = cl ? cl->get_transform() : p_canvas_xform;
3971+
canvas_xform = vp->get_popup_base_transform();
39543972
}
39553973

39563974
for (int i = p_node->get_child_count() - 1; i >= 0; i--) {

editor/plugins/cast_2d_editor_plugin.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "editor/editor_undo_redo_manager.h"
3636
#include "scene/2d/physics/ray_cast_2d.h"
3737
#include "scene/2d/physics/shape_cast_2d.h"
38+
#include "scene/main/viewport.h"
3839

3940
void Cast2DEditor::_notification(int p_what) {
4041
switch (p_what) {
@@ -59,6 +60,11 @@ bool Cast2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
5960
return false;
6061
}
6162

63+
Viewport *vp = node->get_viewport();
64+
if (vp && !vp->is_visible_subviewport()) {
65+
return false;
66+
}
67+
6268
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_screen_transform();
6369

6470
Ref<InputEventMouseButton> mb = p_event;
@@ -114,6 +120,11 @@ void Cast2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
114120
return;
115121
}
116122

123+
Viewport *vp = node->get_viewport();
124+
if (vp && !vp->is_visible_subviewport()) {
125+
return;
126+
}
127+
117128
Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_screen_transform();
118129

119130
const Ref<Texture2D> handle = get_editor_theme_icon(SNAME("EditorHandle"));

editor/plugins/collision_shape_2d_editor_plugin.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,11 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e
348348
return false;
349349
}
350350

351+
Viewport *vp = node->get_viewport();
352+
if (vp && !vp->is_visible_subviewport()) {
353+
return false;
354+
}
355+
351356
if (shape_type == -1) {
352357
return false;
353358
}
@@ -481,6 +486,11 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
481486
return;
482487
}
483488

489+
Viewport *vp = node->get_viewport();
490+
if (vp && !vp->is_visible_subviewport()) {
491+
return;
492+
}
493+
484494
if (shape_type == -1) {
485495
return;
486496
}

editor/plugins/navigation_link_2d_editor_plugin.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "editor/editor_node.h"
3535
#include "editor/editor_settings.h"
3636
#include "editor/editor_undo_redo_manager.h"
37+
#include "scene/main/viewport.h"
3738
#include "servers/navigation_server_3d.h"
3839

3940
void NavigationLink2DEditor::_notification(int p_what) {
@@ -59,6 +60,11 @@ bool NavigationLink2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e
5960
return false;
6061
}
6162

63+
Viewport *vp = node->get_viewport();
64+
if (vp && !vp->is_visible_subviewport()) {
65+
return false;
66+
}
67+
6268
real_t grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius");
6369
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_screen_transform();
6470

@@ -142,6 +148,11 @@ void NavigationLink2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
142148
return;
143149
}
144150

151+
Viewport *vp = node->get_viewport();
152+
if (vp && !vp->is_visible_subviewport()) {
153+
return;
154+
}
155+
145156
Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_screen_transform();
146157
Vector2 global_start_position = gt.xform(node->get_start_position());
147158
Vector2 global_end_position = gt.xform(node->get_end_position());

editor/plugins/path_2d_editor_plugin.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
7171
return false;
7272
}
7373

74+
Viewport *vp = node->get_viewport();
75+
if (vp && !vp->is_visible_subviewport()) {
76+
return false;
77+
}
78+
7479
if (node->get_curve().is_null()) {
7580
return false;
7681
}
@@ -393,6 +398,11 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
393398
return;
394399
}
395400

401+
Viewport *vp = node->get_viewport();
402+
if (vp && !vp->is_visible_subviewport()) {
403+
return;
404+
}
405+
396406
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_screen_transform();
397407

398408
const Ref<Texture2D> path_sharp_handle = get_editor_theme_icon(SNAME("EditorPathSharpHandle"));

scene/main/viewport.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3899,6 +3899,16 @@ bool Viewport::get_canvas_cull_mask_bit(uint32_t p_layer) const {
38993899
return (canvas_cull_mask & (1 << p_layer));
39003900
}
39013901

3902+
#ifdef TOOLS_ENABLED
3903+
bool Viewport::is_visible_subviewport() const {
3904+
if (!is_sub_viewport()) {
3905+
return true;
3906+
}
3907+
SubViewportContainer *container = Object::cast_to<SubViewportContainer>(get_parent());
3908+
return container && container->is_visible_in_tree();
3909+
}
3910+
#endif // TOOLS_ENABLED
3911+
39023912
void Viewport::_update_audio_listener_2d() {
39033913
if (AudioServer::get_singleton()) {
39043914
AudioServer::get_singleton()->notify_listener_changed();

scene/main/viewport.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,10 @@ class Viewport : public Node {
672672
void set_canvas_cull_mask_bit(uint32_t p_layer, bool p_enable);
673673
bool get_canvas_cull_mask_bit(uint32_t p_layer) const;
674674

675+
#ifdef TOOLS_ENABLED
676+
bool is_visible_subviewport() const;
677+
#endif // TOOLS_ENABLED
678+
675679
virtual bool is_size_2d_override_stretch_enabled() const { return true; }
676680

677681
Transform2D get_screen_transform() const;

0 commit comments

Comments
 (0)