From aa242beb73a1f6cf0bec2eb8dabd77b8f34f83bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20S=C3=A4gesser?= Date: Tue, 13 Jan 2015 14:17:51 +0100 Subject: [PATCH] - how to use PolygonPathFinder from GD Script --- demos/2d/polygon_path_finder_demo/.fscache | 4 + demos/2d/polygon_path_finder_demo/engine.cfg | 5 ++ demos/2d/polygon_path_finder_demo/icon.png | Bin 0 -> 3639 bytes .../polygon_path_finder_demo/icon.png.flags | 1 + .../new_scene_poly_with_holes.scn | Bin 0 -> 2609 bytes .../polygonpathfinder.gd | 80 ++++++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 demos/2d/polygon_path_finder_demo/.fscache create mode 100644 demos/2d/polygon_path_finder_demo/engine.cfg create mode 100644 demos/2d/polygon_path_finder_demo/icon.png create mode 100644 demos/2d/polygon_path_finder_demo/icon.png.flags create mode 100644 demos/2d/polygon_path_finder_demo/new_scene_poly_with_holes.scn create mode 100644 demos/2d/polygon_path_finder_demo/polygonpathfinder.gd diff --git a/demos/2d/polygon_path_finder_demo/.fscache b/demos/2d/polygon_path_finder_demo/.fscache new file mode 100644 index 0000000000..f699ca5849 --- /dev/null +++ b/demos/2d/polygon_path_finder_demo/.fscache @@ -0,0 +1,4 @@ +::res://::1421147952 +icon.png::ImageTexture::1420046079:: +new_scene_poly_with_holes.scn::PackedScene::1421147952:: +polygonpathfinder.gd::GDScript::1421146502:: diff --git a/demos/2d/polygon_path_finder_demo/engine.cfg b/demos/2d/polygon_path_finder_demo/engine.cfg new file mode 100644 index 0000000000..41c4adf701 --- /dev/null +++ b/demos/2d/polygon_path_finder_demo/engine.cfg @@ -0,0 +1,5 @@ +[application] + +name="polygon_path_finder_demo" +main_scene="res://new_scene_poly_with_holes.scn" +icon="icon.png" diff --git a/demos/2d/polygon_path_finder_demo/icon.png b/demos/2d/polygon_path_finder_demo/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0c422e37b0ea9e6ad2901c8d425cb12f4d37694f GIT binary patch literal 3639 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE|9QGNhE&XXIy*XF+OzC< zedt|Zv-e9}VspKxrDQ+(*z>j`ZL|0rCPtwrxeYbVZ^S(&^c(a$%1zdv@Rz6Z#&rfx zwb_xkXH3+MPd&Y>TSzr<&*uE8?Rh~#c{Cw7uyl3A@_gEnOc)2lO;b){rEQ0 zwM65=y-SDdS^qt3=G0@+C_SpD;-&c@>#u{i;QwuZKAp5TTc3GWUp}USL9s*4U2^uU z#Zj7zY|1wrUvliq86l3&t1CVzwy>`-e>LObiSz24f*0@n^X|RkhK2)g{{MC6$e&?2 zX=b6@rAW2MC$D|IUOoGXSv>z0_q3#G`e}Jv>)wZZ$;_20D%#Q?svSG?_yM81-G4rv zd_RjTLR+LiKW=I8;hw_R*QPHyq}Fz&YTM8E$NzT*-D^Gk$lU&Sw$0KBi!Qs~T<3jr zTSV=4r@ci*qGg`y#_y-c+s(Y(wEh3>s>O9L&$V3nakV*K_)>|9VnBmH>_1W4d5i@lp@qTKM}l{1Gy>D9}^2^RQSE@N{ibF5w_vLD`1f5uC z&ijv0AV6 zy6U2@-(=GtR>(2DdbRoRmUE%Xdm7qTB@18e<(~aINV)Eqr&Q4E*A~?aAMOm7V`6k- zzH!U-gXGGH-qq!%3a_@kz5JKK$|9bTxhG$+C*0iNbU))#kyD=qiWvSEH}X8!a=6T9 z@N&XQ@%VpTCo6>BAD;2F^@LmUo&Eo_dkVfB+IEZeaM0`%ezmu?*-rGF|M2vYZHwgc zl1c0#)6I_O>lEex;|o;2VqEZZT=9EjOaAhwnn(ZK z5K->rIUoK{;0#ySlNTcK=k8{1{hO23mbKL5r^WTF(|2tD60nussZH{!c>F)1+r@@U z+LnvV3wjYWX?RU)3!$E7sjRYoY4N6$ZRSeiU%>-E{TyMw$ECD?W?Og7hv z*}i>|iEr|!TN3MDe|)?+T}I~FgjsA}8#iq_6drG%qB7gY;BAJ)qsA99|bZ-4ZH^V&Ik6I&{Ff17pptjyFPQQy~&P7RWr8!O8DTF<9N z{P>fW-TgqvDY1ERb8_7JJ&zw4w6Bx4(_N{!^vOke`9#y4DM2Z2!7pw-IK;o6VQGh| z-{pY(xP3V^6Vg3c&S_2S*jiS{6RR%5_w`Bi<-dvB_Wk7B>t5yU z)w|Vv_S$`CJStXb)>yDEi1G|*DB60Zn49OoroTFc`+wiP9ryRPrQiRRp&X7|gLZD1 zUnk+k=){qA_41!Yt$FWWKA93U;~~cb{VnU5ju&1i^|be2IYnur&z3s#SG^0vwm54# zczNy&$>ZExk+V}O%bL$mvpZb6M|=6{+|%(}&z`?`sL+aeX4=CecOLODT=nX0 zOXU?+-O6WDwhiXJv!(dbN!?JyzaLVI=XjLldQZ~MjU(n_%3^EvUP}; zY2N+0kB@!v)!E(ndZ)#@-esA89!uoj_24Ug(Y6b_q#Vr;n6O z+duc8^rxN5HcKVu%djStXV0%%+i3HerM+d!q@aywK0f4}Zy)jGoA_s$x8fYFyhe*P z5AYv1zxVb>@XHB~*Ow|eYO4O;U8(g{YUV|ijV?VGI|XBoKh=nT@M3|()+p!8Tk_gO z6kdE#Wtf)wy*F*C+Rd8%hffxE`j{QP@kGPPVehpCF>4B@=wDb7Jw52#QjvyF%u}ki zp3B>M&+-`)r^!v{AKT2H2DNTApM69)kjwq(=k~5ozgJIL72>Ok2?lE3U7w z zz`r-p=FY-`4JRirj(zm9@ZI_QFL#PRU_0XSnU_bpg+EENc3!qwKG&PiuGhajuaM(9 z`Z)dm|^-u+%f?w!MIrX>Pv-o0NiMQN_b zM2?vmK|Fi5+xx7_6=<#UO03k|_Bv>*lt|a{lpy7`uS{aSik=FUE%r)Ene_6cWNTq*&|Z(-1A=Z&U?M#dX1jUQG>-TPJ&7sSx0F>eWL;I7y#4*wy(a&EJ$j>*wjqJLRmmjz z_%x=N=Zp_tG!$)Ib&Al*6N>se$Vq_zF~W3Y0Vtx zS8e(gwus((R_Yype7VQucr(&2W2hXUi0xGx?b>vx5>hr}y?R%v{@b zX+qT#@I{@V1v%N$l+<}cxvatTRaC(2*0A@^>9 zq@q$M&&x9w=5EKL`l@vI-#>VMB~wd6`D0P;HcDvo_5y(C*UvcozONH%zyI0QBa?qSoRJn8Wxl3Pk(gn?(j$B@RCS{ZD z&1*~A1iKQGZHsp9d(ETGt-BAF^9#g& zJbmn=VsF;Q#pm_(i#F^%RgpGlOJ>=b|7ZECU893Ilx7`^zxP*C^!T#8+a@{PZC4j0 zUd_C+I-*x=U9vFm-1uoTdel!!D>_ZINHlh{kWrNB65x|;`6{q1Z_Awfk#c^OuX#F_ z2#Bm@d%fDe?BZ*!iJ6aHx7V8%JbmVxQ6JpQX3@M&mWB8F!;7EF_c`Z0Ub@+739plf z-2V^pb6Bn>JLgWGdvN84tOXt)uAB;KKN>qN@8q_MPj9Mij=zhHzZ1;pRjF}4_2Y4+=b&Xf@UbZ}4{{Qku={v6cFYXy+AO7{K z-{yAAQbC$Cf{jl$g!* zLc{rY@S?pv{#*xdJ+!O7z1m{!iEnqrw=I4=fA#K4LB->%Hh=zSxm$Yuj>^|^mrtIV zA5&pbI;HxlQvUrv5Bk3z{1`F&grDn~f+z3U?2HyKDA;lO+dr|;r3I~Sd)96_r@t}t zS`Od*GL+Ypuz9d`ID>PE&L6|4)p3zMXwr54rp?aldbJ zzHZv3xKFpF>vr7!_s4Om&%1)@k1opP$)C65nAN^)R^x^3FH@dPI{r-LRH>#+PN2n& zN2UUOs-5cYo=1XRoDz9_k6$n`QM|~cf4?u-wc>`?!z!-Zr5j?W@4CAn#BO1X&7wHH zE%OAO;#?~}_#dCQPOWZI^JK=B2_ARth(~Q|LLxZdBQr~_BBUu z-MqZm{_Vw^^8{r7M+L;j+gY5mwc?&|`u)E;CF`&Ec--Y?JoNabmCk9ex@5BCnSv*_ tAN)`2&;L{Wd+$EIU+16x`17CfrBCa>O@Dv-F)%PNc)I$ztaD0e0st}18>9dL literal 0 HcmV?d00001 diff --git a/demos/2d/polygon_path_finder_demo/icon.png.flags b/demos/2d/polygon_path_finder_demo/icon.png.flags new file mode 100644 index 0000000000..dbef2209e8 --- /dev/null +++ b/demos/2d/polygon_path_finder_demo/icon.png.flags @@ -0,0 +1 @@ +gen_mipmaps=true diff --git a/demos/2d/polygon_path_finder_demo/new_scene_poly_with_holes.scn b/demos/2d/polygon_path_finder_demo/new_scene_poly_with_holes.scn new file mode 100644 index 0000000000000000000000000000000000000000..07838be41e7fe99e105e6f5b4d6490ecafa276d5 GIT binary patch literal 2609 zcmWFvc6Md}0RaYv_o568vg`~DKbRO87#SEE7#SEF*b*2RcobN<0uqz6Q&WPIQ}a?4 zcpsQDFz6}RCB!rEDRA%z8E~XC~#OG6*XuHwZGN zrlh7kU=ria%qvSRDv3`^OinFk;D5lN%Tk(GoRR3D$-w)7L5Mv+FTNzd zfI;j5g8)ZPW_m_RZel^af+S06nGu8d0|rUK z#N1+ig%-BFl=$5Il+*{zqMRwI1tl5rDMg9pAYM*pUTS=KW=cs$Lm5kEMQTcX!#S?f z;?(%WoPvx*1{sCu2kepx4NUn(@d?e04AKv{rlo~Q5m0?UzD4eqwqV?Xu(b9l+3g=1$jmW0R`g)LM+7vsmY~^+z*(A zIa6~pi;FY!^B6=PaH=!Mr&bg^WM<$@Ni9jt%!$vUI> zzQgth>>^C@CCLeoA25n1>`cmdz$WaV<;4GhLF^%e3WMka=G+6K4>?ZDtN z?*O;M(gWNsCl7EtZaBd0c+qJ;GXq0|{R3uZrwI+>511Jk8|+=}9mLsY+<0N9a$EKR zgRz6K!)zuE28P6^4zn2;6!e{{9K;kmXT$SDXM5ND8A;65PEsKD@mQJg^$#AZ-Z;69+w zpbTcKfJs#_sRkz1L8PPb0dWS+2TbBl#s|b1v>z~uJ8pmUHI{)v@gb9mfce6&3=NOG zV;Srpy^nR#eaT$sJd;tEp}Eqf)n%c}Oolv72ZrKgW@mYq$qd1&UM{a)l3C(2a|`k{ z)fI#oGSc=Q5MU`OO3W)x*LKm$EMv*c$teeV31==DxlHj%iQ172@mbxeoDUf69xzET#H+7oiqA|*e9aKx zc+l|&gR|lX#-hYD*@p~A81&QC({kAgit@8klS@2TxGrEy%P&i?W6Vp{Jewe(!0r^y znw^?j5TEF=mZ2oclr6cms3q^ za}a0bW>D~A%FoNwI>k_`;LE_Qz~{hlK#Czx+x`KQl*0rEDR(=@vP2~&ro58kL?1VQ zx5)<>9QYX+RCr-2$=%vvn(J-{c1N2RvbAn^9d2L=Zz2WEyUrRKyO=1Xpp_6`D$1x~FGICLE+GUcZg zXB=T)w%z>5kuC2JI~X`HC+IlTcsz6vaNuSzZs>4Qb`bJ7z?71jmULa|7ek4%sY4J` z%}s@bat9@bDyJp~5oQL4U(O)qPRkwGnHd;NoE(H5l9}>xad7# zC`vRv*ydT|sPKsS`$OhXhvyFRsxgci`C9vwYacMnIjmtU$ZxiKz|8PK&L!5PcwZz=6R*?}6e0rjm?&_VoO`#2f}Dh6V-(Rs}W&76oROg8X6z9tHLX z%nS@t3Oo$#3d|1544ew=>?xVW5QiFo3KRzi2@W;}28N3GqWqEtq78arhjNHQ9Lb!T zms<3IrIA5E!Hf@7Ex}SvYF^0$7I_B#1@bKUMI{;e59|&we|~k!@qzpS=G*)y?H#lq zq#tl7X5dr!%>oLm0);6v*CSfm}_uvF!xCKe?zF`qqi#@3;lfmgx%z)WUPrJP{oz~CU`ctJrXVWX28 zV|+z|HItQFVM05Dgo3(Qe0*w3W=Vcgd{Jp$d~s??NoHPpaeREzRHwZTZVpqql1qzA z@^j-8i_(h|gdGmE>gFh@6elaCB?vlhb#QseVB^5xV8R$yn?@4(M}OS;10pRJl>_3>2>4dILhP7dsjUf?8o!pR|?>HmNJ zgm?!Ahk1?_40%d|OvMZe3PKEZ3d{`u7ceMrB``SfIcPfcIxsk_b>MdJb>Mc0b>MbT zcHn-%%;5aXA<@Cvd4Yqu1A~LP12+gWa43j4*gK{<@H;j*m@{xIh&%8*E^%OY5^xB1 zy5PX>#Oz@05beP3sO!MaAf#aKz|J7NfZgecL-Ye?1_yfvQ3Zhq+Or+zKM0=9Af_jU9rRtx9JLvw71SNI8DtdL9pf2f71$lc m8RQh$9jzJUL8JqNgS=xgb8>!OUK1}nsC^g|9OMjYECK*5${QvC literal 0 HcmV?d00001 diff --git a/demos/2d/polygon_path_finder_demo/polygonpathfinder.gd b/demos/2d/polygon_path_finder_demo/polygonpathfinder.gd new file mode 100644 index 0000000000..a0e71dd127 --- /dev/null +++ b/demos/2d/polygon_path_finder_demo/polygonpathfinder.gd @@ -0,0 +1,80 @@ + +extends Spatial + +func _ready(): + var pf = PolygonPathFinder.new() + + var points = Vector2Array() + var connections = IntArray() + + # poly 1 + points.push_back(Vector2(0, 0)) #0 + points.push_back(Vector2(10, 0)) #1 + points.push_back(Vector2(10, 10)) #2 + points.push_back(Vector2(0, 10)) #3 + + connections.push_back(0) # connect vertex 0 ... + connections.push_back(1) # ... to 1 + drawLine(points[0], points[1], get_node("/root/Spatial/Polys")) + connections.push_back(1) # connect vertex 1 ... + connections.push_back(2) # ... to 2 + drawLine(points[1], points[2], get_node("/root/Spatial/Polys")) + connections.push_back(2) # etc. + connections.push_back(3) + drawLine(points[2], points[3], get_node("/root/Spatial/Polys")) + connections.push_back(3) # connect vertex 3 ... + connections.push_back(0) # back to vertex 0, to close the polygon + drawLine(points[3], points[0], get_node("/root/Spatial/Polys")) + + # poly 2, as obstacle inside poly 1 + points.push_back(Vector2(2, 0.5)) #4 + points.push_back(Vector2(4, 0.5)) #5 + points.push_back(Vector2(4, 9.5)) #6 + points.push_back(Vector2(2, 9.5)) #7 + + connections.push_back(4) + connections.push_back(5) + drawLine(points[4], points[5], get_node("/root/Spatial/Polys")) + connections.push_back(5) + connections.push_back(6) + drawLine(points[5], points[6], get_node("/root/Spatial/Polys")) + connections.push_back(6) + connections.push_back(7) + drawLine(points[6], points[7], get_node("/root/Spatial/Polys")) + connections.push_back(7) + connections.push_back(4) + drawLine(points[7], points[4], get_node("/root/Spatial/Polys")) + + + print("points: ",points) + print("connections: ",connections) + + pf.setup(points, connections) + + var path = pf.find_path(Vector2(1, 5), Vector2(8, 5)) + + var lastStep = null + print("path: ",path) + for step in path: + print("step: ",step) + if (lastStep != null): + var currPathSegment = Vector2Array() + drawLine(lastStep, step, get_node("/root/Spatial/Path")) + lastStep = step + + + +func drawLine(pointA, pointB, immediateGeo): + var drawPosY = 0.1 + var im = immediateGeo + + im.begin(Mesh.PRIMITIVE_POINTS, null) + im.add_vertex(Vector3(pointA.x, drawPosY, pointA.y)) + im.add_vertex(Vector3(pointB.x, drawPosY, pointB.y)) + im.end() + im.begin(Mesh.PRIMITIVE_LINE_STRIP, null) + im.add_vertex(Vector3(pointA.x, drawPosY, pointA.y)) + im.add_vertex(Vector3(pointB.x, drawPosY, pointB.y)) + im.end() + +