From 3936ed882c6f39c74a3b124a95d5adc5e61ab3c5 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Tue, 12 May 2015 08:17:09 -0300 Subject: [PATCH] -Added lookat/get_angle_to functions in 2D, and a demo, closes #1843 -Added get_viewport().get_mouse_pos() to replace Input.get_mouse_pos(), closes #1838 --- demos/2d/lookat/arrow.png | Bin 0 -> 2528 bytes demos/2d/lookat/engine.cfg | 4 ++++ demos/2d/lookat/lookat.gd | 43 +++++++++++++++++++++++++++++++++++++ demos/2d/lookat/lookat.scn | Bin 0 -> 1622 bytes scene/2d/node_2d.cpp | 14 ++++++++++++ scene/2d/node_2d.h | 3 +++ scene/main/viewport.cpp | 6 ++++++ scene/main/viewport.h | 1 + 8 files changed, 71 insertions(+) create mode 100644 demos/2d/lookat/arrow.png create mode 100644 demos/2d/lookat/engine.cfg create mode 100644 demos/2d/lookat/lookat.gd create mode 100644 demos/2d/lookat/lookat.scn diff --git a/demos/2d/lookat/arrow.png b/demos/2d/lookat/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..25db91e8d17bcb611d642a79daf67327e5496fed GIT binary patch literal 2528 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 zhU!q_+?JaUpfuc#IXr}?<>Rget_relative_transform(p_parent) * get_transform(); } + +void Node2D::look_at(const Vector2& p_pos) { + + rotate(get_angle_to(p_pos)); +} + +float Node2D::get_angle_to(const Vector2& p_pos) const { + + return (get_global_transform().affine_inverse().xform(p_pos)).atan2(); +} + void Node2D::_bind_methods() { @@ -374,6 +385,9 @@ void Node2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_transform","xform"),&Node2D::set_transform); ObjectTypeDB::bind_method(_MD("set_global_transform","xform"),&Node2D::set_global_transform); + ObjectTypeDB::bind_method(_MD("look_at","point"),&Node2D::look_at); + ObjectTypeDB::bind_method(_MD("get_angle_to","point"),&Node2D::get_angle_to); + ObjectTypeDB::bind_method(_MD("set_z","z"),&Node2D::set_z); ObjectTypeDB::bind_method(_MD("get_z"),&Node2D::get_z); diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h index 74612b3c6da..8efce33cdac 100644 --- a/scene/2d/node_2d.h +++ b/scene/2d/node_2d.h @@ -93,6 +93,9 @@ public: void set_z(int p_z); int get_z() const; + void look_at(const Vector2& p_pos); + float get_angle_to(const Vector2& p_pos) const; + void set_z_as_relative(bool p_enabled); bool is_z_relative() const; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 4d9feb3af1f..3bb64e54c67 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1177,6 +1177,11 @@ void Viewport::_vp_unhandled_input(const InputEvent& p_ev) { } +Vector2 Viewport::get_mouse_pos() const { + + return (get_final_transform().affine_inverse() * _get_input_pre_xform()).xform(Input::get_singleton()->get_mouse_pos()); +} + void Viewport::warp_mouse(const Vector2& p_pos) { Vector2 gpos = (get_final_transform().affine_inverse() * _get_input_pre_xform()).affine_inverse().xform(p_pos); @@ -1377,6 +1382,7 @@ void Viewport::_bind_methods() { ObjectTypeDB::bind_method(_MD("is_audio_listener_2d","enable"), &Viewport::is_audio_listener_2d); ObjectTypeDB::bind_method(_MD("set_render_target_to_screen_rect"), &Viewport::set_render_target_to_screen_rect); + ObjectTypeDB::bind_method(_MD("get_mouse_pos"), &Viewport::get_mouse_pos); ObjectTypeDB::bind_method(_MD("warp_mouse","to_pos"), &Viewport::warp_mouse); ADD_PROPERTY( PropertyInfo(Variant::RECT2,"rect"), _SCS("set_rect"), _SCS("get_rect") ); diff --git a/scene/main/viewport.h b/scene/main/viewport.h index fba67256103..c3c339ac5de 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -252,6 +252,7 @@ public: void set_render_target_to_screen_rect(const Rect2& p_rect); Rect2 get_render_target_to_screen_rect() const; + Vector2 get_mouse_pos() const; void warp_mouse(const Vector2& p_pos); void set_physics_object_picking(bool p_enable);