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 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEllbJ^qj&ljKT^mUR^Iy8yX zcg;nviQ6u&jnXc?u($A{uZW@RtB}sv+${ZV(kAOB2u%JZ{$-K*-rKi)quJM_ywsTT zXsPPTjdR6?oP~1QWs-W5t;^;-m|lFY_}u3=O~p3JHc}ps_L$he)bLB1TU+h?0 zaB8ad`>V_i3<)>fnHypmwzVIAnCKd~CPGK;+>8YNR1o+y$%irI78`*i|knoBIrh=Q3?yxmPOxybU!NKO=QBhGl z7HMSUC}LH*Q1}o}XtMWi~surswh%&BEN=+}*04Rs|0Z zG~So9E_-t|c)6eKz5Vt7_4CgygWmk} z;&W%uHZFU6OV!-ew9qw>MUh2s`spjBdspt>{o8&0o=>OzfBpK^*52O!KFBM0&gT%l z>ATHMO{YGZ!+mb&r$gNOZ*p^U|6bdcd)w;vty^XLzFhK-m6eqZOHN)~urnqmP(-ms zVb-#VK5ELYN)!3Rlup`cGH^GfITr{$ntR^vx6Y+|_x|PfA3v<>*`#y2shBTv+QYKl zuED{=@87+vdv{`@^8MtVg9bc{GNlrG1kYKjcnalhm)4u^y(30%p+;ALNbAnKc@_?g z2R7+U@lrLivYKV=`}t86!-H*)S*2Z+8Lr*GU;q2X#l`mpogAj62HO2(7C2(!dqdmT z;<>mwcjol^+?UhutDi2C>=9^+nC8lJSm9uT!Pfly`}S>RdGLkBPa=Zh z%)Wj5RxHarGI9InMd!GJy-xRqI!{cMoN~!%i+e|LT;G2erNXywZf-sn#cZHm#U#wo z>9%Tmz|i@)~XgB4P%*Re4< z6eT1)_;%-x%-W8R?%ey{-bv=Xeez;lWm2S=q3>jt=7SYFV!OA=F&rq{lc9Z(DWP)j zy$$PLw-~yu+WbfOv=2wYxznHYMYvR^dd0?a9jIa`IJ6*QqrHQU*ldpW!!v*WtlV`+ zdiAt=9kI#!@%#Qfzj`Cter@4yE{jA4hGM(<`Bt;f+L`f8)2iRyuFzvB#KDqx{@l5^ zcz*`1)s2^hJG`gs`M%iYR~oB+I<{7w<F&+jJ z-)=sB{`+TBj4n-{=6t;Jn1n>KicqJ51W(%Jr zOZfgfB8BIcHy?c9V>Ne~H*fQ)H~F*FX3m*oqOPX)Z>JzbN0-5cw|fFOSeUZx=EoN) ztvU0rEpbAChKW?C%Oh!4hSeFpx(q*lJnnb@^m9*)hKSs1rgV=-CU(m*m1ds}3JpD< zIJI}(gPmH(pZR6my#4%hUrBp}_rJx97q_Mu{e0icvY;yN1mlZ?2?bX3&j+90BzNjt z|K$DaUaLs;_O&=I+zC>UlgFeGx4t~3urRRbP=e+s|K*pzJUctP-d#3lDdQEXDR(3# zBsi?EKJcC;e@H@ESy|aq@yOF&js;;72K(>Z$Lfgv&zA@>vDcXDz!TtC9_X{$H zyc0N`XkcJqFvoBC#vMC;OyFt}IC9VMkcn?d&))xCRyVU4R#=*S|5-C}=T6I$i~%c| z(!U*-P(GMou(SOAy?wnr3!dG$^Zc`KX#d%{+pbrB3f7wHVI#M{?A;y9gjr`qI&CsRHN zT|4pWqvP{a8!NdPEa&?5w>mAXJa(h6z(U8(&F$P8QHH4Y>?=IY8#iu@KAAG9&1s?Z zs#SiuX$)7Bi`g9BzkK;K+-h#vqmLE(*Dfrvigmy7a2qebUFNE(UQ1Uj(y;GyTU>u8 z#pt`aHN%60#}i}CI+Plo96IEbkd~H~q$?V5{{3H#iVvynvSofJZYUfHS7cdrI!W+< ybwktoE+&}=SJ)oba6i>fXNlgH`uf;E?&FVB|4n&*LXm-ifx*+&&t;ucLK6TwLb~n% literal 0 HcmV?d00001 diff --git a/demos/2d/lookat/engine.cfg b/demos/2d/lookat/engine.cfg new file mode 100644 index 0000000000..56917a39ec --- /dev/null +++ b/demos/2d/lookat/engine.cfg @@ -0,0 +1,4 @@ +[application] + +name="Look At Pointer" +main_scene="res://lookat.scn" diff --git a/demos/2d/lookat/lookat.gd b/demos/2d/lookat/lookat.gd new file mode 100644 index 0000000000..742c5b0671 --- /dev/null +++ b/demos/2d/lookat/lookat.gd @@ -0,0 +1,43 @@ + +extends Sprite + +# member variables here, example: +# var a=2 +# var b="textvar" + +const MODE_DIRECT=0 +const MODE_CONSTANT=1 +const MODE_SMOOTH=2 + +const ROTATION_SPEED = 1 +const SMOOTH_SPEED = 2.0 + +export(int,"Direct","Constant","Smooth") var mode=MODE_DIRECT + +func _process(delta): + var mpos = get_viewport().get_mouse_pos() + + if (mode==MODE_DIRECT): + + look_at(mpos) + + elif (mode==MODE_CONSTANT): + + var ang = get_angle_to(mpos) + var s = sign(ang) + ang=abs(ang) + + rotate( min(ang,ROTATION_SPEED*delta)*s ) + + elif (mode==MODE_SMOOTH): + + var ang = get_angle_to(mpos) + + rotate( ang*delta*SMOOTH_SPEED ) + +func _ready(): + # Initialization here + set_process(true) + pass + + diff --git a/demos/2d/lookat/lookat.scn b/demos/2d/lookat/lookat.scn new file mode 100644 index 0000000000000000000000000000000000000000..880070b4c7ca5d096d9494fe05b1b5376cdb9031 GIT binary patch literal 1622 zcmWFvc6Md}0RaYvGCl?dJ2nOeMh1okMg~R&HV0-01_mAl7OsHA*r=Y$2%?C8b5F518aR5{ruR z%k>KK(i18exD=FGa`KZCa}+F@3>bbZ@H#L&V1MSY$f1BiNrr{x#r>KEh}KVTDNEXr>*f552BP^`$on9ATdg{4Zrih)}plA}t$C^aXs zB(rSc1h)9x)RM&b_=MZ6DVas7$t4L~tic6EnI)--g$yMN3mx|>vN4sU7Afv`c?MVd7c^%LXU58doH`x29dZ~X z6$JR><5N>IOY)223vx=+GxOpV9y67s7AvlJz^viex>(;q%%R!A-r*N>a%oYK;+lkD z2ZjUU%@Z3AJIr?wf6SfjAnwqw^x7fH(bPf6ft|BBFR>uLAhRMhC!x@R!9mKIF+obH zO({WfA9Ha@YC*ym=1E*_b`DAo%*<8!`MC)q3=E2l4g!vf3FZlU4!q0^3<{18%nq`N ze;o=QF>G^q>cHS2>!6z;%bZ@6neu=|l0j5KDM9i9L+_$>2U{HM82AsUFc)X!mp|Zi zcK)B>yuivK_W*-~or4!sep>MYaRvc}&5R8P9K;_mZeGawfMup*D1&ihs6&E-fkQiE zN~*G@^D6}t#`wyFXr`K*3WX7 z>fpkVqu`=uz)+NM>k+dDcWH5Id}>}J1#u2aK9=5-Fw9pqI_Su^s}^YaoPu{t`e zak=U!_JEn;LF54k28Z{~oDK^f{5|mC&;iFg&eIOdGQ_9ZJ9i!0?I5e%%#v7|Qxc!t zk+k!Gtm`}G#N4DzrHc)+YRXJG`9%rh%(G@n+8tnKV0glOB_)}8>Bl^s=Q_AKOyx>0EiTE=jZZ8}FHR74@nzA?QBWyX|H_b> zAn5$V!Q~-?jRS*&-7}tzEXhTwsd;J}9TXfh)w~>n*cljDoEaD{IXTR76meVoQuwOF zA_oS?CI$w@IJR?}ee5So+N9gM^*vx`I1ujgX}OH^wO8yu30-UlBwQF6BAgwf*g^vx z>?Jm6CWJ9CD5NFGvog$eW@vblAkVbrwta#)lW?|20=vUShglAH9k+W}FcmW>C>S&B zQDA2HzktEvfdhjBpTimlLk9*2TL)>EPY%Kkt`6)Do(|FudmN-4WgMg(D;=aAraDMF zcstlTZg)_Az|7!u(#hDNm_b}Y!Xey&!6Dqi*dg3O*dg43-67mT+9BK_-ND~M+JW0a z`T={fQ;~zPW2l2agP=l;LokDo0=vU>4-N-*$54lG_bvx^Pd$fZhsh4x9alK0JJ~p_ zcYWrtn?YK^-9h~UGlPRTgN%Z}1MSNW>mNj4cI1B`eA$s1Bz~De7A)>q3=+Q#5`XQ$ X;H2-Q?H$?7$_}bTf`WsbK{W~h&b{*; literal 0 HcmV?d00001 diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp index fc5be255ce..99c33c787d 100644 --- a/scene/2d/node_2d.cpp +++ b/scene/2d/node_2d.cpp @@ -346,6 +346,17 @@ Matrix32 Node2D::get_relative_transform(const Node *p_parent) const { return parent_2d->get_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 74612b3c6d..8efce33cda 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 4d9feb3af1..3bb64e54c6 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 fba6725610..c3c339ac5d 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);