diff options
Diffstat (limited to 'scene/main/viewport.cpp')
| -rw-r--r-- | scene/main/viewport.cpp | 59 | 
1 files changed, 43 insertions, 16 deletions
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index a28b6fd6de..f8cc1bdd77 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -45,6 +45,7 @@  #include "scene/gui/panel.h"  #include "scene/gui/panel_container.h"  #include "scene/gui/popup_menu.h" +#include "scene/main/canvas_layer.h"  #include "scene/main/timer.h"  #include "scene/resources/mesh.h"  #include "scene/scene_string_names.h" @@ -443,24 +444,39 @@ void Viewport::_notification(int p_what) {  						uint64_t frame = get_tree()->get_frame(); -						Vector2 point = get_canvas_transform().affine_inverse().xform(pos);  						Physics2DDirectSpaceState::ShapeResult res[64]; -						int rc = ss2d->intersect_point(point, res, 64, Set<RID>(), 0xFFFFFFFF, true, true, true); -						for (int i = 0; i < rc; i++) { - -							if (res[i].collider_id && res[i].collider) { -								CollisionObject2D *co = Object::cast_to<CollisionObject2D>(res[i].collider); -								if (co) { - -									Map<ObjectID, uint64_t>::Element *E = physics_2d_mouseover.find(res[i].collider_id); -									if (!E) { -										E = physics_2d_mouseover.insert(res[i].collider_id, frame); -										co->_mouse_enter(); -									} else { -										E->get() = frame; -									} +						for (Set<CanvasLayer *>::Element *E = canvas_layers.front(); E; E = E->next()) { +							Transform2D canvas_transform; +							ObjectID canvas_layer_id; +							if (E->get()) { +								// A descendant CanvasLayer +								canvas_transform = E->get()->get_transform(); +								canvas_layer_id = E->get()->get_instance_id(); +							} else { +								// This Viewport's builtin canvas +								canvas_transform = get_canvas_transform(); +								canvas_layer_id = 0; +							} + +							Vector2 point = canvas_transform.affine_inverse().xform(pos); + +							int rc = ss2d->intersect_point_on_canvas(point, canvas_layer_id, res, 64, Set<RID>(), 0xFFFFFFFF, true, true, true); +							for (int i = 0; i < rc; i++) { + +								if (res[i].collider_id && res[i].collider) { +									CollisionObject2D *co = Object::cast_to<CollisionObject2D>(res[i].collider); +									if (co) { + +										Map<ObjectID, uint64_t>::Element *E = physics_2d_mouseover.find(res[i].collider_id); +										if (!E) { +											E = physics_2d_mouseover.insert(res[i].collider_id, frame); +											co->_mouse_enter(); +										} else { +											E->get() = frame; +										} -									co->_input_event(this, ev, res[i].shape); +										co->_input_event(this, ev, res[i].shape); +									}  								}  							}  						} @@ -854,6 +870,16 @@ void Viewport::_camera_make_next_current(Camera *p_exclude) {  }  #endif +void Viewport::_canvas_layer_add(CanvasLayer *p_canvas_layer) { + +	canvas_layers.insert(p_canvas_layer); +} + +void Viewport::_canvas_layer_remove(CanvasLayer *p_canvas_layer) { + +	canvas_layers.erase(p_canvas_layer); +} +  void Viewport::set_transparent_background(bool p_enable) {  	transparent_bg = p_enable; @@ -2911,6 +2937,7 @@ Viewport::Viewport() {  	parent = NULL;  	listener = NULL;  	camera = NULL; +	canvas_layers.insert(NULL); // This eases picking code (interpreted as the canvas of the Viewport)  	arvr = false;  	size_override = false;  	size_override_stretch = false;  |