diff options
author | Kyle Luce <razzlegames@gmail.com> | 2016-05-28 00:31:07 -0700 |
---|---|---|
committer | Kyle Luce <razzlegames@gmail.com> | 2016-07-10 16:06:57 -0700 |
commit | 605193b22fc61913d00b4ba4801c0283646b3a00 (patch) | |
tree | 52e73493b5b3f6dd57f4c3bd8ab6223fab2b1a3c | |
parent | 864c0e84de9c2a2c5a030ec4ee167f3793e1e962 (diff) |
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.
-rw-r--r-- | doc/base/classes.xml | 16 | ||||
-rw-r--r-- | scene/2d/canvas_item.cpp | 11 | ||||
-rw-r--r-- | scene/2d/canvas_item.h | 1 |
3 files changed, 28 insertions, 0 deletions
diff --git a/doc/base/classes.xml b/doc/base/classes.xml index cffbd68939..423a31c6ff 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -7328,6 +7328,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; |