From 2580ca01e6b73a54def5a8f6e61d19509d3278ee Mon Sep 17 00:00:00 2001 From: reduz Date: Tue, 15 Sep 2015 22:07:03 -0300 Subject: [PATCH] Ability to keep collisionshapes and collisionpolygons when running the game. Works for 2D and 3D These are still just helpers in case you want to animate them or access them directly. Modifying the real shapes is still done via CollisionObject and CollisionObject2D APIs But an API was added so you can query which shapes from CollisionObject correspond to which CollisionShape. Have Fun! --- demos/2d/dynamic_collision_shapes/ball.gd | 21 ++++ demos/2d/dynamic_collision_shapes/ball.png | Bin 0 -> 321 bytes demos/2d/dynamic_collision_shapes/ball.scn | Bin 0 -> 1898 bytes demos/2d/dynamic_collision_shapes/box.png | Bin 0 -> 253 bytes demos/2d/dynamic_collision_shapes/circle.png | Bin 0 -> 889 bytes .../dynamic_colobjs.gd | 23 ++++ .../dynamic_colobjs.scn | Bin 0 -> 4348 bytes demos/2d/dynamic_collision_shapes/engine.cfg | 4 + demos/2d/dynamic_collision_shapes/poly.png | Bin 0 -> 1638 bytes demos/2d/isometric/dungeon.scn | Bin 2841 -> 8743 bytes demos/2d/lights_shadows/light_shadows.scn | Bin 4293 -> 7181 bytes demos/2d/platformer/stage.xml | 56 +++------ scene/2d/canvas_item.cpp | 9 ++ scene/2d/canvas_item.h | 7 +- scene/2d/collision_polygon_2d.cpp | 84 ++++++++++--- scene/2d/collision_polygon_2d.h | 12 ++ scene/2d/collision_shape_2d.cpp | 64 +++++++++- scene/2d/collision_shape_2d.h | 8 ++ scene/3d/body_shape.cpp | 75 ++++++++++-- scene/3d/body_shape.h | 14 ++- scene/3d/collision_polygon.cpp | 110 ++++++++++++++---- scene/3d/collision_polygon.h | 12 ++ scene/3d/spatial.cpp | 25 ++++ scene/3d/spatial.h | 5 + scene/register_scene_types.cpp | 10 +- 25 files changed, 436 insertions(+), 103 deletions(-) create mode 100644 demos/2d/dynamic_collision_shapes/ball.gd create mode 100644 demos/2d/dynamic_collision_shapes/ball.png create mode 100644 demos/2d/dynamic_collision_shapes/ball.scn create mode 100644 demos/2d/dynamic_collision_shapes/box.png create mode 100644 demos/2d/dynamic_collision_shapes/circle.png create mode 100644 demos/2d/dynamic_collision_shapes/dynamic_colobjs.gd create mode 100644 demos/2d/dynamic_collision_shapes/dynamic_colobjs.scn create mode 100644 demos/2d/dynamic_collision_shapes/engine.cfg create mode 100644 demos/2d/dynamic_collision_shapes/poly.png diff --git a/demos/2d/dynamic_collision_shapes/ball.gd b/demos/2d/dynamic_collision_shapes/ball.gd new file mode 100644 index 00000000000..c17b20f9c87 --- /dev/null +++ b/demos/2d/dynamic_collision_shapes/ball.gd @@ -0,0 +1,21 @@ + +extends RigidBody2D + +# member variables here, example: +# var a=2 +# var b="textvar" + +var timeout=5 + +func _process(delta): + timeout-=delta + if (timeout<1): + set_opacity(timeout) + if (timeout<0): + queue_free() +func _ready(): + set_process(true) + # Initialization here + pass + + diff --git a/demos/2d/dynamic_collision_shapes/ball.png b/demos/2d/dynamic_collision_shapes/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cf71da29149ec0e8e8a640405c7116e68be976 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE{XE)7O>#J|`caxR~WG-m5?%$r9Iy66gHf+|;}h2Ir#G#FEq$ zh4Rdj3a<7&Yz2)>Nh^hKkRk>`bQR)1I&J>m?t!3+_rgDx7jGZLAxL!UiiXo zv-{=@hWCH?-sLgOdUL#e`gb+U+h+Z}B2JBxFL@b^4+QJ2XI#hhz+^#G@2%pMY`h+# z4NDjU!<-LFJ!YCv@r|{iuJ6mI&Pi+DomQFb_wbomR^QA2Rm^+a3@@c!_PPOdG=rzB KpUXO@geCxv40Rv? literal 0 HcmV?d00001 diff --git a/demos/2d/dynamic_collision_shapes/ball.scn b/demos/2d/dynamic_collision_shapes/ball.scn new file mode 100644 index 0000000000000000000000000000000000000000..e332de276d8698b527041c4c478758606b154b12 GIT binary patch literal 1898 zcmWkv4Qv$G5uW`y-`Qtl8`~IcAAWbnm=w(MS7`Y2?A^uSs!7oqLVz~=_V(VLH|*_R zcK3`;3O>8I{In!MXcJJpX{}(>g=MyCX?Z7l z&we>+@yn@#k=9w7zK)&HOCz+CD8Z%CXiCxbx!E)XNM~Rz8*mC1gK83V`4FEsva|~- z$P`gGRYfO@`S~y#?-Fo@27Uo-7;C`s%D85!I_vFI@@zqZO4tG-S%@GdFerR9_Bl!m zCxk?)1DePz{H;_EWh5vCc^e|69KuAv737pM5=d%UEgdt{gG9qqm70++IMKYOZdOuy z@dDVmOR%H!qBNi+X*o`=a4f~JGp3b;TJng?PZ70jmRYpES~YcDvo+I*>dGLqY?^Vo zdLgISo9R&@XQo*(z$><`><}}SraI(1^aEeYEEpDQb=*$yXp29wFak?VqH zIE=LLj%m@3O4T$R%_x`!TUOJ>4pKWwQ5{>hSl+Z8mWCQ!QEU+9oM~vdECxPXXDqLU zOVUe%su(h@p>w%@7Cujgd{JF9m{PpqLY=4>*@8~$p@FRTrIlP>HY1K;X=zsKgeh)d zYH5LVXJq8MxVucwF-MVQMfBNuOLG{lfZk#SE}DQHLNssMsePQoM)pYuA%1!YdZqWm zH)A!*@#43RybSf^8NXb}rxl0EG!%Z2PqP7Kf9wCy6j#nKeRv0*x?$1|}@2r!k17{ruxS@e>+3tRw~3*z^% z4gCnQivXmx=y$oebgBf!X0G@)s--3I`#hazxoHsQd6}hSqEF82g{&6-3Y>5a*x~K2 zFbn4hlA+~jJ&t0HG9&V7d@-Izz()LGxPVS7{SxnPf2X zH5ra>-l5Z6*y}Sh8JjtDs|Vl*iN$n=VE36@-12zhMLK6U_EW#NTol7P925FAwj~iB8N+tz?RS!~(_C7MG$r<93-58SjK(*@ z06sC+P%K~r47z~^Oteo0XXe*n(JSMt69*~_Hj|mruUV#%V{IF+3v2Kew$3PteP-4) z+TVAD>G)K_FHLa;a5t2^T1NM7$^D=tU5)?ZOsHdi#~blI<0moH_G3{g=#H%JN*ykR zx>Z5RrL@R}VrXUv^p0O+qj31pw3Q{{9x(Ow`0g9NwWXfeRXPpKnWsS8(Nt=V8?ZHd zC|)6ac>eqf{2f>2CC(wiwz4VutVeQ7JW1Z9uf>mX@&H}NFYSJu?(Cj-6Q*)jq5Wx& zIkPrE_T9$#cI?KVAKN1+R@SCPyQHZOMumqcOILBQAtLBVj9BgXAo9R;HK^`aZ@aStGc(K+B3&1idS$m z{v9`a3@837-H#XXBs7y2+zBnjU)os$2zhP=oQ)r?-X_&SD{1teA&N&m_wV6PSG&VK zp43SJ19%|d^c8X`L(z1afV-r*Z1=-kgRN(K z64Khf;m`hZvSJ)-Mkfwk>r1`bAZ}`Y;q1)n7v}D3eR$4^+F&&O^v_23zE!z%^xx}` ze|4ixKcO|f|A*rC;i0xx2yvf!@xW64V^%%uxj%>g@z`7Pm6n%!Zhe09L}Yuh^~13K z)a=^%7vH>k>9fn)pMo_np1r;8#G2z5_uRfVd~i{_@7r|??>qSlsjA#I{4eF7=N_4p zslD)D7w-?Q|7Q7@-#>b0=-mI7d>0=rt1UhWjyUEDkJHH&mxYz5mv#K=Kij9<WY9AHR?Q6yYrJ zh%9Dc;1&j9Muu5)B!GhKC7!;n?DskO_(auoL*st~g(OQ{BTAg}b8}PkN*J7rQWHy3 zQxwWGOEMJPJ$(bh8~Mb6ic&pY978H@y}iK5$Y8+1yx^zBxA)6!^;{NQGPZp4)Pj+T kg+oBWp@D${#)oFs+dr9Bv}_Ok2DFgD)78&qol`;+0I5Mc)Bpeg literal 0 HcmV?d00001 diff --git a/demos/2d/dynamic_collision_shapes/circle.png b/demos/2d/dynamic_collision_shapes/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdfa550b1c7f8a18cdf63a49bda70c73ea47e8f GIT binary patch literal 889 zcmV-<1BU#GP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00QAjL_t(|+U=W9NK{c2#(xDu z1PLt;O)a{)E1^H2M3K|Jl?iPu5P}j7SJ5^h+eWJh(ZH38AXuyRO=5(L{(!l&+oFuK z2oxf4(_(H=FLDRC33NB; zfh_}5PW5S10q`RCfV;raT`Jvgz+r#io@0KCXS;7N#k zGiVAJajHKX4#10C0-o*RQ?HbUTTXScVF0|ybzr*5|JrXj)tRIh@2|o9PzuZgOow~@ ze+lp+w}FY2z2pr#)yW+L@FG`%g_OSO_Bqw(bp!AsoxmI5P)Y%80vDX>O1)#ic#6#v z?tQ$jLC}jl0P-1_@a2P-R6iz7z-R`i{-cQ!;6-|XLPpm=@=o=2 zwFHciU5!*sfEPIqc(N_$RKJuaKNX$U}P3_yn=039&^IYR()F#zp`0JO&dv>5`>76Y(l2*6ehz=k0J8!-Uu zh5)R`0IV4TuoeTbVhF%W48XD>0Lw7|1w#M|+W>^=;gSLKOMj-qr3nCdVF18C9!mkt z8UQd`7C=}moXfEJxxW`gV+nv_>q}O(&D%BrVdG#vgXZT;H$}=N0AMVG0HU6v0Kz6> zmLQD9Hb$X(gTyP+zgk>ys+Y@sSgk=~h+>yTTD2KGP#1vES~8Gg00WiUW0E9*&}1~2 zLi2;w8l(~d2oNTL;S`x4PSPS*br6gUigr6iLlS0y9*TXr&8AhLrxx=y0|*cnfi8+2 z+RdUVpsUtK>6%L*QW7@L3q(NJJTVdhVe`yT1cc2~V`X48^|`^8S~9NR={Mz<6?sL@ P00000NkvXXu0mjfu6%4` literal 0 HcmV?d00001 diff --git a/demos/2d/dynamic_collision_shapes/dynamic_colobjs.gd b/demos/2d/dynamic_collision_shapes/dynamic_colobjs.gd new file mode 100644 index 00000000000..a6a42a1914c --- /dev/null +++ b/demos/2d/dynamic_collision_shapes/dynamic_colobjs.gd @@ -0,0 +1,23 @@ + +extends Node2D + +# member variables here, example: +# var a=2 +# var b="textvar" +const EMIT_INTERVAL=0.1 +var timeout=EMIT_INTERVAL + +func _process(delta): + timeout-=delta + if (timeout<0): + timeout=EMIT_INTERVAL + var ball = preload("res://ball.scn").instance() + ball.set_pos( Vector2(randf() * get_viewport_rect().size.x, 0) ) + add_child(ball) + +func _ready(): + set_process(true) + # Initialization here + pass + + diff --git a/demos/2d/dynamic_collision_shapes/dynamic_colobjs.scn b/demos/2d/dynamic_collision_shapes/dynamic_colobjs.scn new file mode 100644 index 0000000000000000000000000000000000000000..e6d1ebf9cfd05ef4ad6129fc90f81faa1d128cc7 GIT binary patch literal 4348 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 gPXy$#-Mc$B(^7OTZe1SOF*x@2T{6g=>Px# literal 0 HcmV?d00001 diff --git a/demos/2d/dynamic_collision_shapes/engine.cfg b/demos/2d/dynamic_collision_shapes/engine.cfg new file mode 100644 index 00000000000..536b75f2f2a --- /dev/null +++ b/demos/2d/dynamic_collision_shapes/engine.cfg @@ -0,0 +1,4 @@ +[application] + +name="Run-Time CollisionShape" +main_scene="res://dynamic_colobjs.scn" diff --git a/demos/2d/dynamic_collision_shapes/poly.png b/demos/2d/dynamic_collision_shapes/poly.png new file mode 100644 index 0000000000000000000000000000000000000000..49ed55cc7ddb48761024730efd8f2180c38199ea GIT binary patch literal 1638 zcmV-s2ATPZP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00quTL_t(|+U=Wdh*eb-hM(}f&m@Lqwg3&Q^R4_~WFe(ZxN+aUxFZEAN1d<M$wF*QAUuFr4?k; zhbbh1WVx%k<5=03CHax!?0%d*F^+d;&OK+JbI+YwFWf)(eBHg?_pJTywe|&pKp+qZ z1OkCTP(IKWr7bJt++&c0v24k&0A2tVivR{5`GbKC!2Lj5oO@MDILnUwbAUI2+3u^n z2w>olKMZ&WnBL`U$p8a{{87Mrz~pX+L;wST{PDmxKo>Y1YYGq(n0@kVfR-M}kDUQT z0NEygD)2Edx`$Iv06&WW`X~7}03QOwdpWJ$C^`}oK-?;mATs&$fp>v(`#7~N?z8&J z0E@MyQ7B23{3XC9pen@a`J@Gq2XZ2U)W}~3yjsNSEOrK{45_f3wqO)1G8nXK;2Gdr zpc!Z~ieJi%cm+HGC$dm}&T)7jtvfH5wpblsP4roiWw$!<|ENkRggI|>|nvQ*Q7 zwhRScr1&=Ix4>&|iuf@DIB+y39u2E<~cxzfrp&&YH+E1 zdV-=jNKn;l0_vSWlBzx)bwwbXh5#yoV?^6O*sBP%WdZOCaK7gNeF5BI6yFzEhRt_k zn3faDi(D#zlO_8O0)PsREt`mU<4%Nnj1oXcVVHtjQMwHv`v{nHaVj zMSYqA*bdBy@tprNfwoK}DCbV`9F$h~)_)qoe2xL;xT#_`+21Ywl2MTxNT;E)h~UN% zKu%kZ13v)I14BFqEMRbd6F}Hq!TAin1s?&Ee3D;441XF$vr#m-<>_6(8_tE7 z68V8FfKH<~)1~fIU=)X(7;XVZ0P}$LkbXPaX9fss0w)4{GeG_~!0kryRaVsK_9WK1 zX<`A%RQ?>xi5M)84B zEF)+n%>bT-*jv`U@{m;l90!&IvyI{>${a><$|zc#7{+uFLzJ<#`TT8_85F=C;5MW9 zntljZqHY0NwB-?kp2S>&lJtbM1(2l-VBK3$+h55qAchW?8CDpDCisuT8em^qJY*#U z90cw*iY*La7{wl!0at6w6>c?gD{xs-8K9U|z+{5mI==B1aGz29fuOh8FLa-2M)7wk z1TYLZi78*rylY?rY2Lje@X4%Y)Wy3Y>aL7(PDAP@)y0)apv5C{YU kfj}S-2m}IwK+re-1B_q1^F)uk%m4rY07*qoM6N<$f`h})5C8xG literal 0 HcmV?d00001 diff --git a/demos/2d/isometric/dungeon.scn b/demos/2d/isometric/dungeon.scn index 64efc257c0ca1158e2494f950a36306dd9d9bd75..e03a3bd3ddd7ec7cd07c12468494ad79d42d6e31 100644 GIT binary patch delta 8142 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 literal 2841 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 RW*r^N27&7W8FT+I{6BmIBR&8C delta 3325 zcmZ8kYj7LY6+Ww#y|SG|b{s$D$CYKrP8{2L8xmrjmE>0(;?#x#l1_J5(%M!cYlT*J zVw;X+LK7083>eBIWg;e|vik|`zt;=qCm&$L8h~km`dI*>0DY4jaLH^LU=hp8 z-Jt~bsKNe#8d2F|V*@||Ym+75nT>C51`B52*LS&RHC!hSF);Wd%Nlsp$Stz0g>&K& z6KS-pgDkvZ!O5?O&Dm@z16ayzos7Ip2_BQsDk9w zHp_>JY#nN7hdUULMHauJ|L9}bUN=*_w!Kl1Lc>ul7MIin6tafg(U2bUhr*%wSc{y? zg;hf+=C!C2U{xHH8d*(NT@4RNX@~c7xh>hPMy%4XqVEa(BXIh2Yr^0PEHN!Eze63+ z>uv@$xXd!%GM)(ft>Y~*HC&tGMpb{MAW6e&T#=+e*s2WsLu&0h-?kjD5*bzW>$Ttr zYXUWJ)*8^lS}b@g=O0v>`Tl4u#2nryxwv}3>-)5RvM#e+7W=ZafdO5O%eh$t;ZRf> zGPqnAm9OPT2V#mijO{R#%JX?P$hmTFeOvMl?6t(y!S?TqZzOZAQcMlR&G}CIZ5hju2veu{u7vs@=Q)rRr?OjdJ6px)Eowxm z`4WQ4^S5grt3@C2*Bo#@;$5*^w+^Z;L#jA3`I4N^k4wX$$KOobIc1+bnY3HO%9t9H zUEU`QYoTGSuek$;*;1D?!~Ggs(m(M&Jjtvr{*i$Jwu9G0<7z-n6?3Z2wzOrBgyW%T zI8;*&1+F8hGK0H0$XmjiUvB-YXNmm8f_4jALQ@PJVl{G^0rwpL z#hE&6^K6uBIen;Zn_=^MJaScPQwa{I0o!n^MH|rN65*c@E7Q;IEcQ%Avx^h1@?Zkj zbJCc+i@)v9%#Bs%RtA(9Z3W=+&|%`L?JF&wv z#05jnzjKkm!B&8kC$O~Re%OZ-@>=4(2*wOs5&9s^e9ea-CV%8Pgw4L!@yxNopVkw@0eTMA>78zq{JZf7)WzJ+J z%D&B(hP9vyJSzZ>@#)IEpgN#X21()2;Lv1ix)PSLI^L{5&fa8YmNa!ha3vIfx?9{S zmt|?O5b4RVI>binctllV%1!*+Z@skzdtfo^Nk78tu|dDdD^`f_vI_ZGae|Zf$(t>k zI&PH@LMf{+{!W{*5fY{vkB1_Ix+E!o^lZisd@wgKqQ|viNr?^Wav@G0IAF(pXWEpT~r{nf(CLb>QO2n0XjccY2Kd~6u5xFfrhRwKNH&H(b+rm%&eG>?cJR z?ehpGKy3BQppG+!OUKPdi7vJxpXq7EO9-AzmTCZbT0CY>^cp48xC>8%lLgMSrUj9Q z8dj2NbbH7%A#O$<6P{{ZhtG*8J)N`b_IhZE%w9L=f=rWJ z$9_KV>)GA}z0ShuI@8yFkw*J2UO|?dNT-XC&U>#Q^(NA_E7R_#QdCNr2t4Dd9`k0N zQoi!Agv>#f*FeJV%M_p9M} z(M0H=TM6@CWp331R<(e&)7@u|YcjEphiH_~jgTP7(hM-SDuFMW(dKE>2gR8N&llm- zTni*8y8640A$0Y0X`~njZA<#I+Rwj3ozgLGVuy@O?&YnB0hlvhje{k z;4e|am0ZG$TMIArTuRS?haCYi!Fcv2%=dhS&me%8S@9hBDC}8iXF|6G9Zcw|hfXGR zd<9*EUxIFGH^WvYw4a3@Ciu*>^|)Xg%V)c18(iKa8NS7{2cHpV-a0z#aN+*heiuE% z?8~n7%xsGbu6NpIOI+e}G*3L5fbA^5riLc^@@9FLSDS5gd8&~=-`nY - + @@ -16,22 +16,12 @@ "conns" "names" - + "stage" "Node" - "_import_path" "__meta__" "tile_map" "TileMap" - "visibility/visible" - "visibility/opacity" - "visibility/self_opacity" - "visibility/light_mask" - "transform/pos" - "transform/rot" - "transform/scale" - "z/z" - "z/relative" "mode" "tile_set" "cell/size" @@ -49,6 +39,8 @@ "coins" "coin" "Area2D" + "_import_path" + "transform/pos" "coin 2" "coin 3" "coin 4" @@ -129,14 +121,9 @@ "margin/top" "margin/right" "margin/bottom" - "focus_neighbour/left" - "focus_neighbour/top" - "focus_neighbour/right" - "focus_neighbour/bottom" "focus/ignore_mouse" "focus/stop_mouse" "size_flags/horizontal" - "size_flags/stretch_ratio" "range/min" "range/max" "range/step" @@ -145,19 +132,15 @@ "range/exp_edit" "rounded_values" "text" - "align" - "valign" "autowrap" - "uppercase" "percent_visible" "node_count" 67 "nodes" - -1, -1, 1, 0, -1, 2, 2, 0, 3, 1, 0, 0, 0, 5, 4, -1, 25, 2, 0, 6, 2, 7, 3, 8, 3, 9, 4, 10, 5, 11, 6, 12, 7, 13, 8, 14, 2, 15, 8, 16, 9, 17, 10, 18, 11, 19, 12, 20, 13, 21, 8, 22, 14, 23, 14, 24, 3, 25, 6, 26, 4, 27, 4, 28, 15, 3, 16, 0, 0, 0, 1, 29, -1, 1, 2, 0, 0, 2, 0, 31, 30, 17, 3, 2, 0, 10, 18, 3, 19, 0, 2, 0, 31, 32, 17, 3, 2, 0, 10, 20, 3, 19, 0, 2, 0, 31, 33, 17, 3, 2, 0, 10, 21, 3, 19, 0, 2, 0, 31, 34, 17, 3, 2, 0, 10, 22, 3, 19, 0, 2, 0, 31, 35, 17, 3, 2, 0, 10, 23, 3, 19, 0, 2, 0, 31, 36, 17, 3, 2, 0, 10, 24, 3, 19, 0, 2, 0, 31, 37, 17, 3, 2, 0, 10, 25, 3, 19, 0, 2, 0, 31, 38, 17, 3, 2, 0, 10, 26, 3, 19, 0, 2, 0, 31, 39, 17, 3, 2, 0, 10, 27, 3, 19, 0, 2, 0, 31, 40, 17, 3, 2, 0, 10, 28, 3, 19, 0, 2, 0, 31, 41, 17, 3, 2, 0, 10, 29, 3, 19, 0, 2, 0, 31, 42, 17, 3, 2, 0, 10, 30, 3, 19, 0, 2, 0, 31, 43, 17, 3, 2, 0, 10, 31, 3, 19, 0, 2, 0, 31, 44, 17, 3, 2, 0, 10, 32, 3, 19, 0, 2, 0, 31, 45, 17, 3, 2, 0, 10, 33, 3, 19, 0, 2, 0, 31, 46, 17, 3, 2, 0, 10, 34, 3, 19, 0, 2, 0, 31, 47, 17, 3, 2, 0, 10, 35, 3, 19, 0, 2, 0, 31, 48, 17, 3, 2, 0, 10, 36, 3, 19, 0, 2, 0, 31, 49, 17, 3, 2, 0, 10, 37, 3, 19, 0, 2, 0, 31, 50, 17, 3, 2, 0, 10, 38, 3, 19, 0, 2, 0, 31, 51, 17, 3, 2, 0, 10, 39, 3, 19, 0, 2, 0, 31, 52, 17, 3, 2, 0, 10, 40, 3, 19, 0, 2, 0, 31, 53, 17, 3, 2, 0, 10, 41, 3, 19, 0, 2, 0, 31, 54, 17, 3, 2, 0, 10, 42, 3, 19, 0, 2, 0, 31, 55, 17, 3, 2, 0, 10, 43, 3, 19, 0, 2, 0, 31, 56, 17, 3, 2, 0, 10, 44, 3, 19, 0, 2, 0, 31, 57, 17, 3, 2, 0, 10, 45, 3, 19, 0, 2, 0, 31, 58, 17, 3, 2, 0, 10, 46, 3, 19, 0, 2, 0, 31, 59, 17, 3, 2, 0, 10, 47, 3, 19, 0, 2, 0, 31, 60, 17, 3, 2, 0, 10, 48, 3, 19, 0, 2, 0, 31, 61, 17, 3, 2, 0, 10, 49, 3, 19, 0, 2, 0, 31, 62, 17, 3, 2, 0, 10, 50, 3, 19, 0, 2, 0, 31, 63, 17, 3, 2, 0, 10, 51, 3, 19, 0, 2, 0, 31, 64, 17, 3, 2, 0, 10, 52, 3, 19, 0, 2, 0, 31, 65, 17, 3, 2, 0, 10, 53, 3, 19, 0, 2, 0, 31, 66, 17, 3, 2, 0, 10, 54, 3, 19, 0, 2, 0, 31, 67, 17, 3, 2, 0, 10, 55, 3, 19, 0, 2, 0, 31, 68, 17, 3, 2, 0, 10, 56, 3, 19, 0, 2, 0, 31, 69, 17, 3, 2, 0, 10, 57, 3, 19, 0, 2, 0, 31, 70, 17, 3, 2, 0, 10, 58, 3, 19, 0, 2, 0, 31, 71, 17, 3, 2, 0, 10, 59, 3, 19, 0, 2, 0, 31, 72, 17, 3, 2, 0, 10, 60, 3, 19, 0, 0, 0, 1, 73, -1, 1, 2, 0, 0, 45, 0, 75, 74, 61, 5, 2, 0, 10, 62, 3, 63, 76, 64, 77, 65, 0, 45, 0, 75, 78, 61, 5, 2, 0, 10, 66, 3, 63, 76, 67, 77, 68, 0, 45, 0, 75, 79, 61, 5, 2, 0, 10, 69, 3, 63, 76, 70, 77, 68, 0, 45, 0, 75, 80, 71, 3, 2, 0, 10, 72, 3, 73, 0, 45, 0, 82, 81, 74, 3, 2, 0, 10, 75, 3, 76, 0, 0, 0, 84, 83, 77, 3, 2, 0, 10, 78, 3, 79, 0, 0, 0, 86, 85, -1, 7, 2, 0, 87, 80, 88, 14, 89, 2, 90, 81, 91, 2, 92, 14, 0, 0, 0, 1, 93, -1, 1, 2, 0, 0, 53, 0, 84, 94, 82, 3, 2, 0, 10, 83, 3, 84, 0, 53, 0, 84, 95, 82, 3, 2, 0, 10, 85, 3, 84, 0, 53, 0, 84, 96, 82, 3, 2, 0, 10, 86, 3, 84, 0, 53, 0, 84, 97, 82, 3, 2, 0, 10, 87, 3, 84, 0, 53, 0, 84, 98, 82, 3, 2, 0, 10, 88, 3, 84, 0, 53, 0, 84, 99, 82, 3, 2, 0, 10, 89, 3, 84, 0, 53, 0, 84, 100, 82, 3, 2, 0, 10, 90, 3, 84, 0, 53, 0, 84, 101, 82, 3, 2, 0, 10, 91, 3, 84, 0, 53, 0, 84, 102, 82, 3, 2, 0, 10, 92, 3, 84, 0, 53, 0, 84, 103, 82, 3, 2, 0, 10, 93, 3, 84, 0, 53, 0, 84, 104, 82, 3, 2, 0, 10, 94, 3, 84, 0, 0, 0, 106, 105, 95, 2, 2, 0, 3, 96, 0, 0, 0, 107, 107, -1, 30, 2, 0, 6, 2, 7, 3, 8, 3, 9, 4, 108, 97, 109, 98, 110, 99, 111, 100, 112, 0, 113, 0, 114, 0, 115, 0, 116, 2, 117, 2, 118, 13, 119, 3, 120, 6, 121, 101, 122, 3, 123, 102, 124, 6, 125, 14, 126, 14, 127, 103, 128, 8, 129, 8, 130, 2, 131, 14, 132, 104, 0 + -1, -1, 1, 0, -1, 1, 2, 0, 0, 0, 0, 4, 3, -1, 15, 5, 1, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 1, 12, 7, 13, 7, 14, 8, 15, 9, 16, 10, 17, 10, 18, 11, 2, 12, 0, 0, 0, 1, 19, -1, 0, 0, 2, 0, 21, 20, 13, 3, 22, 14, 23, 15, 2, 16, 0, 2, 0, 21, 24, 13, 3, 22, 14, 23, 17, 2, 16, 0, 2, 0, 21, 25, 13, 3, 22, 14, 23, 18, 2, 16, 0, 2, 0, 21, 26, 13, 3, 22, 14, 23, 19, 2, 16, 0, 2, 0, 21, 27, 13, 3, 22, 14, 23, 20, 2, 16, 0, 2, 0, 21, 28, 13, 3, 22, 14, 23, 21, 2, 16, 0, 2, 0, 21, 29, 13, 3, 22, 14, 23, 22, 2, 16, 0, 2, 0, 21, 30, 13, 3, 22, 14, 23, 23, 2, 16, 0, 2, 0, 21, 31, 13, 3, 22, 14, 23, 24, 2, 16, 0, 2, 0, 21, 32, 13, 3, 22, 14, 23, 25, 2, 16, 0, 2, 0, 21, 33, 13, 3, 22, 14, 23, 26, 2, 16, 0, 2, 0, 21, 34, 13, 3, 22, 14, 23, 27, 2, 16, 0, 2, 0, 21, 35, 13, 3, 22, 14, 23, 28, 2, 16, 0, 2, 0, 21, 36, 13, 3, 22, 14, 23, 29, 2, 16, 0, 2, 0, 21, 37, 13, 3, 22, 14, 23, 30, 2, 16, 0, 2, 0, 21, 38, 13, 3, 22, 14, 23, 31, 2, 16, 0, 2, 0, 21, 39, 13, 3, 22, 14, 23, 32, 2, 16, 0, 2, 0, 21, 40, 13, 3, 22, 14, 23, 33, 2, 16, 0, 2, 0, 21, 41, 13, 3, 22, 14, 23, 34, 2, 16, 0, 2, 0, 21, 42, 13, 3, 22, 14, 23, 35, 2, 16, 0, 2, 0, 21, 43, 13, 3, 22, 14, 23, 36, 2, 16, 0, 2, 0, 21, 44, 13, 3, 22, 14, 23, 37, 2, 16, 0, 2, 0, 21, 45, 13, 3, 22, 14, 23, 38, 2, 16, 0, 2, 0, 21, 46, 13, 3, 22, 14, 23, 39, 2, 16, 0, 2, 0, 21, 47, 13, 3, 22, 14, 23, 40, 2, 16, 0, 2, 0, 21, 48, 13, 3, 22, 14, 23, 41, 2, 16, 0, 2, 0, 21, 49, 13, 3, 22, 14, 23, 42, 2, 16, 0, 2, 0, 21, 50, 13, 3, 22, 14, 23, 43, 2, 16, 0, 2, 0, 21, 51, 13, 3, 22, 14, 23, 44, 2, 16, 0, 2, 0, 21, 52, 13, 3, 22, 14, 23, 45, 2, 16, 0, 2, 0, 21, 53, 13, 3, 22, 14, 23, 46, 2, 16, 0, 2, 0, 21, 54, 13, 3, 22, 14, 23, 47, 2, 16, 0, 2, 0, 21, 55, 13, 3, 22, 14, 23, 48, 2, 16, 0, 2, 0, 21, 56, 13, 3, 22, 14, 23, 49, 2, 16, 0, 2, 0, 21, 57, 13, 3, 22, 14, 23, 50, 2, 16, 0, 2, 0, 21, 58, 13, 3, 22, 14, 23, 51, 2, 16, 0, 2, 0, 21, 59, 13, 3, 22, 14, 23, 52, 2, 16, 0, 2, 0, 21, 60, 13, 3, 22, 14, 23, 53, 2, 16, 0, 2, 0, 21, 61, 13, 3, 22, 14, 23, 54, 2, 16, 0, 2, 0, 21, 62, 13, 3, 22, 14, 23, 55, 2, 16, 0, 2, 0, 21, 63, 13, 3, 22, 14, 23, 56, 2, 16, 0, 2, 0, 21, 64, 13, 3, 22, 14, 23, 57, 2, 16, 0, 0, 0, 1, 65, -1, 0, 0, 45, 0, 67, 66, 58, 5, 22, 14, 23, 59, 2, 60, 68, 61, 69, 62, 0, 45, 0, 67, 70, 58, 5, 22, 14, 23, 63, 2, 60, 68, 64, 69, 65, 0, 45, 0, 67, 71, 58, 5, 22, 14, 23, 66, 2, 60, 68, 67, 69, 65, 0, 45, 0, 67, 72, 68, 3, 22, 14, 23, 69, 2, 70, 0, 45, 0, 74, 73, 71, 3, 22, 14, 23, 72, 2, 73, 0, 0, 0, 76, 75, 74, 3, 22, 14, 23, 75, 2, 76, 0, 0, 0, 78, 77, -1, 6, 79, 77, 80, 7, 81, 78, 82, 79, 83, 78, 84, 7, 0, 0, 0, 1, 85, -1, 0, 0, 53, 0, 76, 86, 80, 3, 22, 14, 23, 81, 2, 82, 0, 53, 0, 76, 87, 80, 3, 22, 14, 23, 83, 2, 82, 0, 53, 0, 76, 88, 80, 3, 22, 14, 23, 84, 2, 82, 0, 53, 0, 76, 89, 80, 3, 22, 14, 23, 85, 2, 82, 0, 53, 0, 76, 90, 80, 3, 22, 14, 23, 86, 2, 82, 0, 53, 0, 76, 91, 80, 3, 22, 14, 23, 87, 2, 82, 0, 53, 0, 76, 92, 80, 3, 22, 14, 23, 88, 2, 82, 0, 53, 0, 76, 93, 80, 3, 22, 14, 23, 89, 2, 82, 0, 53, 0, 76, 94, 80, 3, 22, 14, 23, 90, 2, 82, 0, 53, 0, 76, 95, 80, 3, 22, 14, 23, 91, 2, 82, 0, 53, 0, 76, 96, 80, 3, 22, 14, 23, 92, 2, 82, 0, 0, 0, 98, 97, 93, 2, 22, 14, 2, 94, 0, 0, 0, 99, 99, -1, 17, 100, 95, 101, 96, 102, 97, 103, 98, 104, 78, 105, 78, 106, 6, 107, 9, 108, 99, 109, 8, 110, 100, 111, 9, 112, 7, 113, 7, 114, 101, 115, 78, 116, 102, 0 "variants" - - "" + "__editor_plugin_screen__" "2D" @@ -166,7 +149,7 @@ "2D" "ofs" - 328.379, 822.226 + -70.6559, 735.599 "snap_grid" False "snap_offset" @@ -186,7 +169,7 @@ "snap_step" 10, 10 "zoom" - 1.108032 + 0.663419 "3D" @@ -280,18 +263,6 @@ "znear" 0.1 - "Script" - - "current" - 0 - "sources" - - "res://moving_platform.gd" - "res://enemy.gd" - "res://player.gd" - "res://coin.gd" - - "__editor_run_settings__" @@ -301,12 +272,6 @@ 0 - True - 1 - 1 - 0, 0 - 0 - 1, 1 0 64, 64 @@ -314,12 +279,16 @@ 1, 0, 0, 1, 0, 0 2 False + 1 + 0 + 1 0, 2, 70, 536870914, 71, 10, 72, 10, 73, 10, 74, 10, 75, 10, 76, 10, 77, 10, 78, 10, 65536, 2, 65606, 536870914, 65607, 10, 65608, 10, 65609, 10, 65610, 10, 65611, 10, 65612, 10, 65613, 10, 65614, 10, 131072, 2, 131142, 536870914, 131143, 10, 131144, 10, 131145, 10, 131146, 10, 131147, 10, 131148, 10, 131149, 10, 131150, 10, 196608, 2, 196626, 9, 196678, 536870914, 196679, 10, 196680, 10, 196681, 10, 196682, 10, 196683, 10, 196684, 10, 196685, 10, 196686, 10, 262144, 2, 262162, 8, 262214, 536870914, 262215, 10, 262216, 10, 262217, 10, 262218, 10, 262219, 10, 262220, 10, 262221, 10, 262222, 10, 327680, 2, 327697, 536870921, 327698, 7, 327733, 9, 327750, 536870914, 327751, 10, 327752, 10, 327753, 10, 327754, 10, 327755, 10, 327756, 10, 327757, 10, 327758, 10, 393216, 2, 393233, 536870920, 393234, 7, 393257, 9, 393269, 7, 393286, 536870914, 393287, 10, 393288, 10, 393289, 10, 393290, 10, 393291, 10, 393292, 10, 393293, 10, 393294, 10, 458752, 2, 458769, 7, 458770, 8, 458790, 9, 458793, 8, 458805, 8, 458822, 536870914, 458823, 10, 458824, 10, 458825, 10, 458826, 10, 458827, 10, 458828, 10, 458829, 10, 458830, 10, 524288, 4, 524289, 1, 524304, 536870913, 524305, 536870918, 524306, 6, 524307, 5, 524308, 1, 524326, 8, 524329, 7, 524341, 7, 524358, 536870914, 524359, 10, 524360, 10, 524361, 10, 524362, 10, 524363, 10, 524364, 10, 524365, 10, 524366, 10, 589824, 10, 589825, 13, 589840, 536870914, 589841, 10, 589842, 10, 589843, 10, 589844, 2, 589862, 7, 589865, 7, 589876, 536870913, 589877, 6, 589878, 1, 589894, 536870914, 589895, 10, 589896, 10, 589897, 10, 589898, 10, 589899, 10, 589900, 10, 589901, 10, 589902, 10, 655360, 2, 655376, 536870914, 655377, 10, 655378, 10, 655379, 10, 655380, 2, 655398, 7, 655401, 8, 655412, 536870925, 655413, 11, 655414, 13, 655430, 536870914, 655431, 10, 655432, 10, 655433, 10, 655434, 10, 655435, 10, 655436, 10, 655437, 10, 655438, 10, 720896, 2, 720912, 536870914, 720913, 10, 720914, 10, 720915, 10, 720916, 2, 720934, 8, 720937, 7, 720958, 536870913, 720959, 5, 720960, 536870917, 720961, 5, 720962, 5, 720963, 536870917, 720964, 5, 720965, 0, 720966, 536870916, 720967, 10, 720968, 10, 720969, 10, 720970, 10, 720971, 10, 720972, 10, 720973, 10, 720974, 10, 786432, 2, 786437, 9, 786448, 536870914, 786449, 10, 786450, 10, 786451, 10, 786452, 2, 786464, 536870913, 786465, 1, 786470, 7, 786473, 7, 786474, 536870924, 786475, 1, 786494, 536870914, 786495, 10, 786496, 10, 786497, 10, 786498, 10, 786499, 10, 786500, 10, 786501, 10, 786502, 10, 786503, 10, 786504, 10, 786505, 10, 786506, 10, 786507, 10, 786508, 10, 786509, 10, 851968, 2, 851973, 7, 851984, 536870914, 851985, 10, 851986, 10, 851987, 10, 851988, 2, 851996, 536870913, 851997, 1, 852000, 536870914, 852001, 3, 852006, 7, 852009, 536870913, 852011, 2, 852030, 536870914, 852031, 10, 852032, 10, 852033, 10, 852034, 10, 852035, 10, 852036, 10, 852037, 10, 852038, 10, 852039, 10, 852040, 10, 852041, 10, 852042, 10, 852043, 10, 852044, 10, 852045, 10, 917504, 2, 917506, 9, 917509, 7, 917512, 536870921, 917520, 536870925, 917521, 11, 917522, 11, 917523, 11, 917524, 13, 917532, 536870925, 917533, 13, 917536, 536870914, 917537, 4, 917538, 1, 917540, 536870913, 917541, 0, 917542, 1, 917545, 536870914, 917546, 10, 917547, 4, 917548, 1, 917566, 536870914, 917567, 10, 917568, 10, 917569, 10, 917570, 10, 917571, 10, 917572, 10, 917573, 10, 917574, 10, 917575, 10, 917576, 10, 917577, 10, 917578, 10, 917579, 10, 917580, 10, 917581, 10, 983040, 2, 983042, 7, 983045, 7, 983048, 536870920, 983050, 536870913, 983051, 0, 983052, 1, 983064, 536870913, 983065, 1, 983072, 536870914, 983073, 10, 983074, 4, 983075, 0, 983076, 536870916, 983077, 10, 983078, 4, 983079, 536870912, 983080, 536870912, 983081, 536870916, 983082, 10, 983083, 10, 983084, 2, 983095, 9, 983102, 536870914, 983103, 10, 983104, 10, 983105, 10, 983106, 10, 983107, 10, 983108, 10, 983109, 10, 983110, 10, 983111, 10, 983112, 10, 983113, 10, 983114, 10, 983115, 10, 983116, 10, 983117, 10, 1048576, 2, 1048578, 8, 1048581, 8, 1048584, 536870919, 1048586, 536870914, 1048587, 536870922, 1048588, 2, 1048600, 536870925, 1048601, 13, 1048604, 9, 1048608, 536870925, 1048609, 536870923, 1048610, 536870923, 1048611, 536870923, 1048612, 10, 1048613, 10, 1048614, 10, 1048615, 10, 1048616, 10, 1048617, 10, 1048618, 10, 1048619, 10, 1048620, 4, 1048621, 1, 1048630, 536870921, 1048631, 8, 1048638, 536870914, 1048639, 10, 1048640, 10, 1048641, 10, 1048642, 10, 1048643, 10, 1048644, 10, 1048645, 10, 1048646, 10, 1048647, 10, 1048648, 10, 1048649, 10, 1048650, 10, 1048651, 10, 1048652, 10, 1048653, 10, 1114112, 4, 1114113, 0, 1114114, 6, 1114115, 0, 1114116, 0, 1114117, 6, 1114118, 1, 1114120, 536870920, 1114122, 536870925, 1114123, 11, 1114124, 13, 1114128, 536870913, 1114129, 5, 1114130, 536870917, 1114131, 5, 1114132, 0, 1114133, 1, 1114140, 7, 1114141, 536870921, 1114148, 536870914, 1114149, 10, 1114150, 10, 1114151, 10, 1114152, 10, 1114153, 10, 1114154, 10, 1114155, 10, 1114156, 10, 1114157, 2, 1114166, 536870920, 1114167, 8, 1114174, 536870914, 1114175, 10, 1114176, 10, 1114177, 10, 1114178, 10, 1114179, 10, 1114180, 10, 1114181, 10, 1114182, 10, 1114183, 10, 1114184, 10, 1114185, 10, 1114186, 10, 1114187, 10, 1114188, 10, 1179648, 10, 1179649, 10, 1179650, 10, 1179651, 10, 1179652, 10, 1179653, 10, 1179654, 2, 1179656, 536870919, 1179663, 536870915, 1179665, 10, 1179666, 10, 1179667, 10, 1179668, 10, 1179669, 4, 1179670, 12, 1179675, 9, 1179676, 8, 1179677, 8, 1179684, 536870914, 1179685, 10, 1179686, 10, 1179687, 10, 1179688, 10, 1179689, 10, 1179690, 10, 1179691, 10, 1179692, 10, 1179693, 4, 1179694, 1, 1179701, 9, 1179702, 536870919, 1179703, 7, 1179710, 536870914, 1179711, 10, 1179712, 10, 1179713, 10, 1179714, 10, 1179715, 10, 1179716, 10, 1179717, 10, 1179718, 10, 1179719, 10, 1179720, 10, 1179721, 10, 1179722, 10, 1245184, 10, 1245185, 10, 1245186, 10, 1245187, 10, 1245188, 10, 1245189, 10, 1245190, 2, 1245192, 536870919, 1245199, 536870913, 1245200, 536870916, 1245201, 10, 1245202, 10, 1245203, 10, 1245204, 10, 1245205, 10, 1245207, 1, 1245211, 7, 1245212, 7, 1245213, 536870920, 1245220, 536870914, 1245221, 10, 1245222, 10, 1245223, 10, 1245224, 10, 1245225, 10, 1245226, 10, 1245227, 10, 1245228, 10, 1245229, 10, 1245230, 2, 1245237, 8, 1245238, 536870919, 1245239, 8, 1245240, 536870921, 1245246, 536870914, 1245247, 10, 1245248, 10, 1245249, 10, 1245250, 10, 1245251, 10, 1245252, 10, 1245253, 10, 1245254, 10, 1245255, 10, 1245256, 10, 1245257, 10, 1245258, 10, 1310720, 10, 1310721, 10, 1310722, 10, 1310723, 10, 1310724, 10, 1310725, 10, 1310726, 2, 1310728, 536870920, 1310730, 536870913, 1310731, 1, 1310734, 536870913, 1310735, 536870916, 1310736, 10, 1310737, 10, 1310738, 10, 1310739, 10, 1310740, 10, 1310741, 10, 1310742, 10, 1310743, 4, 1310744, 1, 1310747, 8, 1310748, 7, 1310749, 536870919, 1310756, 536870914, 1310757, 10, 1310758, 10, 1310759, 10, 1310760, 10, 1310761, 10, 1310762, 10, 1310763, 10, 1310764, 10, 1310765, 10, 1310766, 4, 1310767, 5, 1310768, 12, 1310773, 7, 1310774, 536870919, 1310775, 7, 1310776, 536870919, 1310782, 536870914, 1310783, 10, 1310784, 10, 1310785, 10, 1310786, 10, 1310787, 10, 1310788, 10, 1310789, 10, 1310790, 10, 1310791, 10, 1310792, 10, 1310793, 10, 1376256, 10, 1376257, 10, 1376258, 10, 1376259, 10, 1376260, 10, 1376261, 10, 1376262, 4, 1376263, 0, 1376264, 0, 1376265, 0, 1376266, 536870916, 1376267, 4, 1376268, 0, 1376269, 0, 1376270, 536870916, 1376271, 10, 1376272, 10, 1376273, 10, 1376274, 10, 1376275, 10, 1376276, 10, 1376277, 10, 1376278, 10, 1376279, 10, 1376280, 4, 1376281, 12, 1376283, 8, 1376284, 8, 1376285, 536870920, 1376287, 536870924, 1376288, 0, 1376289, 5, 1376290, 536870917, 1376291, 0, 1376292, 536870916, 1376293, 10, 1376294, 10, 1376295, 10, 1376296, 10, 1376297, 10, 1376298, 10, 1376299, 10, 1376300, 10, 1376301, 10, 1376302, 10, 1376303, 10, 1376305, 12, 1376309, 7, 1376310, 536870920, 1376311, 7, 1376312, 536870920, 1376318, 536870914, 1376319, 10, 1376320, 10, 1376321, 10, 1376322, 10, 1376323, 10, 1376324, 10, 1376325, 10, 1376326, 10, 1376327, 10, 1376328, 10, 1441792, 10, 1441793, 10, 1441794, 10, 1441795, 10, 1441796, 10, 1441797, 10, 1441798, 10, 1441799, 10, 1441800, 10, 1441801, 10, 1441802, 10, 1441803, 10, 1441804, 10, 1441805, 10, 1441806, 10, 1441807, 10, 1441808, 10, 1441809, 10, 1441810, 10, 1441811, 10, 1441812, 10, 1441813, 10, 1441814, 10, 1441815, 10, 1441816, 10, 1441818, 0, 1441819, 6, 1441820, 6, 1441821, 536870918, 1441822, 5, 1441824, 10, 1441825, 10, 1441826, 10, 1441827, 10, 1441828, 10, 1441829, 10, 1441830, 10, 1441831, 10, 1441832, 10, 1441833, 10, 1441834, 10, 1441835, 10, 1441836, 10, 1441837, 10, 1441838, 10, 1441839, 10, 1441840, 10, 1441842, 0, 1441843, 0, 1441844, 0, 1441845, 6, 1441846, 536870918, 1441847, 6, 1441848, 536870918, 1441849, 0, 1441850, 5, 1441851, 536870917, 1441852, 5, 1441853, 0, 1441854, 536870916, 1441855, 10, 1441856, 10, 1441857, 10, 1441858, 10, 1441859, 10, 1441860, 10, 1441861, 10, 1441862, 10, 1441863, 10, 1507328, 10, 1507329, 10, 1507330, 10, 1507331, 10, 1507332, 10, 1507333, 10, 1507334, 10, 1507335, 10, 1507336, 10, 1507337, 10, 1507338, 10, 1507339, 10, 1507340, 10, 1507341, 10, 1507342, 10, 1507343, 10, 1507344, 10, 1507345, 10, 1507346, 10, 1507347, 10, 1507348, 10, 1507349, 10, 1507350, 10, 1507351, 10, 1507352, 10, 1507353, 10, 1507354, 10, 1507355, 10, 1507356, 10, 1507357, 10, 1507358, 10, 1507359, 10, 1507360, 10, 1507361, 10, 1507362, 10, 1507363, 10, 1507364, 10, 1507365, 10, 1507366, 10, 1507367, 10, 1507368, 10, 1507369, 10, 1507370, 10, 1507371, 10, 1507372, 10, 1507373, 10, 1507374, 10, 1507375, 10, 1507376, 10, 1507377, 10, 1507378, 10, 1507379, 10, 1507380, 10, 1507381, 10, 1507382, 10, 1507383, 10, 1507384, 10, 1507385, 10, 1507386, 10, 1507387, 10, 1507388, 10, 1507389, 10, 1507390, 10, 1507391, 10, 1507392, 10, 1507393, 10, 1507394, 10, 1507395, 10, 1507396, 10, 1507397, 10, 1507398, 10, 1507399, 10, 1572864, 10, 1572865, 10, 1572866, 10, 1572867, 10, 1572868, 10, 1572869, 10, 1572870, 10, 1572871, 10, 1572872, 10, 1572873, 10, 1572874, 10, 1572875, 10, 1572876, 10, 1572877, 10, 1572878, 10, 1572879, 10, 1572880, 10, 1572881, 10, 1572882, 10, 1572883, 10, 1572884, 10, 1572885, 10, 1572886, 10, 1572887, 10, 1572888, 10, 1572889, 10, 1572890, 10, 1572891, 10, 1572892, 10, 1572893, 10, 1572894, 10, 1572895, 10, 1572896, 10, 1572897, 10, 1572898, 10, 1572899, 10, 1572900, 10, 1572901, 10, 1572902, 10, 1572903, 10, 1572904, 10, 1572905, 10, 1572906, 10, 1572907, 10, 1572908, 10, 1572909, 10, 1572910, 10, 1572911, 10, 1572912, 10, 1572913, 10, 1572914, 10, 1572915, 10, 1572916, 10, 1572917, 10, 1572918, 10, 1572919, 10, 1572920, 10, 1572921, 10, 1572922, 10, 1572923, 10, 1572924, 10, 1572925, 10, 1572926, 10, 1572927, 10, 1572928, 10, 1572929, 10, 1572930, 10, 1572931, 10, 1572932, 10, 1572933, 10, 1572934, 10, 1572935, 10, 1638400, 10, 1638401, 10, 1638402, 10, 1638403, 10, 1638404, 10, 1638405, 10, 1638406, 10, 1638407, 10, 1638408, 10, 1638409, 10, 1638410, 10, 1638411, 10, 1638412, 10, 1638413, 10, 1638414, 10, 1638415, 10, 1638416, 10, 1638417, 10, 1638418, 10, 1638419, 10, 1638420, 10, 1638421, 10, 1638422, 10, 1638423, 10, 1638424, 10, 1638425, 10, 1638426, 10, 1638427, 10, 1638428, 10, 1638429, 10, 1638430, 10, 1638431, 10, 1638432, 10, 1638433, 10, 1638434, 10, 1638435, 10, 1638436, 10, 1638437, 10, 1638438, 10, 1638439, 10, 1638440, 10, 1638441, 10, 1638442, 10, 1638443, 10, 1638444, 10, 1638445, 10, 1638446, 10, 1638447, 10, 1638448, 10, 1638449, 10, 1638450, 10, 1638451, 10, 1638452, 10, 1638453, 10, 1638454, 10, 1638455, 10, 1638456, 10, 1638457, 10, 1638458, 10, 1638459, 10, 1638460, 10, 1638461, 10, 1638462, 10, 1638463, 10, 1638464, 10, 1638465, 10, 1638466, 10, 1638467, 10, 1638468, 10, 1638469, 10, 1638470, 10, 1638471, 10, 1703952, 10, 1703953, 10, 1703954, 10, 1703955, 10, 1703956, 10, 1703957, 10, 1703958, 10, 1703959, 10, 1703960, 10, 1703961, 10, 1703962, 10, 1703963, 10, 1703964, 10, 1703965, 10, 1703966, 10, 1703967, 10, 1703968, 10, 1703969, 10, 1703970, 10, 1703971, 10, 1703972, 10, 1703973, 10, 1703974, 10, 1703975, 10, 1703976, 10, 1703977, 10, 1703978, 10, 1703979, 10, 1703980, 10, 1703981, 10, 1703982, 10, 1703983, 10, 1703984, 10, 1703985, 10, 1703986, 10, 1703987, 10, 1703988, 10, 1703989, 10, 1703990, 10, 1703991, 10, 1703992, 10, 1703993, 10, 1703994, 10, 1703995, 10, 1703996, 10, 1703997, 10, 1703998, 10, 1703999, 10, 1704000, 10, 1704001, 10, 1704002, 10, 1704003, 10, 1704004, 10, 1704005, 10, 1704006, 10, 1704007, 10, 1769488, 10, 1769489, 10, 1769490, 10, 1769491, 10, 1769492, 10, 1769493, 10, 1769494, 10, 1769495, 10, 1769496, 10, 1769497, 10, 1769498, 10, 1769499, 10, 1769500, 10, 1769501, 10, 1769502, 10, 1769503, 10, 1769504, 10, 1769505, 10, 1769506, 10, 1769507, 10, 1769508, 10, 1769509, 10, 1769510, 10, 1769511, 10, 1769512, 10, 1769513, 10, 1769514, 10, 1769515, 10, 1769516, 10, 1769517, 10, 1769518, 10, 1769519, 10, 1769520, 10, 1769521, 10, 1769522, 10, 1769523, 10, 1769524, 10, 1769525, 10, 1769526, 10, 1769527, 10, 1769528, 10, 1769529, 10, 1769530, 10, 1769531, 10, 1769532, 10, 1769533, 10, 1769534, 10, 1769535, 10, 1769536, 10, 1769537, 10, 1769538, 10, 1769539, 10, 1769540, 10, 1769541, 10 "_edit_lock_" True + "" 672, 1179 "__editor_plugin_screen__" @@ -957,6 +926,7 @@ + True 2 834.664, 1309.6 diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp index 92d5088b81e..49229ba5009 100644 --- a/scene/2d/canvas_item.cpp +++ b/scene/2d/canvas_item.cpp @@ -1172,6 +1172,14 @@ Matrix32 CanvasItem::get_viewport_transform() const { } +void CanvasItem::set_notify_local_transform(bool p_enable) { + notify_local_transform=p_enable; +} + +bool CanvasItem::is_local_transform_notification_enabled() const { + return notify_local_transform; +} + CanvasItem::CanvasItem() : xform_change(this) { @@ -1191,6 +1199,7 @@ CanvasItem::CanvasItem() : xform_change(this) { canvas_layer=NULL; use_parent_material=false; global_invalid=true; + notify_local_transform=false; light_mask=1; C=NULL; diff --git a/scene/2d/canvas_item.h b/scene/2d/canvas_item.h index 6d8308dbe42..4885256c648 100644 --- a/scene/2d/canvas_item.h +++ b/scene/2d/canvas_item.h @@ -126,6 +126,7 @@ private: bool block_transform_notify; bool behind; bool use_parent_material; + bool notify_local_transform; Ref material; @@ -155,7 +156,7 @@ private: protected: - _FORCE_INLINE_ void _notify_transform() { if (!is_inside_tree()) return; _notify_transform(this); if (!block_transform_notify) notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); } + _FORCE_INLINE_ void _notify_transform() { if (!is_inside_tree()) return; _notify_transform(this); if (!block_transform_notify && notify_local_transform) notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); } void item_rect_changed(); @@ -263,6 +264,10 @@ public: Vector2 get_global_mouse_pos() const; Vector2 get_local_mouse_pos() const; + void set_notify_local_transform(bool p_enable); + bool is_local_transform_notification_enabled() const; + + CanvasItem(); ~CanvasItem(); }; diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp index ceea41d1c80..8a5e2f51d13 100644 --- a/scene/2d/collision_polygon_2d.cpp +++ b/scene/2d/collision_polygon_2d.cpp @@ -33,7 +33,7 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { - if (unparenting) + if (unparenting || !can_update_body) return; CollisionObject2D *co = p_obj->cast_to(); @@ -49,6 +49,7 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { //here comes the sun, lalalala //decompose concave into multiple convex polygons and add them Vector< Vector > decomp = Geometry::decompose_polygon(polygon); + shape_from=co->get_shape_count(); for(int i=0;i convex = memnew( ConvexPolygonShape2D ); convex->set_points(decomp[i]); @@ -57,6 +58,11 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { co->set_shape_as_trigger(co->get_shape_count()-1,true); } + shape_to=co->get_shape_count()-1; + if (shape_toset_shape_as_trigger(co->get_shape_count()-1,true); + shape_from=co->get_shape_count()-1; + shape_to=co->get_shape_count()-1; + } @@ -86,6 +95,8 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { void CollisionPolygon2D::_update_parent() { + if (!can_update_body) + return; Node *parent = get_parent(); if (!parent) return; @@ -101,12 +112,24 @@ void CollisionPolygon2D::_notification(int p_what) { switch(p_what) { case NOTIFICATION_ENTER_TREE: { unparenting=false; + can_update_body=get_tree()->is_editor_hint(); + } break; + case NOTIFICATION_EXIT_TREE: { + can_update_body=false; } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { if (!is_inside_tree()) break; - _update_parent(); + if (can_update_body) { + _update_parent(); + } else if (shape_from>=0 && shape_to>=0) { + CollisionObject2D *co = get_parent()->cast_to(); + for(int i=shape_from;i<=shape_to;i++) { + co->set_shape_transform(i,get_transform()); + } + } + } break; @@ -141,20 +164,22 @@ void CollisionPolygon2D::set_polygon(const Vector& p_polygon) { polygon=p_polygon; - for(int i=0;i=0 && shape_to>=0) { + CollisionObject2D *co = get_parent()->cast_to(); + for(int i=shape_from;i<=shape_to;i++) { + co->set_shape_as_trigger(i,p_trigger); + } + + } } bool CollisionPolygon2D::is_trigger() const{ @@ -192,6 +224,17 @@ bool CollisionPolygon2D::is_trigger() const{ } +void CollisionPolygon2D::_set_shape_range(const Vector2& p_range) { + + shape_from=p_range.x; + shape_to=p_range.y; +} + +Vector2 CollisionPolygon2D::_get_shape_range() const { + + return Vector2(shape_from,shape_to); +} + void CollisionPolygon2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("_add_to_collision_object"),&CollisionPolygon2D::_add_to_collision_object); @@ -204,9 +247,17 @@ void CollisionPolygon2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_trigger"),&CollisionPolygon2D::set_trigger); ObjectTypeDB::bind_method(_MD("is_trigger"),&CollisionPolygon2D::is_trigger); + ObjectTypeDB::bind_method(_MD("_set_shape_range","shape_range"),&CollisionPolygon2D::_set_shape_range); + ObjectTypeDB::bind_method(_MD("_get_shape_range"),&CollisionPolygon2D::_get_shape_range); + + ObjectTypeDB::bind_method(_MD("get_collision_object_first_shape"),&CollisionPolygon2D::get_collision_object_first_shape); + ObjectTypeDB::bind_method(_MD("get_collision_object_last_shape"),&CollisionPolygon2D::get_collision_object_last_shape); + ADD_PROPERTY( PropertyInfo(Variant::INT,"build_mode",PROPERTY_HINT_ENUM,"Solids,Segments"),_SCS("set_build_mode"),_SCS("get_build_mode")); ADD_PROPERTY( PropertyInfo(Variant::VECTOR2_ARRAY,"polygon"),_SCS("set_polygon"),_SCS("get_polygon")); + ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"shape_range",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("_set_shape_range"),_SCS("_get_shape_range")); ADD_PROPERTY( PropertyInfo(Variant::BOOL,"trigger"),_SCS("set_trigger"),_SCS("is_trigger")); + } CollisionPolygon2D::CollisionPolygon2D() { @@ -215,6 +266,9 @@ CollisionPolygon2D::CollisionPolygon2D() { build_mode=BUILD_SOLIDS; trigger=false; unparenting=false; - + shape_from=-1; + shape_to=-1; + can_update_body=false; + set_notify_local_transform(true); } diff --git a/scene/2d/collision_polygon_2d.h b/scene/2d/collision_polygon_2d.h index 4e78868082f..4bc9713c8a2 100644 --- a/scene/2d/collision_polygon_2d.h +++ b/scene/2d/collision_polygon_2d.h @@ -56,6 +56,14 @@ protected: void _add_to_collision_object(Object *p_obj); void _update_parent(); + bool can_update_body; + int shape_from; + int shape_to; + + void _set_shape_range(const Vector2& p_range); + Vector2 _get_shape_range() const; + + protected: void _notification(int p_what); @@ -72,6 +80,10 @@ public: Vector get_polygon() const; virtual Rect2 get_item_rect() const; + + int get_collision_object_first_shape() const { return shape_from; } + int get_collision_object_last_shape() const { return shape_to; } + CollisionPolygon2D(); }; diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp index 5012c54b17a..a0a015a99e4 100644 --- a/scene/2d/collision_shape_2d.cpp +++ b/scene/2d/collision_shape_2d.cpp @@ -44,10 +44,12 @@ void CollisionShape2D::_add_to_collision_object(Object *p_obj) { CollisionObject2D *co = p_obj->cast_to(); ERR_FAIL_COND(!co); + update_shape_index=co->get_shape_count(); co->add_shape(shape,get_transform()); if (trigger) co->set_shape_as_trigger(co->get_shape_count()-1,true); + } void CollisionShape2D::_shape_changed() { @@ -74,12 +76,27 @@ void CollisionShape2D::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { unparenting=false; + can_update_body=get_tree()->is_editor_hint(); + } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { if (!is_inside_tree()) break; - _update_parent(); + if (can_update_body) { + _update_parent(); + } else if (update_shape_index>=0){ + + CollisionObject2D *co = get_parent()->cast_to(); + if (co) { + co->set_shape_transform(update_shape_index,get_transform()); + } + + } + + } break; + case NOTIFICATION_EXIT_TREE: { + can_update_body=false; } break; /* @@ -92,6 +109,9 @@ void CollisionShape2D::_notification(int p_what) { } break;*/ case NOTIFICATION_DRAW: { + if (!get_tree()->is_editor_hint()) + return; + rect=Rect2(); Color draw_col=Color(0,0.6,0.7,0.5); @@ -209,7 +229,14 @@ void CollisionShape2D::set_shape(const Ref& p_shape) { shape->disconnect("changed",this,"_shape_changed"); shape=p_shape; update(); - _update_parent(); + if (is_inside_tree() && can_update_body) + _update_parent(); + if (is_inside_tree() && !can_update_body && update_shape_index>=0) { + CollisionObject2D *co = get_parent()->cast_to(); + if (co) { + co->set_shape(update_shape_index,p_shape); + } + } if (shape.is_valid()) shape->connect("changed",this,"_shape_changed"); @@ -228,7 +255,14 @@ Rect2 CollisionShape2D::get_item_rect() const { void CollisionShape2D::set_trigger(bool p_trigger) { trigger=p_trigger; - _update_parent(); + if (can_update_body) { + _update_parent(); + } else if (is_inside_tree() && update_shape_index>=0){ + CollisionObject2D *co = get_parent()->cast_to(); + if (co) { + co->set_shape_as_trigger(update_shape_index,p_trigger); + } + } } bool CollisionShape2D::is_trigger() const{ @@ -236,6 +270,19 @@ bool CollisionShape2D::is_trigger() const{ return trigger; } + +void CollisionShape2D::_set_update_shape_index(int p_index) { + + + update_shape_index=p_index; +} + +int CollisionShape2D::_get_update_shape_index() const{ + + return update_shape_index; +} + + void CollisionShape2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_shape","shape"),&CollisionShape2D::set_shape); @@ -245,14 +292,23 @@ void CollisionShape2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_trigger","enable"),&CollisionShape2D::set_trigger); ObjectTypeDB::bind_method(_MD("is_trigger"),&CollisionShape2D::is_trigger); + ObjectTypeDB::bind_method(_MD("_set_update_shape_index","index"),&CollisionShape2D::_set_update_shape_index); + ObjectTypeDB::bind_method(_MD("_get_update_shape_index"),&CollisionShape2D::_get_update_shape_index); + + ObjectTypeDB::bind_method(_MD("get_collision_object_shape_index"),&CollisionShape2D::get_collision_object_shape_index); + ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"shape",PROPERTY_HINT_RESOURCE_TYPE,"Shape2D"),_SCS("set_shape"),_SCS("get_shape")); ADD_PROPERTY(PropertyInfo(Variant::BOOL,"trigger"),_SCS("set_trigger"),_SCS("is_trigger")); + ADD_PROPERTY( PropertyInfo( Variant::INT, "_update_shape_index", PROPERTY_HINT_NONE, "",PROPERTY_USAGE_NOEDITOR), _SCS("_set_update_shape_index"), _SCS("_get_update_shape_index")); + } CollisionShape2D::CollisionShape2D() { rect=Rect2(-Point2(10,10),Point2(20,20)); - + set_notify_local_transform(true); trigger=false; unparenting = false; + can_update_body = false; + update_shape_index=-1; } diff --git a/scene/2d/collision_shape_2d.h b/scene/2d/collision_shape_2d.h index 507912d31e4..82e11371742 100644 --- a/scene/2d/collision_shape_2d.h +++ b/scene/2d/collision_shape_2d.h @@ -39,7 +39,13 @@ class CollisionShape2D : public Node2D { Rect2 rect; bool trigger; bool unparenting; + bool can_update_body; void _shape_changed(); + int update_shape_index; + + void _set_update_shape_index(int p_index); + int _get_update_shape_index() const; + protected: void _update_parent(); @@ -55,6 +61,8 @@ public: void set_trigger(bool p_trigger); bool is_trigger() const; + int get_collision_object_shape_index() const { return _get_update_shape_index(); } + CollisionShape2D(); }; diff --git a/scene/3d/body_shape.cpp b/scene/3d/body_shape.cpp index c49d1b028c3..709a79a5f46 100644 --- a/scene/3d/body_shape.cpp +++ b/scene/3d/body_shape.cpp @@ -43,7 +43,10 @@ void CollisionShape::_update_body() { - + if (!get_tree() || !can_update_body) + return; + if (!get_tree()->is_editor_hint()) + return; if (get_parent() && get_parent()->cast_to()) get_parent()->cast_to()->_update_shapes_from_children(); @@ -310,10 +313,13 @@ void CollisionShape::_add_to_collision_object(Object* p_cshape) { if (shape.is_valid()) { + update_shape_index=co->get_shape_count(); co->add_shape(shape,get_transform()); - if (trigger) - co->set_shape_as_trigger( co->get_shape_count() -1, true ); - } + if (trigger) + co->set_shape_as_trigger( co->get_shape_count() -1, true ); + } else { + update_shape_index=-1; + } } void CollisionShape::_notification(int p_what) { @@ -322,12 +328,14 @@ void CollisionShape::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { unparenting=false; + can_update_body=get_tree()->is_editor_hint(); + set_notify_local_transform(!can_update_body); //indicator_instance = VisualServer::get_singleton()->instance_create2(indicator,get_world()->get_scenario()); } break; case NOTIFICATION_TRANSFORM_CHANGED: { // VisualServer::get_singleton()->instance_set_transform(indicator_instance,get_global_transform()); - if (updating_body) { + if (can_update_body && updating_body) { _update_body(); } } break; @@ -336,16 +344,30 @@ void CollisionShape::_notification(int p_what) { VisualServer::get_singleton()->free(indicator_instance); indicator_instance=RID(); }*/ + can_update_body=false; + set_notify_local_transform(false); } break; case NOTIFICATION_UNPARENTED: { unparenting=true; - if (updating_body) + if (can_update_body && updating_body) _update_body(); } break; case NOTIFICATION_PARENTED: { - if (updating_body) + if (can_update_body && updating_body) _update_body(); } break; + case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { + + if (!can_update_body && update_shape_index>=0) { + + CollisionObject *co = get_parent()->cast_to(); + if (co) { + co->set_shape_transform(update_shape_index,get_transform()); + } + } + + } break; + } } @@ -357,6 +379,18 @@ void CollisionShape::resource_changed(RES res) { } +void CollisionShape::_set_update_shape_index(int p_index) { + + + update_shape_index=p_index; +} + +int CollisionShape::_get_update_shape_index() const{ + + return update_shape_index; +} + + void CollisionShape::_bind_methods() { //not sure if this should do anything @@ -368,10 +402,14 @@ void CollisionShape::_bind_methods() { ObjectTypeDB::bind_method(_MD("is_trigger"),&CollisionShape::is_trigger); ObjectTypeDB::bind_method(_MD("make_convex_from_brothers"),&CollisionShape::make_convex_from_brothers); ObjectTypeDB::set_method_flags("CollisionShape","make_convex_from_brothers",METHOD_FLAGS_DEFAULT|METHOD_FLAG_EDITOR); + ObjectTypeDB::bind_method(_MD("_set_update_shape_index","index"),&CollisionShape::_set_update_shape_index); + ObjectTypeDB::bind_method(_MD("_get_update_shape_index"),&CollisionShape::_get_update_shape_index); + ObjectTypeDB::bind_method(_MD("get_collision_object_shape_index"),&CollisionShape::get_collision_object_shape_index); ADD_PROPERTY( PropertyInfo( Variant::OBJECT, "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape"), _SCS("set_shape"), _SCS("get_shape")); - ADD_PROPERTY(PropertyInfo(Variant::BOOL,"trigger"),_SCS("set_trigger"),_SCS("is_trigger")); + ADD_PROPERTY(PropertyInfo(Variant::BOOL,"trigger"),_SCS("set_trigger"),_SCS("is_trigger")); + ADD_PROPERTY( PropertyInfo( Variant::INT, "_update_shape_index", PROPERTY_HINT_NONE, "",PROPERTY_USAGE_NOEDITOR), _SCS("_set_update_shape_index"), _SCS("_get_update_shape_index")); } @@ -383,8 +421,15 @@ void CollisionShape::set_shape(const Ref &p_shape) { if (!shape.is_null()) shape->register_owner(this); update_gizmo(); - if (updating_body) + if (updating_body) { _update_body(); + } else if (can_update_body && update_shape_index>=0 && is_inside_tree()){ + CollisionObject *co = get_parent()->cast_to(); + if (co) { + co->set_shape(update_shape_index,p_shape); + } + + } } Ref CollisionShape::get_shape() const { @@ -405,8 +450,14 @@ bool CollisionShape::is_updating_body() const { void CollisionShape::set_trigger(bool p_trigger) { trigger=p_trigger; - if (updating_body) + if (updating_body) { _update_body(); + } else if (can_update_body && update_shape_index>=0 && is_inside_tree()){ + CollisionObject *co = get_parent()->cast_to(); + if (co) { + co->set_shape_as_trigger(update_shape_index,p_trigger); + } + } } bool CollisionShape::is_trigger() const{ @@ -419,7 +470,9 @@ CollisionShape::CollisionShape() { //indicator = VisualServer::get_singleton()->mesh_create(); updating_body=true; unparenting=false; - trigger=false; + update_shape_index=-1; + trigger=false; + can_update_body=false; } CollisionShape::~CollisionShape() { diff --git a/scene/3d/body_shape.h b/scene/3d/body_shape.h index b3c0006d790..c1ebf806a95 100644 --- a/scene/3d/body_shape.h +++ b/scene/3d/body_shape.h @@ -56,8 +56,16 @@ class CollisionShape : public Spatial { bool unparenting; bool trigger; + bool can_update_body; + + int update_shape_index; + void _update_body(); void _add_to_collision_object(Object* p_cshape); + + void _set_update_shape_index(int p_index); + int _get_update_shape_index() const; + protected: void _notification(int p_what); @@ -73,8 +81,10 @@ public: void set_updating_body(bool p_update); bool is_updating_body() const; - void set_trigger(bool p_trigger); - bool is_trigger() const; + void set_trigger(bool p_trigger); + bool is_trigger() const; + + int get_collision_object_shape_index() const { return _get_update_shape_index(); } CollisionShape(); ~CollisionShape(); diff --git a/scene/3d/collision_polygon.cpp b/scene/3d/collision_polygon.cpp index 4ab1a1a1abb..c857b4851ae 100644 --- a/scene/3d/collision_polygon.cpp +++ b/scene/3d/collision_polygon.cpp @@ -6,6 +6,8 @@ void CollisionPolygon::_add_to_collision_object(Object *p_obj) { + if (!can_update_body) + return; CollisionObject *co = p_obj->cast_to(); ERR_FAIL_COND(!co); @@ -23,6 +25,7 @@ void CollisionPolygon::_add_to_collision_object(Object *p_obj) { //here comes the sun, lalalala //decompose concave into multiple convex polygons and add them + shape_from=co->get_shape_count(); for(int i=0;i convex = memnew( ConvexPolygonShape ); DVector cp; @@ -43,6 +46,11 @@ void CollisionPolygon::_add_to_collision_object(Object *p_obj) { co->add_shape(convex,get_transform()); } + shape_to=co->get_shape_count()-1; + if (shape_to_update_shapes_from_children(); } +void CollisionPolygon::_set_shape_range(const Vector2& p_range) { + + shape_from=p_range.x; + shape_to=p_range.y; +} + +Vector2 CollisionPolygon::_get_shape_range() const { + + return Vector2(shape_from,shape_to); +} + void CollisionPolygon::_notification(int p_what) { switch(p_what) { + case NOTIFICATION_ENTER_TREE: { + can_update_body=get_tree()->is_editor_hint(); + set_notify_local_transform(!can_update_body); + + //indicator_instance = VisualServer::get_singleton()->instance_create2(indicator,get_world()->get_scenario()); + } break; + case NOTIFICATION_EXIT_TREE: { + can_update_body=false; + set_notify_local_transform(false); + } break; case NOTIFICATION_TRANSFORM_CHANGED: { if (!is_inside_tree()) break; - _update_parent(); + if (can_update_body) { + _update_parent(); + } + + } break; + case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { + if (!can_update_body && shape_from>=0 && shape_from>=0) { + + CollisionObject *co = get_parent()->cast_to(); + if (co) { + for(int i=shape_from;i<=shape_to;i++) { + co->set_shape_transform(i,get_transform()); + } + } + } } break; #if 0 @@ -119,29 +165,31 @@ void CollisionPolygon::_notification(int p_what) { void CollisionPolygon::set_polygon(const Vector& p_polygon) { polygon=p_polygon; + if (can_update_body) { - for(int i=0;i polygon; + void _add_to_collision_object(Object *p_obj); void _update_parent(); + bool can_update_body; + int shape_from; + int shape_to; + + void _set_shape_range(const Vector2& p_range); + Vector2 _get_shape_range() const; + protected: void _notification(int p_what); @@ -43,6 +51,10 @@ public: Vector get_polygon() const; virtual AABB get_item_rect() const; + + int get_collision_object_first_shape() const { return shape_from; } + int get_collision_object_last_shape() const { return shape_to; } + CollisionPolygon(); }; diff --git a/scene/3d/spatial.cpp b/scene/3d/spatial.cpp index 7117c591767..a65f68ed2ce 100644 --- a/scene/3d/spatial.cpp +++ b/scene/3d/spatial.cpp @@ -231,6 +231,11 @@ void Spatial::set_transform(const Transform& p_transform) { _change_notify("transform/rotation"); _change_notify("transform/scale"); _propagate_transform_changed(this); + if (data.notify_local_transform) { + notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); + } + + } @@ -335,6 +340,9 @@ void Spatial::set_translation(const Vector3& p_translation) { data.local_transform.origin=p_translation; _propagate_transform_changed(this); + if (data.notify_local_transform) { + notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); + } } @@ -348,6 +356,9 @@ void Spatial::set_rotation(const Vector3& p_euler){ data.rotation=p_euler; data.dirty|=DIRTY_LOCAL; _propagate_transform_changed(this); + if (data.notify_local_transform) { + notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); + } } void Spatial::set_scale(const Vector3& p_scale){ @@ -360,6 +371,9 @@ void Spatial::set_scale(const Vector3& p_scale){ data.scale=p_scale; data.dirty|=DIRTY_LOCAL; _propagate_transform_changed(this); + if (data.notify_local_transform) { + notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); + } } @@ -685,6 +699,13 @@ void Spatial::look_at_from_pos(const Vector3& p_pos,const Vector3& p_target, con } +void Spatial::set_notify_local_transform(bool p_enable) { + data.notify_local_transform=p_enable; +} + +bool Spatial::is_local_transform_notification_enabled() const { + return data.notify_local_transform; +} void Spatial::_bind_methods() { @@ -725,6 +746,9 @@ void Spatial::_bind_methods() { ObjectTypeDB::bind_method(_MD("_set_visible_"), &Spatial::_set_visible_); ObjectTypeDB::bind_method(_MD("_is_visible_"), &Spatial::_is_visible_); + ObjectTypeDB::bind_method(_MD("set_notify_local_transform","enable"), &Spatial::set_notify_local_transform); + ObjectTypeDB::bind_method(_MD("is_local_transform_notification_enabled"), &Spatial::is_local_transform_notification_enabled); + void rotate(const Vector3& p_normal,float p_radians); void rotate_x(float p_radians); void rotate_y(float p_radians); @@ -783,6 +807,7 @@ Spatial::Spatial() : xform_change(this) data.gizmo_disabled=false; data.gizmo_dirty=false; #endif + data.notify_local_transform=false; data.parent=NULL; data.C=NULL; diff --git a/scene/3d/spatial.h b/scene/3d/spatial.h index 8b40786fb8a..7fa6099d7a7 100644 --- a/scene/3d/spatial.h +++ b/scene/3d/spatial.h @@ -91,6 +91,7 @@ class Spatial : public Node { List::Element *C; bool ignore_notification; + bool notify_local_transform; bool visible; @@ -134,6 +135,7 @@ public: NOTIFICATION_ENTER_WORLD=41, NOTIFICATION_EXIT_WORLD=42, NOTIFICATION_VISIBILITY_CHANGED=43, + NOTIFICATION_LOCAL_TRANSFORM_CHANGED=44, }; Spatial *get_parent_spatial() const; @@ -179,6 +181,9 @@ public: void look_at(const Vector3& p_target, const Vector3& p_up_normal); void look_at_from_pos(const Vector3& p_pos,const Vector3& p_target, const Vector3& p_up_normal); + void set_notify_local_transform(bool p_enable); + bool is_local_transform_notification_enabled() const; + void orthonormalize(); void set_identity(); diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 3727c2e8ec7..851de4a89f9 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -458,7 +458,6 @@ void register_scene_types() { /* disable types by default, only editors should enable them */ - ObjectTypeDB::set_type_enabled("CollisionShape",false); //ObjectTypeDB::set_type_enabled("BodyVolumeSphere",false); //ObjectTypeDB::set_type_enabled("BodyVolumeBox",false); //ObjectTypeDB::set_type_enabled("BodyVolumeCapsule",false); @@ -492,9 +491,12 @@ void register_scene_types() { ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); ObjectTypeDB::register_type(); - - ObjectTypeDB::set_type_enabled("CollisionShape2D",false); - ObjectTypeDB::set_type_enabled("CollisionPolygon2D",false); + if (bool(GLOBAL_DEF("physics/remove_collision_helpers_at_runtime",false))) { + ObjectTypeDB::set_type_enabled("CollisionShape2D",false); + ObjectTypeDB::set_type_enabled("CollisionPolygon2D",false); + ObjectTypeDB::set_type_enabled("CollisionShape",false); + ObjectTypeDB::set_type_enabled("CollisionPolygon",false); + } OS::get_singleton()->yield(); //may take time to init