From 605193b22fc61913d00b4ba4801c0283646b3a00 Mon Sep 17 00:00:00 2001 From: Kyle Luce Date: Sat, 28 May 2016 00:31:07 -0700 Subject: [PATCH] Conversion function for screen coords to local Canvas coords - Useful if you need to Convert screen coords to the coordinate space of a CanvasItem, but don't have an associated InputEvent to use in #make_event_local. For example, if you have a particular point on the screen you'd like to project into World Space, for various reasons, you would use this function on the root of the scene. This is analogous to ray casting from screen space in 3D. --- doc/base/classes.xml | 16 ++++++++++++++++ scene/2d/canvas_item.cpp | 11 +++++++++++ scene/2d/canvas_item.h | 1 + 3 files changed, 28 insertions(+) diff --git a/doc/base/classes.xml b/doc/base/classes.xml index cffbd68939f..423a31c6ff1 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -7328,6 +7328,22 @@ + + + + + + + Take a 2d screen point and convert to 2D local coords relative to this Canvas + item. If this CanvasItem is the root of a Scene, its essentially the + world coords for that scene. + + + + + + + Queue the CanvasItem for update. [code]NOTIFICATION_DRAW[/code] will be called on idle time to request redraw. diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp index bc5bff3b8ef..eb4f4579754 100644 --- a/scene/2d/canvas_item.cpp +++ b/scene/2d/canvas_item.cpp @@ -948,6 +948,15 @@ Ref CanvasItem::get_material() const{ return material; } +Vector2 CanvasItem::make_canvas_pos_local(const Vector2& screen_point) const { + + ERR_FAIL_COND_V(!is_inside_tree(),screen_point); + + Matrix32 local_matrix = (get_canvas_transform() * + get_global_transform()).affine_inverse(); + + return local_matrix.xform(screen_point); +} InputEvent CanvasItem::make_input_local(const InputEvent& p_event) const { @@ -1052,6 +1061,8 @@ void CanvasItem::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_use_parent_material","enable"),&CanvasItem::set_use_parent_material); ObjectTypeDB::bind_method(_MD("get_use_parent_material"),&CanvasItem::get_use_parent_material); + ObjectTypeDB::bind_method(_MD("make_canvas_pos_local","screen_point"), + &CanvasItem::make_canvas_pos_local); ObjectTypeDB::bind_method(_MD("make_input_local","event"),&CanvasItem::make_input_local); BIND_VMETHOD(MethodInfo("_draw")); diff --git a/scene/2d/canvas_item.h b/scene/2d/canvas_item.h index 8a61b449fd4..b894310ce23 100644 --- a/scene/2d/canvas_item.h +++ b/scene/2d/canvas_item.h @@ -263,6 +263,7 @@ public: bool get_use_parent_material() const; InputEvent make_input_local(const InputEvent& pevent) const; + Vector2 make_canvas_pos_local(const Vector2& screen_point) const; Vector2 get_global_mouse_pos() const; Vector2 get_local_mouse_pos() const;