summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-07-11 02:26:58 -0300
committerGitHub <noreply@github.com>2016-07-11 02:26:58 -0300
commitb41be2d1a9210d03be0817871ead7aa0f8657716 (patch)
tree120f0aa240041a1e1408ceca74e85b8806989c3c
parent9397458cc0a37f4899a0dba5352a6e045ed123d8 (diff)
parent605193b22fc61913d00b4ba4801c0283646b3a00 (diff)
Merge pull request #4854 from Razzlegames/screenToLocal
Conversion function for screen coords to local Canvas coords
-rw-r--r--doc/base/classes.xml16
-rw-r--r--scene/2d/canvas_item.cpp11
-rw-r--r--scene/2d/canvas_item.h1
3 files changed, 28 insertions, 0 deletions
diff --git a/doc/base/classes.xml b/doc/base/classes.xml
index b5384cfc2b..91c768ef42 100644
--- a/doc/base/classes.xml
+++ b/doc/base/classes.xml
@@ -7339,6 +7339,22 @@
</description>
</method>
<method name="update">
+ <method name="make_screen_coord_local" qualifiers="const">
+ <return type="Vector2">
+ </return>
+ <argument index="0" name="screen_point" type="Vector2">
+ </argument>
+ <description>
+ 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.
+ </description>
+ </method>
+ <method name="make_input_local" qualifiers="const">
+ <return type="InputEvent">
+ </return>
+ <argument index="0" name="event" type="InputEvent">
+ </argument>
<description>
Queue the CanvasItem for update. [code]NOTIFICATION_DRAW[/code] will be called on idle time to request redraw.
</description>
diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp
index bc5bff3b8e..eb4f457975 100644
--- a/scene/2d/canvas_item.cpp
+++ b/scene/2d/canvas_item.cpp
@@ -948,6 +948,15 @@ Ref<CanvasItemMaterial> 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 8a61b449fd..b894310ce2 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;