From 843ce4056caef680f8bc610c62f9d9ab15097633 Mon Sep 17 00:00:00 2001 From: PoolloverNathan <24194027+PoolloverNathan@users.noreply.github.com> Date: Fri, 17 Mar 2023 21:32:42 -0400 Subject: [PATCH 01/76] doc_converting_glsl_to_godot_shaders/Macros: Replace text about migrating macros with a short list of supported macros --- .../shaders/converting_glsl_to_godot_shaders.rst | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tutorials/shaders/converting_glsl_to_godot_shaders.rst b/tutorials/shaders/converting_glsl_to_godot_shaders.rst index c812baf13f5..56fcf49c600 100644 --- a/tutorials/shaders/converting_glsl_to_godot_shaders.rst +++ b/tutorials/shaders/converting_glsl_to_godot_shaders.rst @@ -74,13 +74,11 @@ rename ``main`` to ``fragment``. Macros ^^^^^^ -In keeping with its similarity to C, GLSL lets you use macros. Commonly -``#define`` is used to define constants or small functions. There is no -straightforward way to translate defines to Godot's shading language. If it is a -function that is defined, then replace with a function, and if it is a constant, -then replace with a uniform. For other macros (``#if``, ``#ifdef``, etc.), there -is no equivalent because they run during the pre-processing stage of -compilation. +The :ref:`Godot shader preprocessor` supports the following macros: +* ``#define`` / ``#undef`` +* ``#if``, ``#elif``, ``#else``, ``#endif``, ``defined()``, ``#ifdef``, ``#ifndef`` +* ``#include`` (only ``.gdshaderinc`` files and with a maximum depth of 25) +* ``#pragma disable_preprocessor``, which disables preprocessing for the rest of the file Variables ^^^^^^^^^ From 10cf0d3039296a661c70b85d7dd638be0b9abab9 Mon Sep 17 00:00:00 2001 From: kashiw1n <131484028+kashiw1n@users.noreply.github.com> Date: Fri, 21 Apr 2023 21:14:08 +0200 Subject: [PATCH 02/76] Fix link to the 3.x version of Compiling for Linux Since there is no "3.x " branch of the docs, I'm not sure which branch the link should point to instead. I went with the latest 3.x, but maybe 3.0 is better? --- contributing/development/compiling/compiling_for_linuxbsd.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/compiling/compiling_for_linuxbsd.rst b/contributing/development/compiling/compiling_for_linuxbsd.rst index e076d2713b7..36bf4e6a057 100644 --- a/contributing/development/compiling/compiling_for_linuxbsd.rst +++ b/contributing/development/compiling/compiling_for_linuxbsd.rst @@ -247,7 +247,7 @@ Start a terminal, go to the root dir of the engine source code and type: Prior to Godot 4.0, the Linux/\*BSD target was called ``x11`` instead of ``linuxbsd``. If you are looking to compile Godot 3.x, make sure to use the - `stable branch of this documentation `__. + `3.x branch of this documentation `__. If all goes well, the resulting binary executable will be placed in the "bin" subdirectory. This executable file contains the whole engine and From bf8426915a31f6d448bc8fbc3812a818b0b990db Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Thu, 11 May 2023 13:14:08 +0200 Subject: [PATCH 03/76] Update NavigationObstacle doc for avoidance rework Updates NavigationObstacle doc for avoidance rework. --- .../img/nav_static_obstacle_build.gif | Bin 0 -> 366854 bytes .../navigation_using_navigationobstacles.rst | 101 ++++++++++++------ 2 files changed, 71 insertions(+), 30 deletions(-) create mode 100644 tutorials/navigation/img/nav_static_obstacle_build.gif diff --git a/tutorials/navigation/img/nav_static_obstacle_build.gif b/tutorials/navigation/img/nav_static_obstacle_build.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c50c4fcabede555415c3ecbfb585cc442c58dac GIT binary patch literal 366854 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

HaAf?_aR@!q7%Vp zJNtaMde<40eR{2~zjE^Z@MUYZzMSXduvn=63VN)L#)znZeKP74UAVr+@G0{&r+cb~ z&u4h3_?Ob+PIe-P)A=h0lKrsv{H+&D^EK4nYxj$Km!axrOZ}cxx4aFiU0WI08sFBD zm#SONZY`?y^tMG&?uP^&x7N=ax4z!bYhPCvca(03-o`NLLR|c(w$|BH|L9g2EOL80 z?C8^3@qoX}7}kA%^7aSd*3BMM@%t|QT-)YnZ*tJR%1N>VL-*XQQK*<)n$dM|v+qKD zB{4ei_H4I7g+Yao>#x>x-xZ5`@B74aNJ#sX59d?TU72 zSa^v_5I)@7tuEHG`^y_yl>Oo2_q4)|_`G9PIW?5Y-*sV)lBs(QZ8@Q^q(gkKJ^l_jarCwpd(WFv1(6eCk!v}O9%+Q zq1pH7BH!l_Z1#=PZ8?RS*acVuKTd5xaK+k`ew-3Emsw!-WXfnrl7s6jym^DYw8Z7; zbNUf2$O&8aLV2odoaFPT&k2e!80vs zJ*@zHVlAyuU)1YxmF#OB7cezui0Ut*`jXUESrZoALb!icTYXo&`g@_6G3+TeQYcI6 zGTWW)MZ}DvnlWJ4Ji2V;g+i4&92>KD%Dow=+a4GnsR^>Eq z8?Pj=%~5TbUN_VYt?He#x-wLejEPf@JKO8Ja1UQ~IxG28mODZ}1F@5OLSv-2$Vi0I z(mS-4#-cxKi^|>T`Zh)(hwC12k6COL7Kpb1VM6I}gQgQt5|Y8ZJPQd}PcbtmJn#jVi{^E9ib`7%g5pkx^A&#VCh8 zSa}hAGLw2uvzAuu=j*O{;_IwAJQ8HU_lz#jD{W`pcho1n(wmA;`w?}%ghH%BlQnPfNrLp3ySwEcr1V=vfNcpLrd_a0*F{nQ&JXi=&ozm+JHh&>A2y`hh^2@ zT^v|F=(k}I4GJVe^I6Uw*+6y`Xx<$2#eed$OQFU+9*q8YNM(jmVzMp4X>7^`9gA86~E^HDyk{M7gS8ThC+Kb${`{nQS{fKvy|_pYruv zcq)M65@l7fo%2#rGV9j>Xy0#KPlo*mf>SA5BOlZTEW-ecNy3UD^ko zHYUhkvbynl7Hqb+<{7=d0Q&UM!#ixV$LqzXn~&Y~*Ye*B(=>8jfRgb*gKIT%p`uak z^Su+%Me&ts+edg5BZS6s&s#@@g84D+9T!F8 zc0U)$5o)qvdPZ1ptj4HgqpHricHEmz*d8cnQpJC*wOMOXy_ttuhjI$GeXcpk#bV*| zXzle2`#WAb-Oqb3;sh_%Hle*O0v6=w$cqs-)4l8C;xiWr>sQvhIo%Cpmj&@URD1b+ zoPl0(<=1&<&(a#j$@G5)<5E}1-d;xj1uenTSnbZHaeYV+=bo?2F~(9y(6zm|_N zp{jGduLxin6C{zi^&4FG%ah8MW#gwkgiutl($H5-lwNRPDadTHrFmW%TR)b%O6pi+ce5c$3~(YtCI%0t@}(cUJJe5- zE+fZ@ODdM1*nV1tzSLqSSCEV@4&s8$FlAn@WswyPKI7zoIkG{#X*|C;iUv*=K!Ug& zQ%u?1u(ot$xdW%Ucdj?&j$$#DV=0pE1Qc#OTg>2tqjO5axgb-=CPM-xdzI47D)oM7 zbxhC0GaO{lX^cM$N?}S0Y`{KYoPQXD^~)xQ^ex}vEU(lSYQOOS{q!)mI<#KI)<`XO z6=$B?!Q=Si*m@YpdR(uIB8l-6UqU#Ums;O>pm4)iwp9}-iXao-RCE*A<;h|f+Dcp) zyGCnjO35}i6;;Ba2Gjr_v`<>I6t<)LBEn=+1z<1yq~lPB5oW4(>Bw6Eo>70Wp|8%M zv}S!6$7Yt}(_55N3J$^-TeWep)V@mOR4b?(q~+9pLFxan^*r*8eKtr31Kx!#wAm=g!n1Nc zkYiu`_Bqa)`pufh1R7Tt-^u|KQHA7G)>b?b9*biIE}uvGpQS&))c0kUb*-*g01514 z2Jo1T;UFCKihds5VIGoBfxU|@+(}{ulvEwdsy#HM>$%!*LxnUsuo6)Phf?7O1=XM3 zB_1W!r=pZ1Ij}qmG=RcL)zN6Z>ZbB#DqfQ1&xNJ86;On((QWK!6V+QNanAuxTK1$} zg4hu58sVyMtn#&Eafk5T;-pW1E>j!`8z_KSbJd&F;dwl0IJI!U3N(n!NOhQREeaMo z4aQI^gH#yi6p#_6W8x7#kjTo#vtkjjj6PNX4h*%TS6mv9^A2ph50N+qv26qErG{?I zRM*g$VR(2Xo|Q=2g74-reKGXZw8o758wD%=Ve0fh0*yHu9T!?}fo0Tm7euv9CaXXR zWYCbAhD7tN!=;F49rn+P>zvu3ayELw4@@AyC=^yKw;+k2W+B`r2MsICYpN(kd>aGf z__w;~V0|KJK8qgzasxDW!DVSr_VON;F?e50WbH~n#JZscyYsk`Q~ z3D-g9)yxc3VHgIQMuqifGn2iUXNtP*K6kySjcVO&Z<>huf;wf&1DSCk@p$+S9&~)` z8Y_&-ObK(e3y-cGn7J$m;pZ(e8W!^|ODzfg%&1I%LZQtVD|?<*x5${KN$)xKu-Dx% zBl2`B5#mio=p-&nG#NR}Ba0`PX?cZFIA}7zAf_6k7zZkRL26j9IQ`W0S$1)dd5nR} zqi2LiCr~opB=B3^&fS6n5)V=rZ}ZWb{%5m`{!Nj&PqdcKu zeDST$TrNWQg7mPu6}_R`J5RE`9>sQ9$WARZc%#4pDh0ni^pbEmM;kk*s;0bJ292Op04N;TSleZGL6Do3^$~LV`?Z_yba5+8s$8O73014+6?4+=e zJ*+da^qI*O5TiEd!hK%2_ncz6U&QV8j32up8Mu#mCDe?7aU%LMi@g6Q&}wzV9UHF+vCWmX-m8kbx=St1{Q27CWLeqom^#R0t$Mw z3-?yD!UPZ>F4zaPt(vG%+wqctPgM2j9C-Dz7EhOvfU5XgL+aNsc8fj1wkBD_;ET8|9!F1zMC&!i_z=g3G7?Vum^ zgmqnGB?}9p+aTCwBobF;$gd~upBZx zi^LKyT=mD@M|aShe!(K!pnCxY;eAYR_8INH$UA;9^JNUYKx^A3y)S{OXAH6iKqK>D z`{xVx^9o*EXbZwHtmoeaZ`lSK7i93EQ2=-@|D6@lsd^sW8(Tq%V7icA1me;Hc#vRW zP&OI9f0Grua~Wz}>12bU8*}NSTEZh6a=8dt44!q61C7KMpE`)tbl0^dF|jDH6~9M3 z*$XE@#rymLGCWtMfJi0!uQ3BS;)XNBCKaqZA0v=J{9i<8gBY)Y03ZRa0C7Ja2n2yZ zU@#a0fk2^97z_r7!x0Ds5{ZUuhw26~!?`dY>Y+NOruW=0qbBg{48HfvOZiqEEva&F-wluNcW@@v|%m!;=Yh`I?gLSaAa<;c| z-EQmZVDIYW;OgRxcXRXb@bL8X^z!oZ_V)Ji@$n-N0{#6%0s}&WgCdB*QK2EEaAHhE z=#I#+xTx@i=!l)92r?;>921!s6O|MzuISX5$eh?HYFu<#d`x3PEN^GrSbW^lj<{E` zJ3hqh*ocY!8Wa0HCiX{6?9bR8zjnm^j!XEj;&=W^Nc^=k=_h&DkEG&2P2w%hHOZgsRzb+%7j?ilOp9KCXR z<|_Vo1h%*@Q}?Cjj!+``?v4;Jn{y1%%x_~4%hOV1xJzgl|qX8Fmx$!fIQzee>pdatcw zm$|a`DJ6JP!!~(q;nPFQi4ptcvC`k$lTJ5m&xIB97mZdO_Q&-M1sKh*RB8SFe-XIi z+X`?TlnQKh4&3QO2nh0VA-LO%_0j~~wper1XnkD|LyWUA1}C-_n(K)r$6|)e{|Auy zA1FrrUfJwXl=1;5^Jt42HJ>uIRDuvP5$RqG}E#F zuf%LyEqgOfTQdzib9Fm&RckX9tcjA1nF4N`oUH}Q!cxY@ToPv~VP^reF#};ufo7Hf zeH)+^7GSpxxZM(nvjXC50giS+HwQ777#S9h-jSfRm!f(kU+>r&Xb zFZGB&^Hg-nSzjvTKO+weOCvVKLchG5g$a(yx+f1MHa*xBx6|Yy90$d27l@UZI0h}y`o`tY#U&6}9PL9M|dwZS2k!JEoM zHpI} zS!U*!q)~dbQnHUN-L+r#MzYe)T^bXq29x`+f>iv<4v)8?e*eaVzG22a#eMu2 z`|7pn%2WL(Pi!AP@S2$k8s~=(4n|zrtK_8S>pec9Y=N4PyjXM3uP+gtLR z&gE9sW}K-{J6)Q@I7P}SkD<3moSF;ato~nlHc?2YBP13Zhvi-B|P@pWj^C%u#x!wvY}eeoA_?P^7Nimi8fj;|zA9Flme z<7|1egg}Z%5s%|rfhb+Dm>PD_3s0H-@lVNJ?oNe|fdf7G86&@SyM}oPqWgIj)j7{{;%(sBey({IuCvy@6Oor z?Q&^yBCNRBo!EJI_@>WiJwNk9A?MCNed`u--b+^Lz@PT(P!-_`2n?$2za!pgoGzt= zJ43x&wtb$a_Nnk3BNS;YcFxH409eLpuPP22axg-+rY`f`k)M@b$|1@Z^Xl;D(JhI4 ztz{HP@kWAI3T%TS#7idoDXDBPNXKt6{ei(N5((w?S}q>(0LQ6xDF4C-OJ(*d#Cd8J zw3P2Jt6VvT`HHJN+_AS%$v35VF~T=7`0&nnQp%$zRe!Nm-CYOYr7a)Bb*HEva+PRb zBhoD2wGkw9-=ebisy$pgU!Bta_TsP8H9D zt{d~rbcq}5F@HIw-P6WzH15yfZY_QuQ2pEadETk!TWjtREa=O)IYmrU+Lkm>@E3|yY)<_ z7N6^G@_X+4HKf+0{jr%l>-*}q$!=c}KKr;=?ha}l;SgYd65|ngd?%5QhahbEuO9CU zI`Tk2b=V;Q^!xr#H!w={1Als_s8{N*IqCD;q3^*fFKCZ*=$%bkAD#9Xsr+rA%Hye{ zYm1JE%9lp!4-KEGUY;6S0GU`pDp6QIzjLehSw~&Ub(8c-wZwC%SnUKnAIchu(_YrT z8lu75Zyh!E7o|GpGz2e`g~B!YeJWV>qpyZy{3rc8>2d2UQBf{>JyoR9=-e?^pl||311sS-AOCh+H^c6O%v2> z(kT$^V!#Nyx=H8TMW^81x*7T#bfsZYp;l9)f-kGNvU-2XO{*l?GWO)DRCH;b+;sXd z+vh$HrR5u#r1V7Pvdz6L{hdFEQ-Sx~&3PR_l$M5Ual$vO$0us9L~14 z=XL)Ie0*cO_j1hHI=}W80&o@5s z2`=;zKHr|L5J*1~uAubbLf`n=z_NFihpIB4YH5OXw5}7D)qms ztKO)7^YRucW$|HDzp3IC`d6?H)?G4}D|YDNff8-*I}XC{USx-)p}&T`TR*bYKALeQ z|3k)JL2Q)r3K=NH1IpwOA9h}B0mdIN2fdosoQ|^hHN3DDl4&zj4!bD4VMykCsPG^8 zUEiI5JV^q?n2Ehu>g%kB1$xQtiP>>7{bWz_sm;a5&a!y2wW;8;WF{UcC5+JTi2Sgt zBqMIAoN8&4eXb)#{b_2^wnNh0Xoxvcd2|CH2HVh4$9Vu`{vo}m<^sEg<{d8O+p{@` zN4qfx=1R&x>&tKAj~c}(X-J>FcJa?GgrkV2D5Uc62s*k}2r<$aMS9G;7uY0SRFPWM ze%3ML_S=cPdhv}{>gd%V3`7;NXaJS(<9ml-sY_@GSpOC3sL4=UFYLWOuAC-)F%zu( z8w`@eNJ1PbG{rCYi7@fvc8yB!Cyh#k8Pm7WYzzdm&WH66cAvhSq-dJM1bN6hJ05~N?FZZund-A1}yzV0j>j?hGTs?9W;SAT#9J*go=EQi2IW2JsnF`1PS_hL4TN|$Hz8Ja!R_XY6) z8R|UCiZgoDG_~aotjzTOJ?Wma}wt7*k<#=y|zvV8igg@1sNhxJgl{5X_DD zFDiF=`*Zhdi{W-E7ibd40T6w!(T`%Bk76T*sRdY_$vxqLrU>83tcc-ovRh8iR>fwN zRYc}Tci975Jb& zQa;UR1&AO^z7RJ)#Sd`&IsC986(l88qbh=Qu+B9`Y3~)BX3BQw93V&RiR|`uJXaM0 zUDS*v1H|!~$CCnr79wIIjXzy*l%j%Ng_K|_Bu)rj5=w^(AwhVE={z6-7^{#?E4S}P!^`& zjZy|~WMfcK*RQG>5@XwF#&8((8_YrWHQVSQ+JIu9R*sXzfC1q}KMMhN99*+Nq2728 z2vq#y1xPa$;!A=2OObv`friaPe0X3jVRlz;P)hQFYoroy3V5)(#FC#r*atG@gH7=u zIT6^02Zsii|0@t_AROaY3UP2S4D#N>GA?OV=WtI<1IC&4KoYu-s~ZtABc zrsSB__EGsFMA*wULLDjU2^#%3`;;XQ1if_-!G%__#k$?Sx@37>6j-V`Re=m_Y6gYa z0p%#bOke1+H!?)=DfDorzNj2jjx(F*gy6*rT33fh6{Y|%j)!{tMb`fi(04m@7wY&; zzGNsD5`cj?;K9<^SgAMViQYiDdAv$8sCQ2)qsrO$EeJ*1mlz7NB!gvV}_IUV`l6OWq__529cRoO&4}$lh;YV-#@R1h`%V zdhYgLdjG=o3K~&RHIGXnlJQ^)-~641zgUBC#!H zVGcQ2AbEb{y|)zc#OonZT1Mr7BNw2A0d7k>{0MhOiJLP|f|4=NvWLxzbfD|}fk9N` zs>yLb6f}}Ay_JpQ1o0uuOJGL|*jA`$Pi~RY&0YFh8&I>$?jB-|u zs6G-|ujb`u6E}V^pmCsOb^JdOG%hXMh;pH`5a1vLVTn=Be6TBZCt<#9i7yi=f*9sy zRy}f#^wCnLGCoW+6O{JZQ-D3y)hJ9;y^sH(9;)}dtQ{5PIWNwAZ9G0L86|YVVz+?K zqO3>?bpIP^GA2)38RA0Dv&FW{KCW-R9{<8K@>6ZsfyyI&hqkGAhnQPk`KadVdq0HR zzC(%!f*64exd0@p@>eVv%LM~}fxYH)WAmf~@rMZW;G211g&hD0m7$D1ITx<3eIV3~ z*!)oh@xbhhuEKq0g*t{_A=QCRMaPWPFArgkdjh~HGT0pt8A;7J*2{{fKr{DwRr>i(K&9kt5(wT_exE4LuCTp|SkR)I8b%b1J93*vrWY z__Ow)BjAQN02(36xNe;1HD5Xr+j*t{XhapOr!O2t@1rePJt5H!ZPoRzzTR1soiJ10 zU#i;YhJhv!&!31b$DZAxECeYD#S}q^0sHb(Zbk$On(;6tH3OVOE8sqeS!vU8e8uEC z4QPJa`48yeNw(%s`#{f2yFz9(uf7TUSd8bUUUL5$nGmTip9YpAUXjCt9msXR)F8e> z8O_3!a1O(f1UOybnPdml!JGr?x=LjQHT!}Rd`j}v_aSV-F;~rv7RQwqDx88KbeH-%o1Ks~c8F z4iv4noPBq4&up#lw1RET@wa>8lUd2q7@#qJCxQcwAp^ExJm`{0CK3xZ`VF432W=;V zN79w`C?Gq;_~*x{3kI$mw&z>NUW zbRyu;o^R8>ycAEd+&(k;%BRV|VyEI8yO=&xztwMfb;zZ4P8EKd+UGnF^jM+N_tyMx zV5Kh*^|%yF1cc$GV?$^$3AYVY!Q*28G6rGT7E@zPfd9QlGc`t3sj z5XpIvGCnpUWs2(z(guJHc1)Z6lI_)q1if~~V1Z@;uvoc&^bI5ed+g)9%y{7;cdj^^ z?#dOb+1-J&yW*xAyl2HmhIU(~KuUgkcFS$`3*WOw{jSDbRj-3_JwOJYwM3OBQQBja zv$3d*!8H)q4z$)=$Gv*<<1EUN*C9Dt?KsZ~B;Vy#Ek1d5`#|PlfVAu}|A`YnWdpE~ zs?}Y4V;LGLAXo8$^iawJiu9ph5R4$jnRrJIc`qfut1~U?e>{e&_xmmdsaP@d#?XxW{_%1VRpKnw*0K|r)pAwELL z&iO3$TaW;;D@O=^@w?q^OY`2ojfG^zrH0g6y$|8}m-(}SgJa%t@QHivm5O!jGiBvx zVCHUjs)yEPLk z@)`L@U~ds5f?R+9P{&d<#0vmfaG4E4&yJNYfmRq#_u6*NqI8wc?2>*fu!0!f{#W{z%SRzMRjNSg}8@WGn>5Jr9qk<%u2F2K?Ot;GPhlO%ib z1cs8Ww0>!e+dhHl5+*Dx28$p3GRlyIW}|!Nd(6=$3Y5{m1cKHC7rDv6iQwlR^W@bTSy4LWPX?knASIsiEB7c1;qj;wbNT%M;%U-$Y9=}bXha0!qxRy-FK~CD>6doiI(zM< zMz$pfeC+ovzdW!hCi!3y39S?>Pl!EwWi%d{k^U2miWfVyWZnuT+KH0aMaT}S%v-KZ z3KbqQ&vGYHEvTU%f2aUmflk8J)$g*aEBC|aY6>>xb=vh097WY1e5ZTs^tjWpu|4$Z zAK>I<5PAfB+3@7HF!|#_6}WQ-Fy~WD@U4=zqN#sBpMP>jY^5P3g7mkpJLq7F``);g zPc{DqXvmA|zSrZVL`Nhzi^kkrO4!#wBE`3g^h0V&AfDsS0o&t?S+{EPwywksLbLZh zvgaGbwF0&bfU?+FK$9m|Qqxk6WGvD{l<5VxAM^BGTWpVPH%~vZn6{wnkv(?oC}O4|jrUqyJ49KK5q| zszDNw$5_(8#I3JSVp6cCo?%n?oA~KUi)h!{M{7*Uzl7?o%|p+ba9L$+{noF=f|DmY zRI#b}7gN%g%(B)5P2xs^q$y=SZ~i<&(QK(J@^F|}KSxVaobbgv!bH5&O)BNl_|z(M zIBK!a{X9%UO+ueY=)e@>p?mk5_ceJEDon}4MIE;O3nq~rwtF{T$^+dlT~P3eP4m{s zI@M2?FggXG!;t2bJ9No>cG^Y#d}@=YiVxsw>pA^1t9J6L^Jd0vQ4=&EB9Jr+XK}<_ zw!E%OQ^lr32k2}~rM&%gWb-aEQ0L!`b!&qcM>_qC&M~e1OkxTlp$bf@Kj8Q$CsRpe_>Gb#U{AkDK1@;a_=n!?fK;zQ!&bX zfhiy2Z^BXlIV85Ay}jIx>T{-zdy2}Bh-frPn}{S&SvM&w6S-E!(8r2bDuE!0FfJdY zl7;<>G+oj8t_iO+qnm5x@kjght}&IjnZ3Etn{f2s$?pm0%>%l-X4g!CUNpE;A4E=x zILcCZUO(+6Y0M?}ASF=3R-gnWlV%ZOJPl?$iO6(`cbVS{^-i^osqb&6a1c85O<hNibAMo0}@AR_duh(-+#rjMBl9qRoMrI_SM z?=$|+mo8NKCeaM4Vp57&vZwj|APK`$cn`KVw&GHZjEh2FESIUf483_Q>{D!8H>(;X zyPMMv*I}=nk-XfM1~2wFi5i1zDfIzb^R|cB?7Zs+cga~eUlDNSyb9;N*L2*X6sR9$ zSS>sjLUD(-Z%q6K-N&ln0slZ%0N`_ub^KP@t;4iSEtpO2j|<=KZ8G1vid1g)SYnzH zdM)$Q>exoo7+WhAmk3l{q0hbco`Iml8kzol>IZQcF#Vf8_Q=gp3qeyMhTC>``)ev9 zl-;b9;KUL~lQ$J#-W#M?C7du)vXUeXjVWH`b1l-XBmzo3HTLv*DAo#@Mp!eX8^^s6 z_E5eLV33R1xSipn-=~P~qOgD63$K=g=;L)HKJd#F`-o6O%qYSg0g`=o-cjEmZ71n* zfTZtsZ&Q1}VrqYqqKog@77ixxuOk{l^gVl?ed%BguF@We-3HV*Af?v zYul+iKs=i0Q`)IVE3!`>#=S;c+E7oHY*gQR_-7X+y>zAoL!>_YBLf~_q?!1l=qNll z&ww}`=AT1D-KH8Bm#)5T9HT0p~!$G6&b_%5zC~Wa4ZXCu}#2^-{Ic zjJbD~B7BT$A3X_QtGO&|z8B;~c`V;afmR+Km(a5Uy`l=i$}e|YUo@a){=MFk>tE1( zm$gsXMlIgr2E~$Rv+S$Q9axLQz*n2xA%;|-%X2QQb$3FIE?GgIbN}MtQ4`>CxU+L@ zh<8Vg5)yQ=`9zPs@x4o{_#g$GvIr34x(t-ck+V@0+(Jh7ft{5 z)wG=-J24?PKgI7+zl*4-SA!bgxtX0h4FRf%xR<8O-aD0EJB0!rLRgaAv(yi3Av$MD zI;4x0w|NTHwhU}YE&DEB-jsy`UVGIxmLJ>+Z(f&Kgq?|@9)1E+JI5DkuZfvyr<7|Q zA07exW#hYaD71$@KJ}g9nzR@d1!WkCzYv3#%_mlA>Q}=F3S*RK3({7kRirP1E(3T` zyGw5e#n4hT@O+QSznfPO!4%)c`9wtM78BGxmp@@>?Yya6#q}g(eZsjgyVzsoLGbvtGVL%HOOmudf=q zBl{sh5Bja5<&rlpn4sviyn5=8_+py5R4?80AXSTlX}EGw^ZJ^{+tC;`6RywCwcXV@ z#zl`U4a0U43z~0TCu}pBJgT*)JnZV(v5I;(6RqN{tJGs}U#94}mPrLm`}Nr_t>4O> z4wrknuGz+iD+|$#eihv0M$DstJk^>MrDpr&E<_TlNl~}g)zV>huKjy zhYZmxU9k(={anty>kwE|aJYoHH6hoL3f2BbDYWkM)cVHrbs45m@|X2iMWSxY16eQ% zo3S^t4W!)1XCR3HFa{4im&j3)ob>_Tv?o>T6W`d}nA~PoF)FP_?o+CEiVs5#XXWbm z>!s#<%Zo_R((Y&JSC3g1ey>~jFq`x9#6Hp26Q%dxAJF|RaRIXUSw*(`y76JE(X_Eu zy25z&$OD>F8^QL{GEi$x-c$(M+Xpk-Y&8_zP@4y8ZK@ZkIVy{vu(N3bHeQQFljl+Q zI8n_7AoI0?oJ~k>I3!rCyJoWj^0oI9^V?jG@V8v7+ZZ?k7)N027sAYWeHN&33l+f6+ZA7kRP{C*A(mQ^r0_07^G2U5 zEwKcNla;6jJn;icaj5F4?S^^u%ap>-yt;A#UAu_7uZDV;&~=W)@1u^$&Xxp>kNEd^ z5nq(wD=x7QY}oP#;;sVaDYPP&%Mr^s7&zv<40i1U+n^XT-R4$#@Wa((%V*%Z6o$RX*M18i zNaq&p$%8597l<2c7R#WYp#UiXc7!G=?{MBmuH2zz+}Xbs>sJCJoeo>jG8EDAS%n7y z=ZtU_iUgWGpQcH)J*QHSGQVm*Fj3RuM||PMbW|y{rm2ysxH0MviN^cblP6M(hKw7d z)M-QFh(Q#MG*hA>0G>n9Uj01#x_ENmQR(CvEj=n-{VK@RxOpQ(`OUJnB&HOohgM6s zSH_sSI)Drbs)OZ>-CQ3x0R;II5`u*W3Yh!8jP9@R&C)jy0^k+{ZtBPR+7QNED6EL( zsUw~&S2h?&1gBRQnsnZ@q!i3$7Tn2%rK|)5?q z8M)C`BmYQAd%5ve7TjnJjoGAW@-++J>5Wzg?JqflOOtq*CxH~w^f(|@d3X+)8D7nF zBNX7)z%fmV{AuRYhWq~CKBM}#sM%0gqVHrUIGP$7oyv-)vH}4tZ!FY-0Nzew*rmeg z%))#={CFSya2{-rX!cHA!QGYF_S6-%T_a&Q7Pv8-t+h;_1CT1sP5I7R1mvy87wO37yx(^Kbh zF#t^fNJk`(B^6Rgy`C7151xg?!DPRJql82Lsmu^SAV2Qnfy>*Y^KLmWcOM*LM3bRu z?U>u8jN3Wj?Zkp)5^TP{AZ?3Xc!UpUo`=~H8Mdfp+A)SLp2UO}+LOTPBu2jCoCVv! zERqTng8=|#vI41l2>p`XdR9UF2V5YsjM|!7q`(0*di1EH=qENn2|0y%)f%4bz^cUt zF@&Hz4DEMDYGBRI(s7Zi_}Hjs8<1-9w59|~p!Ernt=wX%qbG5?=ersDibX9C{g6vI ziKX<`K9roYK;B9J;SD}eoeNZ4o-@MAY{Q?b+a;qy1>6%+-&jfPQe#%AoMf*nMR@MUI98|x&A>66Fw-DLV02QEGV8$<*? zc*1buE^O`KAxNCS=}bln1!f!%OQwM7$G}b;>usCSNAln{oM;E(Q&&;EL-o?(R~|)Y z#EB6Fd#VeVyUm~~Ei!1JEQ%%|1AsZ#y4y>ZKk1&EH>s_$@C$o@#?sJK;9pvl=mqGL zo`N9)gdx$K{eUT%`icux4`RE(3g`Q=#pl!>|9Q1@ysZRke6EG%)p(e=?^jGeu7L~a z{Wq{^R?yVpeJKwJluxB8v8kQKfQhuI)=%=5?7|FV1wF?KNx`#oDv`=Xr$RKP{GHsZ zm}S~r^vC|wQADOU4-+Kp2t!2slUK~BV4R2%Q4Ni4TbWVhP@Y0c@Tk1fTTX&4aI{d3 zM1qn;3^(D}b^0QATlr*Gw`4CzGI(9?dIqs{<1D1H>Y5FHThX<=M{*n0D4nY` zbs`WmZ&0%fzKu-RrPOG%RaK26F0h+g=IzH2Xq7zRz-N@I=$rw9VS|7>rb0;^R!kl% zO2{OVAXzXd5zBJJ!v?+(bsC`|2oCTEGnm>LmHOO?9Jp_53L^Hl1mK_!!ZCX?_--a+ z`Kbqv&2Zaf2tF`(Y_j4hh561eoU0)eNTBvF=7BAU@4TXaH8=+k$C1G1l!ArbW?BT^ zn+8q~$zmG!a@nt#_)s!x`cV}Xt&MN4a{_J4gS)4}J!0q`wE%Pu@Fb1egVKAtiMwR>~+&TfX?vWEkO8HN*&1+L~BLK8Q|Vt{R>GY!@;1Bel_WsW}zd!)Xb&_m;RYpBv%HwM^3kEerJkCG@PeyHa7QT7XKb| zyX@1z#Ti-d)jIk09owrMe0*g8F1bJDKt(cjA6mw=4YUn+%HzkRCMP4-uFUumO>!Qn zh^0wluIZ9NW;k#bqR@rPisEx4IT!cO_6A`LxBEaN0MDkP7~;!5b%Pl^4~Zfz=tp?C zQlR^eW5NKeMDmI)X)As{6L#M|l^G1xsM_vJVT!?1MCyl~0;m-Su5-CC4-1YKFn!xn z1N%}-hbs?z8b$#U91w8In(vQ)VA9)!J2>42o3MN+iGzU!XcD|EfA)4C+@eKbQehrI(g>4+ zF)pEFJ7jrZ`Za&NJ@WO6eH78?r@w+2N_ViWq4Z&1Z?Q!>GCN@E=B4 z0osg1PYl-W;nBK}ouupvFj=5!;|AW%VK9Qgf|GdWo_`0nu4=tVEi4n8=rYQB2&-3jD&Nrf+4L9r6u^c{!Q^&RUcgQ< zZTC6PySEVJ&DIBQc2BfbHOE#(N#D24s4^v8vMh_ZkQQzb)E<={J9)e8oZIc^6Yi1z zXF8m7*VnTqrzyLZ0|NZ#KY4Zbk{LHp14Y0#;h$Bcr&z_x$r6+nbL zL)soc4pN%Oy3^h8pCBshec;pbfnv{$tR+H#XMm1R%~*yBB|ISpTAmQL%7}q(+F%TpEkJ&NtZCJj9`V;XGMicMvJo}OSE?7(_~#g z_nd(n)wWGOj4e8n?r%!n*L_>BlyDEOvA;)$WS7p(nw0ayWVuU7u2DVVDiOIT&xc5X z>KfAw2!E@%r0DWhP(_RIKnrlJR>38Fy6 z0Kv9-Y%uD9b=I6+Lc}MCyf5GrS<+(O&~q5<(z*eX5PNuJ9%zYyz(ILuWHehj_Xy^^ ziH*=o?U=*K#5j)ww)#86o+IzqlNI6C`?<8K;C;>IYq19ut_Rv=c8ji$e+jC1D?e2Hwy|nk30(cwmxbZO$LJ9ZFRgAqbV=u?1oioOtcqb zbzH`>`j==_&A;!T;mIdP?n6_`viWNhW`DPwzsv=MG^KKHb458Dw1S(*A3LnvJT4c3 zp^Z6xL_y@`4u{Xl>Ab&l^tQpFssmt`$MYM~4#Zzx>+kZf!OhJRCCnR|{mqb%eTiW= zpi!W-ok_KEzkM!lH-3?kD=IP|W!YI@@K-(J?|E*_@J5IgYHxCQol)jO8yVs0f7zJf zEbus;yRH*)bcShgz?gsag1+%t!~?VEoPymi-)0=(GH?@FEHi?R1VID@D{w|M^t}@8 zv8udkyPNk|KBOlOPp@HwK#9(MAX5McO{Xw*HAdBzL&_$qv=I~j0ym5(uz7|v-g$7-u!VJTgf4_#F zm$4ASEC~czj0ZF~Ur#feH(}&I$_^6}3nSznn=1(TFkOqZXw%91z$V40FFMlcsXppL zVPSYGUGcccQ{$PiAldx9w0{xUuz*(N{)uu{D(;B{E3w4v>8NJBv83}faXf;XWD$LD zRmQ~|*&XAd7>iUieGY){5uK4v<1mb+5@oX5^rQmXYS2sobH}O>_Lt-?8O2kd*O7Au zA9|*-k_9#QD&iRx2|?MhT3!Vo z56eGZkYxg(MvymKnpJTg9x+Vt-M9r9M3tlKv>PZHhle_eMp4B8=-&(DvK^`3W)Yv* z{&`7gF5z}t+k{-aHSg^3tXFdnD9SZ(PI?-!S{H^cacgN(J^n{cV+)HU=7Z!Z@9MUX z)Ql-Ur=w4%Ld-XWr}9_E!w&QJm|{N#YkoT^m#ucuz}dYh-#OpJVRq00CyzPyo~$@EMjwPR5XE%xLhDH0S~kj08vab(@-H%B2EOlrQh1DMQjDW zd$;S*k(T=(lr}CFy|m2xJbpjvY6oT|ODmItVVdH5B?x%Bd?^5;!Y4xpt$^UTc~EP@ zE$1yrcUdkuf+j(pMg0CewtWp-;%(lHzD8x4-iRpnX6lBgxp4iK2l(5LnFJsBAU3O( z7wj5JG&zBnht`!W~N*{x$eonQ8vs?S220b!*wmIH=1dxm_XmN z$Hgr0OrEagL_WjjF{gsx{9NG_YEnn4%nPefnBol>li{g|$x>I2{_{!dD7IMV?B0(s z)N-hF+-vK{A2F4|d1G>2SEbExK!hYY{ou65x%tvU5_e%=p1cL2@#73cl9+RB%5315 zLd$$pjVv{e&#)XC*EI7M>uH7JUhJXmftUAs{*61gs|H|enfldDg-nwma^b`+u7`@o zl0*ofi9Ssr`{NQHwnL!fs=?-kBa4Aa?P;?4c`S|R6hmB#j`Y4%n9T~nK1x7WdUl5y zArs)Szj02Xj+hud@d!c4JF1jNg>&{)7e;$+3hMtv#8=z5YQ=(-E+d+4fAlLv^g$Jx zxn8E5LfpZMM6VzrP^R&|in85oqO9cIjN<_yWS=?E@(dr+V!Q|X5)XH*RzmOl&dejx zka!+7Wz%f!p5iR|>6w$6n9JFR4)?Y?{nOR*H(Bd<*sY`&J%Z0AAFS_6yxch4*4w|R!_LreNiyp-Kf1lyb%gV{~2DkxuqS`4^I=6*Yw z`7*e}aQ=^E;-YR^&ACafWhBp#E=6+el z;hi4nqO}Q)F`&$M$EOHygokV%wvPOWog{KZDUa-;%aeP^vYhM*L(ws4U}Zi|v?4+F zff(|BBk_Is<7RWbKjM7}_t#7k&gbRxeg3Y`V_wa&^iwQV})aSakqWr z#>|8?rxnlS_+qrgoaB)+^#FP7?We%YbW>*WL(I5p^{7^yhaPs>sGe?s(5m9o&6o__ z%BY+>P$A+}-x^=$H(oL`?6inLqxw#z#dXJ>gAc`kNdPDb@MD<|@#6mJs0tDeW)i(32k@`G3<0_Ppgm~?f)7KdY53Pr@;}`o0*hJ^ zb7PS9E;YZ7sYU};CByb>j7kpCPz;}s_jpRPK(qTi4HD>;3#e=dXY5j`P{FisW%8qV zhb);^k<*gfAAo6#2zB*>Wpu9z4?bK+|j4^ikzrrtsnwyO`~U zJk2PcLcmk?FhEI)J||v5nL}r+71|JdLGJg2&7B2 z_G=h1G?_vFo_i^t$$?-)wNGal^i_L|I_R2@dGJ(fo~m3BrFHU2$myW)#rcFa4rV~) z0Er87s@C;Gd##-4T)Ymiy#?DPN$8Pf)$+@CxSA~9x7cje0f8Mc@LI#!;LerfPE)Ut z1;I*dWZf~Idbn7#nurInzf$X!_7qvMoma&gwKAA9FsoIc1{v%GcOD1n6#*@0Q>?~V zN*oHspf=QqWi3!V1jtvKWynr(bz}(oG1Ka;w)$r&FS{tpIsK-~z)GaI#&LS|1^~SV z2-$*P7+E}1On-QGs@#wcCDFx5Bp8Wtpn{9rQ4<}rulpAgicxns>bT9Y_plDt*dSLN_Vxc&5Pj(3%WB$c6&Z9`CFYK=_#U#Ao@n5wht z0g(#sAa<=7WRGYIVkW`Y}s4 z7RPlK88Q`~R<*BmcgiT210%1ye&TxSH&NVX$%@@foe`#o{+MAtBQ@dK@3V^Nw_B5s_{Z)fnvd6NjA1Bij-N5VN z!xuU=1x+W@mYWVgY$*MZff&#XVGZZv$p=Ve313nwprkK+28AC%V}Q!(4D(tW-R^0C!-|S$i1hYCRYm-d&rezGt8G6 zX7!EPn>RZiYUKasP)cDnsTyS`oL+L1(s>n5=a?Pp2MI0MC1_&Ed2t|atPc}W-X{y{@ zVT!kI03z8l!|XTo$t9gFuF_cZzFpks#~?*SehV9@+zx67e+@-_y$b3- zs8O!H!yvtJwd8XnHpBA-ja_d%XImrFdCY<&=%MhhFB1nGra5=^t^boriQ$VrMkkLCTm2rFCHD z1~99cTxpqN(R@f*K|-#VYsg_J?AmIE)WVXKy0#UIeVJF2eoW42Xt?kcQnhVwAdo%;|$rZif>(0Xg=p) z1xIvoPxS7nhm|v8AP!Li)^!7*wg7F=#)ik=#AC2EGZiOuNRYGiD`gx3L@V>BsSfN% z1vKxo(E?;+=fuXMO5ZpKks&f7N?y*5NjRJP^c{UC2Q9*ySluB>STbZ0f+N`Z)gyJ~kE>yw;a9x@1OIB4M_A%EZW2r=mbq>t2S`0rhN)%pgETx`UrGKYzDA0R1zPAaaE)Gy5mV?Rn&Fl?VI=|*qV^MNjC8(|q(l}LYKy=u z@AikOpE$UWEjM{(gaju7O=))zuL7czGenK)NPvndx#J;7T3JBUzW|d zYxeQPw`PS}<~RqWT)~y?N>JDZ8l_@%&O-UIPYs|4tRg|N|188_WX9?K?wE8vI$$G< zmDSA|`0+-Pr6hY}?5Cz4HQ{ZPFXQ76k7WZZklN0D?U9?R$=;{xgm-9$ls5{!OhRvQ zP`+!R#fk9oJ@pF*j@+_`)&lkg^s66bG(5inq2(g<0HL%O2QmBc>7~#d4#Xb-iK2t2 z{#wuey`3=(N##5_otW|8-;A$Cf_mBgLBHvuF^S=|-O<_{&{S!h89A&)M43fV$zf_v z@tcw;r?+>^KxPrQ61sSWR*!j+Eh*-D4;8k!$^#6Dy4Y*%(!WU|x@>O2dvd9kjZrW8 zdJRY|*-R!EnGH@0D>IwKpDzoh=%sSa^6$uCj_QQly-lj=l9RuGB>dgfStU|^zF(ux z0KVj+C#&I_cGQ4QJ5N=MqJ^PsGEx?&5b^p&P=AuB3+G@+&+{|p`V9aH(P4FO5uAeX zO_!5sM86s20Eq!izWfW;`xm^HVm)gPu(bk&lM-`CFiubUKiZxD^>9@54(R4VyXZnN zX9U2-r8#K-63)MZJs2zl>&p%N3Dhg1XiZV-OR6-ce`?AQ9$ftA0sO*E<@$eA{+Q1) z?$%LsM;OO%`{w&)tzXa9VRihtebLC}hjIl)6Y%576(>&Ng~^Y+Qb--nzgvv)|AQC}j$iSO)Zt z?TU2+>YtG67kVQaNfPv)>q#P)dpIJ*NKr?ZzA%T|&Q@(dL;zINS9>o_W@OCo|NbWa zab?ma)Sj2+>Hi|~I z-l1PQlLb0HE$eMT_io@Qxeb1=oBD@~n_atq2-~Tghg4sm*+#X^*EiatQt4PYR~HQhj-eu>d*N8UA<` zGfP%Nt%L<6cdw&gcN}}!ck|-;AD_4xdrni5FZ}#6(QxERrB#CDkGbI+|Mgk@-4Oz< z#0gNA;DK&nwH5`kN6qA9c^+Or5}xsHq|zdYI}z~RhMb=eW=z^85Zkw-JANZCg=QmhftfdMOAMez?SRQ z_HGvB;GFkw#^9=U!Ux$$mvgQf=2C5os`K>T>2^3c%G!BQme{HaF>N$nmPQVMmw|Kf zbiMZ`fEJyhGT#(*U#0B=GZU5k9$>bZDTSgR17@0}An4BIbhs9s28IgpHIR6l;2+34 ziRMD?yA^B4`+X5_Rr6*}bv*Yuw!QRqyD$3DqrFf5%@kr6`>xX{8H#6VbVe{ClXG0$ zg&N4!Xr+BAk42cN;y{@9MO+GfHF-E7r52BciQ-0h@S;_MX91zFke_5#4j*Z%FQbx^w1H%SfkPd^E)ZU4nFRmn_2BSqoej_Z|wG1QI+Bg z9aK6)a0hoyzgAvciqJ%xxpHgWEQ$l_aF#!2oWD3(iVjL15q;EO%;bBljprI2+OTmm ze%I3MX&M+(MRgS){pQp4s|mvF2Zx*?r9nT>L~Dc}f4Ay{pCj!F-^(zMiT(6qX7<9559j~sMOKQ= z@fU9P{oa=1WyRN+f-;nn*i}rJ7K;QD0>iWnrLuJ%B4)C5A)jiyVO!`-i}mV9%HHkN zakDQHpU+g^&J4=`>lmS!;MFXGG@csI38Mxhzb@ZW+@@t%B8G4mI|tOe>eZ}URdBJU z_Hz974BtgP9dH)RffNMuYUklr01(-}DwO4Vp!D5#Q8hk9!V@5j{rL`Ct&{T-iwIIh zY+G#^yBqn_hj14R9V@p*?;ob~q%;guWMd`?cZ7X#C2T?VKdoNsdQ9YLNRv~kJ|LCJ=N11w7bUYv6i>6iiBF(o}l z3ui6O9a8)D0_Z*AnTS%Rw5Ufz_u%6%r2Xv-IBLt{<2SdWI^((@sc-dnM}`yoZ35s) z{M2YZ_nPTC7o|o59uGJJA!&i6{uZLlXQSM6dPGkQoNeDGj0J9%f3jOWd63{&jZ5H6 zo4<%jx7gh)`=Z3&wfzFvd^Znuc3S4CAMmb^xSeBLri~FFpP|;FqC?{%v z`!dmo$7}+%=Alkr6WM$2eKCIPv*+eLqDqBU8d{T_m8QqU7WH6dW=B$0w&({q?{E;k zVX;dX2jw@M*I$grf#^(tsIm|=#Zpt`O4wlIOgeiyB1t zXn&A9^6-sj@z0~5A0+)ARU!t;hb8hP-q@ua4>|*(nDTHh@F-usZ3*ctXCuN@Vs=DR z>C4nGW3s91kwu{Wo_-Cv3Sg%(8^};qJz6kYIui#QLcBv1Jrxl5nQoD(Wg|`K4%_id z+dpsdNht~-G9pNnf*B$X847X<{vo}AipNJFRx=%tY;bIu{v=D;Cl=ZrHPAX!S)c5d?cu-bN8vb;o0pYIHJb4in|7n0Dl#B9%&#Qs2sVcpiOPd0U(w z=g&f_AQ&PUqA%j~Rvg70=|E&S06F`M4i_e^zXx#;v!PbYy;p&Qp1R*=%#YyilnkD} zt*iSj+v(jsytoS=tklR6Rhs4`83UM@9FC|#mum8Lf}Nfo7n+?6dZNaNGJ5-dEX#Ml zd |#v(rlPPN$}U&Mgrr!a>#>Uh|{pYP~Ks>ztVt-2?tTdFY0swtxpQS|k|OF#5@ zav%z-_gA`kxZwVH5W)|Wh7ygv#y}iMoKrf*?bn@b2_OViqc0K;srNj~E^@7xYBqhU z=vPqk)5mbKV2SFWvKinvH81toHtq5+N>L%7i%4Rdm^Qno0iwQ}{wjf_c#n%logIR# z8*O)J>H#l!PbXbBW@N~+17YW@zm_;$yIqkyxr? z7YRb9gQQCM$iPjqbdIm6e%QpcJ(2k-hn`yE(J?((U%i)7+uGmgAFBJvxYwjQ#e8ZU ze9|%)S^H~3cdX^p4aa(%;t5UmJSM}qF%TIQ12$%p3r$O^qur}i@L=*RioG)H$>IHyZIJ=T7I)YU+cUT%)1eP6Nb{ zocG5m^PLt&Rfw;N4wij?7@WgE~iCpw$ z(c#NC3@k_tH1%S@$zSdFIuu7wAFkXih8#|A{&qVCz4y+KKmcs)+G!08L)?)@!S#+` zJF`wWQ_dRv8k&E`krs}>wlnb8BmbY-JrxEJO?Teah|tya+R$_DHp)y8#6+)OcB(yV zXbW)Ffmn-e;Al<@JL6r$ub~nWZ3b=-NJTcPa^o}`IZ!@T4waG)w*nin^3w%pipam7 z{7U(C`#%YnMFDyQV=FfU%&68tSEzio<*EGzNbAi>b-vWi9(m*il-?nQ@KV*rPn|@t z9)INFbr`r!+S(`|MIs7uJp_mJjZaYG&neCj5K7lj19S3iB*mUU&oVlBrwuANy`D%F zwdW*A-|1Ili)2!pWqusT;}et)Tel$xL->iNFE?vrVE2&LY}cOy$n%|;pQJqK3w_TD zKC}_vfw!f~R7np7b@(;Xz|}%g_V(huB!b7UT?>?S+iA<$L8uVjM$v!q$mCZrY#P5~~>-MU44J72=kT76D^mtB{lt>^3z(ps**<*B6 zz%?D%k`xh$+a;mq(a4Vk<+$*Sk$LRaIvzC-h_(gZSeA-Hr|VR?o1O+;3OQ`VsB6_g zySj?hfN+y5sF}GnewExOAYvAXa9q#w`-++x!<`PK1ppO?fW$TcY*I{~e;e|#Ms#*V z@q>hQ&bQ+_baDL^al@xSjrLlXu}GDy;#86M;TbS!Cq5oxUHMs=i@ei&?WZqvtAY=| z0f6-Z6_)523_$`rC;S#3PhkwKtB`xR+e~+ZRVJ!VPfD^adYvkTnwK=sMGrm01-Lu( zK~dv0^)>oO$r>!STH?6_O0@>}7w|%$vmu%9Ay-R~de8X}_Dx%i@Gq5&+hSv%%wfgq zaGNA_$effLgT2U+nc~Q|F_h$@l|}(;L^A4EEuX|w^9Tc;AKmUeBlDYbYTSjm&Bhr3 zB^|3HTg5L|fYk0c_8Lc{H~AuD*4l^xV(L5mBSCDAt2o0@oaQ3@xws#BSo-3!S73_x zoC1P@86qfD@}X^H&m{g)0fF#2SSdaQq_g77)>pp6g1WbwR8bQ^9(eVac!nojA6*pC zns~qN*lHalhd;}5RuH$reg7(D%GG_LS=z^ZT7uAP{CV;X{Hi1veP=1sFWmBJI-_h6 zSyUza;$?;O2r4~DfO7&G5CbJkmWgM7EX35xvf>Wr$H`Uf#k$V1F_HSARjC{@!s`xV znXa`-LhwlFaIR$Erp!mS{C$Fa>s-V#Loq5{QjIK`koRPZa`NLO`mc%7)rDuEX!MLra zzUpc$UsKKI6~-QjjSN%}oPuU^AaSptpWR!PAkeuwm){*O$Fr2BJO~n@ehLdb zX-sf10eYMO8sdH~jgk-?{PD*mrD<=aOsvujH_Dgn>@xRa?N@*{S4t*ELUK+)^qd3* zC}BIN&_;tY*$~kJ(}`7=h5l*(m9}gtIQO=j_O>4wAfmB1NLKRLK$<9?19GeL<^i$b zdp)bRBBc`UflltS_uPj)K`)=8`E2C%K;$GJ9X5v>iwNGYFMM0Zg*z?@a-MZ(6EGi1 z2mi!-H&n?r2P&>{a56$_jBsKfSvq_U=OUg)AyT*4ikn=eC9dKK2|Wcwz5&R0k>y*t zN>lTSo9q|VImsXf-_q@rbuL;wMav%;MuHg_6LjK6afd18uoPSfA=-#+Yg{EX=Uf|Q zD>fS{)n|$0Z9@n#9d55dC3{-lga%uM#e|CGd?pZM^vMEGfAv ztTanObU#*sA%P`RD(TS69I+ntgr{CXmu@6zZYMN#TP}+PYyR-X`y9SEUM$VOdX6sM z%|Q%RNlP=R`9}<>2|L$+PjOydc+7JT+(!9v(ewP^7l%<)LQSW4umLLkW@kDj*XuJM zoh$8q#M}GRdHKq!h`b+?msPeS8Pa|N!k$!(J%0f>!1Sqqs+7e|<+})sjw(4lDdBcj zxjGD;%ShkO!|igI8~0CdR2zJsR1bf)Ft&!>-j5z*BithWe~=LA#!8EUVo&(+NnHHX z?@OEbGbhNnW!pWETjJ|-q#OhL+_(w|GL}?@-3n9K1i*4=z|FIP`PUL2_+|q;v)>)H zZ0~*_^1u{5dG$$m`%t2SG+Dx$YjG#+TK?$^Z+-3f(@z(7UIl3&CkuuD*igxo$!$8S za|Pj+jRRE4TsHVOz$^v%N2?}K`?r)_Jt6u5SGF05+@bBIkqb^$Ip3d`<{gj*br)L6 z7QG9U?;slR^R;`H8vH5*n>@8&lN$9Ww`aWs$Qcoq9?DmSiJ z7ERJO{KaPUW(uTq$U2Sp(-0~urt7Mp9@T(w?29VQ_+KoTiJ2rEPb7gVrz`SYZ@zlh z_OplcaN*{I=sSg&;=UcQ=zG|RuY@GG{hQ_m&&6Bb`}?ed*e11UN`ca&uTZ;qWN$07 zRso`!EdMhv{GV|| zUzr%a`*r+%Afoy(POYlt6Gn1>pdCf!ag*q+g8IjE^){dnqsFxo2(qyh5L+^j9SDSe zOakf%_)n}7+QgDM6BiEL9p`-UIyjPIDa}_V0@{3X%xk9;<$59Diwan>g!CNm@EZ$5 z%YGbgW!2UNwsaUAj9%miw;e!H8PX(`#}5wQ&}@(T#z$uobn*z8c{=KH$P)ocwus>{ z#YcVwpxUh#m3nR^f0da(R2a;aPykAw4Saf>fZL^^lPpFV@8!1emEV8hMgU5ia}NhN zxW9O>JTj)$l6rqgaz9rhC{WrwP|8sYJ(8=a;wknDbx8jRLN8viXzR$!A<)HT8)-w? zi%WlJPVKqF!_N+nj^zJVHdEeu2j3VccI_l| z4xT?B0HO0Me?F8*{iv2@EpqbsW0tj{bs%nQQmdd!HcA?|bxz9hmf)ld@K9@C)Qx{| z`BwiTA|)5uVaqqzV@igwY8=2#?d^mQk%pmIu#Lf5AU3Qy+g9=W(Y z)l``AT9eAQzA##=UFcC)R_2!k`xW8Y;9e8ioNChYrj@00$*-ufg5aK`76>Z-o?VEC z&lur>2ij&I#{Tzj&D8@xKJ+I4Q_v1KZRc}S;qulwrXBNxIr0{l5oVpVC$R+5&iSKp zfj!ZCx&gejxNF%-P{<+h$-On=6HoN2T_6f1nVF%eC{P@F`p^MyMr9LiWOg?-%)@hvmoLASZcV^q7LotdT6vcB=^Fh$}QRI_X{p^(CuZ=XW~5JcMB6J^J0)qyjGuX`+GbYN zfth;0+=R~is(F6T|CB{K#ZEdYChWW!GJ4*+;h^uZ@yAP`vrH~Hq;qNay1hd3I00ff zEym1N_bsIy(k>Rt0(2T{nWGmvOy{AhP2C`Wlj*UZYX^c-J5VMwYmv__VZZj_Es}R) z74cWL0*9E$T=#U@pst^8mK(hbZhPd@$zWOI*CC!tW{-K<4Wl>b9h;MFeTNm*6E?Hl zi-}1mb1zhap=xC~@6bm#!15#`v_yI|?J z{+`J9e`4=`ZJXZ8MjsT(o^w(jsNc*`6teC@D3>DzmPwaKy|l<4UT~95>e?*Q>2%5c zrFp$QE=yzd5HCAExffK^b31DOkaqpF-rbwV&wTEve5p`{X|rp!pyrWcRViF?U4`lX zbAM1r22_iv8$}l{JzzTx>pOuwf6S+`mHv< z?Zx$8debuc!b*MytZ>DJ@r@1gsZK_=ZX^;pY zh?8Z4nZwk6;p#Cha&6S-Z`QH>?Ggg?g;^2hEsTxs3vY;J5kql<4YB^qW$(>&MC^-@ zmdo8pH{JqDxA>-A^$N^7+Wu9lnN^{qB6ihz11K%bX)Aw^$?%ySxxDn~)oMs^wtGnp zrdq~M%h52$Ge-pGw#-0D$F!$D9}GOTcJs&dPWv40PSW9|O2r=|bz=Nj!-*Q1U)bx9 z3nm6dG3zc8A7jPV8AALpYVlEhby<^RTtQK5i28&OV$-+7wGl;L@;Qk8jdN%^`&Ob% zG0c1MjC8~DE&L)i!@8GpCWY;X*8&zaUyHtRMJByI*N{x+%*pSW0`E6YytO+JUHV3R z&T4tWv@DaMnD(A!z2lA+B#qQ4nmj$E>${Ob!rNfHZ3cD5geNyK)mmk&S-sJCigh=o zc<TElOOi$!9UCtBjAsS@G*R1Z8|>Ba8_w_3o|Xg|N&RYWay^q>WHD!tYn@J! zU8h10q2%kZf>x~vcq*R7H4erv$o%J=a%qANUQN}< zT?9B>x}J6Iynl*fjBX3#t|9u=g(^6qD5IaVe!E;|L5GO^W z1uyN7tF6{nm$%a9n|;;O`&CQQ&v-4g)V&$n{{}c^6|yV`d68~n?S?k+T3C3qYlosvcWq^+ajVf`2{zOgVO%n$DSH!Kiv5Y-RiJPO04D zLoUzf=;Gzmqu0S_8X0of6B-97u7wGln#HX~2dg!S?u%n7@M9eN;k#AHGevV9g7)bY zbMs|x@~rAoI9)_Rt#SFMlP!}eliFxJq3F|9jRqx0>RA42Q(4tJ_ON?Uui9;A|B1o; z3f}>(uC`3)b``1Y5*sCIc}l1An32&=#tp9i_XnrWJd;*O9RH4@0~=*7G{|0T@W`h6 zUmG`og`Z&_Nc1?FIR5}zMuh*pn;15pn0Ekvm4Cj3ByZgfC1DE$~p-sWy5+8Psh5Eqvp5>=b z^TlxX$kVK3uU}4Drs7sdjIWQIOrF1j8h$7JhMPH#n9A&jG-SsKy6COoFecpOoYX z$>cI$r3nu$R z=dISbRnlN=lK2vpT1ADm2BGH0saAXzT00-Z0h}66*ke|}tj%Ap-=myWwi0$)B_dPk zflNLxwh{x?5B02w3BDU!KKk0flj}Gn*njkAiFGN__Z}T?z5;GZg#TvBvnkN-v$*p1 zqifK?COKm-vuiv zn)$`hs~Eo;{z>tBumxd|5-(~o4vIb^VzM4$L=!P0THS`8uZ>WD;#o#0Ei-8jEiydM zD3ZB8;peOY#HosAV#}MyJ(}~=A2#6}n@jc&mgm$e)Q^{A{m%7Fh!2$NUwaFV#6#NG zvlb^Ro*z9`%!ZvSEz(hQ6|B)rXSC5Cr73M+l2Bmu8Y$i`)N9}z{45`N6pB7ESUg+{ z-du@MlOPA%=yU+!4`Xia;L(BW;BH^ZCQ-Os2m~k>MDk)^r$f_++20BwJ%FnFRQOGL ziHBcR7gw&HFJ5Pd${_lE9u&9xE$RZuoC^~<5F=u=9xBWX>#tVJ%GT^_&fl-os_=`5 z`YB^MQ=?hag22=s!Iay9k z7`W7=;P}?`(J+;OV|BLTVI_D7^qBH= zOzf*J)Q~aq**LgAwyg_)yqWm0Fa}o84trbDxCIba(Z&;60&f0<48#On<{!B$!>AQ> zLp%8};#GJ~dqHIQ-2?Jw539t#oEJ|g!eYvy*H|cTPKG62#P2J}g!p*Q$I$g+ril1G zj`_V$k1UOQYA~$UqmS-caYRpCMX|;`@@(&i{?j*|eV_LTXYxz@wSCW85AKf*{OSRz zQQ8AKA1ap)yGR8$YodpI(SK=o{?Lm5z|g85QaiG5!p?^}r!8VVUO^&0~ zB;xRAOA3RVH)@|Gz#p>V?#b{RmT_Lp-hSs^YJQcxIc!4iXafu4&Jh);CbhUFboo82 z_N;!~H}jYa>pN3n=s^)yN@ukm?L)M;E?-0*VHI3n>T`fSamqe)ZHjKvf?KVEB#sva zubb9(KPmKt-zI^l&We4dgJ1CO?5;{4k3s)oqd%0oW;`?fMg%9W!wP9kH3lqi9V&a( z`8o++*&hGh`zBTbvUvf)l!K^PVpfIwAU0~17#}g7I1Gi{p^vp=;LG{g8+ZFRS?KL` zOs%Bk7j^OZzySsy;#dN6sTy>i7`Ph)cXt7Qcp#ob!yd^Q%qg`ys|B+QEUza*&I_Hm zG<)^tuBm@QG+uW_%?{lYQ;*Rb7uu+C!J+2aGDjYTv^5D@NF33NIjBku%n>JlQ+y;s z*E7cV!ZG(?p}<}{HWD?90$r3_CBSd-VZlU|01WzPj1Qn7__|n*jg9eu-iJ-o z3KFb>#vGt`_%En1)Ztw;n2H2>a2;}ybRzhWUR;d9Ll*pFC*+(qgd^c}3O`og3oER_ z){ol;0iI7AM7E4li08v0M#dIq;9mNlx^p~ z1!ZxdIe2?2F+r`l#ZALd6;MWf^OBfURL~_p;3o)Q}z9LQS|fS z3gX0-HUFWinPx>+OSHnfQOCwAH+^VHsepQ_g%3-_gTLb`d%e)>RPbTD`isZFm;TYy zBkLc>cUyF)%wV}eY)F$I%*+Jdf`J!%!W|Dh3oc}S8Gv;I;9W%MLx05CbtIpKN{)fw z=X~VR;0;7^?Myh2Z&O=f8_VZK#~|-{q&j;|9d}m>CcfDsf^Slzn*icj(quDDiObaE z?JW5M(H9Fm=wXGyhiphE`>o#lPTyU}!U1SD#xETMb8?5)abR=wX`#;Bq`l?L#B{Er z)#DzSifF4(KJSt?uH5`~<@!Ya(Q1d%+sDpsNdF#I3)p_=kzj~!Pd-DelOP)@AjyrlRa3+(4`qJLp9r%8ZD&|HK6}pLaoz(vupZ>4? z<+&pD4{kD!sH`jb3uluT>2qB!OAG!9>STjO#lbzPBWjW&HNrK5Bp!(5k6%3A_km&uA z+}C}*9a=H|HF$c$OHez?HK7y9pRvBp7`TVk8n+#8@#JSOAKph>;l;qyPs470|9E$w z(v;omGa}M(1Zih__%7{CGvF)l2xUA2`s%gQAkj_DP-1!DYw(Dp7SFMZ2Im0~1C?-( zkfTOYjFT<67%f-^6_wU5u9aZhz(ToD?Rz3c{v&-)Ff^P$?cjDl;Y;Or*PsMuUP3}u z!r|@jKLwA^2Fh-`$?h09(hb#jUx+xwAU#>A22K^rV;z#W4tuhW{IP~Uh#TC%-6Jxz z1eK5tC-iR)I_XXx%7W0?ZA1u&ZTN@U0xIOb~zH7r^iH}E;u+A z+h#9rMNB=6&yun7FwvFj(RE?2x4XXri-7+-E08DizPPc;X()9+FHMm>1|iE^@1|B> z)&IwKt8?;>^p;dj$lX~dYl=!56`7m(y;(cj74f<)^!5s~P&LyobP5vuSi=P#@_;eW8o&4;CDl>UrAK1U-dh@2$E^)BP za&`rDD{1zfNbw;JvKWR0hSti2hyq1%E=KNk)kn>1>!cSj9?N@ZaomMmALAJx1cP z%T`n3oDCjrZ9eO)FMIa1wJTEB;Bk`ae3|Z&)*{Q+_RnJHm_|IxXc^ycYqaFJIZ!wn z){%DI#ow^zX5#YGFI}(YTyNh>T8wZ&7!GOGxo@nEh*+j&6(IP_8=QxBE#CihZ#}QiUL%TxjRe*!yx$omCXkVkbR9yJo{xhZj zcFlz;TK*-9Nm>o;fXIn!05wdUh(u~hP!74?9AV;RhdUZl8d`XG^`0Gp<}|gCYraFx zua-WV99u18RknfkvKx=sZP02tjU*=cbmN?cs(?G-3})R3Dj4gjRpW*f z+%zg|(D@JO{8aDCW@1>`srzPHjYDTQ+x8JSSwNEy5?>VJF=RCf>M}OswQFRNc&Eo! zNY2ZrdK0xquI&ppXv@)Xh|-1cT!@K-;-gdNkmB6ml#&|)9Iqo0pkjEkQ`T1)>8 z?e_BuEqe$QIT*U`O@*e)1nb!jqRo3A`XJUX=U3RyrQWN}JKOec>7cbQV?fH=7iwi; z^2Rq^PS9f*%=Pf!kme??;lUq*BKO*3$kWkdl1D!le=cy1>=={|+{76?GN|&Rw6wv*A$V$EdIzM697VyWR1ikF(cRB9hOhiFq51WRnwqAsX|QDf0Vfa0`R3ULtT^K|6HvK9+sOwFP>&P&l z3Pe9oa{pG)Wm^el58L{3g7wfL-k9C$?rzO zR*HTLku-BzMnOSmtuNTK%RX?FMQZ~e3Q#ro?;?jGK_ zQG}P6o==DT0b&X=#@CLrsgBV97(^X0td`Ja3;>beu}z5>ssF}JPgl&zhqTY@lcutq zNMCJk0T;}>H<0_rxjA)2I~{f!tYV08FlI4bjvvz{Cb~<>sMx#IZ znf|x3PXASp8&7uC^;Z5K;lyQy*aB&O$t%pVE&%jXjOex-Q_@BuNFwFcfZn`1+;2Qc znzduAD#ukFs)#3*wo9nH0p${U|1bLdX2DsXA$HX$erF9^MqNBMn~hX{^x>P;G68&~ z9hBw#en7`(0%EOTQx&n^uN_Xvk$^(>q>S3e8Tdhc)WPOA+6T1Lxx=I_25LnJI&ZTx zj*PSz6%)T7IzBOZqd-DBZ)d>%OL|u9oI%wKnvMKN>Z5}tbH{#Veo)Sx!8e3aQ@VEi z9~+$-ng2J&^Z`wv`9$MgRsF9+{i+v~;$Q4Ec(hhy-yRzXb?L~YR@k6jF-+8AWFM#b zbDMi1kO*achR1a1E>sRhXqL& z$lNd-`IT|7=m6?sqMeSBp`>$(3bv|o@M6EXr}<758ABPwgMpdBGB(qvXz7#-G9TZ* zwi$0CwF^8AWwPzq&8pWL)4b}+?l_-J!nGwf=!R5551;YvKY@H2^1^rT;R+Rr&%^;0 z0|xQiwSK7Uc$RCD9#&F96oulhGZlkRs!X5LK9@MmY{M&`+g} z^#mktiE}v5e%v0H(1QHn;hoFd@Do!mfaI@bmzynaw`&f(JDN_YmiS?9Xg=-qV~>2Y z=AY}ZzJHE~7-fC_v@X?s!u!g_l;BV;M~zWWrQB&TUmDPr=3p)!DDIX`!KM&Io!TE{ zI*e7{Oyd7hoZ6jv+h?P+xkF)pa0gp;1yR>|tr|Xz5zpO2QsIwX>>LAZ7X0RIYPH0) z4YJ);{pKa_W~S^*kcn_zM$9oR7i3YH1&w~|sjka9jzmq*_S6n@F|S6&_(K){SJFAw z=F2EJ#We4o2cMe;$F!#$Y*e&fRh@0hC9_Cgtds*(a9DVXak~gmWRE3X%zjyrf7G$| zaHClBf{H)AP2!z=;6t&aCGx&8V$bBwW8ep#mm^;6dk_y7bH_t$F==-@Mb9y_w1`Y$ z9C7w;o!Zw2kC?Iw@{Ad{jftA+2PxP`dDtiC>~fZ{x(KM+&O9Tmr5dla^R@P%rrMf9 z;vJ9t?fLc_i4Vtv2f96GSJU4dlvi}Akh6}QabF9h?k>Up0FOC zqb;5#60?)Ok0@enYC!_2c@fjjSBV`ar5#KphY1yyzL352oAO<0M+MUdZ|sOR!+C_> zE)mfNMcYc(z%=g*JnJl8v%95xcct!bs*6_IVZ5-4f~krD5xs2Qe6=#tvyp9Q)N(qE z{cSQ3dLL9f56r@D#+sVV!sQ$p7Q5+YrlRhRPY%bV`p`99p&2oBO{u?3yO7(jB~y%u zDYI0u=X_(gM%%)gfukjP-#2Z2FWx|Qh&FCmx~mNuR});cbE(JNK4Ji<`+`O4`8+lBtn0tQx=1F<$Y!0Hsh2&!+yCV2?QlgfVFXSl{uhN*Nyzh;T#QAn4$BaL z!pl{@{RbneAU*)74@TQ{?!l*>JHc}h|K;K-ym*U-m$}Kq5xpUXysM9&y4ME8j|sMn z$%!WC;0aLqPmm2G$N6&CAhQ|JsMrIRcx7hh6OuL z&CeuHS{#R&U9$3+2OlE9jxQh`@wp1#MucDe&9<%B78lRD;ve5#d_z^--fnsKgg z7fHwMqI(R(VHKR71j3d9l;&vXKgs1n0)-@>=Eqk+S;jh=wBox9Wns$$WL0_&l{wZV z6-b3r0mWiRifxw#ifQTJ<^R!CufPi{K2e(|s5O6KV$1nwCSb?=g^Z}COH$wiER;u= z?1OL!!M-4sd>|$S()YJNM8mLS@=kf+e{R{qr7`7#@89V-*nAI6hC58}!Ohm4d;$r< zEZv?qr8OgtfkLAri;;|AxX8)P^ecFj>8`^OA({m~f_bCcA?QA+BRkihookzvXTZwO zrobwML#MFiYV}ahvCD{Od`8ZepvlU8+`z26`Jy)CXt5m2jT5TG)$+m@J5nIY0uy2j zh=>8oN(ztq9A5h5qoxiNg4eQiYL~AWKffEU{`~O1sG=t15#wEe1Pfp}TNsr+@@4dNyHOGJZWp=lyqHs&$cjI^mmM`)m_Eidc*1?pcOfxw)0`Luh)vU*ZknQf?ppV z;EAiz!U+mpoeuy>lWEeD!b%(II7Z6$@WZ|2Ov7KTqU#ihXl4=`d{R0D@yR?*r3O126US+Zft#x zf0Gs=K7x68n{F`i#%$YSOicM;U|c5f+OZ##h{0-w6>wxDTs%A~IW3g(rBmFDD1gAT9cZr-5)a_<~Yzu#_<5qHNoXu z1V3tyzkALBR`CW)cI1tj!{5pr0FN6wpYS*LsE$NWee4U1887~)R}U`a;l#3+>6}xX z5Ej&ZFX!!gLtrb?xx`&=w)EuSe0J7FrH&V+jZ8NVi8?1|`&;Mzc0~B7p zM;kh_a_fG2M&kU!c7&Yb-9azZ8ir&(?V%iPJ zcu79C;Jm^UL_Mc_vuZ?YKH7Eqiiy{&ITF*!EbLVT0Q?KNO4 zW{!wxSV->Ylf=^B%(nfRGY^y_$>uE5-g2QuL|%D029L_qI)!q zq{4Z>T($Lak?~^q?@`enSt6)Ev zbIl#>*Ogn;Qw&2ZBT0>y=(%pIy(%}~r?1$ET!jDr{kdeigDeM4n*eKJ=m9-6ylmm_ z{Q?*naJ?hE?D6+*rbyFpbZ+Ny9pKJMp;}`DpuOcbS1bNP`;qsyBC;5oxmJX5m!NzE zsDuIS!)=lG(tUBce~-n8o@b931q(VOJJGqMqytD*==u&k;KIzqx4QE+%sz!OvLAGB z5i4)=j+oNpgUk5vJH74kgM$ObVFACKCiH`9bQ?d%_Wm!n{;gUi2pKkxA(I(5QlVN- zWmz%c_%By1GS#Dp(*>L2*u~YYw`m!|B?8NM{wAZ;`4GR``-$Qr=zC~be4pn;U?=+`QN z7Y;-T$GZ4VRA^$G?So=9r)z5Td4BB(zb>zOzP_!Re^-68cdK(b=-O5lUdxHP!S>Ff z6(j#O@*^tvfzN~O)$3uEmY)%L2MWmEytxc2&I}}vt_%<``J+74O6c1LYL zapoOO|9;Z;I5%elUR7_({8phQ|B1Frzd*pPrDG#7)TnDt&u9ywPR#Wy0qFc&xnAkS_dcJxayRsPNv_%Gs z?f-~T4|tJXmm~gfSkmAB%RRTtYf&!83~%M7%H!A0+o@Rj6*yQOgQ*CVqI=~;Nq_Jm zp+8lKR#}@{h!rh;@ey_vKj>qv)S*!0!QwKhb=+o^FB4l(^=*Enk-DNdd8f8QcuH^} zKB<~#J>sa4(&lq<*78Gr#YFp$7qLc7LIx@F-{eYm6sK`*M=xDAY|B&XB0MR4obh5! zSbuQBMC6H<{~z<^@cphUG41;6O1aJqHBYRH%V{;GLrgj{tv^R;hXO0TEqp_cEGSZE zyU`;6Wg4){ih>x*ejm5>mxK5eu>xn6P^?JF4nVPM6)09lh1+k_Bv_bSNfs4~DcdI$ z-|nRQ$LY0jfRVfr0ptkC!K1_ASE~)eV+&XMZ3dVR{piS6qtWBpr2P&|kQw*62c!2! zT}W7@M#J#>H~z&nQOmYwiJsxn)cCxs?+-tedaCzumwsR6K*IW|U&Hx(Ebjw+w%5Vq zfu%Z>wZcoa&EkDsP=k*r|Et*8m-**v-~^sn_*_~IT|sfs{R1fQW#kBZVL*bczoqO} zLWmKMBIIUN-9Oat>;r5*KQ(5B(JggSvvD&-IMGGm9LQLG5lDkWRk{T=(T)if6V&($ z&ry;Byr&OhjObGF2wexW7Eufah{ZQ6b~-bjx~?76DJ&^emlsc$0isVy(UsodA!?FX zVe(d#$6aJs;uH?M(#4Y&S+H*l#=;_po5hU2gZ1pCy7#}=KYt4CsQPzV#o1r2Y*oEY z?j^rWwX^o&K_g!Wy`7|d=WjIWp{_CQk5Aa{pS`SQ!XDMZlf~_*YSMC6V>Bz9%!daex!-S-<%dV{BD@AhB3Cw9F|%(GSO6Ot`XgQJP>*9u!a#0u<%Ib&Db?S2Q_@)IsJ$Tf^;-F7VU8}40TK| z5UC32s(C-#zkN2as=WyRjyo zu{xsbXIvC)#_P};(D(Z3^i;TSo!GdeLmsOXcEN`$kz+{6-DiM~>l`5khAUK_DyY2q z+!L7oA@sVi#!&DvmImMw+?llxCG5+K3`-i;p9>IAZ3ns=1It_|&_Hb&P-u8LUE5|^ z_C&0SW@fTzxRFLTU=6WC&BZx?FDOMU4o8g6#^Blzo(vLtSZ@@2cCgT&GV1;1aLKWd zx`LN}TgMx+QuO{{U}p7eq8VEgnhULnB8r)2bx&2+3Sx4u+~65V zJ;OY8vgr+q`m>H?r}rCEX(inYIqGII$U5@a`2?wp&NrM;o&ENw?Tiaa^*Krfdj+v4 zgM-Z5mnn)T5YfEe@t4W~cJ4o85~pWcmD9^clb2T=^U&GYM`ZAyZ*22NX0k6T0-)_KVa%Zd60)ePO&yK5R9Ws5 zbdKyoiarG#1-m%uY?#lV*+{*`T7~@MP_LI7x+U^8|JQAovg?~-TNCYc3SxeF*H1ud z93KK9^*dv^{txOF?DOMWogvRJwBPnlTAzp)m%q9B4$*v?x5m9yttog?J??}{q_5u4 zjq?_vo^)CTcly_9o7E2=Uq^|Y*t?VNi>+x5m+D%!+h448K4Yu7DwztNuK!w0{4Y){ zrhkO~XBcty(f{ts{bK5R4m@nsSF^tsXz$G;FqDm|yM5l>e025J>VK|pnGV`df=Z73 z*?iv4@%!2w7>YhVNU^2l^fmi-wSd(|)s@MHe;UsJ&|c1uitFtU)Vb{Y%w7^?VT;Ip z_2GopLjC&jlM-XnKhC}o$pz^|g7mhDtQD>bzn52Ad&n7(zm5!jeGO*YSFn+ceq-)T zI4mf5_tM({+N^>P2xP5~Ks^dbgU$QaMpTS>!X|>v-K*lW(7ziR(oTzWE1!)!@}P>>6rn4C1_o_Gv~hJq`&}?K`Yo9Q%qw zLrJ=ffeCZy-Vw`fqD~db05CQ%L0Rrs(wh(rs@iLvrsL#D2aIcR8;vv4B08BQozsq= zjY&ELp1KVWdgQzVW;)siBw%mlw~2al=RM3<*TZ0tT_J5UC^m+qJ}L+;vRx<`$Fdfk z8KOMg-j-vha)+cV*OIwW!%w`)UBE%iGG&$ah+4x(6dTLaB6&|Z`BqyG)Y6{mE`!wB zBhm!H{SZawsHU3UM~Pul!jom9zGb0D=RICq2qAA}Mg*EE%O+yO(y>F{xnct8Y!P5> z%e8D9QR)S$n~|Km$5U-X6X%{QmfFY8sAw;SsU;!fnM*Rp#kdJa;seKoJ=LcA`)W%( zt-uobdM@xDNT00M-do!UDbn)cU0md8=Y_j`%=;ZSdUcB?mqt8LKShtE8@%9YI@8H( zHHm#(Q=1$`B11Khl)aiax2@*pF6u(IS1+a;sqoZBNj_7&&cj@!Alrs-h3trg-i2Cb zOEO}y^N0CkIaXl|BRH`NWieHR_GW_fx7 zyj1{}PDot&BlJ5qTqmBFwL;HgYB9>9qLZdvSGlqqIkp%vgN?@c1-iDRzuv}_ymO>7 zho*?LQ{Zrahw|(RFOz@2q3K5JoL;h$oYQX0S4$%a;7=(y7rH9u>(OpnqP>x(-Dj?v znexWm`qf3g!sVy$8lJuDD`l4CsY^6kc1n_w9J-A3gZvPxEUN+~4ndb>fSdujg{d zOdk^@&_L3_RG`k4&et^A32lJ>C1`~vCs->K?(-;8+0 z8v{ILD)7LvolU=;N|~x-;OuHUPIZT-+6K~MFjPmmib`OmBt6~b;t6KovQiMPUQcc3 z)x~-q-iGTvq4!eX;mE9kUMFLP2P+S^?0%v3@2zQx7zab zi}~!lMR>4HjQgy+P5k_pd*UX^fk)B>oY1USZIb*lC#?6aMJCD$b8nWXy;VzC9@)=a z{lno2d}I~TMr94AUYS(qMuXlA*SPA0QmDc2l)T?kPnK0;bT%pv{%A_MPO{bjqU`6y zw>jcQ1TcJ=uaY$U=L7|@y+(*$0)H-?KzP8X%ehMV_`xEDfx{2&ql$%~&mYODELN(uOKdq8}Kyf~kruIhq4 z`3PJ0_>f9zmQOBN(agLCdKIBt%$Tzi`RvO&#+l&w1X2ZBHx$lAg>vPYBYLNK4Q2{a z?V)Xd5jX=m-MYcyget z)RzJ?OMWu>vVF#BM}st8f|j1`gq=JNo%oh0zZI_+=wV73cGYYRpB4-_k(YZ zbEYmEs)AQvMsbE7rybRbN2KxGFTf#!8-SSVZ!e1=iEIPTPlKb6^(9n0oYJ&c-1Wcc zAe`*q6RYj0dKB{7r+674#s-K(xJWaidCa!0t%mmMvEIe#U7@s6D$QU<_`X-#Io%K?lis_Y|RFTw}7!YklcVW$)q@69Iowtk~~<@ z>dlDl;we`Zy57%`6WrV8<(5gALDpne&IzqKnNwG9DE*vu}l|J9XJg0(*NDNIn$Af(Tf?Ei6WIqCEHWL<4J_+wp5<@jxUmtn3+ZMXFe*6<^zXMzG`SF&AmCeplF}XVak*mK2nH3_ftn!eY1Y&AToU#8-J# z&+*P6Pr{{<-+|jF!lr+-2bmI2In*1}2M8dFO2pf%>A&EE@Y<`_ZEH2t=xagakDmw) zUCA3Xy{+>Faf)_EGw?S2AW5IY)3aF^`o`7K=izo9kq>nNjupR~a#X8=8Aisa`+eRQ zE~78NO{!>eLpe4tz}T^odl69@!JtI;T3fhNOfRhL5lOfBipj>tV;QdmfBIVTfq8Dx2gT+F>H`ANNr%QxGx|15s(ycz z6^C3JgMU0t`*qq6I~rN z&H6I6nEbf#agT5Pf#mfKg!+B2CY$7EJ6~J1{CflE7dEsX)I}t%vrT?1RCIV=i&^>z zK}35t?8k=1@Ax8bdKVoy>{C7Y2$xJQlT1c(A);~`e3!CqiQ@r%A=iA~{FaUn9Eg~# zF~2QM3chySr7SSydP3;U)OSlIw;v}SmXCh;`OW`ilPKJKPgqOyj#*8U`VzNAh7r@i%9(UN;mKV`D#8uM)@xtWl>;pbARxl%)F(9`Jg zOZ2E_%37XP%1U`NUHf|JZk&dGz~$X#D}HK&c!TYg;gP~0%qpCBt1wbG?Vgg=j}3UA zYxUH5)kDYbO*HT+|Yb*k~}&O+i=WUH|% z5BxjE$i=u{j84haZwz%WXRGLXdpx$F+SfVAUP-%bD~t}uluhZ)JecwxS2?p7*N4Hz zd@vaNW-T?@+eJ#btlDr|YKkkID#$LN-98NHYhU_kqWxr$3snhN<-)MVfxNo3t?h`) z;Fxj;=_hfuE*8(?Qxh%8_E@Jo?tTR>l?14A)f`F87VS+ef3#6m?i1!v?HrUfR_z+{ zPJO@i<=dA_J%8;DRlBCnk5qf{f5DyV{e1n$mH+p-Te~r1J2O|x0sV`CUN=b|Mfxgz z-QbiE}=MM%Hj-2;38Hlly*nhLnY90669_5L)$}h7w3@ed#mLqNo zYf+b*A(sTx)O6gNhM!K@rzvg*S8F0Gj$ZklQ1OxqJ)7bx+xrJFt*=?+=BAQ9YH1)F zuuNN54hST|HF`1X4OV7h8(i3xze&sczZSo%v>nUYc(@XJR{kyPSfl*gwbF>i3b*i^ z8|VW4NywHv=4RWX^+zLctf}?kTc!KI336c_@49l%+a7?9D`vf|9al)2vx3FjNy$4P zy`_-H${o-MO(JA}a8e~d;`S$d3$pvyk*8+tF~+mn_!gOMPWO*C3pZV>fimy=)t@!e z>Xy0C%pxV$x2cFc7ahG*j4Om+Vm(;z6r zBivop;!IxAiGZvGq@%v~G3i^xwNdm6XeD8|>KFPA>SB9SWA=pv$IsW_| z_Br(1=<%ZM4!-Hnf#57?jsMca)?(u+qa1P4$AkIxDLeZ%%lJrST>|f!vy*O^z6abO zMrHt__uHu1k^_`BTbt94uRuywPpHXgAaz`g4M_DPk}a$D4;)SM1MHg-RulrFO$v;} z7pECBq~0#H+#KS6>~dkZPH(2+>{Rdf8)=rkcprE{R{Pp9)4Fb9zr<(|eB%Mai=2;t zTh_bQ7cP^m{!%yK>)_jNcXWxfUt-Up`?ZH3;)Qe_blj6UZb?^85vC^{F<+U1{dxQQ zsAC2x}1YDeFblmCC$hnVy3w#>7TwW@-|7kgFGi5NC+AhKI+H^5&&y&0 zuexk#C#mCn%joD5Ip{yBHEn;EEv2S9PFK!^CZmG>3)54DYf4!}Xum$ysOh8`mO*?#tF4iDE}e9tPH+mu6u z1Uel15S6bfPAWikxu)@C#Kxcoo-&mpiEZeTZF}OAy^8z6yt3kL22MN-{-_bgzqUzj zvof+$`HE3PHp@Yjs))@5GEZ|K0_RC=_6?}`isq)5<7T{>k^$@JmEWT}JY=rAVDMVB zfBx;Q;FUr2_nyfYPXc~jn^g|Jp~u~sKh!E8u-ss1a?ImW@CUUkkM2I%7g9j=cc3?~Q+q+4Ux!G>ngBh00)FY8))M^Qcz|`BcP6^}sxcFVhc1vH(Kq-aKm@AdCOmBvW{gOb-@9$S%FV*zK&Is(-lU9q8}wIEdcoUe<7@j?o9 zR%ru1+9qIY#nRE0Lti0z|I4l#tnM6YmAsaD0I9AK3V@ZHnxtQO5%@@?5584gi`PGR7BM-)%>Gt^$lkGtQ=^vWlUs?jsLtdA-_&rlI> zR1FRC*v_J!Eq$uaY%TYvlZN+kAwKvS@2e%BY<3mxO?bxQKkC6qCQc__dccJcvW{*d zL)1>2HhQ0KK^93utxJ))YICbV6Doigc;>jqf4?Uj`4!hf8Te$z*Jsl*`97Bo#@`&7 zHgY$FTY%&HsbO|l;gU$5w8+&hXXOYPx`l#w*rtV2$ z{gnf@D6ew`+N1$E8}tJ;<0^y^yl#2?`O0vY*pqyR!`JQ6ElOB@2PYE&cY*hW3&#+G zacAwywdG&;imy~&xcPNBt$tnq26y#t(aYQCZKi8(cSOVu2gvgkU?T8cNT@giqeK(_ z=sbRSEpx5Sl!X4%YLRz*H}w(t%yZHc)9;1%p1uQT0n%$ z9#DFmWrnfN-Yr*oHI$EIScxMGXSHr18EigSx)HFVm}&DmUzW9Usqp5dM9cg$KTn0$ zRO3o3EW$X%X}U;Dvu|m<=XXnzJoteP>+?axB^;tV^7Tj?sDN zdBqAcu7)n-4kv8E9o_}&oPrnOA$`@$%w5*yNV7R~+KHcx`^fD)k^m0Gg&}oy&{A0B zPRVGELjnmHo#MIWUKg6N%?+|bbE_Y3sCU`RhWsATSN0P z@>N8!RgMI{Sw^?H%A)1{Xb#lrtK`d>ME(bvfQn*zT1o`sEV&tMTr!JHub8VZ|m~>mkOYYZY6FF*c5&)J#g%xrT%VGafxKc_q zX$lR!Wt8*me&m)uPqgsicG&~_$N`Y|pb#=-!(I7;oy65Qf^{41C@Efsm3J)gP-!m# zL8UC#wa*B#>f@T ztL4ra9N>U$2=e@&rD>~fE()*j2t9=6i6JghgzsRLoIvIQ47oh*^?MR`+S z1?(d^Z_Hhv-!X#(8m&pJ0|cMT2{KK$``bZC3I=rp{5b7Pux<2N~#2?+ua)gy)K zH|dn5DTSgee2KsB`@m!fuoe;1jPD{}D{85x_`eTKQU>rR`V2hTkb4sR%e{Zx2SK_7 zU?vC7Vhb-31!-ucGp%SC$4&z!%0LFXpk7KMNoGt_WG`+KB|B4zn}4+P`M!iZ7NxRg zTdyhZepMGad*IZE^6(SD9)WHP@ccCH&|{cDX+?SNs8^_4rty!5==Q&uGft8d zHO(TKK1b?=Ejpg_M5(;#vH+TSgXGr%;_j(-gM&yv9dyk@=di2NbGe9Y3J^yH2^!3V z%v?`Bx;!PS4U7l-%xEwB^Q>rSTjeGA{y8Pzs%z7!T5r7AOKqWiUAc$o`t&qi=psrA&s^{s>zTPr~_;VgcnJjq@PJ zFV>w$7x6{L1sRm(Vm89$I)cR!wq6omT2s8WrZ|dK;s?-%B#B7p=2vk!DEn~xEB+{{ z&py?y_eDEHfTHTzJ)5iEjsu2H3nNAgmqVBK1p_zxT$(*so7d^==x6JZ=e0(iH zsPT|4COSK80ZOfQKTU!8QGij@qk0&SAqPe!oM@m3_pS=l17#g8{O>mlN-wa1%~Fv$ zXh%9K`#2K6_Ei6;)SpSzhxpWK-*Y36LeG6>E6|W}Tp9A3Q&^AYOFO|O9oy4JpU#yY zT@z+a!EU7m7)P9J;CsVSZ!>csh}&gHYvR@Q7UCZUFuLDgTp)qqX;$8Wxy_aZT}j(* zF5&TPs0{V!SaCR&^Nm40WxiBtdR_6(nqp10*r)so8SE=c5pormMHSjrF;@P5BlY-D z(V5FF3eBjPFcj;J+;4Ueb)U3F*wC^Z$~{ax>ZflAAYAixnCCF!3CP%SH6g^nO@jln zuLjvrKnDPj1Dv`Ko;gPi!umc^Qg4)Ot3+fHuFP%F|o z&IvRklgE96Fx26 z$}Y?DHBf;KOk|6KtNM}!)wXOH6LaFBj#$`(i2c_U?E{RxgI+oJg&3^0RD&JLbL=5s zJ?CS{F~3qhP9*7ay}Nwcy`PyuXVV?9H8%e6Bto{sHIV+Q3-Gny33yhKb#FsFyx>+E z+Uoct|onZv&Z z{gO-jfjztml3`aE0H6;}00C8%MVwQ2Pa+xt5*%8ji-qrCj)V$H+8X$X9ep(_Y<4&X zFT8&+v0283?hsOwB|c4Oy>7kwNzI+6VK|D){6%Arp-KA~B%0*zD&islo=7pp-v%9c zPWM{Y?Qa29Sn9>IH5=yZFAa?#c8?B1K;eqlBlg#O)d!5Q!a2nu3liZ;qiUIH{IOtZEv;KJ9RS;}KnDOLW&aBL+zf{^{fI)bO>`zbshcy}Z z3wsXVxn&_fc~9h0!kv>~Q@13(yN>P4R; z+-U=%g*|p=Qbb&>;nn+2eu+s!XDx;2@ih=DGPG}+zR2itFW#} zNd2Tx@4NW|(}ly;{+5PTu-dHdXB26f#itdwKO3@SyuyY_VNrsN#hF)YH-!=jLhh?j z$|^J?5Y7;|#wYEX0EiZ<#U+lS{VzohO>C1Yi7O}{)w;)jbLw6YP)!5sV}=!YK~G>N6@%6^AOjEuPM*NiX`thpEyN<_2^l8nXg;EcA4`sQP#5|&~GT~ zuA+Oh7KXlWM2g>>&p~O0Nx1^w{sTN;qbdy_*4ZI+_|D?x^U@!jS;!jQ%73yIar&Lp zH-hR>C){gbBEa390wG}_1nT#LtB{$Uf?g1z(q`@2h0D#W`L;_UkPDF`T&Z9q{_8rE4T_`$78t-86hsYMq>FvKnNsEL z;4wIo^!lBb{ipbE2n;@J-LIQMbcUnU%qGez?dYQF2h1Gi{kn@f)B?Wk=qze`UG(_{ zG>e|Yq#U{^H*ZW7$~kBBk4Tlg+A&*)PksLa;md#v5&o6SxvFi>U33bQIy^Ph{ixIZ z1gXLGny!DlTUOl4)U``bu24n_-^BiSw|q6`QO{T~hzFMw5RY4g8<+DXByrCDZ1xop zf+`?U`a$CoDmIiq&I`Fy721yV1Q#iOZqfdXV>9(G!{HA<$eEV{a4>}8?sqUp(%?fGyp0}z9hJj_?sF;OoVbO8< zt0+)Tt#?9{w5wTE(4~!rLd#S4Y!^S7$`_A&{&(;1{|>KQ8h`lT!9Xd^Vlo|`#Kp)$ zRWw+uuuPy9?dUm|IV!`ko6YPbn-hl zcB`5B9=+9AVDVlRVPbF1YcmlQZagV+0jpNAQDREm=MefG-g9C2JQ|87!=J5V}x~D_Zn% z)2_3hEYxIELC17dv!o1h(*gG7C(!cIliIl~Q)eX|Y#9}l*!Q!e)iTzyGo$Ej!KU|j zgi=xv7$xo3{Kw+sb};P1&+XCkGUkgX3C5HhG5ORPf>`;~Di3a)1h4Ed{$u(Mu3kye zAxk^=+ezvk5YQ!ZVJvSUmHK4IalKR9^G>=f91o7Wdu9-R{aMO~K3&xTo~zE**_6av z(m&o7-0IAfx`K3qvn~sG0)MZ_ly6D>6OiAnVYst&$EAesCr8- zBAO-)hv(=bdWw$YVJ+8gbyxXJSmhO?9AqNYsWj->pO+dC>8&?T?j(WZ z0=_RtKiuR#JNZ!BHvx47zpmkat2#t|#;UtrCzJ{jJG(*!OAz5<_LtpllI_ulsNX&C z>wI{AKf@e$V2I?}GiUE)lY;OMgv8#v%^aG63Tys->)HWV!7?wDYAFdu=kWv}deyde z4w9`g!8+X~+t}Yv&VEaCMMN_#e^T?k&1Tj(Jj;8$V-u%?gMxm`L9C?EiLm{FwCTjM z9L3RnFl(xRZ{(QO;WxStUnsEsGi>oBhPrZN7(`9n*wMQzT&}llRL6)`kQ8KqP6~zS zlw}mYikVZ|VDgZX6o7%;DnRp(c(acnwCQ->COQi%in?#4Y`sAC(`m!}{5~N?f9SLR zy;+nhH|jF`4yjao#85KtE2Vp*XIrt^<=cP-(iX|6= z9s80TR7F{Z?o>5&E45V(T@HVe+d|J6g<#Jja)%j( zxVKCnJ+(XGQX^}!;AMR0i00GDCf}2jN7ZZ=U|~U)mf^l7X|wmR2*Pv|5~023pnO z*it<_7B1Wm01ajVPK`1AEWN`Hcyy^IshLD31gB-{6!F zOXI{c?^4D?pR#Y!Yp#-HU0fKutf)TZ^c+~;otjepT7=Jdn+-151=M7O6V?Le=q2-P zphZljSYTGO3S$RRag#1Tlaz1!u{pXvYfPY@61>Raa?LC)Y1SNA%9{;1^QZN07iw_f z;_i^e+WRb4_P}1fZI^>KSSEJ{>W^C+6@#2h+Ob(q9>@QhwvWd>1!#Qe2~l- zY&iFk08@#e=4fnFVbq>m%hjslNvj}qVLY^)$Lfq(J*1$|zHBWCaytIlO4}Zo<}YX> zbAIBMh9{w!1PFF_6{5Dq0inC7pgnkH;}S>cl{s;NJ z5%r_Y(OWyuWp3@;9hd#q$gf44z0wzAJ8!5vCm-!`TU%QQ$}jolI+5bOb>eN?T)Y3; zL4|Ey%pNAd9!E!Nd}65Mxv3rikf>BogQ5lii1`x%3h#H>XFAN4C@o~^=-A%$PM>`- zeSS1le{*r^_rqbwsRHfxXs8XK!E5$f|Boo_XU{1pp3K!z-=-l>y8}&d#I`&&uwpL; zs49vDp*e?DL7J7e?&*gP@y|3kxVB%9Q@nmlF>14RwYF@@JhJHUozL0dFM06Yfnq9E zz7l>I(3x)3@ZqwYhPbCk=4y6taP<>Yrj5cRU%BMb;=UA)bgxKe{&b`IblSXLTE`qj zlimC2(rK0+=L!fAeHaT)psX5p0k2D(z0%IHnGwIx=`9Gxrr#@D$4Xdd81WNH4>X90 zk8aLg@ND7`F(3`67O~xM8t0F6Kl4;l+kNftbGv3h^T6gkYCO1pGjt>)VsroNfRK*c zXR=q3>pqxmV4L3GPnoK2t2Cl5Y9!4J!UecTVCd0P#iUjd<(*+TY$ zlW-~WipR?8SGb`_^P!Mzlcv9)I}e`GvXjV;h3)?}H;%~l-`lCNv+aGo|N3j_)d9#( zc|82p;+5*SY9+;2vk!mzTAw*`cT4ZT{F&(5oboSce}?4i$kzdPFzj<%Vm3Y&oHG_i zlpsQCsbyB`g)~%6#P#;nOBso;y-)vmk~KYkdd=}1iWQcjCUNeg86j*p@H8_3I zkzTQQMyD%*|1Syr(+r(i6a84|v`LKTKwi#gGt0QmXu?FA4LtjRvvcgvTq09?xjA^# z4E*=xxnof5Oj=Q3a;;fzr4J~7OL@=F zznf*Zqm^tmZ1)u_*AJ8H>14>8MhcgKEy%jiXu$1GfC4z{kp((#FSw#grLZGz(R#Aao>UBZ0_=YvZi!{!1w25|c);Bf{Y zkKarr*#{H~p_bOpbCxoC^3G1cfKTD7Cmx5o<(E9emr4%PK5drO_!Yffc1G?o9Rj5p zm2ukaQ_prJBD&7&sVDe5EBg@7hQz46)+jX|$m+OI@?N976Gt;~DMberJ_*YLo0fQb z2Pe`&sQvOScFDlN$zpjJxi2$QY%__uQ&TWh zRWL%xilStQKQn$X~mvMjIJrDeXub6PUkG9*|TKnnvFAt+b*1lK?H1W)2Nt=QPOyqKqzf5`@olsW^_o59^GAI)JO-2(hdP>9g38o+ZbIVr5UA^l!!E=1O#Q_q+H#e^W$2=!Ne3x9?(}-A~}}0wl%Yjc9=4 z-NvBM;>~@&p5IbNVNIlg9CxiK_1)Xe>1Uozn)PLtsEHU}{(!Iy2<60qrpp@HvF3Nn z(6|!A)ox8mYXUJ*iWYbF^3 zZ+uJ>4FpLA;#mmzAZ1W&4**qH9r!aq%&J9pzuCmQ>|YmAZ^MUuvQ(>7xoj|RdpB=O zPO?*hvX#(EkTtYbmU`NPRv?hxhG^*FKpku+^bmnl{ltG$5$y(5(S0q(mVkc*pjI?! zRJnlm=-B=r0(9|FDJQ=D;s@~3&v3)JtBZ%xm~lm8dx}2f?AzwzF(cgD8UFZ}&S{}& z^%lxEv8L^4t9&q4E1+}A;jFf()XX7|1Fe(fPX70(lG;)Tye`1HCh!YZsxu>4sasyv z+ajePwC>gI<|QOzQm!}NEooPRSd+f>C|l}cLCAK7@LG=)2E+phe_eFXcqqeBrQLj} z8>wH9GVCR$wLDJkCA9RK&i7)00?YbVZYKAQL%W>2CBz&%QERu~9RwVo2hZ}*YgghW^Rm<8PymG>_XfKNE_ENo`Pfd~3Kb)mvmPrYk{+HSBP z2VPG-8c4iVd@HE-vUZ^xrtF#tckI#vWIy@`l+)O z37>}F`-Id-TpiAi$vh}^CXTRq4y~?HZ&eN?*yp}63HS#GYatLH*2auh`$mRFFNeAO zRt}uvFx+S^PJK>NZY}F68_s&)X($IioF6;BJ`OYv&~c4>u0lI#MPK^_P66LJuuJYb z7&P=A6YYCoam`oc&xG4JhA3x`)mxJZECblBx zFJ=G>t0J%){9z^L$lDoi>y;`#LgL0#O&$*{{af? zy8T(OiSE~B^WaTUew4}|l_JE`|0I&FvuNSWX-G5@esIxwQ+LezZl`;kB zpyWltq8V7OdGn3|U)gZrobp#|fj_3h{AS3|eix(2ERm5?$lnl_%0y-XoxR#XDkQ)N z2IP%ufmifD5S09EZB}+PuQrnLwS7Jz^2w^@vuo`J`3q-W%%TaOwN1GAIS7JLMKQlr z7TRy$xA~h2rFCGw3_6cLzwe|K1CDsak(Ch$@{l;~<=pqae2SDH5tcnJhX5#PMlvHL zo(>SKzdT3(Z0}NC$ccHx%X~@Td$nEFdtR;Vx*EVg+2evZrEWa~e>^~w4h_jL#;B-1 z`PT)|g)drkndLYSonR+OVIaGx$M&yj3u4RhDTPPEQr}!jgq*d~zxs*mfX2s)cXC%h z=G45q{-SUARiNKQjmTP&L?iluWGZwvKkjtR<25vkz^GbaQ?c8Z<8zme+JV+oIk5 z;%4H?2d<#!)wGu>ii`0pZ@Zs0%)c$Rdv)#MhG|XHt)X?km+QxGg6=qUdyJm4-(a1; zEAGFQeCb>72>Qb)Q+4SKapvv%VqNtIv(XQ6;ZFgHLVrW)b{%ivr8VA|>0s9-*k^j9 z(37y+OY7}@4s|j{@8*UJx4*RZT-4(J*y-}$&%CFnV(-0f(poCg+A0Wb zWrVhpw5Ae511YJ6l+;$1(ovSu{r}KWM(Cb|65`}SM_F1&<^MxfMpso<_heL&(NmSy zS4HTlAoP``^-gY;W%ZQh^;G2b)Z`5`6b!YHrn*Y@nkqOI6@Pho4_Rpkc^R~#v?&r{ zs3fJYEUB+5uB#%UqavZLBB7-suBjxdtt_geCZel)LJJenQRP)rhij>F>8f+-sk7^< zvS_J7l{6tTx&SpbfVLV?Ujt~M4K&sRnwtR87M#|mYPRNjXiG~AjE9pQ3hSYI_Pj{I zX{A_GL$ZYl#o8jv(J|(H@cGCD_s9(I*y3~K`z|@p-3nH5MMDt<4G|Q|wOhr+`ih+P zJ0)EuHGTQbgQT(P%%vyE@91go*9*UV89m(V{PVTxV6Wu!f2kj~Zf?KFZ*5-K+4bE1 zfMqbOKYup)??3JBZPhn#Fqa%W&qx_?zyhFp>qhp+-W2~cNppGf_#yPIa z1@^4RT$EWv;~b*>p-}gvze}p+K;taj{*PK#4%W03W=2?&vOGO2&*h{`<}+RA_+gL?_5vQ{4GrbeF4jRb=hfZr}T3~cpIn7P$}#Z4!zB;dB(yn ze-i$eK*vI#v>TDOoYPc06+WrWt2Gvv%;z z^t^U-(|9{Z0CPw#?5n?-yuqvBA1II2Eu}kbRp_gw1fl%o&nEc#{-?zvsuZi(oD!I^9xQlLCrRN|jEM z)$QN3sQo(~fL7-EQIFw1E_&xKC=>7La)THO&qTJIC>#DES_&Y&yJ_{P)2;GBPR7pV ziy&-3pH~XkrJ!KDD-yylVyuNi-dory|6a}w-V2_nR9L^?5PTzg4wn_RrBqyzxNmeO zS>X@=cI0{e-R-&zh1O8)_wL;~4A;WIP9s&&Vb}E=?{28et=NydcjS`c^7WPb(2p$v zb*;)bL`u`D5{}y*Dt~I{zrp&}j<3YwQ^)YWvS(c>NU*(gN+=={Hz?Wmxo2U?IPxCd zRwc^usY}F{`^yy`QGM&NpQ7y6lz)8be_yInbYW+-xP4%`3HNfaYIRv^NHl=uGWy2r z?Eh>ImpDYZS3C4V@(Mf3n>=kkd=M|%6I<1^=h9r)=;S{-g_|DRI^^;DFmBjdyz%u^ z_q2#lWRIiRsiZx-*t?&v;G`Q$l*-!r{_H(A%-7W(k>CFO{i(#Nc*Fuq*x+iMweZ~< zikV9F*%`;S@Ze{++z=hlJo$@to0`4myHMvRl`WUOj)t$TywtsBJ@ejY@M(wz%~#&_+-T zKIIqBmdZSx{LdHud$*ZC&7fWKg&h$3)3R)^Ht@eJ+85S-Du6ThvN$fsDiM-kUs+&w z%kpZKQ|-yYXFC{c}NE{ye4-qYrxrve|AF1hYXFI zN0YNhB8GJ=%uCnYRuHgizH#_M=MCw8>T#$(I?yX9>J1-Hr$hY23E%vtUHHZWp+Iwq zM?2ETKU?ac(PiV=1Ps}D*zp?jnUz$BJV_Y7$)%N{qPVYYZc$z%c+Sd-ox31QGHg@m z`;@?7Xmn2Lt_-_J*(4={H#ay@R$S*qykp6k!S5@}yFELz^0!$hE|LIgntdp<|Bd2x zBzvEUnKhHyD+qOOe3>zW(Qt`Q9YV{aPa*0?e6~7q6;! zt(vFass1(lP3gSj8%tNvEtoYmjW?cVC2joVSP8)*oC@SLTwPqV&nth)wA|JeY<|7Nb?;O!`J;5|U4do=OJ%3v)#nx5)9P=BsyX6A zpep@{R(6VV06E4jpyFqnJa3!ZocGx~?9jXY4FC|HADok>(Q$QJ#X@kNZ$$laOY+YM z3?IZZ*SnA1Ygq{dpI_c^`cdk)VNaIJ=A97(_7r>x5Go36c-APG#K=4j_i1C2f@51d zs!Lu5h{$1%td)Ul-mD)A4?RZ<&*I}npK95?Gx=}BrL}Up+U1_6+k_nJgXjgdkl6XP zL+g*RJZGFde2vfEUb>&|ySTvma0?!0`<(F9WAF+8wYuHhldBY<(9k_bP7)g(AnDhU$G&6BQg1q~?TY}yPK@hd zg)SmYh6quK@7#J(arq3n?hPu$wDXx$3di2aA^U#)uf|pvzm&HHWD(7a0^OG+|9~L! zI3SEJVHeP~3155gAiTC+wX? zSD@_`Lq^xdl&{@jy#+|z?slbt(D7)2vwtD-@BmoK$4qM(G6{cSAWaTo`6{UD4fyv9 zG+lK3)1{;$eGacXar_zahRVyid%bsTk9xVUM_8<1dv$|$_cYIe6Ex|43U}i2q#4sP z^{iqYtJN~FPxh=7Xa6avopubDGxZb9lx9%3mHG1mgqj3{nRc~+DF6Ki$xA-dgm@7+ z9Gr-$WBfIf1^0SON&uih03FG48SIZI3KO_l?K04M$Gvr25zAI$ZggAyzB;aC%n7mt zF~O#9LdyHa*b*Vcu}M+@U=iS{`R_!hFKX_vkF%DXt(~B+y_CZ%VGZ2TmYjU&!VnK$ z$QbW$g?xzh?Tbv_9BeTJp$SCz8DH9i2mp&e93mqgz~)MWN$k7kD`Lha*C-_ZdK}O7 zlLIVQ;uH8NDDuQVBUXb~v;s~X0j4=F=8Pl3Gh7l}c!KV2x_;`>$u|)e8DjSk>6!UY z#yR`IXUt+vYdKf;W3I zu-__)Q4E;fc#b{nS1Gwti1$|B@{_HZX zj0N;}UyKwAD*t6Le>;F4?7@x?=PYtQdT~uFp0AJ?{44O{KY*sd&(mha^bd=dOc0P{ zB=k9g>p7OIbqnH%g_vvVOVg7c&t&8^n?$fm@FT($QII5|BrJtX?g7^cFy9BjRc{D2 zwDCZeC7c#M$IpnAoDQQ2YHbUnv!-u6U{!)Fx$W=6Wf&lN2FMTr1_gi(=s+^qC0xdP zG!>w{4;Nwb*mPY#P2pnL^0;df)8c{Bh%jjY*o?_zU3{e0zZ(1x z>$AU))s40g!h!t(EV@{*A%da;;q~K_KEcgF>7bMnfC(er2gehG<8oy{pq`KnVQIii zAFi$_@BzdT08zvPFHgX|yU)5CT=Sqpy;0CJguDhy(RT*K1rI?3ARL;Y4OgJ{G@R!f zkd5Z`4|`tz;QUt`v3j8Mec6)d6Osi$3Vsn_aDp3VLUnOqLkj43AiPu0c;6BzvIVlF zg$NH^Sw%px6o?74Fn*&PwBc@zNOhq=6g8_)JkNf@3B140s(Pmlr2;xyVybGd7%mQ#-AS8$oeMY z84Wc@;~_6-_4&K0u2`Om*-ZYOTQ&%Y0xtGgWVWF*)T8i1c3)$@4ZHe5LZey<08W$p zy8`tiPz*IekXDd54v3@@Ji|?OcFFX*Kwu?uXtT zhGNCPK*+Byp7@F)XF8;403uv|a}HStMMAU)z|C%e#>u{cElTiZ^IZY;f%g@ZN0RVw zz!GC{*(&gN3dj_jX+wb6GkIbtT>H!`jtGdRW|?>sKnekr{GA}jev*9!q3Lx}i9kL^ zd1q5G@`}kpU^1ipPQxr@UjgEx3Eju?=(WIJXg0VYpcvdO%7L%hM_1G#>G>+(-l5vF zM-k)NwX6kqSFI-?-)QxC-^q8D4@6d${0eN+K;0`@g<>nfCMbvl9O{e6<2NB%A@E2;AI&a_@W6`A zMG&VKNDM)ctbmwe2l9{l{}TX-p`fFOZTUt#&IpJFp`j9XrA>iri3+=;3>}Q?&QJt8 z-iksyhK_oujciz5@=^NL(wwu8=dqK7MvH*=oS!zdC^La76tErxniv5dy2Ev*jOPrs zEGiuO>$uf@gGgkgHt{ZkRGA}&WRMBA4MPPX0hbLME#zr}yiBmSCRfc-*^e&M5+(Od ztrPlpl_T@IYZ=cK6zm1_3Ko791+X@wR5?1v8gBd5zm&JLgAbPsh5M-I81p)F+*k_? ziPsvgI5ge-W=g*b_CrvlCJZHL~9teow0{~p}yZ`{mfp6aPLcf^@ZCxMTG8vUT z|jfgdAM@@*YS)^Lpz(O(A;x$82bnRS&P$u!3gwiGD~!)2Gr3dW8x7NaZ^ArC#?o zft(bckBp3p_t;h#y7Z7mrl4ZBC=iQ ztza!f&x}*nWzq)}b#cUsR(2&0Cd+xx@PuZB18LzwNIbA|4o<#0p5u!~`3{)kN1d1J zgpOuEC4tJ@=e8Y(thyjCDN_xmP-{d}OAbhh2~wehz<)>D*TL4fIG&-DE9I^Km^n9I zf<>4L{9&<|I1R_eOY91qqvIFQT8-Am7v>ih3bh+A^=qX`9|N8B!?dXGWqOYV0bns2 zfkO=jjs%wuKG?1VD^Y=)RSlhCPf&+8zro4LpPtym!JpQ_>PAmd>vJc9qC+Qk_byX) z)X?&6K-`88V=CQ-$}eOR=5$2+$Wx-B0ld^c^o z>Q;4FMZ&O=M@au+jBtSo#OmbzqHra4-Msoc-0Z?Ba2+mcrM*M|(RJ848kl3J|dd9KjEE~dD*Z|@H zfcl`WC_jJ}vL#tFLZoR6qSX)axyq6p7N1`E)*Zj#f0S&Z-;Ll3h}2?48{hXAL;+=( zuj9JG7)|1CBF``EEo(T$m|m+xhw9+LrV>x!__adU2Wnkw5oY0Up97yZfRcx|6CMxe!hy`XGPWvs z4wz%W$hb+nzDLfQ>+^k&tF;6_M+ipRi4ze~?&cJQ@E2<4n-B7$^gC~FffV3M>~Iht zA`Fh0vm-#>q!qLYRijbojY1sMDxdY)zun*G;lW8Ad>>Jx&M|_bNDvn>IO87x`U_i> zPG_sdvL<)Ie$a0E{0ToD1r*)}A0JoLk0_-gE+meSH!5v&n>U zwf}~*&-_bxO1PA?$INL?hz($UVua^v%l$Yd;K4IsfB6T0Y^4z%D2N9N1Ax2$dfT57 z!}hE4fP%nupgaNOascr`a6MweQt_<$G`6ZPb_$mD2A%5(fm6e-z!C>!1OcymMsP6! zXj&?aEjw1;CrVtBbE<&s=_k3$Bq}S<6b7Bn|2Na|j7(9SKW9y_{yIMc# zF!6bPIQ!!V*LVFB$69wp(PkHJYg?y9v7B1_68*H*ot;oRB;oiI_(i8G)s6z`QH5P0 zBx%khC4DX6=60ENp=vN{{jp%6@egwZ=(&2+%j3zzhA;XU2uK}voe6tDXRE@p-9>P8 zGg$Kw9DV$tZ28l``#qX~Lhd3f6mZmOzw9^t(9`P4K0N>vAzq7mqzGD>9 zo=~OeQQz{myZ74*wkrEBXwqP&hC#V49jwOk<>v-)rUO)X6J($X#&vx*AOP2sfK^qG z7#x?Sj_EQmIzWp6amVr;(qYL=*84Q}9@Kt5^DpB+_C6|m51loG0ZYbm?$K_#XhLj3 zQ>siiw@*YTO^7+=7Yk}qgj0rVX%<}>1E^z6#r7JAxWQ0dBg8StSampIazisD6EvvOs8H{Qb4r^Ds2eUa~ML*4JVR3MU%S-1{e zRqfk@3f{cWq}N(Jy^SK)L+lHrkvBvZVY$yO6s(dAHE}55+0E(uY44YH$abAcH7Wdny3s7GS%FOFY6(8C&_6#G-AAob?y23q5Pdds4`V zge$$?y5APyR(}|Ql1jL%^{mo(+0UDE;t^cpV$$pTh@hGW2UB;|1k zPcMn4+Kyq?3ghC57S-xvb>pxVGW?0r1LL}c6v~lMHt0XY~ms8rmjYaewup;vJ@~b88{qtGh4*ofZCr z@=h{|87-3~pLM{UQhVjfcenD8+vSaX4%pqTia1F&WR}74-%#>ti=P4%sxL$4i#$2Ljud1?Ly*Dj4Aw!( zMAq?XVRy{9jcCW+@icKKLtrXQ5*v^z7$YLXrqoBdU3p0;y0OsHFgn;@`R8BcBl*f= zNRhl2Z*q|nj@Sr)S+jD1J@L`|+yFg0WCv7O=HbVX2AvP_tv7pD@1?WoCvp!$ly}Bi zd#DVVQ&B(4E>@=3V9>0!&Y)J=ng`oA%#YB6UfV?zGXqD}$&!hRbE_u zWMVx_#>W=Wks1{d#&#T1k)*AU0tsOi#Vt|bV@-O$Vq^w)!ZOTkluSlI>TU=`kDvXj z|Dc7keJSDDn*T(4t-wMvivi8@tu?+(LIB7vvj&#p4B)VD1_@Fq(<<7Eor>Qyg*pKB zDqnvZB{*M*=?R6%R4nF%8d{0wYC<9g>ogTqiL4fclYUXukWeuWBF~r=<~>PlIOQZM zXyKSQwySnf>~3sS06dL3k@k7qYX5)_eNhK8oDh6Yu!kb`%CHcnZWo8rIWIF5rz40g z3;{QK0I$i{dM!GHN?}nC1t@b6d`}TS2EcM&5bSo=(xbfxkd_uZTO*#E+_~<+>4X4^ z^dlhXc#_%2ZZ0$0ZQ`5Vakl>BCH}f=O$5I%z;6e7QO-}OrXQ8a6+|GgsbblDs56p> zI9A&!8Ns)lo5NFcRtN`~3=_^xmH3Q|5RB|8JmHRh<2TMkbb~-snVne`lPvQC1@Ty^ z=TJS7Z?J6R=l+~!H+|ud^^JUC)|BC)eY;9BCz!2^IH9*gO^>3dNb*Eaz&H1aEkS!K zLgDf=EC=~$?(f%^1Dow_8JLPyNQf$GPBfyThQ+8!c>rB2uVGZx+Rr#EpE~}m*e$jG zWHVtC@L|5gpttmFiOO8!I5+vEnOUwbA(4`1-bg#WF}~E!JK_LteUUo841ifmYL7Y#-;kOi1~Dn>W`DmE!oU z`Jq|g$vHIEagq>zoCC=OXo&p){zFvxi|vkr!xx+vs>=+a>KB) zY7x6ncryTG4qTxk@sHPOgDXp@SoYhtYhf|L3g)|;jdyIIt;wPCZ6<<0rPK+;)*c)c zJpPe1)$Tz09QX3ojYq8tI2VKlf-GV^&gMq3n)~_%E zA*tcBOn7J6l$_@`c8R@`&a%)#<*)3^2!~AGEEGhiqMIwSe_Tr8(r2+{I*VcGWDPyu zR_A~YJ2t0JN-9pK!*N)EuqyQg#Ie4iiw9*d2!xmroA!g+f{s43VFHb2I{`K@<0M`7 ze;5$2GS(D=`CkTwD78%%WZZu~Aa5CT?Zsy#Z~KbEtG~M*jrH9>dB4llB@1#g45&9b zo0a&N-=FF2dGl|#k-k&C>*adk1;6IDRBQ_p-A~Ck*%_A(Q<-2BV_JG%QNGSaayi3C zB?+%nSDviT0GI7FFYu1pLS%}&t@#3Fd;W`T z7d!KZB?1K&TfjXuNZQCXV{AzNW`IN{x}sEOX?K-aEg|tVFh3*RqTRW+5H`0Oa17G8 zgy#Szc(bNb*c?tNWRoJZ7(zp2>f4bbp_=O3nlF0hsB_Z3Je8IF&kPg<#awYByW4xfo00c>L_ zkY%#0_~wDFh77MpbkD?2d-Km>RjrM4?H2_9QKn@DfKj|UR-%tkWSQb`ISNZUVoOvO z{g>1jx52!~UANoU$NOG4x=L=R3I zx`8A;1=xRP)ESHddBVO=IM~C+RK&GzoKNwb`bW@zDY(Jv)ehpnmjTg8+{nI64m^d& zS&1#t(rz?2NPGsM0Ds0}FtDqdu>K>^fP4DjJz$ijwD=C72FH7=^=_rB!8Lboc2mT= z?z?kkITFn|O7tcpDmdu?_E8$tAx7c|Eo$8yews2aqFYg5BLXgDku1G_fMVn83$W5TX^raQm4j%7?;L#AUR(_=G+9(*T> zvR0isNT19E1c;f|B7p*3Gy}F_&h-+F$+FIao*^UR9L93fhr@CuE$sl7!bTGM{9tFu zET3s&=b$4>e)!c=1%hpDY?iv(cCQA>E=(KoX~}A+&jNw1OpY?KVa;Rj%$zrR-fI&3 zMS=aiBx$B#Bq|$jFDiW?Axs4bb86D1Ck6M2cO6JKo6}@|gHJOd&L;(}Q0qXd zm2C#Z9w0HwCnMc+%Z@iKz#b7IwO6f$^|7e0r=W?EXB9zGsSV zXo?|opmNwA4@k$;?JWQ>j6k~Une;kHiaN$doKEEL7nN`&275mW&JrCrX?*L77?w8e z|4oH!0z0VH>`bC8lQnsn<=$Kxzg+e|vB{%ucugq$)gd7N0MMaHy!$>Yw0C|ei09j& zB~%OjJ>I51jIwxDHWN7cGjaS7VOSlX2SViU7!swZ1j+9}8CFr{we;&5r1LT)$uh^A z4f9*!YW6ZzG3yC96DSo=I3@_3WK!k1H&QMcl5O$i1yNO79NB*d`t?()Ul}xkP0{~U zJ3~&@2E!8S!}8M|l9>bbyMCf38pDgEJB!=I#lxy0>6dY7p=D{w^f7~3mJm&{;nd@A zQ_lVj=y~ecB}R%mF+CQOex+D+m=Cg!9X{}+c6pB-<4M98IQeLRi!7Ec&x~IPGj%Msb@n|J>#Jm!>5-| z*dU?yr+r}<&UES;6oY}fBcX2C6kX30gXOf4c!-#o;?g+z-1Ym;0Eh)^dYmULj&(Z5 zaJu0+Q5-|O{h32Bl#rrad;BBQp0B@yF5oR~6rZ%DMAI;)rzI_Srr<-iT@R48{;x$jaEp2c>|@q;4O*^v&i;LA!&}&Smaf&DH&8YeOR5EoRcI~?jpWw{ABbJ3l} z>O-4%S*ioVt1y@R;vmJ242z97fo9(p7%b;zRNk)2Vir6)w>fi**J_O&gg}rwyh#tQ zO5X44l-(hM8SFclRd92W*zk)E3V`dq2hK0wv3f;_x>`M+v59D1m1n%|5Um~fg& zCAr>HTf6C5(eEl??n+0}CIX(Hm4n}s&?K^VDYsNV>`;2eVfgBWI&Y{-TVpeaiPn{X%evLei#2x zs6BlN17GnbKyn0A-TKqYgHjAAEGE5O59L>!%2K_ksm=_DZ-1)VN{YSBeKE^A0m_O1 zR$K^26r_t{ouztziUPk(!*}Emnm{S!2}*f9kq$QQN{?~|tuVPXuXAVF=OH6swtMi* zc%DCK5*7RGIL>JbC@fJ3a@}m^DO2v>U&%lEEp?ZZB)?2bq^I*llUUxM%?D3`{2YUW zZp)VFB$J68A{aRe=>(i@evo2=fnsLGRTodnCaTv9pkA!6{gEv309f*0>9;x1Np`I^ zcd`wRY)9`Bb4ykG%W_4;=CrlnkDN&iAvKK*wd*>Ei9aU0v!-G-p`mb-iiNaL48$I_ zK2{I)o+Uf&Y--*<(PKUHV?r&M;NFxW(fAea9l*2~aOX??%hearPCong)Hyf_k-N$$ zu-o(jDIzSRnqi5^haY!=BB+VKRL49cr$aLyRwnC1^84}t*Ux;t6pR7#%*(q*c4eVG z|HOwmSV1zHtjJjwqh%I!0ZG2h^seD6Nea%bi81m;Z22ltYDXDKhlMdxEOsEL4i2f&EYXG9c%=$T#8blWr`bR%AO(MSEPKH{e3aAB!s@>CaE3 zZ>Vi??*K0m3!xjECk07tC^?L=jJlr|a=g6B3J%mb-b}uo>WJI6YbJZoLUBwMJQC)f zv?2ijN#Ol6jPmwvYJa_c51|K2?*L^+=r(MHlJci|bVcMbpe_Lt6VY>*t0_|4wD<1& z(*0q_Je@!fANB!Bm?&G%{ec#n2Q?YqgQ{X5@zMo#;G#Mba;IGq1=wqT#QMZ%glj}L z3dkV>qpL8Unl*AO}-}E zYX;&y)6>+_GhRENOk3({spoL1O%c$T8mKbyf~)4qBFz#$JEk9>5<0tW-w)BKA>X8j zXxxCtra`=$Q|)oq=K<-*(MTA`dirZ~E?PHDAmNJHkY-=9Ic=q4v=CcnR|ic zsU)Sg9!e%j4lev;Dx0yOH)xrn6e%V}mj^gKzI(e&EZXP_-?_vqYL(a}Z!2d4Hzub26yyz7Q)kq^x+#uUp50OW~N%6VM zR0Jmq$PGWPWA4^h63beaMUYQduz$0DzO2qPc0T@{pOvN3|03n=G)(P)4{7+Z+*=*u zE%aTaAKs*HFHNvJO6Lv*o`Cj?aK&4O0E(x8?Z*2LX@@!fZ z1sq05yPpA)p`5y1ofT|(IVG;8Jl@eJ{E@@lRr|9(JebUKoyF*qFpGadg_<)pb@>WT zKA)<+xs1H{Dj|I2j>JfkZ$D8~%>~|N1pPGZjOC-*MO}w+u`jccC4Y`+`%vNID zrswtJ9PbN0!!&dLa7ry=AP~eW< zza0-EKfqFn3QGu0Gsi&qZqH8HEO%@tj_|QDWhE3>mI4W|S}^P75t+voHY$9w{Fb59VjZV;-ZnYj zHw|x>-&Mrg|2qpz4eEVm5c_F46TCf-tu_Dl-no1)2$nCX>PbZ%cb7~9q0*YTP&xv# z+8d_V6P#UoQXUX}ymWUBU`gs0ap9CE$*~J4UfJ1Mw7Z;LtcXdJGsFp9&X6p8)ps}Y zxAxXTg~8QJwBI^A^ip1mdeot=|6=R8dzZe5U44DC+iWe>Z%8{$5>4VX>Iq^Si(LI7 zp9h+n^5+O&thhF0`UT9pbSE2wKSXf|s`qtZ#{)A8kv`4eeh1D9D!R1Z82otfF}eNM zf2rQw;ZjA7)j8Y=9KY17taGeMY-&RXR~EFs_FLr{@_hkus8ZlRcx*+Y-@B?JGOY{k zkuBs$3KgM+IeNzn#gBC|eXZwRBz^`-VM{$h=hF%h9xg`5pK`!18vXI;45`;B{%L-! zoa+?aib#@LSqT;nlGdf7K|z)^eNURAMT2U6H66d)uxIi?p*AC+=PsfW?r)vaGR}5*Z&3Ro8q

Y|L}}km@km9Q*{EL=FK2w?=8DihmFVvB~E5%QRr}P5Gpf_D0ZB zKBYmBKy1HykCV=0aqwyD5kr|e4Mx{Hdfq6r=cGPo!^h_H+JC1YO|~S)%|RthdrmIL z^lGltW$gDH*`D4d_9P9NHZ}#x5;=R>5yYg+vC+p2er}DT=O>VZ)IW)-R?7l3}j!F4^*YtQ~3y%kylHT9a`{d|*U{aI9Bqx|vT z1{j8suHX6%QYBAhMTh2q%<({}_1zl*{4ZvXyS4A@GQiDlsMr&Gm@FoMW9eX0N(h*F zW~!dAF#f6X!EN?)OuFEnsCYMbTtBrJ$(Q3}s|~NqcqBS0GJ3#b-QmFv_#z|x8uT)2 zl_b6N_g$QYef1!LFFT|d!?ovN{Y95#^4fWmZ>VzWv^6BtfsV$_c+OZQjjP!=q6JGc zre$!;xgnU1a0~(sH|`P?OgctE*Q|&vXApDtt$-vM{tbX*X=#Zw3lNH=0XLV*z&TWq zrU;0S3P_Dyf5&FS%(?YsZ~X6KlNzTfLOoLm^_)}l*60ZqE24q+h*g?xr5T1xgF{RQ zsGtB>8q0rERo;Cc0$+*-csntHOS&kq36jL8Fw12g59X_6kmZ63vK-FTrx$ijB_G_ciDRKuCRl1q8j3XCaJF71vbZp3x!b8G#qDwzdvqVGMfCuy{{$f)UjYa= zKZ0__0~>n+@{t1L?VlSi9{;#g;B(y5k;EtO|2^y6&|XRC6+eb=YC>h7fX=BS3Yu?t zH3go703yGOdG&oP4|i+Pf}&_woTvowFb!hm2@?1ikYg^s3D2IbO!9TjJjaB4DGT~K z^2}s;{z<7FTMChbkGEe$Z1TSD!N_sH&x>h)hg-b>kxiOlum6)GSl+*2)^PnPwGkwE zht&p&?Pd=cspnnjdMNginHDAY?*4jI_KCzS(*PvjP+m5r8u^?f9x*AJ5lU9k-S9qV zI>B?Cj7c-ys&hbcT0#{WCtbx%(A_RtL9r?kX{S%SAIcXLZ7Jm+v@7rGf3g?tvXi7_ zl6mo0EBbza@;z$304eMYQn{g3%Lo^Ra^F+qUa*yHB#^;5sokOl0Lpy&*i$(wRE_p# z-Un#w=ks`dvJrXgZa%;-V;6SBv)cMVX#Rq&PFZ)xTS@CX zpF&~AVuxHn>G}tyvm46C<0|v41?N7ue7$BBJ@kunl{c&G;in6~IKA-a%%|8h6IbMA zv$q=Jxhz(&Ve;L>Ag4xluF7P7erNCaG zx(fM_E=Bt<_Ddi%E069U2Fyx)f){<)x}1}^;lIWvQNX_@Ea&uYr2H9@)*fp7cPt>O0v1iJu+jSYM(Z3e8wAZ`$ z+`}BNZo&thzsn3aFXkLW_$x3xGdvsTgRI*rm}MZlcNa-uhw-A*pI8u5UE!V5zVaUI zQECeZ$yx{SJZ6pMwM9kpKkIoom!`iQ@;OE{edP0uZ8UB-JWz(F!EVob+}8a!h}2ZNy6T?BFkzy=23m+BMH|0&TU$zOk~Yp?O)xO7k9m zi zN7_Y~t4^QE)m5HvCJzz$iJrk1Fq_21wu&E?&ZXqQ%h9X0^c0!(lv7Vo3cS5vMLO=h zUQyB?TItM>{gGb%IV5f@SdKtMm|F5=0fT}6bV&mZw3D6~Q2}eBZp@_ApBk0O358~~ zyea8TJ19KWpL;-PQ>kWSxhjL{sD_%*2CPp$7Lrx9x>;;xEW$}RMu2DXKEV<9TAUVH1JafLgaN z6u<25T8Y@#%de%6?w!jw6h@xu$c_XXpcoVTc&N}tsgjo;|)}Vnn@@gWD&T)=TaI#cz zU2?UxLCat##TtR9XyZD65VdvdaQ52Mf2@^`izDsS%~ zLf@&GI_X+xtx1o=cWCUzgaT17Hj&C2)pXHKZ{L0z2mFM83p6WU<>v%uwmcPo`1x}dEJ(ukil5C;=DAvInkfk*Wl41Uf> z2(F8-xDKt=3_(uK#CRL4P5X@`fp?7(fxJC-N?G+Xvs$jLo?;M(L&djWS5kOHkZxa z=6;!L$gSEK=2l3#B#n@}xm1$0x!-fkEtPw2<(gE~<`NM`5>ky2Qc?P*()#W9ADr{} zoX0um^ZLBr&nIV0qYZA5NcLx@Ywi#9&G|a7DWodZXqsCZl|mdV^N-n8g$OxcKB0VB zH!(a%L9tCztH@g=Rym5*-?o@X7!=f8tWb>y;Zgm#jRE=z6#Ik=lr}y|cla+50E?ge z@mv4_V4wmSMqaf>=A_vkz<;#k4eX(x4uR0vV=1EoRboVI1RbzH0HCcO;ifYr_6H=g zfj<9DQg5ks{y34N=fsx{5ZflnD;46UR;p)GOlIHy*9L1wvB2Ye@-1)hx(hKt{ySE9 z8$)dHD2N}#o9e20N&(>_Ir=e{2LX%vbW1Z`E8{(ok}*heUsMD?a8Qg-9|0x+j@k20 zOD+^qcAcCq4N^GELcSCQ+=9c%Q3VRut*H>__ zHwkc$E=}nPJEm-6D;NWqH>LyQ8vtMc0HG-J_6K(VMGToGG)w}(yU8>deO5&ilg(%^V6`Db z0D+$Yx}Q34-94?W5|BM~U#0NyrugE$95))*CW#*?P9Yf@49KJUzd9spG=N+m%|7u@ zj%iOB?SA$mhoCXKJc>d3#{8)?V_R^Zi=sJtY`B`y5i5k8{kq$FqsJ9Xe0^IdH0Y}9P!JSHCOOC?f-@~ zIxkG5T5B#$=wz1PzMf2c!vlE+Y8u+A@SI=5v|%KQBx25Zc!5trhND7JAD$}Y1Xw%u zTHDNMDiE{}29~e>0<9G#8FLX|V>{;Y?u`ctNvo^@Gss6G88l!-Snsy6c@ZRJeJ8&> z+2zU6<5J+m&N$lu@bD`PXRzMMkAsF5No35QLyeiu%YYUv;sQT7?~uOVltLqbCu8{O z7GLi+j>2)QT8BItCLT?&b@Lm9#PhJyIj_9K=A#;BVa(T2TA1W8KwB#?{W)BQ$=Cap z&y~qHsPmV*^RMBve>_u=$a>f`jj9})B8Z1wo&VR26NlsKbWLn)Z!?WWJaTD&fX)@a>rjK<{&~9 z2o^f~7TRVhpON=&B!)ZOPF9C_)>xfYaj4OEN;)5Gsju6wwCG`A--+g08lF0!wEeO+ zfGSeJ4NZ+d5Yj8Uypm?K=%p&wk3%Ku$JY$vG76~7Q%3`zcR3tc_eYDd#?=^t`vaRc`AiY7NG(slpGoTmXQD^nDIP>LEgTR3Z;^Y9ipgCLm zp7$#h;guLT2rtpE&IABKM%KH}$^8vD&r^;~2~D(#vi(ym`2WgLAmK?AT! zm%?X#kkTN?32-$0q1WdHhcdeGLN(1Lm02y808s zYYj^D>EqF!ZqYW^=Lrv1zMfC6jY@TW%sDhKX4aUfLacVaxhg+mSu3NHxN&agR`6-A z*m0S;BvBL#z0PwC2ApDYLB5nI%*NU2Uzrr5O0^zDcwg`%>&Dpll3mlV!hF?Bm!lz)t^QS5ng({-n zY5Mis$PDV!vBEBv`po_-A0K#pOmnU@9RBsQb^8t4v_hflBWG@6eck{qX%%`)R8{wq zD!@XXVtGg`gC|dE?(>8ioc2Tk#r^mW>oS1*09j*}Fc|PUlhN*N1duS`T3!|5C(c^e3JqJ8eLJfx@>*mz}8)S zg9Xnn2YM2;{>(yi|KvvrjSqUas=Csj5E2j428?J)A0-n%rdXPF4X|{>JB_`F>iKjp zGU@us@;82ZkaJ31#hS#LqoL%!r}s1sF3J=6c;7QMQwz3f2000lUNRlYk>406fv@~)bUxG9sKnC2|!?VwVIO0JyXBOSe-i8PS zyA^g@0w3tS^3JB`-}h{Om=iF2`_c*)q{4Y`+G5k@L7Mx+|IPl%SF$zWub}Bqem)uf zWIi+9BI8=>0rwzS+yI^(5H`D};I0iVQMh>=snpPaxy1WpuxrA$6K)4+unv?r7{HT3 zN^A@5twilD&^DY;4`FE>@5PgF8ZbcyFe~bY;7-SJ7=V!}g_O^uUN?p=A)<%Z2CwQLJ?e{5xJ)R6BSlT`oyEGMKh z;N4uiqUyw(4!?8>y~HjEy4o_e_k7`}9Ldg}w?$fsgUxR35$`XsMD{nY*Lp&3s~GjB zPs#I+%)9RN3li5BodQRrYNC)v=)r2FOtcE>dID>i#NmcO9)n`KMqN zCziFO=$6b7eG*q5>zitk1!U0B%#q4jTa=NO~)gV zFT7_t-7L4kJ-NUSQ>W5y)om$at0Z~u)+K96e{LS%ZNgyS2?RlaN556X#S&qr)#(KfI2Tm7Uvo=|MH8T{#9+e@N3w!O&*Fu#?>Cl4-Y%rYq3fHE+IwjK>=Y#DWw4cXd7G(FU1u%n`l6n z*o9nYh+eXm3hI6?kQ=f$e@;H6AzxA0q?}frp|VcxhbrdM6LX_8IQV1%yL91{ffMU= z_p|wZU*!YJ&UY_7=c>0Ze!FIo_@8Hn)EovD!LqV|s@1ohyKTOw3odYs1I08fuixBk zyd3oW;(OcmoOb4&$^@(8``;ITZfr1;v zlsj2fW%}NDYYxJXQ>_)`^6zs(b3#-+)2jkId2v>a>(qLsK|LuaxF<(`j?QPq!Q}WU zEu#`RN#^COGjUi!9Ox zz{h+#<>bUo6zj(29NK50(rE9Un5ET{B&!Prl{Y^Z1<3I2Xj7k_8Z3}NL%rRv$u6U8 z4)#uE`xAUG`0`Q#x$?8mU3gUOY-2~vktwwqMN%CHda>E z81kiLh2AA>M4+Y6#l(RFt~+A3hAFyScu@$K1&jOpl`IhhR+OoN2v%E>(_lzn4PH%# z(l36^9W3~-DkqehRQ9?j)v(DqCn$DX(mUTn5t9$AcCtaGxRcH6QT$I2EkUgyKoByI zj@qMH5XF{Jg(t}WocuC=bbUMopCN+}p%t7BO5}?0*SwzN&*!ySsU})TJA790F8N)~ z&07CabaGKsRQ&Uq*92c^_I{RbE_I9-upT%gRwH|M$68LdA)Uem8Bf4h>Z26vwzLZB zvkAkxbZ5z%0+!gvmHY%TAC(cm0>e9=Wasb=p|j~{g=1nZrRKI%179eJ7R07F7xkOd zZGEq{_zWIF`e$7F+v=R^Gp=CZUP9KbF1Z_MrK}%$UGzi~hDZ9hu)F^H9MMwh6?^!w z9V9K(&ruAlY#w5r!GbU;Fm*wx?==48& zpMxCjkHz0BzAr8b4Eb>hm!MD!RA~DgCR$0Cjn_sG(rx5X?U45^0>;g;LmJ$?Pfj&X z>`VU|)}udYSZkjqi(Kuvcitl()!&;hd5JNk{e%}U@25)|X?)ce!)Lwkt*%aWadlZ4 z(WAZSs?Q4bGfqH1@!C>2_{cWd>DP9)zwxqoI$%j(VrllY7@tfW(^7UBXK;{GgUv_H zMQH3Cr$C2#I*gOUeVsGxTsPH+yxI$|)DVS(rut)P?Pf7pVm1R!2GmM0mb=k@1Y zdeL>lDfD0d!wlnl_rorHzag5qHu|=B0@}a~|A7)FBC18pjge76u2A4ACgov2c|_-k z%iB-drjHkt-7k8)$U57Tt+XLG4yYyTo^al+Zoj;Kb!2(!-RGg&t25kSD+vqRF-SQ001I|%ksv`E zb-0nB_ul38?#xQ*fJ_gtjzZ1!ZTli1KQWW-x9Ev}xozXxS=ApdV<~g7ElGBnbIr{E zgG4XeN;A{t#_U`GI<4*T+o|%4?ukD_Mkl)UW!A%H)%Zoq(leFhBEOs?4-AimzB$}9 zbv9V0xO{Rit+6yUV*H@8XnP+2Q@*8)!)N=|U-O!%yzfo2Vmz(0Z|{?je7=OM&wb=m zuV-N)A4QdxB|^>>QX>PYTVXI zL=$dWX+KLVt4>?M+O>W)Dfbq<6Ky&4xG_$ka3`DVvg?V?);(xALr*pAAxSTe@EzPH z&aD%rXYL7ch*A=GYyu1;$3TOXzb;g3JzD>=yKJ-C*=eLDz^M z3Y9+F~K}CJR-kJhb`}+jJpP|jbqm__vEJ-d=)R=TpqYs|jonCWaxAi98pFNB!#GpO};xVIkM3vXx)>=F`-d zCl>9h#E$wfM1cR;9FY%|$Stb$7cK|6LY1yv;o-WE1uh$>a>4bt|UCJ?VF zLjRJ*=eBE#mR>^|bK^e?$<1Tfci?kk_#P<+_6cKV;@IU8*48#rb`2+k z%Dz$#I_|;}bHIxoCEXC26q)287KoxIkx1f>WJ^`iJDhX{9-HZd1+`=Iz;{m~N@Vcf zf$aHg^{=6klHA^ENw$DkhMrVCkl&H=u8YC{@N39gQ?ZMZ9$-WA_KvO!Llnk99rh8$ zk)%Rc!reGn0bS65193YBUCowR($`+v(rWI9y^e(BQQ^QUK|O}ta310hQvRZid|8BA zhfu8q3%kgYeddch<%bD98@p2dSPr^!-UyR`yNCLv}A%Xm0>1T zIlOIoXg8^BMgZy37S_NhpBZ;8!lRSNE@gs74XV8D{JaC4G{-yDje+=ZmZ%X+J(R^o zaRIPuI>d>p#hTK>AJzWxef&i`bmN=iRsoo&pxZ6bscV*V{33TEJSQ`03UM4=tR#tH zVP~synN?US-YNiyQ2?S>d`m7c4$Ofi;#eqGje}y}^VoRVX`W^*hS1ND{*O54;&>&t z>S>Ik_)&)8aniv#kn$we=rdh4X*k&_V+z5aH_g1rPcx_XO}(=uP;}+FX?klYtGy zKbBgRrzaVji(PX-OZ;aqk$|_CV_2F9*w+uBT^PDtg;c}hWXZhiI(rsxN?DqAKq(oD zZ7E5579iyJU8uWCB4G&|3%q-aA;mmlAjSF;=fh);J;mWMQa(xd45UhYTAI5n2`sT?+3zf z>tDd{ZbTXO!@`=+K41$YH$O5Qsv?DWy$8$iDwC{tS;oHQd;O_GSY7*ggV z4bzo&b#RWsON^ety5lh-B&ilsScN)QA_aZsI}9m5t+l=!-l`Fi)c8=Fvbs`qy&_RG z)Q6^AWn#J{yav=d&PkJUixQ7zXx+&$xEO8nI=T)RbJNn#=Ahxb-6=8r`S(?_b}FK- z`0FQ+x@h}Q&1a;ey0Kk%v8h$-8ZA!~KB8Sn^SVQ7_eRCVtfq4r!n>8CUx~t%c;V!` zQn^bKO?acEU7=ch{N>FHB}){W{J@^iM(3XCtXwVmwKy1Yo$GQ;Ky}mN0;-(I+TTl`2%R z4}C-OwF1_zW)hjo+WKsQ=u((l)wYLXX1_h-p8MPL)}J#$JX zXDf9mRtYnfY7L^%d#KBL$DbA@o^y(f=lby86w-Udxub8ooKM|%`_sjX-4>}rTOUUf zq}yhYLJLelqmRoZXi))=-Pb)QVx=Qy=lF@A9{AzLc?%;BmUDrERoHk z(Kwoe9uUPPR%}K`ZeP-V8G8HWeEB#e|g~x zZvy8QSauqr#=QDira~OeT;c-$w_iTycdtJOT!4diUN3WaR8>Eji*z_8+`z>Phdvto z#JvB8BUB1~cT2rIm-p+(IlA>xa`UTv&w2EU-vK)QTr8e%a@OqX9m8+;40NlkQG~pc zUyd0qKSEU_ZrV7)8&ELTP2myDZ)$2fE`5YBCLInn14Z3@J1;ue*B8I=-1)`OKCJ-v z^kj7x*IQ(Yhdt>DmA-#LUwyL7Jt$C^zg;_ z&E*O7z3e}M1LCnD3}*yc2Ex<&h))X5`!0)`0#UPtq84+SSwI*!6$g>KgLBo4&a2b7 z^>@CpZ$0PTf+FV4RQ#LAe{b!*Io98&omZ9jjJ3F9{#G^9ZaoR?IFZUfgs=5ohTdtldlipI4=a?#1-vgmvJ;y7SYq zd^z9ihsVu)#^)C|-Y-7NeP(E@+#A0lU9=qW-D@%@5ij(Xoi#D=lbL3}zqMUCTdE}W zMQ#aw7+HA)`5(T1mH7+pjjSad8ws0I?VI}RW3)k(s#N0Il}qd=`$$a4A5dkXrMG>z zzI=Q#B3^sHSBjxlTrIBhbQPK$QB&>hP7(!xoOnG;16xo2=j>ut%cBGePJxtkRY=99 zC0(y(=&Foa+&<*n?c{tVn^f}*{kqZXgj0{=p$F<;lo^C9^g{KMCvKWMHxR2GZ{2n* zRFXUtEOuu)x47K&e5P2CmTjZcq01Mx-kL_f4}2B1s?q3bd*8P#N8GlwjmnDIs9wF` zrgJ8~KVu+zIQN}d{C8R*Moa2`Xv}7p$qSVnDWh;^!{g&Ntv5~cSB+2o2N9_bzocY; z?}Lt`tm)e)e?cmt5_-Nv37;2!gv{xjF42}e&#(Toiffsta0v8ged>r?JLXVQ>gZO> z$uj*z_q)VuYp<3zHFt=wi;~(}5z1M-9&9G~p8`3S7Fqr5$3gqzY~+zA`@eQSy}2`a z;40)carFnw)z#JZt>DY(W6;1E*TxEvqrq@b=XISf3h1Q!KgtPvkAOZ9R*wbvUL4iQ zp0+<2FAnSO-)B@SaH|6=m2 zwb8KHf$ZR?d*8-%`nLM*b?$zSvZc3o^^b)24!Kl$3?3?g7_ch}>yMGPL_+8|<|^XY|JidF*~l@i3)E zNQTzC^voxu0eDv`ycaE)J3EU{li6snEc1({y+kOKk$BC_vG}AfI>WfLLegQb(b++L zPrB`u@|gYUI?v)e$I@BP3QjSv^?n=GXdY1*D+?;_576Rim_Hu>=6HT7=EkDPh}JDs z*XU4!IhtQYtq9d$^)ZD$Rh@16JFrpvDI)rXest~B5!0}RGkVEw)wT_k@vW)jh4H^9 zmBisacFn>48o4?(6Lul4_X6GRwI6{Mxd`1}Ty?ho1X*$1;EhAgxS`(f182L!9R3K% zMDDJac}H>dY)qrc^=@+GYMm6N$172F+CwNsW&MRVmbK9z(D7D6uK5$n%I|M*+qV2Y zf#-@HOpv{1GIBM_`wln#ovHYX}$6e z$7>d_n4M?x*W&H7-@ULvlc36DDu>+M-Zlvs-QTo#WW@9-U$FDF)o9K$ylG>je8o<^ zHTczT#L}H*JB@AWAAQPYT`smNojupbbly`ebNuwOgr*WP3;PVAFsHLpK70-aw^)Ma zgO1@MMMZCI1o0cedE`)_B;piJ!|m!t!hk3!_ex4 zMHYIhKf0BYLii#GovyPGDU&!eSfPL0)Aa?WLTwOd+73P0YayQ3CM%Z8Q!Z5k_*Am! zU+He0D;bg5egs8F`mp)OaZ9KY^g`WI#`R$xq2jp7^XIT9z=obq3}^pxpO(bT;ci z&7rRulln$D;QrPfvPD~?f?thXXuOqbob{30(7@cu#+v_5Mv48}$Twa+a0Y++JR&wZ z>CAK?nIMDC@^DqPEQkdw6yR+`2w6fQlqCCCxKzX4n!@?EXCTR*djU$8=xf`fGl~3J z)jWTkx(^$Kx$|?V>LuFyXo55rE#XpZYdoeQW zSbQ>_CJi>yEJJ^DzR*IM7l!xnih*@Np&)ll>4jpUV9EzxT`^hFg_PwbrikrX#Fy!l zPkR%R4p92xa^3hGT5^)khrnT%U$0sllQl3Mbh1hy5Z-L@Nl0zWN;jR=6L(r0>-(e0 zW3qgfI<6qn;a;n_TMF?H6cxWn77u!$D&OmyD0&l+tZLp4wIwc#m*WP_c{Nf|rT>5m zYVBv`&E~~;0q#`emjACtQK8C8h|~I(yb5q3*>qQ4Q2%q#@sPHiA&U!5IB}a$W4P@g z_oUP~TkWYfxs43a^#~_=NyF6c+Ivq+y-ZI%(7Pn$uT+h08yQs6(1TLe?IilDtq2-b zYcFRCuuVKPwL%jv6TqwQ1POrB+IZct?<4YQ~3D+TuBlc`2SPhVO$oLY%+ zyBz(H0*QS&LD-IP$yW(f@=X^2%3o719_%x17j>%5B*3b&)y+u|9b*Q}iHByou{Zd` zuf6qZPOtUQ@K9+O{b(2EtZ5s17}8f`QS&W-I(Jr?!qBB0E>C|epn`rH^!Z4+dWJRe zgU$};*%>919NTXn==?3{HyrBARh4SX0hEuH3JGrc5_Do;S>VQbbcQ#imn)HUe5t5+ zD(BFizwqTezJuD|bE5XkG}CEcywS25fu;&l;k;JhJ5m9<{3hiHsaj; zqJ3mra*RS=i3>Ko`g2nxC`Uz=Q!PaW*GPP_5YVr-4e}%>Vl$n{>JIrFvg`pvw?D}LTWCq3=X`bWTy1(Znf6Fp4w48a=<0A=}qbUVLr3ON5kh| z%UOwTP5yTFWzVaIx>0g7HkDNg6D48OD0;m`8`z17O=1Rr)HmzYvkpbip{L z&~q9@@}db#0e;6uu}Sq%Av=P}H2ymPpQsHw*bwFFZ`t04TNp$q?;5<^x%`aQ&-PAlci};x2eR z33HC5+nNXer;7*^Q0+iLb7?TO(%jlgl{zA<8cH z*o5}uS=5szD~S0$foY~mSI3dZ7WNTUC&zZZ86NO&h1WOMFJ9v$2SoB_LauF(6dgGr zdm9Cj=DYeU7Je0{X6Xb{#-Szfpzo1+c)hemY$$wQO$?fEd$2rUF7M^JagQIAI=Awc^*6N?ZA+=Xu1@ zmeh8OOnJDfi(LV)apaMRy@PJ=L5mriJkps%2Ipcn2hzcWwV>RUmW7tLizn4edUs&C z+lU3G(hRMLWf9xgkLjJR3iwvk%B)u0%&G_2rqheE8>^#+sc9x^GlS3I{qF zC)UC&qMBBuZ`R4~h}#9}w$kv0DEL_$p<5Ceg~m6dJqwG{3mbYaUU>k?Lvi6_D5NJE znL(^paBon}zx64@tqXUO$Bxg=gIo}BW8)gHm*1{-s&3%GvY3puHH6s@HkE4l3(H|5UbI27 zaV-OOE!I9QJCt}HdGi5|_w?RvkA{qGgOAZb*MF3WSKZZ3s=Wg>e=l{<+Ou{oGf$|| z{iCxlDG&ULEto{>mOdMJSq(R%SmDBG4L*0Pc@vV8M@@_rnks8Mr+bIynGr@5iunaO z?yT}b4ce#Meku}j;#9Rn$gOF7eR?n^7?V|S5faD21}ijDxs4rt8i`rkf|n}KaS|b6 zuf)a~8ZpJ4ADGxUHbTe_o{kgRcT${ZA|AF$CD&l&K?)|j!cV_BUrRb!PziJWlhu$1 z8EZqt%-{be*3*zGXt7*9$vxZiQF}AP$82jew#|bzh*$>8$k4p2ZoH8EobI} zTdg*e8A2&v{P`eT9C(BX{>K#T20#+Gp*z8WFFQ5xms*uKJY`8Te%}f*^AL{>uWFqT zxH0ySwji*Ohsegkt3TbiB?|8YAU~n-jl^nSTa^K4Jf91k*5BS{uPfXW5YB?Xr7KON zZj}ha@UgH4>QHJI#Jc)iJW4xz8|JtJgLJ~UT}=2A2Wk38c#-DdJ}or;NBdbN=9u!Z z=$_`ZE0xond}n(gv>LKj@FepW+Gh9u7yA(x&4Q~6kpDuSI<`Zvw(+~rz<@@8eA}_x zwoE8Nv^Uka6cK7=m%p-!UfThzE%BLcgX48mB#uLjv8{EfxPFt0&+dmE)jLAs#Q&-a z`E&{&a1kh2AA3r;DHw8fMt1;ZsXGN$%_E*0W+Ojr3$;}a_g;qmqf(CZrH_$y1EkWg z>niMDH+;-Q*oYwGw-I%8SVbPJ)oE}%ALp@u`cj+V#I~@vOjE&Q81e(WKG?f$1>T1{ zJ=`YzQd6fZ-|{}r?7kDUMS@Va&FwpZ9)DU2%jFDb(u=rK@apf$oZ}-YG8Kk4DK`Lj z!Fte&$`mIYIO0#)p{BbfFP{4~Jg=XhzGR<&UXz99u_l>($Jzw116m&tAqRd#Z=7B8Ug}C_HrP1zYY9@9%-tvEMvk*-8Ri^neq096CWZ@MnSI95S+H-ZI!U= z+pzH+mHQ-kCW;i-El8S%Y(AU|ybe8i+oN@#}y%+Zwjy(|H(XrPht2Xl=Frtq#=HhA1S!7jX0L!Ry{4VR}HypjdUD>xADWO z+8+OVuJS>VTA24*pwlMKFl&5C<>!#GhYR988@^m{1ku+JkQ$NqcOssHNF!GE`F`k& z>KkzK9!DUbR2ohZ7be>vA#Ut*O$!bBPfp5=YmD8#$F5j!hTIQ(qm!RN#TJO2EDIZg z8K3lV0q}Fx*nGT6OT{YDO53~{p|@=ti$S^14~$>o%YKWhd~4bV`C;$VVtwu4#}6R82WR7U4{yJ{{pVc75*tgm6mhV)t)bD zhi3}rzW#LUaa;Bl8|m-^o(Wiask!ph!cwlOG@v8m!yk69W`mCU)EM)i3%6&c_|2wU zATF%iLbmC$6-0TQ&nE%+)q5@KR7~iX>5!ve^&Q_*U>~dZ0jk@=Z?*-c_^i4sp*J|t zBZs(<6n5~h;l>=~`zhKhx4&0QY6;J;XOyASi_c={66q5sWlPwv?=np+>rHQIE3jNl z@;PvG0y5%Cq#bvlIb`SqAEq_Iv_b!qLOA9j-H@mzeJ?*s!!4)}H6P0q9AUzPmm&t* zFvN9CQyxr175*MH6r0{_K^FbO7MSef+?I9+?A&{ z=wlQSi_eLde+oY!1Z2fvUibvOQXEr&)*GJ@yAOaGajy>I z?+11GJ|gJgFZ%~JG0{FxhtF$4Tb!W33N;2j`vXW3a;^~(dIXaqX`@;=lLNoPVT{ud z&$i(#W}K7wi6CW7mw(7FOxGFukDn#~`79mq&&bvLcRSG&)xQVHWE(ms)NfpRqv5=| z)$CS5gluQ}$RJTI;j-nR)%0t)LvhKF9UU@Xx`I;Xp4-&2RkoyI_{!YW2b(bbXlu*39C5L@dQNwqzW-_}D+EtNyUBP4tS zRVsX4Xe0p>(+yIgR1wVrrrAZS70|cCF*1WY*7>j^rRzYs*xQkz0r zs_b&ZDl-I{&qc)tl#xZ8lhGdT`Cw7U-vwZU4(}?RCtXUB@Ip^*?!y%wPiniq$m8JW zO09kGH1zEq6i90l=br)7u%3^8-)UCtvs@KB-XZF*f1F54>HO24d=C0kk47PJSNm4#) zqIh7n!}VnQN;7__(+?d`>b!#fu@^jfD1SLir>48UlfQ&y{`^>jn;%~3mRjB%Fa-!V zK(R6c9??#PYbk8VLym1;@QNBczflX8(%oJ_=ve?5G4^VVw`gmC9uO->WCHk7M{I5! zcCl5mIaiwze7mt}VQq>m)lM#~3T{skJ>l--f3GK#|1)p(35Tb}?Twtrv}}1%>!_yY zD}5csp-*FXDRCzC6;b`XvZ>GTZ$S}TSC11NChC{P4^;moyA)FZ;$o%5jL1h$)arNs zSno&kNjDBXvRy+_aQOLF4`1~Vd)t$jQi{Evc-)aaPdWdkZ1de<_(Y}VC#1Py2#c&{ zgYpTGw3eIt^}73==mjm`+k>mceo50S^7b;n&St8n8Z#E;S`O(B+#v5^7B7s8_tixV z)=4 z4$>`ivA;}8rDXm+cP=Ai@Zh{t;lSWRJB^J!0yqCx?c)C02w5{_S&#}6Vx=7M&>MOA7S<+XE;9<#ldjiTw zj;sqJ++&Y{b(XL0c3o5RmKTQqG-1+_+V`w7+wkB=dsh*N#4%avt8S(Pkmspqp?ixW zCH)$+o&iAk{V9S>ANx%?w*!0V(y-Z`N{0hCJX9h58sgkI&MZfF$V{NRA8OZg{b+mDqvxVvG@6Jc}3S7UkdiVcdA=m>;{< zI5LYElju7?Lss2KrKm!d_%%=;9vKNfqRr(&nY+=+25G4B9!2z~F-jtr1vgNVMnfwGVAo6k`n028DViRAW8M#DOrJ*6DS~azQ zYGWShGj{*bwvJeC{wg8k`q-(Xsx4_*$Fu@jSs#ilWu7#EsUi~H?a5YUk%|lFS5_=d zJy7Dy^Me7ddTu`%LuThQU)3KLb=p%pAYQCzbyoThB4}L^5jkhAunZpmG#7NtW+7|T zm!;Xhmm`^h@*;k>9lWcdh7sQoRs}QUGsEmelh*m@$-0RmmCS1Fl^V)%g?nLFW*!VE zYs>lkHY;kH0r0dx=_pR(MU$`j#wl`6?YaWD3w-XF3DE&^c{zvU6Gb~3$b|i$dQRbq zqE;>`YUp6Aqcqeyu{{#xJ;z54OnMd^9UqFH}?j$}&IbyBcbX*bbZ zsfymGgaWNAP{BDbHjWO{0t~W%@V7a&068chM1~}t0Dy6o^oo?VPZZrC;_^+GGF*&~ zszsBsO3I7!?|pet-2d(CRp8=vPjdy4$2bR{CsXkEGl^GDqnAB9f}#EibM2^lg!jhU zi^tUqGj}lM>XaA4hIv55hc-!HPloy_SCEcZrd1u-wAcn`A-M)zk2CE&a&5^?=~7TN zH*nL9*Nj~jwQ$x^Mfjv^nKJ}cIYcXoWz+?e`B4Ltn>LN+;W3@aG2I`sc$@=NaA(0>DifhwL}>KUDKDkSj6do>wBoI(?NXyXxQqRfkq>neMBmDB zpWT_dwiZM1bLLI`y|B|TtFQuiWt}?r(lH7ine6!X1+*#d)!ipA)GJxn)*2LLS9B3N z@$a&{_bM>G|J^6bx2OAP@*UcY9P%={7kX_gW&Wp^)?sL5R%L_RatcL&>|B|seD(6_ zqq8R;=_&X}-#GpGyi%jwKj)FMVjOVt&+yT^S#NK5TzYp+iTGZKPQQ{y$}oyA{rkJFT(_axBzPsxXn$e|&DJ>;!FzAIMp zC;uAU-N>YC9ZvWgqA{41dDZKqyqMhiub20P&v9#h7Bi>;Yvt*IoL-^1z~Kp@??Pvi z`DEDFl8wKr-{#Q@=HOqmwclV1ULL)vbJX`tm-58xdJIU?*$E^(*l?;n?eT+<2hR(& zYPC4iXZ|e~xWOy15tovb^iX^TW}TPcs2|h>V4Z+8N#6J=1E~gtK^SldZ|@~5uX{^j zE^T}Ck*#~LTcG*B#@lm+kKFP~kEVD3F@8$2&+>@8owJnntE}!7NcXGsp<`LxWZ)^m zC_q|ebo0QaLyD0i^Ov*mzq)Jzxwh^pS4*3Pv+4tV#g~)%#{w<k z&Ziy=QldT0^wsb9)bRHcW?%E*Oc21-lboZ^fN#^qsXz)0a8tiCj;~3RF4rdw0IAV4 zDFFUC)TJG|NFLxMf+3hrKO(}Arzai;B>R_TCI3MHP8Iq^i|n+eSnLVz>?CV74NS1% ztmio2GUd6kbm{#knZ_3C3=wal07z8uMn>|F?JT@c7G4JP@1c$b*DNc?o&RfK|IbF` zaH*z$X5CRm3)TE&@_N4uG%YIdaLkC!6$0W+I{4^_$aEHe?J0pexXhkj_Z>}>T;sbQ zo^bpW_!J84yL)@DBgK7>41*;`i%?S+rZ&5btNVhEu$I@XYIT}{~;&ItK zJV#y^+5}UPvcah|cflBAL6(d|jBXotTAocGcxtP_{ekQI5!iKlb2O!vwQ~cBwN%?t zkUYTwAIVEpGX}}cjX<`Z=egPzhvpTzlCSBGzw{aekvk2eJ2ymzoL!k^mj^#Lnbv3mAP1ADf1g)a zr9d1WQl*fu0EpUx^}m$THmDsQU|*g^8Ha1Mslal)^%XGV!B0C|(V3yx9v*}1{RPb2 zM|^~N#L5euX!1{(xSh!CtP7RmPC6z>t&p|)O^#Z+Jc+fU$e%LUB276w zEudZCBKUn2DwF)j9b*AOdKCM*XB_+I7I>sDuFs3uX1_k}Hf~O!!Y$Na@{NPu`aNzWb)uy-ujMrw$O? zDu_{3=1sK>v@ zwbuf6E8U8eKuvCDIpM@7V+J~_s&voNq_c3m?y2eeKoZ+c2P0+n)g!jQU5k*RS%a60 zRhSg^NgSrF^Y+(8y`#nC@DwVd4ZM%K#7f+OhmYCevrgn^o)7?;482~IZr<)_7>-v4 z&(FR2(yu0xwS;%hGV)QsKjCGxvmu|0`U2b&`EZm=Mnt{T$gdwI#^TO-hh5R+7w0cu zo}7F

rN(cJ54~2snVmV7{tIPkSV!yL)B$7U`ZLb937}a^+Uaw?Fl`^SpVnV66c5 zOCb*l1KVkdqqZ)8CD|jQmd1Os5*&#THfo7do7b+?*3+QqpQ>dg>~s~^X6b<$A>t*0 zfHM7M`nfvh45r!?s9*}{x;x&iez}HzXg`UhbhnPS!GYGes_Jz3c|8h2O6@+!etFzk z<*)bgT!d3lqN0j3FWf&vxY4a~%xSj=9Fi_@+y=Ec`|<+pDHf0S52uJsPxB+D$5y@j z-Sh54nyycky?%;Ss zt2HXa5!*VL0GrZFG=g#Y{&Pxc!$u4|Hl4(r}h|2P66hiRMWKl=`!5aXxIyR zK&)DLviItopPrjdO9IbBZJPVKi)1;x(xtl7&FVET7d?Ld%bbXsBn^Q{anus2kg-dj zW?iZM8BejX`$j_nb#7a&fqmxzV7+=uWekN{RfgW8&pLumA;vo5Amf4AcxuUy%J!j} zUPv2*gP}!X#v^HQ1TLN}=v#+n@;H;S)lcGD%lDX|pW|6ZY%&9OdM``-#awU2Y7Vc=Bow9+)$C%z0>OByY_L}Kc`FVwz(_aD0x^K z1ztj{w_Z<(@6~Fh*O`Uf`;~h%OQ|%L;co#pIitsf+a(_!ls8#<*mnsASAG7 zZBC2Re`SLGY{GJ!k2)6Vav!E2w5K~)g&ppIoe5s3;P&oz2y%)xufEVA(MzKLo(Yoi z&jM?6mq#8ZywHK4l1l7@9lw}BH>(xC#yag;1pe+TFz^TD1_xcNMPLjoRjl+1EG)ZJ zXi?`Z+cX^FmJP90>wIUU(C-zRuyx2I8)Px~i$B>tXK(7lD=4ewA)FW_P9}Wiz#=6+ zIbN^*^)`DoWjh{1?Xm=V+tagm!1eU^4vPECww-+r@yQOdwrT;nsHm$iS!8+nZ*d8h z6bEUF+DSgz+Nt{e>+$cap&eDrE!9xtzf)jA6MVon73x8TUJ>L(e5a#I$&WQN(t@f} ziOwmdb)~t;FsS73jO70%3k{y!YSPt)Z)_7_i$DJJa{Apqt&qnrxI2DPy64W+1r%B=?re;3L zOgcETiR0*jwq&g5tmnmq8Cv`v`t;sO*RBFQeka}>@y8i~M{VC~0R^Dips0=364AAO zL_n7MKa6C~?TZ?Hf;HCSeD0cT_)BPy&BZVG3&B_S?AlBG`Y4nADY{(2ZKt_OSM)$D z$}oQ#zv~&XRaya%T+Y_AF74W)p&Q>_AnxCPh^c|vbzQa`;}|*;k7TbH#{TMST`@4b z%EK;&Q$WZfiYM4z`?D2{MdSE{Tls$23s+;)T$Plwjh%1JxEfJY334*49>qYx{9NR) z;z7<`t%#!!SnJ0HJ;IK!%K}QIO-sx=bMC|D1$}0!rLDm`>sV|RDb!OVo29h*Zgq^& zg_w=MDfW?71G?PEO1fMksH0Q3yrl`-=62mlc;*|IYIvi%lTSdoq(iZjKDs-YoLkD} zI6U&9<5Rm)?Af0H57=*W(7ggRJ4GK5?fGs9_@?jhBg|`T9(HaRS&3;|-=%YGKxMs=W85H*EdwGpY9cBCp!)2JFTpQ5J~!78&U?3NqUIeR z)WueOtO@VuwODFezOpCCca7 zIq6v?`kPY^k@Dl8!F89z!2%(1 z!k+zQ0gu%wl^f1e4r~KXC}pdGa;5g9JEx69PLQN*(XLsAH!?2~QF*R|&*x<_LyaWv zi_`$n-$aX_gQyW!s8l^BWUw8Y0?Je?8aT3gM=mtt=$vr`D#_C^%3`j`J=!Y3gB#}# zs^y{4!-`~KB>U5{G7TT`9A#k3PJ)fy=Qiyy5NeP_?)*NuO=Hw_;JxPHO9-BY3# z>mjSK+JOV|GlEarh6NR6uW$b|d>aXWBh{scV~$bGkc|W87JmpdD;fSQOlg?~`X?k- zvN+1WL9W{Yr&4k0nL+s~0W zBG{RI~Qk=t*f|;`oOxBa!vNIAp8}t6EdvWHb)PNH~dgTB)*b6yI zV4@CfHIhkwRhLeTQisV|%7~@zY(%rZ2uy!O40^k6eZ3KsifraVkSBax8%S}BudY6XH`+Ha*^9Y2KxW4akkl6NYFLNi@~Zip$E~ zEVFdf#vPIKqta|7fpjrAurzPIiOLZB`n4rp`U8(m6Q63M$|ohw%!#N_7vgKx<+6&% z>IUhnIS^a$7DO&Q6;eTwE{$1dT#mzA21c52y#(2~vV1!O{ihe0VJ>nN=daSLR<@x- ztzTaM^_0mg`)+unXf?D*|3lh+ZQ=>zg#cb!%Cop3dKjf0&)$hcYSCaVV1Q@?Ry&KQ(C)|v@#?YQEcDMg{eo*?oS1|r?4>FVmP-YlI8KF-mH>GuG4g*$op`L&z__7 zRZ_Z!I@M$ED0M&fEi|%!%bJjXHAEY3B*?1m8Sx@vSLS{7Nzh%Wp1!ChwJiY2ma>S3 zlNGjICws5Cy3L^5v>LX2su|V)bp}}UyJU*&rneUZ?z}Paty&2H&#>PAUVrViY)!$l zkG49rHnXXW4hZiBVwwU2kk+iF(e+Ww4F@`_cSCq8xq^+d$4Za5gwPjv+8&N-a|ysn zY3MyBmZo=zyk>FR;!>@8lzwW(I1R(;26JFUhElgYnf&qKo{B4SJ|16Vy9b?%=+YDR zHetW9i(_kZczt!Sw$4w{@1S#dAnh_nZETXolCeDwm&?M{Q+_YA3k~h<$=@Wzoqr86 z`-Pkd_EmbSzWkWFAVMGcs}jfbf`fpfP9X4z1*b83ZQ={)g>&0m1Y1jspE~UP9Vp{1 zRt6MAH}U3IA41ca)h?(M$#w?SUJmo`gcZZbmG=r^rij$KQ4#;ctae8s?l5->?tw=7 z0IC0&bBVOMik5bWL0i~M6$ANKmME=^i3uws6)qt)duOJ87STs|k>J%#BuQ=PdE*ed zK$)9-;Q7Kd{B30KvlaEIO3vk8%cze}r$cvqQ!?91d?9C$HX;&N;R-&}Va^rG^Jc0FQi)(D@RZw!aht`?Q z1-HBF2{sNf2KSNE_U;rs-E(yNbzl4{`$lJsuibfO*Z8UKWUSbCPSNW$Zd;G>wWq<& zx8^*B;u0PD{C5w)0(k@o^|sDJe(p&`W!;i1`!(tzv#s4U?YF8)il<>+9m#!3&p4oH zWJC#d|MD5IHO; zj0T&nY@F-xJJdrWDU``~vxuI@Vnh*1ZVz=cn_dxFL{poAy7Vlij~y(Rpt5j^{kdUP zUT(XWILTvn`>Aqi{~WQUEZitaz<~)ymr8w$>BNy&D#Gzh+@vq0W;^a4SZ)>0@ae4h z+l$ZRgt(Hj^c2Qp0+238OV3sSGc17u{d7d7&wA>F79^Li))K&tzE148Gzi8(Bvq zEx`6=9LNL!A_!6{D5wj75|3hJ8iMH!X&np+&`n~C#-7%)1!k9XTUqmsD=?+(%RCshvyKt<^jBon3tIz4G6Bk2~j01DmHfTF!+aA8|1 zHI)77+%r_oK`V3Pn*1VA4y4ho|xL;3S(s-nRsoMooV? z7)f_~AX+kipN$>Jrw{KCORGqfDsB+TDj^M(*VYGgq8|!`l!hHOKvtt@Avv5NhDX?Y zgA6d20G-T*M@8|qbHOWmiy+~di5nbMIv?=Vf4ImBpzChBk%>W*zi>NIPb|(`Y%!;g ztlk~a*0GY$8fRJD_)XV5U-UO^9;~q>Y;8wx`91$U8aED1u}}z{*2WW{_!LSy9T*dh zYEh+dI8Hi?O4!6eXO~}4-F#l%-1_*FD%)M#yW@rq==e(`&p4`_Cc6$Lnr}#brebE! zI<`(~eM4~mEJpBl+|scNDB`doEAcNJJ(W z{VuPZ?7C@wVDlrz!Ge!JrtJIF#6WDyzyKsx z?wet??qohC;w6sh+8xlorWTWq=7?=71b9T2XR29xrj7W$6fPP70xC z=FKYAjuyjgib3`5HvI#de*Q}NudcndNl@gzAWMO#u)z^~BlTEpt$*Ha@*N@BZJB~) zEo?myX_ZiG>-mLqCw$v z;#0%k-7D0un}el20P6Mdntx5MjZQJ-9tU zlMoEPIlv|ZA7;Y|G0v8MZ=@>*W+!uRyuvzDVor#q=QboFdza&?Qg*Z z9-@W=;UCiEk5dKIKvrA4LX*QTrlD^i1!-jqE(G7VTg%wGxc4_khPy879R@3%Co>Q^ z8Q~;ieeg>(8Z5m#ENddX|F7_3b^_Q+(^?+_dgHexO#w#%nf1aCxR5weBvE1e(D$Hh z(-Tkmi(7mDPG`qQ^&sQsjuDs2h!z3^T`CNvqr5vLfWk>kf}DFL&SQpiZ20Cb=tKNj zu2`2t258kKn)7ASI{@+lbj&Q@omg)kVR@j|RS>#YBcwzeoAf~WZ-+g!4LHJJN(eqI ze@Vf-i(0P=4tynCF~l_SG2)w3I4|QbIaw3FPlDl9SddF4jh-A0A{DNdsbE4BDk`;6 zIl8=VEj-c!uPSiT^8)jNK%;$FMq8r`RwGR;gRfrpE{QIAv`I|qmHp7Ar zl<-}G_I9Uux}3bVncVvhl%FfgSXSZMzJ>7i&3FK16@ZBe*sz<*FNKqE=X>{vO446( z?gypD1J=;2r~z1q`cqDI5H;&xwEV38J_Odus&5mBm;Qi%KQr0nM!>KXC{> z?M8C`HkCLIIIAeb0<7~1z*+)KZAf!BRh2+O-|*-XnZ)6FJ{l$}BBP>$@|3nKl+>Qy zdAA6XhGt)5wd(S}8D`rD#q5BU6NK+dYU!pa7X zAY%bJ-KwPu%7qiNZ}KclV8Gj!M8!e1I39p^`qtREHTbO}Q*@o)&KTw>#mh z%I`?tzK&-r0v_|)U^Z#9w3~gmntXCk(Tb{UhU5q3*KYyOa8~+K27JNeQIZ* z>R=xGIUavS07;?Hk_RAJrZic&h47M-%AsCY(y1YM)pVag(@uz}jSc?0H`#ld`|Kg^ z`JrEd9KC$Bd0-xGJ%NF2JnI2%)OCxl>AL+(CGQN3%9r(Vd@;uq?MB4tCiUUAOZ#t+ z8aNq!Y8v+`jmq->W1erGsFZ`*OLSR?fM4_)!m`{r>Xqz zN^Jm4KifOu51>7r;g)-&q$|Dth(=4#-U+upLn-(85DayKi2nDO^V;_5$Etl^ejvT0 zg#IF0v3Up?8c#pQr>f;X{&U}y1E*-B0~<)GZ3Wb=3n!Rwy9u@S?Dy;Zj=o!&QSU4n zV)4o1tZDo#+h`BKj7UZNj)j}(z$YpAy`S@+0n=Wx2>Jh(G65wQyw`Df_E3A%e@8#2 z^ZAVdjgV1|`|}z%Ur;|$)O@p>@bs?+>*=t|hcTJ674#pxK_YtVWb{2&hdB?>ZG7!G z@~`yszCeq_-mfvQ_cNY-HRz*-+!V+(;*~)#>M-*RF*p5%6wAL08d1TdDG`0$4q4mE zay;YDGJoQCtc>!^NRT$6jJCnB$Aj1r=a)8`x1N?7i`amqC)53sMr4q7{Vr%58a+4* zj$c!!v_Xy5-yo*=GB}yx$SrZIbpX{h5L(4qSNnF{g7?Jo9-|9^$f!l>kV3gjpeE0G zY@isx3UHUA%=t9U$uxOFBIHl%v_4J>Ji8V3BetL%XVGtJ^Cyt!vW-1(%Pncd@A}iO z#po8a9$%U~$CMjtL#pcf7AF)zw@Tec*dM$;p#OBatBCdDW_ici^59wBjqtGW>2KEj zihG2h0^gYh=Pn8}JFYom#VXyI~Md<_7J&n&_yniy5iRr|(a5R9tvXi;h zV~!UA-k3t6tMsyP1@G6C!j8Ss=ddkIxnjV_ZgoXpv$|{Xe~!;t{4MI$(vM6WZJJ** z8SA=lA9hn^+^2^l&j2t8BOlTxdb`~dVvy%<+vYyxsZYg+xoeUN)4!+W7gh7GBj~h9 z@MS(v;M!)UM_H$BhO3i7ve4J0$ht-5ZYP#J?YCx`KTIoZ0*IP{rQzd&I4}7ITj=FS-v4htn zTh?~GU^W6NAt_WBBP4#GIr_t#=(eaL0|t@AQ!*)-f4My_Pzuk{Xs(U!Oa*g6SH%xP zN4EJ{J2h#gx@{(Z;MoT*XxiAEprCBwk}UHap}T2LBKmf6SjK|KZ{MG?UNliV4r{Dzq+teiM6K0dRsHL)pK{Vrn5Td|Fv2=avADfwl`X=0VniSmrT9}&NYHg~* z!V3SbSL&Dj)|0=#jG0RHSaXs(&e+MjZ}*wBNfCmS^l-nWh`qeFTfhI5|6KZawyB!) z?>rY2AikRrxB8W(;yD7W?W{v%cJNqObJfMF2ZHnLSl|GdF!( zhb(<&W7H9B%#P=YIX0nVykeq6Z$I&&n{jeal&=p_Lzi$#yOxYe2de?@-FhjSbJ+w3 z9I7)MFSU4d0A3BW1!^ZQ+~tlWHDBgrF!nx)(GEt{f_!>Xb;LF z9dyoUf_VK<50}QYu{`YU7s1pqe;eBU=sX7d>UwGCulz{3o1~y=81{ zIUJ&-u>q%15bS9S9zkPC7v3jAf{JnIP`~oF0XIq6Vbed`)V#O(vSQbJFtTUZ{kqHo zjRiCRulvDisRO6yr0xIHxzZCyd+ZKv4SH8yW+C(Q)qSoD;JR!?EG-K7DCk|Ao>KXF zmYrG~jPV8BQ}wWAwtdZ`JtbWVrN;3V_M`A#{+MuRM~Ca^IHg+L5QPzul|e}cB0g(1 z6W-&z1(;KX)t9GPnvMx2kt2v zi$K^fE{J$=s_WZ00|i9Y1AQeBtZ=cKQ$2Oq-lSKd)jce$C=Yq@(Gqq#_B35<FH+YfQ$#IL-=XtUUGoxdp*6X?KWz4?V+n_ya8FAdowT;LHbG>HDBZ7O@=fURjC4 ze?MCKW`3qa<9;?=;VdWe1VI2;7YBy=EpJV2PeNq;Q^M2)&7H5DR0(r?)3;1VoxX3p zjSU3^4GmLh{db0S3FvUNW8&+oCxThyfDo%;3c(LYH@`=|*CZgtw3isF^1|^#WQ1$K zIwWmc$;5B!&%`_b#zBV+H2tggAKXnupeS<4vcoC3QvasV2xW|gS!XeGpSw_y+nHwJ zW6Aq}E=qJsZE7YZ|5kk}eIRdtWo9?*2?tPJ7$eV&3{XckuG*(mXpT>bZGRcFF*>fh zYm{K>IqLYSR+coZTNBJX*T^MM?p_k)6%{Z`WwoBttxAVJG$j>Ugc^04w+hZ&=&v;; zS01#dK;CMA+7pk|*zQXIRS6YJ6MC>Gv(p!$y|U{k`*Xvd#ym~~^&f1KOL*!05hIkJ z(1CYx!MbncSE?|^!`A~Wf9kp?OPLsVdBUopc{k{~bpEYzGu_U@u~>wsaiw^?Q9}W3 zDO=p<=YH%Nfj)kEM=Ig%PciIx`tOqK@;^^bs&%(d|H2g*{`N`w{Th3mIJwUkQnr6x za^8TX^A0tyhSQPnikDeBG_agXgYWevG%zMD{h95oRVDa;5FDQgRWr zs7YNdF*O~gU_b^Zc#(n)1%%P57J081yxa57_!ARG){=w`5R{JyG@U8HeCa)$?z4ok zGvBZ?7xXIbDMgUvxgMY&75dKL$-Bn<9w)ksUeC;yr$DX;K)(7i6KY_0Aw&)YRYGMN z5FuJ9h#E>t3Slzf356q{t~GL2r*f77aU}P48S~#Nt8659z9x6-I3kb@K;>OeOWOaI z!UQpL|2)}Fm$+|FETGVC2i*_^T{X}=BJxWiz+Y$W3v?;u&V{Z;R#QG&H zmZ`xd3qWBM010)cv?%-`S4`0^;e-MSaS_%p4{qn=(^o!Pn|`}W(gE_k-8FFMhyro! zSumy3(-*JJtW11LkYA0qbg;94&=ofd7N|;P+t2?(QWp29t*J<*P#C08ND-XB{0A)| z2fkA;i5mfT4Y;@hsL-f;MgX#@&K8ECa!KiH^l1yU{9HCS?6Ss@e#noI5r~rh1chZE zv~w<-a6L$4e>j)a#>`!V;?91`Ekbp>#M>!L-igMaiUxT&dH<5ML6Mq;qA*&cbd=8?dnc*DS-rqZZNXb}V&X58zKme@}{QnAn z*bw-!79yHvvW3HT8iK>Y8;FyVy9k(^bbh=-~vF7I><-_n_oL@hKXHgS~kQ~DHg93Pft=_KT>}^&FTF9)Qv^R(^|rjMZVH& zraE0b0R>G!m78R@U1Fu|8y^7zg|dEMh1XLE6ZwPYGzue?)Eku^lxk#$P}KaE9b}2@ z{>{~3rIL?9rLC_%?-H&^*PQ7hS0#*O(UxyKe1@(EMb=*t$?Uw1Pz}`M5EE?S@g*oZGGY7)(I=EH{r}T zi?O!dK&xY{j=0goXyyCIcb^=icBl+{Nj7$oUBpHs;T9pWTuDf1JuRW0)}KfjPCU`T z{hXK6Fi&be4sQ|CSFdyWqS zrC^k(%~d43KHT6znLWL=>imIy*L%SANYP(X4Z;KvT@P(=3V*q+P}NPR|7_h(I~~vA z;BUK5*X4A4M0EW09Zt)Ip0mn)3hxc1_4Qwqjy2WI?V`l2+3qX5)I__5y|LOmv3|_z z&e-L2azX)A)^lAm$|p!j&s&kMe|KlD_(eXi%<5JPNfCn6sZKMk<9Z$**+vngr`;O` zRB@mR3H?oKzxYUOiGpA8=2`GZ?;d6F*KQHY(v6szH5ohcsFSEO1>vUqlF=yFAOyh* z<#aJ0IK>(uF0*^CyCB82f&ZaK!R)`Mz6q5`x$DR%;eDo3gBxpl~(6Q2W(^2`y z1cp^g6x+wAH9DJqBt_?L_&sSNpY!UzixwJf3z7cgyYMHfvNDqCS-f#&Y+|KTC@CU4DEEJ@ZXe5!C`Xi7Tfr!`(MKQ$O_% z_uY*6_F6)SBYD3Fr-%l;)22iED4Rb$Pot`btu_9$r4aT zecSmt&W8VM0i^!pDPYIGz>&{r7lZ9*W68;RGfb&aiN@2k|H>0A^RSkF2cO%Q_vfGz-};~IoVwI(RREwS2W^I;yn8BTqo5_m{v zIIEs=?HQD{u(mma22}^#X(GukgF-`$#0&*9g zm0Z5B|Cvyt&h#|o98(Zd8Ov_)k82mI)^2EM?5U6&ff~A<^@O!X`?M(ZyeMP&yzV60 zH~Au+`_rb@Ux9sVCl$1i3*8R_G5JNskO6o1=ib(Hix!_Z-4CKusZ}hdE^3V%duB99 zr6`U&*KmsJ!)iYDB1{R-TAgovcId`lyNkQl_!)lIBA?K&*dKJ<8uj&tb`=*yCW{>1&eB1|IoF|Nb*K|`CqZniy=c#a_Ts)H13g1t*|d3Rm22O zp&@&{c3l2T&$))U#ge;f_$bB6C~u<6Ox&1tg~;W8PEyk9wB7Tk-dA1o0`&_MFiOSLD9YG}A!Jf49276hef~(7Aw+s5$oQS+lho>zZS#ymIU1g)eGdelFcuPQ~tLQ8mEQKtcCKv`QNPg7kz=2E`2}4zr18vzrDpDnbbXY z=hIK|bczHac>VqTNFg^s`Bf?z-;*HE_#hCUv;Dzs^;7Hx59B$$ysmrgeVw`a6nvdC z! zivk|y+Ud@{^eDC^3fxt9Cr&x@j#8*TRJE^jy|yWx&=dP|D?$>emD0qbpva;;YwNZi z_-?_2buxZn4Ygujs%y}H?R&r*u#3CT(sJax*qheozUi-qxRX8=@-daJyzVOB2_r4& zFHOr3L0|qQuul7AK6@Nt`7^C$FrfA83%*YAFWuB|?z)xTxdK0rVX##FYNy^%Bx*L~ z+H9iMudfd_>q>uGFa6YB8BCJ*W~o^dH^G0u{g&sZ$j8J(d)~!6*C#5q7Bl+yUlgp< z9+$p(wf!~xz&Vz(J2)w9eA>%x+Z91uc5CgB?~fFzLhOduGfRgH*OPBKq>~#f42O=Z zzty+3wWG>3Y00Cq5ss*ae=83oRQs4a_S=uTP7e#`Db$8peZHNmJ^*qJ&Qu>32AEs5 zzLcflJF8YO?p^vjcu!1(fnxSkuiq81@A;)QFM>qPgK4iHN`taUxJ(v#q-8P*ah0{m zc~WG;nSF!%EbGT|`E}93n4@naFtVX0Hy>uqA_UQYJ>byUJX50z2d_Ycgw`cjN~eh}`k7|QI%wF}u5C{b%2w=8U!d+uJC;%z7%K75&>B0J&LQX5Mu)oup zr)EzswIZfVub+O?e{U(~l+4p%Fr;n08GSDlIoC8ybF~Nf&2f-YWOKlWnUPNZz^p=m27w|CYUNmCu?I zI#}IFO}FmWpB=wUzuvy)+K+p&o1URYQ{L4!bLW0I*s&5f$CY;#c`8Kn(N1%1wGFHx zmCs(J;n)W}U!C=cgR8bqF#d-&DjrB_slB!3-`clT&E}QIHQ`%ZgKZZ5FHPk6qg#x& z1ZGH!=eaqJxTYi%M;R!#^~s`dF1(|O=Eu*d8D`0MF_o zfi~r!JC3=05`jq!IW>W06Z6jA=Gq^9N9ZM7oEPgrssj&SdLPn6G<@6o`Z!>tbNe8Z z_g3b}jl@u?qe&jKfv_=~#sTN?wi2lu6R>EDppfl;-QeFd*m+^A*Aj_e6+@-od>@AL z_bmabK=_pa6rx5D0{ll9Gyw3JQf%Q&ZE>(9qJ-($Ue; z)6+9BFfcMQGBGhRlest;jD>{-4u`X{va+$Uv9q&taBy&Pa&mETadUI?@bK{R^78TV z@$>T|5C{PQ0YO1QAt51QVPO#w5m8Z5F)=YD5-Bb&E+HWyDJdx>B_%B_Eh8f%D=RA} zCnqm2ub`lysHmuP0j1quWM;(X=`hvP$(T8 z9W)xPtE;Q0r>C#4Z(v|xXlRJRV6a%Mk&%(Hv9XDXiK(fnnVFfnxw(afg{7sXm6esX zwKZAmwY9aiv$M0ew|8)GaCCHZa&mHZc6M=badmZdb91|KCcvmzTG< zw~vpHudlD4pP#?Ke?UM$U|?WSP*8Aia7aiQWb93|Z^78ZZ3knJf3k!>iii(SiOG-*gOH0ej%F4^jD=I1~D=Vw2 zs_xvmQ(awMQ&Ur0TU%FGclYkyd-v`&HdZw^XSY5|eDWl$qusl!%dxk|qVE}|zfb4+ z^J_0&C=a}ldr2nGUm{<<6n*tdXz-Q5;4A*YSA2u7cn4qc48G$2zl&?|)&IW;gIt4y zT;%KjySNF1Dk%Y`T6<9#l_#he=jdD|NZ+%B9Rnk6rd15E;B6@AV6X@_3-vV#0EtBBdon5eSAV~ L!VCj^0oVQy)O|Ae literal 0 HcmV?d00001 diff --git a/tutorials/navigation/navigation_using_navigationobstacles.rst b/tutorials/navigation/navigation_using_navigationobstacles.rst index 107a1eed4ed..1e7e4d7049e 100644 --- a/tutorials/navigation/navigation_using_navigationobstacles.rst +++ b/tutorials/navigation/navigation_using_navigationobstacles.rst @@ -3,52 +3,93 @@ Using NavigationObstacles ========================= -NavigationObstacles are used to set an avoidance radius around objects -that, due to their constant movement, cannot be efficiently (re)baked -to a 2D NavigationPolygon or 3D NavigationMesh. +NavigationObstacles can be used either as static or dynamic obstacles to affect avoidance controlled agents. + +- When used statically NavigationObstacles constrain avoidance controlled agents outside or inside a polygon defined area. +- When used dynamically NavigationObstacles push away avoidance controlled agents in a radius around them. 2D and 3D versions of NavigationObstacles nodes are available as :ref:`NavigationObstacle2D` and :ref:`NavigationObstacle3D` respectively. -NavigationObstacles are not intended for any kind of static geometry -or temporary barriers that may change their position occasionally. -Those changes should be (re)baked so actors can follow the outlines -of these objects at higher detail with navigation paths. The obstacle avoidance -should be seen as a last resort option intended for objects that are constantly moving. +.. note:: + NavigationObstacles do not change or influence the pathfinding in any way. + NavigationObstacles only affect the avoidance velocities of agents controlled by avoidance. -To use NavigationObstacles for avoidance, place a NavigationObstacle2D/3D node -below a Node2D/3D inheriting parent node. While the obstacle node has an -option to ``estimate_radius`` from child collisions, prefer to set a -more reliable manual ``radius`` value. If estimated, the obstacle will use -a radius that encapsulates the entire parent node which can result in a very large -radius value if the parent is not a circle shape but e.g. a long rectangle shape. +Static obstacles +~~~~~~~~~~~~~~~~ -.. note:: +A NavigationObstacle is considered static when its ``vertices`` property is populated with an outline array of positions to form a polygon. + +.. image:: img/nav_static_obstacle_build.gif + +- Static obstacles act as hard do-not-cross boundaries for avoidance using agents, e.g. similar to physics collision but for avoidance. +- Static obstacles define their boundaries with an array of outline ``vertices`` (positions), and in case of 3D with an additional ``height`` property. +- Static obstacles only work for agents that use the 2D avoidance mode. +- Static obstacles define through winding order of the vertices if agents are pushed out or sucked in. +- Static obstacles can not change their position. They can only be warped to a new position and rebuild from scratch. Static obstacles as a result are ill-suited for usages where the position is changed every frame as the constant rebuild has a high performance cost. +- Static obstacles that are warped to another position can not be predicted by agents. This creates the risk of getting agents stuck should a static obstacle be warped on top of agents. + +When the 2D avoidance is used in 3D the y-axis of Vector3 vertices is ignored. Instead, the global y-axis position of the obstacle is used as the elevation level. Agents will ignore static obstacles in 3D that are below or above them. This is automatically determined by global y-axis position of both obstacle and agent as the elevation level as well as their respective height properties. + +Dynamic obstacles +~~~~~~~~~~~~~~~~~ + +A NavigationObstacle is considered dynamic when its ``radius`` property is greater than zero. + +- Dynamic obstacles act as a soft please-move-away-from-me object for avoidance using agents, e.g. similar to how they avoid other agents. +- Dynamic obstacles define their boundaries with a single ``radius`` for a 2D circle, or in case of 3D avoidance a sphere shape. +- Dynamic obstacles can change their position every frame without additional performance cost. +- Dynamic obstacles with a set velocity can be predicted in their movement by agents. +- Dynamic obstacles are not a reliable way to constrain agents in crowded or narrow spaces. + +While both static and dynamic properties can be active at the same time on the same obstacle this is not recommended for performance. +Ideally when an obstacle is moving the static vertices are removed and instead the radius activated. When the obstacle reaches the new final position it should gradually enlarge its radius to push all other agents away. With enough created save space around the obstacle it should add the static vertices again and remove the radius. This helps to avoid getting agents stuck in the suddenly appearing static obstacle when the rebuild static boundary is finished. - The obstacle ``radius`` is the area that will be strictly avoided whenever possible. - Do not set it too large. Agents start to avoid way before - this radius depending on parameters and velocity. +Similar to agents the obstacles can make use of the ``avoidance_layers`` bitmask. +All agents with a matching bit on their own avoidance mask will avoid the obstacle. +Procedual obstacles +~~~~~~~~~~~~~~~~~~~ -While NavigationObstacle nodes do require a Node parent the NavigationServer obstacles do not. -New obstacles created in scripts require only a ``map``, ``radius`` and ``position``. -Obstacles can be placed directly on the NavigationMap with the NavigationServer API. +New obstacles can be created without a Node directly on the NavigationServer. + +Obstacles created with scripts require at least a ``map`` and a ``position``. +For dynamic use a ``radius`` is required. +For static use an array of ``vertices`` is required. + +.. tabs:: + .. code-tab:: gdscript GDScript + + extends Node2D + # create a new "obstacle" and place it on the default navigation map. + var new_obstacle_rid: RID = NavigationServer2D.obstacle_create() + var default_2d_map_rid: RID = get_world_2d().get_navigation_map() + + NavigationServer2D.obstacle_set_map(new_obstacle_rid, default_2d_map_rid) + NavigationServer2D.obstacle_set_position(new_obstacle_rid, global_position) + + # Use obstacle dynamic by increasing radius above zero. + NavigationServer2D.obstacle_set_radius(new_obstacle_rid, 5.0) + + # Use obstacle static by adding a square that pushes agents out. + var outline = PackedVector2Array([Vector2(-100, -100), Vector2(100, -100), Vector2(100, 100), Vector2(-100, 100)]) + NavigationServer2D.obstacle_set_vertices(new_obstacle_rid, outline) .. tabs:: .. code-tab:: gdscript GDScript extends Node3D - # create a new "obstacle" agent and place it on the default map`` - var new_agent_rid: RID = NavigationServer3D.agent_create() + # Create a new "obstacle" and place it on the default navigation map. + var new_obstacle_rid: RID = NavigationServer3D.obstacle_create() var default_3d_map_rid: RID = get_world_3d().get_navigation_map() - NavigationServer3D.agent_set_map(new_agent_rid, default_3d_map_rid) - NavigationServer3D.agent_set_radius(new_agent_rid, 0.5) - NavigationServer3D.agent_set_position(new_agent_rid, global_transform.origin) + NavigationServer3D.obstacle_set_map(new_obstacle_rid, default_3d_map_rid) + NavigationServer3D.obstacle_set_position(new_obstacle_rid, global_position) -.. note:: + # Use obstacle dynamic by increasing radius above zero. + NavigationServer3D.obstacle_set_radius(new_obstacle_rid, 0.5) - The NavigationServer API has no dedicated functions for obstacles. - Obstacles are technically considered just normal agents. - All "agent" prefixed functions are intended for obstacles as well. + # Use obstacle static by adding a square that pushes agents out. + var outline = PackedVector3Array([Vector3(-5, 0, -5), Vector3(5, 0, -5), Vector3(5, 0, 5), Vector3(-5, 0, 5)]) + NavigationServer3D.obstacle_set_vertices(new_obstacle_rid, outline) From 4356a7f8dcbccc50114d9baa0af987e34f001f6a Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 12 May 2023 19:54:51 +0200 Subject: [PATCH 04/76] Document using NoiseTexture3D with FogMaterial in Volumetric fog This also adds a tip about using a NoiseTexture3D as particle attractor vector field texture. --- ...tric_fog_fog_material_density_texture.webp | Bin 0 -> 124698 bytes tutorials/3d/particles/attractors.rst | 7 ++++ tutorials/3d/volumetric_fog.rst | 35 ++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 tutorials/3d/img/volumetric_fog_fog_material_density_texture.webp diff --git a/tutorials/3d/img/volumetric_fog_fog_material_density_texture.webp b/tutorials/3d/img/volumetric_fog_fog_material_density_texture.webp new file mode 100644 index 0000000000000000000000000000000000000000..fc264eeb8de32ea7d1388ddf776cf9f6bd0bd9f0 GIT binary patch literal 124698 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

bG!>Jw|(c2d*tu#0oOOV42hRB@DDC! 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

j1#h?=h|^Ds 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

M5z_iq{j6w)UUPpE>L{@fv@BI(C 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. +Using 3D noise density textures +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Since Godot 4.1, there is a NoiseTexture3D resource that can be used to +procedurally generate 3D noise. This is well-suited to FogMaterial density +textures, which can result in more detailed fog effects: + +.. figure:: img/volumetric_fog_fog_material_density_texture.webp + :alt: FogMaterial comparison (without and with density texture) + + Screenshot taken with **Volume Size** project setting set to 192 to make + high-frequency detail more visible in the fog. + +To do so, select the **Density Texture** property and choose **New NoiseTexture3D**. +Edit this NoiseTexture3D by clicking it, then click **Noise** at the bottom of the +NoiseTexture3D properties and choose **New FastNoiseLite**. Adjust the noise texture's +width, height and depth according to your fog volume's dimensions. + +To improve performance, it's recommended to use low texture sizes (64×64×64 or lower), +as high-frequency detail is difficult to notice in a FogVolume. If you wish to represent +more detailed density variations, you will need to increase +**Rendering > Environment > Volumetric Fog > Volume Size** in the project settings, +which has a performance cost. + +.. note:: + + NoiseTexture3D's **Color Ramp** affects FogMaterial density textures, but + not in the way you would typically expect. Since the texture's red channel + is sampled, using a color ramp will affect the resulting density if the red + channel intensity is modified in any way. + + However, using a color ramp will *not* tint the fog volume according to the + texture. You would need to use a custom shader that reads a Texture3D to + achieve this. + Custom FogVolume shaders ------------------------ From 6febc8ee06484a44430ef3a8e5bebabd1f502e93 Mon Sep 17 00:00:00 2001 From: Godot Organization Date: Sat, 13 May 2023 03:19:02 +0000 Subject: [PATCH 05/76] classref: Sync with current master branch (c64afeb) --- classes/class_@gdscript.rst | 48 +- classes/class_@globalscope.rst | 66 +- classes/class_aabb.rst | 6 +- classes/class_aescontext.rst | 32 +- classes/class_animatablebody2d.rst | 2 +- classes/class_animatablebody3d.rst | 2 +- classes/class_animation.rst | 60 +- classes/class_animationnode.rst | 96 +- classes/class_animationnodeadd2.rst | 2 +- classes/class_animationnodeadd3.rst | 2 +- classes/class_animationnodeanimation.rst | 6 +- classes/class_animationnodeblend2.rst | 2 +- classes/class_animationnodeblend3.rst | 2 +- classes/class_animationnodeblendspace1d.rst | 12 +- classes/class_animationnodeblendspace2d.rst | 10 +- classes/class_animationnodeblendtree.rst | 6 +- classes/class_animationnodeoneshot.rst | 4 +- classes/class_animationnodeoutput.rst | 11 +- classes/class_animationnodestatemachine.rst | 91 +- ...lass_animationnodestatemachineplayback.rst | 48 +- ...ss_animationnodestatemachinetransition.rst | 4 +- classes/class_animationnodesync.rst | 16 +- classes/class_animationnodetimescale.rst | 6 +- classes/class_animationnodetimeseek.rst | 4 +- classes/class_animationnodetransition.rst | 4 +- classes/class_animationplayer.rst | 10 +- classes/class_animationrootnode.rst | 16 +- classes/class_animationtree.rst | 4 +- classes/class_area2d.rst | 10 +- classes/class_area3d.rst | 12 +- classes/class_array.rst | 16 +- classes/class_astargrid2d.rst | 61 +- classes/class_audiostreamgenerator.rst | 30 +- classes/class_basebutton.rst | 2 + classes/class_basematerial3d.rst | 6 +- classes/class_bone2d.rst | 22 +- classes/class_boneattachment3d.rst | 6 +- classes/class_bonemap.rst | 4 +- classes/class_button.rst | 79 +- classes/class_buttongroup.rst | 32 +- classes/class_callable.rst | 18 +- classes/class_canvasitem.rst | 30 +- classes/class_characterbody2d.rst | 20 +- classes/class_characterbody3d.rst | 16 +- classes/class_checkbox.rst | 2 + classes/class_codeedit.rst | 18 +- classes/class_collisionpolygon2d.rst | 14 +- classes/class_collisionpolygon3d.rst | 10 +- classes/class_collisionshape2d.rst | 2 +- classes/class_collisionshape3d.rst | 2 +- classes/class_colorpicker.rst | 88 +- classes/class_compressedcubemap.rst | 6 +- classes/class_compressedcubemaparray.rst | 6 +- classes/class_compressedtexture2d.rst | 6 +- classes/class_compressedtexture2darray.rst | 6 +- classes/class_compressedtexturelayered.rst | 14 +- classes/class_concavepolygonshape2d.rst | 14 +- classes/class_concavepolygonshape3d.rst | 16 +- classes/class_conetwistjoint3d.rst | 8 +- classes/class_control.rst | 34 +- classes/class_convexpolygonshape2d.rst | 16 +- classes/class_convexpolygonshape3d.rst | 10 +- classes/class_cpuparticles3d.rst | 2 +- classes/class_crypto.rst | 8 +- classes/class_csgshape3d.rst | 2 +- classes/class_curve3d.rst | 2 +- classes/class_curvetexture.rst | 2 +- classes/class_decal.rst | 2 +- classes/class_dictionary.rst | 2 - classes/class_diraccess.rst | 4 +- classes/class_displayserver.rst | 104 +- classes/class_dtlsserver.rst | 12 +- classes/class_editorexportplatform.rst | 2 + classes/class_editorexportplatformandroid.rst | 2720 +++++++++++++++++ classes/class_editorexportplatformios.rst | 832 +++++ .../class_editorexportplatformlinuxbsd.rst | 292 ++ classes/class_editorexportplatformmacos.rst | 1320 ++++++++ ...n.rst => class_editorexportplatformpc.rst} | 14 +- classes/class_editorexportplatformweb.rst | 342 +++ classes/class_editorexportplatformwindows.rst | 578 ++++ classes/class_editorexportplugin.rst | 50 + classes/class_editorfiledialog.rst | 2 +- classes/class_editorinterface.rst | 89 +- classes/class_editorpaths.rst | 6 +- classes/class_editorplugin.rst | 2 +- .../class_editorresourceconversionplugin.rst | 4 +- .../class_editorresourcepreviewgenerator.rst | 30 +- classes/class_editorresourcetooltipplugin.rst | 106 + classes/class_editorscript.rst | 8 +- classes/class_editorsettings.rst | 134 +- classes/class_editorundoredomanager.rst | 4 + classes/class_editorvcsinterface.rst | 12 +- classes/class_enetpacketpeer.rst | 2 +- classes/class_engine.rst | 2 +- classes/class_environment.rst | 2 +- classes/class_expression.rst | 7 + classes/class_fileaccess.rst | 72 +- classes/class_filedialog.rst | 4 +- classes/class_filesystemdock.rst | 79 +- classes/class_font.rst | 14 + classes/class_fontfile.rst | 16 +- classes/class_fontvariation.rst | 15 +- classes/class_geometry3d.rst | 4 +- classes/class_geometryinstance3d.rst | 8 +- classes/class_gltfaccessor.rst | 4 +- classes/class_gltfcollider.rst | 257 ++ classes/class_gltfnode.rst | 50 +- classes/class_gltfphysicsbody.rst | 219 ++ classes/class_gltfstate.rst | 103 +- ...ass_gpuparticlescollisionheightfield3d.rst | 2 +- classes/class_gradient.rst | 2 + classes/class_graphedit.rst | 8 +- classes/class_graphnode.rst | 4 +- classes/class_hmaccontext.rst | 12 +- classes/class_hslider.rst | 14 + classes/class_image.rst | 34 +- classes/class_imagetexture.rst | 2 +- classes/class_immediatemesh.rst | 30 +- classes/class_input.rst | 6 +- classes/class_inputeventfromwindow.rst | 13 +- classes/class_inputeventgesture.rst | 7 + classes/class_inputeventmagnifygesture.rst | 13 +- classes/class_inputeventpangesture.rst | 13 +- classes/class_inputeventshortcut.rst | 13 +- classes/class_int.rst | 186 +- classes/class_itemlist.rst | 65 + classes/class_light3d.rst | 2 +- classes/class_lineedit.rst | 22 +- classes/class_marker2d.rst | 2 +- .../class_meshconvexdecompositionsettings.rst | 322 ++ classes/class_meshdatatool.rst | 4 +- classes/class_meshinstance3d.rst | 54 +- classes/class_multiplayerpeerextension.rst | 44 +- classes/class_multiplayersynchronizer.rst | 2 +- classes/class_navigationagent2d.rst | 291 +- classes/class_navigationagent3d.rst | 344 ++- classes/class_navigationlink2d.rst | 4 +- classes/class_navigationlink3d.rst | 4 +- classes/class_navigationobstacle2d.rst | 140 +- classes/class_navigationobstacle3d.rst | 180 +- classes/class_navigationregion2d.rst | 109 +- classes/class_navigationregion3d.rst | 41 +- classes/class_navigationserver2d.rst | 272 +- classes/class_navigationserver3d.rst | 340 ++- classes/class_node.rst | 333 +- classes/class_node2d.rst | 2 +- classes/class_node3d.rst | 14 +- classes/class_nodepath.rst | 2 +- classes/class_noise.rst | 70 +- classes/class_noisetexture3d.rst | 228 ++ classes/class_object.rst | 230 +- classes/class_openxraction.rst | 2 +- classes/class_openxrinterface.rst | 25 +- classes/class_optionbutton.rst | 21 + classes/class_os.rst | 54 +- classes/class_packedbytearray.rst | 96 +- classes/class_packeddatacontainer.rst | 62 +- classes/class_packeddatacontainerref.rst | 35 +- classes/class_packetpeerudp.rst | 4 +- classes/class_particleprocessmaterial.rst | 18 +- classes/class_physicalbone2d.rst | 24 +- classes/class_physicalbone3d.rst | 4 +- classes/class_physicsdirectbodystate2d.rst | 20 +- ...lass_physicsdirectbodystate2dextension.rst | 16 + classes/class_physicsdirectbodystate3d.rst | 18 +- ...lass_physicsdirectbodystate3dextension.rst | 16 + classes/class_physicsdirectspacestate2d.rst | 28 +- classes/class_physicsdirectspacestate3d.rst | 28 +- ...ass_physicsdirectspacestate3dextension.rst | 4 +- classes/class_physicsserver3d.rst | 28 +- classes/class_physicsserver3dextension.rst | 764 ++--- classes/class_polygon2d.rst | 12 +- classes/class_popupmenu.rst | 74 +- classes/class_projectsettings.rst | 2004 +++++++++--- classes/class_quaternion.rst | 12 +- classes/class_rdattachmentformat.rst | 21 +- classes/class_rdframebufferpass.rst | 8 +- classes/class_rdpipelinecolorblendstate.rst | 25 +- ...ss_rdpipelinecolorblendstateattachment.rst | 124 +- classes/class_rdpipelinedepthstencilstate.rst | 13 +- classes/class_rdpipelinemultisamplestate.rst | 33 +- .../class_rdpipelinerasterizationstate.rst | 33 +- ...class_rdpipelinespecializationconstant.rst | 19 +- classes/class_rdsamplerstate.rst | 61 +- classes/class_rdshaderfile.rst | 43 +- classes/class_rdshadersource.rst | 43 +- classes/class_rdshaderspirv.rst | 67 +- classes/class_rdtextureformat.rst | 45 +- classes/class_rdtextureview.rst | 29 +- classes/class_rduniform.rst | 17 +- classes/class_rdvertexattribute.rst | 9 +- classes/class_refcounted.rst | 2 +- classes/class_reflectionprobe.rst | 14 +- classes/class_renderingdevice.rst | 1270 ++++---- classes/class_renderingserver.rst | 1293 ++++---- classes/class_resource.rst | 2 +- classes/class_resourceloader.rst | 2 + classes/class_ribbontrailmesh.rst | 48 +- classes/class_richtextlabel.rst | 6 +- classes/class_rigidbody2d.rst | 2 +- classes/class_rigidbody3d.rst | 2 +- classes/class_scenetree.rst | 6 +- classes/class_scriptlanguageextension.rst | 2 +- classes/class_scrollcontainer.rst | 84 +- classes/class_shaderglobalsoverride.rst | 13 +- classes/class_shape3d.rst | 2 +- classes/class_shapecast2d.rst | 2 +- classes/class_shapecast3d.rst | 2 +- classes/class_skeleton2d.rst | 6 +- classes/class_skeleton3d.rst | 6 +- classes/class_skeletonik3d.rst | 4 +- classes/class_skeletonmodification2d.rst | 4 +- .../class_skeletonmodification2dfabrik.rst | 2 +- .../class_skeletonmodification2dlookat.rst | 2 +- ...ss_skeletonmodification2dphysicalbones.rst | 2 +- .../class_skeletonmodification2dtwoboneik.rst | 4 +- classes/class_skeletonprofile.rst | 2 +- classes/class_sky.rst | 2 +- classes/class_staticbody2d.rst | 4 +- classes/class_staticbody3d.rst | 6 +- classes/class_streampeer.rst | 120 +- classes/class_streampeertls.rst | 2 +- classes/class_string.rst | 97 +- classes/class_stringname.rst | 93 +- classes/class_styleboxflat.rst | 8 +- classes/class_surfacetool.rst | 134 +- classes/class_syntaxhighlighter.rst | 6 +- classes/class_tabbar.rst | 104 +- classes/class_tabcontainer.rst | 106 + classes/class_textedit.rst | 27 +- classes/class_textserver.rst | 28 +- classes/class_textserverdummy.rst | 24 +- classes/class_textserverextension.rst | 16 + classes/class_texture3d.rst | 2 +- classes/class_texturelayered.rst | 4 +- classes/class_theme.rst | 2 +- classes/class_thread.rst | 4 +- classes/class_tilemap.rst | 20 +- classes/class_tileset.rst | 12 +- .../class_tilesetscenescollectionsource.rst | 2 +- classes/class_timer.rst | 4 +- classes/class_transform2d.rst | 44 +- classes/class_transform3d.rst | 26 +- classes/class_translationserver.rst | 2 +- classes/class_tree.rst | 295 +- classes/class_treeitem.rst | 80 +- classes/class_tubetrailmesh.rst | 44 +- classes/class_tween.rst | 20 +- classes/class_udpserver.rst | 6 +- classes/class_undoredo.rst | 34 +- classes/class_upnp.rst | 4 +- classes/class_vector2.rst | 14 +- classes/class_vector2i.rst | 4 +- classes/class_vector3.rst | 8 +- classes/class_vector3i.rst | 4 +- classes/class_vector4.rst | 20 +- classes/class_vector4i.rst | 6 +- classes/class_vehiclewheel3d.rst | 4 +- classes/class_viewport.rst | 32 +- classes/class_viewporttexture.rst | 4 +- classes/class_visualinstance3d.rst | 2 +- ...class_visualshadernodetextureparameter.rst | 2 +- classes/class_vslider.rst | 14 + classes/class_webrtcmultiplayerpeer.rst | 4 +- classes/class_webrtcpeerconnection.rst | 10 +- classes/class_websocketmultiplayerpeer.rst | 2 +- classes/class_webxrinterface.rst | 54 + classes/class_window.rst | 50 +- classes/class_workerthreadpool.rst | 93 +- classes/class_x509certificate.rst | 40 +- classes/class_xrinterface.rst | 24 +- classes/class_xrinterfaceextension.rst | 18 +- classes/class_xrserver.rst | 31 +- classes/index.rst | 75 +- 274 files changed, 16441 insertions(+), 4432 deletions(-) create mode 100644 classes/class_editorexportplatformandroid.rst create mode 100644 classes/class_editorexportplatformios.rst create mode 100644 classes/class_editorexportplatformlinuxbsd.rst create mode 100644 classes/class_editorexportplatformmacos.rst rename classes/{class_animationtrackeditplugin.rst => class_editorexportplatformpc.rst} (66%) create mode 100644 classes/class_editorexportplatformweb.rst create mode 100644 classes/class_editorexportplatformwindows.rst create mode 100644 classes/class_editorresourcetooltipplugin.rst create mode 100644 classes/class_gltfcollider.rst create mode 100644 classes/class_gltfphysicsbody.rst create mode 100644 classes/class_meshconvexdecompositionsettings.rst create mode 100644 classes/class_noisetexture3d.rst diff --git a/classes/class_@gdscript.rst b/classes/class_@gdscript.rst index f695dbeb8be..5b50257c835 100644 --- a/classes/class_@gdscript.rst +++ b/classes/class_@gdscript.rst @@ -133,7 +133,7 @@ Mark the following property as exported (editable in the Inspector dock and save @export var string = "" @export var int_number = 5 @export var float_number: float = 5 - @export var image : Image + @export var image: Image .. rst-class:: classref-item-separator @@ -173,7 +173,7 @@ See also :ref:`@GlobalScope.PROPERTY_HINT_COLOR_NO_ALPHA`. + +See also :ref:`@GlobalScope.PROPERTY_HINT_LAYERS_AVOIDANCE`. + +:: + + @export_flags_avoidance var avoidance_layers: int + +.. rst-class:: classref-item-separator + +---- + .. _class_@GDScript_annotation_@export_global_dir: .. rst-class:: classref-annotation @@ -465,7 +483,7 @@ See also :ref:`@GlobalScope.PROPERTY_HINT_GLOBAL_FILE` to add subgroups within groups. @@ -662,6 +680,18 @@ The order of ``mode``, ``sync`` and ``transfer_mode`` does not matter and all ar ---- +.. _class_@GDScript_annotation_@static_unload: + +.. rst-class:: classref-annotation + +**@static_unload** **(** **)** + +Make a script with static variables to not persist after all references are lost. If the script is loaded again the static variables will revert to their default values. + +.. rst-class:: classref-item-separator + +---- + .. _class_@GDScript_annotation_@tool: .. rst-class:: classref-annotation @@ -712,7 +742,7 @@ Method Descriptions :ref:`Color` **Color8** **(** :ref:`int` r8, :ref:`int` g8, :ref:`int` b8, :ref:`int` a8=255 **)** -Returns a :ref:`Color` constructed from red (``r8``), green (``g8``), blue (``b8``), and optionally alpha (``a8``) integer channels, each divided by ``255.0`` for their final value. +Returns a :ref:`Color` constructed from red (``r8``), green (``g8``), blue (``b8``), and optionally alpha (``a8``) integer channels, each divided by ``255.0`` for their final value. Using :ref:`Color8` instead of the standard :ref:`Color` constructor is useful when you need to match exact color values in an :ref:`Image`. :: @@ -720,6 +750,8 @@ Returns a :ref:`Color` constructed from red (``r8``), green (``g8`` var dark_blue = Color8(0, 0, 51) # Same as Color(0, 0, 0.2). var my_color = Color8(306, 255, 0, 102) # Same as Color(1.2, 1, 0, 0.4). +\ **Note:** Due to the lower precision of :ref:`Color8` compared to the standard :ref:`Color` constructor, a color created with :ref:`Color8` will generally not be equal to the same color created with the standard :ref:`Color` constructor. Use :ref:`Color.is_equal_approx` for comparisons to avoid issues with floating-point precision error. + .. rst-class:: classref-item-separator ---- @@ -887,7 +919,7 @@ Examples: print(is_instance_of(a, MyClass)) print(is_instance_of(a, MyClass.InnerClass)) -\ **Note:** If ``value`` and/or ``type`` are freed objects (see :ref:`@GlobalScope.is_instance_valid`), or ``type`` is not one of the above options, this method will raise an runtime error. +\ **Note:** If ``value`` and/or ``type`` are freed objects (see :ref:`@GlobalScope.is_instance_valid`), or ``type`` is not one of the above options, this method will raise a runtime error. See also :ref:`@GlobalScope.typeof`, :ref:`type_exists`, :ref:`Array.is_same_typed` (and other :ref:`Array` methods). @@ -936,6 +968,8 @@ This function is a simplified version of :ref:`ResourceLoader.load`\ s at run-time, you may use :ref:`Image.load`. If you want to import audio files, you can use the snippet described in :ref:`AudioStreamMP3.data`. +\ **Note:** If :ref:`ProjectSettings.editor/export/convert_text_resources_to_binary` is ``true``, :ref:`load` will not be able to read converted files in an exported project. If you rely on run-time loading of files present within the PCK, set :ref:`ProjectSettings.editor/export/convert_text_resources_to_binary` to ``false``. + .. rst-class:: classref-item-separator ---- @@ -1034,8 +1068,8 @@ To iterate over an :ref:`Array` backwards, use: :: var array = [3, 6, 9] - for i in range(array.size(), 0, -1): - print(array[i - 1]) + for i in range(array.size() - 1, -1, -1): + print(array[i]) Output: diff --git a/classes/class_@globalscope.rst b/classes/class_@globalscope.rst index 87e5bfa09fe..76dce099a6e 100644 --- a/classes/class_@globalscope.rst +++ b/classes/class_@globalscope.rst @@ -3509,6 +3509,14 @@ Hints that an :ref:`int` property is a bitmask using the optionally n Hints that an :ref:`int` property is a bitmask using the optionally named 3D navigation layers. +.. _class_@GlobalScope_constant_PROPERTY_HINT_LAYERS_AVOIDANCE: + +.. rst-class:: classref-enumeration-constant + +:ref:`PropertyHint` **PROPERTY_HINT_LAYERS_AVOIDANCE** = ``37`` + +Hints that an integer property is a bitmask using the optionally named avoidance layers. + .. _class_@GlobalScope_constant_PROPERTY_HINT_FILE: .. rst-class:: classref-enumeration-constant @@ -3714,7 +3722,7 @@ Hints that a string property is a password, and every character is replaced with .. rst-class:: classref-enumeration-constant -:ref:`PropertyHint` **PROPERTY_HINT_MAX** = ``37`` +:ref:`PropertyHint` **PROPERTY_HINT_MAX** = ``38`` Represents the size of the :ref:`PropertyHint` enum. @@ -3758,7 +3766,7 @@ The property is shown in the :ref:`EditorInspector` (defa :ref:`PropertyUsageFlags` **PROPERTY_USAGE_INTERNAL** = ``8`` - +The property is excluded from the class reference. .. _class_@GlobalScope_constant_PROPERTY_USAGE_CHECKABLE: @@ -3960,6 +3968,14 @@ The property is only shown in the editor if modern renderers are supported (the The property is read-only in the :ref:`EditorInspector`. +.. _class_@GlobalScope_constant_PROPERTY_USAGE_SECRET: + +.. rst-class:: classref-enumeration-constant + +:ref:`PropertyUsageFlags` **PROPERTY_USAGE_SECRET** = ``536870912`` + +An export preset property with this flag contains confidential information and is stored separately from the rest of the export preset configuration. + .. _class_@GlobalScope_constant_PROPERTY_USAGE_DEFAULT: .. rst-class:: classref-enumeration-constant @@ -5114,7 +5130,7 @@ Returns the absolute value of int parameter ``x`` (i.e. positive value). :ref:`float` **acos** **(** :ref:`float` x **)** -Returns the arc cosine of ``x`` in radians. Use to get the angle of cosine ``x``. ``x`` must be between ``-1.0`` and ``1.0`` (inclusive), otherwise, :ref:`acos` will return :ref:`@GDScript.NAN`. +Returns the arc cosine of ``x`` in radians. Use to get the angle of cosine ``x``. ``x`` will be clamped between ``-1.0`` and ``1.0`` (inclusive), in order to prevent :ref:`acos` from returning :ref:`@GDScript.NAN`. :: @@ -5131,7 +5147,7 @@ Returns the arc cosine of ``x`` in radians. Use to get the angle of cosine ``x`` :ref:`float` **asin** **(** :ref:`float` x **)** -Returns the arc sine of ``x`` in radians. Use to get the angle of sine ``x``. ``x`` must be between ``-1.0`` and ``1.0`` (inclusive), otherwise, :ref:`asin` will return :ref:`@GDScript.NAN`. +Returns the arc sine of ``x`` in radians. Use to get the angle of sine ``x``. ``x`` will be clamped between ``-1.0`` and ``1.0`` (inclusive), in order to prevent :ref:`asin` from returning :ref:`@GDScript.NAN`. :: @@ -5904,7 +5920,7 @@ Linearly interpolates between two values by the factor defined in ``weight``. To :: - lerp(0, 4, 0.75) # Returns 3.0 + lerpf(0, 4, 0.75) # Returns 3.0 See also :ref:`inverse_lerp` which performs the reverse of this operation. To perform eased interpolation with :ref:`lerp`, combine it with :ref:`ease` or :ref:`smoothstep`. @@ -5939,9 +5955,9 @@ Converts from linear energy to decibels (audio). This can be used to implement v :ref:`float` **log** **(** :ref:`float` x **)** -Returns the natural logarithm of ``x``. This is the amount of time needed to reach a certain level of continuous growth. +Returns the `natural logarithm `__ of ``x`` (base `[i]e[/i] `__, with *e* being approximately 2.71828). This is the amount of time needed to reach a certain level of continuous growth. -\ **Note:** This is not the same as the "log" function on most calculators, which uses a base 10 logarithm. +\ **Note:** This is not the same as the "log" function on most calculators, which uses a base 10 logarithm. To use base 10 logarithm, use ``log(x) / log(10)``. :: @@ -6208,25 +6224,33 @@ Converts one or more arguments of any type to string in the best way possible an void **print_rich** **(** ... **)** |vararg| -Converts one or more arguments of any type to string in the best way possible and prints them to the console. The following BBCode tags are supported: b, i, u, s, indent, code, url, center, right, color, bgcolor, fgcolor. Color tags only support named colors such as ``red``, *not* hexadecimal color codes. Unsupported tags will be left as-is in standard output. +Converts one or more arguments of any type to string in the best way possible and prints them to the console. + +The following BBCode tags are supported: ``b``, ``i``, ``u``, ``s``, ``indent``, ``code``, ``url``, ``center``, ``right``, ``color``, ``bgcolor``, ``fgcolor``. -When printing to standard output, the supported subset of BBCode is converted to ANSI escape codes for the terminal emulator to display. Displaying ANSI escape codes is currently only supported on Linux and macOS. Support for ANSI escape codes may vary across terminal emulators, especially for italic and strikethrough. +Color tags only support the following named colors: ``black``, ``red``, ``green``, ``yellow``, ``blue``, ``magenta``, ``pink``, ``purple``, ``cyan``, ``white``, ``orange``, ``gray``. Hexadecimal color codes are not supported. + +URL tags only support URLs wrapped by an URL tag, not URLs with a different title. + +When printing to standard output, the supported subset of BBCode is converted to ANSI escape codes for the terminal emulator to display. Support for ANSI escape codes varies across terminal emulators, especially for italic and strikethrough. In standard output, ``code`` is represented with faint text but without any font change. Unsupported tags are left as-is in standard output. .. tabs:: .. code-tab:: gdscript - print_rich("[code][b]Hello world![/b][/code]") # Prints out: [b]Hello world![/b] + print_rich("[color=green][b]Hello world![/b][/color]") # Prints out "Hello world!" in green with a bold font .. code-tab:: csharp - GD.PrintRich("[code][b]Hello world![/b][/code]"); // Prints out: [b]Hello world![/b] + GD.PrintRich("[color=green][b]Hello world![/b][/color]"); // Prints out "Hello world!" in green with a bold font \ **Note:** Consider using :ref:`push_error` and :ref:`push_warning` to print error and warning messages instead of :ref:`print` or :ref:`print_rich`. This distinguishes them from print messages used for debugging purposes, while also displaying a stack trace when an error or warning is printed. +\ **Note:** On Windows, only Windows 10 and later correctly displays ANSI escape codes in standard output. + .. rst-class:: classref-item-separator ---- @@ -6735,9 +6759,9 @@ Returns ``-1.0`` if ``x`` is negative, ``1.0`` if ``x`` is positive, and ``0.0`` :: - sign(-6.5) # Returns -1.0 - sign(0.0) # Returns 0.0 - sign(6.5) # Returns 1.0 + signf(-6.5) # Returns -1.0 + signf(0.0) # Returns 0.0 + signf(6.5) # Returns 1.0 .. rst-class:: classref-item-separator @@ -6753,9 +6777,9 @@ Returns ``-1`` if ``x`` is negative, ``1`` if ``x`` is positive, and ``0`` if if :: - sign(-6) # Returns -1 - sign(0) # Returns 0 - sign(6) # Returns 1 + signi(-6) # Returns -1 + signi(0) # Returns 0 + signi(6) # Returns 1 .. rst-class:: classref-item-separator @@ -6859,8 +6883,8 @@ A type-safe version of :ref:`snapped`, return :: - snapped(32.0, 2.5) # Returns 32.5 - snapped(3.14159, 0.01) # Returns 3.14 + snappedf(32.0, 2.5) # Returns 32.5 + snappedf(3.14159, 0.01) # Returns 3.14 .. rst-class:: classref-item-separator @@ -6878,8 +6902,8 @@ A type-safe version of :ref:`snapped`, return :: - snapped(53, 16) # Returns 48 - snapped(4096, 100) # Returns 4100 + snappedi(53, 16) # Returns 48 + snappedi(4096, 100) # Returns 4100 .. rst-class:: classref-item-separator diff --git a/classes/class_aabb.rst b/classes/class_aabb.rst index f6746b71dcb..3dce76104d7 100644 --- a/classes/class_aabb.rst +++ b/classes/class_aabb.rst @@ -502,7 +502,7 @@ Returns ``true`` if the **AABB** is on both sides of a plane. :ref:`Variant` **intersects_ray** **(** :ref:`Vector3` from, :ref:`Vector3` dir **)** |const| -Returns ``true`` if the given ray intersects with this **AABB**. Ray length is infinite. +Returns the point of intersection of the given ray with this **AABB** or ``null`` if there is no intersection. Ray length is infinite. .. rst-class:: classref-item-separator @@ -514,7 +514,7 @@ Returns ``true`` if the given ray intersects with this **AABB**. Ray length is i :ref:`Variant` **intersects_segment** **(** :ref:`Vector3` from, :ref:`Vector3` to **)** |const| -Returns ``true`` if the **AABB** intersects the line segment between ``from`` and ``to``. +Returns the point of intersection between ``from`` and ``to`` with this **AABB** or ``null`` if there is no intersection. .. rst-class:: classref-item-separator @@ -567,7 +567,7 @@ Operator Descriptions :ref:`bool` **operator !=** **(** :ref:`AABB` right **)** -Returns ``true`` if the vectors are not equal. +Returns ``true`` if the AABBs are not equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`is_equal_approx` instead, which is more reliable. diff --git a/classes/class_aescontext.rst b/classes/class_aescontext.rst index 9a2f1fdc8a4..88c84a081f7 100644 --- a/classes/class_aescontext.rst +++ b/classes/class_aescontext.rst @@ -34,27 +34,27 @@ This class provides access to AES encryption/decryption of raw data. Both AES-EC var key = "My secret key!!!" # Key must be either 16 or 32 bytes. var data = "My secret text!!" # Data size must be multiple of 16 bytes, apply padding if needed. # Encrypt ECB - aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8()) - var encrypted = aes.update(data.to_utf8()) + aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8_buffer()) + var encrypted = aes.update(data.to_utf8_buffer()) aes.finish() # Decrypt ECB - aes.start(AESContext.MODE_ECB_DECRYPT, key.to_utf8()) + aes.start(AESContext.MODE_ECB_DECRYPT, key.to_utf8_buffer()) var decrypted = aes.update(encrypted) aes.finish() # Check ECB - assert(decrypted == data.to_utf8()) + assert(decrypted == data.to_utf8_buffer()) var iv = "My secret iv!!!!" # IV must be of exactly 16 bytes. # Encrypt CBC - aes.start(AESContext.MODE_CBC_ENCRYPT, key.to_utf8(), iv.to_utf8()) - encrypted = aes.update(data.to_utf8()) + aes.start(AESContext.MODE_CBC_ENCRYPT, key.to_utf8_buffer(), iv.to_utf8_buffer()) + encrypted = aes.update(data.to_utf8_buffer()) aes.finish() # Decrypt CBC - aes.start(AESContext.MODE_CBC_DECRYPT, key.to_utf8(), iv.to_utf8()) + aes.start(AESContext.MODE_CBC_DECRYPT, key.to_utf8_buffer(), iv.to_utf8_buffer()) decrypted = aes.update(encrypted) aes.finish() # Check CBC - assert(decrypted == data.to_utf8()) + assert(decrypted == data.to_utf8_buffer()) .. code-tab:: csharp @@ -70,27 +70,27 @@ This class provides access to AES encryption/decryption of raw data. Both AES-EC string key = "My secret key!!!"; // Key must be either 16 or 32 bytes. string data = "My secret text!!"; // Data size must be multiple of 16 bytes, apply padding if needed. // Encrypt ECB - _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8()); - byte[] encrypted = _aes.Update(data.ToUtf8()); + _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8Buffer()); + byte[] encrypted = _aes.Update(data.ToUtf8Buffer()); _aes.Finish(); // Decrypt ECB - _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8()); + _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8Buffer()); byte[] decrypted = _aes.Update(encrypted); _aes.Finish(); // Check ECB - Debug.Assert(decrypted == data.ToUtf8()); + Debug.Assert(decrypted == data.ToUtf8Buffer()); string iv = "My secret iv!!!!"; // IV must be of exactly 16 bytes. // Encrypt CBC - _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8(), iv.ToUtf8()); - encrypted = _aes.Update(data.ToUtf8()); + _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8Buffer(), iv.ToUtf8Buffer()); + encrypted = _aes.Update(data.ToUtf8Buffer()); _aes.Finish(); // Decrypt CBC - _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8(), iv.ToUtf8()); + _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8Buffer(), iv.ToUtf8Buffer()); decrypted = _aes.Update(encrypted); _aes.Finish(); // Check CBC - Debug.Assert(decrypted == data.ToUtf8()); + Debug.Assert(decrypted == data.ToUtf8Buffer()); } } diff --git a/classes/class_animatablebody2d.rst b/classes/class_animatablebody2d.rst index 11264de808f..8d9003e0f66 100644 --- a/classes/class_animatablebody2d.rst +++ b/classes/class_animatablebody2d.rst @@ -12,7 +12,7 @@ AnimatableBody2D **Inherits:** :ref:`StaticBody2D` **<** :ref:`PhysicsBody2D` **<** :ref:`CollisionObject2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Physics body for 2D physics which moves only by script or animation. Useful for moving platforms and doors. +Physics body for 2D physics which moves only by script or animation (while affecting other bodies on its path). Useful for moving platforms and doors. .. rst-class:: classref-introduction-group diff --git a/classes/class_animatablebody3d.rst b/classes/class_animatablebody3d.rst index 347d2a310aa..563e7eb7a85 100644 --- a/classes/class_animatablebody3d.rst +++ b/classes/class_animatablebody3d.rst @@ -12,7 +12,7 @@ AnimatableBody3D **Inherits:** :ref:`StaticBody3D` **<** :ref:`PhysicsBody3D` **<** :ref:`CollisionObject3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Physics body for 3D physics which moves only by script or animation. Useful for moving platforms and doors. +Physics body for 3D physics which moves only by script or animation (while affecting other bodies on its path). Useful for moving platforms and doors. .. rst-class:: classref-introduction-group diff --git a/classes/class_animation.rst b/classes/class_animation.rst index b0d9235d3d7..b4e3691a461 100644 --- a/classes/class_animation.rst +++ b/classes/class_animation.rst @@ -12,14 +12,14 @@ Animation **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Contains data used to animate everything in the engine. +Holds data that can be used to animate anything in the engine. .. rst-class:: classref-introduction-group Description ----------- -An Animation resource contains data used to animate everything in the engine. Animations are divided into tracks, and each track must be linked to a node. The state of that node can be changed through time, by adding timed keys (events) to the track. +This resource holds data that can be used to animate anything in the engine. Animations are divided into tracks and each track must be linked to a node. The state of that node can be changed through time, by adding timed keys (events) to the track. .. tabs:: @@ -126,6 +126,8 @@ Methods +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`blend_shape_track_insert_key` **(** :ref:`int` track_idx, :ref:`float` time, :ref:`float` amount **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`blend_shape_track_interpolate` **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| | + +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`clear` **(** **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`compress` **(** :ref:`int` page_size=8192, :ref:`int` fps=120, :ref:`float` split_tolerance=4.0 **)** | @@ -142,12 +144,18 @@ Methods +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`position_track_insert_key` **(** :ref:`int` track_idx, :ref:`float` time, :ref:`Vector3` position **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`position_track_interpolate` **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| | + +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`remove_track` **(** :ref:`int` track_idx **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`rotation_track_insert_key` **(** :ref:`int` track_idx, :ref:`float` time, :ref:`Quaternion` rotation **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Quaternion` | :ref:`rotation_track_interpolate` **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| | + +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`scale_track_insert_key` **(** :ref:`int` track_idx, :ref:`float` time, :ref:`Vector3` scale **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`scale_track_interpolate` **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| | + +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`track_find_key` **(** :ref:`int` track_idx, :ref:`float` time, :ref:`FindMode` find_mode=0 **)** |const| | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`track_get_interpolation_loop_wrap` **(** :ref:`int` track_idx **)** |const| | @@ -825,6 +833,18 @@ Inserts a key in a given blend shape track. Returns the key index. ---- +.. _class_Animation_method_blend_shape_track_interpolate: + +.. rst-class:: classref-method + +:ref:`float` **blend_shape_track_interpolate** **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| + +Returns the interpolated blend shape value at the given time (in seconds). The ``track_idx`` must be the index of a blend shape track. + +.. rst-class:: classref-item-separator + +---- + .. _class_Animation_method_clear: .. rst-class:: classref-method @@ -923,6 +943,18 @@ Inserts a key in a given 3D position track. Returns the key index. ---- +.. _class_Animation_method_position_track_interpolate: + +.. rst-class:: classref-method + +:ref:`Vector3` **position_track_interpolate** **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| + +Returns the interpolated position value at the given time (in seconds). The ``track_idx`` must be the index of a 3D position track. + +.. rst-class:: classref-item-separator + +---- + .. _class_Animation_method_remove_track: .. rst-class:: classref-method @@ -947,6 +979,18 @@ Inserts a key in a given 3D rotation track. Returns the key index. ---- +.. _class_Animation_method_rotation_track_interpolate: + +.. rst-class:: classref-method + +:ref:`Quaternion` **rotation_track_interpolate** **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| + +Returns the interpolated rotation value at the given time (in seconds). The ``track_idx`` must be the index of a 3D rotation track. + +.. rst-class:: classref-item-separator + +---- + .. _class_Animation_method_scale_track_insert_key: .. rst-class:: classref-method @@ -959,6 +1003,18 @@ Inserts a key in a given 3D scale track. Returns the key index. ---- +.. _class_Animation_method_scale_track_interpolate: + +.. rst-class:: classref-method + +:ref:`Vector3` **scale_track_interpolate** **(** :ref:`int` track_idx, :ref:`float` time_sec **)** |const| + +Returns the interpolated scale value at the given time (in seconds). The ``track_idx`` must be the index of a 3D scale track. + +.. rst-class:: classref-item-separator + +---- + .. _class_Animation_method_track_find_key: .. rst-class:: classref-method diff --git a/classes/class_animationnode.rst b/classes/class_animationnode.rst index 223eab5fb41..8aa6db6d2b5 100644 --- a/classes/class_animationnode.rst +++ b/classes/class_animationnode.rst @@ -14,7 +14,7 @@ AnimationNode **Inherited By:** :ref:`AnimationNodeOutput`, :ref:`AnimationNodeSync`, :ref:`AnimationNodeTimeScale`, :ref:`AnimationNodeTimeSeek`, :ref:`AnimationRootNode` -Base resource for :ref:`AnimationTree` nodes. +Base class for :ref:`AnimationTree` nodes. Not related to scene nodes. .. rst-class:: classref-introduction-group @@ -30,7 +30,7 @@ Inherit this when creating nodes mainly for use in :ref:`AnimationNodeBlendTree< Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. rst-class:: classref-reftable-group @@ -52,49 +52,49 @@ Methods .. table:: :widths: auto - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`_get_caption` **(** **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`AnimationNode` | :ref:`_get_child_by_name` **(** :ref:`StringName` name **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`_get_child_nodes` **(** **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_get_parameter_default_value` **(** :ref:`StringName` parameter **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Array` | :ref:`_get_parameter_list` **(** **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_has_filter` **(** **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_is_parameter_read_only` **(** :ref:`StringName` parameter **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_process` **(** :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`add_input` **(** :ref:`String` name **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`blend_animation` **(** :ref:`StringName` animation, :ref:`float` time, :ref:`float` delta, :ref:`bool` seeked, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`LoopedFlag` looped_flag=0 **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`blend_input` **(** :ref:`int` input_index, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`blend_node` **(** :ref:`StringName` name, :ref:`AnimationNode` node, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`find_input` **(** :ref:`String` name **)** |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_input_count` **(** **)** |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_input_name` **(** :ref:`int` input **)** |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`get_parameter` **(** :ref:`StringName` name **)** |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_path_filtered` **(** :ref:`NodePath` path **)** |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_input` **(** :ref:`int` index **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_filter_path` **(** :ref:`NodePath` path, :ref:`bool` enable **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`set_input_name` **(** :ref:`int` input, :ref:`String` name **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_parameter` **(** :ref:`StringName` name, :ref:`Variant` value **)** | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`_get_caption` **(** **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`AnimationNode` | :ref:`_get_child_by_name` **(** :ref:`StringName` name **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`_get_child_nodes` **(** **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_get_parameter_default_value` **(** :ref:`StringName` parameter **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array` | :ref:`_get_parameter_list` **(** **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_has_filter` **(** **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_is_parameter_read_only` **(** :ref:`StringName` parameter **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_process` **(** :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`bool` test_only **)** |virtual| |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`add_input` **(** :ref:`String` name **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`blend_animation` **(** :ref:`StringName` animation, :ref:`float` time, :ref:`float` delta, :ref:`bool` seeked, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`LoopedFlag` looped_flag=0 **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`blend_input` **(** :ref:`int` input_index, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true, :ref:`bool` test_only=false **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`blend_node` **(** :ref:`StringName` name, :ref:`AnimationNode` node, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true, :ref:`bool` test_only=false **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`find_input` **(** :ref:`String` name **)** |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_input_count` **(** **)** |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_input_name` **(** :ref:`int` input **)** |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get_parameter` **(** :ref:`StringName` name **)** |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_path_filtered` **(** :ref:`NodePath` path **)** |const| | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_input` **(** :ref:`int` index **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_filter_path` **(** :ref:`NodePath` path, :ref:`bool` enable **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`set_input_name` **(** :ref:`int` input, :ref:`String` name **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_parameter` **(** :ref:`StringName` name, :ref:`Variant` value **)** | + +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -303,7 +303,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen .. rst-class:: classref-method -:ref:`float` **_process** **(** :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking **)** |virtual| |const| +:ref:`float` **_process** **(** :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`bool` test_only **)** |virtual| |const| When inheriting from :ref:`AnimationRootNode`, implement this virtual method to run some code when this node is processed. The ``time`` parameter is a relative delta, unless ``seek`` is ``true``, in which case it is absolute. @@ -345,7 +345,7 @@ A ``looped_flag`` is used by internal processing immediately after the loop. See .. rst-class:: classref-method -:ref:`float` **blend_input** **(** :ref:`int` input_index, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true **)** +:ref:`float` **blend_input** **(** :ref:`int` input_index, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true, :ref:`bool` test_only=false **)** Blend an input. This is only useful for nodes created for an :ref:`AnimationNodeBlendTree`. The ``time`` parameter is a relative delta, unless ``seek`` is ``true``, in which case it is absolute. A filter mode may be optionally passed (see :ref:`FilterAction` for options). @@ -357,7 +357,7 @@ Blend an input. This is only useful for nodes created for an :ref:`AnimationNode .. rst-class:: classref-method -:ref:`float` **blend_node** **(** :ref:`StringName` name, :ref:`AnimationNode` node, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true **)** +:ref:`float` **blend_node** **(** :ref:`StringName` name, :ref:`AnimationNode` node, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true, :ref:`bool` test_only=false **)** Blend another animation node (in case this node contains children animation nodes). This function is only useful if you inherit from :ref:`AnimationRootNode` instead, else editors will not display your node for addition. diff --git a/classes/class_animationnodeadd2.rst b/classes/class_animationnodeadd2.rst index 76fef4516e8..a5d84302898 100644 --- a/classes/class_animationnodeadd2.rst +++ b/classes/class_animationnodeadd2.rst @@ -26,7 +26,7 @@ A resource to add to an :ref:`AnimationNodeBlendTree` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_animationnodeadd3.rst b/classes/class_animationnodeadd3.rst index e8ddb4ff80d..9f7231ac6af 100644 --- a/classes/class_animationnodeadd3.rst +++ b/classes/class_animationnodeadd3.rst @@ -34,7 +34,7 @@ This node has three inputs: Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `Third Person Shooter Demo `__ diff --git a/classes/class_animationnodeanimation.rst b/classes/class_animationnodeanimation.rst index 5eabf6fb22d..fa57e5c6161 100644 --- a/classes/class_animationnodeanimation.rst +++ b/classes/class_animationnodeanimation.rst @@ -12,21 +12,21 @@ AnimationNodeAnimation **Inherits:** :ref:`AnimationRootNode` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input animation to use in an :ref:`AnimationNodeBlendTree`. +An input animation for an :ref:`AnimationNodeBlendTree`. .. rst-class:: classref-introduction-group Description ----------- -A resource to add to an :ref:`AnimationNodeBlendTree`. Only features one output set using the :ref:`animation` property. Use it as an input for :ref:`AnimationNode` that blend animations together. +A resource to add to an :ref:`AnimationNodeBlendTree`. Only has one output port using the :ref:`animation` property. Used as an input for :ref:`AnimationNode`\ s that blend animations together. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `3D Platformer Demo `__ diff --git a/classes/class_animationnodeblend2.rst b/classes/class_animationnodeblend2.rst index b68126473d2..211a716f3ab 100644 --- a/classes/class_animationnodeblend2.rst +++ b/classes/class_animationnodeblend2.rst @@ -26,7 +26,7 @@ A resource to add to an :ref:`AnimationNodeBlendTree` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `3D Platformer Demo `__ diff --git a/classes/class_animationnodeblend3.rst b/classes/class_animationnodeblend3.rst index a6b35dee9a0..73b5678af8f 100644 --- a/classes/class_animationnodeblend3.rst +++ b/classes/class_animationnodeblend3.rst @@ -34,7 +34,7 @@ This node has three inputs: Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_animationnodeblendspace1d.rst b/classes/class_animationnodeblendspace1d.rst index 6b1efe8eec6..abb31233fd4 100644 --- a/classes/class_animationnodeblendspace1d.rst +++ b/classes/class_animationnodeblendspace1d.rst @@ -12,27 +12,25 @@ AnimationNodeBlendSpace1D **Inherits:** :ref:`AnimationRootNode` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Blends linearly between two of any number of :ref:`AnimationNode` of any type placed on a virtual axis. +A set of :ref:`AnimationRootNode`\ s placed on a virtual axis, crossfading between the two adjacent ones. Used by :ref:`AnimationTree`. .. rst-class:: classref-introduction-group Description ----------- -A resource to add to an :ref:`AnimationNodeBlendTree`. +A resource used by :ref:`AnimationNodeBlendTree`. -This is a virtual axis on which you can add any type of :ref:`AnimationNode` using :ref:`add_blend_point`. +\ **AnimationNodeBlendSpace1D** represents a virtual axis on which any type of :ref:`AnimationRootNode`\ s can be added using :ref:`add_blend_point`. Outputs the linear blend of the two :ref:`AnimationRootNode`\ s adjacent to the current value. -Outputs the linear blend of the two :ref:`AnimationNode`\ s closest to the node's current value. - -You can set the extents of the axis using the :ref:`min_space` and :ref:`max_space`. +You can set the extents of the axis with :ref:`min_space` and :ref:`max_space`. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. rst-class:: classref-reftable-group diff --git a/classes/class_animationnodeblendspace2d.rst b/classes/class_animationnodeblendspace2d.rst index 622791deb32..c36929ea833 100644 --- a/classes/class_animationnodeblendspace2d.rst +++ b/classes/class_animationnodeblendspace2d.rst @@ -12,25 +12,25 @@ AnimationNodeBlendSpace2D **Inherits:** :ref:`AnimationRootNode` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Blends linearly between three :ref:`AnimationNode` of any type placed in a 2D space. +A set of :ref:`AnimationRootNode`\ s placed on 2D coordinates, crossfading between the three adjacent ones. Used by :ref:`AnimationTree`. .. rst-class:: classref-introduction-group Description ----------- -A resource to add to an :ref:`AnimationNodeBlendTree`. +A resource used by :ref:`AnimationNodeBlendTree`. -This node allows you to blend linearly between three animations using a :ref:`Vector2` weight. +\ :ref:`AnimationNodeBlendSpace1D` represents a virtual 2D space on which :ref:`AnimationRootNode`\ s are placed. Outputs the linear blend of the three adjacent animations using a :ref:`Vector2` weight. Adjacent in this context means the three :ref:`AnimationRootNode`\ s making up the triangle that contains the current value. -You can add vertices to the blend space with :ref:`add_blend_point` and automatically triangulate it by setting :ref:`auto_triangles` to ``true``. Otherwise, use :ref:`add_triangle` and :ref:`remove_triangle` to create up the blend space by hand. +You can add vertices to the blend space with :ref:`add_blend_point` and automatically triangulate it by setting :ref:`auto_triangles` to ``true``. Otherwise, use :ref:`add_triangle` and :ref:`remove_triangle` to triangulate the blend space by hand. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `Third Person Shooter Demo `__ diff --git a/classes/class_animationnodeblendtree.rst b/classes/class_animationnodeblendtree.rst index cb4c43c9df9..90da4bcb69b 100644 --- a/classes/class_animationnodeblendtree.rst +++ b/classes/class_animationnodeblendtree.rst @@ -12,14 +12,14 @@ AnimationNodeBlendTree **Inherits:** :ref:`AnimationRootNode` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -:ref:`AnimationTree` node resource that contains many blend type nodes. +A sub-tree of blend type :ref:`AnimationNode`\ s used for complex animations. Used by :ref:`AnimationTree`. .. rst-class:: classref-introduction-group Description ----------- -This node may contain a sub-tree of any other blend type nodes, such as :ref:`AnimationNodeTransition`, :ref:`AnimationNodeBlend2`, :ref:`AnimationNodeBlend3`, :ref:`AnimationNodeOneShot`, etc. This is one of the most commonly used roots. +This node may contain a sub-tree of any other blend type nodes, such as :ref:`AnimationNodeTransition`, :ref:`AnimationNodeBlend2`, :ref:`AnimationNodeBlend3`, :ref:`AnimationNodeOneShot`, etc. This is one of the most commonly used animation node roots. An :ref:`AnimationNodeOutput` node named ``output`` is created by default. @@ -28,7 +28,7 @@ An :ref:`AnimationNodeOutput` node named ``output`` i Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. rst-class:: classref-reftable-group diff --git a/classes/class_animationnodeoneshot.rst b/classes/class_animationnodeoneshot.rst index 8808ba8f164..7b102b2521d 100644 --- a/classes/class_animationnodeoneshot.rst +++ b/classes/class_animationnodeoneshot.rst @@ -12,7 +12,7 @@ AnimationNodeOneShot **Inherits:** :ref:`AnimationNodeSync` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Plays an animation once in :ref:`AnimationNodeBlendTree`. +Plays an animation once in an :ref:`AnimationNodeBlendTree`. .. rst-class:: classref-introduction-group @@ -61,7 +61,7 @@ After setting the request and changing the animation playback, the one-shot node Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `Third Person Shooter Demo `__ diff --git a/classes/class_animationnodeoutput.rst b/classes/class_animationnodeoutput.rst index add79da80b5..853c81d7520 100644 --- a/classes/class_animationnodeoutput.rst +++ b/classes/class_animationnodeoutput.rst @@ -12,14 +12,21 @@ AnimationNodeOutput **Inherits:** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Generic output node to be added to :ref:`AnimationNodeBlendTree`. +The animation output node of an :ref:`AnimationNodeBlendTree`. + +.. rst-class:: classref-introduction-group + +Description +----------- + +A node created automatically in an :ref:`AnimationNodeBlendTree` that outputs the final animation. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `3D Platformer Demo `__ diff --git a/classes/class_animationnodestatemachine.rst b/classes/class_animationnodestatemachine.rst index b9af0a4ea99..0161f01da9b 100644 --- a/classes/class_animationnodestatemachine.rst +++ b/classes/class_animationnodestatemachine.rst @@ -12,14 +12,14 @@ AnimationNodeStateMachine **Inherits:** :ref:`AnimationRootNode` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -State machine for control of animations. +A state machine with multiple :ref:`AnimationRootNode`\ s, used by :ref:`AnimationTree`. .. rst-class:: classref-introduction-group Description ----------- -Contains multiple nodes representing animation states, connected in a graph. Node transitions can be configured to happen automatically or via code, using a shortest-path algorithm. Retrieve the :ref:`AnimationNodeStateMachinePlayback` object from the :ref:`AnimationTree` node to control it programmatically. +Contains multiple :ref:`AnimationRootNode`\ s representing animation states, connected in a graph. Node transitions can be configured to happen automatically or via code, using a shortest-path algorithm. Retrieve the :ref:`AnimationNodeStateMachinePlayback` object from the :ref:`AnimationTree` node to control it programmatically. \ **Example:**\ @@ -43,7 +43,7 @@ Contains multiple nodes representing animation states, connected in a graph. Nod Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. rst-class:: classref-reftable-group @@ -53,9 +53,13 @@ Properties .. table:: :widths: auto - +-------------------------+----------------------------------------------------------------------------------------------------+-----------+ - | :ref:`bool` | :ref:`allow_transition_to_self` | ``false`` | - +-------------------------+----------------------------------------------------------------------------------------------------+-----------+ + +--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`allow_transition_to_self` | ``false`` | + +--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`reset_ends` | ``false`` | + +--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------+ + | :ref:`StateMachineType` | :ref:`state_machine_type` | ``0`` | + +--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------+ .. rst-class:: classref-reftable-group @@ -111,6 +115,45 @@ Methods .. rst-class:: classref-descriptions-group +Enumerations +------------ + +.. _enum_AnimationNodeStateMachine_StateMachineType: + +.. rst-class:: classref-enumeration + +enum **StateMachineType**: + +.. _class_AnimationNodeStateMachine_constant_STATE_MACHINE_TYPE_ROOT: + +.. rst-class:: classref-enumeration-constant + +:ref:`StateMachineType` **STATE_MACHINE_TYPE_ROOT** = ``0`` + +Seeking to the beginning is treated as playing from the start state. Transition to the end state is treated as exiting the state machine. + +.. _class_AnimationNodeStateMachine_constant_STATE_MACHINE_TYPE_NESTED: + +.. rst-class:: classref-enumeration-constant + +:ref:`StateMachineType` **STATE_MACHINE_TYPE_NESTED** = ``1`` + +Seeking to the beginning is treated as seeking to the beginning of the animation in the current state. Transition to the end state, or the absence of transitions in each state, is treated as exiting the state machine. + +.. _class_AnimationNodeStateMachine_constant_STATE_MACHINE_TYPE_GROUPED: + +.. rst-class:: classref-enumeration-constant + +:ref:`StateMachineType` **STATE_MACHINE_TYPE_GROUPED** = ``2`` + +This is a grouped state machine that can be controlled from a parent state machine. It does not work on standalone. There must be a state machine with :ref:`state_machine_type` of :ref:`STATE_MACHINE_TYPE_ROOT` or :ref:`STATE_MACHINE_TYPE_NESTED` in the parent or ancestor. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + Property Descriptions --------------------- @@ -127,6 +170,42 @@ Property Descriptions If ``true``, allows teleport to the self state with :ref:`AnimationNodeStateMachinePlayback.travel`. When the reset option is enabled in :ref:`AnimationNodeStateMachinePlayback.travel`, the animation is restarted. If ``false``, nothing happens on the teleportation to the self state. +.. rst-class:: classref-item-separator + +---- + +.. _class_AnimationNodeStateMachine_property_reset_ends: + +.. rst-class:: classref-property + +:ref:`bool` **reset_ends** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_reset_ends** **(** :ref:`bool` value **)** +- :ref:`bool` **are_ends_reset** **(** **)** + +If ``true``, treat the cross-fade to the start and end nodes as a blend with the RESET animation. + +In most cases, when additional cross-fades are performed in the parent :ref:`AnimationNode` of the state machine, setting this property to ``false`` and matching the cross-fade time of the parent :ref:`AnimationNode` and the state machine's start node and end node gives good results. + +.. rst-class:: classref-item-separator + +---- + +.. _class_AnimationNodeStateMachine_property_state_machine_type: + +.. rst-class:: classref-property + +:ref:`StateMachineType` **state_machine_type** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_state_machine_type** **(** :ref:`StateMachineType` value **)** +- :ref:`StateMachineType` **get_state_machine_type** **(** **)** + +This property can define the process of transitions for different use cases. See also :ref:`StateMachineType`. + .. rst-class:: classref-section-separator ---- diff --git a/classes/class_animationnodestatemachineplayback.rst b/classes/class_animationnodestatemachineplayback.rst index 7d07a380f83..2f5bc71ad84 100644 --- a/classes/class_animationnodestatemachineplayback.rst +++ b/classes/class_animationnodestatemachineplayback.rst @@ -12,7 +12,7 @@ AnimationNodeStateMachinePlayback **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Playback control for :ref:`AnimationNodeStateMachine`. +Provides playback control for an :ref:`AnimationNodeStateMachine`. .. rst-class:: classref-introduction-group @@ -43,7 +43,7 @@ Allows control of :ref:`AnimationTree` state machines creat Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. rst-class:: classref-reftable-group @@ -65,27 +65,27 @@ Methods .. table:: :widths: auto - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_current_length` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`StringName` | :ref:`get_current_node` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_current_play_position` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`StringName` | :ref:`get_fading_from_node` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`get_travel_path` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_playing` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`next` **(** **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`start` **(** :ref:`StringName` node, :ref:`bool` reset=true **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`stop` **(** **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`travel` **(** :ref:`StringName` to_node, :ref:`bool` reset_on_teleport=true **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_current_length` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`StringName` | :ref:`get_current_node` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_current_play_position` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`StringName` | :ref:`get_fading_from_node` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`StringName[]` | :ref:`get_travel_path` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_playing` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`next` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`start` **(** :ref:`StringName` node, :ref:`bool` reset=true **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`stop` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`travel` **(** :ref:`StringName` to_node, :ref:`bool` reset_on_teleport=true **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -152,7 +152,7 @@ Returns the starting state of currently fading animation. .. rst-class:: classref-method -:ref:`PackedStringArray` **get_travel_path** **(** **)** |const| +:ref:`StringName[]` **get_travel_path** **(** **)** |const| Returns the current travel path as computed internally by the A\* algorithm. diff --git a/classes/class_animationnodestatemachinetransition.rst b/classes/class_animationnodestatemachinetransition.rst index d7fdca2ebf2..59d429e168a 100644 --- a/classes/class_animationnodestatemachinetransition.rst +++ b/classes/class_animationnodestatemachinetransition.rst @@ -12,7 +12,7 @@ AnimationNodeStateMachineTransition **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A resource to connect each node to make a path for :ref:`AnimationNodeStateMachine`. +A transition within an :ref:`AnimationNodeStateMachine` connecting two :ref:`AnimationRootNode`\ s. .. rst-class:: classref-introduction-group @@ -28,7 +28,7 @@ You can set the timing and conditions of the transition in detail. Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. rst-class:: classref-reftable-group diff --git a/classes/class_animationnodesync.rst b/classes/class_animationnodesync.rst index 44eb8feb12b..45f96b81239 100644 --- a/classes/class_animationnodesync.rst +++ b/classes/class_animationnodesync.rst @@ -14,7 +14,21 @@ AnimationNodeSync **Inherited By:** :ref:`AnimationNodeAdd2`, :ref:`AnimationNodeAdd3`, :ref:`AnimationNodeBlend2`, :ref:`AnimationNodeBlend3`, :ref:`AnimationNodeOneShot`, :ref:`AnimationNodeTransition` -The base class for :ref:`AnimationNode` which has more than two input ports and needs to synchronize them. +Base class for :ref:`AnimationNode`\ s with more than two input ports that must be synchronized. + +.. rst-class:: classref-introduction-group + +Description +----------- + +An animation node used to combine, mix, or blend two or more animations together while keeping them synchronized within an :ref:`AnimationTree`. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. rst-class:: classref-reftable-group diff --git a/classes/class_animationnodetimescale.rst b/classes/class_animationnodetimescale.rst index 89fc37aeeb0..6c68ad8129f 100644 --- a/classes/class_animationnodetimescale.rst +++ b/classes/class_animationnodetimescale.rst @@ -12,21 +12,21 @@ AnimationNodeTimeScale **Inherits:** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A time-scaling animation node to be used with :ref:`AnimationTree`. +A time-scaling animation node used in :ref:`AnimationTree`. .. rst-class:: classref-introduction-group Description ----------- -Allows scaling the speed of the animation (or reversing it) in any children nodes. Setting it to 0 will pause the animation. +Allows to scale the speed of the animation (or reverse it) in any children :ref:`AnimationNode`\ s. Setting it to ``0.0`` will pause the animation. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `3D Platformer Demo `__ diff --git a/classes/class_animationnodetimeseek.rst b/classes/class_animationnodetimeseek.rst index 698447494d2..e5b16b3b7a9 100644 --- a/classes/class_animationnodetimeseek.rst +++ b/classes/class_animationnodetimeseek.rst @@ -12,7 +12,7 @@ AnimationNodeTimeSeek **Inherits:** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A time-seeking animation node to be used with :ref:`AnimationTree`. +A time-seeking animation node used in :ref:`AnimationTree`. .. rst-class:: classref-introduction-group @@ -53,7 +53,7 @@ After setting the time and changing the animation playback, the time seek node a Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_animationnodetransition.rst b/classes/class_animationnodetransition.rst index 23f44adcdfd..ba47bd5aed3 100644 --- a/classes/class_animationnodetransition.rst +++ b/classes/class_animationnodetransition.rst @@ -12,7 +12,7 @@ AnimationNodeTransition **Inherits:** :ref:`AnimationNodeSync` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A generic animation transition node for :ref:`AnimationTree`. +A transition within an :ref:`AnimationTree` connecting two :ref:`AnimationNode`\ s. .. rst-class:: classref-introduction-group @@ -63,7 +63,7 @@ After setting the request and changing the animation playback, the transition no Tutorials --------- -- :doc:`AnimationTree <../tutorials/animation/animation_tree>` +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` - `3D Platformer Demo `__ diff --git a/classes/class_animationplayer.rst b/classes/class_animationplayer.rst index 4631df46fef..28c190beec3 100644 --- a/classes/class_animationplayer.rst +++ b/classes/class_animationplayer.rst @@ -12,20 +12,20 @@ AnimationPlayer **Inherits:** :ref:`Node` **<** :ref:`Object` -Player of :ref:`Animation` resources. +A node used for animation playback. .. rst-class:: classref-introduction-group Description ----------- -An animation player is used for general-purpose playback of :ref:`Animation` resources. It contains a dictionary of :ref:`AnimationLibrary` resources and custom blend times between animation transitions. +An animation player is used for general-purpose playback of animations. It contains a dictionary of :ref:`AnimationLibrary` resources and custom blend times between animation transitions. Some methods and properties use a single key to reference an animation directly. These keys are formatted as the key for the library, followed by a forward slash, then the key for the animation within the library, for example ``"movement/run"``. If the library's key is an empty string (known as the default library), the forward slash is omitted, being the same key used by the library. -\ **AnimationPlayer** is more suited than :ref:`Tween` for animations where you know the final values in advance. For example, fading a screen in and out is more easily done with an **AnimationPlayer** node thanks to the animation tools provided by the editor. That particular example can also be implemented with a :ref:`Tween`, but it requires doing everything by code. +\ **AnimationPlayer** is better-suited than :ref:`Tween` for more complex animations, for example ones with non-trivial timings. It can also be used over :ref:`Tween` if the animation track editor is more convenient than doing it in code. -Updating the target properties of animations occurs at process time. +Updating the target properties of animations occurs at the process frame. .. rst-class:: classref-introduction-group @@ -308,7 +308,7 @@ Property Descriptions - void **set_assigned_animation** **(** :ref:`String` value **)** - :ref:`String` **get_assigned_animation** **(** **)** -If playing, the the current animation's key, otherwise, the animation last played. When set, this changes the animation, but will not play it unless already playing. See also :ref:`current_animation`. +If playing, the current animation's key, otherwise, the animation last played. When set, this changes the animation, but will not play it unless already playing. See also :ref:`current_animation`. .. rst-class:: classref-item-separator diff --git a/classes/class_animationrootnode.rst b/classes/class_animationrootnode.rst index a38b11b1951..f20b3753b40 100644 --- a/classes/class_animationrootnode.rst +++ b/classes/class_animationrootnode.rst @@ -14,7 +14,21 @@ AnimationRootNode **Inherited By:** :ref:`AnimationNodeAnimation`, :ref:`AnimationNodeBlendSpace1D`, :ref:`AnimationNodeBlendSpace2D`, :ref:`AnimationNodeBlendTree`, :ref:`AnimationNodeStateMachine` -The :ref:`AnimationNode` which can be set as the root of an :ref:`AnimationTree`. +Base class for :ref:`AnimationNode`\ s that hold one or multiple composite animations. Usually used for :ref:`AnimationTree.tree_root`. + +.. rst-class:: classref-introduction-group + +Description +----------- + +**AnimationRootNode** is a base class for :ref:`AnimationNode`\ s that hold a complete animation. A complete animation refers to the output of an :ref:`AnimationNodeOutput` in an :ref:`AnimationNodeBlendTree` or the output of another **AnimationRootNode**. Used for :ref:`AnimationTree.tree_root` or in other **AnimationRootNode**\ s. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using AnimationTree <../tutorials/animation/animation_tree>` .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_animationtree.rst b/classes/class_animationtree.rst index c819fb86558..edfce45383b 100644 --- a/classes/class_animationtree.rst +++ b/classes/class_animationtree.rst @@ -12,14 +12,14 @@ AnimationTree **Inherits:** :ref:`Node` **<** :ref:`Object` -A node to be used for advanced animation transitions in an :ref:`AnimationPlayer`. +A node used for advanced animation transitions in an :ref:`AnimationPlayer`. .. rst-class:: classref-introduction-group Description ----------- -A node to be used for advanced animation transitions in an :ref:`AnimationPlayer`. +A node used for advanced animation transitions in an :ref:`AnimationPlayer`. \ **Note:** When linked with an :ref:`AnimationPlayer`, several properties and methods of the corresponding :ref:`AnimationPlayer` will not function as expected. Playback and transitions should be handled using only the **AnimationTree** and its constituent :ref:`AnimationNode`\ (s). The :ref:`AnimationPlayer` node should be used solely for adding, deleting, and editing animations. diff --git a/classes/class_area2d.rst b/classes/class_area2d.rst index c5408cd6e13..81fd8f82f58 100644 --- a/classes/class_area2d.rst +++ b/classes/class_area2d.rst @@ -75,7 +75,7 @@ Properties +-------------------------------------------------+---------------------------------------------------------------------------------------+-------------------+ | :ref:`bool` | :ref:`monitoring` | ``true`` | +-------------------------------------------------+---------------------------------------------------------------------------------------+-------------------+ - | :ref:`float` | :ref:`priority` | ``0.0`` | + | :ref:`int` | :ref:`priority` | ``0`` | +-------------------------------------------------+---------------------------------------------------------------------------------------+-------------------+ .. rst-class:: classref-reftable-group @@ -551,14 +551,14 @@ If ``true``, the area detects bodies or areas entering and exiting it. .. rst-class:: classref-property -:ref:`float` **priority** = ``0.0`` +:ref:`int` **priority** = ``0`` .. rst-class:: classref-property-setget -- void **set_priority** **(** :ref:`float` value **)** -- :ref:`float` **get_priority** **(** **)** +- void **set_priority** **(** :ref:`int` value **)** +- :ref:`int` **get_priority** **(** **)** -The area's priority. Higher priority areas are processed first. +The area's priority. Higher priority areas are processed first. The :ref:`World2D`'s physics is always processed last, after all areas. .. rst-class:: classref-section-separator diff --git a/classes/class_area3d.rst b/classes/class_area3d.rst index 346dba0d953..01b702fe1f1 100644 --- a/classes/class_area3d.rst +++ b/classes/class_area3d.rst @@ -73,7 +73,7 @@ Properties +-------------------------------------------------+---------------------------------------------------------------------------------------+-----------------------+ | :ref:`bool` | :ref:`monitoring` | ``true`` | +-------------------------------------------------+---------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`priority` | ``0.0`` | + | :ref:`int` | :ref:`priority` | ``0`` | +-------------------------------------------------+---------------------------------------------------------------------------------------+-----------------------+ | :ref:`float` | :ref:`reverb_bus_amount` | ``0.0`` | +-------------------------------------------------+---------------------------------------------------------------------------------------+-----------------------+ @@ -563,14 +563,14 @@ If ``true``, the area detects bodies or areas entering and exiting it. .. rst-class:: classref-property -:ref:`float` **priority** = ``0.0`` +:ref:`int` **priority** = ``0`` .. rst-class:: classref-property-setget -- void **set_priority** **(** :ref:`float` value **)** -- :ref:`float` **get_priority** **(** **)** +- void **set_priority** **(** :ref:`int` value **)** +- :ref:`int` **get_priority** **(** **)** -The area's priority. Higher priority areas are processed first. +The area's priority. Higher priority areas are processed first. The :ref:`World3D`'s physics is always processed last, after all areas. .. rst-class:: classref-item-separator @@ -689,7 +689,7 @@ The magnitude of area-specific wind force. - void **set_wind_source_path** **(** :ref:`NodePath` value **)** - :ref:`NodePath` **get_wind_source_path** **(** **)** -The :ref:`Node3D` which is used to specify the the direction and origin of an area-specific wind force. The direction is opposite to the z-axis of the :ref:`Node3D`'s local transform, and its origin is the origin of the :ref:`Node3D`'s local transform. +The :ref:`Node3D` which is used to specify the direction and origin of an area-specific wind force. The direction is opposite to the z-axis of the :ref:`Node3D`'s local transform, and its origin is the origin of the :ref:`Node3D`'s local transform. .. rst-class:: classref-section-separator diff --git a/classes/class_array.rst b/classes/class_array.rst index 101ddf12895..0d33e1730c1 100644 --- a/classes/class_array.rst +++ b/classes/class_array.rst @@ -70,8 +70,6 @@ Arrays can be concatenated using the ``+`` operator: \ **Note:** Erasing elements while iterating over arrays is **not** supported and will result in unpredictable behavior. -\ **Note:** When declaring an array with ``const``, the array itself can still be mutated by defining the values at individual indices or pushing/removing elements. Using ``const`` will only prevent assigning the constant with another value after it was initialized. - .. rst-class:: classref-reftable-group Constructors @@ -873,6 +871,18 @@ See also :ref:`filter`, :ref:`reduce`. In this example every array element is checked and the first maximum value is returned: + +:: + + func _ready(): + var arr = [Vector2(0, 1), Vector2(2, 0), Vector2(1, 1), Vector2(1, 0), Vector2(0, 2)] + # In this example we compare the lengths. + print(arr.reduce(func(max, val): return val if is_length_greater(val, max) else max)) + + func is_length_greater(a, b): + return a.length() > b.length() + .. rst-class:: classref-item-separator ---- @@ -885,6 +895,8 @@ Returns the maximum value contained in the array if all elements are of comparab Returns the minimum value contained in the array if all elements are of comparable types. If the elements can't be compared, ``null`` is returned. +See also :ref:`max` for an example of using a custom comparator. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_astargrid2d.rst b/classes/class_astargrid2d.rst index 59ae9183a9b..5315e3c38ba 100644 --- a/classes/class_astargrid2d.rst +++ b/classes/class_astargrid2d.rst @@ -21,7 +21,7 @@ Description Compared to :ref:`AStar2D` you don't need to manually create points or connect them together. It also supports multiple type of heuristics and modes for diagonal movement. This class also provides a jumping mode which is faster to calculate than without it in the :ref:`AStar2D` class. -In contrast to :ref:`AStar2D`, you only need set the :ref:`size` of the grid, optionally set the :ref:`cell_size` and then call the :ref:`update` method: +In contrast to :ref:`AStar2D`, you only need set the :ref:`region` of the grid, optionally set the :ref:`cell_size` and then call the :ref:`update` method: .. tabs:: @@ -29,7 +29,7 @@ In contrast to :ref:`AStar2D`, you only need set the :ref:`size` | :ref:`cell_size` | ``Vector2(1, 1)`` | - +----------------------------------------------------+------------------------------------------------------------------------------------------+--------------------+ - | :ref:`Heuristic` | :ref:`default_compute_heuristic` | ``0`` | - +----------------------------------------------------+------------------------------------------------------------------------------------------+--------------------+ - | :ref:`Heuristic` | :ref:`default_estimate_heuristic` | ``0`` | - +----------------------------------------------------+------------------------------------------------------------------------------------------+--------------------+ - | :ref:`DiagonalMode` | :ref:`diagonal_mode` | ``0`` | - +----------------------------------------------------+------------------------------------------------------------------------------------------+--------------------+ - | :ref:`bool` | :ref:`jumping_enabled` | ``false`` | - +----------------------------------------------------+------------------------------------------------------------------------------------------+--------------------+ - | :ref:`Vector2` | :ref:`offset` | ``Vector2(0, 0)`` | - +----------------------------------------------------+------------------------------------------------------------------------------------------+--------------------+ - | :ref:`Vector2i` | :ref:`size` | ``Vector2i(0, 0)`` | - +----------------------------------------------------+------------------------------------------------------------------------------------------+--------------------+ + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`Vector2` | :ref:`cell_size` | ``Vector2(1, 1)`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`Heuristic` | :ref:`default_compute_heuristic` | ``0`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`Heuristic` | :ref:`default_estimate_heuristic` | ``0`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`DiagonalMode` | :ref:`diagonal_mode` | ``0`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`bool` | :ref:`jumping_enabled` | ``false`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`Vector2` | :ref:`offset` | ``Vector2(0, 0)`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`Rect2i` | :ref:`region` | ``Rect2i(0, 0, 0, 0)`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ + | :ref:`Vector2i` | :ref:`size` | ``Vector2i(0, 0)`` | + +----------------------------------------------------+------------------------------------------------------------------------------------------+------------------------+ .. rst-class:: classref-reftable-group @@ -355,6 +357,23 @@ The offset of the grid which will be applied to calculate the resulting point po ---- +.. _class_AStarGrid2D_property_region: + +.. rst-class:: classref-property + +:ref:`Rect2i` **region** = ``Rect2i(0, 0, 0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_region** **(** :ref:`Rect2i` value **)** +- :ref:`Rect2i` **get_region** **(** **)** + +The region of grid cells available for pathfinding. If changed, :ref:`update` needs to be called before finding the next path. + +.. rst-class:: classref-item-separator + +---- + .. _class_AStarGrid2D_property_size: .. rst-class:: classref-property @@ -368,6 +387,8 @@ The offset of the grid which will be applied to calculate the resulting point po The size of the grid (number of cells of size :ref:`cell_size` on each axis). If changed, :ref:`update` needs to be called before finding the next path. +\ **Note:** This property is deprecated, use :ref:`region` instead. + .. rst-class:: classref-section-separator ---- @@ -411,7 +432,7 @@ Note that this function is hidden in the default ``AStarGrid2D`` class. void **clear** **(** **)** -Clears the grid and sets the :ref:`size` to :ref:`Vector2i.ZERO`. +Clears the grid and sets the :ref:`region` to ``Rect2i(0, 0, 0, 0)``. .. rst-class:: classref-item-separator @@ -549,7 +570,9 @@ Sets the ``weight_scale`` for the point with the given ``id``. The ``weight_scal void **update** **(** **)** -Updates the internal state of the grid according to the parameters to prepare it to search the path. Needs to be called if parameters like :ref:`size`, :ref:`cell_size` or :ref:`offset` are changed. :ref:`is_dirty` will return ``true`` if this is the case and this needs to be called. +Updates the internal state of the grid according to the parameters to prepare it to search the path. Needs to be called if parameters like :ref:`region`, :ref:`cell_size` or :ref:`offset` are changed. :ref:`is_dirty` will return ``true`` if this is the case and this needs to be called. + +\ **Note:** All point data (solidity and weight scale) will be cleared. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_audiostreamgenerator.rst b/classes/class_audiostreamgenerator.rst index cfd9a9949f4..67e243f0632 100644 --- a/classes/class_audiostreamgenerator.rst +++ b/classes/class_audiostreamgenerator.rst @@ -12,14 +12,38 @@ AudioStreamGenerator **Inherits:** :ref:`AudioStream` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Audio stream that generates sounds procedurally. +An audio stream with utilities for procedural sound generation. .. rst-class:: classref-introduction-group Description ----------- -This audio stream does not play back sounds, but expects a script to generate audio data for it instead. See also :ref:`AudioStreamGeneratorPlayback`. +**AudioStreamGenerator** is a type of audio stream that does not play back sounds on its own; instead, it expects a script to generate audio data for it. See also :ref:`AudioStreamGeneratorPlayback`. + +Here's a sample on how to use it to generate a sine wave: + +:: + + var playback # Will hold the AudioStreamGeneratorPlayback. + @onready var sample_hz = $AudioStreamPlayer.stream.mix_rate + var pulse_hz = 440.0 # The frequency of the sound wave. + + func _ready(): + $AudioStreamPlayer.play() + playback = $AudioStreamPlayer.get_stream_playback() + fill_buffer() + + func fill_buffer(): + var phase = 0.0 + var increment = pulse_hz / sample_hz + var frames_available = playback.get_frames_available() + + for i in range(frames_available): + playback.push_frame(Vector2.ONE * sin(phase * TAU)) + phase = fmod(phase + increment, 1.0) + +In the example above, the "AudioStreamPlayer" node must use an **AudioStreamGenerator** as its stream. The ``fill_buffer`` function provides audio data for approximating a sine wave. See also :ref:`AudioEffectSpectrumAnalyzer` for performing real-time audio spectrum analysis. @@ -32,8 +56,6 @@ Tutorials - `Audio Generator Demo `__ -- `Godot 3.2 will get new audio features `__ - .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_basebutton.rst b/classes/class_basebutton.rst index d08c024d86d..f88a660008a 100644 --- a/classes/class_basebutton.rst +++ b/classes/class_basebutton.rst @@ -250,6 +250,8 @@ Determines when the button is considered clicked, one of the :ref:`ActionMode` associated with the button. Not to be confused with node groups. +\ **Note:** The button will be configured as a radio button if a :ref:`ButtonGroup` is assigned to it. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_basematerial3d.rst b/classes/class_basematerial3d.rst index 70f632b993c..e9223fd77ac 100644 --- a/classes/class_basematerial3d.rst +++ b/classes/class_basematerial3d.rst @@ -2945,7 +2945,7 @@ The method for rendering the specular blob. See :ref:`SpecularMode` feature, :ref:`bool` enable **)** - :ref:`bool` **get_feature** **(** :ref:`Feature` feature **)** |const| -If ``true``, subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges. +If ``true``, subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges. Subsurface scattering quality is controlled by :ref:`ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_quality`. .. rst-class:: classref-item-separator @@ -2979,7 +2979,7 @@ If ``true``, subsurface scattering will use a special mode optimized for the col - void **set_subsurface_scattering_strength** **(** :ref:`float` value **)** - :ref:`float` **get_subsurface_scattering_strength** **(** **)** -The strength of the subsurface scattering effect. +The strength of the subsurface scattering effect. The depth of the effect is also controlled by :ref:`ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_scale`, which is set globally. .. rst-class:: classref-item-separator @@ -3134,7 +3134,7 @@ Repeat flags for the texture. See :ref:`TextureFilter` value **)** - :ref:`Transparency` **get_transparency** **(** **)** -If ``true``, transparency is enabled on the body. Some transparency modes will disable shadow casting. Any transparency mode other than Disabled has a greater performance impact compared to opaque rendering. See also :ref:`blend_mode`. +The material's transparency mode. Some transparency modes will disable shadow casting. Any transparency mode other than :ref:`TRANSPARENCY_DISABLED` has a greater performance impact compared to opaque rendering. See also :ref:`blend_mode`. .. rst-class:: classref-item-separator diff --git a/classes/class_bone2d.rst b/classes/class_bone2d.rst index 280e73f0221..9c37474a255 100644 --- a/classes/class_bone2d.rst +++ b/classes/class_bone2d.rst @@ -12,16 +12,16 @@ Bone2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Joint used with :ref:`Skeleton2D` to control and animate other nodes. +A joint used with :ref:`Skeleton2D` to control and animate other nodes. .. rst-class:: classref-introduction-group Description ----------- -Use a hierarchy of ``Bone2D`` bound to a :ref:`Skeleton2D` to control, and animate other :ref:`Node2D` nodes. +A hierarchy of **Bone2D**\ s can be bound to a :ref:`Skeleton2D` to control and animate other :ref:`Node2D` nodes. -You can use ``Bone2D`` and ``Skeleton2D`` nodes to animate 2D meshes created with the Polygon 2D UV editor. +You can use **Bone2D** and :ref:`Skeleton2D` nodes to animate 2D meshes created with the :ref:`Polygon2D` UV editor. Each bone has a :ref:`rest` transform that you can reset to with :ref:`apply_rest`. These rest poses are relative to the bone's parent. @@ -116,7 +116,7 @@ Stores the node's current transforms in :ref:`rest`. :ref:`bool` **get_autocalculate_length_and_angle** **(** **)** |const| -Returns whether this ``Bone2D`` node is going to autocalculate its length and bone angle using its first ``Bone2D`` child node, if one exists. If there are no ``Bone2D`` children, then it cannot autocalculate these values and will print a warning. +Returns whether this **Bone2D** is going to autocalculate its length and bone angle using its first **Bone2D** child node, if one exists. If there are no **Bone2D** children, then it cannot autocalculate these values and will print a warning. .. rst-class:: classref-item-separator @@ -128,9 +128,9 @@ Returns whether this ``Bone2D`` node is going to autocalculate its length and bo :ref:`float` **get_bone_angle** **(** **)** |const| -Returns the angle of the bone in the ``Bone2D`` node. +Returns the angle of the bone in the **Bone2D**. -\ **Note:** This is different from the ``Bone2D``'s rotation. The bone angle is the rotation of the bone shown by the ``Bone2D`` gizmo, and because ``Bone2D`` bones are based on positions, this can vary from the actual rotation of the ``Bone2D`` node. +\ **Note:** This is different from the **Bone2D**'s rotation. The bone's angle is the rotation of the bone shown by the gizmo, which is unaffected by the **Bone2D**'s :ref:`Node2D.transform`. .. rst-class:: classref-item-separator @@ -154,7 +154,7 @@ Returns the node's index as part of the entire skeleton. See :ref:`Skeleton2D` **get_length** **(** **)** |const| -Returns the length of the bone in the ``Bone2D`` node. +Returns the length of the bone in the **Bone2D** node. .. rst-class:: classref-item-separator @@ -178,7 +178,7 @@ Returns the node's :ref:`rest` ``Transform2D`` if it void **set_autocalculate_length_and_angle** **(** :ref:`bool` auto_calculate **)** -When set to ``true``, the ``Bone2D`` node will attempt to automatically calculate the bone angle and length using the first child ``Bone2D`` node, if one exists. If none exist, the ``Bone2D`` cannot automatically calculate these values and will print a warning. +When set to ``true``, the **Bone2D** node will attempt to automatically calculate the bone angle and length using the first child **Bone2D** node, if one exists. If none exist, the **Bone2D** cannot automatically calculate these values and will print a warning. .. rst-class:: classref-item-separator @@ -190,9 +190,9 @@ When set to ``true``, the ``Bone2D`` node will attempt to automatically calculat void **set_bone_angle** **(** :ref:`float` angle **)** -Sets the bone angle for the ``Bone2D`` node. This is typically set to the rotation from the ``Bone2D`` node to a child ``Bone2D`` node. +Sets the bone angle for the **Bone2D**. This is typically set to the rotation from the **Bone2D** to a child **Bone2D** node. -\ **Note:** This is different from the ``Bone2D``'s rotation. The bone angle is the rotation of the bone shown by the ``Bone2D`` gizmo, and because ``Bone2D`` bones are based on positions, this can vary from the actual rotation of the ``Bone2D`` node. +\ **Note:** **Note:** This is different from the **Bone2D**'s rotation. The bone's angle is the rotation of the bone shown by the gizmo, which is unaffected by the **Bone2D**'s :ref:`Node2D.transform`. .. rst-class:: classref-item-separator @@ -204,7 +204,7 @@ Sets the bone angle for the ``Bone2D`` node. This is typically set to the rotati void **set_length** **(** :ref:`float` length **)** -Sets the length of the bone in the ``Bone2D`` node. +Sets the length of the bone in the **Bone2D**. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_boneattachment3d.rst b/classes/class_boneattachment3d.rst index 0f14acef8f8..c237e1057c9 100644 --- a/classes/class_boneattachment3d.rst +++ b/classes/class_boneattachment3d.rst @@ -12,16 +12,14 @@ BoneAttachment3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -A node that will attach to a bone. +А node that dynamically copies or overrides the 3D transform of a bone in its parent :ref:`Skeleton3D`. .. rst-class:: classref-introduction-group Description ----------- -This node will allow you to select a bone for this node to attach to. The BoneAttachment3D node can copy the transform of the select bone, or can override the transform of the selected bone. - -The BoneAttachment3D node must either be a child of a :ref:`Skeleton3D` node or be given an external :ref:`Skeleton3D` to use in order to function properly. +This node selects a bone in a :ref:`Skeleton3D` and attaches to it. This means that the **BoneAttachment3D** node will either dynamically copy or override the 3D transform of the selected bone. .. rst-class:: classref-reftable-group diff --git a/classes/class_bonemap.rst b/classes/class_bonemap.rst index f5d6fa20ad4..6f8902f7523 100644 --- a/classes/class_bonemap.rst +++ b/classes/class_bonemap.rst @@ -12,14 +12,14 @@ BoneMap **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Bone map for retargeting. +Describes a mapping of bone names for retargeting :ref:`Skeleton3D` into common names defined by a :ref:`SkeletonProfile`. .. rst-class:: classref-introduction-group Description ----------- -This class contains a hashmap that uses a list of bone names in :ref:`SkeletonProfile` as key names. +This class contains a dictionary that uses a list of bone names in :ref:`SkeletonProfile` as key names. By assigning the actual :ref:`Skeleton3D` bone name as the key value, it maps the :ref:`Skeleton3D` to the :ref:`SkeletonProfile`. diff --git a/classes/class_button.rst b/classes/class_button.rst index 85f3a0b85fe..eab1f85fbfc 100644 --- a/classes/class_button.rst +++ b/classes/class_button.rst @@ -79,27 +79,29 @@ Properties .. table:: :widths: auto - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`HorizontalAlignment` | :ref:`alignment` | ``1`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`bool` | :ref:`clip_text` | ``false`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`bool` | :ref:`expand_icon` | ``false`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`bool` | :ref:`flat` | ``false`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`Texture2D` | :ref:`icon` | | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`HorizontalAlignment` | :ref:`icon_alignment` | ``0`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`String` | :ref:`language` | ``""`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`String` | :ref:`text` | ``""`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`TextDirection` | :ref:`text_direction` | ``0`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ - | :ref:`OverrunBehavior` | :ref:`text_overrun_behavior` | ``0`` | - +-------------------------------------------------------------------+---------------------------------------------------------------------------+-----------+ + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`HorizontalAlignment` | :ref:`alignment` | ``1`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`clip_text` | ``false`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`expand_icon` | ``false`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`flat` | ``false`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`Texture2D` | :ref:`icon` | | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`HorizontalAlignment` | :ref:`icon_alignment` | ``0`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`String` | :ref:`language` | ``""`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`String` | :ref:`text` | ``""`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`TextDirection` | :ref:`text_direction` | ``0`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`OverrunBehavior` | :ref:`text_overrun_behavior` | ``0`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ + | :ref:`VerticalAlignment` | :ref:`vertical_icon_alignment` | ``1`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------+-----------+ .. rst-class:: classref-reftable-group @@ -138,6 +140,8 @@ Theme Properties +---------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`int` | :ref:`h_separation` | ``2`` | +---------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ + | :ref:`int` | :ref:`icon_max_width` | ``0`` | + +---------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`int` | :ref:`outline_size` | ``0`` | +---------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Font` | :ref:`font` | | @@ -209,7 +213,7 @@ When this property is enabled, text that is too large to fit the button is clipp - void **set_expand_icon** **(** :ref:`bool` value **)** - :ref:`bool` **is_expand_icon** **(** **)** -When enabled, the button's icon will expand/shrink to fit the button's size while keeping its aspect. +When enabled, the button's icon will expand/shrink to fit the button's size while keeping its aspect. See also :ref:`icon_max_width`. .. rst-class:: classref-item-separator @@ -262,7 +266,7 @@ To edit margin and spacing of the icon, use :ref:`h_separation` value **)** - :ref:`HorizontalAlignment` **get_icon_alignment** **(** **)** -Specifies if the icon should be aligned to the left, right, or center of a button. Uses the same :ref:`HorizontalAlignment` constants as the text alignment. If centered, text will draw on top of the icon. +Specifies if the icon should be aligned horizontally to the left, right, or center of a button. Uses the same :ref:`HorizontalAlignment` constants as the text alignment. If centered horizontally and vertically, text will draw on top of the icon. .. rst-class:: classref-item-separator @@ -332,6 +336,23 @@ Base text writing direction. Sets the clipping behavior when the text exceeds the node's bounding rectangle. See :ref:`OverrunBehavior` for a description of all modes. +.. rst-class:: classref-item-separator + +---- + +.. _class_Button_property_vertical_icon_alignment: + +.. rst-class:: classref-property + +:ref:`VerticalAlignment` **vertical_icon_alignment** = ``1`` + +.. rst-class:: classref-property-setget + +- void **set_vertical_icon_alignment** **(** :ref:`VerticalAlignment` value **)** +- :ref:`VerticalAlignment` **get_vertical_icon_alignment** **(** **)** + +Specifies if the icon should be aligned vertically to the top, bottom, or center of a button. Uses the same :ref:`VerticalAlignment` constants as the text alignment. If centered horizontally and vertically, text will draw on top of the icon. + .. rst-class:: classref-section-separator ---- @@ -509,6 +530,18 @@ The horizontal space between **Button**'s icon and text. Negative values will be ---- +.. _class_Button_theme_constant_icon_max_width: + +.. rst-class:: classref-themeproperty + +:ref:`int` **icon_max_width** = ``0`` + +The maximum allowed width of the **Button**'s icon. This limit is applied on top of the default size of the icon, or its expanded size if :ref:`expand_icon` is ``true``. The height is adjusted according to the icon's ratio. + +.. rst-class:: classref-item-separator + +---- + .. _class_Button_theme_constant_outline_size: .. rst-class:: classref-themeproperty diff --git a/classes/class_buttongroup.rst b/classes/class_buttongroup.rst index b0f2a550171..ca28dce45d1 100644 --- a/classes/class_buttongroup.rst +++ b/classes/class_buttongroup.rst @@ -19,7 +19,7 @@ Group of Buttons. Description ----------- -Group of :ref:`BaseButton`. The members of this group are treated like radio buttons in the sense that only one button can be pressed at the same time. +Group of :ref:`BaseButton`. The members of this group are treated like radio buttons in the sense that only one button can be pressed at the same time. Some types of buttons (such as :ref:`CheckBox`) may have a special appearance for this state. Every member of the ButtonGroup should have :ref:`BaseButton.toggle_mode` set to ``true``. @@ -31,9 +31,11 @@ Properties .. table:: :widths: auto - +-------------------------+-------------------------+---------------------------------------------------------------------------------------+ - | :ref:`bool` | resource_local_to_scene | ``true`` (overrides :ref:`Resource`) | - +-------------------------+-------------------------+---------------------------------------------------------------------------------------+ + +-------------------------+----------------------------------------------------------------+---------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`allow_unpress` | ``false`` | + +-------------------------+----------------------------------------------------------------+---------------------------------------------------------------------------------------+ + | :ref:`bool` | resource_local_to_scene | ``true`` (overrides :ref:`Resource`) | + +-------------------------+----------------------------------------------------------------+---------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -72,6 +74,28 @@ Emitted when one of the buttons of the group is pressed. .. rst-class:: classref-descriptions-group +Property Descriptions +--------------------- + +.. _class_ButtonGroup_property_allow_unpress: + +.. rst-class:: classref-property + +:ref:`bool` **allow_unpress** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_allow_unpress** **(** :ref:`bool` value **)** +- :ref:`bool` **is_allow_unpress** **(** **)** + +If ``true``, it is possible to unpress all buttons in this **ButtonGroup**. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + Method Descriptions ------------------- diff --git a/classes/class_callable.rst b/classes/class_callable.rst index 3465cdce834..90a9ace5560 100644 --- a/classes/class_callable.rst +++ b/classes/class_callable.rst @@ -196,7 +196,9 @@ Method Descriptions :ref:`Callable` **bind** **(** ... **)** |vararg| |const| -Returns a copy of this **Callable** with one or more arguments bound. When called, the bound arguments are passed *after* the arguments supplied by :ref:`call`. +Returns a copy of this **Callable** with one or more arguments bound. When called, the bound arguments are passed *after* the arguments supplied by :ref:`call`. See also :ref:`unbind`. + +\ **Note:** When this method is chained with other similar methods, the order in which the argument list is modified is read from right to left. .. rst-class:: classref-item-separator @@ -208,7 +210,9 @@ Returns a copy of this **Callable** with one or more arguments bound. When calle :ref:`Callable` **bindv** **(** :ref:`Array` arguments **)** -Returns a copy of this **Callable** with one or more arguments bound, reading them from an array. When called, the bound arguments are passed *after* the arguments supplied by :ref:`call`. +Returns a copy of this **Callable** with one or more arguments bound, reading them from an array. When called, the bound arguments are passed *after* the arguments supplied by :ref:`call`. See also :ref:`unbind`. + +\ **Note:** When this method is chained with other similar methods, the order in which the argument list is modified is read from right to left. .. rst-class:: classref-item-separator @@ -407,7 +411,15 @@ Perform an RPC (Remote Procedure Call) on a specific peer ID (see multiplayer do :ref:`Callable` **unbind** **(** :ref:`int` argcount **)** |const| -Returns a copy of this **Callable** with the arguments unbound, as defined by ``argcount``. Calling the returned **Callable** will call the method without the extra arguments that are supplied in the **Callable** on which you are calling this method. +Returns a copy of this **Callable** with a number of arguments unbound. In other words, when the new callable is called the last few arguments supplied by the user are ignored, according to ``argcount``. The remaining arguments are passed to the callable. This allows to use the original callable in a context that attempts to pass more arguments than this callable can handle, e.g. a signal with a fixed number of arguments. See also :ref:`bind`. + +\ **Note:** When this method is chained with other similar methods, the order in which the argument list is modified is read from right to left. + +:: + + func _ready(): + foo.unbind(1).call(1, 2) # Calls foo(1). + foo.bind(3, 4).unbind(1).call(1, 2) # Calls foo(1, 3, 4), note that it does not change the arguments from bind. .. rst-class:: classref-section-separator diff --git a/classes/class_canvasitem.rst b/classes/class_canvasitem.rst index 1b1e75c68d0..48e37ee3336 100644 --- a/classes/class_canvasitem.rst +++ b/classes/class_canvasitem.rst @@ -495,6 +495,14 @@ The **CanvasItem** has entered the canvas. The **CanvasItem** has exited the canvas. +.. _class_CanvasItem_constant_NOTIFICATION_WORLD_2D_CHANGED: + +.. rst-class:: classref-constant + +**NOTIFICATION_WORLD_2D_CHANGED** = ``36`` + +The **CanvasItem**'s active :ref:`World2D` changed. + .. rst-class:: classref-section-separator ---- @@ -549,7 +557,7 @@ The rendering layers in which this **CanvasItem** responds to :ref:`Light2D` value **)** - :ref:`Material` **get_material** **(** **)** -The material applied to textures on this **CanvasItem**. +The material applied to this **CanvasItem**. .. rst-class:: classref-item-separator @@ -566,7 +574,7 @@ The material applied to textures on this **CanvasItem**. - void **set_modulate** **(** :ref:`Color` value **)** - :ref:`Color` **get_modulate** **(** **)** -The color applied to textures on this **CanvasItem**. +The color applied to this **CanvasItem**. This property does affect child **CanvasItem**\ s, unlike :ref:`self_modulate` which only affects the node itself. .. rst-class:: classref-item-separator @@ -583,7 +591,9 @@ The color applied to textures on this **CanvasItem**. - void **set_self_modulate** **(** :ref:`Color` value **)** - :ref:`Color` **get_self_modulate** **(** **)** -The color applied to textures on this **CanvasItem**. This is not inherited by children **CanvasItem**\ s. +The color applied to this **CanvasItem**. This property does **not** affect child **CanvasItem**\ s, unlike :ref:`modulate` which affects both the node itself and its children. + +\ **Note:** Internal children (e.g. sliders in :ref:`ColorPicker` or tab bar in :ref:`TabContainer`) are also not affected by this property (see ``include_internal`` parameter of :ref:`Node.get_child` and other similar methods). .. rst-class:: classref-item-separator @@ -702,7 +712,7 @@ The rendering layer in which this **CanvasItem** is rendered by :ref:`Viewport` value **)** - :ref:`bool` **is_visible** **(** **)** -If ``true``, this **CanvasItem** is drawn. The node is only visible if all of its antecedents are visible as well (in other words, :ref:`is_visible_in_tree` must return ``true``). +If ``true``, this **CanvasItem** is drawn. The node is only visible if all of its ancestors are visible as well (in other words, :ref:`is_visible_in_tree` must return ``true``). \ **Note:** For controls that inherit :ref:`Popup`, the correct way to make them visible is to call one of the multiple ``popup*()`` functions instead. @@ -1019,7 +1029,7 @@ Draws a :ref:`MultiMesh` in 2D with the provided texture. See : void **draw_polygon** **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`Texture2D` texture=null **)** -Draws a solid polygon of any number of points, convex or concave. Unlike :ref:`draw_colored_polygon`, each point's color can be changed individually. See also :ref:`draw_polyline` and :ref:`draw_polyline_colors`. +Draws a solid polygon of any number of points, convex or concave. Unlike :ref:`draw_colored_polygon`, each point's color can be changed individually. See also :ref:`draw_polyline` and :ref:`draw_polyline_colors`. If you need more flexibility (such as being able to use bones), use :ref:`RenderingServer.canvas_item_add_triangle_array` instead. .. rst-class:: classref-item-separator @@ -1071,7 +1081,7 @@ Draws a custom primitive. 1 point for a point, 2 points for a line, 3 points for void **draw_rect** **(** :ref:`Rect2` rect, :ref:`Color` color, :ref:`bool` filled=true, :ref:`float` width=-1.0 **)** -Draws a rectangle. If ``filled`` is ``true``, the rectangle will be filled with the ``color`` specified. If ``filled`` is ``false``, the rectangle will be drawn as a stroke with the ``color`` and ``width`` specified. +Draws a rectangle. If ``filled`` is ``true``, the rectangle will be filled with the ``color`` specified. If ``filled`` is ``false``, the rectangle will be drawn as a stroke with the ``color`` and ``width`` specified. See also :ref:`draw_texture_rect`. If ``width`` is negative, then two-point primitives will be drawn instead of a four-point ones. This means that when the CanvasItem is scaled, the lines will remain thin. If this behavior is not desired, then pass a positive ``width`` like ``1.0``. @@ -1190,7 +1200,7 @@ Draws a texture at a given position. void **draw_texture_rect** **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`bool` tile, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false **)** -Draws a textured rectangle at a given position, optionally modulated by a color. If ``transpose`` is ``true``, the texture will have its X and Y coordinates swapped. +Draws a textured rectangle at a given position, optionally modulated by a color. If ``transpose`` is ``true``, the texture will have its X and Y coordinates swapped. See also :ref:`draw_rect` and :ref:`draw_texture_rect_region`. .. rst-class:: classref-item-separator @@ -1202,7 +1212,7 @@ Draws a textured rectangle at a given position, optionally modulated by a color. void **draw_texture_rect_region** **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false, :ref:`bool` clip_uv=true **)** -Draws a textured rectangle region at a given position, optionally modulated by a color. If ``transpose`` is ``true``, the texture will have its X and Y coordinates swapped. +Draws a textured rectangle from a texture's region (specified by ``src_rect``) at a given position, optionally modulated by a color. If ``transpose`` is ``true``, the texture will have its X and Y coordinates swapped. See also :ref:`draw_texture_rect`. .. rst-class:: classref-item-separator @@ -1264,6 +1274,8 @@ Returns the transform from the coordinate system of the canvas, this item is in, Returns the mouse's position in the :ref:`CanvasLayer` that this **CanvasItem** is in using the coordinate system of the :ref:`CanvasLayer`. +\ **Note:** For screen-space coordinates (e.g. when using a non-embedded :ref:`Popup`), you can use :ref:`DisplayServer.mouse_get_position`. + .. rst-class:: classref-item-separator ---- @@ -1420,7 +1432,7 @@ Returns ``true`` if global transform notifications are communicated to children. :ref:`bool` **is_visible_in_tree** **(** **)** |const| -Returns ``true`` if the node is present in the :ref:`SceneTree`, its :ref:`visible` property is ``true`` and all its antecedents are also visible. If any antecedent is hidden, this node will not be visible in the scene tree, and is consequently not drawn (see :ref:`_draw`). +Returns ``true`` if the node is present in the :ref:`SceneTree`, its :ref:`visible` property is ``true`` and all its ancestors are also visible. If any ancestor is hidden, this node will not be visible in the scene tree, and is consequently not drawn (see :ref:`_draw`). .. rst-class:: classref-item-separator diff --git a/classes/class_characterbody2d.rst b/classes/class_characterbody2d.rst index 95552413f60..69cfba3a510 100644 --- a/classes/class_characterbody2d.rst +++ b/classes/class_characterbody2d.rst @@ -86,6 +86,8 @@ Methods .. table:: :widths: auto + +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`apply_floor_snap` **(** **)** | +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_floor_angle` **(** :ref:`Vector2` up_direction=Vector2(0, -1) **)** |const| | +---------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -262,7 +264,7 @@ Maximum angle (in radians) where a slope is still considered a floor (or a ceili Sets a snapping distance. When set to a value different from ``0.0``, the body is kept attached to slopes when calling :ref:`move_and_slide`. The snapping vector is determined by the given distance along the opposite direction of the :ref:`up_direction`. -As long as the snapping vector is in contact with the ground and the body moves against :ref:`up_direction`, the body will remain attached to the surface. Snapping is not applied if the body moves along :ref:`up_direction`, so it will be able to detach from the ground when jumping. +As long as the snapping vector is in contact with the ground and the body moves against :ref:`up_direction`, the body will remain attached to the surface. Snapping is not applied if the body moves along :ref:`up_direction`, meaning it contains vertical rising velocity, so it will be able to detach from the ground when jumping or when the body is pushed up by something. If you want to apply a snap without taking into account the velocity, use :ref:`apply_floor_snap`. .. rst-class:: classref-item-separator @@ -468,6 +470,18 @@ Minimum angle (in radians) where the body is allowed to slide when it encounters Method Descriptions ------------------- +.. _class_CharacterBody2D_method_apply_floor_snap: + +.. rst-class:: classref-method + +void **apply_floor_snap** **(** **)** + +Allows to manually apply a snap to the floor regardless of the body's velocity. This function does nothing when :ref:`is_on_floor` returns ``true``. + +.. rst-class:: classref-item-separator + +---- + .. _class_CharacterBody2D_method_get_floor_angle: .. rst-class:: classref-method @@ -568,8 +582,8 @@ Returns a :ref:`KinematicCollision2D`, which contain .. code-tab:: gdscript for i in get_slide_collision_count(): - var collision = get_slide_collision(i) - print("Collided with: ", collision.collider.name) + var collision = get_slide_collision(i) + print("Collided with: ", collision.get_collider().name) .. code-tab:: csharp diff --git a/classes/class_characterbody3d.rst b/classes/class_characterbody3d.rst index 3407fa3d76a..d1104863695 100644 --- a/classes/class_characterbody3d.rst +++ b/classes/class_characterbody3d.rst @@ -90,6 +90,8 @@ Methods .. table:: :widths: auto + +---------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`apply_floor_snap` **(** **)** | +---------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_floor_angle` **(** :ref:`Vector3` up_direction=Vector3(0, 1, 0) **)** |const| | +---------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -268,7 +270,7 @@ Maximum angle (in radians) where a slope is still considered a floor (or a ceili Sets a snapping distance. When set to a value different from ``0.0``, the body is kept attached to slopes when calling :ref:`move_and_slide`. The snapping vector is determined by the given distance along the opposite direction of the :ref:`up_direction`. -As long as the snapping vector is in contact with the ground and the body moves against :ref:`up_direction`, the body will remain attached to the surface. Snapping is not applied if the body moves along :ref:`up_direction`, so it will be able to detach from the ground when jumping. +As long as the snapping vector is in contact with the ground and the body moves against :ref:`up_direction`, the body will remain attached to the surface. Snapping is not applied if the body moves along :ref:`up_direction`, meaning it contains vertical rising velocity, so it will be able to detach from the ground when jumping or when the body is pushed up by something. If you want to apply a snap without taking into account the velocity, use :ref:`apply_floor_snap`. .. rst-class:: classref-item-separator @@ -474,6 +476,18 @@ Minimum angle (in radians) where the body is allowed to slide when it encounters Method Descriptions ------------------- +.. _class_CharacterBody3D_method_apply_floor_snap: + +.. rst-class:: classref-method + +void **apply_floor_snap** **(** **)** + +Allows to manually apply a snap to the floor regardless of the body's velocity. This function does nothing when :ref:`is_on_floor` returns ``true``. + +.. rst-class:: classref-item-separator + +---- + .. _class_CharacterBody3D_method_get_floor_angle: .. rst-class:: classref-method diff --git a/classes/class_checkbox.rst b/classes/class_checkbox.rst index 684800b32bc..f37d92cdd39 100644 --- a/classes/class_checkbox.rst +++ b/classes/class_checkbox.rst @@ -23,6 +23,8 @@ A checkbox allows the user to make a binary choice (choosing only one of two pos See also :ref:`BaseButton` which contains common properties and methods associated with this node. +\ **Note:** CheckBox changes its appearance when it's configured as a radio button. See various ``radio_*`` theme properties. To configure CheckBox to act as a radio button, use :ref:`BaseButton.button_group` and :ref:`ButtonGroup`. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_codeedit.rst b/classes/class_codeedit.rst index a17c80cfaa3..2fefce2f522 100644 --- a/classes/class_codeedit.rst +++ b/classes/class_codeedit.rst @@ -116,6 +116,8 @@ Methods +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`confirm_code_completion` **(** :ref:`bool` replace=false **)** | +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`convert_indent` **(** :ref:`int` from_line=-1, :ref:`int` to_line=-1 **)** | + +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`do_indent` **(** **)** | +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`fold_all_lines` **(** **)** | @@ -417,7 +419,7 @@ Marks the option as a member. :ref:`CodeCompletionKind` **KIND_ENUM** = ``5`` -Marks the option as a enum entry. +Marks the option as an enum entry. .. _class_CodeEdit_constant_KIND_CONSTANT: @@ -999,6 +1001,20 @@ Inserts the selected entry into the text. If ``replace`` is true, any existing t ---- +.. _class_CodeEdit_method_convert_indent: + +.. rst-class:: classref-method + +void **convert_indent** **(** :ref:`int` from_line=-1, :ref:`int` to_line=-1 **)** + +Converts the indents of lines between ``from_line`` and ``to_line`` to tabs or spaces as set by :ref:`indent_use_spaces`. + +Values of ``-1`` convert the entire text. + +.. rst-class:: classref-item-separator + +---- + .. _class_CodeEdit_method_do_indent: .. rst-class:: classref-method diff --git a/classes/class_collisionpolygon2d.rst b/classes/class_collisionpolygon2d.rst index 7372223461c..f066c8cf48a 100644 --- a/classes/class_collisionpolygon2d.rst +++ b/classes/class_collisionpolygon2d.rst @@ -12,14 +12,16 @@ CollisionPolygon2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Defines a 2D collision polygon. +Node that represents a 2D collision polygon. .. rst-class:: classref-introduction-group Description ----------- -Provides a concave or convex 2D collision polygon to a :ref:`CollisionObject2D` parent. Polygons can be drawn in the editor or specified by a list of vertices. See also :ref:`ConvexPolygonShape2D`. +Provides a 2D collision polygon to a :ref:`CollisionObject2D` parent. Polygons can be drawn in the editor or specified by a list of vertices. + +Depending on the build mode, this node effectively provides several convex shapes (by convex decomposition of the polygon) or a single concave shape made of the polygon's segments. In the editor, a **CollisionPolygon2D** can be generated from a :ref:`Sprite2D`'s outline by selecting a :ref:`Sprite2D` node, going to the **Sprite2D** menu at the top of the 2D editor viewport then choosing **Create CollisionPolygon2D Sibling**. @@ -64,7 +66,7 @@ enum **BuildMode**: :ref:`BuildMode` **BUILD_SOLIDS** = ``0`` -Collisions will include the polygon and its contained area. +Collisions will include the polygon and its contained area. In this mode the node has the same effect as several :ref:`ConvexPolygonShape2D` nodes, one for each convex shape in the convex decomposition of the polygon (but without the overhead of multiple nodes). .. _class_CollisionPolygon2D_constant_BUILD_SEGMENTS: @@ -72,7 +74,7 @@ Collisions will include the polygon and its contained area. :ref:`BuildMode` **BUILD_SEGMENTS** = ``1`` -Collisions will only include the polygon edges. +Collisions will only include the polygon edges. In this mode the node has the same effect as a single :ref:`ConcavePolygonShape2D` made of segments, with the restriction that each segment (after the first one) starts where the previous one ends, and the last one ends where the first one starts (forming a closed but hollow polygon). .. rst-class:: classref-section-separator @@ -164,7 +166,9 @@ The margin used for one-way collision (in pixels). Higher values will make the s - void **set_polygon** **(** :ref:`PackedVector2Array` value **)** - :ref:`PackedVector2Array` **get_polygon** **(** **)** -The polygon's list of vertices. The final point will be connected to the first. The returned value is a clone of the :ref:`PackedVector2Array`, not a reference. +The polygon's list of vertices. Each point will be connected to the next, and the final point will be connected to the first. + +\ **Warning:** The returned value is a clone of the :ref:`PackedVector2Array`, not a reference. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_collisionpolygon3d.rst b/classes/class_collisionpolygon3d.rst index 80afbc92c5d..e811559a9c0 100644 --- a/classes/class_collisionpolygon3d.rst +++ b/classes/class_collisionpolygon3d.rst @@ -12,16 +12,16 @@ CollisionPolygon3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Editor-only node for defining a collision polygon in 3D space. +Node that represents a 3D collision polygon, given by the thickening of a 2D polygon in the local XY plane along the local Z axis. .. rst-class:: classref-introduction-group Description ----------- -Allows editing a concave or convex collision polygon's vertices on a selected plane. Can also set a depth perpendicular to that plane. This class is only available in the editor. It will not appear in the scene tree at run-time. Creates several :ref:`ConvexPolygonShape3D`\ s at run-time to represent the original polygon using convex decomposition. +Provides a 3D collision polygon to a :ref:`CollisionObject3D` parent, by thickening a 2D (convex or concave) polygon in the local XY plane along the local Z axis. The 2D polygon in the local XY plane can be drawn in the editor or specified by a list of vertices. That 2D polygon is thickened evenly in the local Z and -Z directions. -\ **Note:** Since this is an editor-only helper, properties modified during gameplay will have no effect. +This node has the same effect as several :ref:`ConvexPolygonShape3D` nodes, created by thickening the 2D convex polygons in the convex decomposition of the given 2D polygon (but without the overhead of multiple nodes). \ **Warning:** A non-uniformly scaled CollisionPolygon3D node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change its :ref:`polygon`'s vertices instead. @@ -63,7 +63,7 @@ Property Descriptions - void **set_depth** **(** :ref:`float` value **)** - :ref:`float` **get_depth** **(** **)** -Length that the resulting collision extends in either direction perpendicular to its polygon. +Length that the resulting collision extends in either direction perpendicular to its 2D polygon. .. rst-class:: classref-item-separator @@ -114,7 +114,7 @@ The collision margin for the generated :ref:`Shape3D`. See :ref:` - void **set_polygon** **(** :ref:`PackedVector2Array` value **)** - :ref:`PackedVector2Array` **get_polygon** **(** **)** -Array of vertices which define the polygon. +Array of vertices which define the 2D polygon in the local XY plane. \ **Note:** The returned value is a copy of the original. Methods which mutate the size or properties of the return value will not impact the original polygon. To change properties of the polygon, assign it to a temporary variable and make changes before reassigning the ``polygon`` member. diff --git a/classes/class_collisionshape2d.rst b/classes/class_collisionshape2d.rst index 7a3edb78070..07579d5cfd4 100644 --- a/classes/class_collisionshape2d.rst +++ b/classes/class_collisionshape2d.rst @@ -19,7 +19,7 @@ Node that represents collision shape data in 2D space. Description ----------- -Editor facility for creating and editing collision shapes in 2D space. Set the :ref:`shape` property to configure the shape. **IMPORTANT**: this is an Editor-only helper to create shapes, use :ref:`CollisionObject2D.shape_owner_get_shape` to get the actual shape. +Editor facility for creating and editing collision shapes in 2D space. Set the :ref:`shape` property to configure the shape. You can use this node to represent all sorts of collision shapes, for example, add this to an :ref:`Area2D` to give it a detection shape, or add it to a :ref:`PhysicsBody2D` to create a solid object. diff --git a/classes/class_collisionshape3d.rst b/classes/class_collisionshape3d.rst index 19398fcaaba..0802b638da7 100644 --- a/classes/class_collisionshape3d.rst +++ b/classes/class_collisionshape3d.rst @@ -19,7 +19,7 @@ Node that represents collision shape data in 3D space. Description ----------- -Editor facility for creating and editing collision shapes in 3D space. Set the :ref:`shape` property to configure the shape. **IMPORTANT**: this is an Editor-only helper to create shapes, use :ref:`CollisionObject3D.shape_owner_get_shape` to get the actual shape. +Editor facility for creating and editing collision shapes in 3D space. Set the :ref:`shape` property to configure the shape. You can use this node to represent all sorts of collision shapes, for example, add this to an :ref:`Area3D` to give it a detection shape, or add it to a :ref:`PhysicsBody3D` to create a solid object. diff --git a/classes/class_colorpicker.rst b/classes/class_colorpicker.rst index be5dd4fd07e..228db859c99 100644 --- a/classes/class_colorpicker.rst +++ b/classes/class_colorpicker.rst @@ -92,43 +92,45 @@ Theme Properties .. table:: :widths: auto - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`int` | :ref:`h_width` | ``30`` | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`int` | :ref:`label_width` | ``10`` | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`int` | :ref:`margin` | ``4`` | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`int` | :ref:`sv_height` | ``256`` | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`int` | :ref:`sv_width` | ``256`` | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`add_preset` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`bar_arrow` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`color_hue` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`color_okhsl_hue` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`expanded_arrow` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`folded_arrow` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`overbright_indicator` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`picker_cursor` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`sample_bg` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`screen_picker` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`shape_circle` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`shape_rect` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ - | :ref:`Texture2D` | :ref:`shape_rect_wheel` | | - +-----------------------------------+--------------------------------------------------------------------------------+---------+ + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`int` | :ref:`center_slider_grabbers` | ``1`` | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`int` | :ref:`h_width` | ``30`` | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`int` | :ref:`label_width` | ``10`` | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`int` | :ref:`margin` | ``4`` | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`int` | :ref:`sv_height` | ``256`` | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`int` | :ref:`sv_width` | ``256`` | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`add_preset` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`bar_arrow` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`color_hue` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`color_okhsl_hue` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`expanded_arrow` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`folded_arrow` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`overbright_indicator` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`picker_cursor` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`sample_bg` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`screen_picker` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`shape_circle` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`shape_rect` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ + | :ref:`Texture2D` | :ref:`shape_rect_wheel` | | + +-----------------------------------+----------------------------------------------------------------------------------------+---------+ .. rst-class:: classref-section-separator @@ -554,6 +556,18 @@ Returns the list of colors in the recent presets of the color picker. Theme Property Descriptions --------------------------- +.. _class_ColorPicker_theme_constant_center_slider_grabbers: + +.. rst-class:: classref-themeproperty + +:ref:`int` **center_slider_grabbers** = ``1`` + +Overrides the :ref:`HSlider.center_grabber` theme property of the sliders. + +.. rst-class:: classref-item-separator + +---- + .. _class_ColorPicker_theme_constant_h_width: .. rst-class:: classref-themeproperty diff --git a/classes/class_compressedcubemap.rst b/classes/class_compressedcubemap.rst index e69c8af1bcb..a213b43b73a 100644 --- a/classes/class_compressedcubemap.rst +++ b/classes/class_compressedcubemap.rst @@ -21,14 +21,16 @@ Description A cubemap that is loaded from a ``.ccube`` file. This file format is internal to Godot; it is created by importing other image formats with the import system. **CompressedCubemap** can use one of 4 compresson methods: -- Uncompressed (uncompressed on the GPU) - - Lossless (WebP or PNG, uncompressed on the GPU) - Lossy (WebP, uncompressed on the GPU) - VRAM Compressed (compressed on the GPU) +- VRAM Uncompressed (uncompressed on the GPU) + +- Basis Universal (compressed on the GPU. Lower file sizes than VRAM Compressed, but slower to compress and lower quality than VRAM Compressed) + Only **VRAM Compressed** actually reduces the memory usage on the GPU. The **Lossless** and **Lossy** compression methods will reduce the required storage on disk, but they will not reduce memory usage on the GPU as the texture is sent to the GPU uncompressed. Using **VRAM Compressed** also improves loading times, as VRAM-compressed textures are faster to load compared to textures using lossless or lossy compression. VRAM compression can exhibit noticeable artifacts and is intended to be used for 3D rendering, not 2D. diff --git a/classes/class_compressedcubemaparray.rst b/classes/class_compressedcubemaparray.rst index fa085b54f33..80a1c51ca7b 100644 --- a/classes/class_compressedcubemaparray.rst +++ b/classes/class_compressedcubemaparray.rst @@ -21,14 +21,16 @@ Description A cubemap array that is loaded from a ``.ccubearray`` file. This file format is internal to Godot; it is created by importing other image formats with the import system. **CompressedCubemapArray** can use one of 4 compresson methods: -- Uncompressed (uncompressed on the GPU) - - Lossless (WebP or PNG, uncompressed on the GPU) - Lossy (WebP, uncompressed on the GPU) - VRAM Compressed (compressed on the GPU) +- VRAM Uncompressed (uncompressed on the GPU) + +- Basis Universal (compressed on the GPU. Lower file sizes than VRAM Compressed, but slower to compress and lower quality than VRAM Compressed) + Only **VRAM Compressed** actually reduces the memory usage on the GPU. The **Lossless** and **Lossy** compression methods will reduce the required storage on disk, but they will not reduce memory usage on the GPU as the texture is sent to the GPU uncompressed. Using **VRAM Compressed** also improves loading times, as VRAM-compressed textures are faster to load compared to textures using lossless or lossy compression. VRAM compression can exhibit noticeable artifacts and is intended to be used for 3D rendering, not 2D. diff --git a/classes/class_compressedtexture2d.rst b/classes/class_compressedtexture2d.rst index dbbe5e594b0..9ef346709e1 100644 --- a/classes/class_compressedtexture2d.rst +++ b/classes/class_compressedtexture2d.rst @@ -21,14 +21,16 @@ Description A texture that is loaded from a ``.ctex`` file. This file format is internal to Godot; it is created by importing other image formats with the import system. **CompressedTexture2D** can use one of 4 compression methods (including a lack of any compression): -- Uncompressed (uncompressed on the GPU) - - Lossless (WebP or PNG, uncompressed on the GPU) - Lossy (WebP, uncompressed on the GPU) - VRAM Compressed (compressed on the GPU) +- VRAM Uncompressed (uncompressed on the GPU) + +- Basis Universal (compressed on the GPU. Lower file sizes than VRAM Compressed, but slower to compress and lower quality than VRAM Compressed) + Only **VRAM Compressed** actually reduces the memory usage on the GPU. The **Lossless** and **Lossy** compression methods will reduce the required storage on disk, but they will not reduce memory usage on the GPU as the texture is sent to the GPU uncompressed. Using **VRAM Compressed** also improves loading times, as VRAM-compressed textures are faster to load compared to textures using lossless or lossy compression. VRAM compression can exhibit noticeable artifacts and is intended to be used for 3D rendering, not 2D. diff --git a/classes/class_compressedtexture2darray.rst b/classes/class_compressedtexture2darray.rst index d70e4e6b441..e4c372a3779 100644 --- a/classes/class_compressedtexture2darray.rst +++ b/classes/class_compressedtexture2darray.rst @@ -21,14 +21,16 @@ Description A texture array that is loaded from a ``.ctexarray`` file. This file format is internal to Godot; it is created by importing other image formats with the import system. **CompressedTexture2DArray** can use one of 4 compresson methods: -- Uncompressed (uncompressed on the GPU) - - Lossless (WebP or PNG, uncompressed on the GPU) - Lossy (WebP, uncompressed on the GPU) - VRAM Compressed (compressed on the GPU) +- VRAM Uncompressed (uncompressed on the GPU) + +- Basis Universal (compressed on the GPU. Lower file sizes than VRAM Compressed, but slower to compress and lower quality than VRAM Compressed) + Only **VRAM Compressed** actually reduces the memory usage on the GPU. The **Lossless** and **Lossy** compression methods will reduce the required storage on disk, but they will not reduce memory usage on the GPU as the texture is sent to the GPU uncompressed. Using **VRAM Compressed** also improves loading times, as VRAM-compressed textures are faster to load compared to textures using lossless or lossy compression. VRAM compression can exhibit noticeable artifacts and is intended to be used for 3D rendering, not 2D. diff --git a/classes/class_compressedtexturelayered.rst b/classes/class_compressedtexturelayered.rst index f95e69fce74..8e4f4244583 100644 --- a/classes/class_compressedtexturelayered.rst +++ b/classes/class_compressedtexturelayered.rst @@ -21,19 +21,7 @@ Base class for texture arrays that can optionally be compressed. Description ----------- -A texture array that is loaded from a ``.ctexarray`` file. This file format is internal to Godot; it is created by importing other image formats with the import system. :ref:`CompressedTexture2D` can use one of 4 compresson methods: - -- Uncompressed (uncompressed on the GPU) - -- Lossless (WebP or PNG, uncompressed on the GPU) - -- Lossy (WebP, uncompressed on the GPU) - -- VRAM Compressed (compressed on the GPU) - -Only **VRAM Compressed** actually reduces the memory usage on the GPU. The **Lossless** and **Lossy** compression methods will reduce the required storage on disk, but they will not reduce memory usage on the GPU as the texture is sent to the GPU uncompressed. - -Using **VRAM Compressed** also improves loading times, as VRAM-compressed textures are faster to load compared to textures using lossless or lossy compression. VRAM compression can exhibit noticeable artifacts and is intended to be used for 3D rendering, not 2D. +Base class for :ref:`CompressedTexture2DArray` and :ref:`CompressedTexture3D`. Cannot be used directly, but contains all the functions necessary for accessing the derived resource types. See also :ref:`TextureLayered`. .. rst-class:: classref-reftable-group diff --git a/classes/class_concavepolygonshape2d.rst b/classes/class_concavepolygonshape2d.rst index 04c3232dd09..4661fe96d1c 100644 --- a/classes/class_concavepolygonshape2d.rst +++ b/classes/class_concavepolygonshape2d.rst @@ -19,14 +19,20 @@ Concave polygon shape resource for 2D physics. Description ----------- -2D concave polygon shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. It is made out of segments and is optimal for complex polygonal concave collisions. However, it is not advised to use for :ref:`RigidBody2D` nodes. A CollisionPolygon2D in convex decomposition mode (solids) or several convex objects are advised for that instead. Otherwise, a concave polygon 2D shape is better for static collisions. +2D concave polygon shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. -The main difference between a :ref:`ConvexPolygonShape2D` and a **ConcavePolygonShape2D** is that a concave polygon assumes it is concave and uses a more complex method of collision detection, and a convex one forces itself to be convex to speed up collision detection. +The shape consists of a collection of line segments, and as such it does not include any "inside" that the segments might be enclosing. If the segments do enclose anything, then the shape is *hollow*, as opposed to a :ref:`ConvexPolygonShape2D` which is solid. See also :ref:`CollisionPolygon2D`. -\ **Performance:** Due to its complexity, **ConcavePolygonShape2D** is the slowest collision shape to check collisions against. Its use should generally be limited to level geometry. For convex geometry, using :ref:`ConvexPolygonShape2D` will perform better. For dynamic physics bodies that need concave collision, several :ref:`ConvexPolygonShape2D`\ s can be used to represent its collision by using convex decomposition; see :ref:`ConvexPolygonShape2D`'s documentation for instructions. However, consider using primitive collision shapes such as :ref:`CircleShape2D` or :ref:`RectangleShape2D` first. +Being made out of line segments, this shape is the most freely configurable single 2D shape. It can be used to form (hollow) polygons of any nature, convex or concave. + +\ **Note:** When used for collision, **ConcavePolygonShape2D** is intended to work with static :ref:`PhysicsBody2D` nodes like :ref:`StaticBody2D` and is not recommended to use with :ref:`RigidBody2D` nodes in a mode other than Static. A :ref:`CollisionPolygon2D` in convex decomposition mode (solids) or several convex objects are advised for that instead. Otherwise, a concave polygon 2D shape is better suited for static bodies. + +\ **Warning:** The nature of this shape makes it extra prone to being tunneled through by (small) fast physics bodies. For example, consider a (small) rigid body *Ball* traveling toward a static body *Box* at high speed. If the box uses a **ConcavePolygonShape2D** consisting of four segments, then the ball might end up inside the box or tunnel all the way through the box, if it goes fast enough. This is (partly) because the ball can only collide against the individual segments of the hollow box. In interactions with rigid bodies tunneling can be avoided by enabling continuous collision detection on the rigid body. \ **Warning:** Using this shape for an :ref:`Area2D` (via a :ref:`CollisionShape2D` node) may give unexpected results: the area will only detect collisions with the segments in the **ConcavePolygonShape2D** (and not with any "inside" of the shape, for example). +\ **Performance:** Due to its complexity, **ConcavePolygonShape2D** is the slowest collision shape to check collisions against. Its use should generally be limited to level geometry. For convex geometry, using :ref:`ConvexPolygonShape2D` will perform better. For dynamic physics bodies that need concave collision, several :ref:`ConvexPolygonShape2D`\ s can be used to represent its collision by using convex decomposition; see :ref:`ConvexPolygonShape2D`'s documentation for instructions. However, consider using primitive collision shapes such as :ref:`CircleShape2D` or :ref:`RectangleShape2D` first. + .. rst-class:: classref-reftable-group Properties @@ -59,7 +65,7 @@ Property Descriptions - void **set_segments** **(** :ref:`PackedVector2Array` value **)** - :ref:`PackedVector2Array` **get_segments** **(** **)** -The array of points that make up the **ConcavePolygonShape2D**'s line segments. +The array of points that make up the **ConcavePolygonShape2D**'s line segments. The array (of length divisible by two) is naturally divided into pairs (one pair for each segment); each pair consists of the starting point of a segment and the endpoint of a segment. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_concavepolygonshape3d.rst b/classes/class_concavepolygonshape3d.rst index 3c603a2e33d..39496bc2946 100644 --- a/classes/class_concavepolygonshape3d.rst +++ b/classes/class_concavepolygonshape3d.rst @@ -19,14 +19,20 @@ Concave polygon shape resource (also called "trimesh") for 3D physics. Description ----------- -3D concave polygon shape resource (also called "trimesh") to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. This shape is created by feeding a list of triangles. Despite its name, **ConcavePolygonShape3D** can also store convex polygon shapes. However, unlike :ref:`ConvexPolygonShape3D`, **ConcavePolygonShape3D** is *not* limited to storing convex shapes exclusively. +3D concave polygon shape resource (also called "trimesh") to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. -\ **Note:** When used for collision, **ConcavePolygonShape3D** is intended to work with static :ref:`PhysicsBody3D` nodes like :ref:`StaticBody3D` and will not work with :ref:`CharacterBody3D` or :ref:`RigidBody3D` with a mode other than Static. +The shape consists of a collection of triangle faces, and as such it does not include any "inside" that the faces might be enclosing. If the faces enclose anything, then the shape is *hollow*, as opposed to a :ref:`ConvexPolygonShape3D` which is solid. See also :ref:`CollisionPolygon3D`. -\ **Performance:** Due to its complexity, **ConcavePolygonShape3D** is the slowest collision shape to check collisions against. Its use should generally be limited to level geometry. For convex geometry, using :ref:`ConvexPolygonShape3D` will perform better. For dynamic physics bodies that need concave collision, several :ref:`ConvexPolygonShape3D`\ s can be used to represent its collision by using convex decomposition; see :ref:`ConvexPolygonShape3D`'s documentation for instructions. However, consider using primitive collision shapes such as :ref:`SphereShape3D` or :ref:`BoxShape3D` first. +Being made out of triangle faces, this shape is the most freely configurable single 3D shape. Despite its name, it can be used to form (hollow) polyhedra of any nature, convex or concave. + +\ **Note:** When used for collision, **ConcavePolygonShape3D** is intended to work with static :ref:`PhysicsBody3D` nodes like :ref:`StaticBody3D` and will not work with :ref:`CharacterBody3D` or :ref:`RigidBody3D` in a mode other than Static. + +\ **Warning:** The nature of this shape makes it extra prone to being tunneled through by (small) fast physics bodies. For example, consider a (small) rigid body *Ball* traveling toward a static body *Box* at high speed. If the box uses a **ConcavePolygonShape3D** consisting of twelve triangle faces (two triangle faces for each of the six sides of the box), then the ball might end up inside the box or tunnel all the way through the box, if it goes fast enough. This is (partly) because the ball can only collide against the individual faces of the hollow box. In interactions with rigid bodies tunneling can be avoided by enabling continuous collision detection on the rigid body. \ **Warning:** Using this shape for an :ref:`Area3D` (via a :ref:`CollisionShape3D` node, created e.g. by using the *Create Trimesh Collision Sibling* option in the *Mesh* menu that appears when selecting a :ref:`MeshInstance3D` node) may give unexpected results: the area will only detect collisions with the triangle faces in the **ConcavePolygonShape3D** (and not with any "inside" of the shape, for example); moreover it will only detect all such collisions if :ref:`backface_collision` is ``true``. +\ **Performance:** Due to its complexity, **ConcavePolygonShape3D** is the slowest collision shape to check collisions against. Its use should generally be limited to level geometry. For convex geometry, using :ref:`ConvexPolygonShape3D` will perform better. For dynamic physics bodies that need concave collision, several :ref:`ConvexPolygonShape3D`\ s can be used to represent its collision by using convex decomposition; see :ref:`ConvexPolygonShape3D`'s documentation for instructions. However, consider using primitive collision shapes such as :ref:`SphereShape3D` or :ref:`BoxShape3D` first. + .. rst-class:: classref-introduction-group Tutorials @@ -97,7 +103,7 @@ Method Descriptions :ref:`PackedVector3Array` **get_faces** **(** **)** |const| -Returns the faces (an array of triangles). +Returns the faces of the trimesh shape as an array of vertices. The array (of length divisible by three) is naturally divided into triples; each triple of vertices defines a triangle. .. rst-class:: classref-item-separator @@ -109,7 +115,7 @@ Returns the faces (an array of triangles). void **set_faces** **(** :ref:`PackedVector3Array` faces **)** -Sets the faces (an array of triangles). +Sets the faces of the trimesh shape from an array of vertices. The ``faces`` array should be composed of triples such that each triple of vertices defines a triangle. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_conetwistjoint3d.rst b/classes/class_conetwistjoint3d.rst index 1d9cf6cd140..4a06f9c14d2 100644 --- a/classes/class_conetwistjoint3d.rst +++ b/classes/class_conetwistjoint3d.rst @@ -247,9 +247,7 @@ Method Descriptions :ref:`float` **get_param** **(** :ref:`Param` param **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the value of the specified parameter. .. rst-class:: classref-item-separator @@ -261,9 +259,7 @@ Method Descriptions void **set_param** **(** :ref:`Param` param, :ref:`float` value **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the value of the specified parameter. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_control.rst b/classes/class_control.rst index 3b193fe2854..ba2c6cdb567 100644 --- a/classes/class_control.rst +++ b/classes/class_control.rst @@ -159,6 +159,8 @@ Methods +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2` | :ref:`_get_minimum_size` **(** **)** |virtual| |const| | +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`_get_tooltip` **(** :ref:`Vector2` at_position **)** |virtual| |const| | + +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`_gui_input` **(** :ref:`InputEvent` event **)** |virtual| | +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`_has_point` **(** :ref:`Vector2` point **)** |virtual| |const| | @@ -1223,7 +1225,7 @@ Anchors the top edge of the node to the origin, the center or the end of its par - void **set_auto_translate** **(** :ref:`bool` value **)** - :ref:`bool` **is_auto_translating** **(** **)** -Toggles if any text should automatically change to its translated version depending on the current locale. Note that this will not affect any internal nodes (e.g. the popup of a :ref:`MenuButton`). +Toggles if any text should automatically change to its translated version depending on the current locale. Also decides if the node's strings should be parsed for POT generation. @@ -1327,7 +1329,7 @@ Tells Godot which node it should give focus to if the user presses the left arro - void **set_focus_neighbor** **(** :ref:`Side` side, :ref:`NodePath` neighbor **)** - :ref:`NodePath` **get_focus_neighbor** **(** :ref:`Side` side **)** |const| -Tells Godot which node it should give focus to if the user presses the right arrow on the keyboard or right on a gamepad by default. You can change the key by editing the :ref:`ProjectSettings.input/ui_right` input action. The node must be a **Control**. If this property is not set, Godot will give focus to the closest **Control** to the bottom of this one. +Tells Godot which node it should give focus to if the user presses the right arrow on the keyboard or right on a gamepad by default. You can change the key by editing the :ref:`ProjectSettings.input/ui_right` input action. The node must be a **Control**. If this property is not set, Godot will give focus to the closest **Control** to the right of this one. .. rst-class:: classref-item-separator @@ -1344,7 +1346,7 @@ Tells Godot which node it should give focus to if the user presses the right arr - void **set_focus_neighbor** **(** :ref:`Side` side, :ref:`NodePath` neighbor **)** - :ref:`NodePath` **get_focus_neighbor** **(** :ref:`Side` side **)** |const| -Tells Godot which node it should give focus to if the user presses the top arrow on the keyboard or top on a gamepad by default. You can change the key by editing the :ref:`ProjectSettings.input/ui_up` input action. The node must be a **Control**. If this property is not set, Godot will give focus to the closest **Control** to the bottom of this one. +Tells Godot which node it should give focus to if the user presses the top arrow on the keyboard or top on a gamepad by default. You can change the key by editing the :ref:`ProjectSettings.input/ui_up` input action. The node must be a **Control**. If this property is not set, Godot will give focus to the closest **Control** to the top of this one. .. rst-class:: classref-item-separator @@ -1993,6 +1995,20 @@ If not overridden, defaults to :ref:`Vector2.ZERO`. ---- +.. _class_Control_method__get_tooltip: + +.. rst-class:: classref-method + +:ref:`String` **_get_tooltip** **(** :ref:`Vector2` at_position **)** |virtual| |const| + +Virtual method to be implemented by the user. Returns the tooltip text for the position ``at_position`` in control's local coordinates, which will typically appear when the cursor is resting over this control. See :ref:`get_tooltip`. + +\ **Note:** If this method returns an empty :ref:`String`, no tooltip is displayed. + +.. rst-class:: classref-item-separator + +---- + .. _class_Control_method__gui_input: .. rst-class:: classref-method @@ -2150,6 +2166,8 @@ void **accept_event** **(** **)** Marks an input event as handled. Once you accept an input event, it stops propagating, even to nodes listening to :ref:`Node._unhandled_input` or :ref:`Node._unhandled_key_input`. +\ **Note:** This does not affect the methods in :ref:`Input`, only the way events are propagated. + .. rst-class:: classref-item-separator ---- @@ -2462,7 +2480,7 @@ Returns the minimum size for this control. See :ref:`custom_minimum_size` **get_offset** **(** :ref:`Side` offset **)** |const| -Returns the anchor for the specified :ref:`Side`. A getter method for :ref:`offset_bottom`, :ref:`offset_left`, :ref:`offset_right` and :ref:`offset_top`. +Returns the offset for the specified :ref:`Side`. A getter method for :ref:`offset_bottom`, :ref:`offset_left`, :ref:`offset_right` and :ref:`offset_top`. .. rst-class:: classref-item-separator @@ -2685,9 +2703,11 @@ See :ref:`get_theme_color` for details. :ref:`String` **get_tooltip** **(** :ref:`Vector2` at_position=Vector2(0, 0) **)** |const| -Returns the tooltip text ``at_position`` in local coordinates, which will typically appear when the cursor is resting over this control. By default, it returns :ref:`tooltip_text`. +Returns the tooltip text for the position ``at_position`` in control's local coordinates, which will typically appear when the cursor is resting over this control. By default, it returns :ref:`tooltip_text`. + +This method can be overridden to customize its behavior. See :ref:`_get_tooltip`. -\ **Note:** This method can be overridden to customize its behavior. If this method returns an empty :ref:`String`, no tooltip is displayed. +\ **Note:** If this method returns an empty :ref:`String`, no tooltip is displayed. .. rst-class:: classref-item-separator @@ -3182,7 +3202,7 @@ Sets :ref:`offset_right` and :ref:`offset_b void **set_focus_neighbor** **(** :ref:`Side` side, :ref:`NodePath` neighbor **)** -Sets the anchor for the specified :ref:`Side` to the **Control** at ``neighbor`` node path. A setter method for :ref:`focus_neighbor_bottom`, :ref:`focus_neighbor_left`, :ref:`focus_neighbor_right` and :ref:`focus_neighbor_top`. +Sets the focus neighbor for the specified :ref:`Side` to the **Control** at ``neighbor`` node path. A setter method for :ref:`focus_neighbor_bottom`, :ref:`focus_neighbor_left`, :ref:`focus_neighbor_right` and :ref:`focus_neighbor_top`. .. rst-class:: classref-item-separator diff --git a/classes/class_convexpolygonshape2d.rst b/classes/class_convexpolygonshape2d.rst index 6177f19fe79..0d06c0eab26 100644 --- a/classes/class_convexpolygonshape2d.rst +++ b/classes/class_convexpolygonshape2d.rst @@ -19,11 +19,15 @@ Convex polygon shape resource for 2D physics. Description ----------- -2D convex polygon shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. A convex polygon, whatever its shape, is internally decomposed into as many convex polygons as needed to ensure all collision checks against it are always done on convex polygons (which are faster to check). See also :ref:`CollisionPolygon2D`. +2D convex polygon shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. -The main difference between a **ConvexPolygonShape2D** and a :ref:`ConcavePolygonShape2D` is that a concave polygon assumes it is concave and uses a more complex method of collision detection, and a convex one forces itself to be convex to speed up collision detection. +The shape is a *solid* that includes all the points that it encloses, as opposed to :ref:`ConcavePolygonShape2D` which is hollow if it encloses anything. See also :ref:`CollisionPolygon2D`. -\ **Performance:** **ConvexPolygonShape2D** is faster to check collisions against compared to :ref:`ConcavePolygonShape2D`, but it is slower than primitive collision shapes such as :ref:`CircleShape2D` or :ref:`RectangleShape2D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by a primitive shape. +The solid nature of the shape makes it well-suited for both detection and physics; in physics body interactions this allows depenetrating even those shapes which end up (e.g. due to high speed) fully inside the convex shape (similarly to primitive shapes, but unlike :ref:`ConcavePolygonShape2D`). The convexity limits the possible geometric shape of a single **ConvexPolygonShape2D**: it cannot be concave. + +\ **Convex decomposition:** Concave objects' collisions can be represented accurately using *several* convex shapes. This allows dynamic physics bodies to have complex concave collisions (at a performance cost). It can be achieved using several **ConvexPolygonShape2D** nodes or by using the :ref:`CollisionPolygon2D` node in Solids build mode. To generate a collision polygon from a sprite, select the :ref:`Sprite2D` node, go to the **Sprite2D** menu that appears above the viewport, and choose **Create Polygon2D Sibling**. + +\ **Performance:** **ConvexPolygonShape2D** is faster to check collisions against compared to :ref:`ConcavePolygonShape2D`, but it is slower than primitive collision shapes such as :ref:`CircleShape2D` or :ref:`RectangleShape2D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by primitive shapes. .. rst-class:: classref-reftable-group @@ -69,7 +73,9 @@ Property Descriptions - void **set_points** **(** :ref:`PackedVector2Array` value **)** - :ref:`PackedVector2Array` **get_points** **(** **)** -The polygon's list of vertices. Can be in either clockwise or counterclockwise order. Only set this property with convex hull points, use :ref:`set_point_cloud` to generate a convex hull shape from concave shape points. +The polygon's list of vertices that form a convex hull. Can be in either clockwise or counterclockwise order. + +\ **Warning:** Only set this property to a list of points that actually form a convex hull. Use :ref:`set_point_cloud` to generate the convex hull of an arbitrary set of points. .. rst-class:: classref-section-separator @@ -86,7 +92,7 @@ Method Descriptions void **set_point_cloud** **(** :ref:`PackedVector2Array` point_cloud **)** -Based on the set of points provided, this creates and assigns the :ref:`points` property using the convex hull algorithm. Removing all unneeded points. See :ref:`Geometry2D.convex_hull` for details. +Based on the set of points provided, this assigns the :ref:`points` property using the convex hull algorithm, removing all unneeded points. See :ref:`Geometry2D.convex_hull` for details. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_convexpolygonshape3d.rst b/classes/class_convexpolygonshape3d.rst index 59e8b32a3f8..a0f39a2a941 100644 --- a/classes/class_convexpolygonshape3d.rst +++ b/classes/class_convexpolygonshape3d.rst @@ -19,11 +19,15 @@ Convex polygon shape resource for 3D physics. Description ----------- -3D convex polygon shape resource to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. Unlike :ref:`ConcavePolygonShape3D`, **ConvexPolygonShape3D** cannot store concave polygon shapes. **ConvexPolygonShape3D**\ s can be manually drawn in the editor using the :ref:`CollisionPolygon3D` node. +3D convex polygon shape resource to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. -\ **Convex decomposition:** Concave objects' collisions can be represented accurately using *several* **ConvexPolygonShape3D**\ s. This allows dynamic physics bodies to have complex concave collisions (at a performance cost). This is available in the editor by selecting the :ref:`MeshInstance3D`, going to the **Mesh** menu and choosing **Create Multiple Convex Collision Siblings**. Alternatively, :ref:`MeshInstance3D.create_multiple_convex_collisions` can be called in a script to perform this decomposition at run-time. +The shape is a *solid* that includes all the points that it encloses, as opposed to :ref:`ConcavePolygonShape3D` which is hollow if it encloses anything. See also :ref:`CollisionPolygon3D`. -\ **Performance:** **ConvexPolygonShape3D** is faster to check collisions against compared to :ref:`ConcavePolygonShape3D`, but it is slower than primitive collision shapes such as :ref:`SphereShape3D` or :ref:`BoxShape3D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by a primitive shape. +The solid nature of the shape makes it well-suited for both detection and physics; in physics body interactions this allows depenetrating even those shapes which end up (e.g. due to high speed) fully inside the convex shape (similarly to primitive shapes, but unlike :ref:`ConcavePolygonShape3D` and :ref:`HeightMapShape3D`). The convexity restricts the possible geometric shape of a single **ConvexPolygonShape3D**: it cannot be concave. + +\ **Convex decomposition:** Concave objects' collisions can be represented accurately using *several* convex shapes. This allows dynamic physics bodies to have complex concave collisions (at a performance cost). It can be achieved by using several **ConvexPolygonShape3D** nodes or by using the :ref:`CollisionPolygon3D` node. To generate a collision polygon from a mesh, select the :ref:`MeshInstance3D` node, go to the **Mesh** menu that appears above the viewport and choose **Create Multiple Convex Collision Siblings**. Alternatively, :ref:`MeshInstance3D.create_multiple_convex_collisions` can be called in a script to perform this decomposition at run-time. + +\ **Performance:** **ConvexPolygonShape3D** is faster to check collisions against compared to :ref:`ConcavePolygonShape3D`, but it is slower than primitive collision shapes such as :ref:`SphereShape3D` or :ref:`BoxShape3D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by primitive shapes. .. rst-class:: classref-introduction-group diff --git a/classes/class_cpuparticles3d.rst b/classes/class_cpuparticles3d.rst index f81a8d11d94..7d1fb40fc41 100644 --- a/classes/class_cpuparticles3d.rst +++ b/classes/class_cpuparticles3d.rst @@ -1662,7 +1662,7 @@ Particle system's running speed scaling ratio. A value of ``0`` can be used to p - void **set_split_scale** **(** :ref:`bool` value **)** - :ref:`bool` **get_split_scale** **(** **)** -If set to true, three different scale curves can be specified, one per scale axis. +If set to ``true``, three different scale curves can be specified, one per scale axis. .. rst-class:: classref-item-separator diff --git a/classes/class_crypto.rst b/classes/class_crypto.rst index d7c1f4baf24..a808cc1a61b 100644 --- a/classes/class_crypto.rst +++ b/classes/class_crypto.rst @@ -44,7 +44,7 @@ For now, this includes generating cryptographically secure random bytes, RSA key cert.save("user://generated.crt") # Encryption var data = "Some data" - var encrypted = crypto.encrypt(key, data.to_utf8()) + var encrypted = crypto.encrypt(key, data.to_utf8_buffer()) # Decryption var decrypted = crypto.decrypt(key, encrypted) # Signing @@ -53,7 +53,7 @@ For now, this includes generating cryptographically secure random bytes, RSA key var verified = crypto.verify(HashingContext.HASH_SHA256, data.sha256_buffer(), signature, key) # Checks assert(verified) - assert(data.to_utf8() == decrypted) + assert(data.to_utf8_buffer() == decrypted) .. code-tab:: csharp @@ -77,7 +77,7 @@ For now, this includes generating cryptographically secure random bytes, RSA key _cert.Save("user://generated.crt"); // Encryption string data = "Some data"; - byte[] encrypted = _crypto.Encrypt(_key, data.ToUtf8()); + byte[] encrypted = _crypto.Encrypt(_key, data.ToUtf8Buffer()); // Decryption byte[] decrypted = _crypto.Decrypt(_key, encrypted); // Signing @@ -86,7 +86,7 @@ For now, this includes generating cryptographically secure random bytes, RSA key bool verified = _crypto.Verify(HashingContext.HashType.Sha256, Data.Sha256Buffer(), signature, _key); // Checks Debug.Assert(verified); - Debug.Assert(data.ToUtf8() == decrypted); + Debug.Assert(data.ToUtf8Buffer() == decrypted); } } diff --git a/classes/class_csgshape3d.rst b/classes/class_csgshape3d.rst index 3203e3c58eb..9bab0290183 100644 --- a/classes/class_csgshape3d.rst +++ b/classes/class_csgshape3d.rst @@ -226,7 +226,7 @@ The operation that is performed on this shape. This is ignored for the first CSG - void **set_snap** **(** :ref:`float` value **)** - :ref:`float` **get_snap** **(** **)** -Snap makes the mesh snap to a given distance so that the faces of two meshes can be perfectly aligned. A lower value results in greater precision but may be harder to adjust. +Snap makes the mesh vertices snap to a given distance so that the faces of two meshes can be perfectly aligned. A lower value results in greater precision but may be harder to adjust. .. rst-class:: classref-item-separator diff --git a/classes/class_curve3d.rst b/classes/class_curve3d.rst index 8ee2588b59b..389d7d33dfd 100644 --- a/classes/class_curve3d.rst +++ b/classes/class_curve3d.rst @@ -378,7 +378,7 @@ If the curve has no up vectors, the function sends an error to the console, and :ref:`Transform3D` **sample_baked_with_rotation** **(** :ref:`float` offset=0.0, :ref:`bool` cubic=false, :ref:`bool` apply_tilt=false **)** |const| -Similar with ``interpolate_baked()``. The the return value is ``Transform3D``, with ``origin`` as point position, ``basis.x`` as sideway vector, ``basis.y`` as up vector, ``basis.z`` as forward vector. When the curve length is 0, there is no reasonable way to calculate the rotation, all vectors aligned with global space axes. +Similar with ``interpolate_baked()``. The return value is ``Transform3D``, with ``origin`` as point position, ``basis.x`` as sideway vector, ``basis.y`` as up vector, ``basis.z`` as forward vector. When the curve length is 0, there is no reasonable way to calculate the rotation, all vectors aligned with global space axes. .. rst-class:: classref-item-separator diff --git a/classes/class_curvetexture.rst b/classes/class_curvetexture.rst index ea86e498ca1..586a8cc8199 100644 --- a/classes/class_curvetexture.rst +++ b/classes/class_curvetexture.rst @@ -109,7 +109,7 @@ The :ref:`Curve` that is rendered onto the texture. - void **set_texture_mode** **(** :ref:`TextureMode` value **)** - :ref:`TextureMode` **get_texture_mode** **(** **)** -The format the texture should be generated with. When passing a CurveTexture as a input to a :ref:`Shader`, this may need to be adjusted. +The format the texture should be generated with. When passing a CurveTexture as an input to a :ref:`Shader`, this may need to be adjusted. .. rst-class:: classref-item-separator diff --git a/classes/class_decal.rst b/classes/class_decal.rst index 7421155359c..07a97e8aaad 100644 --- a/classes/class_decal.rst +++ b/classes/class_decal.rst @@ -397,7 +397,7 @@ Sets the size of the :ref:`AABB` used by the decal. All dimensions m \ **Note:** Unlike :ref:`BaseMaterial3D` whose filter mode can be adjusted on a per-material basis, the filter mode for **Decal** textures is set globally with :ref:`ProjectSettings.rendering/textures/decals/filter`. -\ **Note:** Setting this texture alone will not result in a visible decal, as :ref:`texture_albedo` must also be set. To create a ORM-only decal, load an albedo texture into :ref:`texture_albedo` and set :ref:`albedo_mix` to ``0.0``. The albedo texture's alpha channel will be used to determine where the underlying surface's ORM map should be overridden (and its intensity). +\ **Note:** Setting this texture alone will not result in a visible decal, as :ref:`texture_albedo` must also be set. To create an ORM-only decal, load an albedo texture into :ref:`texture_albedo` and set :ref:`albedo_mix` to ``0.0``. The albedo texture's alpha channel will be used to determine where the underlying surface's ORM map should be overridden (and its intensity). .. rst-class:: classref-item-separator diff --git a/classes/class_dictionary.rst b/classes/class_dictionary.rst index 244babf075a..7e2f971f6fa 100644 --- a/classes/class_dictionary.rst +++ b/classes/class_dictionary.rst @@ -189,8 +189,6 @@ The keys of a dictionary can be iterated with the ``for`` keyword: \ **Note:** Erasing elements while iterating over dictionaries is **not** supported and will result in unpredictable behavior. -\ **Note:** When declaring a dictionary with ``const``, the dictionary becomes read-only. A read-only Dictionary's entries cannot be overridden at run-time. This does *not* affect nested :ref:`Array` and **Dictionary** values. - .. rst-class:: classref-introduction-group Tutorials diff --git a/classes/class_diraccess.rst b/classes/class_diraccess.rst index 3a48d33231a..a6b58cbb168 100644 --- a/classes/class_diraccess.rst +++ b/classes/class_diraccess.rst @@ -195,7 +195,7 @@ Property Descriptions - void **set_include_hidden** **(** :ref:`bool` value **)** - :ref:`bool` **get_include_hidden** **(** **)** -If ``true``, hidden files are included when the navigating directory. +If ``true``, hidden files are included when navigating the directory. Affects :ref:`list_dir_begin`, :ref:`get_directories` and :ref:`get_files`. @@ -417,6 +417,8 @@ Returns a :ref:`PackedStringArray` containing filenames Affected by :ref:`include_hidden`. +\ **Note:** When used on a ``res://`` path in an exported project, only the files actually included in the PCK at the given folder level are returned. In practice, this means that since imported resources are stored in a top-level ``.godot/`` folder, only paths to ``*.gd`` and ``*.import`` files are returned (plus a few files such as ``project.godot`` or ``project.binary[code] and the project icon). In an exported project, the list of returned files will also vary depending on whether [member ProjectSettings.editor/export/convert_text_resources_to_binary] is [code]true``. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_displayserver.rst b/classes/class_displayserver.rst index d2076a05076..78411c1df22 100644 --- a/classes/class_displayserver.rst +++ b/classes/class_displayserver.rst @@ -62,6 +62,8 @@ Methods +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Rect2i` | :ref:`get_display_safe_area` **(** **)** |const| | +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_keyboard_focus_screen` **(** **)** |const| | + +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_name` **(** **)** |const| | +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_primary_screen` **(** **)** |const| | @@ -204,6 +206,8 @@ Methods +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`ScreenOrientation` | :ref:`screen_get_orientation` **(** :ref:`int` screen=-1 **)** |const| | +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`screen_get_pixel` **(** :ref:`Vector2i` position **)** |const| | + +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2i` | :ref:`screen_get_position` **(** :ref:`int` screen=-1 **)** |const| | +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`screen_get_refresh_rate` **(** :ref:`int` screen=-1 **)** |const| | @@ -518,6 +522,14 @@ Display server supports text-to-speech. See ``tts_*`` methods. **Windows, macOS, Display server supports expanding window content to the title. See :ref:`WINDOW_FLAG_EXTEND_TO_TITLE`. **macOS** +.. _class_DisplayServer_constant_FEATURE_SCREEN_CAPTURE: + +.. rst-class:: classref-enumeration-constant + +:ref:`Feature` **FEATURE_SCREEN_CAPTURE** = ``21`` + +Display server supports reading screen pixels. See :ref:`screen_get_pixel`. + .. rst-class:: classref-item-separator ---- @@ -594,7 +606,7 @@ Default landscape orientation. :ref:`ScreenOrientation` **SCREEN_PORTRAIT** = ``1`` -Default portrait orienstation. +Default portrait orientation. .. _class_DisplayServer_constant_SCREEN_REVERSE_LANDSCAPE: @@ -946,7 +958,7 @@ enum **WindowFlags**: :ref:`WindowFlags` **WINDOW_FLAG_RESIZE_DISABLED** = ``0`` -The window can't be resizing by dragging its resize grip. It's still possible to resize the window using :ref:`window_set_size`. This flag is ignored for full screen windows. +The window can't be resized by dragging its resize grip. It's still possible to resize the window using :ref:`window_set_size`. This flag is ignored for full screen windows. .. _class_DisplayServer_constant_WINDOW_FLAG_BORDERLESS: @@ -990,7 +1002,7 @@ The window can't be focused. No-focus window will ignore all input, except mouse :ref:`WindowFlags` **WINDOW_FLAG_POPUP** = ``5`` -Window is part of menu or :ref:`OptionButton` dropdown. This flag can't be changed when the window is visible. An active popup window will exclusively receive all input, without stealing focus from its parent. Popup windows are automatically closed when uses click outside it, or when an application is switched. Popup window must have ``transient parent`` set (see :ref:`window_set_transient`). +Window is part of menu or :ref:`OptionButton` dropdown. This flag can't be changed when the window is visible. An active popup window will exclusively receive all input, without stealing focus from its parent. Popup windows are automatically closed when uses click outside it, or when an application is switched. Popup window must have transient parent set (see :ref:`window_set_transient`). .. _class_DisplayServer_constant_WINDOW_FLAG_EXTEND_TO_TITLE: @@ -1212,7 +1224,7 @@ OpenGL context (only with the GL Compatibility renderer): - Linux: ``GLXContext*`` for the window. -- MacOS: ``NSOpenGLContext*`` for the window. +- macOS: ``NSOpenGLContext*`` for the window. - Android: ``EGLContext`` for the window. @@ -1267,6 +1279,22 @@ Utterance reached a word or sentence boundary. Constants --------- +.. _class_DisplayServer_constant_SCREEN_WITH_MOUSE_FOCUS: + +.. rst-class:: classref-constant + +**SCREEN_WITH_MOUSE_FOCUS** = ``-4`` + +Represents the screen containing the mouse pointer. + +.. _class_DisplayServer_constant_SCREEN_WITH_KEYBOARD_FOCUS: + +.. rst-class:: classref-constant + +**SCREEN_WITH_KEYBOARD_FOCUS** = ``-3`` + +Represents the screen containing the window with the keyboard focus. + .. _class_DisplayServer_constant_SCREEN_PRIMARY: .. rst-class:: classref-constant @@ -1504,6 +1532,18 @@ Returns the unobscured area of the display where interactive controls should be ---- +.. _class_DisplayServer_method_get_keyboard_focus_screen: + +.. rst-class:: classref-method + +:ref:`int` **get_keyboard_focus_screen** **(** **)** |const| + +Returns the index of the screen containing the window with the keyboard focus, or the primary screen if there's no focused window. + +.. rst-class:: classref-item-separator + +---- + .. _class_DisplayServer_method_get_name: .. rst-class:: classref-method @@ -1613,7 +1653,7 @@ Adds a new checkable item with text ``label`` to the global menu with ID ``menu_ Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. @@ -1640,7 +1680,7 @@ Adds a new checkable item with text ``label`` and icon ``icon`` to the global me Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. @@ -1667,7 +1707,7 @@ Adds a new item with text ``label`` and icon ``icon`` to the global menu with ID Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. @@ -1694,7 +1734,7 @@ Adds a new radio-checkable item with text ``label`` and icon ``icon`` to the glo Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** Radio-checkable items just display a checkmark, but don't have any built-in checking behavior and must be checked/unchecked manually. See :ref:`global_menu_set_item_checked` for more info on how to control it. @@ -1723,7 +1763,7 @@ Adds a new item with text ``label`` to the global menu with ID ``menu_root``. Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. @@ -1752,7 +1792,7 @@ Contrarily to normal binary items, multistate items can have more than two state Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** By default, there's no indication of the current item state, it should be changed manually. @@ -1781,7 +1821,7 @@ Adds a new radio-checkable item with text ``label`` to the global menu with ID ` Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +An ``accelerator`` can optionally be defined, which is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The ``accelerator`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** Radio-checkable items just display a checkmark, but don't have any built-in checking behavior and must be checked/unchecked manually. See :ref:`global_menu_set_item_checked` for more info on how to control it. @@ -1985,7 +2025,7 @@ Returns the callback of the item accelerator at index ``idx``. :ref:`int` **global_menu_get_item_max_states** **(** :ref:`String` menu_root, :ref:`int` idx **)** |const| -Returns number of states of an multistate item. See :ref:`global_menu_add_multistate_item` for details. +Returns number of states of a multistate item. See :ref:`global_menu_add_multistate_item` for details. \ **Note:** This method is implemented on macOS. @@ -1999,7 +2039,7 @@ Returns number of states of an multistate item. See :ref:`global_menu_add_multis :ref:`int` **global_menu_get_item_state** **(** :ref:`String` menu_root, :ref:`int` idx **)** |const| -Returns the state of an multistate item. See :ref:`global_menu_add_multistate_item` for details. +Returns the state of a multistate item. See :ref:`global_menu_add_multistate_item` for details. \ **Note:** This method is implemented on macOS. @@ -2055,7 +2095,7 @@ Returns the text of the item at index ``idx``. :ref:`String` **global_menu_get_item_tooltip** **(** :ref:`String` menu_root, :ref:`int` idx **)** |const| -Returns the tooltip associated with the specified index index ``idx``. +Returns the tooltip associated with the specified index ``idx``. \ **Note:** This method is implemented on macOS. @@ -2145,7 +2185,7 @@ Removes the item at index ``idx`` from the global menu ``menu_root``. void **global_menu_set_item_accelerator** **(** :ref:`String` menu_root, :ref:`int` idx, :ref:`Key` keycode **)** -Sets the accelerator of the item at index ``idx``. ``keycode`` can be a single :ref:`Key`, or a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +Sets the accelerator of the item at index ``idx``. ``keycode`` can be a single :ref:`Key`, or a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). \ **Note:** This method is implemented on macOS. @@ -2161,7 +2201,7 @@ void **global_menu_set_item_callback** **(** :ref:`String` menu_ro Sets the callback of the item at index ``idx``. Callback is emitted when an item is pressed. -\ **Note:** The ``callback`` Callable needs to accept exactly one Variant parameter, the parameter passed to the Callable will be the value passed to the tag parameter when the menu item was created. +\ **Note:** The ``callback`` Callable needs to accept exactly one Variant parameter, the parameter passed to the Callable will be the value passed to the ``tag`` parameter when the menu item was created. \ **Note:** This method is implemented on macOS. @@ -2249,7 +2289,7 @@ void **global_menu_set_item_key_callback** **(** :ref:`String` men Sets the callback of the item at index ``idx``. Callback is emitted when its accelerator is activated. -\ **Note:** The ``key_callback`` Callable needs to accept exactly one Variant parameter, the parameter passed to the Callable will be the value passed to the tag parameter when the menu item was created. +\ **Note:** The ``key_callback`` Callable needs to accept exactly one Variant parameter, the parameter passed to the Callable will be the value passed to the ``tag`` parameter when the menu item was created. \ **Note:** This method is implemented on macOS. @@ -2263,7 +2303,7 @@ Sets the callback of the item at index ``idx``. Callback is emitted when its acc void **global_menu_set_item_max_states** **(** :ref:`String` menu_root, :ref:`int` idx, :ref:`int` max_states **)** -Sets number of state of an multistate item. See :ref:`global_menu_add_multistate_item` for details. +Sets number of state of a multistate item. See :ref:`global_menu_add_multistate_item` for details. \ **Note:** This method is implemented on macOS. @@ -2293,7 +2333,7 @@ Sets the type of the item at the specified index ``idx`` to radio button. If ``f void **global_menu_set_item_state** **(** :ref:`String` menu_root, :ref:`int` idx, :ref:`int` state **)** -Sets the state of an multistate item. See :ref:`global_menu_add_multistate_item` for details. +Sets the state of a multistate item. See :ref:`global_menu_add_multistate_item` for details. \ **Note:** This method is implemented on macOS. @@ -2551,7 +2591,7 @@ Returns the current mouse mode. See also :ref:`mouse_set_mode` **mouse_get_position** **(** **)** |const| -Returns the mouse cursor's current position. +Returns the mouse cursor's current position in screen coordinates. .. rst-class:: classref-item-separator @@ -2638,6 +2678,22 @@ Returns the ``screen``'s current orientation. See also :ref:`screen_set_orientat ---- +.. _class_DisplayServer_method_screen_get_pixel: + +.. rst-class:: classref-method + +:ref:`Color` **screen_get_pixel** **(** :ref:`Vector2i` position **)** |const| + +Returns color of the display pixel at the ``position``. + +\ **Note:** This method is implemented on Linux (X11), macOS, and Windows. + +\ **Note:** On macOS, this method requires "Screen Recording" permission, if permission is not granted it will return desktop wallpaper color. + +.. rst-class:: classref-item-separator + +---- + .. _class_DisplayServer_method_screen_get_position: .. rst-class:: classref-method @@ -2765,7 +2821,7 @@ Sets the ``screen``'s ``orientation``. See also :ref:`screen_get_orientation` image **)** -Sets the window icon (usually displayed in the top-left corner) in the operating system's *native* format. To use icons in the operating system's native format, use :ref:`set_native_icon` instead. +Sets the window icon (usually displayed in the top-left corner) with an :ref:`Image`. To use icons in the operating system's native format, use :ref:`set_native_icon` instead. .. rst-class:: classref-item-separator @@ -2855,7 +2911,7 @@ Each :ref:`Dictionary` contains two :ref:`String - ``language`` is language code in ``lang_Variant`` format. ``lang`` part is a 2 or 3-letter code based on the ISO-639 standard, in lowercase. And ``Variant`` part is an engine dependent string describing country, region or/and dialect. -Note that Godot depends on system libraries for text-to-speech functionality. These libraries are installed by default on Windows and MacOS, but not on all Linux distributions. If they are not present, this method will return an empty list. This applies to both Godot users on Linux, as well as end-users on Linux running Godot games that use text-to-speech. +Note that Godot depends on system libraries for text-to-speech functionality. These libraries are installed by default on Windows and macOS, but not on all Linux distributions. If they are not present, this method will return an empty list. This applies to both Godot users on Linux, as well as end-users on Linux running Godot games that use text-to-speech. \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. @@ -2941,9 +2997,9 @@ void **tts_set_utterance_callback** **(** :ref:`TTSUtteranceEvent`, :ref:`TTS_UTTERANCE_ENDED`, and :ref:`TTS_UTTERANCE_CANCELED` callable's method should take one :ref:`int` parameter, the utterance id. +- :ref:`TTS_UTTERANCE_STARTED`, :ref:`TTS_UTTERANCE_ENDED`, and :ref:`TTS_UTTERANCE_CANCELED` callable's method should take one :ref:`int` parameter, the utterance ID. -- :ref:`TTS_UTTERANCE_BOUNDARY` callable's method should take two :ref:`int` parameters, the index of the character and the utterance id. +- :ref:`TTS_UTTERANCE_BOUNDARY` callable's method should take two :ref:`int` parameters, the index of the character and the utterance ID. \ **Note:** The granularity of the boundary callbacks is engine dependent. diff --git a/classes/class_dtlsserver.rst b/classes/class_dtlsserver.rst index c888ec296f5..69da23ef98b 100644 --- a/classes/class_dtlsserver.rst +++ b/classes/class_dtlsserver.rst @@ -43,8 +43,8 @@ Below a small example of how to use it: func _process(delta): while server.is_connection_available(): - var peer : PacketPeerUDP = server.take_connection() - var dtls_peer : PacketPeerDTLS = dtls.take_connection(peer) + var peer: PacketPeerUDP = server.take_connection() + var dtls_peer: PacketPeerDTLS = dtls.take_connection(peer) if dtls_peer.get_status() != PacketPeerDTLS.STATUS_HANDSHAKING: continue # It is normal that 50% of the connections fails due to cookie exchange. print("Peer connected!") @@ -55,7 +55,7 @@ Below a small example of how to use it: if p.get_status() == PacketPeerDTLS.STATUS_CONNECTED: while p.get_available_packet_count() > 0: print("Received message from client: %s" % p.get_packet().get_string_from_utf8()) - p.put_packet("Hello DTLS client".to_utf8()) + p.put_packet("Hello DTLS client".to_utf8_buffer()) .. code-tab:: csharp @@ -98,7 +98,7 @@ Below a small example of how to use it: while (p.GetAvailablePacketCount() > 0) { GD.Print($"Received Message From Client: {p.GetPacket().GetStringFromUtf8()}"); - p.PutPacket("Hello DTLS Client".ToUtf8()); + p.PutPacket("Hello DTLS Client".ToUtf8Buffer()); } } } @@ -128,7 +128,7 @@ Below a small example of how to use it: if dtls.get_status() == PacketPeerDTLS.STATUS_CONNECTED: if !connected: # Try to contact server - dtls.put_packet("The answer is... 42!".to_utf8()) + dtls.put_packet("The answer is... 42!".to_utf8_buffer()) while dtls.get_available_packet_count() > 0: print("Connected: %s" % dtls.get_packet().get_string_from_utf8()) connected = true @@ -159,7 +159,7 @@ Below a small example of how to use it: if (!_connected) { // Try to contact server - _dtls.PutPacket("The Answer Is..42!".ToUtf8()); + _dtls.PutPacket("The Answer Is..42!".ToUtf8Buffer()); } while (_dtls.GetAvailablePacketCount() > 0) { diff --git a/classes/class_editorexportplatform.rst b/classes/class_editorexportplatform.rst index 3cabea5eb6d..3a1d5f211ca 100644 --- a/classes/class_editorexportplatform.rst +++ b/classes/class_editorexportplatform.rst @@ -12,6 +12,8 @@ EditorExportPlatform **Inherits:** :ref:`RefCounted` **<** :ref:`Object` +**Inherited By:** :ref:`EditorExportPlatformAndroid`, :ref:`EditorExportPlatformIOS`, :ref:`EditorExportPlatformMacOS`, :ref:`EditorExportPlatformPC`, :ref:`EditorExportPlatformWeb` + Identifies a supported export platform, and internally provides the functionality of exporting to that platform. .. rst-class:: classref-introduction-group diff --git a/classes/class_editorexportplatformandroid.rst b/classes/class_editorexportplatformandroid.rst new file mode 100644 index 00000000000..fd08af73397 --- /dev/null +++ b/classes/class_editorexportplatformandroid.rst @@ -0,0 +1,2720 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/platform/android/doc_classes/EditorExportPlatformAndroid.xml. + +.. _class_EditorExportPlatformAndroid: + +EditorExportPlatformAndroid +=========================== + +**Inherits:** :ref:`EditorExportPlatform` **<** :ref:`RefCounted` **<** :ref:`Object` + +Exporter for Android. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Exporting for Android <../tutorials/export/exporting_for_android>` + +- :doc:`Custom builds for Android <../tutorials/export/android_custom_build>` + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`apk_expansion/SALT` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`apk_expansion/enable` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`apk_expansion/public_key` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`architectures/arm64-v8a` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`architectures/armeabi-v7a` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`architectures/x86` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`architectures/x86_64` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`command_line/extra_args` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/debug` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/release` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`gradle_build/export_format` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`gradle_build/min_sdk` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`gradle_build/target_sdk` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`gradle_build/use_gradle_build` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`graphics/opengl_debug` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`keystore/debug` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`keystore/debug_password` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`keystore/debug_user` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`keystore/release` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`keystore/release_password` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`keystore/release_user` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`launcher_icons/adaptive_background_432x432` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`launcher_icons/adaptive_foreground_432x432` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`launcher_icons/main_192x192` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`package/app_category` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`package/exclude_from_recents` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`package/name` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`package/retain_data_on_uninstall` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`package/signed` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`package/unique_name` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_checkin_properties` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_coarse_location` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_fine_location` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_location_extra_commands` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_mock_location` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_network_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_surface_flinger` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/access_wifi_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/account_manager` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/add_voicemail` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/authenticate_accounts` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/battery_stats` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_accessibility_service` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_appwidget` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_device_admin` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_input_method` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_nfc_service` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_notification_listener_service` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_print_service` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_remoteviews` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_text_service` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_vpn_service` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bind_wallpaper` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bluetooth` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bluetooth_admin` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/bluetooth_privileged` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/brick` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/broadcast_package_removed` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/broadcast_sms` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/broadcast_sticky` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/broadcast_wap_push` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/call_phone` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/call_privileged` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/camera` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/capture_audio_output` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/capture_secure_video_output` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/capture_video_output` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/change_component_enabled_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/change_configuration` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/change_network_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/change_wifi_multicast_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/change_wifi_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/clear_app_cache` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/clear_app_user_data` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/control_location_updates` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedStringArray` | :ref:`permissions/custom_permissions` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/delete_cache_files` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/delete_packages` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/device_power` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/diagnostic` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/disable_keyguard` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/dump` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/expand_status_bar` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/factory_test` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/flashlight` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/force_back` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/get_accounts` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/get_package_size` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/get_tasks` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/get_top_activity_info` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/global_search` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/hardware_test` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/inject_events` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/install_location_provider` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/install_packages` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/install_shortcut` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/internal_system_window` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/internet` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/kill_background_processes` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/location_hardware` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/manage_accounts` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/manage_app_tokens` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/manage_documents` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/manage_external_storage` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/master_clear` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/media_content_control` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/modify_audio_settings` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/modify_phone_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/mount_format_filesystems` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/mount_unmount_filesystems` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/nfc` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/persistent_activity` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/process_outgoing_calls` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_calendar` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_call_log` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_contacts` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_external_storage` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_frame_buffer` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_history_bookmarks` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_input_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_logs` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_phone_state` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_profile` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_sms` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_social_stream` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_sync_settings` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_sync_stats` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/read_user_dictionary` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/reboot` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/receive_boot_completed` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/receive_mms` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/receive_sms` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/receive_wap_push` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/record_audio` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/reorder_tasks` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/restart_packages` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/send_respond_via_message` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/send_sms` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_activity_watcher` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_alarm` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_always_finish` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_animation_scale` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_debug_app` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_orientation` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_pointer_speed` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_preferred_applications` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_process_limit` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_time` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_time_zone` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_wallpaper` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/set_wallpaper_hints` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/signal_persistent_processes` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/status_bar` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/subscribed_feeds_read` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/subscribed_feeds_write` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/system_alert_window` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/transmit_ir` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/uninstall_shortcut` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/update_device_stats` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/use_credentials` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/use_sip` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/vibrate` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/wake_lock` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_apn_settings` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_calendar` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_call_log` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_contacts` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_external_storage` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_gservices` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_history_bookmarks` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_profile` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_secure_settings` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_settings` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_sms` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_social_stream` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_sync_settings` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`permissions/write_user_dictionary` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`screen/immersive_mode` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`screen/support_large` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`screen/support_normal` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`screen/support_small` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`screen/support_xlarge` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`user_data_backup/allow` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`version/code` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`version/name` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`xr_features/hand_tracking` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`xr_features/hand_tracking_frequency` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`xr_features/passthrough` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`xr_features/xr_mode` | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_EditorExportPlatformAndroid_property_apk_expansion/SALT: + +.. rst-class:: classref-property + +:ref:`String` **apk_expansion/SALT** + +Array of random bytes that the licensing Policy uses to create an `Obfuscator `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_apk_expansion/enable: + +.. rst-class:: classref-property + +:ref:`bool` **apk_expansion/enable** + +If ``true``, project resources are stored in the separate APK expansion file, instead APK. + +\ **Note:** APK expansion should be enabled to use PCK encryption. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_apk_expansion/public_key: + +.. rst-class:: classref-property + +:ref:`String` **apk_expansion/public_key** + +Base64 encoded RSA public key for your publisher account, available from the profile page on the "Play Console". + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_architectures/arm64-v8a: + +.. rst-class:: classref-property + +:ref:`bool` **architectures/arm64-v8a** + +If ``true``, ``arm64`` binaries are included into exported project. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_architectures/armeabi-v7a: + +.. rst-class:: classref-property + +:ref:`bool` **architectures/armeabi-v7a** + +If ``true``, ``arm32`` binaries are included into exported project. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_architectures/x86: + +.. rst-class:: classref-property + +:ref:`bool` **architectures/x86** + +If ``true``, ``x86_32`` binaries are included into exported project. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_architectures/x86_64: + +.. rst-class:: classref-property + +:ref:`bool` **architectures/x86_64** + +If ``true``, ``x86_64`` binaries are included into exported project. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_command_line/extra_args: + +.. rst-class:: classref-property + +:ref:`String` **command_line/extra_args** + +A list of additional command line arguments, exported project will receive when started. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_custom_template/debug: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/debug** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_custom_template/release: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/release** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_gradle_build/export_format: + +.. rst-class:: classref-property + +:ref:`int` **gradle_build/export_format** + +Export format for Gradle build. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_gradle_build/min_sdk: + +.. rst-class:: classref-property + +:ref:`String` **gradle_build/min_sdk** + +Minimal Android SDK version for Gradle build. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_gradle_build/target_sdk: + +.. rst-class:: classref-property + +:ref:`String` **gradle_build/target_sdk** + +Target Android SDK version for Gradle build. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_gradle_build/use_gradle_build: + +.. rst-class:: classref-property + +:ref:`bool` **gradle_build/use_gradle_build** + +If ``true``, Gradle build is used instead of pre-built APK. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_graphics/opengl_debug: + +.. rst-class:: classref-property + +:ref:`bool` **graphics/opengl_debug** + +If ``true``, OpenGL ES debug context will be created (additional runtime checking, validation, and logging). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_keystore/debug: + +.. rst-class:: classref-property + +:ref:`String` **keystore/debug** + +Path of the debug keystore file. + +Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_DEBUG_PATH``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_keystore/debug_password: + +.. rst-class:: classref-property + +:ref:`String` **keystore/debug_password** + +Password for the debug keystore file. + +Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_DEBUG_PASSWORD``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_keystore/debug_user: + +.. rst-class:: classref-property + +:ref:`String` **keystore/debug_user** + +User name for the debug keystore file. + +Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_DEBUG_USER``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_keystore/release: + +.. rst-class:: classref-property + +:ref:`String` **keystore/release** + +Path of the release keystore file. + +Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_RELEASE_PATH``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_keystore/release_password: + +.. rst-class:: classref-property + +:ref:`String` **keystore/release_password** + +Password for the release keystore file. + +Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_RELEASE_PASSWORD``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_keystore/release_user: + +.. rst-class:: classref-property + +:ref:`String` **keystore/release_user** + +User name for the release keystore file. + +Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_RELEASE_USER``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_launcher_icons/adaptive_background_432x432: + +.. rst-class:: classref-property + +:ref:`String` **launcher_icons/adaptive_background_432x432** + +Background layer of the application adaptive icon file. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_launcher_icons/adaptive_foreground_432x432: + +.. rst-class:: classref-property + +:ref:`String` **launcher_icons/adaptive_foreground_432x432** + +Foreground layer of the application adaptive icon file. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_launcher_icons/main_192x192: + +.. rst-class:: classref-property + +:ref:`String` **launcher_icons/main_192x192** + +Application icon file. If left empty, project icon is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_package/app_category: + +.. rst-class:: classref-property + +:ref:`int` **package/app_category** + +Application category for the Play Store. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_package/exclude_from_recents: + +.. rst-class:: classref-property + +:ref:`bool` **package/exclude_from_recents** + +If ``true``, task initiated by main activity will be excluded from the list of recently used applications. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_package/name: + +.. rst-class:: classref-property + +:ref:`String` **package/name** + +Name of the application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_package/retain_data_on_uninstall: + +.. rst-class:: classref-property + +:ref:`bool` **package/retain_data_on_uninstall** + +If ``true``, when the user uninstalls an app, a prompt to keep the app's data will be shown. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_package/signed: + +.. rst-class:: classref-property + +:ref:`bool` **package/signed** + +If ``true``, package signing is enabled. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_package/unique_name: + +.. rst-class:: classref-property + +:ref:`String` **package/unique_name** + +Unique application identifier in a reverse-DNS format, can only contain alphanumeric characters (``A-Z``, ``a-z``, and ``0-9``), hyphens (``-``), and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_checkin_properties: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_checkin_properties** + +Allows read/write access to the "properties" table in the checkin database. See `ACCESS_CHECKIN_PROPERTIES `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_coarse_location: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_coarse_location** + +Allows access to the approximate location information. See `ACCESS_COARSE_LOCATION `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_fine_location: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_fine_location** + +Allows access to the precise location information. See `ACCESS_FINE_LOCATION `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_location_extra_commands: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_location_extra_commands** + +Allows access to the extra location provider commands. See `ACCESS_LOCATION_EXTRA_COMMANDS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_mock_location: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_mock_location** + +Allows an application to create mock location providers for testing. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_network_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_network_state** + +Allows access to the information about networks. See `ACCESS_NETWORK_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_surface_flinger: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_surface_flinger** + +Allows an application to use SurfaceFlinger's low level features. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/access_wifi_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/access_wifi_state** + +Allows access to the information about Wi-Fi networks. See `ACCESS_WIFI_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/account_manager: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/account_manager** + +Allows applications to call into AccountAuthenticators. See `ACCOUNT_MANAGER `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/add_voicemail: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/add_voicemail** + +Allows an application to add voicemails into the system. See `ADD_VOICEMAIL `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/authenticate_accounts: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/authenticate_accounts** + +Allows an application to act as an AccountAuthenticator for the AccountManager. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/battery_stats: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/battery_stats** + +Allows an application to collect battery statistics. Sett `BATTERY_STATS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_accessibility_service: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_accessibility_service** + +Must be required by an AccessibilityService, to ensure that only the system can bind to it. See `BIND_ACCESSIBILITY_SERVICE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_appwidget: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_appwidget** + +Allows an application to tell the AppWidget service which application can access AppWidget's data. See `BIND_APPWIDGET `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_device_admin: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_device_admin** + +Must be required by device administration receiver, to ensure that only the system can interact with it. See `BIND_DEVICE_ADMIN `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_input_method: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_input_method** + +Must be required by an InputMethodService, to ensure that only the system can bind to it. See `BIND_INPUT_METHOD `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_nfc_service: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_nfc_service** + +Must be required by a HostApduService or OffHostApduService to ensure that only the system can bind to it. See `BIND_NFC_SERVICE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_notification_listener_service: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_notification_listener_service** + +Must be required by a NotificationListenerService, to ensure that only the system can bind to it. See `BIND_NOTIFICATION_LISTENER_SERVICE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_print_service: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_print_service** + +Must be required by a PrintService, to ensure that only the system can bind to it. See `BIND_PRINT_SERVICE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_remoteviews: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_remoteviews** + +Must be required by a RemoteViewsService, to ensure that only the system can bind to it. See `BIND_REMOTEVIEWS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_text_service: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_text_service** + +Must be required by a TextService (e.g. SpellCheckerService) to ensure that only the system can bind to it. See `BIND_TEXT_SERVICE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_vpn_service: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_vpn_service** + +Must be required by a VpnService, to ensure that only the system can bind to it. See `BIND_VPN_SERVICE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bind_wallpaper: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bind_wallpaper** + +Must be required by a WallpaperService, to ensure that only the system can bind to it. See `BIND_WALLPAPER `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bluetooth: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bluetooth** + +Allows applications to connect to paired bluetooth devices. See `BLUETOOTH `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bluetooth_admin: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bluetooth_admin** + +Allows applications to discover and pair bluetooth devices. See `BLUETOOTH_ADMIN `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/bluetooth_privileged: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/bluetooth_privileged** + +Allows applications to pair bluetooth devices without user interaction, and to allow or disallow phonebook access or message access. See `BLUETOOTH_PRIVILEGED `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/brick: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/brick** + +Required to be able to disable the device (very dangerous!). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/broadcast_package_removed: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/broadcast_package_removed** + +Allows an application to broadcast a notification that an application package has been removed. See `BROADCAST_PACKAGE_REMOVED `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/broadcast_sms: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/broadcast_sms** + +Allows an application to broadcast an SMS receipt notification. See `BROADCAST_SMS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/broadcast_sticky: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/broadcast_sticky** + +Allows an application to broadcast sticky intents. See `BROADCAST_STICKY `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/broadcast_wap_push: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/broadcast_wap_push** + +Allows an application to broadcast a WAP PUSH receipt notification. See `BROADCAST_WAP_PUSH `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/call_phone: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/call_phone** + +Allows an application to initiate a phone call without going through the Dialer user interface. See `CALL_PHONE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/call_privileged: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/call_privileged** + +Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface. See `CALL_PRIVILEGED `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/camera: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/camera** + +Required to be able to access the camera device. See `CAMERA `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/capture_audio_output: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/capture_audio_output** + +Allows an application to capture audio output. See `CAPTURE_AUDIO_OUTPUT `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/capture_secure_video_output: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/capture_secure_video_output** + +Allows an application to capture secure video output. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/capture_video_output: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/capture_video_output** + +Allows an application to capture video output. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/change_component_enabled_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/change_component_enabled_state** + +Allows an application to change whether an application component (other than its own) is enabled or not. See `CHANGE_COMPONENT_ENABLED_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/change_configuration: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/change_configuration** + +Allows an application to modify the current configuration, such as locale. See `CHANGE_CONFIGURATION `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/change_network_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/change_network_state** + +Allows applications to change network connectivity state. See `CHANGE_NETWORK_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/change_wifi_multicast_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/change_wifi_multicast_state** + +Allows applications to enter Wi-Fi Multicast mode. See `CHANGE_WIFI_MULTICAST_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/change_wifi_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/change_wifi_state** + +Allows applications to change Wi-Fi connectivity state. See `CHANGE_WIFI_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/clear_app_cache: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/clear_app_cache** + +Allows an application to clear the caches of all installed applications on the device. See `CLEAR_APP_CACHE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/clear_app_user_data: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/clear_app_user_data** + +Allows an application to clear user data. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/control_location_updates: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/control_location_updates** + +Allows enabling/disabling location update notifications from the radio. See `CONTROL_LOCATION_UPDATES `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/custom_permissions: + +.. rst-class:: classref-property + +:ref:`PackedStringArray` **permissions/custom_permissions** + +Array of custom permission strings. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/delete_cache_files: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/delete_cache_files** + +Deprecated. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/delete_packages: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/delete_packages** + +Allows an application to delete packages. See `DELETE_PACKAGES `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/device_power: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/device_power** + +Allows low-level access to power management. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/diagnostic: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/diagnostic** + +Allows applications to RW to diagnostic resources. See `DIAGNOSTIC `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/disable_keyguard: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/disable_keyguard** + +Allows applications to disable the keyguard if it is not secure. See `DISABLE_KEYGUARD `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/dump: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/dump** + +Allows an application to retrieve state dump information from system services. See `DUMP `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/expand_status_bar: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/expand_status_bar** + +Allows an application to expand or collapse the status bar. See `EXPAND_STATUS_BAR `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/factory_test: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/factory_test** + +Run as a manufacturer test application, running as the root user. See `FACTORY_TEST `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/flashlight: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/flashlight** + +Allows access to the flashlight. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/force_back: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/force_back** + +Allows an application to force a BACK operation on whatever is the top activity. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/get_accounts: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/get_accounts** + +Allows access to the list of accounts in the Accounts Service. See `GET_ACCOUNTS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/get_package_size: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/get_package_size** + +Allows an application to find out the space used by any package. See `GET_PACKAGE_SIZE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/get_tasks: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/get_tasks** + +Deprecated in API level 21. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/get_top_activity_info: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/get_top_activity_info** + +Allows an application to retrieve private information about the current top activity. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/global_search: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/global_search** + +Used on content providers to allow the global search system to access their data. See `GLOBAL_SEARCH `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/hardware_test: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/hardware_test** + +Allows access to hardware peripherals. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/inject_events: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/inject_events** + +Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/install_location_provider: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/install_location_provider** + +Allows an application to install a location provider into the Location Manager. See `INSTALL_LOCATION_PROVIDER `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/install_packages: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/install_packages** + +Allows an application to install packages. See `INSTALL_PACKAGES `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/install_shortcut: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/install_shortcut** + +Allows an application to install a shortcut in Launcher. See `INSTALL_SHORTCUT `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/internal_system_window: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/internal_system_window** + +Allows an application to open windows that are for use by parts of the system user interface. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/internet: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/internet** + +Allows applications to open network sockets. See `INTERNET `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/kill_background_processes: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/kill_background_processes** + +Allows an application to call ActivityManager.killBackgroundProcesses(String). See `KILL_BACKGROUND_PROCESSES `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/location_hardware: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/location_hardware** + +Allows an application to use location features in hardware, such as the geofencing api. See `LOCATION_HARDWARE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/manage_accounts: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/manage_accounts** + +Allows an application to manage the list of accounts in the AccountManager. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/manage_app_tokens: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/manage_app_tokens** + +Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/manage_documents: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/manage_documents** + +Allows an application to manage access to documents, usually as part of a document picker. See `MANAGE_DOCUMENTS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/manage_external_storage: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/manage_external_storage** + +Allows an application a broad access to external storage in scoped storage. See `MANAGE_EXTERNAL_STORAGE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/master_clear: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/master_clear** + +See `MASTER_CLEAR `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/media_content_control: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/media_content_control** + +Allows an application to know what content is playing and control its playback. See `MEDIA_CONTENT_CONTROL `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/modify_audio_settings: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/modify_audio_settings** + +Allows an application to modify global audio settings. See `MODIFY_AUDIO_SETTINGS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/modify_phone_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/modify_phone_state** + +Allows modification of the telephony state - power on, mmi, etc. Does not include placing calls. See `MODIFY_PHONE_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/mount_format_filesystems: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/mount_format_filesystems** + +Allows formatting file systems for removable storage. See `MOUNT_FORMAT_FILESYSTEMS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/mount_unmount_filesystems: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/mount_unmount_filesystems** + +Allows mounting and unmounting file systems for removable storage. See `MOUNT_UNMOUNT_FILESYSTEMS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/nfc: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/nfc** + +Allows applications to perform I/O operations over NFC. See `NFC `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/persistent_activity: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/persistent_activity** + +Allow an application to make its activities persistent. + +Deprecated in API level 15. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/process_outgoing_calls: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/process_outgoing_calls** + +Allows an application to see the number being dialed during an outgoing call with the option to redirect the call to a different number or abort the call altogether. See `PROCESS_OUTGOING_CALLS `__. + +Deprecated in API level 29. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_calendar: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_calendar** + +Allows an application to read the user's calendar data. See `READ_CALENDAR `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_call_log: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_call_log** + +Allows an application to read the user's call log. See `READ_CALL_LOG `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_contacts: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_contacts** + +Allows an application to read the user's contacts data. See `READ_CONTACTS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_external_storage: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_external_storage** + +Allows an application to read from external storage. See `READ_EXTERNAL_STORAGE `__. + +Deprecated in API level 33. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_frame_buffer: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_frame_buffer** + +Allows an application to take screen shots and more generally get access to the frame buffer data. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_history_bookmarks: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_history_bookmarks** + +Allows an application to read (but not write) the user's browsing history and bookmarks. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_input_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_input_state** + +Deprecated in API level 16. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_logs: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_logs** + +Allows an application to read the low-level system log files. See `READ_LOGS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_phone_state: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_phone_state** + +Allows read only access to phone state. See `READ_PHONE_STATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_profile: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_profile** + +Allows an application to read the user's personal profile data. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_sms: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_sms** + +Allows an application to read SMS messages. See `READ_SMS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_social_stream: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_social_stream** + +Allows an application to read from the user's social stream. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_sync_settings: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_sync_settings** + +Allows applications to read the sync settings. See `READ_SYNC_SETTINGS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_sync_stats: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_sync_stats** + +Allows applications to read the sync stats. See `READ_SYNC_STATS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/read_user_dictionary: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/read_user_dictionary** + +Allows an application to read the user dictionary. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/reboot: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/reboot** + +Required to be able to reboot the device. See `REBOOT `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/receive_boot_completed: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/receive_boot_completed** + +Allows an application to receive the Intent.ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. See `RECEIVE_BOOT_COMPLETED `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/receive_mms: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/receive_mms** + +Allows an application to monitor incoming MMS messages. See `RECEIVE_MMS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/receive_sms: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/receive_sms** + +Allows an application to receive SMS messages. See `RECEIVE_SMS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/receive_wap_push: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/receive_wap_push** + +Allows an application to receive WAP push messages. See `RECEIVE_WAP_PUSH `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/record_audio: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/record_audio** + +Allows an application to record audio. See `RECORD_AUDIO `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/reorder_tasks: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/reorder_tasks** + +Allows an application to change the Z-order of tasks. See `REORDER_TASKS < https://developer.android.com/reference/android/Manifest.permission#REORDER_TASKS>`__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/restart_packages: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/restart_packages** + +Deprecated in API level 15. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/send_respond_via_message: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/send_respond_via_message** + +Allows an application (Phone) to send a request to other applications to handle the respond-via-message action during incoming calls. See `SEND_RESPOND_VIA_MESSAGE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/send_sms: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/send_sms** + +Allows an application to send SMS messages. See `SEND_SMS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_activity_watcher: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_activity_watcher** + +Allows an application to watch and control how activities are started globally in the system. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_alarm: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_alarm** + +Allows an application to broadcast an Intent to set an alarm for the user. See `SET_ALARM `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_always_finish: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_always_finish** + +Allows an application to control whether activities are immediately finished when put in the background. See `SET_ALWAYS_FINISH `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_animation_scale: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_animation_scale** + +Allows to modify the global animation scaling factor. See `SET_ANIMATION_SCALE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_debug_app: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_debug_app** + +Configure an application for debugging. See `SET_DEBUG_APP `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_orientation: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_orientation** + +Allows low-level access to setting the orientation (actually rotation) of the screen. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_pointer_speed: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_pointer_speed** + +Allows low-level access to setting the pointer speed. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_preferred_applications: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_preferred_applications** + +Deprecated in API level 15. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_process_limit: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_process_limit** + +Allows an application to set the maximum number of (not needed) application processes that can be running. See `SET_PROCESS_LIMIT `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_time: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_time** + +Allows applications to set the system time directly. See `SET_TIME `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_time_zone: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_time_zone** + +Allows applications to set the system time zone directly. See `SET_TIME_ZONE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_wallpaper: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_wallpaper** + +Allows applications to set the wallpaper. See `SET_WALLPAPER `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/set_wallpaper_hints: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/set_wallpaper_hints** + +Allows applications to set the wallpaper hints. See `SET_WALLPAPER_HINTS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/signal_persistent_processes: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/signal_persistent_processes** + +Allow an application to request that a signal be sent to all persistent processes. See `SIGNAL_PERSISTENT_PROCESSES `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/status_bar: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/status_bar** + +Allows an application to open, close, or disable the status bar and its icons. See `STATUS_BAR `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/subscribed_feeds_read: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/subscribed_feeds_read** + +Allows an application to allow access the subscribed feeds ContentProvider. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/subscribed_feeds_write: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/subscribed_feeds_write** + +Deprecated. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/system_alert_window: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/system_alert_window** + +Allows an app to create windows using the type WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, shown on top of all other apps. See `SYSTEM_ALERT_WINDOW `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/transmit_ir: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/transmit_ir** + +Allows using the device's IR transmitter, if available. See `TRANSMIT_IR `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/uninstall_shortcut: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/uninstall_shortcut** + +Deprecated. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/update_device_stats: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/update_device_stats** + +Allows an application to update device statistics. See `UPDATE_DEVICE_STATS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/use_credentials: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/use_credentials** + +Allows an application to request authtokens from the AccountManager. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/use_sip: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/use_sip** + +Allows an application to use SIP service. See `USE_SIP `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/vibrate: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/vibrate** + +Allows access to the vibrator. See `VIBRATE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/wake_lock: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/wake_lock** + +Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming. See `WAKE_LOCK `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_apn_settings: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_apn_settings** + +Allows applications to write the apn settings and read sensitive fields of an existing apn settings like user and password. See `WRITE_APN_SETTINGS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_calendar: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_calendar** + +Allows an application to write the user's calendar data. See `WRITE_CALENDAR `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_call_log: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_call_log** + +Allows an application to write (but not read) the user's call log data. See `WRITE_CALL_LOG `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_contacts: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_contacts** + +Allows an application to write the user's contacts data. See `WRITE_CONTACTS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_external_storage: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_external_storage** + +Allows an application to write to external storage. See `WRITE_EXTERNAL_STORAGE `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_gservices: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_gservices** + +Allows an application to modify the Google service map. See `WRITE_GSERVICES `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_history_bookmarks: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_history_bookmarks** + +Allows an application to write (but not read) the user's browsing history and bookmarks. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_profile: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_profile** + +Allows an application to write (but not read) the user's personal profile data. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_secure_settings: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_secure_settings** + +Allows an application to read or write the secure system settings. See `WRITE_SECURE_SETTINGS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_settings: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_settings** + +Allows an application to read or write the system settings. See `WRITE_SETTINGS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_sms: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_sms** + +Allows an application to write SMS messages. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_social_stream: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_social_stream** + +Allows an application to write (but not read) the user's social stream data. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_sync_settings: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_sync_settings** + +Allows applications to write the sync settings. See `WRITE_SYNC_SETTINGS `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_permissions/write_user_dictionary: + +.. rst-class:: classref-property + +:ref:`bool` **permissions/write_user_dictionary** + +Allows an application to write to the user dictionary. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_screen/immersive_mode: + +.. rst-class:: classref-property + +:ref:`bool` **screen/immersive_mode** + +If ``true``, hides navigation and status bar. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_screen/support_large: + +.. rst-class:: classref-property + +:ref:`bool` **screen/support_large** + +Indicates whether the application supports larger screen form-factors. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_screen/support_normal: + +.. rst-class:: classref-property + +:ref:`bool` **screen/support_normal** + +Indicates whether an application supports the "normal" screen form-factors. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_screen/support_small: + +.. rst-class:: classref-property + +:ref:`bool` **screen/support_small** + +Indicates whether the application supports smaller screen form-factors. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_screen/support_xlarge: + +.. rst-class:: classref-property + +:ref:`bool` **screen/support_xlarge** + +Indicates whether the application supports extra large screen form-factors. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_user_data_backup/allow: + +.. rst-class:: classref-property + +:ref:`bool` **user_data_backup/allow** + +If ``true``, allows the application to participate in the backup and restore infrastructure. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_version/code: + +.. rst-class:: classref-property + +:ref:`int` **version/code** + +Machine-readable application version. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_version/name: + +.. rst-class:: classref-property + +:ref:`String` **version/name** + +Application version visible to the user. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_xr_features/hand_tracking: + +.. rst-class:: classref-property + +:ref:`int` **xr_features/hand_tracking** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_xr_features/hand_tracking_frequency: + +.. rst-class:: classref-property + +:ref:`int` **xr_features/hand_tracking_frequency** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_xr_features/passthrough: + +.. rst-class:: classref-property + +:ref:`int` **xr_features/passthrough** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformAndroid_property_xr_features/xr_mode: + +.. rst-class:: classref-property + +:ref:`int` **xr_features/xr_mode** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_editorexportplatformios.rst b/classes/class_editorexportplatformios.rst new file mode 100644 index 00000000000..6837168aa93 --- /dev/null +++ b/classes/class_editorexportplatformios.rst @@ -0,0 +1,832 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/platform/ios/doc_classes/EditorExportPlatformIOS.xml. + +.. _class_EditorExportPlatformIOS: + +EditorExportPlatformIOS +======================= + +**Inherits:** :ref:`EditorExportPlatform` **<** :ref:`RefCounted` **<** :ref:`Object` + +Exporter for iOS. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Exporting for iOS <../tutorials/export/exporting_for_ios>` + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/app_store_team_id` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/bundle_identifier` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/code_sign_identity_debug` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/code_sign_identity_release` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`application/export_method_debug` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`application/export_method_release` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`application/icon_interpolation` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`application/launch_screens_interpolation` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/provisioning_profile_uuid_debug` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/provisioning_profile_uuid_release` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/short_version` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/signature` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`application/targeted_device_family` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/version` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`architectures/arm64` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`capabilities/access_wifi` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`capabilities/push_notifications` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/debug` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/release` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/app_store_1024x1024` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/ipad_76x76` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/ipad_152x152` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/ipad_167x167` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/iphone_120x120` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/iphone_180x180` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/notification_40x40` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/notification_60x60` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/settings_58x58` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/settings_87x87` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/spotlight_40x40` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`icons/spotlight_80x80` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`landscape_launch_screens/ipad_1024x768` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`landscape_launch_screens/ipad_2048x1536` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`landscape_launch_screens/iphone_2208x1242` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`landscape_launch_screens/iphone_2436x1125` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`portrait_launch_screens/ipad_768x1024` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`portrait_launch_screens/ipad_1536x2048` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`portrait_launch_screens/iphone_640x960` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`portrait_launch_screens/iphone_640x1136` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`portrait_launch_screens/iphone_750x1334` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`portrait_launch_screens/iphone_1125x2436` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`portrait_launch_screens/iphone_1242x2208` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/camera_usage_description` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/camera_usage_description_localized` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/microphone_usage_description` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/microphone_usage_description_localized` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/photolibrary_usage_description` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/photolibrary_usage_description_localized` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`storyboard/custom_bg_color` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`storyboard/custom_image@2x` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`storyboard/custom_image@3x` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`storyboard/image_scale_mode` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`storyboard/use_custom_bg_color` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`storyboard/use_launch_screen_storyboard` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`user_data/accessible_from_files_app` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`user_data/accessible_from_itunes_sharing` | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_EditorExportPlatformIOS_property_application/app_store_team_id: + +.. rst-class:: classref-property + +:ref:`String` **application/app_store_team_id** + +Apple Team ID, unique 10-character string. To locate your Team ID check "Membership details" section in your Apple developer account dashboard, or "Organizational Unit" of your code signing certificate. See `Locate your Team ID `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/bundle_identifier: + +.. rst-class:: classref-property + +:ref:`String` **application/bundle_identifier** + +Unique application identifier in a reverse-DNS format, can only contain alphanumeric characters (``A-Z``, ``a-z``, and ``0-9``), hyphens (``-``), and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/code_sign_identity_debug: + +.. rst-class:: classref-property + +:ref:`String` **application/code_sign_identity_debug** + +The "Full Name", "Common Name" or SHA-1 hash of the signing identity used for debug export. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/code_sign_identity_release: + +.. rst-class:: classref-property + +:ref:`String` **application/code_sign_identity_release** + +The "Full Name", "Common Name" or SHA-1 hash of the signing identity used for release export. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/export_method_debug: + +.. rst-class:: classref-property + +:ref:`int` **application/export_method_debug** + +Application distribution target (debug export). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/export_method_release: + +.. rst-class:: classref-property + +:ref:`int` **application/export_method_release** + +Application distribution target (release export). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/icon_interpolation: + +.. rst-class:: classref-property + +:ref:`int` **application/icon_interpolation** + +Interpolation method used to resize application icon. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/launch_screens_interpolation: + +.. rst-class:: classref-property + +:ref:`int` **application/launch_screens_interpolation** + +Interpolation method used to resize launch screen images. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/provisioning_profile_uuid_debug: + +.. rst-class:: classref-property + +:ref:`String` **application/provisioning_profile_uuid_debug** + +UUID of the provisioning profile. If left empty, Xcode will download or create a provisioning profile automatically. See `Edit, download, or delete provisioning profiles `__. + +Can be overridden with the environment variable ``GODOT_IOS_PROVISIONING_PROFILE_UUID_DEBUG``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/provisioning_profile_uuid_release: + +.. rst-class:: classref-property + +:ref:`String` **application/provisioning_profile_uuid_release** + +UUID of the provisioning profile. If left empty, Xcode will download or create a provisioning profile automatically. See `Edit, download, or delete provisioning profiles `__. + +Can be overridden with the environment variable ``GODOT_IOS_PROVISIONING_PROFILE_UUID_RELEASE``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/short_version: + +.. rst-class:: classref-property + +:ref:`String` **application/short_version** + +Application version visible to the user, can only contain numeric characters (``0-9``) and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/signature: + +.. rst-class:: classref-property + +:ref:`String` **application/signature** + +A four-character creator code that is specific to the bundle. Optional. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/targeted_device_family: + +.. rst-class:: classref-property + +:ref:`int` **application/targeted_device_family** + +Supported device family. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_application/version: + +.. rst-class:: classref-property + +:ref:`String` **application/version** + +Machine-readable application version, in the ``major.minor.patch`` format, can only contain numeric characters (``0-9``) and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_architectures/arm64: + +.. rst-class:: classref-property + +:ref:`bool` **architectures/arm64** + +If ``true``, ``arm64`` binaries are included into exported project. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_capabilities/access_wifi: + +.. rst-class:: classref-property + +:ref:`bool` **capabilities/access_wifi** + +If ``true``, networking features related to Wi-Fi access are enabled. See `Required Device Capabilities `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_capabilities/push_notifications: + +.. rst-class:: classref-property + +:ref:`bool` **capabilities/push_notifications** + +If ``true``, push notifications are enabled. See `Required Device Capabilities `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_custom_template/debug: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/debug** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_custom_template/release: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/release** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/app_store_1024x1024: + +.. rst-class:: classref-property + +:ref:`String` **icons/app_store_1024x1024** + +App Store application icon file. If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/ipad_76x76: + +.. rst-class:: classref-property + +:ref:`String` **icons/ipad_76x76** + +Home screen application icon file on iPad (1x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/ipad_152x152: + +.. rst-class:: classref-property + +:ref:`String` **icons/ipad_152x152** + +Home screen application icon file on iPad (2x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/ipad_167x167: + +.. rst-class:: classref-property + +:ref:`String` **icons/ipad_167x167** + +Home screen application icon file on iPad (3x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/iphone_120x120: + +.. rst-class:: classref-property + +:ref:`String` **icons/iphone_120x120** + +Home screen application icon file on iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/iphone_180x180: + +.. rst-class:: classref-property + +:ref:`String` **icons/iphone_180x180** + +Home screen application icon file on iPhone (3x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/notification_40x40: + +.. rst-class:: classref-property + +:ref:`String` **icons/notification_40x40** + +Notification icon file on iPad and iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/notification_60x60: + +.. rst-class:: classref-property + +:ref:`String` **icons/notification_60x60** + +Notification icon file on iPhone (3x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/settings_58x58: + +.. rst-class:: classref-property + +:ref:`String` **icons/settings_58x58** + +Application settings icon file on iPad and iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/settings_87x87: + +.. rst-class:: classref-property + +:ref:`String` **icons/settings_87x87** + +Application settings icon file on iPhone (3x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/spotlight_40x40: + +.. rst-class:: classref-property + +:ref:`String` **icons/spotlight_40x40** + +Spotlight icon file on iPad (1x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_icons/spotlight_80x80: + +.. rst-class:: classref-property + +:ref:`String` **icons/spotlight_80x80** + +Spotlight icon file on iPad and iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_landscape_launch_screens/ipad_1024x768: + +.. rst-class:: classref-property + +:ref:`String` **landscape_launch_screens/ipad_1024x768** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_landscape_launch_screens/ipad_2048x1536: + +.. rst-class:: classref-property + +:ref:`String` **landscape_launch_screens/ipad_2048x1536** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_landscape_launch_screens/iphone_2208x1242: + +.. rst-class:: classref-property + +:ref:`String` **landscape_launch_screens/iphone_2208x1242** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_landscape_launch_screens/iphone_2436x1125: + +.. rst-class:: classref-property + +:ref:`String` **landscape_launch_screens/iphone_2436x1125** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_portrait_launch_screens/ipad_768x1024: + +.. rst-class:: classref-property + +:ref:`String` **portrait_launch_screens/ipad_768x1024** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_portrait_launch_screens/ipad_1536x2048: + +.. rst-class:: classref-property + +:ref:`String` **portrait_launch_screens/ipad_1536x2048** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_portrait_launch_screens/iphone_640x960: + +.. rst-class:: classref-property + +:ref:`String` **portrait_launch_screens/iphone_640x960** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_portrait_launch_screens/iphone_640x1136: + +.. rst-class:: classref-property + +:ref:`String` **portrait_launch_screens/iphone_640x1136** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_portrait_launch_screens/iphone_750x1334: + +.. rst-class:: classref-property + +:ref:`String` **portrait_launch_screens/iphone_750x1334** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_portrait_launch_screens/iphone_1125x2436: + +.. rst-class:: classref-property + +:ref:`String` **portrait_launch_screens/iphone_1125x2436** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_portrait_launch_screens/iphone_1242x2208: + +.. rst-class:: classref-property + +:ref:`String` **portrait_launch_screens/iphone_1242x2208** + +Application launch screen image file, if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_privacy/camera_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/camera_usage_description** + +A message displayed when requesting access to the device's camera (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_privacy/camera_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/camera_usage_description_localized** + +A message displayed when requesting access to the device's camera (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_privacy/microphone_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/microphone_usage_description** + +A message displayed when requesting access to the device's microphone (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_privacy/microphone_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/microphone_usage_description_localized** + +A message displayed when requesting access to the device's microphone (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_privacy/photolibrary_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/photolibrary_usage_description** + +A message displayed when requesting access to the user's photo library (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_privacy/photolibrary_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/photolibrary_usage_description_localized** + +A message displayed when requesting access to the user's photo library (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_storyboard/custom_bg_color: + +.. rst-class:: classref-property + +:ref:`Color` **storyboard/custom_bg_color** + +A custom background color of the storyboard launch screen. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_storyboard/custom_image@2x: + +.. rst-class:: classref-property + +:ref:`String` **storyboard/custom_image@2x** + +Application launch screen image file (2x DPI), if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_storyboard/custom_image@3x: + +.. rst-class:: classref-property + +:ref:`String` **storyboard/custom_image@3x** + +Application launch screen image file (3x DPI), if left empty project splash screen is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_storyboard/image_scale_mode: + +.. rst-class:: classref-property + +:ref:`int` **storyboard/image_scale_mode** + +Launch screen image scaling mode. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_storyboard/use_custom_bg_color: + +.. rst-class:: classref-property + +:ref:`bool` **storyboard/use_custom_bg_color** + +If ``true``, :ref:`storyboard/custom_bg_color` is used as a launch screen background color, otherwise ``application/boot_splash/bg_color`` project setting is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_storyboard/use_launch_screen_storyboard: + +.. rst-class:: classref-property + +:ref:`bool` **storyboard/use_launch_screen_storyboard** + +If ``true``, storyboard launch screen is used instead of launch screen images. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_user_data/accessible_from_files_app: + +.. rst-class:: classref-property + +:ref:`bool` **user_data/accessible_from_files_app** + +If ``true``, the app "Documents" folder can be accessed via "Files" app. See `LSSupportsOpeningDocumentsInPlace `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformIOS_property_user_data/accessible_from_itunes_sharing: + +.. rst-class:: classref-property + +:ref:`bool` **user_data/accessible_from_itunes_sharing** + +If ``true``, the app "Documents" folder can be accessed via iTunes file sharing. See `UIFileSharingEnabled `__. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_editorexportplatformlinuxbsd.rst b/classes/class_editorexportplatformlinuxbsd.rst new file mode 100644 index 00000000000..e83d1c26ac7 --- /dev/null +++ b/classes/class_editorexportplatformlinuxbsd.rst @@ -0,0 +1,292 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/platform/linuxbsd/doc_classes/EditorExportPlatformLinuxBSD.xml. + +.. _class_EditorExportPlatformLinuxBSD: + +EditorExportPlatformLinuxBSD +============================ + +**Inherits:** :ref:`EditorExportPlatformPC` **<** :ref:`EditorExportPlatform` **<** :ref:`RefCounted` **<** :ref:`Object` + +Exporter for Linux/BSD. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Exporting for Linux <../tutorials/export/exporting_for_linux>` + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`binary_format/architecture` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`binary_format/embed_pck` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/debug` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/release` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`debug/export_console_script` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/cleanup_script` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`ssh_remote_deploy/enabled` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/extra_args_scp` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/extra_args_ssh` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/host` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/port` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/run_script` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/bptc` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/etc` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/etc2` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/s3tc` | + +-----------------------------+-----------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_EditorExportPlatformLinuxBSD_property_binary_format/architecture: + +.. rst-class:: classref-property + +:ref:`String` **binary_format/architecture** + +Application executable architecture. + +Supported architectures: ``x86_32``, ``x86_64``, ``arm64``, ``arm32``, ``rv64``, ``ppc64``, and ``ppc32``. + +Official export templates include ``x86_32`` and ``x86_64`` binaries only. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_binary_format/embed_pck: + +.. rst-class:: classref-property + +:ref:`bool` **binary_format/embed_pck** + +If ``true``, project resources are embedded into the executable. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_custom_template/debug: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/debug** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_custom_template/release: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/release** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_debug/export_console_script: + +.. rst-class:: classref-property + +:ref:`int` **debug/export_console_script** + +If ``true``, a console wrapper script is exported alongside the main executable, which allows running the project with enabled console output. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_ssh_remote_deploy/cleanup_script: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/cleanup_script** + +Script code to execute on the remote host when app is finished. + +The following variables can be used in the script: + +- ``{temp_dir}`` - Path of temporary folder on the remote, used to upload app and scripts to. + +- ``{archive_name}`` - Name of the ZIP containing uploaded application. + +- ``{exe_name}`` - Name of application executable. + +- ``{cmd_args}`` - Array of the command line argument for the application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_ssh_remote_deploy/enabled: + +.. rst-class:: classref-property + +:ref:`bool` **ssh_remote_deploy/enabled** + +Enables remote deploy using SSH/SCP. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_ssh_remote_deploy/extra_args_scp: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/extra_args_scp** + +Array of the additional command line arguments passed to the SCP. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_ssh_remote_deploy/extra_args_ssh: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/extra_args_ssh** + +Array of the additional command line arguments passed to the SSH. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_ssh_remote_deploy/host: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/host** + +Remote host SSH user name and address, in ``user@address`` format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_ssh_remote_deploy/port: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/port** + +Remote host SSH port number. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_ssh_remote_deploy/run_script: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/run_script** + +Script code to execute on the remote host when running the app. + +The following variables can be used in the script: + +- ``{temp_dir}`` - Path of temporary folder on the remote, used to upload app and scripts to. + +- ``{archive_name}`` - Name of the ZIP containing uploaded application. + +- ``{exe_name}`` - Name of application executable. + +- ``{cmd_args}`` - Array of the command line argument for the application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_texture_format/bptc: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/bptc** + +If ``true``, project textures are exported in the BPTC format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_texture_format/etc: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/etc** + +If ``true``, project textures are exported in the ETC format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_texture_format/etc2: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/etc2** + +If ``true``, project textures are exported in the ETC2 format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformLinuxBSD_property_texture_format/s3tc: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/s3tc** + +If ``true``, project textures are exported in the S3TC format. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_editorexportplatformmacos.rst b/classes/class_editorexportplatformmacos.rst new file mode 100644 index 00000000000..d41515b74c3 --- /dev/null +++ b/classes/class_editorexportplatformmacos.rst @@ -0,0 +1,1320 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/platform/macos/doc_classes/EditorExportPlatformMacOS.xml. + +.. _class_EditorExportPlatformMacOS: + +EditorExportPlatformMacOS +========================= + +**Inherits:** :ref:`EditorExportPlatform` **<** :ref:`RefCounted` **<** :ref:`Object` + +Exporter for macOS. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Exporting for macOS <../tutorials/export/exporting_for_macos>` + +- :doc:`Running Godot apps on macOS <../tutorials//export/running_on_macos>` + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/app_category` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/bundle_identifier` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/copyright` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`application/copyright_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/icon` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`application/icon_interpolation` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/min_macos_version` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/short_version` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/signature` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/version` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`binary_format/architecture` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/apple_team_id` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/certificate_file` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/certificate_password` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`codesign/codesign` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedStringArray` | :ref:`codesign/custom_options` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/address_book` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/allow_dyld_environment_variables` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/allow_jit_code_execution` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/allow_unsigned_executable_memory` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/app_sandbox/device_bluetooth` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/app_sandbox/device_usb` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/app_sandbox/enabled` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`codesign/entitlements/app_sandbox/files_downloads` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`codesign/entitlements/app_sandbox/files_movies` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`codesign/entitlements/app_sandbox/files_music` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`codesign/entitlements/app_sandbox/files_pictures` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array` | :ref:`codesign/entitlements/app_sandbox/helper_executables` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/app_sandbox/network_client` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/app_sandbox/network_server` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/apple_events` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/audio_input` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/calendars` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/camera` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/entitlements/custom_file` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/debugging` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/disable_library_validation` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/location` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/entitlements/photos_library` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/identity` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/installer_identity` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/provisioning_profile` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/debug` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/release` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`debug/export_console_script` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`display/high_res` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`export/distribution_type` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`notarization/api_key` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`notarization/api_key_id` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`notarization/api_uuid` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`notarization/apple_id_name` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`notarization/apple_id_password` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`notarization/notarization` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/address_book_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/address_book_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/calendar_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/calendar_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/camera_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/camera_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/desktop_folder_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/desktop_folder_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/documents_folder_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/documents_folder_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/downloads_folder_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/downloads_folder_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/location_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/location_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/microphone_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/microphone_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/network_volumes_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/network_volumes_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/photos_library_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/photos_library_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`privacy/removable_volumes_usage_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`privacy/removable_volumes_usage_description_localized` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/cleanup_script` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`ssh_remote_deploy/enabled` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/extra_args_scp` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/extra_args_ssh` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/host` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/port` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/run_script` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`xcode/platform_build` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`xcode/sdk_build` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`xcode/sdk_name` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`xcode/sdk_version` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`xcode/xcode_build` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`xcode/xcode_version` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_EditorExportPlatformMacOS_property_application/app_category: + +.. rst-class:: classref-property + +:ref:`String` **application/app_category** + +Application category for the App Store. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/bundle_identifier: + +.. rst-class:: classref-property + +:ref:`String` **application/bundle_identifier** + +Unique application identifier in a reverse-DNS format, can only contain alphanumeric characters (``A-Z``, ``a-z``, and ``0-9``), hyphens (``-``), and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/copyright: + +.. rst-class:: classref-property + +:ref:`String` **application/copyright** + +Copyright notice for the bundle visible to the user (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/copyright_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **application/copyright_localized** + +Copyright notice for the bundle visible to the user (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/icon: + +.. rst-class:: classref-property + +:ref:`String` **application/icon** + +Application icon file. If left empty, project icon is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/icon_interpolation: + +.. rst-class:: classref-property + +:ref:`int` **application/icon_interpolation** + +Interpolation method used to resize application icon. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/min_macos_version: + +.. rst-class:: classref-property + +:ref:`String` **application/min_macos_version** + +Minimum version of macOS required for this application to run in the ``major.minor.patch`` or ``major.minor`` format, can only contain numeric characters (``0-9``) and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/short_version: + +.. rst-class:: classref-property + +:ref:`String` **application/short_version** + +Application version visible to the user, can only contain numeric characters (``0-9``) and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/signature: + +.. rst-class:: classref-property + +:ref:`String` **application/signature** + +A four-character creator code that is specific to the bundle. Optional. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_application/version: + +.. rst-class:: classref-property + +:ref:`String` **application/version** + +Machine-readable application version, in the ``major.minor.patch`` format, can only contain numeric characters (``0-9``) and periods (``.``). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_binary_format/architecture: + +.. rst-class:: classref-property + +:ref:`String` **binary_format/architecture** + +Application executable architecture. + +Supported architectures: ``x86_64``, ``arm64``, and ``universal`` (``x86_64 + arm64``). + +Official export templates include ``universal`` binaries only. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/apple_team_id: + +.. rst-class:: classref-property + +:ref:`String` **codesign/apple_team_id** + +Apple Team ID, unique 10-character string. To locate your Team ID check "Membership details" section in your Apple developer account dashboard, or "Organizational Unit" of your code signing certificate. See `Locate your Team ID `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/certificate_file: + +.. rst-class:: classref-property + +:ref:`String` **codesign/certificate_file** + +PKCS #12 certificate file used to sign ``.app`` bundle. + +Can be overridden with the environment variable ``GODOT_MACOS_CODESIGN_CERTIFICATE_FILE``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/certificate_password: + +.. rst-class:: classref-property + +:ref:`String` **codesign/certificate_password** + +Password for the certificate file used to sign ``.app`` bundle. + +Can be overridden with the environment variable ``GODOT_MACOS_CODESIGN_CERTIFICATE_PASSWORD``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/codesign: + +.. rst-class:: classref-property + +:ref:`int` **codesign/codesign** + +Tool to use for code signing. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/custom_options: + +.. rst-class:: classref-property + +:ref:`PackedStringArray` **codesign/custom_options** + +Array of the additional command line arguments passed to the code signing tool. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/address_book: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/address_book** + +Enable to allow access to contacts in the user's address book, if it's enabled you should also provide usage message in the ``privacy/address_book_usage_description`` option. See `com.apple.security.personal-information.addressbook `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/allow_dyld_environment_variables: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/allow_dyld_environment_variables** + +Allows app to use dynamic linker environment variables to inject code. If you are using add-ons with dynamic or self-modifying native code, enable them according to the add-on documentation. See `com.apple.security.cs.allow-dyld-environment-variables `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/allow_jit_code_execution: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/allow_jit_code_execution** + +Allows creating writable and executable memory for JIT code. If you are using add-ons with dynamic or self-modifying native code, enable them according to the add-on documentation. See `com.apple.security.cs.allow-jit `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/allow_unsigned_executable_memory: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/allow_unsigned_executable_memory** + +Allows creating writable and executable memory without JIT restrictions. If you are using add-ons with dynamic or self-modifying native code, enable them according to the add-on documentation. See `com.apple.security.cs.allow-unsigned-executable-memory `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/device_bluetooth: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/app_sandbox/device_bluetooth** + +Enable to allow app to interact with Bluetooth devices. This entitlement is required to use wireless controllers. See `com.apple.security.device.bluetooth `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/device_usb: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/app_sandbox/device_usb** + +Enable to allow app to interact with USB devices. This entitlement is required to use wired controllers. See `com.apple.security.device.usb `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/enabled: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/app_sandbox/enabled** + +Enables App Sandbox. The App Sandbox restricts access to user data, networking, and devices. Sandboxed apps can't access most of the file system, can't use custom file dialogs and execute binaries outside the .app bundle. See `App Sandbox `__. + +\ **Note:** To distribute an app through the App Store, you must enable the App Sandbox. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/files_downloads: + +.. rst-class:: classref-property + +:ref:`int` **codesign/entitlements/app_sandbox/files_downloads** + +Allows read or write access to the user's "Downloads" folder. See `com.apple.security.files.downloads.read-write `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/files_movies: + +.. rst-class:: classref-property + +:ref:`int` **codesign/entitlements/app_sandbox/files_movies** + +Allows read or write access to the user's "Movies" folder. See `com.apple.security.files.movies.read-write `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/files_music: + +.. rst-class:: classref-property + +:ref:`int` **codesign/entitlements/app_sandbox/files_music** + +Allows read or write access to the user's "Music" folder. See `com.apple.security.files.music.read-write `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/files_pictures: + +.. rst-class:: classref-property + +:ref:`int` **codesign/entitlements/app_sandbox/files_pictures** + +Allows read or write access to the user's "Pictures" folder. See `com.apple.security.files.pictures.read-write `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/helper_executables: + +.. rst-class:: classref-property + +:ref:`Array` **codesign/entitlements/app_sandbox/helper_executables** + +List of helper executables to embedded to the app bundle. Sandboxed app are limited to execute only these executable. See `Embedding a command-line tool in a sandboxed app `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/network_client: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/app_sandbox/network_client** + +Enable to allow app to establish outgoing network connections. See `com.apple.security.network.client `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/app_sandbox/network_server: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/app_sandbox/network_server** + +Enable to allow app to listen for incoming network connections. See `com.apple.security.network.server `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/apple_events: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/apple_events** + +Enable to allow app to send Apple events to other apps. See `com.apple.security.automation.apple-events `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/audio_input: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/audio_input** + +Enable if you need to use the microphone or other audio input sources, if it's enabled you should also provide usage message in the ``privacy/microphone_usage_description`` option. See `com.apple.security.device.audio-input `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/calendars: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/calendars** + +Enable to allow access to the user's calendar, if it's enabled you should also provide usage message in the ``privacy/calendar_usage_description`` option. See `com.apple.security.personal-information.calendars `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/camera: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/camera** + +Enable if you need to use the camera, if it's enabled you should also provide usage message in the ``privacy/camera_usage_description`` option. See `com.apple.security.device.camera `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/custom_file: + +.. rst-class:: classref-property + +:ref:`String` **codesign/entitlements/custom_file** + +Custom entitlements ``.plist`` file, if specified the rest of entitlements in the export config are ignored. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/debugging: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/debugging** + +You can temporarily enable this entitlement to use native debugger (GDB, LLDB) with the exported app. This entitlement should be disabled for production export. See `Embedding a command-line tool in a sandboxed app `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/disable_library_validation: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/disable_library_validation** + +Allows app to load arbitrary libraries and frameworks (not signed with the same Team ID as the main executable or by Apple). Enable it if you are using GDExtension add-ons or ad-hoc signing, or want to support user-provided external add-ons. See `com.apple.security.cs.disable-library-validation `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/location: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/location** + +Enable if you need to use location information from Location Services, if it's enabled you should also provide usage message in the ``privacy/location_usage_description`` option. See `com.apple.security.personal-information.location `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/entitlements/photos_library: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/entitlements/photos_library** + +Enable to allow access to the user's Photos library, if it's enabled you should also provide usage message in the ``privacy/photos_library_usage_description`` option. See `com.apple.security.personal-information.photos-library `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/identity: + +.. rst-class:: classref-property + +:ref:`String` **codesign/identity** + +The "Full Name", "Common Name" or SHA-1 hash of the signing identity used to sign ``.app`` bundle. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/installer_identity: + +.. rst-class:: classref-property + +:ref:`String` **codesign/installer_identity** + +The "Full Name", "Common Name" or SHA-1 hash of the signing identity used to sign ``.pkg`` installer package for App Store distribution, use ``3rd Party Mac Developer Installer: Name.`` identity. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_codesign/provisioning_profile: + +.. rst-class:: classref-property + +:ref:`String` **codesign/provisioning_profile** + +Provisioning profile file downloaded from Apple developer account dashboard. See `Edit, download, or delete provisioning profiles `__. + +Can be overridden with the environment variable ``GODOT_MACOS_CODESIGN_PROVISIONING_PROFILE``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_custom_template/debug: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/debug** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_custom_template/release: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/release** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_debug/export_console_script: + +.. rst-class:: classref-property + +:ref:`int` **debug/export_console_script** + +If enabled, a script file that can be used to run the application with console output is created alongside the exported application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_display/high_res: + +.. rst-class:: classref-property + +:ref:`bool` **display/high_res** + +If ``true``, the application is rendered at native display resolution, otherwise it is always rendered at loHPI resolution and upscaled by OS when required. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_export/distribution_type: + +.. rst-class:: classref-property + +:ref:`int` **export/distribution_type** + +Application distribution target. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_notarization/api_key: + +.. rst-class:: classref-property + +:ref:`String` **notarization/api_key** + +Apple App Store Connect API issuer key file. + +Can be overridden with the environment variable ``GODOT_MACOS_NOTARIZATION_API_KEY``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_notarization/api_key_id: + +.. rst-class:: classref-property + +:ref:`String` **notarization/api_key_id** + +Apple App Store Connect API issuer key ID. + +Can be overridden with the environment variable ``GODOT_MACOS_NOTARIZATION_API_KEY_ID``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_notarization/api_uuid: + +.. rst-class:: classref-property + +:ref:`String` **notarization/api_uuid** + +Apple App Store Connect API issuer UUID. + +Can be overridden with the environment variable ``GODOT_MACOS_NOTARIZATION_API_UUID``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_notarization/apple_id_name: + +.. rst-class:: classref-property + +:ref:`String` **notarization/apple_id_name** + +Apple ID account name (email address). + +Can be overridden with the environment variable ``GODOT_MACOS_NOTARIZATION_APPLE_ID_NAME``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_notarization/apple_id_password: + +.. rst-class:: classref-property + +:ref:`String` **notarization/apple_id_password** + +Apple ID app-specific password. + +Can be overridden with the environment variable ``GODOT_MACOS_NOTARIZATION_APPLE_ID_PASSWORD``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_notarization/notarization: + +.. rst-class:: classref-property + +:ref:`int` **notarization/notarization** + +Tool to use for notarization. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/address_book_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/address_book_usage_description** + +A message displayed when requesting access to the user's contacts (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/address_book_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/address_book_usage_description_localized** + +A message displayed when requesting access to the user's contacts (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/calendar_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/calendar_usage_description** + +A message displayed when requesting access to the user's calendar data (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/calendar_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/calendar_usage_description_localized** + +A message displayed when requesting access to the user's calendar data (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/camera_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/camera_usage_description** + +A message displayed when requesting access to the device's camera (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/camera_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/camera_usage_description_localized** + +A message displayed when requesting access to the device's camera (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/desktop_folder_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/desktop_folder_usage_description** + +A message displayed when requesting access to the user's "Desktop" folder (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/desktop_folder_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/desktop_folder_usage_description_localized** + +A message displayed when requesting access to the user's "Desktop" folder (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/documents_folder_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/documents_folder_usage_description** + +A message displayed when requesting access to the user's "Documents" folder (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/documents_folder_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/documents_folder_usage_description_localized** + +A message displayed when requesting access to the user's "Documents" folder (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/downloads_folder_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/downloads_folder_usage_description** + +A message displayed when requesting access to the user's "Downloads" folder (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/downloads_folder_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/downloads_folder_usage_description_localized** + +A message displayed when requesting access to the user's "Downloads" folder (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/location_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/location_usage_description** + +A message displayed when requesting access to the user's location information (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/location_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/location_usage_description_localized** + +A message displayed when requesting access to the user's location information (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/microphone_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/microphone_usage_description** + +A message displayed when requesting access to the device's microphone (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/microphone_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/microphone_usage_description_localized** + +A message displayed when requesting access to the device's microphone (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/network_volumes_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/network_volumes_usage_description** + +A message displayed when requesting access to the user's network drives (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/network_volumes_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/network_volumes_usage_description_localized** + +A message displayed when requesting access to the user's network drives (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/photos_library_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/photos_library_usage_description** + +A message displayed when requesting access to the user's photo library (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/photos_library_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/photos_library_usage_description_localized** + +A message displayed when requesting access to the user's photo library (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/removable_volumes_usage_description: + +.. rst-class:: classref-property + +:ref:`String` **privacy/removable_volumes_usage_description** + +A message displayed when requesting access to the user's removable drives (in English). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_privacy/removable_volumes_usage_description_localized: + +.. rst-class:: classref-property + +:ref:`Dictionary` **privacy/removable_volumes_usage_description_localized** + +A message displayed when requesting access to the user's removable drives (localized). + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_ssh_remote_deploy/cleanup_script: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/cleanup_script** + +Script code to execute on the remote host when app is finished. + +The following variables can be used in the script: + +- ``{temp_dir}`` - Path of temporary folder on the remote, used to upload app and scripts to. + +- ``{archive_name}`` - Name of the ZIP containing uploaded application. + +- ``{exe_name}`` - Name of application executable. + +- ``{cmd_args}`` - Array of the command line argument for the application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_ssh_remote_deploy/enabled: + +.. rst-class:: classref-property + +:ref:`bool` **ssh_remote_deploy/enabled** + +Enables remote deploy using SSH/SCP. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_ssh_remote_deploy/extra_args_scp: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/extra_args_scp** + +Array of the additional command line arguments passed to the SCP. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_ssh_remote_deploy/extra_args_ssh: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/extra_args_ssh** + +Array of the additional command line arguments passed to the SSH. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_ssh_remote_deploy/host: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/host** + +Remote host SSH user name and address, in ``user@address`` format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_ssh_remote_deploy/port: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/port** + +Remote host SSH port number. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_ssh_remote_deploy/run_script: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/run_script** + +Script code to execute on the remote host when running the app. + +The following variables can be used in the script: + +- ``{temp_dir}`` - Path of temporary folder on the remote, used to upload app and scripts to. + +- ``{archive_name}`` - Name of the ZIP containing uploaded application. + +- ``{exe_name}`` - Name of application executable. + +- ``{cmd_args}`` - Array of the command line argument for the application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_xcode/platform_build: + +.. rst-class:: classref-property + +:ref:`String` **xcode/platform_build** + +macOS build number used to build application executable. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_xcode/sdk_build: + +.. rst-class:: classref-property + +:ref:`String` **xcode/sdk_build** + +macOS SDK build number used to build application executable. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_xcode/sdk_name: + +.. rst-class:: classref-property + +:ref:`String` **xcode/sdk_name** + +macOS SDK name used to build application executable. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_xcode/sdk_version: + +.. rst-class:: classref-property + +:ref:`String` **xcode/sdk_version** + +macOS SDK version used to build application executable in the ``major.minor`` format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_xcode/xcode_build: + +.. rst-class:: classref-property + +:ref:`String` **xcode/xcode_build** + +Xcode build number used to build application executable. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformMacOS_property_xcode/xcode_version: + +.. rst-class:: classref-property + +:ref:`String` **xcode/xcode_version** + +Xcode version used to build application executable. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_animationtrackeditplugin.rst b/classes/class_editorexportplatformpc.rst similarity index 66% rename from classes/class_animationtrackeditplugin.rst rename to classes/class_editorexportplatformpc.rst index 591ceec66e3..1e5bbfb0ec0 100644 --- a/classes/class_animationtrackeditplugin.rst +++ b/classes/class_editorexportplatformpc.rst @@ -3,18 +3,18 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. .. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/doc/classes/AnimationTrackEditPlugin.xml. +.. XML source: https://github.com/godotengine/godot/tree/master/doc/classes/EditorExportPlatformPC.xml. -.. _class_AnimationTrackEditPlugin: +.. _class_EditorExportPlatformPC: -AnimationTrackEditPlugin -======================== +EditorExportPlatformPC +====================== -**Inherits:** :ref:`RefCounted` **<** :ref:`Object` +**Inherits:** :ref:`EditorExportPlatform` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +**Inherited By:** :ref:`EditorExportPlatformLinuxBSD`, :ref:`EditorExportPlatformWindows` - There is currently no description for this class. Please help us by :ref:`contributing one `! +Base class for the desktop platform exporter (Windows and Linux/BSD). .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_editorexportplatformweb.rst b/classes/class_editorexportplatformweb.rst new file mode 100644 index 00000000000..a9833091c66 --- /dev/null +++ b/classes/class_editorexportplatformweb.rst @@ -0,0 +1,342 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/platform/web/doc_classes/EditorExportPlatformWeb.xml. + +.. _class_EditorExportPlatformWeb: + +EditorExportPlatformWeb +======================= + +**Inherits:** :ref:`EditorExportPlatform` **<** :ref:`RefCounted` **<** :ref:`Object` + +Exporter for the Web. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Exporting for the Web <../tutorials/export/exporting_for_web>` + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/debug` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/release` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`html/canvas_resize_policy` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`html/custom_html_shell` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`html/experimental_virtual_keyboard` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`html/export_icon` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`html/focus_canvas_on_start` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`html/head_include` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`progressive_web_app/background_color` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`progressive_web_app/display` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`progressive_web_app/enabled` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`progressive_web_app/icon_144x144` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`progressive_web_app/icon_180x180` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`progressive_web_app/icon_512x512` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`progressive_web_app/offline_page` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`progressive_web_app/orientation` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`variant/extensions_support` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`vram_texture_compression/for_desktop` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`vram_texture_compression/for_mobile` | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_EditorExportPlatformWeb_property_custom_template/debug: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/debug** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_custom_template/release: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/release** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_html/canvas_resize_policy: + +.. rst-class:: classref-property + +:ref:`int` **html/canvas_resize_policy** + +The canvas resize policy determines how the canvas should be resized by Godot. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_html/custom_html_shell: + +.. rst-class:: classref-property + +:ref:`String` **html/custom_html_shell** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_html/experimental_virtual_keyboard: + +.. rst-class:: classref-property + +:ref:`bool` **html/experimental_virtual_keyboard** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_html/export_icon: + +.. rst-class:: classref-property + +:ref:`bool` **html/export_icon** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_html/focus_canvas_on_start: + +.. rst-class:: classref-property + +:ref:`bool` **html/focus_canvas_on_start** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_html/head_include: + +.. rst-class:: classref-property + +:ref:`String` **html/head_include** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/background_color: + +.. rst-class:: classref-property + +:ref:`Color` **progressive_web_app/background_color** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/display: + +.. rst-class:: classref-property + +:ref:`int` **progressive_web_app/display** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/enabled: + +.. rst-class:: classref-property + +:ref:`bool` **progressive_web_app/enabled** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/icon_144x144: + +.. rst-class:: classref-property + +:ref:`String` **progressive_web_app/icon_144x144** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/icon_180x180: + +.. rst-class:: classref-property + +:ref:`String` **progressive_web_app/icon_180x180** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/icon_512x512: + +.. rst-class:: classref-property + +:ref:`String` **progressive_web_app/icon_512x512** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/offline_page: + +.. rst-class:: classref-property + +:ref:`String` **progressive_web_app/offline_page** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_progressive_web_app/orientation: + +.. rst-class:: classref-property + +:ref:`int` **progressive_web_app/orientation** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_variant/extensions_support: + +.. rst-class:: classref-property + +:ref:`bool` **variant/extensions_support** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_vram_texture_compression/for_desktop: + +.. rst-class:: classref-property + +:ref:`bool` **vram_texture_compression/for_desktop** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWeb_property_vram_texture_compression/for_mobile: + +.. rst-class:: classref-property + +:ref:`bool` **vram_texture_compression/for_mobile** + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_editorexportplatformwindows.rst b/classes/class_editorexportplatformwindows.rst new file mode 100644 index 00000000000..0d4570bda9f --- /dev/null +++ b/classes/class_editorexportplatformwindows.rst @@ -0,0 +1,578 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/platform/windows/doc_classes/EditorExportPlatformWindows.xml. + +.. _class_EditorExportPlatformWindows: + +EditorExportPlatformWindows +=========================== + +**Inherits:** :ref:`EditorExportPlatformPC` **<** :ref:`EditorExportPlatform` **<** :ref:`RefCounted` **<** :ref:`Object` + +Exporter for Windows. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Exporting for Windows <../tutorials/export/exporting_for_windows>` + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/company_name` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/console_wrapper_icon` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/copyright` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/file_description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/file_version` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/icon` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`application/icon_interpolation` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`application/modify_resources` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/product_name` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/product_version` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/trademarks` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`binary_format/architecture` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`binary_format/embed_pck` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedStringArray` | :ref:`codesign/custom_options` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/description` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`codesign/digest_algorithm` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/enable` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/identity` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`codesign/identity_type` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/password` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`codesign/timestamp` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`codesign/timestamp_server_url` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/debug` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`custom_template/release` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`debug/export_console_script` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/cleanup_script` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`ssh_remote_deploy/enabled` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/extra_args_scp` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/extra_args_ssh` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/host` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/port` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`ssh_remote_deploy/run_script` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/bptc` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/etc` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/etc2` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`texture_format/s3tc` | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_EditorExportPlatformWindows_property_application/company_name: + +.. rst-class:: classref-property + +:ref:`String` **application/company_name** + +Company that produced the application. Required. See `StringFileInfo `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/console_wrapper_icon: + +.. rst-class:: classref-property + +:ref:`String` **application/console_wrapper_icon** + +Console wrapper icon file. If left empty, application icon is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/copyright: + +.. rst-class:: classref-property + +:ref:`String` **application/copyright** + +Copyright notice for the bundle visible to the user. Optional. See `StringFileInfo `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/file_description: + +.. rst-class:: classref-property + +:ref:`String` **application/file_description** + +File description to be presented to users. Required. See `StringFileInfo `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/file_version: + +.. rst-class:: classref-property + +:ref:`String` **application/file_version** + +Version number of the file. Required. See `StringFileInfo `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/icon: + +.. rst-class:: classref-property + +:ref:`String` **application/icon** + +Application icon file. If left empty, project icon is used instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/icon_interpolation: + +.. rst-class:: classref-property + +:ref:`int` **application/icon_interpolation** + +Interpolation method used to resize application icon. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/modify_resources: + +.. rst-class:: classref-property + +:ref:`bool` **application/modify_resources** + +If enabled, icon and metadata of the exported executable is set according to the other ``application/*`` values. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/product_name: + +.. rst-class:: classref-property + +:ref:`String` **application/product_name** + +Name of the application. Required. See `StringFileInfo `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/product_version: + +.. rst-class:: classref-property + +:ref:`String` **application/product_version** + +Application version visible to the user. Required. See `StringFileInfo `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_application/trademarks: + +.. rst-class:: classref-property + +:ref:`String` **application/trademarks** + +Trademarks and registered trademarks that apply to the file. Optional. See `StringFileInfo `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_binary_format/architecture: + +.. rst-class:: classref-property + +:ref:`String` **binary_format/architecture** + +Application executable architecture. + +Supported architectures: ``x86_32``, ``x86_64``, and ``arm64``. + +Official export templates include ``x86_32`` and ``x86_64`` binaries only. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_binary_format/embed_pck: + +.. rst-class:: classref-property + +:ref:`bool` **binary_format/embed_pck** + +If ``true``, project resources are embedded into the executable. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/custom_options: + +.. rst-class:: classref-property + +:ref:`PackedStringArray` **codesign/custom_options** + +Array of the additional command line arguments passed to the code signing tool. See `Sign Tool `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/description: + +.. rst-class:: classref-property + +:ref:`String` **codesign/description** + +Description of the signed content. See `Sign Tool `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/digest_algorithm: + +.. rst-class:: classref-property + +:ref:`int` **codesign/digest_algorithm** + +Digest algorithm to use for creating signature. See `Sign Tool `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/enable: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/enable** + +If ``true``, executable signing is enabled. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/identity: + +.. rst-class:: classref-property + +:ref:`String` **codesign/identity** + +PKCS #12 certificate file used to sign executable or certificate SHA-1 hash (if :ref:`codesign/identity_type` is set to "Use certificate store"). See `Sign Tool `__. + +Can be overridden with the environment variable ``GODOT_WINDOWS_CODESIGN_IDENTITY``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/identity_type: + +.. rst-class:: classref-property + +:ref:`int` **codesign/identity_type** + +Type of identity to use. See `Sign Tool `__. + +Can be overridden with the environment variable ``GODOT_WINDOWS_CODESIGN_IDENTITY_TYPE``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/password: + +.. rst-class:: classref-property + +:ref:`String` **codesign/password** + +Password for the certificate file used to sign executable. See `Sign Tool `__. + +Can be overridden with the environment variable ``GODOT_WINDOWS_CODESIGN_PASSWORD``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/timestamp: + +.. rst-class:: classref-property + +:ref:`bool` **codesign/timestamp** + +If ``true``, time-stamp is added to the signature. See `Sign Tool `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_codesign/timestamp_server_url: + +.. rst-class:: classref-property + +:ref:`String` **codesign/timestamp_server_url** + +URL of the time stamp server. If left empty, the default server is used. See `Sign Tool `__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_custom_template/debug: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/debug** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_custom_template/release: + +.. rst-class:: classref-property + +:ref:`String` **custom_template/release** + +Path to the custom export template. If left empty, default template is used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_debug/export_console_script: + +.. rst-class:: classref-property + +:ref:`int` **debug/export_console_script** + +If ``true``, a console wrapper executable is exported alongside the main executable, which allows running the project with enabled console output. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_ssh_remote_deploy/cleanup_script: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/cleanup_script** + +Script code to execute on the remote host when app is finished. + +The following variables can be used in the script: + +- ``{temp_dir}`` - Path of temporary folder on the remote, used to upload app and scripts to. + +- ``{archive_name}`` - Name of the ZIP containing uploaded application. + +- ``{exe_name}`` - Name of application executable. + +- ``{cmd_args}`` - Array of the command line argument for the application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_ssh_remote_deploy/enabled: + +.. rst-class:: classref-property + +:ref:`bool` **ssh_remote_deploy/enabled** + +Enables remote deploy using SSH/SCP. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_ssh_remote_deploy/extra_args_scp: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/extra_args_scp** + +Array of the additional command line arguments passed to the SCP. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_ssh_remote_deploy/extra_args_ssh: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/extra_args_ssh** + +Array of the additional command line arguments passed to the SSH. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_ssh_remote_deploy/host: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/host** + +Remote host SSH user name and address, in ``user@address`` format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_ssh_remote_deploy/port: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/port** + +Remote host SSH port number. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_ssh_remote_deploy/run_script: + +.. rst-class:: classref-property + +:ref:`String` **ssh_remote_deploy/run_script** + +Script code to execute on the remote host when running the app. + +The following variables can be used in the script: + +- ``{temp_dir}`` - Path of temporary folder on the remote, used to upload app and scripts to. + +- ``{archive_name}`` - Name of the ZIP containing uploaded application. + +- ``{exe_name}`` - Name of application executable. + +- ``{cmd_args}`` - Array of the command line argument for the application. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_texture_format/bptc: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/bptc** + +If ``true``, project textures are exported in the BPTC format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_texture_format/etc: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/etc** + +If ``true``, project textures are exported in the ETC format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_texture_format/etc2: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/etc2** + +If ``true``, project textures are exported in the ETC2 format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorExportPlatformWindows_property_texture_format/s3tc: + +.. rst-class:: classref-property + +:ref:`bool` **texture_format/s3tc** + +If ``true``, project textures are exported in the S3TC format. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_editorexportplugin.rst b/classes/class_editorexportplugin.rst index 8cdf4241c0e..dee7f58d46f 100644 --- a/classes/class_editorexportplugin.rst +++ b/classes/class_editorexportplugin.rst @@ -54,8 +54,12 @@ Methods +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedStringArray` | :ref:`_get_export_features` **(** :ref:`EditorExportPlatform` platform, :ref:`bool` debug **)** |virtual| |const| | +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`_get_export_options` **(** :ref:`EditorExportPlatform` platform **)** |virtual| |const| | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`_get_name` **(** **)** |virtual| |const| | +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_should_update_export_options` **(** :ref:`EditorExportPlatform` platform **)** |virtual| |const| | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`add_file` **(** :ref:`String` path, :ref:`PackedByteArray` file, :ref:`bool` remap **)** | +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`add_ios_bundle_file` **(** :ref:`String` path **)** | @@ -76,6 +80,8 @@ Methods +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`add_shared_object` **(** :ref:`String` path, :ref:`PackedStringArray` tags, :ref:`String` target **)** | +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get_option` **(** :ref:`StringName` name **)** |const| | + +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`skip` **(** **)** | +---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -232,6 +238,26 @@ Return a :ref:`PackedStringArray` of additional feature ---- +.. _class_EditorExportPlugin_method__get_export_options: + +.. rst-class:: classref-method + +:ref:`Dictionary[]` **_get_export_options** **(** :ref:`EditorExportPlatform` platform **)** |virtual| |const| + +Return a list of export options that can be configured for this export plugin. + +Each element in the return value is a :ref:`Dictionary` with the following keys: + +- ``option``: A dictionary with the structure documented by :ref:`Object.get_property_list`, but all keys are optional. + +- ``default_value``: The default value for this option. + +- ``update_visibility``: An optional boolean value. If set to ``true``, the preset will emit :ref:`Object.property_list_changed` when the option is changed. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorExportPlugin_method__get_name: .. rst-class:: classref-method @@ -246,6 +272,18 @@ Implementing this method is required. ---- +.. _class_EditorExportPlugin_method__should_update_export_options: + +.. rst-class:: classref-method + +:ref:`bool` **_should_update_export_options** **(** :ref:`EditorExportPlatform` platform **)** |virtual| |const| + +Return ``true``, if the result of :ref:`_get_export_options` has changed and the export options of preset corresponding to ``platform`` should be updated. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorExportPlugin_method_add_file: .. rst-class:: classref-method @@ -376,6 +414,18 @@ In case of a directory code-sign will error if you place non code object in dire ---- +.. _class_EditorExportPlugin_method_get_option: + +.. rst-class:: classref-method + +:ref:`Variant` **get_option** **(** :ref:`StringName` name **)** |const| + +Returns the current value of an export option supplied by :ref:`_get_export_options`. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorExportPlugin_method_skip: .. rst-class:: classref-method diff --git a/classes/class_editorfiledialog.rst b/classes/class_editorfiledialog.rst index cfbc942f81f..0715ea7dd00 100644 --- a/classes/class_editorfiledialog.rst +++ b/classes/class_editorfiledialog.rst @@ -351,7 +351,7 @@ The view format in which the **EditorFileDialog** displays resources to the user - void **set_file_mode** **(** :ref:`FileMode` value **)** - :ref:`FileMode` **get_file_mode** **(** **)** -The dialog's open or save mode, which affects the selection behavior. See :ref:`FileMode` +The dialog's open or save mode, which affects the selection behavior. See :ref:`FileMode`. .. rst-class:: classref-item-separator diff --git a/classes/class_editorinterface.rst b/classes/class_editorinterface.rst index 60cef634d96..56ca27e1a9c 100644 --- a/classes/class_editorinterface.rst +++ b/classes/class_editorinterface.rst @@ -10,7 +10,7 @@ EditorInterface =============== -**Inherits:** :ref:`Node` **<** :ref:`Object` +**Inherits:** :ref:`Object` Godot editor's interface. @@ -34,6 +34,8 @@ Properties +-------------------------+------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`distraction_free_mode` | +-------------------------+------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`movie_maker_enabled` | + +-------------------------+------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -50,7 +52,7 @@ Methods +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`edit_script` **(** :ref:`Script` script, :ref:`int` line=-1, :ref:`int` column=0, :ref:`bool` grab_focus=true **)** | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Control` | :ref:`get_base_control` **(** **)** | + | :ref:`Control` | :ref:`get_base_control` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`EditorCommandPalette` | :ref:`get_command_palette` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -58,17 +60,17 @@ Methods +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_current_path` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Node` | :ref:`get_edited_scene_root` **(** **)** | + | :ref:`Node` | :ref:`get_edited_scene_root` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`VBoxContainer` | :ref:`get_editor_main_screen` **(** **)** | + | :ref:`VBoxContainer` | :ref:`get_editor_main_screen` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorPaths` | :ref:`get_editor_paths` **(** **)** | + | :ref:`EditorPaths` | :ref:`get_editor_paths` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_editor_scale` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorSettings` | :ref:`get_editor_settings` **(** **)** | + | :ref:`EditorSettings` | :ref:`get_editor_settings` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`FileSystemDock` | :ref:`get_file_system_dock` **(** **)** | + | :ref:`FileSystemDock` | :ref:`get_file_system_dock` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`EditorInspector` | :ref:`get_inspector` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -76,20 +78,18 @@ Methods +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_playing_scene` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorFileSystem` | :ref:`get_resource_filesystem` **(** **)** | + | :ref:`EditorFileSystem` | :ref:`get_resource_filesystem` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorResourcePreview` | :ref:`get_resource_previewer` **(** **)** | + | :ref:`EditorResourcePreview` | :ref:`get_resource_previewer` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`ScriptEditor` | :ref:`get_script_editor` **(** **)** | + | :ref:`ScriptEditor` | :ref:`get_script_editor` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedStringArray` | :ref:`get_selected_paths` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorSelection` | :ref:`get_selection` **(** **)** | + | :ref:`EditorSelection` | :ref:`get_selection` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`inspect_object` **(** :ref:`Object` object, :ref:`String` for_property="", :ref:`bool` inspector_only=false **)** | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_movie_maker_enabled` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_playing_scene` **(** **)** |const| | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_plugin_enabled` **(** :ref:`String` plugin **)** |const| | @@ -116,8 +116,6 @@ Methods +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_main_screen_editor` **(** :ref:`String` name **)** | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_movie_maker_enabled` **(** :ref:`bool` enabled **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_plugin_enabled` **(** :ref:`String` plugin, :ref:`bool` enabled **)** | +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`stop_playing_scene` **(** **)** | @@ -145,6 +143,23 @@ Property Descriptions If ``true``, enables distraction-free mode which hides side docks to increase the space available for the main view. +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorInterface_property_movie_maker_enabled: + +.. rst-class:: classref-property + +:ref:`bool` **movie_maker_enabled** + +.. rst-class:: classref-property-setget + +- void **set_movie_maker_enabled** **(** :ref:`bool` value **)** +- :ref:`bool` **is_movie_maker_enabled** **(** **)** + +If ``true``, the Movie Maker mode is enabled in the editor. See :ref:`MovieWriter` for more information. + .. rst-class:: classref-section-separator ---- @@ -194,7 +209,7 @@ Edits the given :ref:`Script`. The line and column on which to ope .. rst-class:: classref-method -:ref:`Control` **get_base_control** **(** **)** +:ref:`Control` **get_base_control** **(** **)** |const| Returns the main container of Godot editor's window. For example, you can use it to retrieve the size of the container and place your controls accordingly. @@ -246,7 +261,7 @@ Returns the current path being viewed in the :ref:`FileSystemDock` **get_edited_scene_root** **(** **)** +:ref:`Node` **get_edited_scene_root** **(** **)** |const| Returns the edited (current) scene's root :ref:`Node`. @@ -258,7 +273,7 @@ Returns the edited (current) scene's root :ref:`Node`. .. rst-class:: classref-method -:ref:`VBoxContainer` **get_editor_main_screen** **(** **)** +:ref:`VBoxContainer` **get_editor_main_screen** **(** **)** |const| Returns the editor control responsible for main screen plugins and tools. Use it with plugins that implement :ref:`EditorPlugin._has_main_screen`. @@ -272,7 +287,7 @@ Returns the editor control responsible for main screen plugins and tools. Use it .. rst-class:: classref-method -:ref:`EditorPaths` **get_editor_paths** **(** **)** +:ref:`EditorPaths` **get_editor_paths** **(** **)** |const| Returns the :ref:`EditorPaths` singleton. @@ -298,7 +313,7 @@ Returns the actual scale of the editor UI (``1.0`` being 100% scale). This can b .. rst-class:: classref-method -:ref:`EditorSettings` **get_editor_settings** **(** **)** +:ref:`EditorSettings` **get_editor_settings** **(** **)** |const| Returns the editor's :ref:`EditorSettings` instance. @@ -310,7 +325,7 @@ Returns the editor's :ref:`EditorSettings` instance. .. rst-class:: classref-method -:ref:`FileSystemDock` **get_file_system_dock** **(** **)** +:ref:`FileSystemDock` **get_file_system_dock** **(** **)** |const| Returns the editor's :ref:`FileSystemDock` instance. @@ -362,7 +377,7 @@ Returns the name of the scene that is being played. If no scene is currently bei .. rst-class:: classref-method -:ref:`EditorFileSystem` **get_resource_filesystem** **(** **)** +:ref:`EditorFileSystem` **get_resource_filesystem** **(** **)** |const| Returns the editor's :ref:`EditorFileSystem` instance. @@ -374,7 +389,7 @@ Returns the editor's :ref:`EditorFileSystem` instance. .. rst-class:: classref-method -:ref:`EditorResourcePreview` **get_resource_previewer** **(** **)** +:ref:`EditorResourcePreview` **get_resource_previewer** **(** **)** |const| Returns the editor's :ref:`EditorResourcePreview` instance. @@ -386,7 +401,7 @@ Returns the editor's :ref:`EditorResourcePreview` i .. rst-class:: classref-method -:ref:`ScriptEditor` **get_script_editor** **(** **)** +:ref:`ScriptEditor` **get_script_editor** **(** **)** |const| Returns the editor's :ref:`ScriptEditor` instance. @@ -412,7 +427,7 @@ Returns an array containing the paths of the currently selected files (and direc .. rst-class:: classref-method -:ref:`EditorSelection` **get_selection** **(** **)** +:ref:`EditorSelection` **get_selection** **(** **)** |const| Returns the editor's :ref:`EditorSelection` instance. @@ -432,18 +447,6 @@ Shows the given property on the given ``object`` in the editor's Inspector dock. ---- -.. _class_EditorInterface_method_is_movie_maker_enabled: - -.. rst-class:: classref-method - -:ref:`bool` **is_movie_maker_enabled** **(** **)** |const| - -Returns ``true`` if Movie Maker mode is enabled in the editor. See also :ref:`set_movie_maker_enabled`. See :ref:`MovieWriter` for more information. - -.. rst-class:: classref-item-separator - ----- - .. _class_EditorInterface_method_is_playing_scene: .. rst-class:: classref-method @@ -600,18 +603,6 @@ Sets the editor's current main screen to the one specified in ``name``. ``name`` ---- -.. _class_EditorInterface_method_set_movie_maker_enabled: - -.. rst-class:: classref-method - -void **set_movie_maker_enabled** **(** :ref:`bool` enabled **)** - -Sets whether Movie Maker mode is enabled in the editor. See also :ref:`is_movie_maker_enabled`. See :ref:`MovieWriter` for more information. - -.. rst-class:: classref-item-separator - ----- - .. _class_EditorInterface_method_set_plugin_enabled: .. rst-class:: classref-method diff --git a/classes/class_editorpaths.rst b/classes/class_editorpaths.rst index 49406fec22e..fba3d127bf8 100644 --- a/classes/class_editorpaths.rst +++ b/classes/class_editorpaths.rst @@ -155,7 +155,11 @@ Returns the absolute path to the self-contained file that makes the current Godo Returns ``true`` if the editor is marked as self-contained, ``false`` otherwise. When self-contained mode is enabled, user configuration, data and cache files are saved in an ``editor_data/`` folder next to the editor binary. This makes portable usage easier and ensures the Godot editor minimizes file writes outside its own folder. Self-contained mode is not available for exported projects. -Self-contained mode can be enabled by creating a file named ``._sc_`` or ``_sc_`` in the same folder as the editor binary while the editor is not running. See also :ref:`get_self_contained_file`. +Self-contained mode can be enabled by creating a file named ``._sc_`` or ``_sc_`` in the same folder as the editor binary or macOS .app bundle while the editor is not running. See also :ref:`get_self_contained_file`. + +\ **Note:** On macOS, quarantine flag should be manually removed before using self-contained mode, see `Running on macOS `__. + +\ **Note:** On macOS, placing ``_sc_`` or any other file inside .app bundle will break digital signature and make it non-portable, consider placing it in the same folder as the .app bundle instead. \ **Note:** The Steam release of Godot uses self-contained mode by default. diff --git a/classes/class_editorplugin.rst b/classes/class_editorplugin.rst index 1f857e161b1..91a9eb00175 100644 --- a/classes/class_editorplugin.rst +++ b/classes/class_editorplugin.rst @@ -1279,7 +1279,7 @@ The callback should have 4 arguments: :ref:`Object` ``undo_redo``, :ref:`EditorInterface` **get_editor_interface** **(** **)** -Returns the :ref:`EditorInterface` object that gives you control over Godot editor's window and its functionalities. +Returns the :ref:`EditorInterface` singleton. It provides access to some parts of the editor GUI as well as various inner states and tools. .. rst-class:: classref-item-separator diff --git a/classes/class_editorresourceconversionplugin.rst b/classes/class_editorresourceconversionplugin.rst index f42ea520504..6cb08d14339 100644 --- a/classes/class_editorresourceconversionplugin.rst +++ b/classes/class_editorresourceconversionplugin.rst @@ -30,13 +30,13 @@ Below shows an example of a basic plugin that will convert an :ref:`ImageTexture extends EditorResourceConversionPlugin - func _handles(resource : Resource): + func _handles(resource: Resource): return resource is ImageTexture func _converts_to(): return "PortableCompressedTexture2D" - func _convert(itex : Resource): + func _convert(itex: Resource): var ptex = PortableCompressedTexture2D.new() ptex.create_from_image(itex.get_image(), PortableCompressedTexture2D.COMPRESSION_MODE_LOSSLESS) return ptex diff --git a/classes/class_editorresourcepreviewgenerator.rst b/classes/class_editorresourcepreviewgenerator.rst index 2df3b2d8ad5..f2c3d300ac1 100644 --- a/classes/class_editorresourcepreviewgenerator.rst +++ b/classes/class_editorresourcepreviewgenerator.rst @@ -29,17 +29,17 @@ Methods .. table:: :widths: auto - +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_can_generate_small_preview` **(** **)** |virtual| |const| | - +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Texture2D` | :ref:`_generate` **(** :ref:`Resource` resource, :ref:`Vector2i` size **)** |virtual| |const| | - +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Texture2D` | :ref:`_generate_from_path` **(** :ref:`String` path, :ref:`Vector2i` size **)** |virtual| |const| | - +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_generate_small_preview_automatically` **(** **)** |virtual| |const| | - +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_handles` **(** :ref:`String` type **)** |virtual| |const| | - +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_can_generate_small_preview` **(** **)** |virtual| |const| | + +-----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Texture2D` | :ref:`_generate` **(** :ref:`Resource` resource, :ref:`Vector2i` size, :ref:`Dictionary` metadata **)** |virtual| |const| | + +-----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Texture2D` | :ref:`_generate_from_path` **(** :ref:`String` path, :ref:`Vector2i` size, :ref:`Dictionary` metadata **)** |virtual| |const| | + +-----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_generate_small_preview_automatically` **(** **)** |virtual| |const| | + +-----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_handles` **(** :ref:`String` type **)** |virtual| |const| | + +-----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -68,7 +68,7 @@ By default, it returns ``false``. .. rst-class:: classref-method -:ref:`Texture2D` **_generate** **(** :ref:`Resource` resource, :ref:`Vector2i` size **)** |virtual| |const| +:ref:`Texture2D` **_generate** **(** :ref:`Resource` resource, :ref:`Vector2i` size, :ref:`Dictionary` metadata **)** |virtual| |const| Generate a preview from a given resource with the specified size. This must always be implemented. @@ -76,6 +76,8 @@ Returning an empty texture is an OK way to fail and let another generator take c Care must be taken because this function is always called from a thread (not the main thread). +\ ``metadata`` dictionary can modified to store file-specific metadata that can be used in :ref:`EditorResourceTooltipPlugin._make_tooltip_for_path` (like image size, sample length etc.). + .. rst-class:: classref-item-separator ---- @@ -84,7 +86,7 @@ Care must be taken because this function is always called from a thread (not the .. rst-class:: classref-method -:ref:`Texture2D` **_generate_from_path** **(** :ref:`String` path, :ref:`Vector2i` size **)** |virtual| |const| +:ref:`Texture2D` **_generate_from_path** **(** :ref:`String` path, :ref:`Vector2i` size, :ref:`Dictionary` metadata **)** |virtual| |const| Generate a preview directly from a path with the specified size. Implementing this is optional, as default code will load and call :ref:`_generate`. @@ -92,6 +94,8 @@ Returning an empty texture is an OK way to fail and let another generator take c Care must be taken because this function is always called from a thread (not the main thread). +\ ``metadata`` dictionary can modified to store file-specific metadata that can be used in :ref:`EditorResourceTooltipPlugin._make_tooltip_for_path` (like image size, sample length etc.). + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_editorresourcetooltipplugin.rst b/classes/class_editorresourcetooltipplugin.rst new file mode 100644 index 00000000000..c9c66e1c2f3 --- /dev/null +++ b/classes/class_editorresourcetooltipplugin.rst @@ -0,0 +1,106 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/doc/classes/EditorResourceTooltipPlugin.xml. + +.. _class_EditorResourceTooltipPlugin: + +EditorResourceTooltipPlugin +=========================== + +**Inherits:** :ref:`RefCounted` **<** :ref:`Object` + +A plugin that advanced tooltip for its handled resource type. + +.. rst-class:: classref-introduction-group + +Description +----------- + +Resource tooltip plugins are used by :ref:`FileSystemDock` to generate customized tooltips for specific resources. E.g. tooltip for a :ref:`Texture2D` displays a bigger preview and the texture's dimensions. + +A plugin must be first registered with :ref:`FileSystemDock.add_resource_tooltip_plugin`. When the user hovers a resource in filesystem dock which is handled by the plugin, :ref:`_make_tooltip_for_path` is called to create the tooltip. It works similarly to :ref:`Control._make_custom_tooltip`. + +.. rst-class:: classref-reftable-group + +Methods +------- + +.. table:: + :widths: auto + + +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_handles` **(** :ref:`String` type **)** |virtual| |const| | + +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Object` | :ref:`_make_tooltip_for_path` **(** :ref:`String` path, :ref:`Dictionary` metadata **)** |virtual| |const| | + +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`VBoxContainer` | :ref:`make_default_tooltip` **(** :ref:`String` path **)** |static| | + +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`request_thumbnail` **(** :ref:`String` path, :ref:`TextureRect` control **)** |const| | + +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Method Descriptions +------------------- + +.. _class_EditorResourceTooltipPlugin_method__handles: + +.. rst-class:: classref-method + +:ref:`bool` **_handles** **(** :ref:`String` type **)** |virtual| |const| + +Return ``true`` if the plugin is going to handle the given :ref:`Resource` ``type``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorResourceTooltipPlugin_method__make_tooltip_for_path: + +.. rst-class:: classref-method + +:ref:`Object` **_make_tooltip_for_path** **(** :ref:`String` path, :ref:`Dictionary` metadata **)** |virtual| |const| + +Create and return a tooltip that will be displayed when the user hovers resource under given ``path`` in filesystem dock. For best results, use :ref:`make_default_tooltip` as a base. + +The ``metadata`` dictionary is provided by preview generator (see method EditorResourcePreviewGenerator._generate]). + +\ **Note:** It's unadvised to use :ref:`ResourceLoader.load`, especially with heavy resources like models or textures, because it will make the editor unresponsive when creating the tooltip. You can use :ref:`request_thumbnail` if you want to display a preview in your tooltip. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorResourceTooltipPlugin_method_make_default_tooltip: + +.. rst-class:: classref-method + +:ref:`VBoxContainer` **make_default_tooltip** **(** :ref:`String` path **)** |static| + +Creates a default file tooltip. The tooltip includes file name, file size and :ref:`Resource` type if available. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorResourceTooltipPlugin_method_request_thumbnail: + +.. rst-class:: classref-method + +void **request_thumbnail** **(** :ref:`String` path, :ref:`TextureRect` control **)** |const| + +Requests a thumbnail for the given :ref:`TextureRect`. The thumbnail is created asynchronously by :ref:`EditorResourcePreview` and automatically set when available. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_editorscript.rst b/classes/class_editorscript.rst index 2d83b93948a..2883c4987b2 100644 --- a/classes/class_editorscript.rst +++ b/classes/class_editorscript.rst @@ -68,9 +68,9 @@ Methods +-----------------------------------------------+--------------------------------------------------------------------------------------------------------+ | void | :ref:`add_root_node` **(** :ref:`Node` node **)** | +-----------------------------------------------+--------------------------------------------------------------------------------------------------------+ - | :ref:`EditorInterface` | :ref:`get_editor_interface` **(** **)** | + | :ref:`EditorInterface` | :ref:`get_editor_interface` **(** **)** |const| | +-----------------------------------------------+--------------------------------------------------------------------------------------------------------+ - | :ref:`Node` | :ref:`get_scene` **(** **)** | + | :ref:`Node` | :ref:`get_scene` **(** **)** |const| | +-----------------------------------------------+--------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -112,7 +112,7 @@ Adds ``node`` as a child of the root node in the editor context. .. rst-class:: classref-method -:ref:`EditorInterface` **get_editor_interface** **(** **)** +:ref:`EditorInterface` **get_editor_interface** **(** **)** |const| Returns the :ref:`EditorInterface` singleton instance. @@ -124,7 +124,7 @@ Returns the :ref:`EditorInterface` singleton instance. .. rst-class:: classref-method -:ref:`Node` **get_scene** **(** **)** +:ref:`Node` **get_scene** **(** **)** |const| Returns the Editor's currently active scene. diff --git a/classes/class_editorsettings.rst b/classes/class_editorsettings.rst index 0d595ebc72c..a259033ff75 100644 --- a/classes/class_editorsettings.rst +++ b/classes/class_editorsettings.rst @@ -30,7 +30,7 @@ Accessing the settings can be done using the following methods, such as: .. code-tab:: gdscript - var settings = EditorInterface.get_editor_settings() + var settings = get_editor_interface().get_editor_settings() # `settings.set("some/property", 10)` also works as this class overrides `_set()` internally. settings.set_setting("some/property", 10) # `settings.get("some/property")` also works as this class overrides `_get()` internally. @@ -203,6 +203,8 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`editors/polygon_editor/show_previous_outline` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`editors/shader_editor/behavior/files/restore_shaders_on_load` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`editors/tiles_editor/display_grid` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Color` | :ref:`editors/tiles_editor/grid_color` | @@ -257,6 +259,8 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`interface/editor/editor_language` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`interface/editor/editor_screen` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`interface/editor/expand_to_title` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`interface/editor/font_antialiasing` | @@ -275,6 +279,8 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`interface/editor/mouse_extra_buttons_navigate_history` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`interface/editor/project_manager_screen` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`interface/editor/save_each_scene_on_quit` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`interface/editor/separate_distraction_mode` | @@ -287,10 +293,18 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`interface/editor/use_embedded_menu` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`interface/inspector/float_drag_speed` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`interface/inspector/max_array_dictionary_items_per_page` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`interface/inspector/show_low_level_opentype_features` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`interface/multi_window/enable` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`interface/multi_window/maximize_window` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`interface/multi_window/restore_windows_on_load` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`interface/scene_tabs/display_close_button` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`interface/scene_tabs/maximum_width` | @@ -329,6 +343,8 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`interface/touchscreen/increase_scrollbar_touch_area` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`interface/touchscreen/scale_gizmo_handles` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`network/debug/remote_host` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`network/debug/remote_port` | @@ -1055,7 +1071,7 @@ If ``true``, render the grid on an XZ plane. :ref:`bool` **editors/3d/grid_yz_plane** -If ``true``, render the grid on an YZ plane. This can be useful for 3D side-scrolling games. +If ``true``, render the grid on a YZ plane. This can be useful for 3D side-scrolling games. .. rst-class:: classref-item-separator @@ -1171,7 +1187,7 @@ The modifier key that must be held to pan in the 3D editor. :ref:`bool` **editors/3d/navigation/warped_mouse_panning** -If ``true``, warps the mouse around the 3D viewport while panning in the 3D editor. This makes it possible to pan over a large area without having to exit panning then mouse the mouse back constantly. +If ``true``, warps the mouse around the 3D viewport while panning in the 3D editor. This makes it possible to pan over a large area without having to exit panning and adjust the mouse cursor. .. rst-class:: classref-item-separator @@ -1485,7 +1501,7 @@ Controls whether the mouse wheel scroll zooms or pans in subeditors. The list of :ref:`bool` **editors/panning/warped_mouse_panning** -If ``true``, warps the mouse around the 2D viewport while panning in the 2D editor. This makes it possible to pan over a large area without having to exit panning then mouse the mouse back constantly. +If ``true``, warps the mouse around the 2D viewport while panning in the 2D editor. This makes it possible to pan over a large area without having to exit panning and adjust the mouse cursor. .. rst-class:: classref-item-separator @@ -1515,6 +1531,18 @@ If ``true``, displays the polygon's previous shape in the 2D polygon editors wit ---- +.. _class_EditorSettings_property_editors/shader_editor/behavior/files/restore_shaders_on_load: + +.. rst-class:: classref-property + +:ref:`bool` **editors/shader_editor/behavior/files/restore_shaders_on_load** + +If ``true``, reopens shader files that were open in the shader editor when the project was last closed. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorSettings_property_editors/tiles_editor/display_grid: .. rst-class:: classref-property @@ -1871,6 +1899,18 @@ Translations are provided by the community. If you spot a mistake, :doc:`contrib ---- +.. _class_EditorSettings_property_interface/editor/editor_screen: + +.. rst-class:: classref-property + +:ref:`int` **interface/editor/editor_screen** + +The preferred monitor to display the editor. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorSettings_property_interface/editor/expand_to_title: .. rst-class:: classref-property @@ -1989,13 +2029,25 @@ If ``true``, the mouse's additional side buttons will be usable to navigate in t ---- +.. _class_EditorSettings_property_interface/editor/project_manager_screen: + +.. rst-class:: classref-property + +:ref:`int` **interface/editor/project_manager_screen** + +The preferred monitor to display the project manager. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorSettings_property_interface/editor/save_each_scene_on_quit: .. rst-class:: classref-property :ref:`bool` **interface/editor/save_each_scene_on_quit** -If ``true``, the editor will save all scenes when confirming the **Save** action when quitting the editor or quitting to the project list. If ``false``, the editor will ask to save each scene individually. +If ``false``, the editor will save all scenes when confirming the **Save** action when quitting the editor or quitting to the project list. If ``true``, the editor will ask to save each scene individually. .. rst-class:: classref-item-separator @@ -2065,6 +2117,18 @@ Specific to the macOS platform. ---- +.. _class_EditorSettings_property_interface/inspector/float_drag_speed: + +.. rst-class:: classref-property + +:ref:`float` **interface/inspector/float_drag_speed** + +Base speed for increasing/decreasing float values by dragging them in the inspector. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorSettings_property_interface/inspector/max_array_dictionary_items_per_page: .. rst-class:: classref-property @@ -2089,6 +2153,46 @@ If ``true``, display OpenType features marked as ``hidden`` by the font file in ---- +.. _class_EditorSettings_property_interface/multi_window/enable: + +.. rst-class:: classref-property + +:ref:`bool` **interface/multi_window/enable** + +If ``true``, the multi window support in editor is enabled. The following panels can become dedicated windows (made floating): Docks, Script editor, and Shader editor. + +\ **Note:** When :ref:`interface/editor/single_window_mode` is ``true``, the multi window support is always disabled. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorSettings_property_interface/multi_window/maximize_window: + +.. rst-class:: classref-property + +:ref:`bool` **interface/multi_window/maximize_window** + +If ``true``, when panels are made floating they will be maximized. + +If ``false``, when panels are made floating their position and size will match the ones when they are attached (excluding window border) to the editor window. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorSettings_property_interface/multi_window/restore_windows_on_load: + +.. rst-class:: classref-property + +:ref:`bool` **interface/multi_window/restore_windows_on_load** + +If ``true``, the floating panel position, size, and screen will be saved on editor exit. On next launch the panels that were floating will be made floating in the saved positions, sizes and screens, if possible. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorSettings_property_interface/scene_tabs/display_close_button: .. rst-class:: classref-property @@ -2331,6 +2435,20 @@ If ``true``, increases the scrollbar touch area to improve usability on touchscr ---- +.. _class_EditorSettings_property_interface/touchscreen/scale_gizmo_handles: + +.. rst-class:: classref-property + +:ref:`float` **interface/touchscreen/scale_gizmo_handles** + +Specify the multiplier to apply to the scale for the editor gizmo handles to improve usability on touchscreen devices. + +\ **Note:** Defaults to ``1`` on non-touchscreen devices. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorSettings_property_network/debug/remote_host: .. rst-class:: classref-property @@ -2533,7 +2651,7 @@ If ``true``, makes the caret blink according to :ref:`text_editor/appearance/car :ref:`float` **text_editor/appearance/caret/caret_blink_interval** -The interval at which to blink the caret (in seconds). See also :ref:`text_editor/appearance/caret/caret_blink`. +The interval at which the caret will blink (in seconds). See also :ref:`text_editor/appearance/caret/caret_blink`. .. rst-class:: classref-item-separator @@ -2569,7 +2687,7 @@ If ``true``, colors the background of the line the caret is currently on with :r :ref:`int` **text_editor/appearance/caret/type** -The shape of the caret to use in the script editor. **Line** displays a vertical line to the left of the current character, whereas **Block** displays a outline over the current character. +The shape of the caret to use in the script editor. **Line** displays a vertical line to the left of the current character, whereas **Block** displays an outline over the current character. .. rst-class:: classref-item-separator @@ -3646,7 +3764,7 @@ Erases the setting whose name is specified by ``property``. :ref:`PackedStringArray` **get_changed_settings** **(** **)** |const| -Gets an array of the settings which have been changed since the last save. Note that internally ``changed_settings`` is cleared after a successful save, so generally the most appropriate place to use this method is when processing :ref:`NOTIFICATION_EDITOR_SETTINGS_CHANGED` +Gets an array of the settings which have been changed since the last save. Note that internally ``changed_settings`` is cleared after a successful save, so generally the most appropriate place to use this method is when processing :ref:`NOTIFICATION_EDITOR_SETTINGS_CHANGED`. .. rst-class:: classref-item-separator diff --git a/classes/class_editorundoredomanager.rst b/classes/class_editorundoredomanager.rst index 65b8769748c..02305cd2512 100644 --- a/classes/class_editorundoredomanager.rst +++ b/classes/class_editorundoredomanager.rst @@ -31,6 +31,10 @@ The usage is mostly the same as :ref:`UndoRedo`. You create and This guessing can sometimes yield false results, so you can provide a custom context object when creating an action. +\ **EditorUndoRedoManager** is intended to be used by Godot editor plugins. You can obtain it using :ref:`EditorPlugin.get_undo_redo`. For non-editor uses or plugins that don't need to integrate with the editor's undo history, use :ref:`UndoRedo` instead. + +The manager's API is mostly the same as in :ref:`UndoRedo`, so you can refer to its documentation for more examples. The main difference is that **EditorUndoRedoManager** uses object + method name for actions, instead of :ref:`Callable`. + .. rst-class:: classref-reftable-group Methods diff --git a/classes/class_editorvcsinterface.rst b/classes/class_editorvcsinterface.rst index bd9c61f46fa..800821fc555 100644 --- a/classes/class_editorvcsinterface.rst +++ b/classes/class_editorvcsinterface.rst @@ -265,7 +265,7 @@ Discards the changes made in a file present at ``file_path``. void **_fetch** **(** :ref:`String` remote **)** |virtual| -Fetches new changes from the remote, but doesn't write changes to the current working directory. Equivalent to ``git fetch``. +Fetches new changes from the ``remote``, but doesn't write changes to the current working directory. Equivalent to ``git fetch``. .. rst-class:: classref-item-separator @@ -397,7 +397,7 @@ Pulls changes from the remote. This can give rise to merge conflicts. void **_push** **(** :ref:`String` remote, :ref:`bool` force **)** |virtual| -Pushes changes to the ``remote``. Optionally, if ``force`` is set to true, a force push will override the change history already present on the remote. +Pushes changes to the ``remote``. If ``force`` is ``true``, a force push will override the change history already present on the remote. .. rst-class:: classref-item-separator @@ -517,7 +517,7 @@ Helper function to create a commit :ref:`Dictionary` item. ``m :ref:`Dictionary` **create_diff_file** **(** :ref:`String` new_file, :ref:`String` old_file **)** -Helper function to create a ``Dictionary`` for storing old and new diff file paths. +Helper function to create a :ref:`Dictionary` for storing old and new diff file paths. .. rst-class:: classref-item-separator @@ -529,7 +529,7 @@ Helper function to create a ``Dictionary`` for storing old and new diff file pat :ref:`Dictionary` **create_diff_hunk** **(** :ref:`int` old_start, :ref:`int` new_start, :ref:`int` old_lines, :ref:`int` new_lines **)** -Helper function to create a ``Dictionary`` for storing diff hunk data. ``old_start`` is the starting line number in old file. ``new_start`` is the starting line number in new file. ``old_lines`` is the number of lines in the old file. ``new_lines`` is the number of lines in the new file. +Helper function to create a :ref:`Dictionary` for storing diff hunk data. ``old_start`` is the starting line number in old file. ``new_start`` is the starting line number in new file. ``old_lines`` is the number of lines in the old file. ``new_lines`` is the number of lines in the new file. .. rst-class:: classref-item-separator @@ -541,7 +541,7 @@ Helper function to create a ``Dictionary`` for storing diff hunk data. ``old_sta :ref:`Dictionary` **create_diff_line** **(** :ref:`int` new_line_no, :ref:`int` old_line_no, :ref:`String` content, :ref:`String` status **)** -Helper function to create a ``Dictionary`` for storing a line diff. ``new_line_no`` is the line number in the new file (can be ``-1`` if the line is deleted). ``old_line_no`` is the line number in the old file (can be ``-1`` if the line is added). ``content`` is the diff text. ``status`` is a single character string which stores the line origin. +Helper function to create a :ref:`Dictionary` for storing a line diff. ``new_line_no`` is the line number in the new file (can be ``-1`` if the line is deleted). ``old_line_no`` is the line number in the old file (can be ``-1`` if the line is added). ``content`` is the diff text. ``status`` is a single character string which stores the line origin. .. rst-class:: classref-item-separator @@ -553,7 +553,7 @@ Helper function to create a ``Dictionary`` for storing a line diff. ``new_line_n :ref:`Dictionary` **create_status_file** **(** :ref:`String` file_path, :ref:`ChangeType` change_type, :ref:`TreeArea` area **)** -Helper function to create a ``Dictionary`` used by editor to read the status of a file. +Helper function to create a :ref:`Dictionary` used by editor to read the status of a file. .. rst-class:: classref-item-separator diff --git a/classes/class_enetpacketpeer.rst b/classes/class_enetpacketpeer.rst index 7ec0f53f922..250974a1441 100644 --- a/classes/class_enetpacketpeer.rst +++ b/classes/class_enetpacketpeer.rst @@ -511,7 +511,7 @@ void **set_timeout** **(** :ref:`int` timeout, :ref:`int` Sets the timeout parameters for a peer. The timeout parameters control how and when a peer will timeout from a failure to acknowledge reliable traffic. Timeout values are expressed in milliseconds. -The ``timeout_limit`` is a factor that, multiplied by a value based on the average round trip time, will determine the timeout limit for a reliable packet. When that limit is reached, the timeout will be doubled, and the peer will be disconnected if that limit has reached ``timeout_min``. The ``timeout_max`` parameter, on the other hand, defines a fixed timeout for which any packet must be acknowledged or the peer will be dropped. +The ``timeout`` is a factor that, multiplied by a value based on the average round trip time, will determine the timeout limit for a reliable packet. When that limit is reached, the timeout will be doubled, and the peer will be disconnected if that limit has reached ``timeout_min``. The ``timeout_max`` parameter, on the other hand, defines a fixed timeout for which any packet must be acknowledged or the peer will be dropped. .. rst-class:: classref-item-separator diff --git a/classes/class_engine.rst b/classes/class_engine.rst index b4c1b120914..7c4ec586704 100644 --- a/classes/class_engine.rst +++ b/classes/class_engine.rst @@ -226,7 +226,7 @@ If ``false``, stops printing error and warning messages to the console and edito - void **set_time_scale** **(** :ref:`float` value **)** - :ref:`float` **get_time_scale** **(** **)** -Controls how fast or slow the in-game clock ticks versus the real life one. It defaults to 1.0. A value of 2.0 means the game moves twice as fast as real life, whilst a value of 0.5 means the game moves at half the regular speed. +Controls how fast or slow the in-game clock ticks versus the real life one. It defaults to 1.0. A value of 2.0 means the game moves twice as fast as real life, whilst a value of 0.5 means the game moves at half the regular speed. This also affects :ref:`Timer` and :ref:`SceneTreeTimer` (see :ref:`SceneTree.create_timer` for how to control this). .. rst-class:: classref-section-separator diff --git a/classes/class_environment.rst b/classes/class_environment.rst index 17744e72589..a64b0b09c1a 100644 --- a/classes/class_environment.rst +++ b/classes/class_environment.rst @@ -1858,7 +1858,7 @@ If ``true``, screen-space reflections are enabled. Screen-space reflections are - void **set_ssr_fade_in** **(** :ref:`float` value **)** - :ref:`float` **get_ssr_fade_in** **(** **)** -The fade-in distance for screen-space reflections. Affects the area from the reflected material to the screen-space reflection). Only positive values are valid (negative values will be clamped to ``0.0``). +The fade-in distance for screen-space reflections. Affects the area from the reflected material to the screen-space reflection. Only positive values are valid (negative values will be clamped to ``0.0``). .. rst-class:: classref-item-separator diff --git a/classes/class_expression.rst b/classes/class_expression.rst index 8336ab8b7cf..a6f282605d2 100644 --- a/classes/class_expression.rst +++ b/classes/class_expression.rst @@ -70,6 +70,13 @@ In the following example we use a :ref:`LineEdit` node to write +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Evaluating Expressions <../tutorials/scripting/evaluating_expressions>` + .. rst-class:: classref-reftable-group Methods diff --git a/classes/class_fileaccess.rst b/classes/class_fileaccess.rst index 9e4645e80bd..876b8148981 100644 --- a/classes/class_fileaccess.rst +++ b/classes/class_fileaccess.rst @@ -115,14 +115,14 @@ Methods +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`flush` **(** **)** | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_8` **(** **)** |const| | + +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_16` **(** **)** |const| | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_32` **(** **)** |const| | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_64` **(** **)** |const| | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_8` **(** **)** |const| | - +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_as_text` **(** :ref:`bool` skip_cr=false **)** |const| | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedByteArray` | :ref:`get_buffer` **(** :ref:`int` length **)** |const| | @@ -177,14 +177,14 @@ Methods +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`seek_end` **(** :ref:`int` position=0 **)** | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`store_8` **(** :ref:`int` value **)** | + +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`store_16` **(** :ref:`int` value **)** | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`store_32` **(** :ref:`int` value **)** | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`store_64` **(** :ref:`int` value **)** | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`store_8` **(** :ref:`int` value **)** | - +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`store_buffer` **(** :ref:`PackedByteArray` buffer **)** | +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`store_csv_line` **(** :ref:`PackedStringArray` values, :ref:`String` delim="," **)** | @@ -293,6 +293,14 @@ Uses the `Zstandard `__ compression method. Uses the `gzip `__ compression method. +.. _class_FileAccess_constant_COMPRESSION_BROTLI: + +.. rst-class:: classref-enumeration-constant + +:ref:`CompressionMode` **COMPRESSION_BROTLI** = ``4`` + +Uses the `brotli `__ compression method (only decompression is supported). + .. rst-class:: classref-section-separator ---- @@ -403,49 +411,49 @@ Writes the file's buffer to disk. Flushing is automatically performed when the f ---- -.. _class_FileAccess_method_get_16: +.. _class_FileAccess_method_get_8: .. rst-class:: classref-method -:ref:`int` **get_16** **(** **)** |const| +:ref:`int` **get_8** **(** **)** |const| -Returns the next 16 bits from the file as an integer. See :ref:`store_16` for details on what values can be stored and retrieved this way. +Returns the next 8 bits from the file as an integer. See :ref:`store_8` for details on what values can be stored and retrieved this way. .. rst-class:: classref-item-separator ---- -.. _class_FileAccess_method_get_32: +.. _class_FileAccess_method_get_16: .. rst-class:: classref-method -:ref:`int` **get_32** **(** **)** |const| +:ref:`int` **get_16** **(** **)** |const| -Returns the next 32 bits from the file as an integer. See :ref:`store_32` for details on what values can be stored and retrieved this way. +Returns the next 16 bits from the file as an integer. See :ref:`store_16` for details on what values can be stored and retrieved this way. .. rst-class:: classref-item-separator ---- -.. _class_FileAccess_method_get_64: +.. _class_FileAccess_method_get_32: .. rst-class:: classref-method -:ref:`int` **get_64** **(** **)** |const| +:ref:`int` **get_32** **(** **)** |const| -Returns the next 64 bits from the file as an integer. See :ref:`store_64` for details on what values can be stored and retrieved this way. +Returns the next 32 bits from the file as an integer. See :ref:`store_32` for details on what values can be stored and retrieved this way. .. rst-class:: classref-item-separator ---- -.. _class_FileAccess_method_get_8: +.. _class_FileAccess_method_get_64: .. rst-class:: classref-method -:ref:`int` **get_8** **(** **)** |const| +:ref:`int` **get_64** **(** **)** |const| -Returns the next 8 bits from the file as an integer. See :ref:`store_8` for details on what values can be stored and retrieved this way. +Returns the next 64 bits from the file as an integer. See :ref:`store_64` for details on what values can be stored and retrieved this way. .. rst-class:: classref-item-separator @@ -811,6 +819,22 @@ Changes the file reading/writing cursor to the specified position (in bytes from ---- +.. _class_FileAccess_method_store_8: + +.. rst-class:: classref-method + +void **store_8** **(** :ref:`int` value **)** + +Stores an integer as 8 bits in the file. + +\ **Note:** The ``value`` should lie in the interval ``[0, 255]``. Any other value will overflow and wrap around. + +To store a signed integer, use :ref:`store_64`, or convert it manually (see :ref:`store_16` for an example). + +.. rst-class:: classref-item-separator + +---- + .. _class_FileAccess_method_store_16: .. rst-class:: classref-method @@ -894,22 +918,6 @@ Stores an integer as 64 bits in the file. ---- -.. _class_FileAccess_method_store_8: - -.. rst-class:: classref-method - -void **store_8** **(** :ref:`int` value **)** - -Stores an integer as 8 bits in the file. - -\ **Note:** The ``value`` should lie in the interval ``[0, 255]``. Any other value will overflow and wrap around. - -To store a signed integer, use :ref:`store_64`, or convert it manually (see :ref:`store_16` for an example). - -.. rst-class:: classref-item-separator - ----- - .. _class_FileAccess_method_store_buffer: .. rst-class:: classref-method diff --git a/classes/class_filedialog.rst b/classes/class_filedialog.rst index eeb04d811c5..9ab009a9158 100644 --- a/classes/class_filedialog.rst +++ b/classes/class_filedialog.rst @@ -255,7 +255,7 @@ Property Descriptions - void **set_access** **(** :ref:`Access` value **)** - :ref:`Access` **get_access** **(** **)** -The file system access scope. See enum ``Access`` constants. +The file system access scope. See :ref:`Access` constants. \ **Warning:** Currently, in sandboxed environments such as Web builds or sandboxed macOS apps, FileDialog cannot access the host file system. See `godot-proposals#1123 `__. @@ -359,7 +359,7 @@ The available file type filters. For example, this shows only ``.png`` and ``.gd - void **set_mode_overrides_title** **(** :ref:`bool` value **)** - :ref:`bool` **is_mode_overriding_title** **(** **)** -If ``true``, changing the ``Mode`` property will set the window title accordingly (e.g. setting mode to :ref:`FILE_MODE_OPEN_FILE` will change the window title to "Open a File"). +If ``true``, changing the :ref:`file_mode` property will set the window title accordingly (e.g. setting :ref:`file_mode` to :ref:`FILE_MODE_OPEN_FILE` will change the window title to "Open a File"). .. rst-class:: classref-item-separator diff --git a/classes/class_filesystemdock.rst b/classes/class_filesystemdock.rst index 32bcd0c19c5..f67b2eb41ca 100644 --- a/classes/class_filesystemdock.rst +++ b/classes/class_filesystemdock.rst @@ -12,9 +12,16 @@ FileSystemDock **Inherits:** :ref:`VBoxContainer` **<** :ref:`BoxContainer` **<** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -.. container:: contribute +Editor dock for managing files in the project. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +This class is available only in :ref:`EditorPlugin`\ s and can't be instantiated. You can access it using :ref:`EditorInterface.get_file_system_dock`. + +While FileSystemDock doesn't expose any methods for file manipulation, you can listen for various file-related signals. .. rst-class:: classref-reftable-group @@ -24,9 +31,13 @@ Methods .. table:: :widths: auto - +------+--------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`navigate_to_path` **(** :ref:`String` path **)** | - +------+--------------------------------------------------------------------------------------------------------------------+ + +------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_resource_tooltip_plugin` **(** :ref:`EditorResourceTooltipPlugin` plugin **)** | + +------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`navigate_to_path` **(** :ref:`String` path **)** | + +------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_resource_tooltip_plugin` **(** :ref:`EditorResourceTooltipPlugin` plugin **)** | + +------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -43,9 +54,7 @@ Signals **display_mode_changed** **(** **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when the user switches file display mode or split mode. .. rst-class:: classref-item-separator @@ -57,9 +66,7 @@ Signals **file_removed** **(** :ref:`String` file **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when the given ``file`` was removed. .. rst-class:: classref-item-separator @@ -71,9 +78,7 @@ Signals **files_moved** **(** :ref:`String` old_file, :ref:`String` new_file **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when a file is moved from ``old_file`` path to ``new_file`` path. .. rst-class:: classref-item-separator @@ -85,9 +90,7 @@ Signals **folder_moved** **(** :ref:`String` old_folder, :ref:`String` new_folder **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when a folder is moved from ``old_folder`` path to ``new_folder`` path. .. rst-class:: classref-item-separator @@ -99,9 +102,7 @@ Signals **folder_removed** **(** :ref:`String` folder **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when the given ``folder`` was removed. .. rst-class:: classref-item-separator @@ -113,9 +114,7 @@ Signals **inherit** **(** :ref:`String` file **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when a new scene is created that inherits the scene at ``file`` path. .. rst-class:: classref-item-separator @@ -127,9 +126,7 @@ Signals **instantiate** **(** :ref:`PackedStringArray` files **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when the given scenes are being instantiated in the editor. .. rst-class:: classref-item-separator @@ -141,9 +138,7 @@ Signals **resource_removed** **(** :ref:`Resource` resource **)** -.. container:: contribute - - There is currently no description for this signal. Please help us by :ref:`contributing one `! +Emitted when an external ``resource`` had its file removed. .. rst-class:: classref-section-separator @@ -154,15 +149,37 @@ Signals Method Descriptions ------------------- +.. _class_FileSystemDock_method_add_resource_tooltip_plugin: + +.. rst-class:: classref-method + +void **add_resource_tooltip_plugin** **(** :ref:`EditorResourceTooltipPlugin` plugin **)** + +Registers a new :ref:`EditorResourceTooltipPlugin`. + +.. rst-class:: classref-item-separator + +---- + .. _class_FileSystemDock_method_navigate_to_path: .. rst-class:: classref-method void **navigate_to_path** **(** :ref:`String` path **)** -.. container:: contribute +Sets the given ``path`` as currently selected, ensuring that the selected file/directory is visible. + +.. rst-class:: classref-item-separator + +---- + +.. _class_FileSystemDock_method_remove_resource_tooltip_plugin: + +.. rst-class:: classref-method + +void **remove_resource_tooltip_plugin** **(** :ref:`EditorResourceTooltipPlugin` plugin **)** - There is currently no description for this method. Please help us by :ref:`contributing one `! +Removes an :ref:`EditorResourceTooltipPlugin`. Fails if the plugin wasn't previously added. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_font.rst b/classes/class_font.rst index 54a2f5069e8..a9b12fa5dc4 100644 --- a/classes/class_font.rst +++ b/classes/class_font.rst @@ -462,6 +462,20 @@ Returns list of supported `variation coordinates `, use :ref:`FontVariation.variation_opentype`. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_fontfile.rst b/classes/class_fontfile.rst index 97f5c0b27a0..4a611a30b28 100644 --- a/classes/class_fontfile.rst +++ b/classes/class_fontfile.rst @@ -35,7 +35,7 @@ Supported font formats: \ **Note:** A character is a symbol that represents an item (letter, digit etc.) in an abstract way. -\ **Note:** A glyph is a bitmap or shape used to draw a one or more characters in a context-dependent manner. Glyph indices are bound to the specific font data source. +\ **Note:** A glyph is a bitmap or shape used to draw one or more characters in a context-dependent manner. Glyph indices are bound to the specific font data source. \ **Note:** If a none of the font data sources contain glyphs for a character used in a string, the character in question will be replaced with a box displaying its hexadecimal code. @@ -135,6 +135,8 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_cache_underline_thickness` **(** :ref:`int` cache_index, :ref:`int` size **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_char_from_glyph_index` **(** :ref:`int` size, :ref:`int` glyph_index **)** |const| | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_embolden` **(** :ref:`int` cache_index **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_face_index` **(** :ref:`int` cache_index **)** |const| | @@ -715,6 +717,18 @@ Returns thickness of the underline in pixels. ---- +.. _class_FontFile_method_get_char_from_glyph_index: + +.. rst-class:: classref-method + +:ref:`int` **get_char_from_glyph_index** **(** :ref:`int` size, :ref:`int` glyph_index **)** |const| + +Returns character code associated with ``glyph_index``, or ``0`` if ``glyph_index`` is invalid. See :ref:`get_glyph_index`. + +.. rst-class:: classref-item-separator + +---- + .. _class_FontFile_method_get_embolden: .. rst-class:: classref-method diff --git a/classes/class_fontvariation.rst b/classes/class_fontvariation.rst index 5e3c66edd5f..ed48d8300ad 100644 --- a/classes/class_fontvariation.rst +++ b/classes/class_fontvariation.rst @@ -44,6 +44,15 @@ To use simulated bold font variant: +To set the coordinate of multiple variation axes: + +:: + + var fv = FontVariation.new(); + var ts = TextServerManager.get_primary_interface() + fv.base_font = load("res://BarlowCondensed-Regular.ttf") + fv.variation_opentype = { ts.name_to_tag("wght"): 900, ts.name_to_tag("custom_hght"): 900 } + .. rst-class:: classref-reftable-group Properties @@ -125,7 +134,7 @@ Base font used to create a variation. If not set, default :ref:`Theme` value **)** - :ref:`Font[]` **get_fallbacks** **(** **)** -Array of fallback :ref:`Font`\ s. If not set :ref:`base_font` fallback are ussed. +Array of fallback :ref:`Font`\ s to use as a substitute if a glyph is not found in this **FontVariation**. If not set, :ref:`base_font`'s fallbacks are used instead. .. rst-class:: classref-item-separator @@ -265,6 +274,10 @@ Active face index in the TrueType / OpenType collection file. Font OpenType variation coordinates. More info: `OpenType variation tags `__. +\ **Note:** This :ref:`Dictionary` uses OpenType tags as keys. Variation axes can be identified both by tags(``int``) and names (``string``). Some axes might be accessible by multiple names. For example, ``wght`` refers to the same axis as ``weight``. Tags on the other hand are unique. To convert between names and tags, use :ref:`TextServer.name_to_tag` and :ref:`TextServer.tag_to_name`. + +\ **Note:** To get available variation axes of a font, use :ref:`Font.get_supported_variation_list`. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_geometry3d.rst b/classes/class_geometry3d.rst index 3208ed56dbd..1f866f21cd1 100644 --- a/classes/class_geometry3d.rst +++ b/classes/class_geometry3d.rst @@ -46,7 +46,7 @@ Methods +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Variant` | :ref:`ray_intersects_triangle` **(** :ref:`Vector3` from, :ref:`Vector3` dir, :ref:`Vector3` a, :ref:`Vector3` b, :ref:`Vector3` c **)** | +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedVector3Array` | :ref:`segment_intersects_convex` **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`Array` planes **)** | + | :ref:`PackedVector3Array` | :ref:`segment_intersects_convex` **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`Plane[]` planes **)** | +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedVector3Array` | :ref:`segment_intersects_cylinder` **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`float` height, :ref:`float` radius **)** | +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -164,7 +164,7 @@ Tests if the 3D ray starting at ``from`` with the direction of ``dir`` intersect .. rst-class:: classref-method -:ref:`PackedVector3Array` **segment_intersects_convex** **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`Array` planes **)** +:ref:`PackedVector3Array` **segment_intersects_convex** **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`Plane[]` planes **)** Given a convex hull defined though the :ref:`Plane`\ s in the array ``planes``, tests if the segment (``from``, ``to``) intersects with that hull. If an intersection is found, returns a :ref:`PackedVector3Array` containing the point the intersection and the hull's normal. Otherwise, returns an empty array. diff --git a/classes/class_geometryinstance3d.rst b/classes/class_geometryinstance3d.rst index 3fa2d00dbcd..28f893fb6dd 100644 --- a/classes/class_geometryinstance3d.rst +++ b/classes/class_geometryinstance3d.rst @@ -285,7 +285,7 @@ The selected shadow casting flag. See :ref:`ShadowCastingSetting` value **)** - :ref:`AABB` **get_custom_aabb** **(** **)** -Overrides the bounding box of this node with a custom one. This can be used to avoid the expensive :ref:`AABB` recalculation that happens when a skeleton is used with a :ref:`MeshInstance3D` or to have fine control over the :ref:`MeshInstance3D`'s bounding box. To remove this, set value to an :ref:`AABB` with all fields set to zero. +Overrides the bounding box of this node with a custom one. This can be used to avoid the expensive :ref:`AABB` recalculation that happens when a skeleton is used with a :ref:`MeshInstance3D` or to have fine control over the :ref:`MeshInstance3D`'s bounding box. To use the default AABB, set value to an :ref:`AABB` with all fields set to ``0.0``. To avoid frustum culling, set :ref:`custom_aabb` to a very large AABB that covers your entire game world such as ``AABB(-10000, -10000, -10000, 20000, 20000, 20000)``. To disable all forms of culling (including occlusion culling), call :ref:`RenderingServer.instance_set_ignore_culling` on the **GeometryInstance3D**'s :ref:`RID`. .. rst-class:: classref-item-separator @@ -357,6 +357,8 @@ The global illumination mode to use for the whole geometry. To avoid inconsisten If ``true``, disables occlusion culling for this instance. Useful for gizmos that must be rendered even when occlusion culling is in use. +\ **Note:** :ref:`ignore_occlusion_culling` does not affect frustum culling (which is what happens when an object is not visible given the camera's angle). To avoid frustum culling, set :ref:`custom_aabb` to a very large AABB that covers your entire game world such as ``AABB(-10000, -10000, -10000, 20000, 20000, 20000)``. + .. rst-class:: classref-item-separator ---- @@ -469,7 +471,7 @@ Starting distance from which the GeometryInstance3D will be visible, taking :ref Margin for the :ref:`visibility_range_begin` threshold. The GeometryInstance3D will only change its visibility state when it goes over or under the :ref:`visibility_range_begin` threshold by this amount. -If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_DISABLED`, this acts as an hysteresis distance. If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_SELF` or :ref:`VISIBILITY_RANGE_FADE_DEPENDENCIES`, this acts as a fade transition distance and must be set to a value greater than ``0.0`` for the effect to be noticeable. +If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_DISABLED`, this acts as a hysteresis distance. If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_SELF` or :ref:`VISIBILITY_RANGE_FADE_DEPENDENCIES`, this acts as a fade transition distance and must be set to a value greater than ``0.0`` for the effect to be noticeable. .. rst-class:: classref-item-separator @@ -505,7 +507,7 @@ Distance from which the GeometryInstance3D will be hidden, taking :ref:`visibili Margin for the :ref:`visibility_range_end` threshold. The GeometryInstance3D will only change its visibility state when it goes over or under the :ref:`visibility_range_end` threshold by this amount. -If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_DISABLED`, this acts as an hysteresis distance. If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_SELF` or :ref:`VISIBILITY_RANGE_FADE_DEPENDENCIES`, this acts as a fade transition distance and must be set to a value greater than ``0.0`` for the effect to be noticeable. +If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_DISABLED`, this acts as a hysteresis distance. If :ref:`visibility_range_fade_mode` is :ref:`VISIBILITY_RANGE_FADE_SELF` or :ref:`VISIBILITY_RANGE_FADE_DEPENDENCIES`, this acts as a fade transition distance and must be set to a value greater than ``0.0`` for the effect to be noticeable. .. rst-class:: classref-item-separator diff --git a/classes/class_gltfaccessor.rst b/classes/class_gltfaccessor.rst index 94d66d9e13b..e106825a80e 100644 --- a/classes/class_gltfaccessor.rst +++ b/classes/class_gltfaccessor.rst @@ -25,7 +25,7 @@ Properties :widths: auto +-----------------------------------------------------+-------------------------------------------------------------------------------------------------+--------------------------+ - | :ref:`int` | :ref:`buffer_view` | ``0`` | + | :ref:`int` | :ref:`buffer_view` | ``-1`` | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------+--------------------------+ | :ref:`int` | :ref:`byte_offset` | ``0`` | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------+--------------------------+ @@ -67,7 +67,7 @@ Property Descriptions .. rst-class:: classref-property -:ref:`int` **buffer_view** = ``0`` +:ref:`int` **buffer_view** = ``-1`` .. rst-class:: classref-property-setget diff --git a/classes/class_gltfcollider.rst b/classes/class_gltfcollider.rst new file mode 100644 index 00000000000..a88b254a0e1 --- /dev/null +++ b/classes/class_gltfcollider.rst @@ -0,0 +1,257 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/modules/gltf/doc_classes/GLTFCollider.xml. + +.. _class_GLTFCollider: + +GLTFCollider +============ + +**Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` + +Represents a GLTF collider. + +.. rst-class:: classref-introduction-group + +Description +----------- + +Represents a collider as defined by the ``OMI_collider`` GLTF extension. This class is an intermediary between the GLTF data and Godot's nodes, and it's abstracted in a way that allows adding support for different GLTF physics extensions in the future. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- `OMI_collider GLTF extension `__ + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + | :ref:`float` | :ref:`height` | ``2.0`` | + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + | :ref:`ImporterMesh` | :ref:`importer_mesh` | | + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + | :ref:`bool` | :ref:`is_trigger` | ``false`` | + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + | :ref:`int` | :ref:`mesh_index` | ``-1`` | + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + | :ref:`float` | :ref:`radius` | ``0.5`` | + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + | :ref:`String` | :ref:`shape_type` | ``""`` | + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + | :ref:`Vector3` | :ref:`size` | ``Vector3(1, 1, 1)`` | + +-----------------------------------------+-----------------------------------------------------------------+----------------------+ + +.. rst-class:: classref-reftable-group + +Methods +------- + +.. table:: + :widths: auto + + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`GLTFCollider` | :ref:`from_dictionary` **(** :ref:`Dictionary` dictionary **)** |static| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`GLTFCollider` | :ref:`from_node` **(** :ref:`CollisionShape3D` collider_node **)** |static| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`to_dictionary` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`CollisionShape3D` | :ref:`to_node` **(** :ref:`bool` cache_shapes=false **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_GLTFCollider_property_height: + +.. rst-class:: classref-property + +:ref:`float` **height** = ``2.0`` + +.. rst-class:: classref-property-setget + +- void **set_height** **(** :ref:`float` value **)** +- :ref:`float` **get_height** **(** **)** + +The height of the collider, in meters. This is only used when the collider type is "capsule" or "cylinder". This value should not be negative, and for "capsule" it should be at least twice the radius. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_property_importer_mesh: + +.. rst-class:: classref-property + +:ref:`ImporterMesh` **importer_mesh** + +.. rst-class:: classref-property-setget + +- void **set_importer_mesh** **(** :ref:`ImporterMesh` value **)** +- :ref:`ImporterMesh` **get_importer_mesh** **(** **)** + +The :ref:`ImporterMesh` resource of the collider. This is only used when the collider type is "hull" (convex hull) or "trimesh" (concave trimesh). + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_property_is_trigger: + +.. rst-class:: classref-property + +:ref:`bool` **is_trigger** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_is_trigger** **(** :ref:`bool` value **)** +- :ref:`bool` **get_is_trigger** **(** **)** + +If ``true``, indicates that this collider is a trigger. For Godot, this means that the collider should be a child of an Area3D node. + +This is the only variable not used in the :ref:`to_node` method, it's intended to be used alongside when deciding where to add the generated node as a child. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_property_mesh_index: + +.. rst-class:: classref-property + +:ref:`int` **mesh_index** = ``-1`` + +.. rst-class:: classref-property-setget + +- void **set_mesh_index** **(** :ref:`int` value **)** +- :ref:`int` **get_mesh_index** **(** **)** + +The index of the collider's mesh in the GLTF file. This is only used when the collider type is "hull" (convex hull) or "trimesh" (concave trimesh). + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_property_radius: + +.. rst-class:: classref-property + +:ref:`float` **radius** = ``0.5`` + +.. rst-class:: classref-property-setget + +- void **set_radius** **(** :ref:`float` value **)** +- :ref:`float` **get_radius** **(** **)** + +The radius of the collider, in meters. This is only used when the collider type is "capsule", "cylinder", or "sphere". This value should not be negative. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_property_shape_type: + +.. rst-class:: classref-property + +:ref:`String` **shape_type** = ``""`` + +.. rst-class:: classref-property-setget + +- void **set_shape_type** **(** :ref:`String` value **)** +- :ref:`String` **get_shape_type** **(** **)** + +The type of shape this collider represents. Valid values are "box", "capsule", "cylinder", "sphere", "hull", and "trimesh". + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_property_size: + +.. rst-class:: classref-property + +:ref:`Vector3` **size** = ``Vector3(1, 1, 1)`` + +.. rst-class:: classref-property-setget + +- void **set_size** **(** :ref:`Vector3` value **)** +- :ref:`Vector3` **get_size** **(** **)** + +The size of the collider, in meters. This is only used when the collider type is "box", and it represents the "diameter" of the box. This value should not be negative. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Method Descriptions +------------------- + +.. _class_GLTFCollider_method_from_dictionary: + +.. rst-class:: classref-method + +:ref:`GLTFCollider` **from_dictionary** **(** :ref:`Dictionary` dictionary **)** |static| + +Creates a new GLTFCollider instance by parsing the given :ref:`Dictionary`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_method_from_node: + +.. rst-class:: classref-method + +:ref:`GLTFCollider` **from_node** **(** :ref:`CollisionShape3D` collider_node **)** |static| + +Create a new GLTFCollider instance from the given Godot :ref:`CollisionShape3D` node. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_method_to_dictionary: + +.. rst-class:: classref-method + +:ref:`Dictionary` **to_dictionary** **(** **)** |const| + +Serializes this GLTFCollider instance into a :ref:`Dictionary`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFCollider_method_to_node: + +.. rst-class:: classref-method + +:ref:`CollisionShape3D` **to_node** **(** :ref:`bool` cache_shapes=false **)** + +Converts this GLTFCollider instance into a Godot :ref:`CollisionShape3D` node. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_gltfnode.rst b/classes/class_gltfnode.rst index dd743c718b2..342468c5233 100644 --- a/classes/class_gltfnode.rst +++ b/classes/class_gltfnode.rst @@ -21,6 +21,8 @@ Description Represents a GLTF node. GLTF nodes may have names, transforms, children (other GLTF nodes), and more specialized properties (represented by their own classes). +GLTF nodes generally exist inside of :ref:`GLTFState` which represents all data of a GLTF file. Most of GLTFNode's properties are indices of other data in the GLTF file. You can extend a GLTF node with additional properties by using :ref:`get_additional_data` and :ref:`set_additional_data`. + .. rst-class:: classref-introduction-group Tutorials @@ -96,9 +98,7 @@ Property Descriptions - void **set_camera** **(** :ref:`int` value **)** - :ref:`int` **get_camera** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If this GLTF node is a camera, the index of the :ref:`GLTFCamera` in the :ref:`GLTFState` that describes the camera's properties. If -1, this node is not a camera. .. rst-class:: classref-item-separator @@ -115,9 +115,7 @@ Property Descriptions - void **set_children** **(** :ref:`PackedInt32Array` value **)** - :ref:`PackedInt32Array` **get_children** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The indices of the children nodes in the :ref:`GLTFState`. If this GLTF node has no children, this will be an empty array. .. rst-class:: classref-item-separator @@ -134,9 +132,7 @@ Property Descriptions - void **set_height** **(** :ref:`int` value **)** - :ref:`int` **get_height** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +How deep into the node hierarchy this node is. A root node will have a height of 0, its children will have a height of 1, and so on. If -1, the height has not been calculated. .. rst-class:: classref-item-separator @@ -153,9 +149,7 @@ Property Descriptions - void **set_light** **(** :ref:`int` value **)** - :ref:`int` **get_light** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If this GLTF node is a light, the index of the :ref:`GLTFLight` in the :ref:`GLTFState` that describes the light's properties. If -1, this node is not a light. .. rst-class:: classref-item-separator @@ -172,9 +166,7 @@ Property Descriptions - void **set_mesh** **(** :ref:`int` value **)** - :ref:`int` **get_mesh** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If this GLTF node is a mesh, the index of the :ref:`GLTFMesh` in the :ref:`GLTFState` that describes the mesh's properties. If -1, this node is not a mesh. .. rst-class:: classref-item-separator @@ -191,9 +183,7 @@ Property Descriptions - void **set_parent** **(** :ref:`int` value **)** - :ref:`int` **get_parent** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The index of the parent node in the :ref:`GLTFState`. If -1, this node is a root node. .. rst-class:: classref-item-separator @@ -210,9 +200,7 @@ Property Descriptions - void **set_position** **(** :ref:`Vector3` value **)** - :ref:`Vector3` **get_position** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The position of the GLTF node relative to its parent. .. rst-class:: classref-item-separator @@ -229,9 +217,7 @@ Property Descriptions - void **set_rotation** **(** :ref:`Quaternion` value **)** - :ref:`Quaternion` **get_rotation** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The rotation of the GLTF node relative to its parent. .. rst-class:: classref-item-separator @@ -248,9 +234,7 @@ Property Descriptions - void **set_scale** **(** :ref:`Vector3` value **)** - :ref:`Vector3` **get_scale** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The scale of the GLTF node relative to its parent. .. rst-class:: classref-item-separator @@ -267,9 +251,7 @@ Property Descriptions - void **set_skeleton** **(** :ref:`int` value **)** - :ref:`int` **get_skeleton** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If this GLTF node has a skeleton, the index of the :ref:`GLTFSkeleton` in the :ref:`GLTFState` that describes the skeleton's properties. If -1, this node does not have a skeleton. .. rst-class:: classref-item-separator @@ -286,9 +268,7 @@ Property Descriptions - void **set_skin** **(** :ref:`int` value **)** - :ref:`int` **get_skin** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If this GLTF node has a skin, the index of the :ref:`GLTFSkin` in the :ref:`GLTFState` that describes the skin's properties. If -1, this node does not have a skin. .. rst-class:: classref-item-separator @@ -305,9 +285,7 @@ Property Descriptions - void **set_xform** **(** :ref:`Transform3D` value **)** - :ref:`Transform3D` **get_xform** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The transform of the GLTF node relative to its parent. This property is usually unused since the position, rotation, and scale properties are preferred. .. rst-class:: classref-section-separator diff --git a/classes/class_gltfphysicsbody.rst b/classes/class_gltfphysicsbody.rst new file mode 100644 index 00000000000..619b7031a7f --- /dev/null +++ b/classes/class_gltfphysicsbody.rst @@ -0,0 +1,219 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/modules/gltf/doc_classes/GLTFPhysicsBody.xml. + +.. _class_GLTFPhysicsBody: + +GLTFPhysicsBody +=============== + +**Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` + +Represents a GLTF physics body. + +.. rst-class:: classref-introduction-group + +Description +----------- + +Represents a physics body as defined by the ``OMI_physics_body`` GLTF extension. This class is an intermediary between the GLTF data and Godot's nodes, and it's abstracted in a way that allows adding support for different GLTF physics extensions in the future. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- `OMI_physics_body GLTF extension `__ + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +-------------------------------+--------------------------------------------------------------------------+----------------------+ + | :ref:`Vector3` | :ref:`angular_velocity` | ``Vector3(0, 0, 0)`` | + +-------------------------------+--------------------------------------------------------------------------+----------------------+ + | :ref:`String` | :ref:`body_type` | ``"static"`` | + +-------------------------------+--------------------------------------------------------------------------+----------------------+ + | :ref:`Vector3` | :ref:`inertia` | ``Vector3(0, 0, 0)`` | + +-------------------------------+--------------------------------------------------------------------------+----------------------+ + | :ref:`Vector3` | :ref:`linear_velocity` | ``Vector3(0, 0, 0)`` | + +-------------------------------+--------------------------------------------------------------------------+----------------------+ + | :ref:`float` | :ref:`mass` | ``1.0`` | + +-------------------------------+--------------------------------------------------------------------------+----------------------+ + +.. rst-class:: classref-reftable-group + +Methods +------- + +.. table:: + :widths: auto + + +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`GLTFPhysicsBody` | :ref:`from_dictionary` **(** :ref:`Dictionary` dictionary **)** |static| | + +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`GLTFPhysicsBody` | :ref:`from_node` **(** :ref:`CollisionObject3D` body_node **)** |static| | + +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`to_dictionary` **(** **)** |const| | + +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`CollisionObject3D` | :ref:`to_node` **(** **)** |const| | + +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_GLTFPhysicsBody_property_angular_velocity: + +.. rst-class:: classref-property + +:ref:`Vector3` **angular_velocity** = ``Vector3(0, 0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_angular_velocity** **(** :ref:`Vector3` value **)** +- :ref:`Vector3` **get_angular_velocity** **(** **)** + +The angular velocity of the physics body, in radians per second. This is only used when the body type is "rigid" or "vehicle". + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFPhysicsBody_property_body_type: + +.. rst-class:: classref-property + +:ref:`String` **body_type** = ``"static"`` + +.. rst-class:: classref-property-setget + +- void **set_body_type** **(** :ref:`String` value **)** +- :ref:`String` **get_body_type** **(** **)** + +The type of the body. Valid values are "static", "kinematic", "character", "rigid", "vehicle", and "trigger". + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFPhysicsBody_property_inertia: + +.. rst-class:: classref-property + +:ref:`Vector3` **inertia** = ``Vector3(0, 0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_inertia** **(** :ref:`Vector3` value **)** +- :ref:`Vector3` **get_inertia** **(** **)** + +The principle axes of the inertia tensor of the physics body, in kilogram meter squared (kg⋅m²). This is only used when the body type is "rigid" or "vehicle". + +This is written to and read from the GLTF file as a 3x3 matrix, but is exposed as a Vector3 since Godot only supports principal axis inertia values. When converted to a Godot :ref:`RigidBody3D` node, if this value is zero, then the inertia will be calculated automatically. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFPhysicsBody_property_linear_velocity: + +.. rst-class:: classref-property + +:ref:`Vector3` **linear_velocity** = ``Vector3(0, 0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_linear_velocity** **(** :ref:`Vector3` value **)** +- :ref:`Vector3` **get_linear_velocity** **(** **)** + +The linear velocity of the physics body, in meters per second. This is only used when the body type is "rigid" or "vehicle". + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFPhysicsBody_property_mass: + +.. rst-class:: classref-property + +:ref:`float` **mass** = ``1.0`` + +.. rst-class:: classref-property-setget + +- void **set_mass** **(** :ref:`float` value **)** +- :ref:`float` **get_mass** **(** **)** + +The mass of the physics body, in kilograms. This is only used when the body type is "rigid" or "vehicle". + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Method Descriptions +------------------- + +.. _class_GLTFPhysicsBody_method_from_dictionary: + +.. rst-class:: classref-method + +:ref:`GLTFPhysicsBody` **from_dictionary** **(** :ref:`Dictionary` dictionary **)** |static| + +Creates a new GLTFPhysicsBody instance by parsing the given :ref:`Dictionary`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFPhysicsBody_method_from_node: + +.. rst-class:: classref-method + +:ref:`GLTFPhysicsBody` **from_node** **(** :ref:`CollisionObject3D` body_node **)** |static| + +Create a new GLTFPhysicsBody instance from the given Godot :ref:`CollisionObject3D` node. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFPhysicsBody_method_to_dictionary: + +.. rst-class:: classref-method + +:ref:`Dictionary` **to_dictionary** **(** **)** |const| + +Serializes this GLTFPhysicsBody instance into a :ref:`Dictionary`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFPhysicsBody_method_to_node: + +.. rst-class:: classref-method + +:ref:`CollisionObject3D` **to_node** **(** **)** |const| + +Converts this GLTFPhysicsBody instance into a Godot :ref:`CollisionObject3D` node. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_gltfstate.rst b/classes/class_gltfstate.rst index f30b1953530..a47f9d000c6 100644 --- a/classes/class_gltfstate.rst +++ b/classes/class_gltfstate.rst @@ -12,9 +12,16 @@ GLTFState **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Represents all data of a GLTF file. + +.. rst-class:: classref-introduction-group + +Description +----------- - There is currently no description for this class. Please help us by :ref:`contributing one `! +Contains all nodes and resources of a GLTF file. This is used by :ref:`GLTFDocument` as data storage, which allows :ref:`GLTFDocument` and all :ref:`GLTFDocumentExtension` classes to remain stateless. + +GLTFState can be populated by :ref:`GLTFDocument` reading a file or by converting a Godot scene. Then the data can either be used to create a Godot scene or save to a GLTF file. The code that converts to/from a Godot scene can be intercepted at arbitrary points by :ref:`GLTFDocumentExtension` classes. This allows for custom data to be stored in the GLTF file or for custom data to be converted to/from Godot nodes. .. rst-class:: classref-reftable-group @@ -326,9 +333,7 @@ Property Descriptions - void **set_root_nodes** **(** :ref:`PackedInt32Array` value **)** - :ref:`PackedInt32Array` **get_root_nodes** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The root nodes of the GLTF file. Typically, a GLTF file will only have one scene, and therefore one root node. However, a GLTF file may have multiple scenes and therefore multiple root nodes, which will be generated as siblings of each other and as children of the root node of the generated Godot scene. .. rst-class:: classref-item-separator @@ -345,9 +350,7 @@ Property Descriptions - void **set_scene_name** **(** :ref:`String` value **)** - :ref:`String` **get_scene_name** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The name of the scene. When importing, if not specified, this will be the file name. When exporting, if specified, the scene name will be saved to the GLTF file. .. rst-class:: classref-item-separator @@ -423,9 +426,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_animation_player** **(** :ref:`int` idx **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the :ref:`AnimationPlayer` node with the given index. These nodes are only used during the export process when converting Godot :ref:`AnimationPlayer` nodes to GLTF animations. .. rst-class:: classref-item-separator @@ -437,9 +438,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_animation_players_count** **(** :ref:`int` idx **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the number of :ref:`AnimationPlayer` nodes in this **GLTFState**. These nodes are only used during the export process when converting Godot :ref:`AnimationPlayer` nodes to GLTF animations. .. rst-class:: classref-item-separator @@ -451,9 +450,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_animations** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of all :ref:`GLTFAnimation`\ s in the GLTF file. When importing, these will be generated as animations in an :ref:`AnimationPlayer` node. When exporting, these will be generated from Godot :ref:`AnimationPlayer` nodes. .. rst-class:: classref-item-separator @@ -479,9 +476,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_cameras** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of all :ref:`GLTFCamera`\ s in the GLTF file. These are the cameras that the :ref:`GLTFNode.camera` index refers to. .. rst-class:: classref-item-separator @@ -521,9 +516,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_lights** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of all :ref:`GLTFLight`\ s in the GLTF file. These are the lights that the :ref:`GLTFNode.light` index refers to. .. rst-class:: classref-item-separator @@ -549,9 +542,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_meshes** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of all :ref:`GLTFMesh`\ es in the GLTF file. These are the meshes that the :ref:`GLTFNode.mesh` index refers to. .. rst-class:: classref-item-separator @@ -563,9 +554,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_nodes** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of all :ref:`GLTFNode`\ s in the GLTF file. These are the nodes that :ref:`GLTFNode.children` and :ref:`root_nodes` refer to. This includes nodes that may not be generated in the Godot scene, or nodes that may generate multiple Godot scene nodes. .. rst-class:: classref-item-separator @@ -577,9 +566,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_scene_node** **(** :ref:`int` idx **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the Godot scene node that corresponds to the same index as the :ref:`GLTFNode` it was generated from. Not every :ref:`GLTFNode` will have a scene node generated, and not every generated scene node will have a corresponding :ref:`GLTFNode`. .. rst-class:: classref-item-separator @@ -591,9 +578,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_skeletons** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of all :ref:`GLTFSkeleton`\ s in the GLTF file. These are the skeletons that the :ref:`GLTFNode.skeleton` index refers to. .. rst-class:: classref-item-separator @@ -605,9 +590,7 @@ The argument should be the :ref:`GLTFDocumentExtension` **get_skins** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of all :ref:`GLTFSkin`\ s in the GLTF file. These are the skins that the :ref:`GLTFNode.skin` index refers to. .. rst-class:: classref-item-separator @@ -645,9 +628,7 @@ Retrieves the array of texture samplers that are used by the textures contained :ref:`String[]` **get_unique_animation_names** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of unique animation names. This is only used during the import process. .. rst-class:: classref-item-separator @@ -659,9 +640,7 @@ Retrieves the array of texture samplers that are used by the textures contained :ref:`String[]` **get_unique_names** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an array of unique node names. This is used in both the import process and export process. .. rst-class:: classref-item-separator @@ -701,9 +680,7 @@ The first argument should be the :ref:`GLTFDocumentExtension` animations **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`GLTFAnimation`\ s in the state. When importing, these will be generated as animations in an :ref:`AnimationPlayer` node. When exporting, these will be generated from Godot :ref:`AnimationPlayer` nodes. .. rst-class:: classref-item-separator @@ -729,9 +706,7 @@ void **set_buffer_views** **(** :ref:`GLTFBufferView[]` bu void **set_cameras** **(** :ref:`GLTFCamera[]` cameras **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`GLTFCamera`\ s in the state. These are the cameras that the :ref:`GLTFNode.camera` index refers to. .. rst-class:: classref-item-separator @@ -771,9 +746,7 @@ void **set_images** **(** :ref:`Texture2D[]` images **)** void **set_lights** **(** :ref:`GLTFLight[]` lights **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`GLTFLight`\ s in the state. These are the lights that the :ref:`GLTFNode.light` index refers to. .. rst-class:: classref-item-separator @@ -799,9 +772,7 @@ void **set_materials** **(** :ref:`Material[]` materials **)** void **set_meshes** **(** :ref:`GLTFMesh[]` meshes **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`GLTFMesh`\ es in the state. These are the meshes that the :ref:`GLTFNode.mesh` index refers to. .. rst-class:: classref-item-separator @@ -813,9 +784,7 @@ void **set_meshes** **(** :ref:`GLTFMesh[]` meshes **)** void **set_nodes** **(** :ref:`GLTFNode[]` nodes **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`GLTFNode`\ s in the state. These are the nodes that :ref:`GLTFNode.children` and :ref:`root_nodes` refer to. Some of the nodes set here may not be generated in the Godot scene, or may generate multiple Godot scene nodes. .. rst-class:: classref-item-separator @@ -827,9 +796,7 @@ void **set_nodes** **(** :ref:`GLTFNode[]` nodes **)** void **set_skeletons** **(** :ref:`GLTFSkeleton[]` skeletons **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`GLTFSkeleton`\ s in the state. These are the skeletons that the :ref:`GLTFNode.skeleton` index refers to. .. rst-class:: classref-item-separator @@ -841,9 +808,7 @@ void **set_skeletons** **(** :ref:`GLTFSkeleton[]` skeletons void **set_skins** **(** :ref:`GLTFSkin[]` skins **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`GLTFSkin`\ s in the state. These are the skins that the :ref:`GLTFNode.skin` index refers to. .. rst-class:: classref-item-separator @@ -881,9 +846,7 @@ void **set_textures** **(** :ref:`GLTFTexture[]` textures **) void **set_unique_animation_names** **(** :ref:`String[]` unique_animation_names **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the unique animation names in the state. This is only used during the import process. .. rst-class:: classref-item-separator @@ -895,9 +858,7 @@ void **set_unique_animation_names** **(** :ref:`String[]` unique_a void **set_unique_names** **(** :ref:`String[]` unique_names **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the unique node names in the state. This is used in both the import process and export process. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_gpuparticlescollisionheightfield3d.rst b/classes/class_gpuparticlescollisionheightfield3d.rst index 1babcdb91cc..3bdc1b71617 100644 --- a/classes/class_gpuparticlescollisionheightfield3d.rst +++ b/classes/class_gpuparticlescollisionheightfield3d.rst @@ -134,7 +134,7 @@ enum **UpdateMode**: :ref:`UpdateMode` **UPDATE_MODE_WHEN_MOVED** = ``0`` -Only update the heightmap when the **GPUParticlesCollisionHeightField3D** node is moved, or when the camera moves if :ref:`follow_camera_enabled` is ``true``. An update can be forced by slightly moving the **GPUParticlesCollisionHeightField3D** in any direction. +Only update the heightmap when the **GPUParticlesCollisionHeightField3D** node is moved, or when the camera moves if :ref:`follow_camera_enabled` is ``true``. An update can be forced by slightly moving the **GPUParticlesCollisionHeightField3D** in any direction, or by calling :ref:`RenderingServer.particles_collision_height_field_update`. .. _class_GPUParticlesCollisionHeightField3D_constant_UPDATE_MODE_ALWAYS: diff --git a/classes/class_gradient.rst b/classes/class_gradient.rst index 41059a37fc4..577b425424e 100644 --- a/classes/class_gradient.rst +++ b/classes/class_gradient.rst @@ -239,6 +239,8 @@ void **reverse** **(** **)** Reverses/mirrors the gradient. +\ **Note:** This method mirrors all points around the middle of the gradient, which may produce unexpected results when :ref:`interpolation_mode` is set to :ref:`GRADIENT_INTERPOLATE_CONSTANT`. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_graphedit.rst b/classes/class_graphedit.rst index 0940b2e4656..752fb56f360 100644 --- a/classes/class_graphedit.rst +++ b/classes/class_graphedit.rst @@ -727,8 +727,8 @@ Below is a sample code to help get started: :: func _is_in_input_hotzone(in_node, in_port, mouse_position): - var port_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) - var port_pos : Vector2 = in_node.get_position() + in_node.get_connection_input_position(in_port) - port_size / 2 + var port_size: Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) + var port_pos: Vector2 = in_node.get_position() + in_node.get_connection_input_position(in_port) - port_size / 2 var rect = Rect2(port_pos, port_size) return rect.has_point(mouse_position) @@ -750,8 +750,8 @@ Below is a sample code to help get started: :: func _is_in_output_hotzone(in_node, in_port, mouse_position): - var port_size : Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) - var port_pos : Vector2 = in_node.get_position() + in_node.get_connection_output_position(in_port) - port_size / 2 + var port_size: Vector2 = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical")) + var port_pos: Vector2 = in_node.get_position() + in_node.get_connection_output_position(in_port) - port_size / 2 var rect = Rect2(port_pos, port_size) return rect.has_point(mouse_position) diff --git a/classes/class_graphnode.rst b/classes/class_graphnode.rst index 784a50a297f..40e5af47b9c 100644 --- a/classes/class_graphnode.rst +++ b/classes/class_graphnode.rst @@ -146,7 +146,7 @@ Theme Properties +-----------------------------------+----------------------------------------------------------------------+-----------------------------------+ | :ref:`Color` | :ref:`title_color` | ``Color(0.875, 0.875, 0.875, 1)`` | +-----------------------------------+----------------------------------------------------------------------+-----------------------------------+ - | :ref:`int` | :ref:`close_h_offset` | ``22`` | + | :ref:`int` | :ref:`close_h_offset` | ``12`` | +-----------------------------------+----------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`close_offset` | ``22`` | +-----------------------------------+----------------------------------------------------------------------+-----------------------------------+ @@ -933,7 +933,7 @@ Color of the title text. .. rst-class:: classref-themeproperty -:ref:`int` **close_h_offset** = ``22`` +:ref:`int` **close_h_offset** = ``12`` .. container:: contribute diff --git a/classes/class_hmaccontext.rst b/classes/class_hmaccontext.rst index 0c33cf745b4..045fa308d6c 100644 --- a/classes/class_hmaccontext.rst +++ b/classes/class_hmaccontext.rst @@ -30,11 +30,11 @@ The HMACContext class is useful for advanced HMAC use cases, such as streaming t var ctx = HMACContext.new() func _ready(): - var key = "supersecret".to_utf8() + var key = "supersecret".to_utf8_buffer() var err = ctx.start(HashingContext.HASH_SHA256, key) assert(err == OK) - var msg1 = "this is ".to_utf8() - var msg2 = "super duper secret".to_utf8() + var msg1 = "this is ".to_utf8_buffer() + var msg2 = "super duper secret".to_utf8_buffer() err = ctx.update(msg1) assert(err == OK) err = ctx.update(msg2) @@ -54,11 +54,11 @@ The HMACContext class is useful for advanced HMAC use cases, such as streaming t public override void _Ready() { - byte[] key = "supersecret".ToUtf8(); + byte[] key = "supersecret".ToUtf8Buffer(); Error err = _ctx.Start(HashingContext.HashType.Sha256, key); Debug.Assert(err == Error.Ok); - byte[] msg1 = "this is ".ToUtf8(); - byte[] msg2 = "super duper secret".ToUtf8(); + byte[] msg1 = "this is ".ToUtf8Buffer(); + byte[] msg2 = "super duper secret".ToUtf8Buffer(); err = _ctx.Update(msg1); Debug.Assert(err == Error.Ok); err = _ctx.Update(msg2); diff --git a/classes/class_hslider.rst b/classes/class_hslider.rst index b1aa0be0236..b83747fc75e 100644 --- a/classes/class_hslider.rst +++ b/classes/class_hslider.rst @@ -31,6 +31,8 @@ Theme Properties .. table:: :widths: auto + +-----------------------------------+---------------------------------------------------------------------------------+-------+ + | :ref:`int` | :ref:`center_grabber` | ``0`` | +-----------------------------------+---------------------------------------------------------------------------------+-------+ | :ref:`int` | :ref:`grabber_offset` | ``0`` | +-----------------------------------+---------------------------------------------------------------------------------+-------+ @@ -58,6 +60,18 @@ Theme Properties Theme Property Descriptions --------------------------- +.. _class_HSlider_theme_constant_center_grabber: + +.. rst-class:: classref-themeproperty + +:ref:`int` **center_grabber** = ``0`` + +Boolean constant. If ``1``, the grabber texture size will be ignored and it will fit within slider's bounds based only on its center position. + +.. rst-class:: classref-item-separator + +---- + .. _class_HSlider_theme_constant_grabber_offset: .. rst-class:: classref-themeproperty diff --git a/classes/class_image.rst b/classes/class_image.rst index bb85bd15085..d5423560979 100644 --- a/classes/class_image.rst +++ b/classes/class_image.rst @@ -153,10 +153,10 @@ Methods +-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Image` | :ref:`rgbe_to_srgb` **(** **)** | +-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`rotate_180` **(** **)** | - +-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`rotate_90` **(** :ref:`ClockDirection` direction **)** | +-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`rotate_180` **(** **)** | + +-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`save_exr` **(** :ref:`String` path, :ref:`bool` grayscale=false **)** |const| | +-----------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedByteArray` | :ref:`save_exr_to_buffer` **(** :ref:`bool` grayscale=false **)** |const| | @@ -671,6 +671,22 @@ Use ETC2 compression. Use BPTC compression. +.. _class_Image_constant_COMPRESS_ASTC: + +.. rst-class:: classref-enumeration-constant + +:ref:`CompressMode` **COMPRESS_ASTC** = ``4`` + +Use ASTC compression. + +.. _class_Image_constant_COMPRESS_MAX: + +.. rst-class:: classref-enumeration-constant + +:ref:`CompressMode` **COMPRESS_MAX** = ``5`` + +Represents the size of the :ref:`CompressMode` enum. + .. rst-class:: classref-item-separator ---- @@ -934,7 +950,7 @@ Removes the image's mipmaps. Compresses the image to use less memory. Can not directly access pixel data while the image is compressed. Returns error if the chosen compression mode is not available. -The ``mode`` parameter helps to pick the best compression method for DXT and ETC2 formats. It is ignored for ASTC compression. +The ``source`` parameter helps to pick the best compression method for DXT and ETC2 formats. It is ignored for ASTC compression. For ASTC compression, the ``astc_format`` parameter must be supplied. @@ -1466,25 +1482,25 @@ Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image. ---- -.. _class_Image_method_rotate_180: +.. _class_Image_method_rotate_90: .. rst-class:: classref-method -void **rotate_180** **(** **)** +void **rotate_90** **(** :ref:`ClockDirection` direction **)** -Rotates the image by ``180`` degrees. The width and height of the image must be greater than ``1``. +Rotates the image in the specified ``direction`` by ``90`` degrees. The width and height of the image must be greater than ``1``. If the width and height are not equal, the image will be resized. .. rst-class:: classref-item-separator ---- -.. _class_Image_method_rotate_90: +.. _class_Image_method_rotate_180: .. rst-class:: classref-method -void **rotate_90** **(** :ref:`ClockDirection` direction **)** +void **rotate_180** **(** **)** -Rotates the image in the specified ``direction`` by ``90`` degrees. The width and height of the image must be greater than ``1``. If the width and height are not equal, the image will be resized. +Rotates the image by ``180`` degrees. The width and height of the image must be greater than ``1``. .. rst-class:: classref-item-separator diff --git a/classes/class_imagetexture.rst b/classes/class_imagetexture.rst index 9b29941d1ab..98a191b19d4 100644 --- a/classes/class_imagetexture.rst +++ b/classes/class_imagetexture.rst @@ -43,7 +43,7 @@ This is because images have to be imported as a :ref:`CompressedTexture2D`. diff --git a/classes/class_immediatemesh.rst b/classes/class_immediatemesh.rst index 257eb286d7c..71cc344db4b 100644 --- a/classes/class_immediatemesh.rst +++ b/classes/class_immediatemesh.rst @@ -19,7 +19,35 @@ Mesh optimized for creating geometry manually. Description ----------- -Mesh optimized for creating geometry manually, similar to OpenGL1.x immediate mode. +A mesh type optimized for creating geometry manually, similar to OpenGL 1.x immediate mode. + +Here's a sample on how to generate a triangular face: + + +.. tabs:: + +var mesh = ImmediateMesh.new() + +mesh.surface_begin(Mesh.PRIMITIVE_TRIANGLES) + +mesh.surface_add_vertex(Vector3.LEFT) + +mesh.surface_add_vertex(Vector3.FORWARD) + +mesh.surface_add_vertex(Vector3.ZERO) + +mesh.surface_end() + + + +\ **Note:** Generating complex geometries with **ImmediateMesh** is highly inefficient. Instead, it is designed to generate simple geometry that changes often. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using ImmediateMesh <../tutorials/3d/procedural_geometry/immediatemesh>` .. rst-class:: classref-reftable-group diff --git a/classes/class_input.rst b/classes/class_input.rst index 64a5bac9052..07051b63de6 100644 --- a/classes/class_input.rst +++ b/classes/class_input.rst @@ -21,6 +21,8 @@ Description A singleton that deals with inputs. This includes key presses, mouse buttons and movement, joypads, and input actions. Actions and their events can be set in the **Input Map** tab in the **Project > Project Settings**, or with the :ref:`InputMap` class. +\ **Note:** The methods here reflect the global input state and are not affected by :ref:`Control.accept_event` or :ref:`Viewport.set_input_as_handled`, which only deal with the way input is propagated in the :ref:`SceneTree`. + .. rst-class:: classref-introduction-group Tutorials @@ -901,13 +903,13 @@ void **set_custom_mouse_cursor** **(** :ref:`Resource` image, :r Sets a custom mouse cursor image, which is only visible inside the game window. The hotspot can also be specified. Passing ``null`` to the image parameter resets to the system cursor. See :ref:`CursorShape` for the list of shapes. -\ ``image``'s size must be lower than 256×256. +\ ``image``'s size must be lower than or equal to 256×256. To avoid rendering issues, sizes lower than or equal to 128×128 are recommended. \ ``hotspot`` must be within ``image``'s size. \ **Note:** :ref:`AnimatedTexture`\ s aren't supported as custom mouse cursors. If using an :ref:`AnimatedTexture`, only the first frame will be displayed. -\ **Note:** Only images imported with the **Lossless**, **Lossy** or **Uncompressed** compression modes are supported. The **Video RAM** compression mode can't be used for custom cursors. +\ **Note:** The **Lossless**, **Lossy** or **Uncompressed** compression modes are recommended. The **Video RAM** compression mode can be used, but it will be decompressed on the CPU, which means loading times are slowed down and no memory is saved compared to lossless modes. \ **Note:** On the web platform, the maximum allowed cursor image size is 128×128. Cursor images larger than 32×32 will also only be displayed if the mouse cursor image is entirely located within the page for `security reasons `__. diff --git a/classes/class_inputeventfromwindow.rst b/classes/class_inputeventfromwindow.rst index 9ae4dd5fc39..7065219ff08 100644 --- a/classes/class_inputeventfromwindow.rst +++ b/classes/class_inputeventfromwindow.rst @@ -14,9 +14,14 @@ InputEventFromWindow **Inherited By:** :ref:`InputEventScreenDrag`, :ref:`InputEventScreenTouch`, :ref:`InputEventWithModifiers` -.. container:: contribute +Base class for :ref:`Viewport`-based input events. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +InputEventFromWindow represents events specifically received by windows. This includes mouse events, keyboard events in focused windows or touch screen actions. .. rst-class:: classref-reftable-group @@ -50,9 +55,7 @@ Property Descriptions - void **set_window_id** **(** :ref:`int` value **)** - :ref:`int` **get_window_id** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The ID of a :ref:`Window` that received this event. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_inputeventgesture.rst b/classes/class_inputeventgesture.rst index d66d668f6e0..ceb0aa276e5 100644 --- a/classes/class_inputeventgesture.rst +++ b/classes/class_inputeventgesture.rst @@ -16,6 +16,13 @@ InputEventGesture Base class for touch control gestures. +.. rst-class:: classref-introduction-group + +Description +----------- + +InputEventGesture is sent when a user performs a supported gesture on a touch screen. Gestures can't be emulated using mouse, because they typically require multi-touch. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_inputeventmagnifygesture.rst b/classes/class_inputeventmagnifygesture.rst index 95d092cb125..cb93e7ae582 100644 --- a/classes/class_inputeventmagnifygesture.rst +++ b/classes/class_inputeventmagnifygesture.rst @@ -12,9 +12,14 @@ InputEventMagnifyGesture **Inherits:** :ref:`InputEventGesture` **<** :ref:`InputEventWithModifiers` **<** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +:ref:`InputEvent` that represents a magnifying touch gesture. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +Magnify gesture is performed when the user pinches the touch screen. It's typically used for zooming. .. rst-class:: classref-reftable-group @@ -48,9 +53,7 @@ Property Descriptions - void **set_factor** **(** :ref:`float` value **)** - :ref:`float` **get_factor** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The amount (or delta) of the event. This value is higher the faster the gesture is performed. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_inputeventpangesture.rst b/classes/class_inputeventpangesture.rst index 2b87cdc7b42..1c58524a15b 100644 --- a/classes/class_inputeventpangesture.rst +++ b/classes/class_inputeventpangesture.rst @@ -12,9 +12,14 @@ InputEventPanGesture **Inherits:** :ref:`InputEventGesture` **<** :ref:`InputEventWithModifiers` **<** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +:ref:`InputEvent` that represents a panning touch gesture. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +Pan gesture is performed when the user swipes the touch screen with two fingers. It's typically used for panning/scrolling. .. rst-class:: classref-reftable-group @@ -48,9 +53,7 @@ Property Descriptions - void **set_delta** **(** :ref:`Vector2` value **)** - :ref:`Vector2` **get_delta** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Panning amount since last pan event. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_inputeventshortcut.rst b/classes/class_inputeventshortcut.rst index cd043aa6afd..392c478b742 100644 --- a/classes/class_inputeventshortcut.rst +++ b/classes/class_inputeventshortcut.rst @@ -12,9 +12,14 @@ InputEventShortcut **Inherits:** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +:ref:`InputEvent` that signifies a triggered keyboard :ref:`Shortcut`. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +InputEventShortcut is a special event that can be received in :ref:`Node._unhandled_key_input`. It's typically sent by the editor's Command Palette to trigger actions, but can also be sent manually using :ref:`Viewport.push_unhandled_input`. .. rst-class:: classref-reftable-group @@ -48,9 +53,7 @@ Property Descriptions - void **set_shortcut** **(** :ref:`Shortcut` value **)** - :ref:`Shortcut` **get_shortcut** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The :ref:`Shortcut` represented by this event. Its :ref:`Shortcut.matches_event` method will always return ``true`` for this event. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_int.rst b/classes/class_int.rst index b930c7f14c7..2dda122c1fa 100644 --- a/classes/class_int.rst +++ b/classes/class_int.rst @@ -10,51 +10,52 @@ int === -Integer built-in type. +Built-in integer Variant type. .. rst-class:: classref-introduction-group Description ----------- -Signed 64-bit integer type. +Signed 64-bit integer type. This means that it can take values from ``-2^63`` to ``2^63 - 1``, i.e. from ``-9223372036854775808`` to ``9223372036854775807``. When it exceeds these bounds, it will wrap around. -It can take values in the interval ``[-2^63, 2^63 - 1]``, i.e. ``[-9223372036854775808, 9223372036854775807]``. Exceeding those bounds will wrap around. +\ **int**\ s can be automatically converted to :ref:`float`\ s when necessary, for example when passing them as arguments in functions. The :ref:`float` will be as close to the original integer as possible. -\ **int** is a :ref:`Variant` type, and will thus be used when assigning an integer value to a :ref:`Variant`. It can also be enforced with the ``: int`` type hint. +Likewise, :ref:`float`\ s can be automatically converted into **int**\ s. This will truncate the :ref:`float`, discarding anything after the floating point. + +\ **Note:** In a boolean context, an **int** will evaluate to ``false`` if it equals ``0``, and to ``true`` otherwise. .. tabs:: .. code-tab:: gdscript - var my_variant = 0 # int, value 0. - my_variant += 4.2 # float, value 4.2. - var my_int: int = 1 # int, value 1. - my_int = 4.2 # int, value 4, the right value is implicitly cast to int. - my_int = int("6.7") # int, value 6, the String is explicitly cast with int. - var max_int = 9223372036854775807 - print(max_int) # 9223372036854775807, OK. - max_int += 1 - print(max_int) # -9223372036854775808, we overflowed and wrapped around. + var x: int = 1 # x is 1 + x = 4.2 # x is 4, because 4.2 gets truncated + var max_int = 9223372036854775807 # Biggest value an int can store + max_int += 1 # max_int is -9223372036854775808, because it wrapped around .. code-tab:: csharp - int myInt = (int)"6.7".ToFloat(); // int, value 6, the String is explicitly cast with int. - // We have to use `long` here, because GDSript's `int` - // is 64 bits long while C#'s `int` is only 32 bits. - long maxInt = 9223372036854775807; - GD.Print(maxInt); // 9223372036854775807, OK. - maxInt++; - GD.Print(maxInt); // -9223372036854775808, we overflowed and wrapped around. + int x = 1; // x is 1 + x = 4.2; // x is 4, because 4.2 gets truncated + // We use long below, because GDScript's int is 64-bit while C#'s int is 32-bit. + long maxLong = 9223372036854775807; // Biggest value a long can store + maxLong++; // maxLong is now -9223372036854775808, because it wrapped around. - // Alternatively, if we used C#'s 32-bit `int` type, the maximum value is much smaller: - int halfInt = 2147483647; - GD.Print(halfInt); // 2147483647, OK. - halfInt++; - GD.Print(halfInt); // -2147483648, we overflowed and wrapped around. + // Alternatively with C#'s 32-bit int type, which has a smaller maximum value. + int maxInt = 2147483647; // Biggest value an int can store + maxInt++; // maxInt is now -2147483648, because it wrapped around + + +In GDScript, you can use the ``0b`` literal for binary representation, the ``0x`` literal for hexadecimal representation, and the ``_`` symbol to separate long numbers and improve readability. + +:: + var x = 0b1001 # x is 9 + var y = 0xF5 # y is 245 + var z = 10_000_000 # z is 10000000 .. rst-class:: classref-reftable-group @@ -179,7 +180,7 @@ Constructor Descriptions :ref:`int` **int** **(** **)** -Constructs a default-initialized **int** set to ``0``. +Constructs an **int** set to ``0``. .. rst-class:: classref-item-separator @@ -199,7 +200,7 @@ Constructs an **int** as a copy of the given **int**. :ref:`int` **int** **(** :ref:`String` from **)** -Converts a :ref:`String` to an **int**, following the same rules as :ref:`String.to_int`. +Constructs a new **int** from a :ref:`String`, following the same rules as :ref:`String.to_int`. .. rst-class:: classref-item-separator @@ -209,7 +210,7 @@ Converts a :ref:`String` to an **int**, following the same rules a :ref:`int` **int** **(** :ref:`bool` from **)** -Cast a :ref:`bool` value to an integer value, ``int(true)`` will be equals to 1 and ``int(false)`` will be equals to 0. +Constructs a new **int** from a :ref:`bool`. ``true`` is converted to ``1`` and ``false`` is converted to ``0``. .. rst-class:: classref-item-separator @@ -219,7 +220,7 @@ Cast a :ref:`bool` value to an integer value, ``int(true)`` will be :ref:`int` **int** **(** :ref:`float` from **)** -Cast a float value to an integer value, this method simply removes the number fractions (i.e. rounds ``from`` towards zero), so for example ``int(2.7)`` will be equals to 2, ``int(0.1)`` will be equals to 0 and ``int(-2.7)`` will be equals to -2. This operation is also called truncation. +Constructs a new **int** from a :ref:`float`. This will truncate the :ref:`float`, discarding anything after the floating point. .. rst-class:: classref-section-separator @@ -236,7 +237,7 @@ Operator Descriptions :ref:`bool` **operator !=** **(** :ref:`float` right **)** -Returns ``true`` if this **int** is not equivalent to the given :ref:`float`. +Returns ``true`` if the **int** is not equivalent to the :ref:`float`. .. rst-class:: classref-item-separator @@ -248,7 +249,7 @@ Returns ``true`` if this **int** is not equivalent to the given :ref:`float` **operator !=** **(** :ref:`int` right **)** -Returns ``true`` if the integers are not equal. +Returns ``true`` if the **int**\ s are not equal. .. rst-class:: classref-item-separator @@ -260,13 +261,13 @@ Returns ``true`` if the integers are not equal. :ref:`int` **operator %** **(** :ref:`int` right **)** -Returns the remainder after dividing two integers. This operation uses truncated division, which is often not desired as it does not work well with negative numbers. Consider using :ref:`@GlobalScope.posmod` instead if you want to handle negative numbers. +Returns the remainder after dividing two **int**\ s. Uses truncated division, which returns a negative number if the dividend is negative. If this is not desired, consider using :ref:`@GlobalScope.posmod`. :: - print(5 % 2) # 1 - print(12 % 4) # 0 - print(-5 % 3) # -2 + print(6 % 2) # Prints 0 + print(11 % 4) # Prints 3 + print(-5 % 3) # Prints -2 .. rst-class:: classref-item-separator @@ -278,21 +279,20 @@ Returns the remainder after dividing two integers. This operation uses truncated :ref:`int` **operator &** **(** :ref:`int` right **)** -Returns the result of bitwise ``AND`` operation for two integers. +Performs the bitwise ``AND`` operation. :: - print(3 & 1) # 1 - print(11 & 3) # 3 + print(0b1100 & 0b1010) # Prints 8 (binary 1000) -It's useful to retrieve binary flags from a variable. +This is useful for retrieving binary flags from a variable. :: - var flags = 5 - # Do something if the first bit is enabled. - if flags & 1: - do_stuff() + var flags = 0b101 + # Check if the first or second bit are enabled. + if flags & 0b011: + do_stuff() # This line will run. .. rst-class:: classref-item-separator @@ -304,7 +304,7 @@ It's useful to retrieve binary flags from a variable. :ref:`Color` **operator *** **(** :ref:`Color` right **)** -Multiplies each component of the :ref:`Color` by the given **int**. +Multiplies each component of the :ref:`Color` by the **int**. .. rst-class:: classref-item-separator @@ -316,7 +316,7 @@ Multiplies each component of the :ref:`Color` by the given **int**. :ref:`Quaternion` **operator *** **(** :ref:`Quaternion` right **)** -Multiplies each component of the :ref:`Quaternion` by the given **int**. This operation is not meaningful on its own, but it can be used as a part of a larger expression. +Multiplies each component of the :ref:`Quaternion` by the **int**. This operation is not meaningful on its own, but it can be used as a part of a larger expression. .. rst-class:: classref-item-separator @@ -328,11 +328,11 @@ Multiplies each component of the :ref:`Quaternion` by the give :ref:`Vector2` **operator *** **(** :ref:`Vector2` right **)** -Multiplies each component of the :ref:`Vector2` by the given **int**. +Multiplies each component of the :ref:`Vector2` by the **int**. :: - print(2 * Vector2(1, 1)) # Vector2(2, 2) + print(2 * Vector2(1, 4)) # Prints (2, 8) .. rst-class:: classref-item-separator @@ -344,7 +344,7 @@ Multiplies each component of the :ref:`Vector2` by the given **in :ref:`Vector2i` **operator *** **(** :ref:`Vector2i` right **)** -Multiplies each component of the :ref:`Vector2i` by the given **int**. +Multiplies each component of the :ref:`Vector2i` by the **int**. .. rst-class:: classref-item-separator @@ -356,7 +356,7 @@ Multiplies each component of the :ref:`Vector2i` by the given ** :ref:`Vector3` **operator *** **(** :ref:`Vector3` right **)** -Multiplies each component of the :ref:`Vector3` by the given **int**. +Multiplies each component of the :ref:`Vector3` by the **int**. .. rst-class:: classref-item-separator @@ -368,7 +368,7 @@ Multiplies each component of the :ref:`Vector3` by the given **in :ref:`Vector3i` **operator *** **(** :ref:`Vector3i` right **)** -Multiplies each component of the :ref:`Vector3i` by the given **int**. +Multiplies each component of the :ref:`Vector3i` by the **int**. .. rst-class:: classref-item-separator @@ -380,7 +380,7 @@ Multiplies each component of the :ref:`Vector3i` by the given ** :ref:`Vector4` **operator *** **(** :ref:`Vector4` right **)** -Multiplies each component of the :ref:`Vector4` by the given **int**. +Multiplies each component of the :ref:`Vector4` by the **int**. .. rst-class:: classref-item-separator @@ -392,7 +392,7 @@ Multiplies each component of the :ref:`Vector4` by the given **in :ref:`Vector4i` **operator *** **(** :ref:`Vector4i` right **)** -Multiplies each component of the :ref:`Vector4i` by the given **int**. +Multiplies each component of the :ref:`Vector4i` by the **int**. .. rst-class:: classref-item-separator @@ -404,7 +404,7 @@ Multiplies each component of the :ref:`Vector4i` by the given ** :ref:`float` **operator *** **(** :ref:`float` right **)** -Multiplies an **int** and a :ref:`float`. The result is a :ref:`float`. +Multiplies the :ref:`float` by the **int**. The result is a :ref:`float`. .. rst-class:: classref-item-separator @@ -416,7 +416,7 @@ Multiplies an **int** and a :ref:`float`. The result is a :ref:`flo :ref:`int` **operator *** **(** :ref:`int` right **)** -Multiplies two **int**\ s. +Multiplies the two **int**\ s. .. rst-class:: classref-item-separator @@ -432,7 +432,7 @@ Raises an **int** to a power of a :ref:`float`. The result is a :re :: - print(8**0.25) # 1.68179283050743 + print(2 ** 0.5) # Prints 1.4142135623731 .. rst-class:: classref-item-separator @@ -444,11 +444,11 @@ Raises an **int** to a power of a :ref:`float`. The result is a :re :ref:`int` **operator **** **(** :ref:`int` right **)** -Raises an **int** to a power of a **int**. +Raises the left **int** to a power of the right **int**. :: - print(5**5) # 3125 + print(3 ** 4) # Prints 81 .. rst-class:: classref-item-separator @@ -460,7 +460,7 @@ Raises an **int** to a power of a **int**. :ref:`float` **operator +** **(** :ref:`float` right **)** -Adds an **int** and a :ref:`float`. The result is a :ref:`float`. +Adds the **int** and the :ref:`float`. The result is a :ref:`float`. .. rst-class:: classref-item-separator @@ -472,7 +472,7 @@ Adds an **int** and a :ref:`float`. The result is a :ref:`float` **operator +** **(** :ref:`int` right **)** -Adds two integers. +Adds the two **int**\ s. .. rst-class:: classref-item-separator @@ -484,7 +484,7 @@ Adds two integers. :ref:`float` **operator -** **(** :ref:`float` right **)** -Subtracts a :ref:`float` from an **int**. The result is a :ref:`float`. +Subtracts the :ref:`float` from the **int**. The result is a :ref:`float`. .. rst-class:: classref-item-separator @@ -496,7 +496,7 @@ Subtracts a :ref:`float` from an **int**. The result is a :ref:`flo :ref:`int` **operator -** **(** :ref:`int` right **)** -Subtracts two integers. +Subtracts the two **int**\ s. .. rst-class:: classref-item-separator @@ -508,11 +508,11 @@ Subtracts two integers. :ref:`float` **operator /** **(** :ref:`float` right **)** -Divides an **int** by a :ref:`float`. The result is a :ref:`float`. +Divides the **int** by the :ref:`float`. The result is a :ref:`float`. :: - print(10 / 3.0) # 3.333... + print(10 / 3.0) # Prints 3.33333333333333 .. rst-class:: classref-item-separator @@ -524,12 +524,12 @@ Divides an **int** by a :ref:`float`. The result is a :ref:`float` **operator /** **(** :ref:`int` right **)** -Divides two integers. The decimal part of the result is discarded (truncated). +Divides the two **int**\ s. The result is an **int**. This will truncate the :ref:`float`, discarding anything after the floating point. :: - print(10 / 2) # 5 - print(10 / 3) # 3 + print(6 / 2) # Prints 3 + print(5 / 3) # Prints 1 .. rst-class:: classref-item-separator @@ -541,7 +541,7 @@ Divides two integers. The decimal part of the result is discarded (truncated). :ref:`bool` **operator <** **(** :ref:`float` right **)** -Returns ``true`` if this **int** is less than the given :ref:`float`. +Returns ``true`` if the **int** is less than the :ref:`float`. .. rst-class:: classref-item-separator @@ -553,7 +553,7 @@ Returns ``true`` if this **int** is less than the given :ref:`float :ref:`bool` **operator <** **(** :ref:`int` right **)** -Returns ``true`` if the left integer is less than the right one. +Returns ``true`` if the left **int** is less than the right **int**. .. rst-class:: classref-item-separator @@ -565,12 +565,12 @@ Returns ``true`` if the left integer is less than the right one. :ref:`int` **operator <<** **(** :ref:`int` right **)** -Performs bitwise shift left operation on the integer. Effectively the same as multiplying by a power of 2. +Performs the bitwise shift left operation. Effectively the same as multiplying by a power of 2. :: - print(10 << 1) # 20 - print(10 << 4) # 160 + print(0b1010 << 1) # Prints 20 (binary 10100) + print(0b1010 << 3) # Prints 80 (binary 1010000) .. rst-class:: classref-item-separator @@ -582,7 +582,7 @@ Performs bitwise shift left operation on the integer. Effectively the same as mu :ref:`bool` **operator <=** **(** :ref:`float` right **)** -Returns ``true`` if this **int** is less than or equal to the given :ref:`float`. +Returns ``true`` if the **int** is less than or equal to the :ref:`float`. .. rst-class:: classref-item-separator @@ -594,7 +594,7 @@ Returns ``true`` if this **int** is less than or equal to the given :ref:`float< :ref:`bool` **operator <=** **(** :ref:`int` right **)** -Returns ``true`` if the left integer is less than or equal to the right one. +Returns ``true`` if the left **int** is less than or equal to the right **int**. .. rst-class:: classref-item-separator @@ -606,7 +606,7 @@ Returns ``true`` if the left integer is less than or equal to the right one. :ref:`bool` **operator ==** **(** :ref:`float` right **)** -Returns ``true`` if the integer is equal to the given :ref:`float`. +Returns ``true`` if the **int** is equal to the :ref:`float`. .. rst-class:: classref-item-separator @@ -618,7 +618,7 @@ Returns ``true`` if the integer is equal to the given :ref:`float`. :ref:`bool` **operator ==** **(** :ref:`int` right **)** -Returns ``true`` if both integers are equal. +Returns ``true`` if the two **int**\ s are equal. .. rst-class:: classref-item-separator @@ -630,7 +630,7 @@ Returns ``true`` if both integers are equal. :ref:`bool` **operator >** **(** :ref:`float` right **)** -Returns ``true`` if this **int** is greater than the given :ref:`float`. +Returns ``true`` if the **int** is greater than the :ref:`float`. .. rst-class:: classref-item-separator @@ -642,7 +642,7 @@ Returns ``true`` if this **int** is greater than the given :ref:`float` **operator >** **(** :ref:`int` right **)** -Returns ``true`` if the left integer is greater than the right one. +Returns ``true`` if the left **int** is greater than the right **int**. .. rst-class:: classref-item-separator @@ -654,7 +654,7 @@ Returns ``true`` if the left integer is greater than the right one. :ref:`bool` **operator >=** **(** :ref:`float` right **)** -Returns ``true`` if this **int** is greater than or equal to the given :ref:`float`. +Returns ``true`` if the **int** is greater than or equal to the :ref:`float`. .. rst-class:: classref-item-separator @@ -666,7 +666,7 @@ Returns ``true`` if this **int** is greater than or equal to the given :ref:`flo :ref:`bool` **operator >=** **(** :ref:`int` right **)** -Returns ``true`` if the left integer is greater than or equal to the right one. +Returns ``true`` if the left **int** is greater than or equal to the right **int**. .. rst-class:: classref-item-separator @@ -678,12 +678,12 @@ Returns ``true`` if the left integer is greater than or equal to the right one. :ref:`int` **operator >>** **(** :ref:`int` right **)** -Performs bitwise shift right operation on the integer. Effectively the same as dividing by a power of 2. +Performs the bitwise shift right operation. Effectively the same as dividing by a power of 2. :: - print(10 >> 1) # 5 - print(10 >> 2) # 2 + print(0b1010 >> 1) # Prints 5 (binary 101) + print(0b1010 >> 2) # Prints 2 (binary 10) .. rst-class:: classref-item-separator @@ -695,12 +695,11 @@ Performs bitwise shift right operation on the integer. Effectively the same as d :ref:`int` **operator ^** **(** :ref:`int` right **)** -Returns the result of bitwise ``XOR`` operation for two integers. +Performs the bitwise ``XOR`` operation. :: - print(5 ^ 1) # 4 - print(4 ^ 7) # 3 + print(0b1100 ^ 0b1010) # Prints 6 (binary 110) .. rst-class:: classref-item-separator @@ -736,21 +735,18 @@ Returns the negated value of the **int**. If positive, turns the number negative :ref:`int` **operator |** **(** :ref:`int` right **)** -Returns the result of bitwise ``OR`` operation for two integers. +Performs the bitwise ``OR`` operation. :: - print(2 | 4) # 6 - print(1 | 3) # 3 + print(0b1100 | 0b1010) # Prints 14 (binary 1110) -It's useful to store binary flags in a variable. +This is useful for storing binary flags in a variable. :: var flags = 0 - # Turn first and third bit on. - flags |= 1 - flags |= 4 + flags |= 0b101 # Turn the first and third bits on. .. rst-class:: classref-item-separator @@ -762,12 +758,12 @@ It's useful to store binary flags in a variable. :ref:`int` **operator ~** **(** **)** -Returns the result of bitwise ``NOT`` operation for the integer. It's effectively equal to ``-int + 1``. +Performs the bitwise ``NOT`` operation on the **int**. Due to `2's complement `__, it's effectively equal to ``-(int + 1)``. :: - print(~4) # -3 - print(~7) # -6 + print(~4) # Prints -5 + print(~(-7)) # Prints 6 .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_itemlist.rst b/classes/class_itemlist.rst index 0d5263dc8ed..7d65c664dd4 100644 --- a/classes/class_itemlist.rst +++ b/classes/class_itemlist.rst @@ -42,6 +42,8 @@ Properties +---------------------------------------------------------+-----------------------------------------------------------------------------+---------------------------------------------------------------------------+ | :ref:`bool` | :ref:`allow_rmb_select` | ``false`` | +---------------------------------------------------------+-----------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`allow_search` | ``true`` | + +---------------------------------------------------------+-----------------------------------------------------------------------------+---------------------------------------------------------------------------+ | :ref:`bool` | :ref:`auto_height` | ``false`` | +---------------------------------------------------------+-----------------------------------------------------------------------------+---------------------------------------------------------------------------+ | :ref:`bool` | clip_contents | ``true`` (overrides :ref:`Control`) | @@ -106,6 +108,8 @@ Methods +--------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Variant` | :ref:`get_item_metadata` **(** :ref:`int` idx **)** |const| | +--------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Rect2` | :ref:`get_item_rect` **(** :ref:`int` idx, :ref:`bool` expand=true **)** |const| | + +--------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_item_text` **(** :ref:`int` idx **)** |const| | +--------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TextDirection` | :ref:`get_item_text_direction` **(** :ref:`int` idx **)** |const| | @@ -176,6 +180,8 @@ Theme Properties +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ | :ref:`Color` | :ref:`font_color` | ``Color(0.65, 0.65, 0.65, 1)`` | +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ + | :ref:`Color` | :ref:`font_hovered_color` | ``Color(0.95, 0.95, 0.95, 1)`` | + +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ | :ref:`Color` | :ref:`font_outline_color` | ``Color(1, 1, 1, 1)`` | +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ | :ref:`Color` | :ref:`font_selected_color` | ``Color(1, 1, 1, 1)`` | @@ -202,6 +208,8 @@ Theme Properties +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ | :ref:`StyleBox` | :ref:`focus` | | +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ + | :ref:`StyleBox` | :ref:`hovered` | | + +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ | :ref:`StyleBox` | :ref:`panel` | | +---------------------------------+----------------------------------------------------------------------------+--------------------------------+ | :ref:`StyleBox` | :ref:`selected` | | @@ -378,6 +386,23 @@ If ``true``, right mouse button click can select items. ---- +.. _class_ItemList_property_allow_search: + +.. rst-class:: classref-property + +:ref:`bool` **allow_search** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_allow_search** **(** :ref:`bool` value **)** +- :ref:`bool` **get_allow_search** **(** **)** + +If ``true``, allows navigating the **ItemList** with letter keys through incremental search. + +.. rst-class:: classref-item-separator + +---- + .. _class_ItemList_property_auto_height: .. rst-class:: classref-property @@ -668,6 +693,8 @@ Returns the item index at the given ``position``. When there is no item at that point, -1 will be returned if ``exact`` is ``true``, and the closest item index will be returned otherwise. +\ **Note:** The returned value is unreliable if called right after modifying the **ItemList**, before it redraws in the next frame. + .. rst-class:: classref-item-separator ---- @@ -756,6 +783,20 @@ Returns the metadata value of the specified index. ---- +.. _class_ItemList_method_get_item_rect: + +.. rst-class:: classref-method + +:ref:`Rect2` **get_item_rect** **(** :ref:`int` idx, :ref:`bool` expand=true **)** |const| + +Returns the position and size of the item with the specified index, in the coordinate system of the **ItemList** node. If ``expand`` is ``true`` the last column expands to fill the rest of the row. + +\ **Note:** The returned value is unreliable if called right after modifying the **ItemList**, before it redraws in the next frame. + +.. rst-class:: classref-item-separator + +---- + .. _class_ItemList_method_get_item_text: .. rst-class:: classref-method @@ -1127,6 +1168,18 @@ Default text :ref:`Color` of the item. ---- +.. _class_ItemList_theme_color_font_hovered_color: + +.. rst-class:: classref-themeproperty + +:ref:`Color` **font_hovered_color** = ``Color(0.95, 0.95, 0.95, 1)`` + +Text :ref:`Color` used when the item is hovered and not selected yet. + +.. rst-class:: classref-item-separator + +---- + .. _class_ItemList_theme_color_font_outline_color: .. rst-class:: classref-themeproperty @@ -1285,6 +1338,18 @@ The focused style for the **ItemList**, drawn on top of the background, but belo ---- +.. _class_ItemList_theme_style_hovered: + +.. rst-class:: classref-themeproperty + +:ref:`StyleBox` **hovered** + +:ref:`StyleBox` for the hovered, but not selected items. + +.. rst-class:: classref-item-separator + +---- + .. _class_ItemList_theme_style_panel: .. rst-class:: classref-themeproperty diff --git a/classes/class_light3d.rst b/classes/class_light3d.rst index e8c388b0057..db84c05d4db 100644 --- a/classes/class_light3d.rst +++ b/classes/class_light3d.rst @@ -335,7 +335,7 @@ Light is taken into account in static baking (:ref:`VoxelGI`, :re :ref:`BakeMode` **BAKE_DYNAMIC** = ``2`` -Light is taken into account in dynamic baking (:ref:`VoxelGI` and SDFGI (:ref:`Environment.sdfgi_enabled`) only). The light can be moved around or modified with global illumination updating in real-time. The light's global illumination appearance will be slightly different compared to :ref:`BAKE_STATIC`. This has a greater performance cost compared to :ref:`BAKE_STATIC`. +Light is taken into account in dynamic baking (:ref:`VoxelGI` and SDFGI (:ref:`Environment.sdfgi_enabled`) only). The light can be moved around or modified with global illumination updating in real-time. The light's global illumination appearance will be slightly different compared to :ref:`BAKE_STATIC`. This has a greater performance cost compared to :ref:`BAKE_STATIC`. When using SDFGI, the update speed of dynamic lights is affected by :ref:`ProjectSettings.rendering/global_illumination/sdfgi/frames_to_update_lights`. .. rst-class:: classref-section-separator diff --git a/classes/class_lineedit.rst b/classes/class_lineedit.rst index 2691cedd5bc..3974d0e48b7 100644 --- a/classes/class_lineedit.rst +++ b/classes/class_lineedit.rst @@ -158,6 +158,8 @@ Methods +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_scroll_offset` **(** **)** |const| | +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_selected_text` **(** **)** | + +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_selection_from_column` **(** **)** |const| | +-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_selection_to_column` **(** **)** |const| | @@ -640,7 +642,7 @@ Text alignment as defined in the :ref:`HorizontalAlignment` value **)** - :ref:`bool` **is_caret_blink_enabled** **(** **)** -If ``true``, the caret (text cursor) blinks. +If ``true``, makes the caret blink. .. rst-class:: classref-item-separator @@ -657,7 +659,7 @@ If ``true``, the caret (text cursor) blinks. - void **set_caret_blink_interval** **(** :ref:`float` value **)** - :ref:`float` **get_caret_blink_interval** **(** **)** -Duration (in seconds) of a caret's blinking cycle. +The interval at which the caret blinks (in seconds). .. rst-class:: classref-item-separator @@ -727,7 +729,7 @@ Allow moving caret, selecting and removing the individual composite character co - void **set_clear_button_enabled** **(** :ref:`bool` value **)** - :ref:`bool` **is_clear_button_enabled** **(** **)** -If ``true``, the **LineEdit** will show a clear button if ``text`` is not empty, which can be used to clear the text quickly. +If ``true``, the **LineEdit** will show a clear button if :ref:`text` is not empty, which can be used to clear the text quickly. .. rst-class:: classref-item-separator @@ -1264,6 +1266,18 @@ Returns the scroll offset due to :ref:`caret_column` **get_selected_text** **(** **)** + +Returns the text inside the selection. + +.. rst-class:: classref-item-separator + +---- + .. _class_LineEdit_method_get_selection_from_column: .. rst-class:: classref-method @@ -1572,7 +1586,7 @@ Texture for the clear button. See :ref:`clear_button_enabled` **focus** -Background used when **LineEdit** has GUI focus. The ``focus`` :ref:`StyleBox` is displayed *over* the base :ref:`StyleBox`, so a partially transparent :ref:`StyleBox` should be used to ensure the base :ref:`StyleBox` remains visible. A :ref:`StyleBox` that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a :ref:`StyleBoxEmpty` resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons. +Background used when **LineEdit** has GUI focus. The :ref:`focus` :ref:`StyleBox` is displayed *over* the base :ref:`StyleBox`, so a partially transparent :ref:`StyleBox` should be used to ensure the base :ref:`StyleBox` remains visible. A :ref:`StyleBox` that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a :ref:`StyleBoxEmpty` resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons. .. rst-class:: classref-item-separator diff --git a/classes/class_marker2d.rst b/classes/class_marker2d.rst index 5493212261d..035a24258f9 100644 --- a/classes/class_marker2d.rst +++ b/classes/class_marker2d.rst @@ -19,7 +19,7 @@ Generic 2D position hint for editing. Description ----------- -Generic 2D position hint for editing. It's just like a plain :ref:`Node2D`, but it displays as a cross in the 2D editor at all times. You can set cross' visual size by using the gizmo in the 2D editor while the node is selected. +Generic 2D position hint for editing. It's just like a plain :ref:`Node2D`, but it displays as a cross in the 2D editor at all times. You can set the cross' visual size by using the gizmo in the 2D editor while the node is selected. .. rst-class:: classref-reftable-group diff --git a/classes/class_meshconvexdecompositionsettings.rst b/classes/class_meshconvexdecompositionsettings.rst new file mode 100644 index 00000000000..e599c209dc3 --- /dev/null +++ b/classes/class_meshconvexdecompositionsettings.rst @@ -0,0 +1,322 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/doc/classes/MeshConvexDecompositionSettings.xml. + +.. _class_MeshConvexDecompositionSettings: + +MeshConvexDecompositionSettings +=============================== + +**Inherits:** :ref:`RefCounted` **<** :ref:`Object` + +Parameters to be used with a :ref:`Mesh` convex decomposition operation. + +.. rst-class:: classref-introduction-group + +Description +----------- + +Parameters to be used with a :ref:`Mesh` convex decomposition operation. + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`bool` | :ref:`convex_hull_approximation` | ``true`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`int` | :ref:`convex_hull_downsampling` | ``4`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`float` | :ref:`max_concavity` | ``1.0`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`int` | :ref:`max_convex_hulls` | ``1`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`int` | :ref:`max_num_vertices_per_convex_hull` | ``32`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`float` | :ref:`min_volume_per_convex_hull` | ``0.0001`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`Mode` | :ref:`mode` | ``0`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`bool` | :ref:`normalize_mesh` | ``false`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`int` | :ref:`plane_downsampling` | ``4`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`bool` | :ref:`project_hull_vertices` | ``true`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`int` | :ref:`resolution` | ``10000`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`float` | :ref:`revolution_axes_clipping_bias` | ``0.05`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + | :ref:`float` | :ref:`symmetry_planes_clipping_bias` | ``0.05`` | + +--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Enumerations +------------ + +.. _enum_MeshConvexDecompositionSettings_Mode: + +.. rst-class:: classref-enumeration + +enum **Mode**: + +.. _class_MeshConvexDecompositionSettings_constant_CONVEX_DECOMPOSITION_MODE_VOXEL: + +.. rst-class:: classref-enumeration-constant + +:ref:`Mode` **CONVEX_DECOMPOSITION_MODE_VOXEL** = ``0`` + +Constant for voxel-based approximate convex decomposition. + +.. _class_MeshConvexDecompositionSettings_constant_CONVEX_DECOMPOSITION_MODE_TETRAHEDRON: + +.. rst-class:: classref-enumeration-constant + +:ref:`Mode` **CONVEX_DECOMPOSITION_MODE_TETRAHEDRON** = ``1`` + +Constant for tetrahedron-based approximate convex decomposition. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_MeshConvexDecompositionSettings_property_convex_hull_approximation: + +.. rst-class:: classref-property + +:ref:`bool` **convex_hull_approximation** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_convex_hull_approximation** **(** :ref:`bool` value **)** +- :ref:`bool` **get_convex_hull_approximation** **(** **)** + +If enabled uses approximation for computing convex hulls. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_convex_hull_downsampling: + +.. rst-class:: classref-property + +:ref:`int` **convex_hull_downsampling** = ``4`` + +.. rst-class:: classref-property-setget + +- void **set_convex_hull_downsampling** **(** :ref:`int` value **)** +- :ref:`int` **get_convex_hull_downsampling** **(** **)** + +Controls the precision of the convex-hull generation process during the clipping plane selection stage. Ranges from ``1`` to ``16``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_max_concavity: + +.. rst-class:: classref-property + +:ref:`float` **max_concavity** = ``1.0`` + +.. rst-class:: classref-property-setget + +- void **set_max_concavity** **(** :ref:`float` value **)** +- :ref:`float` **get_max_concavity** **(** **)** + +Maximum concavity. Ranges from ``0.0`` to ``1.0``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_max_convex_hulls: + +.. rst-class:: classref-property + +:ref:`int` **max_convex_hulls** = ``1`` + +.. rst-class:: classref-property-setget + +- void **set_max_convex_hulls** **(** :ref:`int` value **)** +- :ref:`int` **get_max_convex_hulls** **(** **)** + +The maximum number of convex hulls to produce from the merge operation. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_max_num_vertices_per_convex_hull: + +.. rst-class:: classref-property + +:ref:`int` **max_num_vertices_per_convex_hull** = ``32`` + +.. rst-class:: classref-property-setget + +- void **set_max_num_vertices_per_convex_hull** **(** :ref:`int` value **)** +- :ref:`int` **get_max_num_vertices_per_convex_hull** **(** **)** + +Controls the maximum number of triangles per convex-hull. Ranges from ``4`` to ``1024``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_min_volume_per_convex_hull: + +.. rst-class:: classref-property + +:ref:`float` **min_volume_per_convex_hull** = ``0.0001`` + +.. rst-class:: classref-property-setget + +- void **set_min_volume_per_convex_hull** **(** :ref:`float` value **)** +- :ref:`float` **get_min_volume_per_convex_hull** **(** **)** + +Controls the adaptive sampling of the generated convex-hulls. Ranges from ``0.0`` to ``0.01``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_mode: + +.. rst-class:: classref-property + +:ref:`Mode` **mode** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_mode** **(** :ref:`Mode` value **)** +- :ref:`Mode` **get_mode** **(** **)** + +Mode for the approximate convex decomposition. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_normalize_mesh: + +.. rst-class:: classref-property + +:ref:`bool` **normalize_mesh** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_normalize_mesh** **(** :ref:`bool` value **)** +- :ref:`bool` **get_normalize_mesh** **(** **)** + +If enabled normalizes the mesh before applying the convex decomposition. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_plane_downsampling: + +.. rst-class:: classref-property + +:ref:`int` **plane_downsampling** = ``4`` + +.. rst-class:: classref-property-setget + +- void **set_plane_downsampling** **(** :ref:`int` value **)** +- :ref:`int` **get_plane_downsampling** **(** **)** + +Controls the granularity of the search for the "best" clipping plane. Ranges from ``1`` to ``16``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_project_hull_vertices: + +.. rst-class:: classref-property + +:ref:`bool` **project_hull_vertices** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_project_hull_vertices** **(** :ref:`bool` value **)** +- :ref:`bool` **get_project_hull_vertices** **(** **)** + +If enabled projects output convex hull vertices onto original source mesh to increase floating point accuracy of the results. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_resolution: + +.. rst-class:: classref-property + +:ref:`int` **resolution** = ``10000`` + +.. rst-class:: classref-property-setget + +- void **set_resolution** **(** :ref:`int` value **)** +- :ref:`int` **get_resolution** **(** **)** + +Maximum number of voxels generated during the voxelization stage. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_revolution_axes_clipping_bias: + +.. rst-class:: classref-property + +:ref:`float` **revolution_axes_clipping_bias** = ``0.05`` + +.. rst-class:: classref-property-setget + +- void **set_revolution_axes_clipping_bias** **(** :ref:`float` value **)** +- :ref:`float` **get_revolution_axes_clipping_bias** **(** **)** + +Controls the bias toward clipping along revolution axes. Ranges from ``0.0`` to ``1.0``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MeshConvexDecompositionSettings_property_symmetry_planes_clipping_bias: + +.. rst-class:: classref-property + +:ref:`float` **symmetry_planes_clipping_bias** = ``0.05`` + +.. rst-class:: classref-property-setget + +- void **set_symmetry_planes_clipping_bias** **(** :ref:`float` value **)** +- :ref:`float` **get_symmetry_planes_clipping_bias** **(** **)** + +Controls the bias toward clipping along symmetry planes. Ranges from ``0.0`` to ``1.0``. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_meshdatatool.rst b/classes/class_meshdatatool.rst index 778e5b1b291..6d2c6e27c9f 100644 --- a/classes/class_meshdatatool.rst +++ b/classes/class_meshdatatool.rst @@ -40,7 +40,7 @@ Below is an example of how MeshDataTool may be used. vertex += mdt.get_vertex_normal(i) # Save your change. mdt.set_vertex(i, vertex) - mesh.surface_remove(0) + mesh.clear_surfaces() mdt.commit_to_surface(mesh) var mi = MeshInstance.new() mi.mesh = mesh @@ -60,7 +60,7 @@ Below is an example of how MeshDataTool may be used. // Save your change. mdt.SetVertex(i, vertex); } - mesh.SurfaceRemove(0); + mesh.ClearSurfaces(); mdt.CommitToSurface(mesh); var mi = new MeshInstance(); mi.Mesh = mesh; diff --git a/classes/class_meshinstance3d.rst b/classes/class_meshinstance3d.rst index 2d674074498..58d503f1f88 100644 --- a/classes/class_meshinstance3d.rst +++ b/classes/class_meshinstance3d.rst @@ -60,31 +60,31 @@ Methods .. table:: :widths: auto - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`create_convex_collision` **(** :ref:`bool` clean=true, :ref:`bool` simplify=false **)** | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`create_debug_tangents` **(** **)** | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`create_multiple_convex_collisions` **(** **)** | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`create_trimesh_collision` **(** **)** | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`find_blend_shape_by_name` **(** :ref:`StringName` name **)** | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Material` | :ref:`get_active_material` **(** :ref:`int` surface **)** |const| | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_blend_shape_count` **(** **)** |const| | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_blend_shape_value` **(** :ref:`int` blend_shape_idx **)** |const| | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Material` | :ref:`get_surface_override_material` **(** :ref:`int` surface **)** |const| | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_surface_override_material_count` **(** **)** |const| | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_blend_shape_value` **(** :ref:`int` blend_shape_idx, :ref:`float` value **)** | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_surface_override_material` **(** :ref:`int` surface, :ref:`Material` material **)** | - +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`create_convex_collision` **(** :ref:`bool` clean=true, :ref:`bool` simplify=false **)** | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`create_debug_tangents` **(** **)** | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`create_multiple_convex_collisions` **(** :ref:`MeshConvexDecompositionSettings` settings=null **)** | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`create_trimesh_collision` **(** **)** | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`find_blend_shape_by_name` **(** :ref:`StringName` name **)** | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Material` | :ref:`get_active_material` **(** :ref:`int` surface **)** |const| | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_blend_shape_count` **(** **)** |const| | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_blend_shape_value` **(** :ref:`int` blend_shape_idx **)** |const| | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Material` | :ref:`get_surface_override_material` **(** :ref:`int` surface **)** |const| | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_surface_override_material_count` **(** **)** |const| | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_blend_shape_value` **(** :ref:`int` blend_shape_idx, :ref:`float` value **)** | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_surface_override_material` **(** :ref:`int` surface, :ref:`Material` material **)** | + +---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -183,9 +183,9 @@ This helper creates a **MeshInstance3D** child node with gizmos at every vertex .. rst-class:: classref-method -void **create_multiple_convex_collisions** **(** **)** +void **create_multiple_convex_collisions** **(** :ref:`MeshConvexDecompositionSettings` settings=null **)** -This helper creates a :ref:`StaticBody3D` child node with multiple :ref:`ConvexPolygonShape3D` collision shapes calculated from the mesh geometry via convex decomposition. It's mainly used for testing. +This helper creates a :ref:`StaticBody3D` child node with multiple :ref:`ConvexPolygonShape3D` collision shapes calculated from the mesh geometry via convex decomposition. The convex decomposition operation can be controlled with parameters from the optional ``settings``. .. rst-class:: classref-item-separator diff --git a/classes/class_multiplayerpeerextension.rst b/classes/class_multiplayerpeerextension.rst index 8da8e70399e..9aa48ea6f95 100644 --- a/classes/class_multiplayerpeerextension.rst +++ b/classes/class_multiplayerpeerextension.rst @@ -42,6 +42,10 @@ Methods +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`_get_packet` **(** const uint8_t ** r_buffer, int32_t* r_buffer_size **)** |virtual| | +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_get_packet_channel` **(** **)** |virtual| |const| | + +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TransferMode` | :ref:`_get_packet_mode` **(** **)** |virtual| |const| | + +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`_get_packet_peer` **(** **)** |virtual| |const| | +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedByteArray` | :ref:`_get_packet_script` **(** **)** |virtual| | @@ -56,6 +60,8 @@ Methods +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`_is_server` **(** **)** |virtual| |const| | +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_is_server_relay_supported` **(** **)** |virtual| |const| | + +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`_poll` **(** **)** |virtual| | +----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`_put_packet` **(** const uint8_t* p_buffer, :ref:`int` p_buffer_size **)** |virtual| | @@ -152,6 +158,30 @@ Called when a packet needs to be received by the :ref:`MultiplayerAPI` **_get_packet_channel** **(** **)** |virtual| |const| + +Called to get the channel over which the next available packet was received. See :ref:`MultiplayerPeer.get_packet_channel`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_MultiplayerPeerExtension_method__get_packet_mode: + +.. rst-class:: classref-method + +:ref:`TransferMode` **_get_packet_mode** **(** **)** |virtual| |const| + +Called to get the :ref:`TransferMode` the remote peer used to send the next available packet. See :ref:`MultiplayerPeer.get_packet_mode`. + +.. rst-class:: classref-item-separator + +---- + .. _class_MultiplayerPeerExtension_method__get_packet_peer: .. rst-class:: classref-method @@ -206,7 +236,7 @@ Called when the transfer mode to use is read on this :ref:`MultiplayerPeer` **_get_unique_id** **(** **)** |virtual| |const| -Called when the unique ID of this :ref:`MultiplayerPeer` is requested (see :ref:`MultiplayerPeer.get_unique_id`). +Called when the unique ID of this :ref:`MultiplayerPeer` is requested (see :ref:`MultiplayerPeer.get_unique_id`). The value must be between ``1`` and ``2147483647``. .. rst-class:: classref-item-separator @@ -236,6 +266,18 @@ Called when the "is server" status is requested on the :ref:`MultiplayerAPI` **_is_server_relay_supported** **(** **)** |virtual| |const| + +Called to check if the server can act as a relay in the current configuration. See :ref:`MultiplayerPeer.is_server_relay_supported`. + +.. rst-class:: classref-item-separator + +---- + .. _class_MultiplayerPeerExtension_method__poll: .. rst-class:: classref-method diff --git a/classes/class_multiplayersynchronizer.rst b/classes/class_multiplayersynchronizer.rst index cb825dfc9ff..b9f4459743a 100644 --- a/classes/class_multiplayersynchronizer.rst +++ b/classes/class_multiplayersynchronizer.rst @@ -292,7 +292,7 @@ Sets the visibility of ``peer`` to ``visible``. If ``peer`` is ``0``, the value void **update_visibility** **(** :ref:`int` for_peer=0 **)** -Updates the visibility of ``peer`` according to visibility filters. If ``peer`` is ``0`` (the default), all peers' visibilties are updated. +Updates the visibility of ``for_peer`` according to visibility filters. If ``for_peer`` is ``0`` (the default), all peers' visibilties are updated. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_navigationagent2d.rst b/classes/class_navigationagent2d.rst index 738501d32a1..b94c579c517 100644 --- a/classes/class_navigationagent2d.rst +++ b/classes/class_navigationagent2d.rst @@ -21,7 +21,7 @@ Description 2D Agent that is used in navigation to reach a position while avoiding static and dynamic obstacles. The dynamic obstacles are avoided using RVO collision avoidance. The agent needs navigation data to work correctly. **NavigationAgent2D** is physics safe. -\ **Note:** After setting :ref:`target_position` it is required to use the :ref:`get_next_path_position` function once every physics frame to update the internal path logic of the NavigationAgent. The returned vector position from this function should be used as the next movement position for the agent's parent Node. +\ **Note:** After :ref:`target_position` is set, the :ref:`get_next_path_position` function must be used once every physics frame to update the internal path logic of the NavigationAgent. The returned position from this function should be used as the next movement position for the agent's parent node. .. rst-class:: classref-introduction-group @@ -38,41 +38,55 @@ Properties .. table:: :widths: auto - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`bool` | :ref:`avoidance_enabled` | ``false`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`bool` | :ref:`debug_enabled` | ``false`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`Color` | :ref:`debug_path_custom_color` | ``Color(1, 1, 1, 1)`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`debug_path_custom_line_width` | ``1.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`debug_path_custom_point_size` | ``4.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`bool` | :ref:`debug_use_custom` | ``false`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`int` | :ref:`max_neighbors` | ``10`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`max_speed` | ``100.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`int` | :ref:`navigation_layers` | ``1`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`neighbor_distance` | ``500.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`path_desired_distance` | ``20.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`path_max_distance` | ``100.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`PathMetadataFlags` | :ref:`path_metadata_flags` | ``7`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`radius` | ``10.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`target_desired_distance` | ``10.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`Vector2` | :ref:`target_position` | ``Vector2(0, 0)`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`time_horizon` | ``1.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`bool` | :ref:`avoidance_enabled` | ``false`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`avoidance_layers` | ``1`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`avoidance_mask` | ``1`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`avoidance_priority` | ``1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`bool` | :ref:`debug_enabled` | ``false`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`Color` | :ref:`debug_path_custom_color` | ``Color(1, 1, 1, 1)`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`debug_path_custom_line_width` | ``-1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`debug_path_custom_point_size` | ``4.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`bool` | :ref:`debug_use_custom` | ``false`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`max_neighbors` | ``10`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`max_speed` | ``100.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`navigation_layers` | ``1`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`neighbor_distance` | ``500.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`path_desired_distance` | ``20.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`path_max_distance` | ``100.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`PathMetadataFlags` | :ref:`path_metadata_flags` | ``7`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`PathPostProcessing` | :ref:`path_postprocessing` | ``0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`PathfindingAlgorithm` | :ref:`pathfinding_algorithm` | ``0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`radius` | ``10.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`target_desired_distance` | ``10.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`Vector2` | :ref:`target_position` | ``Vector2(0, 0)`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`time_horizon_agents` | ``1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`time_horizon_obstacles` | ``0.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`Vector2` | :ref:`velocity` | ``Vector2(0, 0)`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ .. rst-class:: classref-reftable-group @@ -85,6 +99,10 @@ Methods +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`distance_to_target` **(** **)** |const| | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_avoidance_layer_value` **(** :ref:`int` layer_number **)** |const| | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_avoidance_mask_value` **(** :ref:`int` mask_number **)** |const| | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedVector2Array` | :ref:`get_current_navigation_path` **(** **)** |const| | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_current_navigation_path_index` **(** **)** |const| | @@ -107,11 +125,15 @@ Methods +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_target_reached` **(** **)** |const| | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_avoidance_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_avoidance_mask_value` **(** :ref:`int` mask_number, :ref:`bool` value **)** | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_navigation_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_navigation_map` **(** :ref:`RID` navigation_map **)** | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_velocity` **(** :ref:`Vector2` velocity **)** | + | void | :ref:`set_velocity_forced` **(** :ref:`Vector2` velocity **)** | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -191,7 +213,7 @@ Notifies when the player-defined :ref:`target_position` safe_velocity **)** -Notifies when the collision avoidance velocity is calculated. Emitted by :ref:`set_velocity`. Only emitted when :ref:`avoidance_enabled` is true. +Notifies when the collision avoidance velocity is calculated. Emitted when :ref:`velocity` is set. Only emitted when :ref:`avoidance_enabled` is true. .. rst-class:: classref-item-separator @@ -235,7 +257,58 @@ Property Descriptions - void **set_avoidance_enabled** **(** :ref:`bool` value **)** - :ref:`bool` **get_avoidance_enabled** **(** **)** -If ``true`` the agent is registered for an RVO avoidance callback on the :ref:`NavigationServer2D`. When :ref:`set_velocity` is used and the processing is completed a ``safe_velocity`` Vector2 is received with a signal connection to :ref:`velocity_computed`. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it. +If ``true`` the agent is registered for an RVO avoidance callback on the :ref:`NavigationServer2D`. When :ref:`velocity` is used and the processing is completed a ``safe_velocity`` Vector2 is received with a signal connection to :ref:`velocity_computed`. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_property_avoidance_layers: + +.. rst-class:: classref-property + +:ref:`int` **avoidance_layers** = ``1`` + +.. rst-class:: classref-property-setget + +- void **set_avoidance_layers** **(** :ref:`int` value **)** +- :ref:`int` **get_avoidance_layers** **(** **)** + +A bitfield determining the avoidance layers for this NavigationAgent. Other agent's with a matching bit on the :ref:`avoidance_mask` will avoid this agent. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_property_avoidance_mask: + +.. rst-class:: classref-property + +:ref:`int` **avoidance_mask** = ``1`` + +.. rst-class:: classref-property-setget + +- void **set_avoidance_mask** **(** :ref:`int` value **)** +- :ref:`int` **get_avoidance_mask** **(** **)** + +A bitfield determining what other avoidance agent's and obstacles this NavigationAgent will avoid when a bit matches at least one of their :ref:`avoidance_layers`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_property_avoidance_priority: + +.. rst-class:: classref-property + +:ref:`float` **avoidance_priority** = ``1.0`` + +.. rst-class:: classref-property-setget + +- void **set_avoidance_priority** **(** :ref:`float` value **)** +- :ref:`float` **get_avoidance_priority** **(** **)** + +The agent does not adjust the velocity for other agents that would match the :ref:`avoidance_mask` but have a lower :ref:`avoidance_priority`. This in turn makes the other agents with lower priority adjust their velocities even more to avoid collision with this agent. .. rst-class:: classref-item-separator @@ -279,7 +352,7 @@ If :ref:`debug_use_custom` is .. rst-class:: classref-property -:ref:`float` **debug_path_custom_line_width** = ``1.0`` +:ref:`float` **debug_path_custom_line_width** = ``-1.0`` .. rst-class:: classref-property-setget @@ -445,6 +518,40 @@ Additional information to return with the navigation path. ---- +.. _class_NavigationAgent2D_property_path_postprocessing: + +.. rst-class:: classref-property + +:ref:`PathPostProcessing` **path_postprocessing** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_path_postprocessing** **(** :ref:`PathPostProcessing` value **)** +- :ref:`PathPostProcessing` **get_path_postprocessing** **(** **)** + +The path postprocessing applied to the raw path corridor found by the :ref:`pathfinding_algorithm`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_property_pathfinding_algorithm: + +.. rst-class:: classref-property + +:ref:`PathfindingAlgorithm` **pathfinding_algorithm** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_pathfinding_algorithm** **(** :ref:`PathfindingAlgorithm` value **)** +- :ref:`PathfindingAlgorithm` **get_pathfinding_algorithm** **(** **)** + +The pathfinding algorithm used in the path query. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationAgent2D_property_radius: .. rst-class:: classref-property @@ -492,24 +599,58 @@ The distance threshold before the final target point is considered to be reached - void **set_target_position** **(** :ref:`Vector2` value **)** - :ref:`Vector2` **get_target_position** **(** **)** -The user-defined target position. Setting this property will clear the current navigation path. +If set a new navigation path from the current agent position to the :ref:`target_position` is requested from the NavigationServer. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_property_time_horizon_agents: + +.. rst-class:: classref-property + +:ref:`float` **time_horizon_agents** = ``1.0`` + +.. rst-class:: classref-property-setget + +- void **set_time_horizon_agents** **(** :ref:`float` value **)** +- :ref:`float` **get_time_horizon_agents** **(** **)** + +The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to other agents. The larger the number, the sooner the agent will respond to other agents, but less freedom in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. .. rst-class:: classref-item-separator ---- -.. _class_NavigationAgent2D_property_time_horizon: +.. _class_NavigationAgent2D_property_time_horizon_obstacles: .. rst-class:: classref-property -:ref:`float` **time_horizon** = ``1.0`` +:ref:`float` **time_horizon_obstacles** = ``0.0`` .. rst-class:: classref-property-setget -- void **set_time_horizon** **(** :ref:`float` value **)** -- :ref:`float` **get_time_horizon** **(** **)** +- void **set_time_horizon_obstacles** **(** :ref:`float` value **)** +- :ref:`float` **get_time_horizon_obstacles** **(** **)** -The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to other agents. The larger the number, the sooner the agent will respond to other agents, but less freedom in choosing its velocities. Must be positive. +The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to static avoidance obstacles. The larger the number, the sooner the agent will respond to static avoidance obstacles, but less freedom in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_property_velocity: + +.. rst-class:: classref-property + +:ref:`Vector2` **velocity** = ``Vector2(0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_velocity** **(** :ref:`Vector2` value **)** +- :ref:`Vector2` **get_velocity** **(** **)** + +Sets the new wanted velocity for the agent. The avoidance simulation will try to fulfil this velocity if possible but will modify it to avoid collision with other agent's and obstacles. When an agent is teleported to a new position use :ref:`set_velocity_forced` as well to reset the internal simulation velocity. .. rst-class:: classref-section-separator @@ -532,6 +673,30 @@ Returns the distance to the target position, using the agent's global position. ---- +.. _class_NavigationAgent2D_method_get_avoidance_layer_value: + +.. rst-class:: classref-method + +:ref:`bool` **get_avoidance_layer_value** **(** :ref:`int` layer_number **)** |const| + +Returns whether or not the specified layer of the :ref:`avoidance_layers` bitmask is enabled, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_method_get_avoidance_mask_value: + +.. rst-class:: classref-method + +:ref:`bool` **get_avoidance_mask_value** **(** :ref:`int` mask_number **)** |const| + +Returns whether or not the specified mask of the :ref:`avoidance_mask` bitmask is enabled, given a ``mask_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationAgent2D_method_get_current_navigation_path: .. rst-class:: classref-method @@ -574,7 +739,7 @@ Returns the path query result for the path the agent is currently following. :ref:`Vector2` **get_final_position** **(** **)** -Returns the reachable final position in global coordinates. This can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. +Returns the reachable final position of the current navigation path in global coordinates. This can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. .. rst-class:: classref-item-separator @@ -646,7 +811,7 @@ Returns true if the navigation path's final position has been reached. :ref:`bool` **is_target_reachable** **(** **)** -Returns true if :ref:`target_position` is reachable. +Returns true if :ref:`target_position` is reachable. The target position is set using :ref:`target_position`. .. rst-class:: classref-item-separator @@ -664,6 +829,30 @@ Returns true if :ref:`target_position` layer_number, :ref:`bool` value **)** + +Based on ``value``, enables or disables the specified layer in the :ref:`avoidance_layers` bitmask, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent2D_method_set_avoidance_mask_value: + +.. rst-class:: classref-method + +void **set_avoidance_mask_value** **(** :ref:`int` mask_number, :ref:`bool` value **)** + +Based on ``value``, enables or disables the specified mask in the :ref:`avoidance_mask` bitmask, given a ``mask_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationAgent2D_method_set_navigation_layer_value: .. rst-class:: classref-method @@ -688,13 +877,13 @@ Sets the :ref:`RID` of the navigation map this NavigationAgent node s ---- -.. _class_NavigationAgent2D_method_set_velocity: +.. _class_NavigationAgent2D_method_set_velocity_forced: .. rst-class:: classref-method -void **set_velocity** **(** :ref:`Vector2` velocity **)** +void **set_velocity_forced** **(** :ref:`Vector2` velocity **)** -Sends the passed in velocity to the collision avoidance algorithm. It will adjust the velocity to avoid collisions. Once the adjustment to the velocity is complete, it will emit the :ref:`velocity_computed` signal. +Replaces the internal velocity in the collision avoidance simulation with ``velocity``. When an agent is teleported to a new position this function should be used in the same frame. If called frequently this function can get agents stuck. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_navigationagent3d.rst b/classes/class_navigationagent3d.rst index 2487aa999ae..c98317be1f8 100644 --- a/classes/class_navigationagent3d.rst +++ b/classes/class_navigationagent3d.rst @@ -21,7 +21,7 @@ Description 3D Agent that is used in navigation to reach a position while avoiding static and dynamic obstacles. The dynamic obstacles are avoided using RVO collision avoidance. The agent needs navigation data to work correctly. **NavigationAgent3D** is physics safe. -\ **Note:** After setting :ref:`target_position` it is required to use the :ref:`get_next_path_position` function once every physics frame to update the internal path logic of the NavigationAgent. The returned vector position from this function should be used as the next movement position for the agent's parent Node. +\ **Note:** After :ref:`target_position` is set, the :ref:`get_next_path_position` function must be used once every physics frame to update the internal path logic of the NavigationAgent. The returned position from this function should be used as the next movement position for the agent's parent node. .. rst-class:: classref-introduction-group @@ -38,43 +38,59 @@ Properties .. table:: :widths: auto - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`agent_height_offset` | ``0.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`bool` | :ref:`avoidance_enabled` | ``false`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`bool` | :ref:`debug_enabled` | ``false`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`Color` | :ref:`debug_path_custom_color` | ``Color(1, 1, 1, 1)`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`debug_path_custom_point_size` | ``4.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`bool` | :ref:`debug_use_custom` | ``false`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`bool` | :ref:`ignore_y` | ``true`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`int` | :ref:`max_neighbors` | ``10`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`max_speed` | ``10.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`int` | :ref:`navigation_layers` | ``1`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`neighbor_distance` | ``50.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`path_desired_distance` | ``1.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`path_max_distance` | ``5.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`PathMetadataFlags` | :ref:`path_metadata_flags` | ``7`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`radius` | ``0.5`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`target_desired_distance` | ``1.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`Vector3` | :ref:`target_position` | ``Vector3(0, 0, 0)`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ - | :ref:`float` | :ref:`time_horizon` | ``1.0`` | - +----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`bool` | :ref:`avoidance_enabled` | ``false`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`avoidance_layers` | ``1`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`avoidance_mask` | ``1`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`avoidance_priority` | ``1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`bool` | :ref:`debug_enabled` | ``false`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`Color` | :ref:`debug_path_custom_color` | ``Color(1, 1, 1, 1)`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`debug_path_custom_point_size` | ``4.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`bool` | :ref:`debug_use_custom` | ``false`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`height` | ``1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`max_neighbors` | ``10`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`max_speed` | ``10.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`int` | :ref:`navigation_layers` | ``1`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`neighbor_distance` | ``50.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`path_desired_distance` | ``1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`path_height_offset` | ``0.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`path_max_distance` | ``5.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`PathMetadataFlags` | :ref:`path_metadata_flags` | ``7`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`PathPostProcessing` | :ref:`path_postprocessing` | ``0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`PathfindingAlgorithm` | :ref:`pathfinding_algorithm` | ``0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`radius` | ``0.5`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`target_desired_distance` | ``1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`Vector3` | :ref:`target_position` | ``Vector3(0, 0, 0)`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`time_horizon_agents` | ``1.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`float` | :ref:`time_horizon_obstacles` | ``0.0`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`bool` | :ref:`use_3d_avoidance` | ``false`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ + | :ref:`Vector3` | :ref:`velocity` | ``Vector3(0, 0, 0)`` | + +----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+-----------------------+ .. rst-class:: classref-reftable-group @@ -87,6 +103,10 @@ Methods +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`distance_to_target` **(** **)** |const| | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_avoidance_layer_value` **(** :ref:`int` layer_number **)** |const| | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_avoidance_mask_value` **(** :ref:`int` mask_number **)** |const| | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedVector3Array` | :ref:`get_current_navigation_path` **(** **)** |const| | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_current_navigation_path_index` **(** **)** |const| | @@ -109,11 +129,15 @@ Methods +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_target_reached` **(** **)** |const| | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_avoidance_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_avoidance_mask_value` **(** :ref:`int` mask_number, :ref:`bool` value **)** | + +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_navigation_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_navigation_map` **(** :ref:`RID` navigation_map **)** | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_velocity` **(** :ref:`Vector3` velocity **)** | + | void | :ref:`set_velocity_forced` **(** :ref:`Vector3` velocity **)** | +-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -193,7 +217,7 @@ Notifies when the player-defined :ref:`target_position` safe_velocity **)** -Notifies when the collision avoidance velocity is calculated. Emitted by :ref:`set_velocity`. Only emitted when :ref:`avoidance_enabled` is true. +Notifies when the collision avoidance velocity is calculated. Emitted when :ref:`velocity` is set. Only emitted when :ref:`avoidance_enabled` is true. .. rst-class:: classref-item-separator @@ -226,35 +250,69 @@ The details dictionary may contain the following keys depending on the value of Property Descriptions --------------------- -.. _class_NavigationAgent3D_property_agent_height_offset: +.. _class_NavigationAgent3D_property_avoidance_enabled: .. rst-class:: classref-property -:ref:`float` **agent_height_offset** = ``0.0`` +:ref:`bool` **avoidance_enabled** = ``false`` .. rst-class:: classref-property-setget -- void **set_agent_height_offset** **(** :ref:`float` value **)** -- :ref:`float` **get_agent_height_offset** **(** **)** +- void **set_avoidance_enabled** **(** :ref:`bool` value **)** +- :ref:`bool` **get_avoidance_enabled** **(** **)** -The NavigationAgent height offset is subtracted from the y-axis value of any vector path position for this NavigationAgent. The NavigationAgent height offset does not change or influence the navigation mesh or pathfinding query result. Additional navigation maps that use regions with navigation meshes that the developer baked with appropriate agent radius or height values are required to support different-sized agents. +If ``true`` the agent is registered for an RVO avoidance callback on the :ref:`NavigationServer3D`. When :ref:`velocity` is set and the processing is completed a ``safe_velocity`` Vector3 is received with a signal connection to :ref:`velocity_computed`. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it. .. rst-class:: classref-item-separator ---- -.. _class_NavigationAgent3D_property_avoidance_enabled: +.. _class_NavigationAgent3D_property_avoidance_layers: .. rst-class:: classref-property -:ref:`bool` **avoidance_enabled** = ``false`` +:ref:`int` **avoidance_layers** = ``1`` .. rst-class:: classref-property-setget -- void **set_avoidance_enabled** **(** :ref:`bool` value **)** -- :ref:`bool` **get_avoidance_enabled** **(** **)** +- void **set_avoidance_layers** **(** :ref:`int` value **)** +- :ref:`int` **get_avoidance_layers** **(** **)** -If ``true`` the agent is registered for an RVO avoidance callback on the :ref:`NavigationServer3D`. When :ref:`set_velocity` is used and the processing is completed a ``safe_velocity`` Vector3 is received with a signal connection to :ref:`velocity_computed`. Avoidance processing with many registered agents has a significant performance cost and should only be enabled on agents that currently require it. +A bitfield determining the avoidance layers for this NavigationAgent. Other agent's with a matching bit on the :ref:`avoidance_mask` will avoid this agent. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_property_avoidance_mask: + +.. rst-class:: classref-property + +:ref:`int` **avoidance_mask** = ``1`` + +.. rst-class:: classref-property-setget + +- void **set_avoidance_mask** **(** :ref:`int` value **)** +- :ref:`int` **get_avoidance_mask** **(** **)** + +A bitfield determining what other avoidance agent's and obstacles this NavigationAgent will avoid when a bit matches at least one of their :ref:`avoidance_layers`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_property_avoidance_priority: + +.. rst-class:: classref-property + +:ref:`float` **avoidance_priority** = ``1.0`` + +.. rst-class:: classref-property-setget + +- void **set_avoidance_priority** **(** :ref:`float` value **)** +- :ref:`float` **get_avoidance_priority** **(** **)** + +The agent does not adjust the velocity for other agents that would match the :ref:`avoidance_mask` but have a lower :ref:`avoidance_priority`. This in turn makes the other agents with lower priority adjust their velocities even more to avoid collision with this agent. .. rst-class:: classref-item-separator @@ -328,18 +386,18 @@ If ``true`` uses the defined :ref:`debug_path_custom_color` **ignore_y** = ``true`` +:ref:`float` **height** = ``1.0`` .. rst-class:: classref-property-setget -- void **set_ignore_y** **(** :ref:`bool` value **)** -- :ref:`bool` **get_ignore_y** **(** **)** +- void **set_height** **(** :ref:`float` value **)** +- :ref:`float` **get_height** **(** **)** -Ignores collisions on the Y axis. Must be true to move on a horizontal plane. +The height of the avoidance agent. Agent's will ignore other agents or obstacles that are above or below their current position + height in 2D avoidance. Does nothing in 3D avoidance which uses radius spheres alone. .. rst-class:: classref-item-separator @@ -390,7 +448,7 @@ The maximum speed that an agent can move. - void **set_navigation_layers** **(** :ref:`int` value **)** - :ref:`int` **get_navigation_layers** **(** **)** -A bitfield determining what navigation layers of navigation regions this NavigationAgent will use to calculate path. Changing it runtime will clear current navigation path and generate new one, according to new navigation layers. +A bitfield determining what navigation layers of navigation regions this agent will use to calculate path. Changing it runtime will clear current navigation path and generate new one, according to new navigation layers. .. rst-class:: classref-item-separator @@ -430,6 +488,23 @@ The distance threshold before a path point is considered to be reached. This wil ---- +.. _class_NavigationAgent3D_property_path_height_offset: + +.. rst-class:: classref-property + +:ref:`float` **path_height_offset** = ``0.0`` + +.. rst-class:: classref-property-setget + +- void **set_path_height_offset** **(** :ref:`float` value **)** +- :ref:`float` **get_path_height_offset** **(** **)** + +The height offset is subtracted from the y-axis value of any vector path position for this NavigationAgent. The NavigationAgent height offset does not change or influence the navigation mesh or pathfinding query result. Additional navigation maps that use regions with navigation meshes that the developer baked with appropriate agent radius or height values are required to support different-sized agents. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationAgent3D_property_path_max_distance: .. rst-class:: classref-property @@ -464,6 +539,40 @@ Additional information to return with the navigation path. ---- +.. _class_NavigationAgent3D_property_path_postprocessing: + +.. rst-class:: classref-property + +:ref:`PathPostProcessing` **path_postprocessing** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_path_postprocessing** **(** :ref:`PathPostProcessing` value **)** +- :ref:`PathPostProcessing` **get_path_postprocessing** **(** **)** + +The path postprocessing applied to the raw path corridor found by the :ref:`pathfinding_algorithm`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_property_pathfinding_algorithm: + +.. rst-class:: classref-property + +:ref:`PathfindingAlgorithm` **pathfinding_algorithm** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_pathfinding_algorithm** **(** :ref:`PathfindingAlgorithm` value **)** +- :ref:`PathfindingAlgorithm` **get_pathfinding_algorithm** **(** **)** + +The pathfinding algorithm used in the path query. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationAgent3D_property_radius: .. rst-class:: classref-property @@ -511,24 +620,77 @@ The distance threshold before the final target point is considered to be reached - void **set_target_position** **(** :ref:`Vector3` value **)** - :ref:`Vector3` **get_target_position** **(** **)** -The user-defined target position. Setting this property will clear the current navigation path. +If set a new navigation path from the current agent position to the :ref:`target_position` is requested from the NavigationServer. .. rst-class:: classref-item-separator ---- -.. _class_NavigationAgent3D_property_time_horizon: +.. _class_NavigationAgent3D_property_time_horizon_agents: .. rst-class:: classref-property -:ref:`float` **time_horizon** = ``1.0`` +:ref:`float` **time_horizon_agents** = ``1.0`` .. rst-class:: classref-property-setget -- void **set_time_horizon** **(** :ref:`float` value **)** -- :ref:`float` **get_time_horizon** **(** **)** +- void **set_time_horizon_agents** **(** :ref:`float` value **)** +- :ref:`float` **get_time_horizon_agents** **(** **)** -The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to other agents. The larger the number, the sooner the agent will respond to other agents, but less freedom in choosing its velocities. Must be positive. +The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to other agents. The larger the number, the sooner the agent will respond to other agents, but less freedom in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_property_time_horizon_obstacles: + +.. rst-class:: classref-property + +:ref:`float` **time_horizon_obstacles** = ``0.0`` + +.. rst-class:: classref-property-setget + +- void **set_time_horizon_obstacles** **(** :ref:`float` value **)** +- :ref:`float` **get_time_horizon_obstacles** **(** **)** + +The minimal amount of time for which this agent's velocities, that are computed with the collision avoidance algorithm, are safe with respect to static avoidance obstacles. The larger the number, the sooner the agent will respond to static avoidance obstacles, but less freedom in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_property_use_3d_avoidance: + +.. rst-class:: classref-property + +:ref:`bool` **use_3d_avoidance** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_use_3d_avoidance** **(** :ref:`bool` value **)** +- :ref:`bool` **get_use_3d_avoidance** **(** **)** + +If ``true`` the agent calculates avoidance velocities in 3D for the xyz-axis, e.g. for games that take place in air, unterwater or space. The 3D using agent only avoids other 3D avoidance using agent's. The 3D using agent only reacts to radius based avoidance obstacles. The 3D using agent ignores any vertices based obstacles. The 3D using agent only avoids other 3D using agent's. + +If ``false`` the agent calculates avoidance velocities in 2D along the xz-axis ignoring the y-axis. The 2D using agent only avoids other 2D avoidance using agent's. The 2D using agent reacts to radius avoidance obstacles. The 2D using agent reacts to vertices based avoidance obstacles. The 2D using agent only avoids other 2D using agent's. 2D using agents will ignore other 2D using agents or obstacles that are below their current position or above their current position including :ref:`height` in 2D avoidance. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_property_velocity: + +.. rst-class:: classref-property + +:ref:`Vector3` **velocity** = ``Vector3(0, 0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_velocity** **(** :ref:`Vector3` value **)** +- :ref:`Vector3` **get_velocity** **(** **)** + +Sets the new wanted velocity for the agent. The avoidance simulation will try to fulfil this velocity if possible but will modify it to avoid collision with other agent's and obstacles. When an agent is teleported to a new position use :ref:`set_velocity_forced` as well to reset the internal simulation velocity. .. rst-class:: classref-section-separator @@ -551,6 +713,30 @@ Returns the distance to the target position, using the agent's global position. ---- +.. _class_NavigationAgent3D_method_get_avoidance_layer_value: + +.. rst-class:: classref-method + +:ref:`bool` **get_avoidance_layer_value** **(** :ref:`int` layer_number **)** |const| + +Returns whether or not the specified layer of the :ref:`avoidance_layers` bitmask is enabled, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_method_get_avoidance_mask_value: + +.. rst-class:: classref-method + +:ref:`bool` **get_avoidance_mask_value** **(** :ref:`int` mask_number **)** |const| + +Returns whether or not the specified mask of the :ref:`avoidance_mask` bitmask is enabled, given a ``mask_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationAgent3D_method_get_current_navigation_path: .. rst-class:: classref-method @@ -593,7 +779,7 @@ Returns the path query result for the path the agent is currently following. :ref:`Vector3` **get_final_position** **(** **)** -Returns the reachable final position in global coordinates. This can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. +Returns the reachable final position of the current navigation path in global coordinates. This position can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. .. rst-class:: classref-item-separator @@ -665,7 +851,7 @@ Returns true if the navigation path's final position has been reached. :ref:`bool` **is_target_reachable** **(** **)** -Returns true if :ref:`target_position` is reachable. +Returns true if :ref:`target_position` is reachable. The target position is set using :ref:`target_position`. .. rst-class:: classref-item-separator @@ -683,6 +869,30 @@ Returns true if :ref:`target_position` layer_number, :ref:`bool` value **)** + +Based on ``value``, enables or disables the specified layer in the :ref:`avoidance_layers` bitmask, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationAgent3D_method_set_avoidance_mask_value: + +.. rst-class:: classref-method + +void **set_avoidance_mask_value** **(** :ref:`int` mask_number, :ref:`bool` value **)** + +Based on ``value``, enables or disables the specified mask in the :ref:`avoidance_mask` bitmask, given a ``mask_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationAgent3D_method_set_navigation_layer_value: .. rst-class:: classref-method @@ -707,13 +917,13 @@ Sets the :ref:`RID` of the navigation map this NavigationAgent node s ---- -.. _class_NavigationAgent3D_method_set_velocity: +.. _class_NavigationAgent3D_method_set_velocity_forced: .. rst-class:: classref-method -void **set_velocity** **(** :ref:`Vector3` velocity **)** +void **set_velocity_forced** **(** :ref:`Vector3` velocity **)** -Sends the passed in velocity to the collision avoidance algorithm. It will adjust the velocity to avoid collisions. Once the adjustment to the velocity is complete, it will emit the :ref:`velocity_computed` signal. +Replaces the internal velocity in the collision avoidance simulation with ``velocity``. When an agent is teleported to a new position this function should be used in the same frame. If called frequently this function can get agents stuck. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_navigationlink2d.rst b/classes/class_navigationlink2d.rst index 2383220d449..914ac5c3dda 100644 --- a/classes/class_navigationlink2d.rst +++ b/classes/class_navigationlink2d.rst @@ -149,7 +149,7 @@ The distance the link will search is controlled by :ref:`NavigationServer2D.map_ - void **set_enter_cost** **(** :ref:`float` value **)** - :ref:`float` **get_enter_cost** **(** **)** -When pathfinding enters this link from another regions navigation mesh the ``enter_cost`` value is added to the path distance for determining the shortest path. +When pathfinding enters this link from another regions navigation mesh the :ref:`enter_cost` value is added to the path distance for determining the shortest path. .. rst-class:: classref-item-separator @@ -204,7 +204,7 @@ The distance the link will search is controlled by :ref:`NavigationServer2D.map_ - void **set_travel_cost** **(** :ref:`float` value **)** - :ref:`float` **get_travel_cost** **(** **)** -When pathfinding moves along the link the traveled distance is multiplied with ``travel_cost`` for determining the shortest path. +When pathfinding moves along the link the traveled distance is multiplied with :ref:`travel_cost` for determining the shortest path. .. rst-class:: classref-section-separator diff --git a/classes/class_navigationlink3d.rst b/classes/class_navigationlink3d.rst index 2cdb258ff7a..4cb049409a7 100644 --- a/classes/class_navigationlink3d.rst +++ b/classes/class_navigationlink3d.rst @@ -149,7 +149,7 @@ The distance the link will search is controlled by :ref:`NavigationServer3D.map_ - void **set_enter_cost** **(** :ref:`float` value **)** - :ref:`float` **get_enter_cost** **(** **)** -When pathfinding enters this link from another regions navigation mesh the ``enter_cost`` value is added to the path distance for determining the shortest path. +When pathfinding enters this link from another regions navigation mesh the :ref:`enter_cost` value is added to the path distance for determining the shortest path. .. rst-class:: classref-item-separator @@ -204,7 +204,7 @@ The distance the link will search is controlled by :ref:`NavigationServer3D.map_ - void **set_travel_cost** **(** :ref:`float` value **)** - :ref:`float` **get_travel_cost** **(** **)** -When pathfinding moves along the link the traveled distance is multiplied with ``travel_cost`` for determining the shortest path. +When pathfinding moves along the link the traveled distance is multiplied with :ref:`travel_cost` for determining the shortest path. .. rst-class:: classref-section-separator diff --git a/classes/class_navigationobstacle2d.rst b/classes/class_navigationobstacle2d.rst index bd2975e3e99..e20634ddda6 100644 --- a/classes/class_navigationobstacle2d.rst +++ b/classes/class_navigationobstacle2d.rst @@ -10,18 +10,22 @@ NavigationObstacle2D ==================== -**Inherits:** :ref:`Node` **<** :ref:`Object` +**Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -2D Obstacle used in navigation for collision avoidance. +2D Obstacle used in navigation to constrain avoidance controlled agents outside or inside an area. .. rst-class:: classref-introduction-group Description ----------- -2D Obstacle used in navigation for collision avoidance. The obstacle needs navigation data to work correctly. **NavigationObstacle2D** is physics safe. +2D Obstacle used in navigation to constrain avoidance controlled agents outside or inside an area. The obstacle needs a navigation map and outline vertices defined to work correctly. -Obstacles **don't** change the resulting path from the pathfinding, they only affect the navigation agent movement in a radius. Therefore, using obstacles for the static walls in your level won't work because those walls don't exist in the pathfinding. The navigation agent will be pushed in a semi-random direction away while moving inside that radius. Obstacles are intended as a last resort option for constantly moving objects that cannot be (re)baked to a navigation mesh efficiently. +If the obstacle's vertices are winded in clockwise order, avoidance agents will be pushed in by the obstacle, otherwise, avoidance agents will be pushed out. Outlines must not cross or overlap. + +Obstacles are **not** a replacement for a (re)baked navigation mesh. Obstacles **don't** change the resulting path from the pathfinding, obstacles only affect the navigation avoidance agent movement by altering the suggested velocity of the avoidance agent. + +Obstacles using vertices can warp to a new position but should not moved every frame as each move requires a rebuild of the avoidance map. .. rst-class:: classref-introduction-group @@ -38,11 +42,15 @@ Properties .. table:: :widths: auto - +---------------------------+-----------------------------------------------------------------------------+----------+ - | :ref:`bool` | :ref:`estimate_radius` | ``true`` | - +---------------------------+-----------------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`radius` | ``1.0`` | - +---------------------------+-----------------------------------------------------------------------------+----------+ + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`int` | :ref:`avoidance_layers` | ``1`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`float` | :ref:`radius` | ``0.0`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`Vector2` | :ref:`velocity` | ``Vector2(0, 0)`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`PackedVector2Array` | :ref:`vertices` | ``PackedVector2Array()`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ .. rst-class:: classref-reftable-group @@ -52,13 +60,19 @@ Methods .. table:: :widths: auto - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_navigation_map` **(** **)** |const| | - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_rid` **(** **)** |const| | - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_navigation_map` **(** :ref:`RID` navigation_map **)** | - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_agent_rid` **(** **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_avoidance_layer_value` **(** :ref:`int` layer_number **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_navigation_map` **(** **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_obstacle_rid` **(** **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_avoidance_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_navigation_map` **(** :ref:`RID` navigation_map **)** | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -69,18 +83,18 @@ Methods Property Descriptions --------------------- -.. _class_NavigationObstacle2D_property_estimate_radius: +.. _class_NavigationObstacle2D_property_avoidance_layers: .. rst-class:: classref-property -:ref:`bool` **estimate_radius** = ``true`` +:ref:`int` **avoidance_layers** = ``1`` .. rst-class:: classref-property-setget -- void **set_estimate_radius** **(** :ref:`bool` value **)** -- :ref:`bool` **is_radius_estimated** **(** **)** +- void **set_avoidance_layers** **(** :ref:`int` value **)** +- :ref:`int` **get_avoidance_layers** **(** **)** -Enables radius estimation algorithm which uses parent's collision shapes to determine the obstacle radius. +A bitfield determining the avoidance layers for this obstacle. Agent's with a matching bit on the their avoidance mask will avoid this obstacle. .. rst-class:: classref-item-separator @@ -90,14 +104,48 @@ Enables radius estimation algorithm which uses parent's collision shapes to dete .. rst-class:: classref-property -:ref:`float` **radius** = ``1.0`` +:ref:`float` **radius** = ``0.0`` .. rst-class:: classref-property-setget - void **set_radius** **(** :ref:`float` value **)** - :ref:`float` **get_radius** **(** **)** -The radius of the agent. Used only if :ref:`estimate_radius` is set to false. +Sets the avoidance radius for the obstacle. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle2D_property_velocity: + +.. rst-class:: classref-property + +:ref:`Vector2` **velocity** = ``Vector2(0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_velocity** **(** :ref:`Vector2` value **)** +- :ref:`Vector2` **get_velocity** **(** **)** + +Sets the wanted velocity for the obstacle so other agent's can better predict the obstacle if it is moved with a velocity regularly (every frame) instead of warped to a new position. Does only affect avoidance for the obstacles :ref:`radius`. Does nothing for the obstacles static vertices. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle2D_property_vertices: + +.. rst-class:: classref-property + +:ref:`PackedVector2Array` **vertices** = ``PackedVector2Array()`` + +.. rst-class:: classref-property-setget + +- void **set_vertices** **(** :ref:`PackedVector2Array` value **)** +- :ref:`PackedVector2Array` **get_vertices** **(** **)** + +The outline vertices of the obstacle. If the vertices are winded in clockwise order agents will be pushed in by the obstacle, else they will be pushed out. Outlines can not be crossed or overlap. Should the vertices using obstacle be warped to a new position agent's can not predict this movement and may get trapped inside the obstacle. .. rst-class:: classref-section-separator @@ -108,25 +156,61 @@ The radius of the agent. Used only if :ref:`estimate_radius` **get_agent_rid** **(** **)** |const| + +Returns the :ref:`RID` of this agent on the :ref:`NavigationServer2D`. This :ref:`RID` is used for the moving avoidance "obstacle" component (using a fake avoidance agent) which size is defined by :ref:`radius` and velocity set by using :ref:`velocity`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle2D_method_get_avoidance_layer_value: + +.. rst-class:: classref-method + +:ref:`bool` **get_avoidance_layer_value** **(** :ref:`int` layer_number **)** |const| + +Returns whether or not the specified layer of the :ref:`avoidance_layers` bitmask is enabled, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationObstacle2D_method_get_navigation_map: .. rst-class:: classref-method :ref:`RID` **get_navigation_map** **(** **)** |const| -Returns the :ref:`RID` of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract agent on the NavigationServer. If the agent map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use :ref:`set_navigation_map` to change the navigation map for the NavigationObstacle and also update the agent on the NavigationServer. +Returns the :ref:`RID` of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract obstacle on the NavigationServer. If the obstacle map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use :ref:`set_navigation_map` to change the navigation map for the NavigationObstacle and also update the obstacle on the NavigationServer. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle2D_method_get_obstacle_rid: + +.. rst-class:: classref-method + +:ref:`RID` **get_obstacle_rid** **(** **)** |const| + +Returns the :ref:`RID` of this obstacle on the :ref:`NavigationServer2D`. This :ref:`RID` is used for the static avoidance obstacle component which shape is defined by :ref:`vertices`. .. rst-class:: classref-item-separator ---- -.. _class_NavigationObstacle2D_method_get_rid: +.. _class_NavigationObstacle2D_method_set_avoidance_layer_value: .. rst-class:: classref-method -:ref:`RID` **get_rid** **(** **)** |const| +void **set_avoidance_layer_value** **(** :ref:`int` layer_number, :ref:`bool` value **)** -Returns the :ref:`RID` of this obstacle on the :ref:`NavigationServer2D`. +Based on ``value``, enables or disables the specified layer in the :ref:`avoidance_layers` bitmask, given a ``layer_number`` between 1 and 32. .. rst-class:: classref-item-separator @@ -138,7 +222,7 @@ Returns the :ref:`RID` of this obstacle on the :ref:`NavigationServer void **set_navigation_map** **(** :ref:`RID` navigation_map **)** -Sets the :ref:`RID` of the navigation map this NavigationObstacle node should use and also updates the ``agent`` on the NavigationServer. +Sets the :ref:`RID` of the navigation map this NavigationObstacle node should use and also updates the ``obstacle`` on the NavigationServer. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_navigationobstacle3d.rst b/classes/class_navigationobstacle3d.rst index af0a871bd8e..d6e208271bc 100644 --- a/classes/class_navigationobstacle3d.rst +++ b/classes/class_navigationobstacle3d.rst @@ -10,18 +10,22 @@ NavigationObstacle3D ==================== -**Inherits:** :ref:`Node` **<** :ref:`Object` +**Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -3D Obstacle used in navigation for collision avoidance. +3D Obstacle used in navigation to constrain avoidance controlled agents outside or inside an area. .. rst-class:: classref-introduction-group Description ----------- -3D Obstacle used in navigation for collision avoidance. The obstacle needs navigation data to work correctly. **NavigationObstacle3D** is physics safe. +3D Obstacle used in navigation to constrain avoidance controlled agents outside or inside an area. The obstacle needs a navigation map and outline vertices defined to work correctly. -Obstacles **don't** change the resulting path from the pathfinding, they only affect the navigation agent movement in a radius. Therefore, using obstacles for the static walls in your level won't work because those walls don't exist in the pathfinding. The navigation agent will be pushed in a semi-random direction away while moving inside that radius. Obstacles are intended as a last resort option for constantly moving objects that cannot be (re)baked to a navigation mesh efficiently. +If the obstacle's vertices are winded in clockwise order, avoidance agents will be pushed in by the obstacle, otherwise, avoidance agents will be pushed out. Outlines must not cross or overlap. + +Obstacles are **not** a replacement for a (re)baked navigation mesh. Obstacles **don't** change the resulting path from the pathfinding, obstacles only affect the navigation avoidance agent movement by altering the suggested velocity of the avoidance agent. + +Obstacles using vertices can warp to a new position but should not moved every frame as each move requires a rebuild of the avoidance map. .. rst-class:: classref-introduction-group @@ -38,11 +42,19 @@ Properties .. table:: :widths: auto - +---------------------------+-----------------------------------------------------------------------------+----------+ - | :ref:`bool` | :ref:`estimate_radius` | ``true`` | - +---------------------------+-----------------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`radius` | ``1.0`` | - +---------------------------+-----------------------------------------------------------------------------+----------+ + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`int` | :ref:`avoidance_layers` | ``1`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`float` | :ref:`height` | ``1.0`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`float` | :ref:`radius` | ``0.0`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`bool` | :ref:`use_3d_avoidance` | ``false`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`Vector3` | :ref:`velocity` | ``Vector3(0, 0, 0)`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ + | :ref:`PackedVector3Array` | :ref:`vertices` | ``PackedVector3Array()`` | + +-----------------------------------------------------+-------------------------------------------------------------------------------+--------------------------+ .. rst-class:: classref-reftable-group @@ -52,13 +64,19 @@ Methods .. table:: :widths: auto - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_navigation_map` **(** **)** |const| | - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_rid` **(** **)** |const| | - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_navigation_map` **(** :ref:`RID` navigation_map **)** | - +-----------------------+----------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_agent_rid` **(** **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_avoidance_layer_value` **(** :ref:`int` layer_number **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_navigation_map` **(** **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_obstacle_rid` **(** **)** |const| | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_avoidance_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_navigation_map` **(** :ref:`RID` navigation_map **)** | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -69,18 +87,35 @@ Methods Property Descriptions --------------------- -.. _class_NavigationObstacle3D_property_estimate_radius: +.. _class_NavigationObstacle3D_property_avoidance_layers: + +.. rst-class:: classref-property + +:ref:`int` **avoidance_layers** = ``1`` + +.. rst-class:: classref-property-setget + +- void **set_avoidance_layers** **(** :ref:`int` value **)** +- :ref:`int` **get_avoidance_layers** **(** **)** + +A bitfield determining the avoidance layers for this obstacle. Agent's with a matching bit on the their avoidance mask will avoid this obstacle. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle3D_property_height: .. rst-class:: classref-property -:ref:`bool` **estimate_radius** = ``true`` +:ref:`float` **height** = ``1.0`` .. rst-class:: classref-property-setget -- void **set_estimate_radius** **(** :ref:`bool` value **)** -- :ref:`bool` **is_radius_estimated** **(** **)** +- void **set_height** **(** :ref:`float` value **)** +- :ref:`float` **get_height** **(** **)** -Enables radius estimation algorithm which uses parent's collision shapes to determine the obstacle radius. +Sets the obstacle height used in 2D avoidance. 2D avoidance using agent's ignore obstacles that are below or above them. .. rst-class:: classref-item-separator @@ -90,14 +125,67 @@ Enables radius estimation algorithm which uses parent's collision shapes to dete .. rst-class:: classref-property -:ref:`float` **radius** = ``1.0`` +:ref:`float` **radius** = ``0.0`` .. rst-class:: classref-property-setget - void **set_radius** **(** :ref:`float` value **)** - :ref:`float` **get_radius** **(** **)** -The radius of the agent. Used only if :ref:`estimate_radius` is set to false. +Sets the avoidance radius for the obstacle. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle3D_property_use_3d_avoidance: + +.. rst-class:: classref-property + +:ref:`bool` **use_3d_avoidance** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_use_3d_avoidance** **(** :ref:`bool` value **)** +- :ref:`bool` **get_use_3d_avoidance** **(** **)** + +If ``true`` the obstacle affects 3D avoidance using agent's with obstacle :ref:`radius`. + +If ``false`` the obstacle affects 2D avoidance using agent's with both obstacle :ref:`vertices` as well as obstacle :ref:`radius`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle3D_property_velocity: + +.. rst-class:: classref-property + +:ref:`Vector3` **velocity** = ``Vector3(0, 0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_velocity** **(** :ref:`Vector3` value **)** +- :ref:`Vector3` **get_velocity** **(** **)** + +Sets the wanted velocity for the obstacle so other agent's can better predict the obstacle if it is moved with a velocity regularly (every frame) instead of warped to a new position. Does only affect avoidance for the obstacles :ref:`radius`. Does nothing for the obstacles static vertices. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle3D_property_vertices: + +.. rst-class:: classref-property + +:ref:`PackedVector3Array` **vertices** = ``PackedVector3Array()`` + +.. rst-class:: classref-property-setget + +- void **set_vertices** **(** :ref:`PackedVector3Array` value **)** +- :ref:`PackedVector3Array` **get_vertices** **(** **)** + +The outline vertices of the obstacle. If the vertices are winded in clockwise order agents will be pushed in by the obstacle, else they will be pushed out. Outlines can not be crossed or overlap. Should the vertices using obstacle be warped to a new position agent's can not predict this movement and may get trapped inside the obstacle. .. rst-class:: classref-section-separator @@ -108,25 +196,61 @@ The radius of the agent. Used only if :ref:`estimate_radius` **get_agent_rid** **(** **)** |const| + +Returns the :ref:`RID` of this agent on the :ref:`NavigationServer3D`. This :ref:`RID` is used for the moving avoidance "obstacle" component (using a fake avoidance agent) which size is defined by :ref:`radius` and velocity set by using :ref:`velocity`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle3D_method_get_avoidance_layer_value: + +.. rst-class:: classref-method + +:ref:`bool` **get_avoidance_layer_value** **(** :ref:`int` layer_number **)** |const| + +Returns whether or not the specified layer of the :ref:`avoidance_layers` bitmask is enabled, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationObstacle3D_method_get_navigation_map: .. rst-class:: classref-method :ref:`RID` **get_navigation_map** **(** **)** |const| -Returns the :ref:`RID` of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract agent on the NavigationServer. If the agent map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use :ref:`set_navigation_map` to change the navigation map for the NavigationObstacle and also update the agent on the NavigationServer. +Returns the :ref:`RID` of the navigation map for this NavigationObstacle node. This function returns always the map set on the NavigationObstacle node and not the map of the abstract obstacle on the NavigationServer. If the obstacle map is changed directly with the NavigationServer API the NavigationObstacle node will not be aware of the map change. Use :ref:`set_navigation_map` to change the navigation map for the NavigationObstacle and also update the obstacle on the NavigationServer. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationObstacle3D_method_get_obstacle_rid: + +.. rst-class:: classref-method + +:ref:`RID` **get_obstacle_rid** **(** **)** |const| + +Returns the :ref:`RID` of this obstacle on the :ref:`NavigationServer3D`. This :ref:`RID` is used for the static avoidance obstacle component which shape is defined by :ref:`vertices`. .. rst-class:: classref-item-separator ---- -.. _class_NavigationObstacle3D_method_get_rid: +.. _class_NavigationObstacle3D_method_set_avoidance_layer_value: .. rst-class:: classref-method -:ref:`RID` **get_rid** **(** **)** |const| +void **set_avoidance_layer_value** **(** :ref:`int` layer_number, :ref:`bool` value **)** -Returns the :ref:`RID` of this obstacle on the :ref:`NavigationServer3D`. +Based on ``value``, enables or disables the specified layer in the :ref:`avoidance_layers` bitmask, given a ``layer_number`` between 1 and 32. .. rst-class:: classref-item-separator @@ -138,7 +262,7 @@ Returns the :ref:`RID` of this obstacle on the :ref:`NavigationServer void **set_navigation_map** **(** :ref:`RID` navigation_map **)** -Sets the :ref:`RID` of the navigation map this NavigationObstacle node should use and also updates the ``agent`` on the NavigationServer. +Sets the :ref:`RID` of the navigation map this NavigationObstacle node should use and also updates the ``obstacle`` on the NavigationServer. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_navigationregion2d.rst b/classes/class_navigationregion2d.rst index 111926f1036..3d066fbd14d 100644 --- a/classes/class_navigationregion2d.rst +++ b/classes/class_navigationregion2d.rst @@ -48,17 +48,23 @@ Properties .. table:: :widths: auto - +---------------------------------------------------+---------------------------------------------------------------------------------+----------+ - | :ref:`bool` | :ref:`enabled` | ``true`` | - +---------------------------------------------------+---------------------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`enter_cost` | ``0.0`` | - +---------------------------------------------------+---------------------------------------------------------------------------------+----------+ - | :ref:`int` | :ref:`navigation_layers` | ``1`` | - +---------------------------------------------------+---------------------------------------------------------------------------------+----------+ - | :ref:`NavigationPolygon` | :ref:`navigation_polygon` | | - +---------------------------------------------------+---------------------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`travel_cost` | ``1.0`` | - +---------------------------------------------------+---------------------------------------------------------------------------------+----------+ + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`avoidance_layers` | ``1`` | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`constrain_avoidance` | ``false`` | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`enabled` | ``true`` | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`float` | :ref:`enter_cost` | ``0.0`` | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`navigation_layers` | ``1`` | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`NavigationPolygon` | :ref:`navigation_polygon` | | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`float` | :ref:`travel_cost` | ``1.0`` | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`use_edge_connections` | ``true`` | + +---------------------------------------------------+-------------------------------------------------------------------------------------+-----------+ .. rst-class:: classref-reftable-group @@ -68,11 +74,15 @@ Methods .. table:: :widths: auto + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_avoidance_layer_value` **(** :ref:`int` layer_number **)** |const| | +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`get_navigation_layer_value` **(** :ref:`int` layer_number **)** |const| | +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`get_region_rid` **(** **)** |const| | +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_avoidance_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | + +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_navigation_layer_value` **(** :ref:`int` layer_number, :ref:`bool` value **)** | +-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -85,6 +95,42 @@ Methods Property Descriptions --------------------- +.. _class_NavigationRegion2D_property_avoidance_layers: + +.. rst-class:: classref-property + +:ref:`int` **avoidance_layers** = ``1`` + +.. rst-class:: classref-property-setget + +- void **set_avoidance_layers** **(** :ref:`int` value **)** +- :ref:`int` **get_avoidance_layers** **(** **)** + +A bitfield determining all avoidance layers for the avoidance constrain. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationRegion2D_property_constrain_avoidance: + +.. rst-class:: classref-property + +:ref:`bool` **constrain_avoidance** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_constrain_avoidance** **(** :ref:`bool` value **)** +- :ref:`bool` **get_constrain_avoidance** **(** **)** + +If ``true`` constraints avoidance agent's with an avoidance mask bit that matches with a bit of the :ref:`avoidance_layers` to the navigation polygon. Due to each navigation polygon outline creating an obstacle and each polygon edge creating an avoidance line constrain keep the navigation polygon shape as simple as possible for performance. + +\ **Experimental:** This is an experimental feature and should not be used in production as agent's can get stuck on the navigation polygon corners and edges especially at high frame rate. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationRegion2D_property_enabled: .. rst-class:: classref-property @@ -166,6 +212,23 @@ The :ref:`NavigationPolygon` resource to use. When pathfinding moves inside this region's navigation mesh the traveled distances are multiplied with ``travel_cost`` for determining the shortest path. +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationRegion2D_property_use_edge_connections: + +.. rst-class:: classref-property + +:ref:`bool` **use_edge_connections** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_use_edge_connections** **(** :ref:`bool` value **)** +- :ref:`bool` **get_use_edge_connections** **(** **)** + +If enabled the navigation region will use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + .. rst-class:: classref-section-separator ---- @@ -175,6 +238,18 @@ When pathfinding moves inside this region's navigation mesh the traveled distanc Method Descriptions ------------------- +.. _class_NavigationRegion2D_method_get_avoidance_layer_value: + +.. rst-class:: classref-method + +:ref:`bool` **get_avoidance_layer_value** **(** :ref:`int` layer_number **)** |const| + +Returns whether or not the specified layer of the :ref:`avoidance_layers` bitmask is enabled, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationRegion2D_method_get_navigation_layer_value: .. rst-class:: classref-method @@ -199,6 +274,18 @@ Returns the :ref:`RID` of this region on the :ref:`NavigationServer2D ---- +.. _class_NavigationRegion2D_method_set_avoidance_layer_value: + +.. rst-class:: classref-method + +void **set_avoidance_layer_value** **(** :ref:`int` layer_number, :ref:`bool` value **)** + +Based on ``value``, enables or disables the specified layer in the :ref:`avoidance_layers` bitmask, given a ``layer_number`` between 1 and 32. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationRegion2D_method_set_navigation_layer_value: .. rst-class:: classref-method diff --git a/classes/class_navigationregion3d.rst b/classes/class_navigationregion3d.rst index d8a350087ee..347981d53df 100644 --- a/classes/class_navigationregion3d.rst +++ b/classes/class_navigationregion3d.rst @@ -48,17 +48,19 @@ Properties .. table:: :widths: auto - +---------------------------------------------+-------------------------------------------------------------------------------+----------+ - | :ref:`bool` | :ref:`enabled` | ``true`` | - +---------------------------------------------+-------------------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`enter_cost` | ``0.0`` | - +---------------------------------------------+-------------------------------------------------------------------------------+----------+ - | :ref:`int` | :ref:`navigation_layers` | ``1`` | - +---------------------------------------------+-------------------------------------------------------------------------------+----------+ - | :ref:`NavigationMesh` | :ref:`navigation_mesh` | | - +---------------------------------------------+-------------------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`travel_cost` | ``1.0`` | - +---------------------------------------------+-------------------------------------------------------------------------------+----------+ + +---------------------------------------------+-------------------------------------------------------------------------------------+----------+ + | :ref:`bool` | :ref:`enabled` | ``true`` | + +---------------------------------------------+-------------------------------------------------------------------------------------+----------+ + | :ref:`float` | :ref:`enter_cost` | ``0.0`` | + +---------------------------------------------+-------------------------------------------------------------------------------------+----------+ + | :ref:`int` | :ref:`navigation_layers` | ``1`` | + +---------------------------------------------+-------------------------------------------------------------------------------------+----------+ + | :ref:`NavigationMesh` | :ref:`navigation_mesh` | | + +---------------------------------------------+-------------------------------------------------------------------------------------+----------+ + | :ref:`float` | :ref:`travel_cost` | ``1.0`` | + +---------------------------------------------+-------------------------------------------------------------------------------------+----------+ + | :ref:`bool` | :ref:`use_edge_connections` | ``true`` | + +---------------------------------------------+-------------------------------------------------------------------------------------+----------+ .. rst-class:: classref-reftable-group @@ -197,6 +199,23 @@ The :ref:`NavigationMesh` resource to use. When pathfinding moves inside this region's navigation mesh the traveled distances are multiplied with ``travel_cost`` for determining the shortest path. +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationRegion3D_property_use_edge_connections: + +.. rst-class:: classref-property + +:ref:`bool` **use_edge_connections** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_use_edge_connections** **(** :ref:`bool` value **)** +- :ref:`bool` **get_use_edge_connections** **(** **)** + +If enabled the navigation region will use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + .. rst-class:: classref-section-separator ---- diff --git a/classes/class_navigationserver2d.rst b/classes/class_navigationserver2d.rst index 2e22c032938..59003bcc106 100644 --- a/classes/class_navigationserver2d.rst +++ b/classes/class_navigationserver2d.rst @@ -31,7 +31,7 @@ You may assign navigation layers to regions with :ref:`region_set_navigation_lay To use the collision avoidance system, you may use agents. You can set an agent's target velocity, then the servers will emit a callback with a modified velocity. -\ **Note:** The collision avoidance system ignores regions. Using the modified velocity as-is might lead to pushing and agent outside of a navigable area. This is a limitation of the collision avoidance system, any more complex situation may require the use of the physics engine. +\ **Note:** The collision avoidance system ignores regions. Using the modified velocity as-is might lead to pushing an agent outside of a navigable area. This is a limitation of the collision avoidance system, any more complex situation may require the use of the physics engine. This server keeps tracks of any call and executes them during the sync phase. This means that you can request any change to the map, using any thread, without worrying. @@ -55,11 +55,21 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`agent_create` **(** **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`agent_get_avoidance_enabled` **(** :ref:`RID` agent **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`agent_get_map` **(** :ref:`RID` agent **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`agent_is_map_changed` **(** :ref:`RID` agent **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`agent_set_callback` **(** :ref:`RID` agent, :ref:`Callable` callback **)** | + | void | :ref:`agent_set_avoidance_callback` **(** :ref:`RID` agent, :ref:`Callable` callback **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_enabled` **(** :ref:`RID` agent, :ref:`bool` enabled **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_layers` **(** :ref:`RID` agent, :ref:`int` layers **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_mask` **(** :ref:`RID` agent, :ref:`int` mask **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_priority` **(** :ref:`RID` agent, :ref:`float` priority **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`agent_set_map` **(** :ref:`RID` agent, :ref:`RID` map **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -73,12 +83,14 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`agent_set_radius` **(** :ref:`RID` agent, :ref:`float` radius **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`agent_set_target_velocity` **(** :ref:`RID` agent, :ref:`Vector2` target_velocity **)** | + | void | :ref:`agent_set_time_horizon_agents` **(** :ref:`RID` agent, :ref:`float` time_horizon **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`agent_set_time_horizon` **(** :ref:`RID` agent, :ref:`float` time **)** | + | void | :ref:`agent_set_time_horizon_obstacles` **(** :ref:`RID` agent, :ref:`float` time_horizon **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`agent_set_velocity` **(** :ref:`RID` agent, :ref:`Vector2` velocity **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_velocity_forced` **(** :ref:`RID` agent, :ref:`Vector2` velocity **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`free_rid` **(** :ref:`RID` rid **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`get_debug_enabled` **(** **)** |const| | @@ -137,10 +149,14 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID[]` | :ref:`map_get_links` **(** :ref:`RID` map **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID[]` | :ref:`map_get_obstacles` **(** :ref:`RID` map **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedVector2Array` | :ref:`map_get_path` **(** :ref:`RID` map, :ref:`Vector2` origin, :ref:`Vector2` destination, :ref:`bool` optimize, :ref:`int` navigation_layers=1 **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID[]` | :ref:`map_get_regions` **(** :ref:`RID` map **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`map_get_use_edge_connections` **(** :ref:`RID` map **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`map_is_active` **(** :ref:`RID` map **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`map_set_active` **(** :ref:`RID` map, :ref:`bool` active **)** | @@ -151,6 +167,20 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`map_set_link_connection_radius` **(** :ref:`RID` map, :ref:`float` radius **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`map_set_use_edge_connections` **(** :ref:`RID` map, :ref:`bool` enabled **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`obstacle_create` **(** **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`obstacle_get_map` **(** :ref:`RID` obstacle **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_avoidance_layers` **(** :ref:`RID` obstacle, :ref:`int` layers **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_map` **(** :ref:`RID` obstacle, :ref:`RID` map **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_position` **(** :ref:`RID` obstacle, :ref:`Vector2` position **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_vertices` **(** :ref:`RID` obstacle, :ref:`PackedVector2Array` vertices **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`query_path` **(** :ref:`NavigationPathQueryParameters2D` parameters, :ref:`NavigationPathQueryResult2D` result **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`region_create` **(** **)** | @@ -171,6 +201,8 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`region_get_travel_cost` **(** :ref:`RID` region **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`region_get_use_edge_connections` **(** :ref:`RID` region **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`region_owns_point` **(** :ref:`RID` region, :ref:`Vector2` point **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`region_set_enter_cost` **(** :ref:`RID` region, :ref:`float` enter_cost **)** | @@ -187,6 +219,8 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`region_set_travel_cost` **(** :ref:`RID` region, :ref:`float` travel_cost **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`region_set_use_edge_connections` **(** :ref:`RID` region, :ref:`bool` enabled **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_debug_enabled` **(** :ref:`bool` enabled **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -240,6 +274,18 @@ Creates the agent. ---- +.. _class_NavigationServer2D_method_agent_get_avoidance_enabled: + +.. rst-class:: classref-method + +:ref:`bool` **agent_get_avoidance_enabled** **(** :ref:`RID` agent **)** |const| + +Return ``true`` if the specified ``agent`` uses avoidance. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer2D_method_agent_get_map: .. rst-class:: classref-method @@ -264,15 +310,65 @@ Returns true if the map got changed the previous frame. ---- -.. _class_NavigationServer2D_method_agent_set_callback: +.. _class_NavigationServer2D_method_agent_set_avoidance_callback: + +.. rst-class:: classref-method + +void **agent_set_avoidance_callback** **(** :ref:`RID` agent, :ref:`Callable` callback **)** + +Sets the callback :ref:`Callable` that gets called after each avoidance processing step for the ``agent``. The calculated ``safe_velocity`` will be dispatched with a signal to the object just before the physics calculations. + +\ **Note:** Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use :ref:`agent_set_avoidance_callback` again with an empty :ref:`Callable`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_agent_set_avoidance_enabled: + +.. rst-class:: classref-method + +void **agent_set_avoidance_enabled** **(** :ref:`RID` agent, :ref:`bool` enabled **)** + +If ``enabled`` is ``true`` the specified ``agent`` uses avoidance. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_agent_set_avoidance_layers: + +.. rst-class:: classref-method + +void **agent_set_avoidance_layers** **(** :ref:`RID` agent, :ref:`int` layers **)** + +Set the agent's ``avoidance_layers`` bitmask. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_agent_set_avoidance_mask: .. rst-class:: classref-method -void **agent_set_callback** **(** :ref:`RID` agent, :ref:`Callable` callback **)** +void **agent_set_avoidance_mask** **(** :ref:`RID` agent, :ref:`int` mask **)** -Sets the callback that gets called after each avoidance processing step for the ``agent``. The calculated ``safe_velocity`` will be passed as the first parameter just before the physics calculations. +Set the agent's ``avoidance_mask`` bitmask. -\ **Note:** Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use :ref:`agent_set_callback` again with an empty :ref:`Callable`. +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_agent_set_avoidance_priority: + +.. rst-class:: classref-method + +void **agent_set_avoidance_priority** **(** :ref:`RID` agent, :ref:`float` priority **)** + +Set the agent's ``avoidance_priority`` with a ``priority`` between 0.0 (lowest priority) to 1.0 (highest priority). + +The specified ``agent`` does not adjust the velocity for other agents that would match the ``avoidance_mask`` but have a lower `` avoidance_priority``. This in turn makes the other agents with lower priority adjust their velocities even more to avoid collision with this agent. .. rst-class:: classref-item-separator @@ -350,25 +446,25 @@ Sets the radius of the agent. ---- -.. _class_NavigationServer2D_method_agent_set_target_velocity: +.. _class_NavigationServer2D_method_agent_set_time_horizon_agents: .. rst-class:: classref-method -void **agent_set_target_velocity** **(** :ref:`RID` agent, :ref:`Vector2` target_velocity **)** +void **agent_set_time_horizon_agents** **(** :ref:`RID` agent, :ref:`float` time_horizon **)** -Sets the new target velocity. +The minimal amount of time for which the agent's velocities that are computed by the simulation are safe with respect to other agents. The larger this number, the sooner this agent will respond to the presence of other agents, but the less freedom this agent has in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. .. rst-class:: classref-item-separator ---- -.. _class_NavigationServer2D_method_agent_set_time_horizon: +.. _class_NavigationServer2D_method_agent_set_time_horizon_obstacles: .. rst-class:: classref-method -void **agent_set_time_horizon** **(** :ref:`RID` agent, :ref:`float` time **)** +void **agent_set_time_horizon_obstacles** **(** :ref:`RID` agent, :ref:`float` time_horizon **)** -The minimal amount of time for which the agent's velocities that are computed by the simulation are safe with respect to other agents. The larger this number, the sooner this agent will respond to the presence of other agents, but the less freedom this agent has in choosing its velocities. Must be positive. +The minimal amount of time for which the agent's velocities that are computed by the simulation are safe with respect to static avoidance obstacles. The larger this number, the sooner this agent will respond to the presence of static avoidance obstacles, but the less freedom this agent has in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. .. rst-class:: classref-item-separator @@ -380,7 +476,19 @@ The minimal amount of time for which the agent's velocities that are computed by void **agent_set_velocity** **(** :ref:`RID` agent, :ref:`Vector2` velocity **)** -Sets the current velocity of the agent. +Sets ``velocity`` as the new wanted velocity for the specified ``agent``. The avoidance simulation will try to fulfil this velocity if possible but will modify it to avoid collision with other agent's and obstacles. When an agent is teleported to a new position far away use :ref:`agent_set_velocity_forced` instead to reset the internal velocity state. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_agent_set_velocity_forced: + +.. rst-class:: classref-method + +void **agent_set_velocity_forced** **(** :ref:`RID` agent, :ref:`Vector2` velocity **)** + +Replaces the internal velocity in the collision avoidance simulation with ``velocity`` for the specified ``agent``. When an agent is teleported to a new position far away this function should be used in the same frame. If called frequently this function can get agents stuck. .. rst-class:: classref-item-separator @@ -740,6 +848,18 @@ Returns all navigation link :ref:`RID`\ s that are currently assigned ---- +.. _class_NavigationServer2D_method_map_get_obstacles: + +.. rst-class:: classref-method + +:ref:`RID[]` **map_get_obstacles** **(** :ref:`RID` map **)** |const| + +Returns all navigation obstacle :ref:`RID`\ s that are currently assigned to the requested navigation ``map``. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer2D_method_map_get_path: .. rst-class:: classref-method @@ -764,6 +884,18 @@ Returns all navigation regions :ref:`RID`\ s that are currently assig ---- +.. _class_NavigationServer2D_method_map_get_use_edge_connections: + +.. rst-class:: classref-method + +:ref:`bool` **map_get_use_edge_connections** **(** :ref:`RID` map **)** |const| + +Returns whether the navigation ``map`` allows navigation regions to use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer2D_method_map_is_active: .. rst-class:: classref-method @@ -824,6 +956,92 @@ Set the map's link connection radius used to connect links to navigation polygon ---- +.. _class_NavigationServer2D_method_map_set_use_edge_connections: + +.. rst-class:: classref-method + +void **map_set_use_edge_connections** **(** :ref:`RID` map, :ref:`bool` enabled **)** + +Set the navigation ``map`` edge connection use. If ``enabled`` the navigation map allows navigation regions to use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_obstacle_create: + +.. rst-class:: classref-method + +:ref:`RID` **obstacle_create** **(** **)** + +Creates a new navigation obstacle. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_obstacle_get_map: + +.. rst-class:: classref-method + +:ref:`RID` **obstacle_get_map** **(** :ref:`RID` obstacle **)** |const| + +Returns the navigation map :ref:`RID` the requested ``obstacle`` is currently assigned to. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_obstacle_set_avoidance_layers: + +.. rst-class:: classref-method + +void **obstacle_set_avoidance_layers** **(** :ref:`RID` obstacle, :ref:`int` layers **)** + +.. container:: contribute + + There is currently no description for this method. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_obstacle_set_map: + +.. rst-class:: classref-method + +void **obstacle_set_map** **(** :ref:`RID` obstacle, :ref:`RID` map **)** + +Sets the navigation map :ref:`RID` for the obstacle. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_obstacle_set_position: + +.. rst-class:: classref-method + +void **obstacle_set_position** **(** :ref:`RID` obstacle, :ref:`Vector2` position **)** + +Sets the position of the obstacle in world space. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer2D_method_obstacle_set_vertices: + +.. rst-class:: classref-method + +void **obstacle_set_vertices** **(** :ref:`RID` obstacle, :ref:`PackedVector2Array` vertices **)** + +Sets the outline vertices for the obstacle. If the vertices are winded in clockwise order agents will be pushed in by the obstacle, else they will be pushed out. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer2D_method_query_path: .. rst-class:: classref-method @@ -944,6 +1162,18 @@ Returns the travel cost of this ``region``. ---- +.. _class_NavigationServer2D_method_region_get_use_edge_connections: + +.. rst-class:: classref-method + +:ref:`bool` **region_get_use_edge_connections** **(** :ref:`RID` region **)** |const| + +Returns whether the navigation ``region`` is set to use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer2D_method_region_owns_point: .. rst-class:: classref-method @@ -1044,6 +1274,18 @@ Sets the ``travel_cost`` for this ``region``. ---- +.. _class_NavigationServer2D_method_region_set_use_edge_connections: + +.. rst-class:: classref-method + +void **region_set_use_edge_connections** **(** :ref:`RID` region, :ref:`bool` enabled **)** + +If ``enabled`` the navigation ``region`` will use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer2D_method_set_debug_enabled: .. rst-class:: classref-method diff --git a/classes/class_navigationserver3d.rst b/classes/class_navigationserver3d.rst index 6ced2d5ecd0..8d7210ccc99 100644 --- a/classes/class_navigationserver3d.rst +++ b/classes/class_navigationserver3d.rst @@ -55,11 +55,25 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`agent_create` **(** **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`agent_get_avoidance_enabled` **(** :ref:`RID` agent **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`agent_get_map` **(** :ref:`RID` agent **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`agent_get_use_3d_avoidance` **(** :ref:`RID` agent **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`agent_is_map_changed` **(** :ref:`RID` agent **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`agent_set_callback` **(** :ref:`RID` agent, :ref:`Callable` callback **)** | + | void | :ref:`agent_set_avoidance_callback` **(** :ref:`RID` agent, :ref:`Callable` callback **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_enabled` **(** :ref:`RID` agent, :ref:`bool` enabled **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_layers` **(** :ref:`RID` agent, :ref:`int` layers **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_mask` **(** :ref:`RID` agent, :ref:`int` mask **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_avoidance_priority` **(** :ref:`RID` agent, :ref:`float` priority **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_height` **(** :ref:`RID` agent, :ref:`float` height **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`agent_set_map` **(** :ref:`RID` agent, :ref:`RID` map **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -73,12 +87,16 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`agent_set_radius` **(** :ref:`RID` agent, :ref:`float` radius **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`agent_set_target_velocity` **(** :ref:`RID` agent, :ref:`Vector3` target_velocity **)** | + | void | :ref:`agent_set_time_horizon_agents` **(** :ref:`RID` agent, :ref:`float` time_horizon **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`agent_set_time_horizon` **(** :ref:`RID` agent, :ref:`float` time **)** | + | void | :ref:`agent_set_time_horizon_obstacles` **(** :ref:`RID` agent, :ref:`float` time_horizon **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_use_3d_avoidance` **(** :ref:`RID` agent, :ref:`bool` enabled **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`agent_set_velocity` **(** :ref:`RID` agent, :ref:`Vector3` velocity **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`agent_set_velocity_forced` **(** :ref:`RID` agent, :ref:`Vector3` velocity **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`free_rid` **(** :ref:`RID` rid **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`get_debug_enabled` **(** **)** |const| | @@ -143,12 +161,16 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID[]` | :ref:`map_get_links` **(** :ref:`RID` map **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID[]` | :ref:`map_get_obstacles` **(** :ref:`RID` map **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedVector3Array` | :ref:`map_get_path` **(** :ref:`RID` map, :ref:`Vector3` origin, :ref:`Vector3` destination, :ref:`bool` optimize, :ref:`int` navigation_layers=1 **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID[]` | :ref:`map_get_regions` **(** :ref:`RID` map **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector3` | :ref:`map_get_up` **(** :ref:`RID` map **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`map_get_use_edge_connections` **(** :ref:`RID` map **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`map_is_active` **(** :ref:`RID` map **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`map_set_active` **(** :ref:`RID` map, :ref:`bool` active **)** | @@ -161,6 +183,22 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`map_set_up` **(** :ref:`RID` map, :ref:`Vector3` up **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`map_set_use_edge_connections` **(** :ref:`RID` map, :ref:`bool` enabled **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`obstacle_create` **(** **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`obstacle_get_map` **(** :ref:`RID` obstacle **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_avoidance_layers` **(** :ref:`RID` obstacle, :ref:`int` layers **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_height` **(** :ref:`RID` obstacle, :ref:`float` height **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_map` **(** :ref:`RID` obstacle, :ref:`RID` map **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_position` **(** :ref:`RID` obstacle, :ref:`Vector3` position **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`obstacle_set_vertices` **(** :ref:`RID` obstacle, :ref:`PackedVector3Array` vertices **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`query_path` **(** :ref:`NavigationPathQueryParameters3D` parameters, :ref:`NavigationPathQueryResult3D` result **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`region_bake_navigation_mesh` **(** :ref:`NavigationMesh` navigation_mesh, :ref:`Node` root_node **)** | @@ -183,6 +221,8 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`region_get_travel_cost` **(** :ref:`RID` region **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`region_get_use_edge_connections` **(** :ref:`RID` region **)** |const| | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`region_owns_point` **(** :ref:`RID` region, :ref:`Vector3` point **)** |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`region_set_enter_cost` **(** :ref:`RID` region, :ref:`float` enter_cost **)** | @@ -199,6 +239,8 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`region_set_travel_cost` **(** :ref:`RID` region, :ref:`float` travel_cost **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`region_set_use_edge_connections` **(** :ref:`RID` region, :ref:`bool` enabled **)** | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_active` **(** :ref:`bool` active **)** | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_debug_enabled` **(** :ref:`bool` enabled **)** | @@ -213,6 +255,18 @@ Methods Signals ------- +.. _class_NavigationServer3D_signal_avoidance_debug_changed: + +.. rst-class:: classref-signal + +**avoidance_debug_changed** **(** **)** + +Emitted when avoidance debug settings are changed. Only available in debug builds. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_signal_map_changed: .. rst-class:: classref-signal @@ -341,6 +395,18 @@ Creates the agent. ---- +.. _class_NavigationServer3D_method_agent_get_avoidance_enabled: + +.. rst-class:: classref-method + +:ref:`bool` **agent_get_avoidance_enabled** **(** :ref:`RID` agent **)** |const| + +Returns ``true`` if the provided ``agent`` has avoidance enabled. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_method_agent_get_map: .. rst-class:: classref-method @@ -353,6 +419,18 @@ Returns the navigation map :ref:`RID` the requested ``agent`` is curr ---- +.. _class_NavigationServer3D_method_agent_get_use_3d_avoidance: + +.. rst-class:: classref-method + +:ref:`bool` **agent_get_use_3d_avoidance** **(** :ref:`RID` agent **)** |const| + +Returns ``true`` if the provided ``agent`` uses avoidance in 3D space Vector3(x,y,z) instead of horizontal 2D Vector2(x,y) / Vector3(x,0.0,z). + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_method_agent_is_map_changed: .. rst-class:: classref-method @@ -365,15 +443,77 @@ Returns true if the map got changed the previous frame. ---- -.. _class_NavigationServer3D_method_agent_set_callback: +.. _class_NavigationServer3D_method_agent_set_avoidance_callback: .. rst-class:: classref-method -void **agent_set_callback** **(** :ref:`RID` agent, :ref:`Callable` callback **)** +void **agent_set_avoidance_callback** **(** :ref:`RID` agent, :ref:`Callable` callback **)** -Sets the callback that gets called after each avoidance processing step for the ``agent``. The calculated ``safe_velocity`` will be passed as the first parameter just before the physics calculations. +Sets the callback :ref:`Callable` that gets called after each avoidance processing step for the ``agent``. The calculated ``safe_velocity`` will be dispatched with a signal to the object just before the physics calculations. -\ **Note:** Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use :ref:`agent_set_callback` again with an empty :ref:`Callable`. +\ **Note:** Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use :ref:`agent_set_avoidance_callback` again with an empty :ref:`Callable`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_agent_set_avoidance_enabled: + +.. rst-class:: classref-method + +void **agent_set_avoidance_enabled** **(** :ref:`RID` agent, :ref:`bool` enabled **)** + +If ``enabled`` the provided ``agent`` calculates avoidance. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_agent_set_avoidance_layers: + +.. rst-class:: classref-method + +void **agent_set_avoidance_layers** **(** :ref:`RID` agent, :ref:`int` layers **)** + +Set the agent's ``avoidance_layers`` bitmask. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_agent_set_avoidance_mask: + +.. rst-class:: classref-method + +void **agent_set_avoidance_mask** **(** :ref:`RID` agent, :ref:`int` mask **)** + +Set the agent's ``avoidance_mask`` bitmask. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_agent_set_avoidance_priority: + +.. rst-class:: classref-method + +void **agent_set_avoidance_priority** **(** :ref:`RID` agent, :ref:`float` priority **)** + +Set the agent's ``avoidance_priority`` with a ``priority`` between 0.0 (lowest priority) to 1.0 (highest priority). + +The specified ``agent`` does not adjust the velocity for other agents that would match the ``avoidance_mask`` but have a lower `` avoidance_priority``. This in turn makes the other agents with lower priority adjust their velocities even more to avoid collision with this agent. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_agent_set_height: + +.. rst-class:: classref-method + +void **agent_set_height** **(** :ref:`RID` agent, :ref:`float` height **)** + +Updates the provided ``agent`` ``height``. .. rst-class:: classref-item-separator @@ -451,25 +591,41 @@ Sets the radius of the agent. ---- -.. _class_NavigationServer3D_method_agent_set_target_velocity: +.. _class_NavigationServer3D_method_agent_set_time_horizon_agents: .. rst-class:: classref-method -void **agent_set_target_velocity** **(** :ref:`RID` agent, :ref:`Vector3` target_velocity **)** +void **agent_set_time_horizon_agents** **(** :ref:`RID` agent, :ref:`float` time_horizon **)** -Sets the new target velocity. +The minimal amount of time for which the agent's velocities that are computed by the simulation are safe with respect to other agents. The larger this number, the sooner this agent will respond to the presence of other agents, but the less freedom this agent has in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. .. rst-class:: classref-item-separator ---- -.. _class_NavigationServer3D_method_agent_set_time_horizon: +.. _class_NavigationServer3D_method_agent_set_time_horizon_obstacles: .. rst-class:: classref-method -void **agent_set_time_horizon** **(** :ref:`RID` agent, :ref:`float` time **)** +void **agent_set_time_horizon_obstacles** **(** :ref:`RID` agent, :ref:`float` time_horizon **)** -The minimal amount of time for which the agent's velocities that are computed by the simulation are safe with respect to other agents. The larger this number, the sooner this agent will respond to the presence of other agents, but the less freedom this agent has in choosing its velocities. Must be positive. +The minimal amount of time for which the agent's velocities that are computed by the simulation are safe with respect to static avoidance obstacles. The larger this number, the sooner this agent will respond to the presence of static avoidance obstacles, but the less freedom this agent has in choosing its velocities. A too high value will slow down agents movement considerably. Must be positive. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_agent_set_use_3d_avoidance: + +.. rst-class:: classref-method + +void **agent_set_use_3d_avoidance** **(** :ref:`RID` agent, :ref:`bool` enabled **)** + +Sets if the agent uses the 2D avoidance or the 3D avoidance while avoidance is enabled. + +If ``true`` the agent calculates avoidance velocities in 3D for the xyz-axis, e.g. for games that take place in air, unterwater or space. The 3D using agent only avoids other 3D avoidance using agent's. The 3D using agent only reacts to radius based avoidance obstacles. The 3D using agent ignores any vertices based obstacles. The 3D using agent only avoids other 3D using agent's. + +If ``false`` the agent calculates avoidance velocities in 2D along the xz-axis ignoring the y-axis. The 2D using agent only avoids other 2D avoidance using agent's. The 2D using agent reacts to radius avoidance obstacles. The 2D using agent reacts to vertices based avoidance obstacles. The 2D using agent only avoids other 2D using agent's. 2D using agents will ignore other 2D using agents or obstacles that are below their current position or above their current position including the agents height in 2D avoidance. .. rst-class:: classref-item-separator @@ -481,7 +637,19 @@ The minimal amount of time for which the agent's velocities that are computed by void **agent_set_velocity** **(** :ref:`RID` agent, :ref:`Vector3` velocity **)** -Sets the current velocity of the agent. +Sets ``velocity`` as the new wanted velocity for the specified ``agent``. The avoidance simulation will try to fulfil this velocity if possible but will modify it to avoid collision with other agent's and obstacles. When an agent is teleported to a new position use :ref:`agent_set_velocity_forced` as well to reset the internal simulation velocity. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_agent_set_velocity_forced: + +.. rst-class:: classref-method + +void **agent_set_velocity_forced** **(** :ref:`RID` agent, :ref:`Vector3` velocity **)** + +Replaces the internal velocity in the collision avoidance simulation with ``velocity`` for the specified ``agent``. When an agent is teleported to a new position this function should be used in the same frame. If called frequently this function can get agents stuck. .. rst-class:: classref-item-separator @@ -877,6 +1045,18 @@ Returns all navigation link :ref:`RID`\ s that are currently assigned ---- +.. _class_NavigationServer3D_method_map_get_obstacles: + +.. rst-class:: classref-method + +:ref:`RID[]` **map_get_obstacles** **(** :ref:`RID` map **)** |const| + +Returns all navigation obstacle :ref:`RID`\ s that are currently assigned to the requested navigation ``map``. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_method_map_get_path: .. rst-class:: classref-method @@ -913,6 +1093,18 @@ Returns the map's up direction. ---- +.. _class_NavigationServer3D_method_map_get_use_edge_connections: + +.. rst-class:: classref-method + +:ref:`bool` **map_get_use_edge_connections** **(** :ref:`RID` map **)** |const| + +Returns true if the navigation ``map`` allows navigation regions to use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_method_map_is_active: .. rst-class:: classref-method @@ -985,6 +1177,102 @@ Sets the map up direction. ---- +.. _class_NavigationServer3D_method_map_set_use_edge_connections: + +.. rst-class:: classref-method + +void **map_set_use_edge_connections** **(** :ref:`RID` map, :ref:`bool` enabled **)** + +Set the navigation ``map`` edge connection use. If ``enabled`` the navigation map allows navigation regions to use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_obstacle_create: + +.. rst-class:: classref-method + +:ref:`RID` **obstacle_create** **(** **)** + +Creates a new obstacle. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_obstacle_get_map: + +.. rst-class:: classref-method + +:ref:`RID` **obstacle_get_map** **(** :ref:`RID` obstacle **)** |const| + +Returns the navigation map :ref:`RID` the requested ``obstacle`` is currently assigned to. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_obstacle_set_avoidance_layers: + +.. rst-class:: classref-method + +void **obstacle_set_avoidance_layers** **(** :ref:`RID` obstacle, :ref:`int` layers **)** + +Set the obstacles's ``avoidance_layers`` bitmask. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_obstacle_set_height: + +.. rst-class:: classref-method + +void **obstacle_set_height** **(** :ref:`RID` obstacle, :ref:`float` height **)** + +Sets the ``height`` for the ``obstacle``. In 3D agents will ignore obstacles that are above or below them while using 2D avoidance. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_obstacle_set_map: + +.. rst-class:: classref-method + +void **obstacle_set_map** **(** :ref:`RID` obstacle, :ref:`RID` map **)** + +Assigns the ``obstacle`` to a navigation map. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_obstacle_set_position: + +.. rst-class:: classref-method + +void **obstacle_set_position** **(** :ref:`RID` obstacle, :ref:`Vector3` position **)** + +Updates the ``position`` in world space for the ``obstacle``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NavigationServer3D_method_obstacle_set_vertices: + +.. rst-class:: classref-method + +void **obstacle_set_vertices** **(** :ref:`RID` obstacle, :ref:`PackedVector3Array` vertices **)** + +Sets the outline vertices for the obstacle. If the vertices are winded in clockwise order agents will be pushed in by the obstacle, else they will be pushed out. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_method_query_path: .. rst-class:: classref-method @@ -1117,6 +1405,18 @@ Returns the travel cost of this ``region``. ---- +.. _class_NavigationServer3D_method_region_get_use_edge_connections: + +.. rst-class:: classref-method + +:ref:`bool` **region_get_use_edge_connections** **(** :ref:`RID` region **)** |const| + +Returns true if the navigation ``region`` is set to use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_method_region_owns_point: .. rst-class:: classref-method @@ -1217,6 +1517,18 @@ Sets the ``travel_cost`` for this ``region``. ---- +.. _class_NavigationServer3D_method_region_set_use_edge_connections: + +.. rst-class:: classref-method + +void **region_set_use_edge_connections** **(** :ref:`RID` region, :ref:`bool` enabled **)** + +If ``enabled`` the navigation ``region`` will use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. + +.. rst-class:: classref-item-separator + +---- + .. _class_NavigationServer3D_method_set_active: .. rst-class:: classref-method diff --git a/classes/class_node.rst b/classes/class_node.rst index c024c1912b4..81fa49024b6 100644 --- a/classes/class_node.rst +++ b/classes/class_node.rst @@ -12,7 +12,7 @@ Node **Inherits:** :ref:`Object` -**Inherited By:** :ref:`AnimationPlayer`, :ref:`AnimationTree`, :ref:`AudioStreamPlayer`, :ref:`CanvasItem`, :ref:`CanvasLayer`, :ref:`EditorFileSystem`, :ref:`EditorInterface`, :ref:`EditorPlugin`, :ref:`EditorResourcePreview`, :ref:`HTTPRequest`, :ref:`InstancePlaceholder`, :ref:`MissingNode`, :ref:`MultiplayerSpawner`, :ref:`MultiplayerSynchronizer`, :ref:`NavigationAgent2D`, :ref:`NavigationAgent3D`, :ref:`NavigationObstacle2D`, :ref:`NavigationObstacle3D`, :ref:`Node3D`, :ref:`ResourcePreloader`, :ref:`ShaderGlobalsOverride`, :ref:`SkeletonIK3D`, :ref:`Timer`, :ref:`Viewport`, :ref:`WorldEnvironment` +**Inherited By:** :ref:`AnimationPlayer`, :ref:`AnimationTree`, :ref:`AudioStreamPlayer`, :ref:`CanvasItem`, :ref:`CanvasLayer`, :ref:`EditorFileSystem`, :ref:`EditorPlugin`, :ref:`EditorResourcePreview`, :ref:`HTTPRequest`, :ref:`InstancePlaceholder`, :ref:`MissingNode`, :ref:`MultiplayerSpawner`, :ref:`MultiplayerSynchronizer`, :ref:`NavigationAgent2D`, :ref:`NavigationAgent3D`, :ref:`Node3D`, :ref:`ResourcePreloader`, :ref:`ShaderGlobalsOverride`, :ref:`SkeletonIK3D`, :ref:`Timer`, :ref:`Viewport`, :ref:`WorldEnvironment` Base class for all *scene* objects. @@ -62,23 +62,31 @@ Properties .. table:: :widths: auto - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`String` | :ref:`editor_description` | ``""`` | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`MultiplayerAPI` | :ref:`multiplayer` | | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`StringName` | :ref:`name` | | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`Node` | :ref:`owner` | | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`ProcessMode` | :ref:`process_mode` | ``0`` | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`int` | :ref:`process_priority` | ``0`` | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`String` | :ref:`scene_file_path` | | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ - | :ref:`bool` | :ref:`unique_name_in_owner` | ``false`` | - +---------------------------------------------+-----------------------------------------------------------------------+-----------+ + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`String` | :ref:`editor_description` | ``""`` | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`MultiplayerAPI` | :ref:`multiplayer` | | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`StringName` | :ref:`name` | | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`Node` | :ref:`owner` | | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`ProcessMode` | :ref:`process_mode` | ``0`` | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`process_physics_priority` | ``0`` | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`process_priority` | ``0`` | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`ProcessThreadGroup` | :ref:`process_thread_group` | ``0`` | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`process_thread_group_order` | | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`ProcessThreadMessages` | :ref:`process_thread_messages` | | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`String` | :ref:`scene_file_path` | | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`unique_name_in_owner` | ``false`` | + +---------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------+ .. rst-class:: classref-reftable-group @@ -115,6 +123,10 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`add_to_group` **(** :ref:`StringName` group, :ref:`bool` persistent=false **)** | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`call_deferred_thread_group` **(** :ref:`StringName` method, ... **)** |vararg| | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`call_thread_safe` **(** :ref:`StringName` method, ... **)** |vararg| | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`can_process` **(** **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Tween` | :ref:`create_tween` **(** **)** | @@ -181,6 +193,8 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_multiplayer_authority` **(** **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_node_ready` **(** **)** |const| | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_physics_processing` **(** **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_physics_processing_internal` **(** **)** |const| | @@ -199,6 +213,10 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`move_child` **(** :ref:`Node` child_node, :ref:`int` to_index **)** | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`notify_deferred_thread_group` **(** :ref:`int` what **)** | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`notify_thread_safe` **(** :ref:`int` what **)** | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`print_orphan_nodes` **(** **)** |static| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`print_tree` **(** **)** | @@ -227,6 +245,8 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`rpc_id` **(** :ref:`int` peer_id, :ref:`StringName` method, ... **)** |vararg| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_deferred_thread_group` **(** :ref:`StringName` property, :ref:`Variant` value **)** | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_display_folded` **(** :ref:`bool` fold **)** | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_editable_instance` **(** :ref:`Node` node, :ref:`bool` is_editable **)** | @@ -251,6 +271,8 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_scene_instance_load_placeholder` **(** :ref:`bool` load_placeholder **)** | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_thread_safe` **(** :ref:`StringName` property, :ref:`Variant` value **)** | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`update_configuration_warnings` **(** **)** | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -291,6 +313,18 @@ When this signal is received, the child ``node`` is still in the tree and valid. ---- +.. _class_Node_signal_child_order_changed: + +.. rst-class:: classref-signal + +**child_order_changed** **(** **)** + +Emitted when the list of children is changed. This happens when child nodes are added, moved or removed. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_signal_ready: .. rst-class:: classref-signal @@ -406,6 +440,74 @@ Always process. Continue processing always, ignoring the :ref:`SceneTree`'s paused property. This is the inverse of :ref:`PROCESS_MODE_ALWAYS`. +.. rst-class:: classref-item-separator + +---- + +.. _enum_Node_ProcessThreadGroup: + +.. rst-class:: classref-enumeration + +enum **ProcessThreadGroup**: + +.. _class_Node_constant_PROCESS_THREAD_GROUP_INHERIT: + +.. rst-class:: classref-enumeration-constant + +:ref:`ProcessThreadGroup` **PROCESS_THREAD_GROUP_INHERIT** = ``0`` + +If the :ref:`process_thread_group` property is sent to this, the node will belong to any parent (or grandparent) node that has a thread group mode that is not inherit. See :ref:`process_thread_group` for more information. + +.. _class_Node_constant_PROCESS_THREAD_GROUP_MAIN_THREAD: + +.. rst-class:: classref-enumeration-constant + +:ref:`ProcessThreadGroup` **PROCESS_THREAD_GROUP_MAIN_THREAD** = ``1`` + +Process this node (and children nodes set to inherit) on the main thread. See :ref:`process_thread_group` for more information. + +.. _class_Node_constant_PROCESS_THREAD_GROUP_SUB_THREAD: + +.. rst-class:: classref-enumeration-constant + +:ref:`ProcessThreadGroup` **PROCESS_THREAD_GROUP_SUB_THREAD** = ``2`` + +Process this node (and children nodes set to inherit) on a sub-thread. See :ref:`process_thread_group` for more information. + +.. rst-class:: classref-item-separator + +---- + +.. _enum_Node_ProcessThreadMessages: + +.. rst-class:: classref-enumeration + +enum **ProcessThreadMessages**: + +.. _class_Node_constant_FLAG_PROCESS_THREAD_MESSAGES: + +.. rst-class:: classref-enumeration-constant + +:ref:`ProcessThreadMessages` **FLAG_PROCESS_THREAD_MESSAGES** = ``1`` + + + +.. _class_Node_constant_FLAG_PROCESS_THREAD_MESSAGES_PHYSICS: + +.. rst-class:: classref-enumeration-constant + +:ref:`ProcessThreadMessages` **FLAG_PROCESS_THREAD_MESSAGES_PHYSICS** = ``2`` + + + +.. _class_Node_constant_FLAG_PROCESS_THREAD_MESSAGES_ALL: + +.. rst-class:: classref-enumeration-constant + +:ref:`ProcessThreadMessages` **FLAG_PROCESS_THREAD_MESSAGES_ALL** = ``3`` + + + .. rst-class:: classref-item-separator ---- @@ -519,7 +621,7 @@ This notification is emitted *after* the related :ref:`tree_exiting` instead. .. _class_Node_constant_NOTIFICATION_READY: @@ -617,6 +719,14 @@ Use :ref:`Viewport.gui_is_drag_successful` **process_physics_priority** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_physics_process_priority** **(** :ref:`int` value **)** +- :ref:`int` **get_physics_process_priority** **(** **)** + +Similar to :ref:`process_priority` but for :ref:`NOTIFICATION_PHYSICS_PROCESS`, :ref:`_physics_process` or the internal version. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_property_process_priority: .. rst-class:: classref-property @@ -979,6 +1106,63 @@ The node's priority in the execution order of the enabled processing callbacks ( ---- +.. _class_Node_property_process_thread_group: + +.. rst-class:: classref-property + +:ref:`ProcessThreadGroup` **process_thread_group** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_process_thread_group** **(** :ref:`ProcessThreadGroup` value **)** +- :ref:`ProcessThreadGroup` **get_process_thread_group** **(** **)** + +Set the process thread group for this node (basically, whether it receives :ref:`NOTIFICATION_PROCESS`, :ref:`NOTIFICATION_PHYSICS_PROCESS`, :ref:`_process` or :ref:`_physics_process` (and the internal versions) on the main thread or in a sub-thread. + +By default, the thread group is :ref:`PROCESS_THREAD_GROUP_INHERIT`, which means that this node belongs to the same thread group as the parent node. The thread groups means that nodes in a specific thread group will process together, separate to other thread groups (depending on :ref:`process_thread_group_order`). If the value is set is :ref:`PROCESS_THREAD_GROUP_SUB_THREAD`, this thread group will occur on a sub thread (not the main thread), otherwise if set to :ref:`PROCESS_THREAD_GROUP_MAIN_THREAD` it will process on the main thread. If there is not a parent or grandparent node set to something other than inherit, the node will belong to the *default thread group*. This default group will process on the main thread and its group order is 0. + +During processing in a sub-thread, accessing most functions in nodes outside the thread group is forbidden (and it will result in an error in debug mode). Use :ref:`Object.call_deferred`, :ref:`call_thread_safe`, :ref:`call_deferred_thread_group` and the likes in order to communicate from the thread groups to the main thread (or to other thread groups). + +To better understand process thread groups, the idea is that any node set to any other value than :ref:`PROCESS_THREAD_GROUP_INHERIT` will include any children (and grandchildren) nodes set to inherit into its process thread group. this means that the processing of all the nodes in the group will happen together, at the same time as the node including them. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Node_property_process_thread_group_order: + +.. rst-class:: classref-property + +:ref:`int` **process_thread_group_order** + +.. rst-class:: classref-property-setget + +- void **set_process_thread_group_order** **(** :ref:`int` value **)** +- :ref:`int` **get_process_thread_group_order** **(** **)** + +Change the process thread group order. Groups with a lesser order will process before groups with a greater order. This is useful when a large amount of nodes process in sub thread and, afterwards, another group wants to collect their result in the main thread, as an example. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Node_property_process_thread_messages: + +.. rst-class:: classref-property + +:ref:`ProcessThreadMessages` **process_thread_messages** + +.. rst-class:: classref-property-setget + +- void **set_process_thread_messages** **(** :ref:`ProcessThreadMessages` value **)** +- :ref:`ProcessThreadMessages` **get_process_thread_messages** **(** **)** + +Set whether the current thread group will process messages (calls to :ref:`call_deferred_thread_group` on threads, and whether it wants to receive them during regular process or physics process callbacks. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_property_scene_file_path: .. rst-class:: classref-property @@ -1060,6 +1244,19 @@ Returning an empty array produces no warnings. Call :ref:`update_configuration_warnings` when the warnings need to be updated for this node. +:: + + @export var energy = 0: + set(value): + energy = value + update_configuration_warnings() + + func _get_configuration_warnings(): + if energy < 0: + return ["Energy must be 0 or greater."] + else: + return [] + .. rst-class:: classref-item-separator ---- @@ -1212,7 +1409,7 @@ Adds a child ``node``. Nodes can have any number of children, but every child mu If ``force_readable_name`` is ``true``, improves the readability of the added ``node``. If not named, the ``node`` is renamed to its type, and if it shares :ref:`name` with a sibling, a number is suffixed more appropriately. This operation is very slow. As such, it is recommended leaving this to ``false``, which assigns a dummy name featuring ``@`` in both situations. -If ``internal`` is different than :ref:`INTERNAL_MODE_DISABLED`, the child will be added as internal node. Such nodes are ignored by methods like :ref:`get_children`, unless their parameter ``include_internal`` is ``true``.The intended usage is to hide the internal nodes from the user, so the user won't accidentally delete or modify them. Used by some GUI nodes, e.g. :ref:`ColorPicker`. See :ref:`InternalMode` for available modes. +If ``internal`` is different than :ref:`INTERNAL_MODE_DISABLED`, the child will be added as internal node. Such nodes are ignored by methods like :ref:`get_children`, unless their parameter ``include_internal`` is ``true``. The intended usage is to hide the internal nodes from the user, so the user won't accidentally delete or modify them. Used by some GUI nodes, e.g. :ref:`ColorPicker`. See :ref:`InternalMode` for available modes. \ **Note:** If the child node already has a parent, the function will fail. Use :ref:`remove_child` first to remove the node from its current parent. For example: @@ -1279,6 +1476,30 @@ The ``persistent`` option is used when packing node to :ref:`PackedScene` **call_deferred_thread_group** **(** :ref:`StringName` method, ... **)** |vararg| + +This function is similar to :ref:`Object.call_deferred` except that the call will take place when the node thread group is processed. If the node thread group processes in sub-threads, then the call will be done on that thread, right before :ref:`NOTIFICATION_PROCESS` or :ref:`NOTIFICATION_PHYSICS_PROCESS`, the :ref:`_process` or :ref:`_physics_process` or their internal versions are called. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Node_method_call_thread_safe: + +.. rst-class:: classref-method + +:ref:`Variant` **call_thread_safe** **(** :ref:`StringName` method, ... **)** |vararg| + +This function ensures that the calling of this function will succeed, no matter whether it's being done from a thread or not. If called from a thread that is not allowed to call the function, the call will become deferred. Otherwise, the call will go through directly. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_method_can_process: .. rst-class:: classref-method @@ -1312,6 +1533,8 @@ Creates a new :ref:`Tween` and binds it to this node. This is equiv +The Tween will start automatically on the next process frame or physics frame (depending on :ref:`TweenProcessMode`). + .. rst-class:: classref-item-separator ---- @@ -1338,7 +1561,7 @@ You can fine-tune the behavior using the ``flags`` (see :ref:`DuplicateFlags` **find_child** **(** :ref:`String` pattern, :ref:`bool` recursive=true, :ref:`bool` owned=true **)** |const| -Finds the first descendant of this node whose name matches ``pattern`` as in :ref:`String.match`. +Finds the first descendant of this node whose name matches ``pattern`` as in :ref:`String.match`. Internal children are also searched over (see ``internal`` parameter in :ref:`add_child`). \ ``pattern`` does not match against the full path, just against individual node names. It is case-sensitive, with ``"*"`` matching zero or more characters and ``"?"`` matching any single character except ``"."``). @@ -1362,7 +1585,7 @@ Returns ``null`` if no matching **Node** is found. :ref:`Node[]` **find_children** **(** :ref:`String` pattern, :ref:`String` type="", :ref:`bool` recursive=true, :ref:`bool` owned=true **)** |const| -Finds descendants of this node whose name matches ``pattern`` as in :ref:`String.match`, and/or type matches ``type`` as in :ref:`Object.is_class`. +Finds descendants of this node whose name matches ``pattern`` as in :ref:`String.match`, and/or type matches ``type`` as in :ref:`Object.is_class`. Internal children are also searched over (see ``internal`` parameter in :ref:`add_child`). \ ``pattern`` does not match against the full path, just against individual node names. It is case-sensitive, with ``"*"`` matching zero or more characters and ``"?"`` matching any single character except ``"."``). @@ -1822,6 +2045,20 @@ Returns ``true`` if the local system is the multiplayer authority of this node. ---- +.. _class_Node_method_is_node_ready: + +.. rst-class:: classref-method + +:ref:`bool` **is_node_ready** **(** **)** |const| + +Returns ``true`` if the node is ready, i.e. it's inside scene tree and all its children are initialized. + +\ :ref:`request_ready` resets it back to ``false``. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_method_is_physics_processing: .. rst-class:: classref-method @@ -1932,6 +2169,30 @@ Moves a child node to a different index (order) among the other children. Since ---- +.. _class_Node_method_notify_deferred_thread_group: + +.. rst-class:: classref-method + +void **notify_deferred_thread_group** **(** :ref:`int` what **)** + +Similar to :ref:`call_deferred_thread_group`, but for notifications. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Node_method_notify_thread_safe: + +.. rst-class:: classref-method + +void **notify_thread_safe** **(** :ref:`int` what **)** + +Similar to :ref:`call_thread_safe`, but for notifications. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_method_print_orphan_nodes: .. rst-class:: classref-method @@ -2147,6 +2408,18 @@ Sends a :ref:`rpc` to a specific peer identified by ``pee ---- +.. _class_Node_method_set_deferred_thread_group: + +.. rst-class:: classref-method + +void **set_deferred_thread_group** **(** :ref:`StringName` property, :ref:`Variant` value **)** + +Similar to :ref:`call_deferred_thread_group`, but for setting properties. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_method_set_display_folded: .. rst-class:: classref-method @@ -2295,6 +2568,18 @@ Sets whether this is an instance load placeholder. See :ref:`InstancePlaceholder ---- +.. _class_Node_method_set_thread_safe: + +.. rst-class:: classref-method + +void **set_thread_safe** **(** :ref:`StringName` property, :ref:`Variant` value **)** + +Similar to :ref:`call_thread_safe`, but for setting properties. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_method_update_configuration_warnings: .. rst-class:: classref-method diff --git a/classes/class_node2d.rst b/classes/class_node2d.rst index a1de51af535..49d4d3b269a 100644 --- a/classes/class_node2d.rst +++ b/classes/class_node2d.rst @@ -12,7 +12,7 @@ Node2D **Inherits:** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -**Inherited By:** :ref:`AnimatedSprite2D`, :ref:`AudioListener2D`, :ref:`AudioStreamPlayer2D`, :ref:`BackBufferCopy`, :ref:`Bone2D`, :ref:`Camera2D`, :ref:`CanvasGroup`, :ref:`CanvasModulate`, :ref:`CollisionObject2D`, :ref:`CollisionPolygon2D`, :ref:`CollisionShape2D`, :ref:`CPUParticles2D`, :ref:`GPUParticles2D`, :ref:`Joint2D`, :ref:`Light2D`, :ref:`LightOccluder2D`, :ref:`Line2D`, :ref:`Marker2D`, :ref:`MeshInstance2D`, :ref:`MultiMeshInstance2D`, :ref:`NavigationLink2D`, :ref:`NavigationRegion2D`, :ref:`ParallaxLayer`, :ref:`Path2D`, :ref:`PathFollow2D`, :ref:`Polygon2D`, :ref:`RayCast2D`, :ref:`RemoteTransform2D`, :ref:`ShapeCast2D`, :ref:`Skeleton2D`, :ref:`Sprite2D`, :ref:`TileMap`, :ref:`TouchScreenButton`, :ref:`VisibleOnScreenNotifier2D` +**Inherited By:** :ref:`AnimatedSprite2D`, :ref:`AudioListener2D`, :ref:`AudioStreamPlayer2D`, :ref:`BackBufferCopy`, :ref:`Bone2D`, :ref:`Camera2D`, :ref:`CanvasGroup`, :ref:`CanvasModulate`, :ref:`CollisionObject2D`, :ref:`CollisionPolygon2D`, :ref:`CollisionShape2D`, :ref:`CPUParticles2D`, :ref:`GPUParticles2D`, :ref:`Joint2D`, :ref:`Light2D`, :ref:`LightOccluder2D`, :ref:`Line2D`, :ref:`Marker2D`, :ref:`MeshInstance2D`, :ref:`MultiMeshInstance2D`, :ref:`NavigationLink2D`, :ref:`NavigationObstacle2D`, :ref:`NavigationRegion2D`, :ref:`ParallaxLayer`, :ref:`Path2D`, :ref:`PathFollow2D`, :ref:`Polygon2D`, :ref:`RayCast2D`, :ref:`RemoteTransform2D`, :ref:`ShapeCast2D`, :ref:`Skeleton2D`, :ref:`Sprite2D`, :ref:`TileMap`, :ref:`TouchScreenButton`, :ref:`VisibleOnScreenNotifier2D` A 2D game object, inherited by all 2D-related nodes. Has a position, rotation, scale, and Z index. diff --git a/classes/class_node3d.rst b/classes/class_node3d.rst index cc0b8426d85..7508bd0cf6e 100644 --- a/classes/class_node3d.rst +++ b/classes/class_node3d.rst @@ -12,7 +12,7 @@ Node3D **Inherits:** :ref:`Node` **<** :ref:`Object` -**Inherited By:** :ref:`AudioListener3D`, :ref:`AudioStreamPlayer3D`, :ref:`BoneAttachment3D`, :ref:`Camera3D`, :ref:`CollisionObject3D`, :ref:`CollisionPolygon3D`, :ref:`CollisionShape3D`, :ref:`GridMap`, :ref:`ImporterMeshInstance3D`, :ref:`Joint3D`, :ref:`LightmapProbe`, :ref:`Marker3D`, :ref:`NavigationLink3D`, :ref:`NavigationRegion3D`, :ref:`OccluderInstance3D`, :ref:`OpenXRHand`, :ref:`Path3D`, :ref:`PathFollow3D`, :ref:`RayCast3D`, :ref:`RemoteTransform3D`, :ref:`ShapeCast3D`, :ref:`Skeleton3D`, :ref:`SpringArm3D`, :ref:`VehicleWheel3D`, :ref:`VisualInstance3D`, :ref:`XRNode3D`, :ref:`XROrigin3D` +**Inherited By:** :ref:`AudioListener3D`, :ref:`AudioStreamPlayer3D`, :ref:`BoneAttachment3D`, :ref:`Camera3D`, :ref:`CollisionObject3D`, :ref:`CollisionPolygon3D`, :ref:`CollisionShape3D`, :ref:`GridMap`, :ref:`ImporterMeshInstance3D`, :ref:`Joint3D`, :ref:`LightmapProbe`, :ref:`Marker3D`, :ref:`NavigationLink3D`, :ref:`NavigationObstacle3D`, :ref:`NavigationRegion3D`, :ref:`OccluderInstance3D`, :ref:`OpenXRHand`, :ref:`Path3D`, :ref:`PathFollow3D`, :ref:`RayCast3D`, :ref:`RemoteTransform3D`, :ref:`ShapeCast3D`, :ref:`Skeleton3D`, :ref:`SpringArm3D`, :ref:`VehicleWheel3D`, :ref:`VisualInstance3D`, :ref:`XRNode3D`, :ref:`XROrigin3D` Most basic 3D game object, parent of all 3D-related nodes. @@ -27,6 +27,8 @@ Affine operations (rotate, scale, translate) happen in parent's local coordinate \ **Note:** Unless otherwise specified, all methods that have angle parameters must have angles specified as *radians*. To convert degrees to radians, use :ref:`@GlobalScope.deg_to_rad`. +\ **Note:** Be aware that "Spatial" nodes are now called "Node3D" starting with Godot 4. Any Godot 3.x references to "Spatial" nodes refer to "Node3D" in Godot 4. + .. rst-class:: classref-introduction-group Tutorials @@ -198,7 +200,7 @@ enum **RotationEditMode**: :ref:`RotationEditMode` **ROTATION_EDIT_MODE_EULER** = ``0`` - +The rotation is edited using :ref:`Vector3` Euler angles. .. _class_Node3D_constant_ROTATION_EDIT_MODE_QUATERNION: @@ -206,7 +208,7 @@ enum **RotationEditMode**: :ref:`RotationEditMode` **ROTATION_EDIT_MODE_QUATERNION** = ``1`` - +The rotation is edited using a :ref:`Quaternion`. .. _class_Node3D_constant_ROTATION_EDIT_MODE_BASIS: @@ -214,7 +216,7 @@ enum **RotationEditMode**: :ref:`RotationEditMode` **ROTATION_EDIT_MODE_BASIS** = ``2`` - +The rotation is edited using a :ref:`Basis`. In this mode, :ref:`scale` can't be edited separately. .. rst-class:: classref-section-separator @@ -554,7 +556,7 @@ Defines the visibility range parent for this node and its subtree. The visibilit - void **set_visible** **(** :ref:`bool` value **)** - :ref:`bool` **is_visible** **(** **)** -If ``true``, this node is drawn. The node is only visible if all of its antecedents are visible as well (in other words, :ref:`is_visible_in_tree` must return ``true``). +If ``true``, this node is drawn. The node is only visible if all of its ancestors are visible as well (in other words, :ref:`is_visible_in_tree` must return ``true``). .. rst-class:: classref-section-separator @@ -739,7 +741,7 @@ Returns whether the node notifies about its global and local transformation chan :ref:`bool` **is_visible_in_tree** **(** **)** |const| -Returns ``true`` if the node is present in the :ref:`SceneTree`, its :ref:`visible` property is ``true`` and all its antecedents are also visible. If any antecedent is hidden, this node will not be visible in the scene tree. +Returns ``true`` if the node is present in the :ref:`SceneTree`, its :ref:`visible` property is ``true`` and all its ancestors are also visible. If any ancestor is hidden, this node will not be visible in the scene tree. .. rst-class:: classref-item-separator diff --git a/classes/class_nodepath.rst b/classes/class_nodepath.rst index 8238fd1b696..65d9e7fee7b 100644 --- a/classes/class_nodepath.rst +++ b/classes/class_nodepath.rst @@ -297,7 +297,7 @@ For example, ``"Path2D/PathFollow2D/Sprite2D"`` has 3 names. :ref:`StringName` **get_subname** **(** :ref:`int` idx **)** |const| -Gets the resource or property name indicated by ``idx`` (0 to :ref:`get_subname_count`). +Gets the resource or property name indicated by ``idx`` (0 to :ref:`get_subname_count` - 1). .. tabs:: diff --git a/classes/class_noise.rst b/classes/class_noise.rst index b74b56833b1..467ed7075cc 100644 --- a/classes/class_noise.rst +++ b/classes/class_noise.rst @@ -35,21 +35,25 @@ Methods .. table:: :widths: auto - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`get_image` **(** :ref:`int` width, :ref:`int` height, :ref:`bool` invert=false, :ref:`bool` in_3d_space=false, :ref:`bool` normalize=true **)** |const| | - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_noise_1d` **(** :ref:`float` x **)** |const| | - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_noise_2d` **(** :ref:`float` x, :ref:`float` y **)** |const| | - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_noise_2dv` **(** :ref:`Vector2` v **)** |const| | - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_noise_3d` **(** :ref:`float` x, :ref:`float` y, :ref:`float` z **)** |const| | - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_noise_3dv` **(** :ref:`Vector3` v **)** |const| | - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`get_seamless_image` **(** :ref:`int` width, :ref:`int` height, :ref:`bool` invert=false, :ref:`bool` in_3d_space=false, :ref:`float` skirt=0.1, :ref:`bool` normalize=true **)** |const| | - +---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`get_image` **(** :ref:`int` width, :ref:`int` height, :ref:`bool` invert=false, :ref:`bool` in_3d_space=false, :ref:`bool` normalize=true **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image[]` | :ref:`get_image_3d` **(** :ref:`int` width, :ref:`int` height, :ref:`int` depth, :ref:`bool` invert=false, :ref:`bool` normalize=true **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_noise_1d` **(** :ref:`float` x **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_noise_2d` **(** :ref:`float` x, :ref:`float` y **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_noise_2dv` **(** :ref:`Vector2` v **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_noise_3d` **(** :ref:`float` x, :ref:`float` y, :ref:`float` z **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_noise_3dv` **(** :ref:`Vector3` v **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`get_seamless_image` **(** :ref:`int` width, :ref:`int` height, :ref:`bool` invert=false, :ref:`bool` in_3d_space=false, :ref:`float` skirt=0.1, :ref:`bool` normalize=true **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image[]` | :ref:`get_seamless_image_3d` **(** :ref:`int` width, :ref:`int` height, :ref:`int` depth, :ref:`bool` invert=false, :ref:`float` skirt=0.1, :ref:`bool` normalize=true **)** |const| | + +-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -66,9 +70,23 @@ Method Descriptions :ref:`Image` **get_image** **(** :ref:`int` width, :ref:`int` height, :ref:`bool` invert=false, :ref:`bool` in_3d_space=false, :ref:`bool` normalize=true **)** |const| -Returns a 2D :ref:`Image` noise image. +Returns an :ref:`Image` containing 2D noise values. -Note: With ``normalize`` set to ``false`` the default implementation expects the noise generator to return values in the range ``-1.0`` to ``1.0``. +\ **Note:** With ``normalize`` set to ``false``, the default implementation expects the noise generator to return values in the range ``-1.0`` to ``1.0``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Noise_method_get_image_3d: + +.. rst-class:: classref-method + +:ref:`Image[]` **get_image_3d** **(** :ref:`int` width, :ref:`int` height, :ref:`int` depth, :ref:`bool` invert=false, :ref:`bool` normalize=true **)** |const| + +Returns an :ref:`Array` of :ref:`Image`\ s containing 3D noise values for use with :ref:`ImageTexture3D.create`. + +\ **Note:** With ``normalize`` set to ``false``, the default implementation expects the noise generator to return values in the range ``-1.0`` to ``1.0``. .. rst-class:: classref-item-separator @@ -140,9 +158,23 @@ Returns the 3D noise value at the given position. :ref:`Image` **get_seamless_image** **(** :ref:`int` width, :ref:`int` height, :ref:`bool` invert=false, :ref:`bool` in_3d_space=false, :ref:`float` skirt=0.1, :ref:`bool` normalize=true **)** |const| -Returns a seamless 2D :ref:`Image` noise image. +Returns an :ref:`Image` containing seamless 2D noise values. + +\ **Note:** With ``normalize`` set to ``false``, the default implementation expects the noise generator to return values in the range ``-1.0`` to ``1.0``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Noise_method_get_seamless_image_3d: + +.. rst-class:: classref-method + +:ref:`Image[]` **get_seamless_image_3d** **(** :ref:`int` width, :ref:`int` height, :ref:`int` depth, :ref:`bool` invert=false, :ref:`float` skirt=0.1, :ref:`bool` normalize=true **)** |const| + +Returns an :ref:`Array` of :ref:`Image`\ s containing seamless 3D noise values for use with :ref:`ImageTexture3D.create`. -Note: With ``normalize`` set to ``false`` the default implementation expects the noise generator to return values in the range ``-1.0`` to ``1.0``. +\ **Note:** With ``normalize`` set to ``false``, the default implementation expects the noise generator to return values in the range ``-1.0`` to ``1.0``. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_noisetexture3d.rst b/classes/class_noisetexture3d.rst new file mode 100644 index 00000000000..568a03919f1 --- /dev/null +++ b/classes/class_noisetexture3d.rst @@ -0,0 +1,228 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/modules/noise/doc_classes/NoiseTexture3D.xml. + +.. _class_NoiseTexture3D: + +NoiseTexture3D +============== + +**Inherits:** :ref:`Texture3D` **<** :ref:`Texture` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` + +A texture filled with noise generated by a :ref:`Noise` object. + +.. rst-class:: classref-introduction-group + +Description +----------- + +Uses :ref:`FastNoiseLite` or other libraries to fill the texture data of your desired size. + +The class uses :ref:`Thread`\ s to generate the texture data internally, so :ref:`Texture3D.get_data` may return ``null`` if the generation process has not completed yet. In that case, you need to wait for the texture to be generated before accessing the image: + +:: + + var texture = NoiseTexture3D.new() + texture.noise = FastNoiseLite.new() + await texture.changed + var data = texture.get_data() + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`Gradient` | :ref:`color_ramp` | | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`depth` | ``64`` | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`height` | ``64`` | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`invert` | ``false`` | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`Noise` | :ref:`noise` | | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`normalize` | ``true`` | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`seamless` | ``false`` | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`float` | :ref:`seamless_blend_skirt` | ``0.1`` | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + | :ref:`int` | :ref:`width` | ``64`` | + +---------------------------------+---------------------------------------------------------------------------------+-----------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_NoiseTexture3D_property_color_ramp: + +.. rst-class:: classref-property + +:ref:`Gradient` **color_ramp** + +.. rst-class:: classref-property-setget + +- void **set_color_ramp** **(** :ref:`Gradient` value **)** +- :ref:`Gradient` **get_color_ramp** **(** **)** + +A :ref:`Gradient` which is used to map the luminance of each pixel to a color value. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_depth: + +.. rst-class:: classref-property + +:ref:`int` **depth** = ``64`` + +.. rst-class:: classref-property-setget + +- void **set_depth** **(** :ref:`int` value **)** +- :ref:`int` **get_depth** **(** **)** + +Depth of the generated texture. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_height: + +.. rst-class:: classref-property + +:ref:`int` **height** = ``64`` + +.. rst-class:: classref-property-setget + +- void **set_height** **(** :ref:`int` value **)** +- :ref:`int` **get_height** **(** **)** + +Height of the generated texture. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_invert: + +.. rst-class:: classref-property + +:ref:`bool` **invert** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_invert** **(** :ref:`bool` value **)** +- :ref:`bool` **get_invert** **(** **)** + +If ``true``, inverts the noise texture. White becomes black, black becomes white. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_noise: + +.. rst-class:: classref-property + +:ref:`Noise` **noise** + +.. rst-class:: classref-property-setget + +- void **set_noise** **(** :ref:`Noise` value **)** +- :ref:`Noise` **get_noise** **(** **)** + +The instance of the :ref:`Noise` object. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_normalize: + +.. rst-class:: classref-property + +:ref:`bool` **normalize** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_normalize** **(** :ref:`bool` value **)** +- :ref:`bool` **is_normalized** **(** **)** + +If ``true``, the noise image coming from the noise generator is normalized to the range ``0.0`` to ``1.0``. + +Turning normalization off can affect the contrast and allows you to generate non repeating tileable noise textures. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_seamless: + +.. rst-class:: classref-property + +:ref:`bool` **seamless** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_seamless** **(** :ref:`bool` value **)** +- :ref:`bool` **get_seamless** **(** **)** + +If ``true``, a seamless texture is requested from the :ref:`Noise` resource. + +\ **Note:** Seamless noise textures may take longer to generate and/or can have a lower contrast compared to non-seamless noise depending on the used :ref:`Noise` resource. This is because some implementations use higher dimensions for generating seamless noise. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_seamless_blend_skirt: + +.. rst-class:: classref-property + +:ref:`float` **seamless_blend_skirt** = ``0.1`` + +.. rst-class:: classref-property-setget + +- void **set_seamless_blend_skirt** **(** :ref:`float` value **)** +- :ref:`float` **get_seamless_blend_skirt** **(** **)** + +Used for the default/fallback implementation of the seamless texture generation. It determines the distance over which the seams are blended. High values may result in less details and contrast. See :ref:`Noise` for further details. + +.. rst-class:: classref-item-separator + +---- + +.. _class_NoiseTexture3D_property_width: + +.. rst-class:: classref-property + +:ref:`int` **width** = ``64`` + +.. rst-class:: classref-property-setget + +- void **set_width** **(** :ref:`int` value **)** +- :ref:`int` **get_width** **(** **)** + +Width of the generated texture. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_object.rst b/classes/class_object.rst index 54ff310e4ff..197aa7cebdc 100644 --- a/classes/class_object.rst +++ b/classes/class_object.rst @@ -10,7 +10,7 @@ Object ====== -**Inherited By:** :ref:`AudioServer`, :ref:`CameraServer`, :ref:`ClassDB`, :ref:`DisplayServer`, :ref:`EditorFileSystemDirectory`, :ref:`EditorPaths`, :ref:`EditorSelection`, :ref:`EditorUndoRedoManager`, :ref:`EditorVCSInterface`, :ref:`Engine`, :ref:`EngineDebugger`, :ref:`GDExtensionManager`, :ref:`Geometry2D`, :ref:`Geometry3D`, :ref:`GodotSharp`, :ref:`Input`, :ref:`InputMap`, :ref:`IP`, :ref:`JavaClassWrapper`, :ref:`JavaScriptBridge`, :ref:`JNISingleton`, :ref:`JSONRPC`, :ref:`MainLoop`, :ref:`Marshalls`, :ref:`MovieWriter`, :ref:`NavigationMeshGenerator`, :ref:`NavigationServer2D`, :ref:`NavigationServer3D`, :ref:`Node`, :ref:`OS`, :ref:`Performance`, :ref:`PhysicsDirectBodyState2D`, :ref:`PhysicsDirectBodyState3D`, :ref:`PhysicsDirectSpaceState2D`, :ref:`PhysicsDirectSpaceState3D`, :ref:`PhysicsServer2D`, :ref:`PhysicsServer2DManager`, :ref:`PhysicsServer3D`, :ref:`PhysicsServer3DManager`, :ref:`PhysicsServer3DRenderingServerHandler`, :ref:`ProjectSettings`, :ref:`RefCounted`, :ref:`RenderingDevice`, :ref:`RenderingServer`, :ref:`ResourceLoader`, :ref:`ResourceSaver`, :ref:`ResourceUID`, :ref:`ScriptLanguage`, :ref:`TextServerManager`, :ref:`ThemeDB`, :ref:`TileData`, :ref:`Time`, :ref:`TranslationServer`, :ref:`TreeItem`, :ref:`UndoRedo`, :ref:`WorkerThreadPool`, :ref:`XRServer` +**Inherited By:** :ref:`AudioServer`, :ref:`CameraServer`, :ref:`ClassDB`, :ref:`DisplayServer`, :ref:`EditorFileSystemDirectory`, :ref:`EditorInterface`, :ref:`EditorPaths`, :ref:`EditorSelection`, :ref:`EditorUndoRedoManager`, :ref:`EditorVCSInterface`, :ref:`Engine`, :ref:`EngineDebugger`, :ref:`GDExtensionManager`, :ref:`Geometry2D`, :ref:`Geometry3D`, :ref:`GodotSharp`, :ref:`Input`, :ref:`InputMap`, :ref:`IP`, :ref:`JavaClassWrapper`, :ref:`JavaScriptBridge`, :ref:`JNISingleton`, :ref:`JSONRPC`, :ref:`MainLoop`, :ref:`Marshalls`, :ref:`MovieWriter`, :ref:`NavigationMeshGenerator`, :ref:`NavigationServer2D`, :ref:`NavigationServer3D`, :ref:`Node`, :ref:`OS`, :ref:`Performance`, :ref:`PhysicsDirectBodyState2D`, :ref:`PhysicsDirectBodyState3D`, :ref:`PhysicsDirectSpaceState2D`, :ref:`PhysicsDirectSpaceState3D`, :ref:`PhysicsServer2D`, :ref:`PhysicsServer2DManager`, :ref:`PhysicsServer3D`, :ref:`PhysicsServer3DManager`, :ref:`PhysicsServer3DRenderingServerHandler`, :ref:`ProjectSettings`, :ref:`RefCounted`, :ref:`RenderingDevice`, :ref:`RenderingServer`, :ref:`ResourceLoader`, :ref:`ResourceSaver`, :ref:`ResourceUID`, :ref:`ScriptLanguage`, :ref:`TextServerManager`, :ref:`ThemeDB`, :ref:`TileData`, :ref:`Time`, :ref:`TranslationServer`, :ref:`TreeItem`, :ref:`UndoRedo`, :ref:`WorkerThreadPool`, :ref:`XRServer` Base class for all other classes in the engine. @@ -68,111 +68,113 @@ Methods .. table:: :widths: auto - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_get` **(** :ref:`StringName` property **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`_get_property_list` **(** **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_init` **(** **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_notification` **(** :ref:`int` what **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_property_can_revert` **(** :ref:`StringName` property **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_property_get_revert` **(** :ref:`StringName` property **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_set` **(** :ref:`StringName` property, :ref:`Variant` value **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`_to_string` **(** **)** |virtual| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_user_signal` **(** :ref:`String` signal, :ref:`Array` arguments=[] **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`call` **(** :ref:`StringName` method, ... **)** |vararg| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`call_deferred` **(** :ref:`StringName` method, ... **)** |vararg| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`callv` **(** :ref:`StringName` method, :ref:`Array` arg_array **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`can_translate_messages` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`connect` **(** :ref:`StringName` signal, :ref:`Callable` callable, :ref:`int` flags=0 **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`disconnect` **(** :ref:`StringName` signal, :ref:`Callable` callable **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`emit_signal` **(** :ref:`StringName` signal, ... **)** |vararg| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`free` **(** **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`get` **(** :ref:`StringName` property **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_class` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`get_incoming_connections` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`get_indexed` **(** :ref:`NodePath` property_path **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_instance_id` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`get_meta` **(** :ref:`StringName` name, :ref:`Variant` default=null **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`get_meta_list` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`get_method_list` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`get_property_list` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`get_script` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`get_signal_connection_list` **(** :ref:`StringName` signal **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`get_signal_list` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_meta` **(** :ref:`StringName` name **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_method` **(** :ref:`StringName` method **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_signal` **(** :ref:`StringName` signal **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_user_signal` **(** :ref:`StringName` signal **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_blocking_signals` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_class` **(** :ref:`String` class **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_connected` **(** :ref:`StringName` signal, :ref:`Callable` callable **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_queued_for_deletion` **(** **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`notification` **(** :ref:`int` what, :ref:`bool` reversed=false **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`notify_property_list_changed` **(** **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`property_can_revert` **(** :ref:`StringName` property **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`property_get_revert` **(** :ref:`StringName` property **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_meta` **(** :ref:`StringName` name **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set` **(** :ref:`StringName` property, :ref:`Variant` value **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_block_signals` **(** :ref:`bool` enable **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_deferred` **(** :ref:`StringName` property, :ref:`Variant` value **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_indexed` **(** :ref:`NodePath` property_path, :ref:`Variant` value **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_message_translation` **(** :ref:`bool` enable **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_meta` **(** :ref:`StringName` name, :ref:`Variant` value **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_script` **(** :ref:`Variant` script **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`to_string` **(** **)** | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`tr` **(** :ref:`StringName` message, :ref:`StringName` context="" **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`tr_n` **(** :ref:`StringName` message, :ref:`StringName` plural_message, :ref:`int` n, :ref:`StringName` context="" **)** |const| | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_get` **(** :ref:`StringName` property **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`_get_property_list` **(** **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_init` **(** **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_notification` **(** :ref:`int` what **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_property_can_revert` **(** :ref:`StringName` property **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_property_get_revert` **(** :ref:`StringName` property **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_set` **(** :ref:`StringName` property, :ref:`Variant` value **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`_to_string` **(** **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_user_signal` **(** :ref:`String` signal, :ref:`Array` arguments=[] **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`call` **(** :ref:`StringName` method, ... **)** |vararg| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`call_deferred` **(** :ref:`StringName` method, ... **)** |vararg| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`callv` **(** :ref:`StringName` method, :ref:`Array` arg_array **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`can_translate_messages` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`cancel_free` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`connect` **(** :ref:`StringName` signal, :ref:`Callable` callable, :ref:`int` flags=0 **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`disconnect` **(** :ref:`StringName` signal, :ref:`Callable` callable **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`emit_signal` **(** :ref:`StringName` signal, ... **)** |vararg| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`free` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get` **(** :ref:`StringName` property **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_class` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`get_incoming_connections` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get_indexed` **(** :ref:`NodePath` property_path **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_instance_id` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get_meta` **(** :ref:`StringName` name, :ref:`Variant` default=null **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`StringName[]` | :ref:`get_meta_list` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`get_method_list` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`get_property_list` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get_script` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`get_signal_connection_list` **(** :ref:`StringName` signal **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`get_signal_list` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_meta` **(** :ref:`StringName` name **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_method` **(** :ref:`StringName` method **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_signal` **(** :ref:`StringName` signal **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_user_signal` **(** :ref:`StringName` signal **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_blocking_signals` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_class` **(** :ref:`String` class **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_connected` **(** :ref:`StringName` signal, :ref:`Callable` callable **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_queued_for_deletion` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`notification` **(** :ref:`int` what, :ref:`bool` reversed=false **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`notify_property_list_changed` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`property_can_revert` **(** :ref:`StringName` property **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`property_get_revert` **(** :ref:`StringName` property **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_meta` **(** :ref:`StringName` name **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set` **(** :ref:`StringName` property, :ref:`Variant` value **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_block_signals` **(** :ref:`bool` enable **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_deferred` **(** :ref:`StringName` property, :ref:`Variant` value **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_indexed` **(** :ref:`NodePath` property_path, :ref:`Variant` value **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_message_translation` **(** :ref:`bool` enable **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_meta` **(** :ref:`StringName` name, :ref:`Variant` value **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_script` **(** :ref:`Variant` script **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`to_string` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`tr` **(** :ref:`StringName` message, :ref:`StringName` context="" **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`tr_n` **(** :ref:`StringName` message, :ref:`StringName` plural_message, :ref:`int` n, :ref:`StringName` context="" **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -731,6 +733,18 @@ Returns ``true`` if the object is allowed to translate messages with :ref:`tr`, this object will reject being freed and will remain allocated. This is mostly an internal function used for error handling to avoid the user from freeing objects when they are not intended to. + +.. rst-class:: classref-item-separator + +---- + .. _class_Object_method_connect: .. rst-class:: classref-method @@ -1078,7 +1092,7 @@ Returns the object's metadata value for the given entry ``name``. If the entry d .. rst-class:: classref-method -:ref:`PackedStringArray` **get_meta_list** **(** **)** |const| +:ref:`StringName[]` **get_meta_list** **(** **)** |const| Returns the object's metadata entry names as a :ref:`PackedStringArray`. @@ -1200,7 +1214,7 @@ Returns ``true`` if a metadata entry is found with the given ``name``. See also :ref:`bool` **has_method** **(** :ref:`StringName` method **)** |const| -Returns ``true`` if the the given ``method`` name exists in the object. +Returns ``true`` if the given ``method`` name exists in the object. \ **Note:** In C#, ``method`` must be in snake_case when referring to built-in Godot methods. Prefer using the names exposed in the ``MethodName`` class to avoid allocating a new :ref:`StringName` on each call. diff --git a/classes/class_openxraction.rst b/classes/class_openxraction.rst index 88caa6fa895..54ad62752c4 100644 --- a/classes/class_openxraction.rst +++ b/classes/class_openxraction.rst @@ -80,7 +80,7 @@ This action provides a float value between ``0.0`` and ``1.0`` for any analog in :ref:`ActionType` **OPENXR_ACTION_VECTOR2** = ``2`` -This action provides a vector2 value and can be bound to embedded trackpads and joysticks +This action provides a :ref:`Vector2` value and can be bound to embedded trackpads and joysticks. .. _class_OpenXRAction_constant_OPENXR_ACTION_POSE: diff --git a/classes/class_openxrinterface.rst b/classes/class_openxrinterface.rst index d8baf219065..b8178cf599d 100644 --- a/classes/class_openxrinterface.rst +++ b/classes/class_openxrinterface.rst @@ -38,9 +38,11 @@ Properties .. table:: :widths: auto - +---------------------------+----------------------------------------------------------------------------------+---------+ - | :ref:`float` | :ref:`display_refresh_rate` | ``0.0`` | - +---------------------------+----------------------------------------------------------------------------------+---------+ + +---------------------------+----------------------------------------------------------------------------------------------------+---------+ + | :ref:`float` | :ref:`display_refresh_rate` | ``0.0`` | + +---------------------------+----------------------------------------------------------------------------------------------------+---------+ + | :ref:`float` | :ref:`render_target_size_multiplier` | ``1.0`` | + +---------------------------+----------------------------------------------------------------------------------------------------+---------+ .. rst-class:: classref-reftable-group @@ -147,6 +149,23 @@ Property Descriptions The display refresh rate for the current HMD. Only functional if this feature is supported by the OpenXR runtime and after the interface has been initialized. +.. rst-class:: classref-item-separator + +---- + +.. _class_OpenXRInterface_property_render_target_size_multiplier: + +.. rst-class:: classref-property + +:ref:`float` **render_target_size_multiplier** = ``1.0`` + +.. rst-class:: classref-property-setget + +- void **set_render_target_size_multiplier** **(** :ref:`float` value **)** +- :ref:`float` **get_render_target_size_multiplier** **(** **)** + +The render size multiplier for the current HMD. Must be set before the interface has been initialized. + .. rst-class:: classref-section-separator ---- diff --git a/classes/class_optionbutton.rst b/classes/class_optionbutton.rst index 98804436afa..d2c5516ccfc 100644 --- a/classes/class_optionbutton.rst +++ b/classes/class_optionbutton.rst @@ -38,6 +38,8 @@ Properties +-------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------+ | :ref:`HorizontalAlignment` | alignment | ``0`` (overrides :ref:`Button`) | +-------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`allow_reselect` | ``false`` | + +-------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`fit_to_longest_item` | ``true`` | +-------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------+ | :ref:`int` | :ref:`item_count` | ``0`` | @@ -194,6 +196,8 @@ Emitted when the user navigates to an item using the :ref:`ProjectSettings.input Emitted when the current item has been changed by the user. The index of the item selected is passed as argument. +\ :ref:`allow_reselect` must be enabled to reselect an item. + .. rst-class:: classref-section-separator ---- @@ -203,6 +207,23 @@ Emitted when the current item has been changed by the user. The index of the ite Property Descriptions --------------------- +.. _class_OptionButton_property_allow_reselect: + +.. rst-class:: classref-property + +:ref:`bool` **allow_reselect** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_allow_reselect** **(** :ref:`bool` value **)** +- :ref:`bool` **get_allow_reselect** **(** **)** + +If ``true``, the currently selected item can be selected again. + +.. rst-class:: classref-item-separator + +---- + .. _class_OptionButton_property_fit_to_longest_item: .. rst-class:: classref-property diff --git a/classes/class_os.rst b/classes/class_os.rst index e22b276da04..1bb8351a210 100644 --- a/classes/class_os.rst +++ b/classes/class_os.rst @@ -19,7 +19,7 @@ Operating System functions. Description ----------- -Operating System functions. **OS** wraps the most common functionality to communicate with the host operating system, such as the clipboard, video driver, delays, environment variables, execution of binaries, command line, etc. +Operating System functions. **OS** wraps the most common functionality to communicate with the host operating system, such as the video driver, delays, environment variables, execution of binaries, command line, etc. \ **Note:** In Godot 4, **OS** functions related to window management were moved to the :ref:`DisplayServer` singleton. @@ -99,6 +99,8 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_main_thread_id` **(** **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_memory_info` **(** **)** |const| | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_model_name` **(** **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_name` **(** **)** |const| | @@ -171,6 +173,8 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`shell_open` **(** :ref:`String` uri **)** | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`shell_show_in_file_manager` **(** :ref:`String` file_or_dir_path, :ref:`bool` open_folder=true **)** | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`unset_environment` **(** :ref:`String` variable **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -456,7 +460,7 @@ Delays execution of the current thread by ``usec`` microseconds. ``usec`` must b :ref:`int` **execute** **(** :ref:`String` path, :ref:`PackedStringArray` arguments, :ref:`Array` output=[], :ref:`bool` read_stderr=false, :ref:`bool` open_console=false **)** -Executes a command. The file specified in ``path`` must exist and be executable. Platform path resolution will be used. The ``arguments`` are used in the given order and separated by a space. If an ``output`` :ref:`Array` is provided, the complete shell output of the process will be appended as a single :ref:`String` element in ``output``. If ``read_stderr`` is ``true``, the output to the standard error stream will be included too. +Executes a command. The file specified in ``path`` must exist and be executable. Platform path resolution will be used. The ``arguments`` are used in the given order, separated by spaces, and wrapped in quotes. If an ``output`` :ref:`Array` is provided, the complete shell output of the process will be appended as a single :ref:`String` element in ``output``. If ``read_stderr`` is ``true``, the output to the standard error stream will be included too. On Windows, if ``open_console`` is ``true`` and the process is a console app, a new terminal window will be opened. This is ignored on other platforms. @@ -783,6 +787,26 @@ Returns the ID of the main thread. See :ref:`get_thread_caller_id` **get_memory_info** **(** **)** |const| + +Returns the :ref:`Dictionary` with the following keys: + +\ ``"physical"`` - total amount of usable physical memory, in bytes or ``-1`` if unknown. This value can be slightly less than the actual physical memory amount, since it does not include memory reserved by kernel and devices. + +\ ``"free"`` - amount of physical memory, that can be immediately allocated without disk access or other costly operation, in bytes or ``-1`` if unknown. The process might be able to allocate more physical memory, but such allocation will require moving inactive pages to disk and can take some time. + +\ ``"available"`` - amount of memory, that can be allocated without extending the swap file(s), in bytes or ``-1`` if unknown. This value include both physical memory and swap. + +\ ``"stack"`` - size of the current thread stack, in bytes or ``-1`` if unknown. + +.. rst-class:: classref-item-separator + +---- + .. _class_OS_method_get_model_name: .. rst-class:: classref-method @@ -995,7 +1019,7 @@ Returns an array of the system substitute font file paths, which are similar to The following aliases can be used to request default fonts: "sans-serif", "serif", "monospace", "cursive", and "fantasy". -\ **Note:** Depending on OS, it's not guaranteed that any of the returned fonts is suitable for rendering specified text. Fonts should be loaded and checked in the order they are returned, and the first suitable one used. +\ **Note:** Depending on OS, it's not guaranteed that any of the returned fonts will be suitable for rendering specified text. Fonts should be loaded and checked in the order they are returned, and the first suitable one used. \ **Note:** Returned fonts might have different style if the requested style is not available or belong to a different font family. @@ -1105,7 +1129,7 @@ For Android, the SDK version and the incremental build number are returned. If i :ref:`PackedStringArray` **get_video_adapter_driver_info** **(** **)** |const| -Returns the video adapter driver name and version for the user's currently active graphics card. +Returns the video adapter driver name and version for the user's currently active graphics card. See also :ref:`RenderingServer.get_video_adapter_api_version`. The first element holds the driver name, such as ``nvidia``, ``amdgpu``, etc. @@ -1141,6 +1165,8 @@ Returns ``true`` if the feature for the given feature tag is supported in the cu \ **Note:** Tag names are case-sensitive. +\ **Note:** On the web platform, one of the following additional tags is defined to indicate host platform: ``web_android``, ``web_ios``, ``web_linuxbsd``, ``web_macos``, or ``web_windows``. + .. rst-class:: classref-item-separator ---- @@ -1398,12 +1424,32 @@ Requests the OS to open a resource with the most appropriate program. For exampl Use :ref:`ProjectSettings.globalize_path` to convert a ``res://`` or ``user://`` path into a system path for use with this method. +\ **Note:** Use :ref:`String.uri_encode` to encode characters within URLs in a URL-safe, portable way. This is especially required for line breaks. Otherwise, :ref:`shell_open` may not work correctly in a project exported to the Web platform. + \ **Note:** This method is implemented on Android, iOS, Web, Linux, macOS and Windows. .. rst-class:: classref-item-separator ---- +.. _class_OS_method_shell_show_in_file_manager: + +.. rst-class:: classref-method + +:ref:`Error` **shell_show_in_file_manager** **(** :ref:`String` file_or_dir_path, :ref:`bool` open_folder=true **)** + +Requests the OS to open the file manager, then navigate to the given ``file_or_dir_path`` and select the target file or folder. + +If ``file_or_dir_path`` is a valid directory path, and ``open_folder`` is ``true``, the method will open the file manager and enter the target folder without selecting anything. + +Use :ref:`ProjectSettings.globalize_path` to convert a ``res://`` or ``user://`` path into a system path for use with this method. + +\ **Note:** Currently this method is only implemented on Windows. On other platforms, it will fallback to :ref:`shell_open` with a directory path for ``file_or_dir_path``. + +.. rst-class:: classref-item-separator + +---- + .. _class_OS_method_unset_environment: .. rst-class:: classref-method diff --git a/classes/class_packedbytearray.rst b/classes/class_packedbytearray.rst index 003c260869d..f616b62c826 100644 --- a/classes/class_packedbytearray.rst +++ b/classes/class_packedbytearray.rst @@ -64,13 +64,15 @@ Methods +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`decode_half` **(** :ref:`int` byte_offset **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`decode_s8` **(** :ref:`int` byte_offset **)** |const| | + +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`decode_s16` **(** :ref:`int` byte_offset **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`decode_s32` **(** :ref:`int` byte_offset **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`decode_s64` **(** :ref:`int` byte_offset **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`decode_s8` **(** :ref:`int` byte_offset **)** |const| | + | :ref:`int` | :ref:`decode_u8` **(** :ref:`int` byte_offset **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`decode_u16` **(** :ref:`int` byte_offset **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -78,8 +80,6 @@ Methods +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`decode_u64` **(** :ref:`int` byte_offset **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`decode_u8` **(** :ref:`int` byte_offset **)** |const| | - +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Variant` | :ref:`decode_var` **(** :ref:`int` byte_offset, :ref:`bool` allow_objects=false **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`decode_var_size` **(** :ref:`int` byte_offset, :ref:`bool` allow_objects=false **)** |const| | @@ -96,13 +96,15 @@ Methods +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`encode_half` **(** :ref:`int` byte_offset, :ref:`float` value **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`encode_s8` **(** :ref:`int` byte_offset, :ref:`int` value **)** | + +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`encode_s16` **(** :ref:`int` byte_offset, :ref:`int` value **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`encode_s32` **(** :ref:`int` byte_offset, :ref:`int` value **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`encode_s64` **(** :ref:`int` byte_offset, :ref:`int` value **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`encode_s8` **(** :ref:`int` byte_offset, :ref:`int` value **)** | + | void | :ref:`encode_u8` **(** :ref:`int` byte_offset, :ref:`int` value **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`encode_u16` **(** :ref:`int` byte_offset, :ref:`int` value **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -110,8 +112,6 @@ Methods +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`encode_u64` **(** :ref:`int` byte_offset, :ref:`int` value **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`encode_u8` **(** :ref:`int` byte_offset, :ref:`int` value **)** | - +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`encode_var` **(** :ref:`int` byte_offset, :ref:`Variant` value, :ref:`bool` allow_objects=false **)** | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`fill` **(** :ref:`int` value **)** | @@ -120,11 +120,13 @@ Methods +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_string_from_ascii` **(** **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_string_from_utf8` **(** **)** |const| | + +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_string_from_utf16` **(** **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_string_from_utf32` **(** **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_string_from_utf8` **(** **)** |const| | + | :ref:`String` | :ref:`get_string_from_wchar` **(** **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`has` **(** :ref:`int` value **)** |const| | +-----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -337,6 +339,18 @@ Decodes a 16-bit floating point number from the bytes starting at ``byte_offset` ---- +.. _class_PackedByteArray_method_decode_s8: + +.. rst-class:: classref-method + +:ref:`int` **decode_s8** **(** :ref:`int` byte_offset **)** |const| + +Decodes a 8-bit signed integer number from the bytes starting at ``byte_offset``. Fails if the byte count is insufficient. Returns ``0`` if a valid number can't be decoded. + +.. rst-class:: classref-item-separator + +---- + .. _class_PackedByteArray_method_decode_s16: .. rst-class:: classref-method @@ -373,13 +387,13 @@ Decodes a 64-bit signed integer number from the bytes starting at ``byte_offset` ---- -.. _class_PackedByteArray_method_decode_s8: +.. _class_PackedByteArray_method_decode_u8: .. rst-class:: classref-method -:ref:`int` **decode_s8** **(** :ref:`int` byte_offset **)** |const| +:ref:`int` **decode_u8** **(** :ref:`int` byte_offset **)** |const| -Decodes a 8-bit signed integer number from the bytes starting at ``byte_offset``. Fails if the byte count is insufficient. Returns ``0`` if a valid number can't be decoded. +Decodes a 8-bit unsigned integer number from the bytes starting at ``byte_offset``. Fails if the byte count is insufficient. Returns ``0`` if a valid number can't be decoded. .. rst-class:: classref-item-separator @@ -421,18 +435,6 @@ Decodes a 64-bit unsigned integer number from the bytes starting at ``byte_offse ---- -.. _class_PackedByteArray_method_decode_u8: - -.. rst-class:: classref-method - -:ref:`int` **decode_u8** **(** :ref:`int` byte_offset **)** |const| - -Decodes a 8-bit unsigned integer number from the bytes starting at ``byte_offset``. Fails if the byte count is insufficient. Returns ``0`` if a valid number can't be decoded. - -.. rst-class:: classref-item-separator - ----- - .. _class_PackedByteArray_method_decode_var: .. rst-class:: classref-method @@ -475,7 +477,7 @@ Returns a new **PackedByteArray** with the data decompressed. Set ``buffer_size` :ref:`PackedByteArray` **decompress_dynamic** **(** :ref:`int` max_output_size, :ref:`int` compression_mode=0 **)** |const| -Returns a new **PackedByteArray** with the data decompressed. Set the compression mode using one of :ref:`CompressionMode`'s constants. **This method only accepts gzip and deflate compression modes.**\ +Returns a new **PackedByteArray** with the data decompressed. Set the compression mode using one of :ref:`CompressionMode`'s constants. **This method only accepts brotli, gzip, and deflate compression modes.**\ This method is potentially slower than ``decompress``, as it may have to re-allocate its output buffer multiple times while decompressing, whereas ``decompress`` knows it's output buffer size from the beginning. @@ -533,6 +535,18 @@ Encodes a 16-bit floating point number as bytes at the index of ``byte_offset`` ---- +.. _class_PackedByteArray_method_encode_s8: + +.. rst-class:: classref-method + +void **encode_s8** **(** :ref:`int` byte_offset, :ref:`int` value **)** + +Encodes a 8-bit signed integer number (signed byte) at the index of ``byte_offset`` bytes. The array must have at least 1 byte of space, starting at the offset. + +.. rst-class:: classref-item-separator + +---- + .. _class_PackedByteArray_method_encode_s16: .. rst-class:: classref-method @@ -569,13 +583,13 @@ Encodes a 64-bit signed integer number as bytes at the index of ``byte_offset`` ---- -.. _class_PackedByteArray_method_encode_s8: +.. _class_PackedByteArray_method_encode_u8: .. rst-class:: classref-method -void **encode_s8** **(** :ref:`int` byte_offset, :ref:`int` value **)** +void **encode_u8** **(** :ref:`int` byte_offset, :ref:`int` value **)** -Encodes a 8-bit signed integer number (signed byte) at the index of ``byte_offset`` bytes. The array must have at least 1 byte of space, starting at the offset. +Encodes a 8-bit unsigned integer number (byte) at the index of ``byte_offset`` bytes. The array must have at least 1 byte of space, starting at the offset. .. rst-class:: classref-item-separator @@ -617,18 +631,6 @@ Encodes a 64-bit unsigned integer number as bytes at the index of ``byte_offset` ---- -.. _class_PackedByteArray_method_encode_u8: - -.. rst-class:: classref-method - -void **encode_u8** **(** :ref:`int` byte_offset, :ref:`int` value **)** - -Encodes a 8-bit unsigned integer number (byte) at the index of ``byte_offset`` bytes. The array must have at least 1 byte of space, starting at the offset. - -.. rst-class:: classref-item-separator - ----- - .. _class_PackedByteArray_method_encode_var: .. rst-class:: classref-method @@ -677,6 +679,18 @@ Converts ASCII/Latin-1 encoded array to :ref:`String`. Fast altern ---- +.. _class_PackedByteArray_method_get_string_from_utf8: + +.. rst-class:: classref-method + +:ref:`String` **get_string_from_utf8** **(** **)** |const| + +Converts UTF-8 encoded array to :ref:`String`. Slower than :ref:`get_string_from_ascii` but supports UTF-8 encoded data. Use this function if you are unsure about the source of the data. For user input this function should always be preferred. Returns empty string if source array is not valid UTF-8 string. + +.. rst-class:: classref-item-separator + +---- + .. _class_PackedByteArray_method_get_string_from_utf16: .. rst-class:: classref-method @@ -701,13 +715,13 @@ Converts UTF-32 encoded array to :ref:`String`. System endianness ---- -.. _class_PackedByteArray_method_get_string_from_utf8: +.. _class_PackedByteArray_method_get_string_from_wchar: .. rst-class:: classref-method -:ref:`String` **get_string_from_utf8** **(** **)** |const| +:ref:`String` **get_string_from_wchar** **(** **)** |const| -Converts UTF-8 encoded array to :ref:`String`. Slower than :ref:`get_string_from_ascii` but supports UTF-8 encoded data. Use this function if you are unsure about the source of the data. For user input this function should always be preferred. Returns empty string if source array is not valid UTF-8 string. +Converts wide character (``wchar_t``, UTF-16 on Windows, UTF-32 on other platforms) encoded array to :ref:`String`. Returns empty string if source array is not valid wide string. .. rst-class:: classref-item-separator diff --git a/classes/class_packeddatacontainer.rst b/classes/class_packeddatacontainer.rst index c147cf73d38..386b78932ea 100644 --- a/classes/class_packeddatacontainer.rst +++ b/classes/class_packeddatacontainer.rst @@ -12,21 +12,36 @@ PackedDataContainer **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Efficiently packs and serializes :ref:`Array` or :ref:`Dictionary`. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group -.. rst-class:: classref-reftable-group +Description +----------- -Properties ----------- +**PackedDataContainer** can be used to efficiently store data from untyped containers. The data is packed into raw bytes and can be saved to file. Only :ref:`Array` and :ref:`Dictionary` can be stored this way. -.. table:: - :widths: auto +You can retrieve the data by iterating on the container, which will work as if iterating on the packed data itself. If the packed container is a :ref:`Dictionary`, the data can be retrieved by key names (:ref:`String`/:ref:`StringName` only). + +:: + + var data = { "key": "value", "another_key": 123, "lock": Vector2() } + var packed = PackedDataContainer.new() + packed.pack(data) + ResourceSaver.save(packed, "packed_data.res") - +-----------------------------------------------+--------------------------------------------------------------+-----------------------+ - | :ref:`PackedByteArray` | :ref:`__data__` | ``PackedByteArray()`` | - +-----------------------------------------------+--------------------------------------------------------------+-----------------------+ +:: + + var container = load("packed_data.res") + for key in container: + prints(key, container[key]) + + # Prints: + # key value + # lock (0, 0) + # another_key 123 + +Nested containers will be packed recursively. While iterating, they will be returned as :ref:`PackedDataContainerRef`. .. rst-class:: classref-reftable-group @@ -48,25 +63,6 @@ Methods .. rst-class:: classref-descriptions-group -Property Descriptions ---------------------- - -.. _class_PackedDataContainer_property___data__: - -.. rst-class:: classref-property - -:ref:`PackedByteArray` **__data__** = ``PackedByteArray()`` - -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! - -.. rst-class:: classref-section-separator - ----- - -.. rst-class:: classref-descriptions-group - Method Descriptions ------------------- @@ -76,9 +72,9 @@ Method Descriptions :ref:`Error` **pack** **(** :ref:`Variant` value **)** -.. container:: contribute +Packs the given container into a binary representation. The ``value`` must be either :ref:`Array` or :ref:`Dictionary`, any other type will result in invalid data error. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Subsequent calls to this method will overwrite the existing data. .. rst-class:: classref-item-separator @@ -90,9 +86,7 @@ Method Descriptions :ref:`int` **size** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the size of the packed container (see :ref:`Array.size` and :ref:`Dictionary.size`). .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_packeddatacontainerref.rst b/classes/class_packeddatacontainerref.rst index a178d3ff79c..9775322329a 100644 --- a/classes/class_packeddatacontainerref.rst +++ b/classes/class_packeddatacontainerref.rst @@ -12,7 +12,36 @@ PackedDataContainerRef **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Reference-counted version of :ref:`PackedDataContainer`. +Internal class used by :ref:`PackedDataContainer`. + +.. rst-class:: classref-introduction-group + +Description +----------- + +When packing nested containers using :ref:`PackedDataContainer`, they are recursively packed into **PackedDataContainerRef** (only applies to :ref:`Array` and :ref:`Dictionary`). Their data can be retrieved the same way as from :ref:`PackedDataContainer`. + +:: + + var packed = PackedDataContainer.new() + packed.pack([1, 2, 3, ["abc", "def"], 4, 5, 6]) + + for element in packed: + if element is PackedDataContainerRef: + for subelement in element: + print("::", subelement) + else: + print(element) + + # Prints: + # 1 + # 2 + # 3 + # ::abc + # ::def + # 4 + # 5 + # 6 .. rst-class:: classref-reftable-group @@ -41,9 +70,7 @@ Method Descriptions :ref:`int` **size** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the size of the packed container (see :ref:`Array.size` and :ref:`Dictionary.size`). .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_packetpeerudp.rst b/classes/class_packetpeerudp.rst index 0f97d6d05c8..f2035033c1b 100644 --- a/classes/class_packetpeerudp.rst +++ b/classes/class_packetpeerudp.rst @@ -246,7 +246,7 @@ Waits for a packet to arrive on the bound address. See :ref:`bind` value **)** - :ref:`bool` **get_turbulence_enabled** **(** **)** -Enables and disables Turbulence for the particle system. +If ``true``, enables turbulence for the particle system. Turbulence can be used to vary particle movement according to its position (based on a 3D noise pattern). In 3D, :ref:`GPUParticlesAttractorVectorField3D` with :ref:`NoiseTexture3D` can be used as an alternative to turbulence that works in world space and with multiple particle systems reacting in the same way. + +\ **Note:** Enabling turbulence has a high performance cost on the GPU. Only enable turbulence on a few particle systems at once at most, and consider disabling it when targeting mobile/web platforms. .. rst-class:: classref-item-separator @@ -1772,9 +1774,9 @@ Enables and disables Turbulence for the particle system. - void **set_param_max** **(** :ref:`Parameter` param, :ref:`float` value **)** - :ref:`float` **get_param_max** **(** :ref:`Parameter` param **)** |const| -Minimum turbulence influence on each particle. +Maximum turbulence influence on each particle. - The actual amount of turbulence influence on each particle is calculated as a random value between :ref:`turbulence_influence_min` and :ref:`turbulence_influence_max` and multiplied by the amount of turbulence influence from :ref:`turbulence_influence_over_life`. +The actual amount of turbulence influence on each particle is calculated as a random value between :ref:`turbulence_influence_min` and :ref:`turbulence_influence_max` and multiplied by the amount of turbulence influence from :ref:`turbulence_influence_over_life`. .. rst-class:: classref-item-separator @@ -1791,7 +1793,7 @@ Minimum turbulence influence on each particle. - void **set_param_min** **(** :ref:`Parameter` param, :ref:`float` value **)** - :ref:`float` **get_param_min** **(** :ref:`Parameter` param **)** |const| -Maximum turbulence influence on each particle. +Minimum turbulence influence on each particle. The actual amount of turbulence influence on each particle is calculated as a random value between :ref:`turbulence_influence_min` and :ref:`turbulence_influence_max` and multiplied by the amount of turbulence influence from :ref:`turbulence_influence_over_life`. @@ -1827,7 +1829,7 @@ Each particle's amount of turbulence will be influenced along this :ref:`CurveTe - void **set_param_max** **(** :ref:`Parameter` param, :ref:`float` value **)** - :ref:`float` **get_param_max** **(** :ref:`Parameter` param **)** |const| -Maximum displacement of each particles spawn position by the turbulence. +Maximum displacement of each particle's spawn position by the turbulence. The actual amount of displacement will be a factor of the underlying turbulence multiplied by a random value between :ref:`turbulence_initial_displacement_min` and :ref:`turbulence_initial_displacement_max`. @@ -1846,7 +1848,7 @@ The actual amount of displacement will be a factor of the underlying turbulence - void **set_param_min** **(** :ref:`Parameter` param, :ref:`float` value **)** - :ref:`float` **get_param_min** **(** :ref:`Parameter` param **)** |const| -Minimum displacement of each particles spawn position by the turbulence. +Minimum displacement of each particle's spawn position by the turbulence. The actual amount of displacement will be a factor of the underlying turbulence multiplied by a random value between :ref:`turbulence_initial_displacement_min` and :ref:`turbulence_initial_displacement_max`. @@ -1903,7 +1905,7 @@ A value of ``Vector3(0.0, 0.0, 0.0)`` will freeze the turbulence pattern in plac - void **set_turbulence_noise_speed_random** **(** :ref:`float` value **)** - :ref:`float` **get_turbulence_noise_speed_random** **(** **)** -Use to influence the noise speed in a random pattern. This helps to break up visible movement patterns. +Use to influence the noise speed in a random pattern. This helps break up visible movement patterns. .. rst-class:: classref-item-separator @@ -1920,7 +1922,7 @@ Use to influence the noise speed in a random pattern. This helps to break up vis - void **set_turbulence_noise_strength** **(** :ref:`float` value **)** - :ref:`float` **get_turbulence_noise_strength** **(** **)** -The turbulence noise strength. Increasing this will result in a stronger, more contrasting, noise pattern. +The turbulence noise strength. Increasing this will result in a stronger, more contrasting noise pattern. .. rst-class:: classref-section-separator diff --git a/classes/class_physicalbone2d.rst b/classes/class_physicalbone2d.rst index 4e25cc88b3c..2d06ea329c0 100644 --- a/classes/class_physicalbone2d.rst +++ b/classes/class_physicalbone2d.rst @@ -12,18 +12,18 @@ PhysicalBone2D **Inherits:** :ref:`RigidBody2D` **<** :ref:`PhysicsBody2D` **<** :ref:`CollisionObject2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -A 2D node that can be used for physically aware bones in 2D. +A :ref:`RigidBody2D`-derived node used to make :ref:`Bone2D`\ s in a :ref:`Skeleton2D` react to physics. .. rst-class:: classref-introduction-group Description ----------- -The ``PhysicalBone2D`` node is a :ref:`RigidBody2D`-based node that can be used to make :ref:`Bone2D` nodes in a :ref:`Skeleton2D` react to physics. This node is very similar to the :ref:`PhysicalBone3D` node, just for 2D instead of 3D. +The **PhysicalBone2D** node is a :ref:`RigidBody2D`-based node that can be used to make :ref:`Bone2D`\ s in a :ref:`Skeleton2D` react to physics. -\ **Note:** To have the Bone2D nodes visually follow the ``PhysicalBone2D`` node, use a :ref:`SkeletonModification2DPhysicalBones` modification on the :ref:`Skeleton2D` node with the :ref:`Bone2D` nodes. +\ **Note:** To make the :ref:`Bone2D`\ s visually follow the **PhysicalBone2D** node, use a :ref:`SkeletonModification2DPhysicalBones` modification on the :ref:`Skeleton2D` parent. -\ **Note:** The PhysicalBone2D node does not automatically create a :ref:`Joint2D` node to keep ``PhysicalBone2D`` nodes together. You will need to create these manually. For most cases, you want to use a :ref:`PinJoint2D` node. The ``PhysicalBone2D`` node can automatically configure the :ref:`Joint2D` node once it's been created as a child node. +\ **Note:** The **PhysicalBone2D** node does not automatically create a :ref:`Joint2D` node to keep **PhysicalBone2D** nodes together. They must be created manually. For most cases, you want to use a :ref:`PinJoint2D` node. The **PhysicalBone2D** node will automatically configure the :ref:`Joint2D` node once it's been added as a child node. .. rst-class:: classref-reftable-group @@ -79,7 +79,7 @@ Property Descriptions - void **set_auto_configure_joint** **(** :ref:`bool` value **)** - :ref:`bool` **get_auto_configure_joint** **(** **)** -If ``true``, the ``PhysicalBone2D`` node will automatically configure the first :ref:`Joint2D` child node. The automatic configuration is limited to setting up the node properties and positioning the :ref:`Joint2D`. +If ``true``, the **PhysicalBone2D** will automatically configure the first :ref:`Joint2D` child node. The automatic configuration is limited to setting up the node properties and positioning the :ref:`Joint2D`. .. rst-class:: classref-item-separator @@ -96,7 +96,7 @@ If ``true``, the ``PhysicalBone2D`` node will automatically configure the first - void **set_bone2d_index** **(** :ref:`int` value **)** - :ref:`int` **get_bone2d_index** **(** **)** -The index of the :ref:`Bone2D` node that this ``PhysicalBone2D`` node is supposed to be simulating. +The index of the :ref:`Bone2D` that this **PhysicalBone2D** should simulate. .. rst-class:: classref-item-separator @@ -113,7 +113,7 @@ The index of the :ref:`Bone2D` node that this ``PhysicalBone2D`` n - void **set_bone2d_nodepath** **(** :ref:`NodePath` value **)** - :ref:`NodePath` **get_bone2d_nodepath** **(** **)** -The :ref:`NodePath` to the :ref:`Bone2D` node that this ``PhysicalBone2D`` node is supposed to be simulating. +The :ref:`NodePath` to the :ref:`Bone2D` that this **PhysicalBone2D** isshould simulate. .. rst-class:: classref-item-separator @@ -130,7 +130,7 @@ The :ref:`NodePath` to the :ref:`Bone2D` node that - void **set_follow_bone_when_simulating** **(** :ref:`bool` value **)** - :ref:`bool` **get_follow_bone_when_simulating** **(** **)** -If ``true``, the ``PhysicalBone2D`` will keep the transform of the bone it is bound to when simulating physics. +If ``true``, the **PhysicalBone2D** will keep the transform of the bone it is bound to when simulating physics. .. rst-class:: classref-item-separator @@ -147,9 +147,9 @@ If ``true``, the ``PhysicalBone2D`` will keep the transform of the bone it is bo - void **set_simulate_physics** **(** :ref:`bool` value **)** - :ref:`bool` **get_simulate_physics** **(** **)** -If ``true``, the ``PhysicalBone2D`` will start simulating using physics. If ``false``, the ``PhysicalBone2D`` will follow the transform of the :ref:`Bone2D` node. +If ``true``, the **PhysicalBone2D** will start simulating using physics. If ``false``, the **PhysicalBone2D** will follow the transform of the :ref:`Bone2D` node. -\ **Note:** To have the Bone2D nodes visually follow the ``PhysicalBone2D`` node, use a :ref:`SkeletonModification2DPhysicalBones` modification on the :ref:`Skeleton2D` node with the :ref:`Bone2D` nodes. +\ **Note:** To have the :ref:`Bone2D`\ s visually follow the **PhysicalBone2D**, use a :ref:`SkeletonModification2DPhysicalBones` modification on the :ref:`Skeleton2D` node with the :ref:`Bone2D` nodes. .. rst-class:: classref-section-separator @@ -166,7 +166,7 @@ Method Descriptions :ref:`Joint2D` **get_joint** **(** **)** |const| -Returns the first :ref:`Joint2D` child node, if one exists. This is mainly a helper function to make it easier to get the :ref:`Joint2D` that the ``PhysicalBone2D`` is autoconfiguring. +Returns the first :ref:`Joint2D` child node, if one exists. This is mainly a helper function to make it easier to get the :ref:`Joint2D` that the **PhysicalBone2D** is autoconfiguring. .. rst-class:: classref-item-separator @@ -178,7 +178,7 @@ Returns the first :ref:`Joint2D` child node, if one exists. This :ref:`bool` **is_simulating_physics** **(** **)** |const| -Returns a boolean that indicates whether the ``PhysicalBone2D`` node is running and simulating using the Godot 2D physics engine. When ``true``, the PhysicalBone2D node is using physics. +Returns a boolean that indicates whether the **PhysicalBone2D** is running and simulating using the Godot 2D physics engine. When ``true``, the PhysicalBone2D node is using physics. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_physicalbone3d.rst b/classes/class_physicalbone3d.rst index 44d6567590b..0154fd8f156 100644 --- a/classes/class_physicalbone3d.rst +++ b/classes/class_physicalbone3d.rst @@ -12,12 +12,14 @@ PhysicalBone3D **Inherits:** :ref:`PhysicsBody3D` **<** :ref:`CollisionObject3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` +A physics body used to make bones in a :ref:`Skeleton3D` react to physics. + .. rst-class:: classref-introduction-group Description ----------- -**Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +The **PhysicalBone3D** node is a physics body that can be used to make bones in a :ref:`Skeleton3D` react to physics. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsdirectbodystate2d.rst b/classes/class_physicsdirectbodystate2d.rst index 5836d976eaa..61709111e90 100644 --- a/classes/class_physicsdirectbodystate2d.rst +++ b/classes/class_physicsdirectbodystate2d.rst @@ -119,6 +119,8 @@ Methods +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_contact_local_shape` **(** :ref:`int` contact_idx **)** |const| | +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_contact_local_velocity_at_position` **(** :ref:`int` contact_idx **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PhysicsDirectSpaceState2D` | :ref:`get_space_state` **(** **)** | +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2` | :ref:`get_velocity_at_local_position` **(** :ref:`Vector2` local_position **)** |const| | @@ -540,7 +542,7 @@ Returns the collider object. This depends on how it was created (will return a s :ref:`Vector2` **get_contact_collider_position** **(** :ref:`int` contact_idx **)** |const| -Returns the contact position in the collider. +Returns the position of the contact point on the collider in the global coordinate system. .. rst-class:: classref-item-separator @@ -564,7 +566,7 @@ Returns the collider's shape index. :ref:`Vector2` **get_contact_collider_velocity_at_position** **(** :ref:`int` contact_idx **)** |const| -Returns the linear velocity vector at the collider's contact point. +Returns the velocity vector at the collider's contact point. .. rst-class:: classref-item-separator @@ -614,7 +616,7 @@ Returns the local normal at the contact point. :ref:`Vector2` **get_contact_local_position** **(** :ref:`int` contact_idx **)** |const| -Returns the local position of the contact point. +Returns the position of the contact point on the body in the global coordinate system. .. rst-class:: classref-item-separator @@ -632,6 +634,18 @@ Returns the local shape index of the collision. ---- +.. _class_PhysicsDirectBodyState2D_method_get_contact_local_velocity_at_position: + +.. rst-class:: classref-method + +:ref:`Vector2` **get_contact_local_velocity_at_position** **(** :ref:`int` contact_idx **)** |const| + +Returns the velocity vector at the body's contact point. + +.. rst-class:: classref-item-separator + +---- + .. _class_PhysicsDirectBodyState2D_method_get_space_state: .. rst-class:: classref-method diff --git a/classes/class_physicsdirectbodystate2dextension.rst b/classes/class_physicsdirectbodystate2dextension.rst index 0c041a6a71c..40f8571a580 100644 --- a/classes/class_physicsdirectbodystate2dextension.rst +++ b/classes/class_physicsdirectbodystate2dextension.rst @@ -75,6 +75,8 @@ Methods +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`_get_contact_local_shape` **(** :ref:`int` contact_idx **)** |virtual| |const| | +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`_get_contact_local_velocity_at_position` **(** :ref:`int` contact_idx **)** |virtual| |const| | + +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_get_inverse_inertia` **(** **)** |virtual| |const| | +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_get_inverse_mass` **(** **)** |virtual| |const| | @@ -471,6 +473,20 @@ void **_apply_torque_impulse** **(** :ref:`float` impulse **)** |vi ---- +.. _class_PhysicsDirectBodyState2DExtension_method__get_contact_local_velocity_at_position: + +.. rst-class:: classref-method + +:ref:`Vector2` **_get_contact_local_velocity_at_position** **(** :ref:`int` contact_idx **)** |virtual| |const| + +.. container:: contribute + + There is currently no description for this method. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + .. _class_PhysicsDirectBodyState2DExtension_method__get_inverse_inertia: .. rst-class:: classref-method diff --git a/classes/class_physicsdirectbodystate3d.rst b/classes/class_physicsdirectbodystate3d.rst index f35d9394406..bb75af98175 100644 --- a/classes/class_physicsdirectbodystate3d.rst +++ b/classes/class_physicsdirectbodystate3d.rst @@ -123,6 +123,8 @@ Methods +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_contact_local_shape` **(** :ref:`int` contact_idx **)** |const| | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`get_contact_local_velocity_at_position` **(** :ref:`int` contact_idx **)** |const| | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PhysicsDirectSpaceState3D` | :ref:`get_space_state` **(** **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector3` | :ref:`get_velocity_at_local_position` **(** :ref:`Vector3` local_position **)** |const| | @@ -578,7 +580,7 @@ Returns the collider object. :ref:`Vector3` **get_contact_collider_position** **(** :ref:`int` contact_idx **)** |const| -Returns the contact position in the collider. +Returns the position of the contact point on the collider in the global coordinate system. .. rst-class:: classref-item-separator @@ -652,7 +654,7 @@ Returns the local normal at the contact point. :ref:`Vector3` **get_contact_local_position** **(** :ref:`int` contact_idx **)** |const| -Returns the local position of the contact point. +Returns the position of the contact point on the body in the global coordinate system. .. rst-class:: classref-item-separator @@ -670,6 +672,18 @@ Returns the local shape index of the collision. ---- +.. _class_PhysicsDirectBodyState3D_method_get_contact_local_velocity_at_position: + +.. rst-class:: classref-method + +:ref:`Vector3` **get_contact_local_velocity_at_position** **(** :ref:`int` contact_idx **)** |const| + +Returns the linear velocity vector at the body's contact point. + +.. rst-class:: classref-item-separator + +---- + .. _class_PhysicsDirectBodyState3D_method_get_space_state: .. rst-class:: classref-method diff --git a/classes/class_physicsdirectbodystate3dextension.rst b/classes/class_physicsdirectbodystate3dextension.rst index 203a98af66f..3f79037ea7c 100644 --- a/classes/class_physicsdirectbodystate3dextension.rst +++ b/classes/class_physicsdirectbodystate3dextension.rst @@ -75,6 +75,8 @@ Methods +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`_get_contact_local_shape` **(** :ref:`int` contact_idx **)** |virtual| |const| | +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`_get_contact_local_velocity_at_position` **(** :ref:`int` contact_idx **)** |virtual| |const| | + +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector3` | :ref:`_get_inverse_inertia` **(** **)** |virtual| |const| | +-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Basis` | :ref:`_get_inverse_inertia_tensor` **(** **)** |virtual| |const| | @@ -475,6 +477,20 @@ void **_apply_torque_impulse** **(** :ref:`Vector3` impulse **)** ---- +.. _class_PhysicsDirectBodyState3DExtension_method__get_contact_local_velocity_at_position: + +.. rst-class:: classref-method + +:ref:`Vector3` **_get_contact_local_velocity_at_position** **(** :ref:`int` contact_idx **)** |virtual| |const| + +.. container:: contribute + + There is currently no description for this method. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + .. _class_PhysicsDirectBodyState3DExtension_method__get_inverse_inertia: .. rst-class:: classref-method diff --git a/classes/class_physicsdirectspacestate2d.rst b/classes/class_physicsdirectspacestate2d.rst index 9eb74269c57..06900c82ab7 100644 --- a/classes/class_physicsdirectspacestate2d.rst +++ b/classes/class_physicsdirectspacestate2d.rst @@ -40,19 +40,19 @@ Methods .. table:: :widths: auto - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedFloat32Array` | :ref:`cast_motion` **(** :ref:`PhysicsShapeQueryParameters2D` parameters **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedVector2Array[]` | :ref:`collide_shape` **(** :ref:`PhysicsShapeQueryParameters2D` parameters, :ref:`int` max_results=32 **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`get_rest_info` **(** :ref:`PhysicsShapeQueryParameters2D` parameters **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`intersect_point` **(** :ref:`PhysicsPointQueryParameters2D` parameters, :ref:`int` max_results=32 **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`intersect_ray` **(** :ref:`PhysicsRayQueryParameters2D` parameters **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`intersect_shape` **(** :ref:`PhysicsShapeQueryParameters2D` parameters, :ref:`int` max_results=32 **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedFloat32Array` | :ref:`cast_motion` **(** :ref:`PhysicsShapeQueryParameters2D` parameters **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2[]` | :ref:`collide_shape` **(** :ref:`PhysicsShapeQueryParameters2D` parameters, :ref:`int` max_results=32 **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_rest_info` **(** :ref:`PhysicsShapeQueryParameters2D` parameters **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`intersect_point` **(** :ref:`PhysicsPointQueryParameters2D` parameters, :ref:`int` max_results=32 **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`intersect_ray` **(** :ref:`PhysicsRayQueryParameters2D` parameters **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`intersect_shape` **(** :ref:`PhysicsShapeQueryParameters2D` parameters, :ref:`int` max_results=32 **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -83,7 +83,7 @@ Returns an array with the safe and unsafe proportions (between 0 and 1) of the m .. rst-class:: classref-method -:ref:`PackedVector2Array[]` **collide_shape** **(** :ref:`PhysicsShapeQueryParameters2D` parameters, :ref:`int` max_results=32 **)** +:ref:`Vector2[]` **collide_shape** **(** :ref:`PhysicsShapeQueryParameters2D` parameters, :ref:`int` max_results=32 **)** Checks the intersections of a shape, given through a :ref:`PhysicsShapeQueryParameters2D` object, against the space. The resulting array contains a list of points where the shape intersects another. Like with :ref:`intersect_shape`, the number of returned results can be limited to save processing time. diff --git a/classes/class_physicsdirectspacestate3d.rst b/classes/class_physicsdirectspacestate3d.rst index add7f8194dc..4b52ab791e4 100644 --- a/classes/class_physicsdirectspacestate3d.rst +++ b/classes/class_physicsdirectspacestate3d.rst @@ -40,19 +40,19 @@ Methods .. table:: :widths: auto - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedFloat32Array` | :ref:`cast_motion` **(** :ref:`PhysicsShapeQueryParameters3D` parameters **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedVector3Array[]` | :ref:`collide_shape` **(** :ref:`PhysicsShapeQueryParameters3D` parameters, :ref:`int` max_results=32 **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`get_rest_info` **(** :ref:`PhysicsShapeQueryParameters3D` parameters **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`intersect_point` **(** :ref:`PhysicsPointQueryParameters3D` parameters, :ref:`int` max_results=32 **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`intersect_ray` **(** :ref:`PhysicsRayQueryParameters3D` parameters **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`intersect_shape` **(** :ref:`PhysicsShapeQueryParameters3D` parameters, :ref:`int` max_results=32 **)** | - +-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedFloat32Array` | :ref:`cast_motion` **(** :ref:`PhysicsShapeQueryParameters3D` parameters **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3[]` | :ref:`collide_shape` **(** :ref:`PhysicsShapeQueryParameters3D` parameters, :ref:`int` max_results=32 **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_rest_info` **(** :ref:`PhysicsShapeQueryParameters3D` parameters **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`intersect_point` **(** :ref:`PhysicsPointQueryParameters3D` parameters, :ref:`int` max_results=32 **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`intersect_ray` **(** :ref:`PhysicsRayQueryParameters3D` parameters **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`intersect_shape` **(** :ref:`PhysicsShapeQueryParameters3D` parameters, :ref:`int` max_results=32 **)** | + +-----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -83,7 +83,7 @@ Returns an array with the safe and unsafe proportions (between 0 and 1) of the m .. rst-class:: classref-method -:ref:`PackedVector3Array[]` **collide_shape** **(** :ref:`PhysicsShapeQueryParameters3D` parameters, :ref:`int` max_results=32 **)** +:ref:`Vector3[]` **collide_shape** **(** :ref:`PhysicsShapeQueryParameters3D` parameters, :ref:`int` max_results=32 **)** Checks the intersections of a shape, given through a :ref:`PhysicsShapeQueryParameters3D` object, against the space. The resulting array contains a list of points where the shape intersects another. Like with :ref:`intersect_shape`, the number of returned results can be limited to save processing time. diff --git a/classes/class_physicsdirectspacestate3dextension.rst b/classes/class_physicsdirectspacestate3dextension.rst index 6c2c4cab66a..edb1614d425 100644 --- a/classes/class_physicsdirectspacestate3dextension.rst +++ b/classes/class_physicsdirectspacestate3dextension.rst @@ -33,7 +33,7 @@ Methods +-------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`_intersect_point` **(** :ref:`Vector3` position, :ref:`int` collision_mask, :ref:`bool` collide_with_bodies, :ref:`bool` collide_with_areas, PhysicsServer3DExtensionShapeResult* results, :ref:`int` max_results **)** |virtual| | +-------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_intersect_ray` **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`int` collision_mask, :ref:`bool` collide_with_bodies, :ref:`bool` collide_with_areas, :ref:`bool` hit_from_inside, :ref:`bool` hit_back_faces, PhysicsServer3DExtensionRayResult* result **)** |virtual| | + | :ref:`bool` | :ref:`_intersect_ray` **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`int` collision_mask, :ref:`bool` collide_with_bodies, :ref:`bool` collide_with_areas, :ref:`bool` hit_from_inside, :ref:`bool` hit_back_faces, :ref:`bool` pick_ray, PhysicsServer3DExtensionRayResult* result **)** |virtual| | +-------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`_intersect_shape` **(** :ref:`RID` shape_rid, :ref:`Transform3D` transform, :ref:`Vector3` motion, :ref:`float` margin, :ref:`int` collision_mask, :ref:`bool` collide_with_bodies, :ref:`bool` collide_with_areas, PhysicsServer3DExtensionShapeResult* result_count, :ref:`int` max_results **)** |virtual| | +-------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -111,7 +111,7 @@ Method Descriptions .. rst-class:: classref-method -:ref:`bool` **_intersect_ray** **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`int` collision_mask, :ref:`bool` collide_with_bodies, :ref:`bool` collide_with_areas, :ref:`bool` hit_from_inside, :ref:`bool` hit_back_faces, PhysicsServer3DExtensionRayResult* result **)** |virtual| +:ref:`bool` **_intersect_ray** **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`int` collision_mask, :ref:`bool` collide_with_bodies, :ref:`bool` collide_with_areas, :ref:`bool` hit_from_inside, :ref:`bool` hit_back_faces, :ref:`bool` pick_ray, PhysicsServer3DExtensionRayResult* result **)** |virtual| .. container:: contribute diff --git a/classes/class_physicsserver3d.rst b/classes/class_physicsserver3d.rst index 579a08a3354..9e0f5141c87 100644 --- a/classes/class_physicsserver3d.rst +++ b/classes/class_physicsserver3d.rst @@ -1799,9 +1799,19 @@ Removes a shape from an area. It does not delete the shape, so it can be reassig void **area_set_area_monitor_callback** **(** :ref:`RID` area, :ref:`Callable` callback **)** -.. container:: contribute +Sets the area's area monitor callback. This callback will be called when any other (shape of an) area enters or exits (a shape of) the given area, and must take the following five parameters: - There is currently no description for this method. Please help us by :ref:`contributing one `! +1. an integer ``status``: either :ref:`AREA_BODY_ADDED` or :ref:`AREA_BODY_REMOVED` depending on whether the other area's shape entered or exited the area, + +2. an :ref:`RID` ``area_rid``: the :ref:`RID` of the other area that entered or exited the area, + +3. an integer ``instance_id``: the ``ObjectID`` attached to the other area, + +4. an integer ``area_shape_idx``: the index of the shape of the other area that entered or exited the area, + +5. an integer ``self_shape_idx``: the index of the shape of the area where the other area entered or exited. + +By counting (or keeping track of) the shapes that enter and exit, it can be determined if an area (with all its shapes) is entering for the first time or exiting for the last time. .. rst-class:: classref-item-separator @@ -1837,17 +1847,19 @@ Sets which physics layers the area will monitor. void **area_set_monitor_callback** **(** :ref:`RID` area, :ref:`Callable` callback **)** -Sets the function to call when any body/area enters or exits the area. This callback will be called for any object interacting with the area, and takes five parameters: +Sets the area's body monitor callback. This callback will be called when any other (shape of a) body enters or exits (a shape of) the given area, and must take the following five parameters: + +1. an integer ``status``: either :ref:`AREA_BODY_ADDED` or :ref:`AREA_BODY_REMOVED` depending on whether the other body shape entered or exited the area, -1: :ref:`AREA_BODY_ADDED` or :ref:`AREA_BODY_REMOVED`, depending on whether the object entered or exited the area. +2. an :ref:`RID` ``body_rid``: the :ref:`RID` of the body that entered or exited the area, -2: :ref:`RID` of the object that entered/exited the area. +3. an integer ``instance_id``: the ``ObjectID`` attached to the body, -3: Instance ID of the object that entered/exited the area. +4. an integer ``body_shape_idx``: the index of the shape of the body that entered or exited the area, -4: The shape index of the object that entered/exited the area. +5. an integer ``self_shape_idx``: the index of the shape of the area where the body entered or exited. -5: The shape index of the area where the object entered/exited. +By counting (or keeping track of) the shapes that enter and exit, it can be determined if a body (with all its shapes) is entering for the first time or exiting for the last time. .. rst-class:: classref-item-separator diff --git a/classes/class_physicsserver3dextension.rst b/classes/class_physicsserver3dextension.rst index a27eba3685c..c0fb05fa286 100644 --- a/classes/class_physicsserver3dextension.rst +++ b/classes/class_physicsserver3dextension.rst @@ -24,387 +24,387 @@ Methods .. table:: :widths: auto - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_add_shape` **(** :ref:`RID` area, :ref:`RID` shape, :ref:`Transform3D` transform, :ref:`bool` disabled **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_attach_object_instance_id` **(** :ref:`RID` area, :ref:`int` id **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_clear_shapes` **(** :ref:`RID` area **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_area_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_area_get_collision_layer` **(** :ref:`RID` area **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_area_get_collision_mask` **(** :ref:`RID` area **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_area_get_object_instance_id` **(** :ref:`RID` area **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_area_get_param` **(** :ref:`RID` area, :ref:`AreaParameter` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_area_get_shape` **(** :ref:`RID` area, :ref:`int` shape_idx **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_area_get_shape_count` **(** :ref:`RID` area **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`_area_get_shape_transform` **(** :ref:`RID` area, :ref:`int` shape_idx **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_area_get_space` **(** :ref:`RID` area **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`_area_get_transform` **(** :ref:`RID` area **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_remove_shape` **(** :ref:`RID` area, :ref:`int` shape_idx **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_area_monitor_callback` **(** :ref:`RID` area, :ref:`Callable` callback **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_collision_layer` **(** :ref:`RID` area, :ref:`int` layer **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_collision_mask` **(** :ref:`RID` area, :ref:`int` mask **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_monitor_callback` **(** :ref:`RID` area, :ref:`Callable` callback **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_monitorable` **(** :ref:`RID` area, :ref:`bool` monitorable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_param` **(** :ref:`RID` area, :ref:`AreaParameter` param, :ref:`Variant` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_ray_pickable` **(** :ref:`RID` area, :ref:`bool` enable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_shape` **(** :ref:`RID` area, :ref:`int` shape_idx, :ref:`RID` shape **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_shape_disabled` **(** :ref:`RID` area, :ref:`int` shape_idx, :ref:`bool` disabled **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_shape_transform` **(** :ref:`RID` area, :ref:`int` shape_idx, :ref:`Transform3D` transform **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_space` **(** :ref:`RID` area, :ref:`RID` space **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_area_set_transform` **(** :ref:`RID` area, :ref:`Transform3D` transform **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_add_collision_exception` **(** :ref:`RID` body, :ref:`RID` excepted_body **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_add_constant_central_force` **(** :ref:`RID` body, :ref:`Vector3` force **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_add_constant_force` **(** :ref:`RID` body, :ref:`Vector3` force, :ref:`Vector3` position **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_add_constant_torque` **(** :ref:`RID` body, :ref:`Vector3` torque **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_add_shape` **(** :ref:`RID` body, :ref:`RID` shape, :ref:`Transform3D` transform, :ref:`bool` disabled **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_apply_central_force` **(** :ref:`RID` body, :ref:`Vector3` force **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_apply_central_impulse` **(** :ref:`RID` body, :ref:`Vector3` impulse **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_apply_force` **(** :ref:`RID` body, :ref:`Vector3` force, :ref:`Vector3` position **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_apply_impulse` **(** :ref:`RID` body, :ref:`Vector3` impulse, :ref:`Vector3` position **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_apply_torque` **(** :ref:`RID` body, :ref:`Vector3` torque **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_apply_torque_impulse` **(** :ref:`RID` body, :ref:`Vector3` impulse **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_attach_object_instance_id` **(** :ref:`RID` body, :ref:`int` id **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_clear_shapes` **(** :ref:`RID` body **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_body_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID[]` | :ref:`_body_get_collision_exceptions` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_body_get_collision_layer` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_body_get_collision_mask` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_body_get_collision_priority` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`_body_get_constant_force` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`_body_get_constant_torque` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_body_get_contacts_reported_depth_threshold` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PhysicsDirectBodyState3D` | :ref:`_body_get_direct_state` **(** :ref:`RID` body **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_body_get_max_contacts_reported` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`BodyMode` | :ref:`_body_get_mode` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_body_get_object_instance_id` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_body_get_param` **(** :ref:`RID` body, :ref:`BodyParameter` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_body_get_shape` **(** :ref:`RID` body, :ref:`int` shape_idx **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_body_get_shape_count` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`_body_get_shape_transform` **(** :ref:`RID` body, :ref:`int` shape_idx **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_body_get_space` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_body_get_state` **(** :ref:`RID` body, :ref:`BodyState` state **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_body_get_user_flags` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_body_is_axis_locked` **(** :ref:`RID` body, :ref:`BodyAxis` axis **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_body_is_continuous_collision_detection_enabled` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_body_is_omitting_force_integration` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_remove_collision_exception` **(** :ref:`RID` body, :ref:`RID` excepted_body **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_remove_shape` **(** :ref:`RID` body, :ref:`int` shape_idx **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_reset_mass_properties` **(** :ref:`RID` body **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_axis_lock` **(** :ref:`RID` body, :ref:`BodyAxis` axis, :ref:`bool` lock **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_axis_velocity` **(** :ref:`RID` body, :ref:`Vector3` axis_velocity **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_collision_layer` **(** :ref:`RID` body, :ref:`int` layer **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_collision_mask` **(** :ref:`RID` body, :ref:`int` mask **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_collision_priority` **(** :ref:`RID` body, :ref:`float` priority **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_constant_force` **(** :ref:`RID` body, :ref:`Vector3` force **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_constant_torque` **(** :ref:`RID` body, :ref:`Vector3` torque **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_contacts_reported_depth_threshold` **(** :ref:`RID` body, :ref:`float` threshold **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_enable_continuous_collision_detection` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_force_integration_callback` **(** :ref:`RID` body, :ref:`Callable` callable, :ref:`Variant` userdata **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_max_contacts_reported` **(** :ref:`RID` body, :ref:`int` amount **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_mode` **(** :ref:`RID` body, :ref:`BodyMode` mode **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_omit_force_integration` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_param` **(** :ref:`RID` body, :ref:`BodyParameter` param, :ref:`Variant` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_ray_pickable` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_shape` **(** :ref:`RID` body, :ref:`int` shape_idx, :ref:`RID` shape **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_shape_disabled` **(** :ref:`RID` body, :ref:`int` shape_idx, :ref:`bool` disabled **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_shape_transform` **(** :ref:`RID` body, :ref:`int` shape_idx, :ref:`Transform3D` transform **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_space` **(** :ref:`RID` body, :ref:`RID` space **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_state` **(** :ref:`RID` body, :ref:`BodyState` state, :ref:`Variant` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_state_sync_callback` **(** :ref:`RID` body, :ref:`Callable` callable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_body_set_user_flags` **(** :ref:`RID` body, :ref:`int` flags **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_body_test_motion` **(** :ref:`RID` body, :ref:`Transform3D` from, :ref:`Vector3` motion, :ref:`float` margin, :ref:`int` max_collisions, :ref:`bool` collide_separation_ray, PhysicsServer3DExtensionMotionResult* result **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_box_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_capsule_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_concave_polygon_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_cone_twist_joint_get_param` **(** :ref:`RID` joint, :ref:`ConeTwistJointParam` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_cone_twist_joint_set_param` **(** :ref:`RID` joint, :ref:`ConeTwistJointParam` param, :ref:`float` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_convex_polygon_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_custom_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_cylinder_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_end_sync` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_finish` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_flush_queries` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_free_rid` **(** :ref:`RID` rid **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_generic_6dof_joint_get_flag` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisFlag` flag **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_generic_6dof_joint_get_param` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisParam` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_generic_6dof_joint_set_flag` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisFlag` flag, :ref:`bool` enable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_generic_6dof_joint_set_param` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisParam` param, :ref:`float` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_get_process_info` **(** :ref:`ProcessInfo` process_info **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_heightmap_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_hinge_joint_get_flag` **(** :ref:`RID` joint, :ref:`HingeJointFlag` flag **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_hinge_joint_get_param` **(** :ref:`RID` joint, :ref:`HingeJointParam` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_hinge_joint_set_flag` **(** :ref:`RID` joint, :ref:`HingeJointFlag` flag, :ref:`bool` enabled **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_hinge_joint_set_param` **(** :ref:`RID` joint, :ref:`HingeJointParam` param, :ref:`float` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_init` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_is_flushing_queries` **(** **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_clear` **(** :ref:`RID` joint **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_joint_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_disable_collisions_between_bodies` **(** :ref:`RID` joint, :ref:`bool` disable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_joint_get_solver_priority` **(** :ref:`RID` joint **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`JointType` | :ref:`_joint_get_type` **(** :ref:`RID` joint **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_joint_is_disabled_collisions_between_bodies` **(** :ref:`RID` joint **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_make_cone_twist` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` local_ref_A, :ref:`RID` body_B, :ref:`Transform3D` local_ref_B **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_make_generic_6dof` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` local_ref_A, :ref:`RID` body_B, :ref:`Transform3D` local_ref_B **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_make_hinge` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` hinge_A, :ref:`RID` body_B, :ref:`Transform3D` hinge_B **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_make_hinge_simple` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Vector3` pivot_A, :ref:`Vector3` axis_A, :ref:`RID` body_B, :ref:`Vector3` pivot_B, :ref:`Vector3` axis_B **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_make_pin` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Vector3` local_A, :ref:`RID` body_B, :ref:`Vector3` local_B **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_make_slider` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` local_ref_A, :ref:`RID` body_B, :ref:`Transform3D` local_ref_B **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_joint_set_solver_priority` **(** :ref:`RID` joint, :ref:`int` priority **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`_pin_joint_get_local_a` **(** :ref:`RID` joint **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`_pin_joint_get_local_b` **(** :ref:`RID` joint **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_pin_joint_get_param` **(** :ref:`RID` joint, :ref:`PinJointParam` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_pin_joint_set_local_a` **(** :ref:`RID` joint, :ref:`Vector3` local_A **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_pin_joint_set_local_b` **(** :ref:`RID` joint, :ref:`Vector3` local_B **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_pin_joint_set_param` **(** :ref:`RID` joint, :ref:`PinJointParam` param, :ref:`float` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_separation_ray_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_set_active` **(** :ref:`bool` active **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_shape_get_custom_solver_bias` **(** :ref:`RID` shape **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_shape_get_data` **(** :ref:`RID` shape **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_shape_get_margin` **(** :ref:`RID` shape **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`ShapeType` | :ref:`_shape_get_type` **(** :ref:`RID` shape **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_shape_set_custom_solver_bias` **(** :ref:`RID` shape, :ref:`float` bias **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_shape_set_data` **(** :ref:`RID` shape, :ref:`Variant` data **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_shape_set_margin` **(** :ref:`RID` shape, :ref:`float` margin **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_slider_joint_get_param` **(** :ref:`RID` joint, :ref:`SliderJointParam` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_slider_joint_set_param` **(** :ref:`RID` joint, :ref:`SliderJointParam` param, :ref:`float` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_add_collision_exception` **(** :ref:`RID` body, :ref:`RID` body_b **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_soft_body_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`AABB` | :ref:`_soft_body_get_bounds` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID[]` | :ref:`_soft_body_get_collision_exceptions` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_soft_body_get_collision_layer` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_soft_body_get_collision_mask` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_soft_body_get_damping_coefficient` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_soft_body_get_drag_coefficient` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_soft_body_get_linear_stiffness` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`_soft_body_get_point_global_position` **(** :ref:`RID` body, :ref:`int` point_index **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_soft_body_get_pressure_coefficient` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_soft_body_get_simulation_precision` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_soft_body_get_space` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_soft_body_get_state` **(** :ref:`RID` body, :ref:`BodyState` state **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_soft_body_get_total_mass` **(** :ref:`RID` body **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_soft_body_is_point_pinned` **(** :ref:`RID` body, :ref:`int` point_index **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_move_point` **(** :ref:`RID` body, :ref:`int` point_index, :ref:`Vector3` global_position **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_pin_point` **(** :ref:`RID` body, :ref:`int` point_index, :ref:`bool` pin **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_remove_all_pinned_points` **(** :ref:`RID` body **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_remove_collision_exception` **(** :ref:`RID` body, :ref:`RID` body_b **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_collision_layer` **(** :ref:`RID` body, :ref:`int` layer **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_collision_mask` **(** :ref:`RID` body, :ref:`int` mask **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_damping_coefficient` **(** :ref:`RID` body, :ref:`float` damping_coefficient **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_drag_coefficient` **(** :ref:`RID` body, :ref:`float` drag_coefficient **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_linear_stiffness` **(** :ref:`RID` body, :ref:`float` linear_stiffness **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_mesh` **(** :ref:`RID` body, :ref:`RID` mesh **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_pressure_coefficient` **(** :ref:`RID` body, :ref:`float` pressure_coefficient **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_ray_pickable` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_simulation_precision` **(** :ref:`RID` body, :ref:`int` simulation_precision **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_space` **(** :ref:`RID` body, :ref:`RID` space **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_state` **(** :ref:`RID` body, :ref:`BodyState` state, :ref:`Variant` variant **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_total_mass` **(** :ref:`RID` body, :ref:`float` total_mass **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_set_transform` **(** :ref:`RID` body, :ref:`Transform3D` transform **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_soft_body_update_rendering_server` **(** :ref:`RID` body, :ref:`PhysicsServer3DRenderingServerHandler` rendering_server_handler **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_space_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`_space_get_contact_count` **(** :ref:`RID` space **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedVector3Array` | :ref:`_space_get_contacts` **(** :ref:`RID` space **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PhysicsDirectSpaceState3D` | :ref:`_space_get_direct_state` **(** :ref:`RID` space **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_space_get_param` **(** :ref:`RID` space, :ref:`SpaceParameter` param **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_space_is_active` **(** :ref:`RID` space **)** |virtual| |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_space_set_active` **(** :ref:`RID` space, :ref:`bool` active **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_space_set_debug_contacts` **(** :ref:`RID` space, :ref:`int` max_contacts **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_space_set_param` **(** :ref:`RID` space, :ref:`SpaceParameter` param, :ref:`float` value **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_sphere_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_step` **(** :ref:`float` step **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_sync` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`_world_boundary_shape_create` **(** **)** |virtual| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`body_test_motion_is_excluding_body` **(** :ref:`RID` body **)** |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`body_test_motion_is_excluding_object` **(** :ref:`int` object **)** |const| | - +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_add_shape` **(** :ref:`RID` area, :ref:`RID` shape, :ref:`Transform3D` transform, :ref:`bool` disabled **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_attach_object_instance_id` **(** :ref:`RID` area, :ref:`int` id **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_clear_shapes` **(** :ref:`RID` area **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_area_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_area_get_collision_layer` **(** :ref:`RID` area **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_area_get_collision_mask` **(** :ref:`RID` area **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_area_get_object_instance_id` **(** :ref:`RID` area **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_area_get_param` **(** :ref:`RID` area, :ref:`AreaParameter` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_area_get_shape` **(** :ref:`RID` area, :ref:`int` shape_idx **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_area_get_shape_count` **(** :ref:`RID` area **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`_area_get_shape_transform` **(** :ref:`RID` area, :ref:`int` shape_idx **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_area_get_space` **(** :ref:`RID` area **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`_area_get_transform` **(** :ref:`RID` area **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_remove_shape` **(** :ref:`RID` area, :ref:`int` shape_idx **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_area_monitor_callback` **(** :ref:`RID` area, :ref:`Callable` callback **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_collision_layer` **(** :ref:`RID` area, :ref:`int` layer **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_collision_mask` **(** :ref:`RID` area, :ref:`int` mask **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_monitor_callback` **(** :ref:`RID` area, :ref:`Callable` callback **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_monitorable` **(** :ref:`RID` area, :ref:`bool` monitorable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_param` **(** :ref:`RID` area, :ref:`AreaParameter` param, :ref:`Variant` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_ray_pickable` **(** :ref:`RID` area, :ref:`bool` enable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_shape` **(** :ref:`RID` area, :ref:`int` shape_idx, :ref:`RID` shape **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_shape_disabled` **(** :ref:`RID` area, :ref:`int` shape_idx, :ref:`bool` disabled **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_shape_transform` **(** :ref:`RID` area, :ref:`int` shape_idx, :ref:`Transform3D` transform **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_space` **(** :ref:`RID` area, :ref:`RID` space **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_area_set_transform` **(** :ref:`RID` area, :ref:`Transform3D` transform **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_add_collision_exception` **(** :ref:`RID` body, :ref:`RID` excepted_body **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_add_constant_central_force` **(** :ref:`RID` body, :ref:`Vector3` force **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_add_constant_force` **(** :ref:`RID` body, :ref:`Vector3` force, :ref:`Vector3` position **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_add_constant_torque` **(** :ref:`RID` body, :ref:`Vector3` torque **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_add_shape` **(** :ref:`RID` body, :ref:`RID` shape, :ref:`Transform3D` transform, :ref:`bool` disabled **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_apply_central_force` **(** :ref:`RID` body, :ref:`Vector3` force **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_apply_central_impulse` **(** :ref:`RID` body, :ref:`Vector3` impulse **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_apply_force` **(** :ref:`RID` body, :ref:`Vector3` force, :ref:`Vector3` position **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_apply_impulse` **(** :ref:`RID` body, :ref:`Vector3` impulse, :ref:`Vector3` position **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_apply_torque` **(** :ref:`RID` body, :ref:`Vector3` torque **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_apply_torque_impulse` **(** :ref:`RID` body, :ref:`Vector3` impulse **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_attach_object_instance_id` **(** :ref:`RID` body, :ref:`int` id **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_clear_shapes` **(** :ref:`RID` body **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_body_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID[]` | :ref:`_body_get_collision_exceptions` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_body_get_collision_layer` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_body_get_collision_mask` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_body_get_collision_priority` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`_body_get_constant_force` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`_body_get_constant_torque` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_body_get_contacts_reported_depth_threshold` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PhysicsDirectBodyState3D` | :ref:`_body_get_direct_state` **(** :ref:`RID` body **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_body_get_max_contacts_reported` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`BodyMode` | :ref:`_body_get_mode` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_body_get_object_instance_id` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_body_get_param` **(** :ref:`RID` body, :ref:`BodyParameter` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_body_get_shape` **(** :ref:`RID` body, :ref:`int` shape_idx **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_body_get_shape_count` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`_body_get_shape_transform` **(** :ref:`RID` body, :ref:`int` shape_idx **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_body_get_space` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_body_get_state` **(** :ref:`RID` body, :ref:`BodyState` state **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_body_get_user_flags` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_body_is_axis_locked` **(** :ref:`RID` body, :ref:`BodyAxis` axis **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_body_is_continuous_collision_detection_enabled` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_body_is_omitting_force_integration` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_remove_collision_exception` **(** :ref:`RID` body, :ref:`RID` excepted_body **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_remove_shape` **(** :ref:`RID` body, :ref:`int` shape_idx **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_reset_mass_properties` **(** :ref:`RID` body **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_axis_lock` **(** :ref:`RID` body, :ref:`BodyAxis` axis, :ref:`bool` lock **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_axis_velocity` **(** :ref:`RID` body, :ref:`Vector3` axis_velocity **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_collision_layer` **(** :ref:`RID` body, :ref:`int` layer **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_collision_mask` **(** :ref:`RID` body, :ref:`int` mask **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_collision_priority` **(** :ref:`RID` body, :ref:`float` priority **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_constant_force` **(** :ref:`RID` body, :ref:`Vector3` force **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_constant_torque` **(** :ref:`RID` body, :ref:`Vector3` torque **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_contacts_reported_depth_threshold` **(** :ref:`RID` body, :ref:`float` threshold **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_enable_continuous_collision_detection` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_force_integration_callback` **(** :ref:`RID` body, :ref:`Callable` callable, :ref:`Variant` userdata **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_max_contacts_reported` **(** :ref:`RID` body, :ref:`int` amount **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_mode` **(** :ref:`RID` body, :ref:`BodyMode` mode **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_omit_force_integration` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_param` **(** :ref:`RID` body, :ref:`BodyParameter` param, :ref:`Variant` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_ray_pickable` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_shape` **(** :ref:`RID` body, :ref:`int` shape_idx, :ref:`RID` shape **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_shape_disabled` **(** :ref:`RID` body, :ref:`int` shape_idx, :ref:`bool` disabled **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_shape_transform` **(** :ref:`RID` body, :ref:`int` shape_idx, :ref:`Transform3D` transform **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_space` **(** :ref:`RID` body, :ref:`RID` space **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_state` **(** :ref:`RID` body, :ref:`BodyState` state, :ref:`Variant` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_state_sync_callback` **(** :ref:`RID` body, :ref:`Callable` callable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_body_set_user_flags` **(** :ref:`RID` body, :ref:`int` flags **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_body_test_motion` **(** :ref:`RID` body, :ref:`Transform3D` from, :ref:`Vector3` motion, :ref:`float` margin, :ref:`int` max_collisions, :ref:`bool` collide_separation_ray, :ref:`bool` recovery_as_collision, PhysicsServer3DExtensionMotionResult* result **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_box_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_capsule_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_concave_polygon_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_cone_twist_joint_get_param` **(** :ref:`RID` joint, :ref:`ConeTwistJointParam` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_cone_twist_joint_set_param` **(** :ref:`RID` joint, :ref:`ConeTwistJointParam` param, :ref:`float` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_convex_polygon_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_custom_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_cylinder_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_end_sync` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_finish` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_flush_queries` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_free_rid` **(** :ref:`RID` rid **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_generic_6dof_joint_get_flag` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisFlag` flag **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_generic_6dof_joint_get_param` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisParam` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_generic_6dof_joint_set_flag` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisFlag` flag, :ref:`bool` enable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_generic_6dof_joint_set_param` **(** :ref:`RID` joint, Vector3.Axis axis, :ref:`G6DOFJointAxisParam` param, :ref:`float` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_get_process_info` **(** :ref:`ProcessInfo` process_info **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_heightmap_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_hinge_joint_get_flag` **(** :ref:`RID` joint, :ref:`HingeJointFlag` flag **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_hinge_joint_get_param` **(** :ref:`RID` joint, :ref:`HingeJointParam` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_hinge_joint_set_flag` **(** :ref:`RID` joint, :ref:`HingeJointFlag` flag, :ref:`bool` enabled **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_hinge_joint_set_param` **(** :ref:`RID` joint, :ref:`HingeJointParam` param, :ref:`float` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_init` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_is_flushing_queries` **(** **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_clear` **(** :ref:`RID` joint **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_joint_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_disable_collisions_between_bodies` **(** :ref:`RID` joint, :ref:`bool` disable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_joint_get_solver_priority` **(** :ref:`RID` joint **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`JointType` | :ref:`_joint_get_type` **(** :ref:`RID` joint **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_joint_is_disabled_collisions_between_bodies` **(** :ref:`RID` joint **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_make_cone_twist` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` local_ref_A, :ref:`RID` body_B, :ref:`Transform3D` local_ref_B **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_make_generic_6dof` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` local_ref_A, :ref:`RID` body_B, :ref:`Transform3D` local_ref_B **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_make_hinge` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` hinge_A, :ref:`RID` body_B, :ref:`Transform3D` hinge_B **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_make_hinge_simple` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Vector3` pivot_A, :ref:`Vector3` axis_A, :ref:`RID` body_B, :ref:`Vector3` pivot_B, :ref:`Vector3` axis_B **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_make_pin` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Vector3` local_A, :ref:`RID` body_B, :ref:`Vector3` local_B **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_make_slider` **(** :ref:`RID` joint, :ref:`RID` body_A, :ref:`Transform3D` local_ref_A, :ref:`RID` body_B, :ref:`Transform3D` local_ref_B **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_joint_set_solver_priority` **(** :ref:`RID` joint, :ref:`int` priority **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`_pin_joint_get_local_a` **(** :ref:`RID` joint **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`_pin_joint_get_local_b` **(** :ref:`RID` joint **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_pin_joint_get_param` **(** :ref:`RID` joint, :ref:`PinJointParam` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_pin_joint_set_local_a` **(** :ref:`RID` joint, :ref:`Vector3` local_A **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_pin_joint_set_local_b` **(** :ref:`RID` joint, :ref:`Vector3` local_B **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_pin_joint_set_param` **(** :ref:`RID` joint, :ref:`PinJointParam` param, :ref:`float` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_separation_ray_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_set_active` **(** :ref:`bool` active **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_shape_get_custom_solver_bias` **(** :ref:`RID` shape **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_shape_get_data` **(** :ref:`RID` shape **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_shape_get_margin` **(** :ref:`RID` shape **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`ShapeType` | :ref:`_shape_get_type` **(** :ref:`RID` shape **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_shape_set_custom_solver_bias` **(** :ref:`RID` shape, :ref:`float` bias **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_shape_set_data` **(** :ref:`RID` shape, :ref:`Variant` data **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_shape_set_margin` **(** :ref:`RID` shape, :ref:`float` margin **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_slider_joint_get_param` **(** :ref:`RID` joint, :ref:`SliderJointParam` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_slider_joint_set_param` **(** :ref:`RID` joint, :ref:`SliderJointParam` param, :ref:`float` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_add_collision_exception` **(** :ref:`RID` body, :ref:`RID` body_b **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_soft_body_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`AABB` | :ref:`_soft_body_get_bounds` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID[]` | :ref:`_soft_body_get_collision_exceptions` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_soft_body_get_collision_layer` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_soft_body_get_collision_mask` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_soft_body_get_damping_coefficient` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_soft_body_get_drag_coefficient` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_soft_body_get_linear_stiffness` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`_soft_body_get_point_global_position` **(** :ref:`RID` body, :ref:`int` point_index **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_soft_body_get_pressure_coefficient` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_soft_body_get_simulation_precision` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_soft_body_get_space` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`_soft_body_get_state` **(** :ref:`RID` body, :ref:`BodyState` state **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_soft_body_get_total_mass` **(** :ref:`RID` body **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_soft_body_is_point_pinned` **(** :ref:`RID` body, :ref:`int` point_index **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_move_point` **(** :ref:`RID` body, :ref:`int` point_index, :ref:`Vector3` global_position **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_pin_point` **(** :ref:`RID` body, :ref:`int` point_index, :ref:`bool` pin **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_remove_all_pinned_points` **(** :ref:`RID` body **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_remove_collision_exception` **(** :ref:`RID` body, :ref:`RID` body_b **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_collision_layer` **(** :ref:`RID` body, :ref:`int` layer **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_collision_mask` **(** :ref:`RID` body, :ref:`int` mask **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_damping_coefficient` **(** :ref:`RID` body, :ref:`float` damping_coefficient **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_drag_coefficient` **(** :ref:`RID` body, :ref:`float` drag_coefficient **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_linear_stiffness` **(** :ref:`RID` body, :ref:`float` linear_stiffness **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_mesh` **(** :ref:`RID` body, :ref:`RID` mesh **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_pressure_coefficient` **(** :ref:`RID` body, :ref:`float` pressure_coefficient **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_ray_pickable` **(** :ref:`RID` body, :ref:`bool` enable **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_simulation_precision` **(** :ref:`RID` body, :ref:`int` simulation_precision **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_space` **(** :ref:`RID` body, :ref:`RID` space **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_state` **(** :ref:`RID` body, :ref:`BodyState` state, :ref:`Variant` variant **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_total_mass` **(** :ref:`RID` body, :ref:`float` total_mass **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_set_transform` **(** :ref:`RID` body, :ref:`Transform3D` transform **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_soft_body_update_rendering_server` **(** :ref:`RID` body, :ref:`PhysicsServer3DRenderingServerHandler` rendering_server_handler **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_space_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_space_get_contact_count` **(** :ref:`RID` space **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedVector3Array` | :ref:`_space_get_contacts` **(** :ref:`RID` space **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PhysicsDirectSpaceState3D` | :ref:`_space_get_direct_state` **(** :ref:`RID` space **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`_space_get_param` **(** :ref:`RID` space, :ref:`SpaceParameter` param **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_space_is_active` **(** :ref:`RID` space **)** |virtual| |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_space_set_active` **(** :ref:`RID` space, :ref:`bool` active **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_space_set_debug_contacts` **(** :ref:`RID` space, :ref:`int` max_contacts **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_space_set_param` **(** :ref:`RID` space, :ref:`SpaceParameter` param, :ref:`float` value **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_sphere_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_step` **(** :ref:`float` step **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_sync` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`_world_boundary_shape_create` **(** **)** |virtual| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`body_test_motion_is_excluding_body` **(** :ref:`RID` body **)** |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`body_test_motion_is_excluding_object` **(** :ref:`int` object **)** |const| | + +-------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -1623,7 +1623,7 @@ void **_body_set_user_flags** **(** :ref:`RID` body, :ref:`int` **_body_test_motion** **(** :ref:`RID` body, :ref:`Transform3D` from, :ref:`Vector3` motion, :ref:`float` margin, :ref:`int` max_collisions, :ref:`bool` collide_separation_ray, PhysicsServer3DExtensionMotionResult* result **)** |virtual| |const| +:ref:`bool` **_body_test_motion** **(** :ref:`RID` body, :ref:`Transform3D` from, :ref:`Vector3` motion, :ref:`float` margin, :ref:`int` max_collisions, :ref:`bool` collide_separation_ray, :ref:`bool` recovery_as_collision, PhysicsServer3DExtensionMotionResult* result **)** |virtual| |const| .. container:: contribute diff --git a/classes/class_polygon2d.rst b/classes/class_polygon2d.rst index 2035a93fc6e..1a6ad715ff7 100644 --- a/classes/class_polygon2d.rst +++ b/classes/class_polygon2d.rst @@ -121,9 +121,7 @@ If ``true``, polygon edges will be anti-aliased. :ref:`Array` **bones** = ``[]`` -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Internal list of :ref:`Bone2D` nodes used by the assigned :ref:`skeleton`. Edited using the Polygon2D editor ("UV" button on the top toolbar). .. rst-class:: classref-item-separator @@ -157,9 +155,7 @@ The polygon's fill color. If ``texture`` is defined, it will be multiplied by th - void **set_internal_vertex_count** **(** :ref:`int` value **)** - :ref:`int` **get_internal_vertex_count** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Number of internal vertices, used for UV mapping. .. rst-class:: classref-item-separator @@ -263,9 +259,7 @@ The list of polygons, in case more than one is being represented. Every individu - void **set_skeleton** **(** :ref:`NodePath` value **)** - :ref:`NodePath` **get_skeleton** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Path to a :ref:`Skeleton2D` node used for skeleton-based deformations of this polygon. If empty or invalid, skeletal deformations will not be used. .. rst-class:: classref-item-separator diff --git a/classes/class_popupmenu.rst b/classes/class_popupmenu.rst index 503a0d9c85d..02e973e5397 100644 --- a/classes/class_popupmenu.rst +++ b/classes/class_popupmenu.rst @@ -98,6 +98,10 @@ Methods +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Texture2D` | :ref:`get_item_icon` **(** :ref:`int` index **)** |const| | +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_item_icon_max_width` **(** :ref:`int` index **)** |const| | + +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`get_item_icon_modulate` **(** :ref:`int` index **)** |const| | + +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_item_id` **(** :ref:`int` index **)** |const| | +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_item_indent` **(** :ref:`int` index **)** |const| | @@ -150,6 +154,10 @@ Methods +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_item_icon` **(** :ref:`int` index, :ref:`Texture2D` icon **)** | +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_item_icon_max_width` **(** :ref:`int` index, :ref:`int` width **)** | + +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_item_icon_modulate` **(** :ref:`int` index, :ref:`Color` modulate **)** | + +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_item_id` **(** :ref:`int` index, :ref:`int` id **)** | +--------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_item_indent` **(** :ref:`int` index, :ref:`int` indent **)** | @@ -202,6 +210,8 @@ Theme Properties +-----------------------------------+-----------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`h_separation` | ``4`` | +-----------------------------------+-----------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`icon_max_width` | ``0`` | + +-----------------------------------+-----------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`indent` | ``10`` | +-----------------------------------+-----------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`item_end_padding` | ``2`` | @@ -678,7 +688,7 @@ Returns the index of the currently focused item. Returns ``-1`` if no item is fo :ref:`Key` **get_item_accelerator** **(** :ref:`int` index **)** |const| -Returns the accelerator of the item at the given ``index``. An accelerator is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The return value is an integer which is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). If no accelerator is defined for the specified ``index``, :ref:`get_item_accelerator` returns ``0`` (corresponding to :ref:`@GlobalScope.KEY_NONE`). +Returns the accelerator of the item at the given ``index``. An accelerator is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. The return value is an integer which is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). If no accelerator is defined for the specified ``index``, :ref:`get_item_accelerator` returns ``0`` (corresponding to :ref:`@GlobalScope.KEY_NONE`). .. rst-class:: classref-item-separator @@ -696,6 +706,30 @@ Returns the icon of the item at the given ``index``. ---- +.. _class_PopupMenu_method_get_item_icon_max_width: + +.. rst-class:: classref-method + +:ref:`int` **get_item_icon_max_width** **(** :ref:`int` index **)** |const| + +Returns the maximum allowed width of the icon for the item at the given ``index``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_PopupMenu_method_get_item_icon_modulate: + +.. rst-class:: classref-method + +:ref:`Color` **get_item_icon_modulate** **(** :ref:`int` index **)** |const| + +Returns a :ref:`Color` modulating the item's icon at the given ``index``. + +.. rst-class:: classref-item-separator + +---- + .. _class_PopupMenu_method_get_item_id: .. rst-class:: classref-method @@ -940,7 +974,7 @@ Passing ``-1`` as the index makes so that no item is focused. void **set_item_accelerator** **(** :ref:`int` index, :ref:`Key` accel **)** -Sets the accelerator of the item at the given ``index``. An accelerator is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. ``accel`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using boolean OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). +Sets the accelerator of the item at the given ``index``. An accelerator is a keyboard shortcut that can be pressed to trigger the menu button even if it's not currently open. ``accel`` is generally a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). .. rst-class:: classref-item-separator @@ -1020,6 +1054,30 @@ Replaces the :ref:`Texture2D` icon of the item at the given ``i ---- +.. _class_PopupMenu_method_set_item_icon_max_width: + +.. rst-class:: classref-method + +void **set_item_icon_max_width** **(** :ref:`int` index, :ref:`int` width **)** + +Sets the maximum allowed width of the icon for the item at the given ``index``. This limit is applied on top of the default size of the icon and on top of :ref:`icon_max_width`. The height is adjusted according to the icon's ratio. + +.. rst-class:: classref-item-separator + +---- + +.. _class_PopupMenu_method_set_item_icon_modulate: + +.. rst-class:: classref-method + +void **set_item_icon_modulate** **(** :ref:`int` index, :ref:`Color` modulate **)** + +Sets a modulating :ref:`Color` of the item's icon at the given ``index``. + +.. rst-class:: classref-item-separator + +---- + .. _class_PopupMenu_method_set_item_id: .. rst-class:: classref-method @@ -1279,6 +1337,18 @@ The horizontal space between the item's elements. ---- +.. _class_PopupMenu_theme_constant_icon_max_width: + +.. rst-class:: classref-themeproperty + +:ref:`int` **icon_max_width** = ``0`` + +The maximum allowed width of the item's icon. This limit is applied on top of the default size of the icon, but before the value set with :ref:`set_item_icon_max_width`. The height is adjusted according to the icon's ratio. + +.. rst-class:: classref-item-separator + +---- + .. _class_PopupMenu_theme_constant_indent: .. rst-class:: classref-themeproperty diff --git a/classes/class_projectsettings.rst b/classes/class_projectsettings.rst index 27445c016c9..0d9c2faadc0 100644 --- a/classes/class_projectsettings.rst +++ b/classes/class_projectsettings.rst @@ -59,12 +59,12 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`application/boot_splash/use_filter` | ``true`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`application/config/auto_accept_quit` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`application/config/custom_user_dir_name` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`application/config/description` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`application/config/features` | | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`application/config/icon` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`application/config/macos_native_icon` | ``""`` | @@ -75,6 +75,8 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`application/config/project_settings_override` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`application/config/quit_on_go_back` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`application/config/use_custom_user_dir` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`application/config/use_hidden_project_data_directory` | ``true`` | @@ -95,6 +97,8 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`application/run/low_processor_mode_sleep_usec` | ``6900`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`application/run/main_loop_type` | ``"SceneTree"`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`application/run/main_scene` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`application/run/max_fps` | ``0`` | @@ -181,6 +185,8 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`debug/gdscript/warnings/redundant_await` | ``1`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`debug/gdscript/warnings/redundant_static_unload` | ``1`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`debug/gdscript/warnings/renamed_in_godot_4_hint` | ``1`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`debug/gdscript/warnings/return_value_discarded` | ``0`` | @@ -239,6 +245,46 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`debug/settings/stdout/verbose_stdout` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/device_limit_exceeded` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/enable` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/float_comparison` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/formatting_error` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/treat_warnings_as_errors` | ``false`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/unused_constant` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/unused_function` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/unused_local_variable` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/unused_struct` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/unused_uniform` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shader_language/warnings/unused_varying` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`debug/shapes/avoidance/agents_radius_color` | ``Color(1, 1, 0, 0.25)`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shapes/avoidance/enable_agents_radius` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shapes/avoidance/enable_obstacles_radius` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`debug/shapes/avoidance/enable_obstacles_static` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`debug/shapes/avoidance/obstacles_radius_color` | ``Color(1, 0.5, 0, 0.25)`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`debug/shapes/avoidance/obstacles_static_edge_pushin_color` | ``Color(1, 0, 0, 1)`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`debug/shapes/avoidance/obstacles_static_edge_pushout_color` | ``Color(1, 1, 0, 1)`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`debug/shapes/avoidance/obstacles_static_face_pushin_color` | ``Color(1, 0, 0, 0)`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`debug/shapes/avoidance/obstacles_static_face_pushout_color` | ``Color(1, 1, 0, 0.5)`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`Color` | :ref:`debug/shapes/collision/contact_color` | ``Color(1, 0.2, 0.1, 0.8)`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`debug/shapes/collision/draw_2d_outlines` | ``true`` | @@ -339,12 +385,26 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`display/window/size/window_width_override` | ``0`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`display/window/stretch/aspect` | ``"keep"`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`display/window/stretch/mode` | ``"disabled"`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`display/window/stretch/scale` | ``1.0`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`display/window/subwindows/embed_subwindows` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`display/window/vsync/vsync_mode` | ``1`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`dotnet/project/assembly_name` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`dotnet/project/solution_directory` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`editor/export/convert_text_resources_to_binary` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`editor/import/reimport_missing_imported_files` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`editor/import/use_multiple_threads` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`editor/movie_writer/disable_vsync` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`editor/movie_writer/fps` | ``60`` | @@ -365,12 +425,18 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`editor/naming/node_name_num_separator` | ``0`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`editor/naming/scene_name_casing` | ``2`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`editor/run/main_run_args` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`PackedStringArray` | :ref:`editor/script/search_in_file_extensions` | ``PackedStringArray("gd", "gdshader")`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`editor/script/templates_search_path` | ``"res://script_templates"`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`editor/version_control/autoload_on_startup` | ``false`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`editor/version_control/plugin_name` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`filesystem/import/blender/enabled` | ``true`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`filesystem/import/blender/enabled.android` | ``false`` | @@ -385,10 +451,14 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`gui/common/default_scroll_deadzone` | ``0`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`gui/common/snap_controls_to_pixels` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`gui/common/swap_cancel_ok` | | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`gui/common/text_edit_undo_stack_max_size` | ``1024`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`gui/fonts/dynamic_fonts/use_oversampling` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`gui/theme/custom` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`gui/theme/custom_font` | ``""`` | @@ -583,10 +653,6 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`internationalization/locale/test` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`internationalization/locale/translation_remaps` | | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`internationalization/locale/translations` | | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`internationalization/pseudolocalization/double_vowels` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`internationalization/pseudolocalization/expansion_ratio` | ``0.0`` | @@ -607,10 +673,28 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`internationalization/rendering/force_right_to_left_layout_direction` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`internationalization/rendering/root_node_layout_direction` | ``0`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`internationalization/rendering/text_driver` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_1` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_2` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_3` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_4` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_5` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_6` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_7` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_8` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_navigation/layer_9` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_10` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_11` | ``""`` | @@ -631,8 +715,6 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_19` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_2` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_20` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_21` | ``""`` | @@ -653,27 +735,29 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_29` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_3` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_30` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_31` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_navigation/layer_32` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_4` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_physics/layer_1` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_5` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_physics/layer_2` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_6` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_physics/layer_3` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_7` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_physics/layer_4` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_8` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_physics/layer_5` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_navigation/layer_9` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_physics/layer_6` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_1` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_physics/layer_7` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_physics/layer_8` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_physics/layer_9` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_10` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ @@ -695,8 +779,6 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_19` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_2` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_20` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_21` | ``""`` | @@ -717,27 +799,29 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_29` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_3` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_30` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_31` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_physics/layer_32` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_4` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_render/layer_1` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_5` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_render/layer_2` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_6` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_render/layer_3` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_7` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_render/layer_4` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_8` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_render/layer_5` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_physics/layer_9` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_render/layer_6` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_1` | ``""`` | + | :ref:`String` | :ref:`layer_names/2d_render/layer_7` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_render/layer_8` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/2d_render/layer_9` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_render/layer_10` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ @@ -759,25 +843,25 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_render/layer_19` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_2` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/2d_render/layer_20` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_3` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_1` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_4` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_2` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_5` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_3` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_6` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_4` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_7` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_5` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_8` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_6` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/2d_render/layer_9` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_7` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_1` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_8` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/3d_navigation/layer_9` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_10` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ @@ -799,8 +883,6 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_19` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_2` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_20` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_21` | ``""`` | @@ -821,27 +903,29 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_29` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_3` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_30` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_31` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_navigation/layer_32` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_4` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_physics/layer_1` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_5` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_physics/layer_2` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_6` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_physics/layer_3` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_7` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_physics/layer_4` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_8` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_physics/layer_5` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_navigation/layer_9` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_physics/layer_6` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_1` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_physics/layer_7` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/3d_physics/layer_8` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/3d_physics/layer_9` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_10` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ @@ -863,8 +947,6 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_19` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_2` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_20` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_21` | ``""`` | @@ -885,27 +967,29 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_29` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_3` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_30` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_31` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_physics/layer_32` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_4` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_render/layer_1` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_5` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_render/layer_2` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_6` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_render/layer_3` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_7` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_render/layer_4` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_8` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_render/layer_5` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_physics/layer_9` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_render/layer_6` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_1` | ``""`` | + | :ref:`String` | :ref:`layer_names/3d_render/layer_7` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/3d_render/layer_8` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/3d_render/layer_9` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_render/layer_10` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ @@ -927,25 +1011,73 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_render/layer_19` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_2` | ``""`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`layer_names/3d_render/layer_20` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_3` | ``""`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_1` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_4` | ``""`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_2` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_5` | ``""`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_3` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_6` | ``""`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_4` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_7` | ``""`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_5` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_8` | ``""`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_6` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`layer_names/3d_render/layer_9` | ``""`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_7` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_8` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_9` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_10` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_11` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_12` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_13` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_14` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_15` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_16` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_17` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_18` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_19` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_20` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_21` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_22` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_23` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_24` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_25` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_26` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`memory/limits/message_queue/max_size_kb` | ``4096`` | + | :ref:`String` | :ref:`layer_names/avoidance/layer_27` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_28` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_29` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_30` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_31` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`layer_names/avoidance/layer_32` | ``""`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`memory/limits/message_queue/max_size_mb` | ``32`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`memory/limits/multithreaded_server/rid_pool_prealloc` | ``60`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ @@ -955,12 +1087,20 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`navigation/2d/default_link_connection_radius` | ``4`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`navigation/2d/use_edge_connections` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`navigation/3d/default_cell_size` | ``0.25`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`navigation/3d/default_edge_connection_margin` | ``0.25`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`navigation/3d/default_link_connection_radius` | ``1.0`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`navigation/3d/use_edge_connections` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`navigation/avoidance/thread_model/avoidance_use_high_priority_threads` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`navigation/avoidance/thread_model/avoidance_use_multiple_threads` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`network/limits/debugger/max_chars_per_second` | ``32768`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`network/limits/debugger/max_errors_per_second` | ``400`` | @@ -975,10 +1115,6 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`network/limits/webrtc/max_channel_in_buffer_kb` | ``64`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`network/remote_fs/page_read_ahead` | ``4`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`network/remote_fs/page_size` | ``65536`` | - +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`network/tls/certificate_bundle_override` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`physics/2d/default_angular_damp` | ``1.0`` | @@ -1307,6 +1443,10 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`rendering/shading/overrides/force_vertex_shading.mobile` | ``true`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`rendering/textures/canvas_textures/default_texture_filter` | ``1`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`rendering/textures/canvas_textures/default_texture_repeat` | ``0`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`rendering/textures/decals/filter` | ``3`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`rendering/textures/default_filters/anisotropic_filtering_level` | ``2`` | @@ -1347,6 +1487,8 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`xr/openxr/reference_space` | ``"1"`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`xr/openxr/startup_alert` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`xr/openxr/submit_depth_buffer` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`xr/openxr/view_configuration` | ``"1"`` | @@ -1479,39 +1621,39 @@ If ``true``, applies linear filtering when scaling the image (recommended for hi ---- -.. _class_ProjectSettings_property_application/config/custom_user_dir_name: +.. _class_ProjectSettings_property_application/config/auto_accept_quit: .. rst-class:: classref-property -:ref:`String` **application/config/custom_user_dir_name** = ``""`` - -This user directory is used for storing persistent data (``user://`` filesystem). If a custom directory name is defined, this name will be appended to the system-specific user data directory (same parent folder as the Godot configuration folder documented in :ref:`OS.get_user_data_dir`). +:ref:`bool` **application/config/auto_accept_quit** = ``true`` -The :ref:`application/config/use_custom_user_dir` setting must be enabled for this to take effect. +If ``true``, the application automatically accepts quitting requests. .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_application/config/description: +.. _class_ProjectSettings_property_application/config/custom_user_dir_name: .. rst-class:: classref-property -:ref:`String` **application/config/description** = ``""`` +:ref:`String` **application/config/custom_user_dir_name** = ``""`` -The project's description, displayed as a tooltip in the Project Manager when hovering the project. +This user directory is used for storing persistent data (``user://`` filesystem). If a custom directory name is defined, this name will be appended to the system-specific user data directory (same parent folder as the Godot configuration folder documented in :ref:`OS.get_user_data_dir`). + +The :ref:`application/config/use_custom_user_dir` setting must be enabled for this to take effect. .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_application/config/features: +.. _class_ProjectSettings_property_application/config/description: .. rst-class:: classref-property -:ref:`PackedStringArray` **application/config/features** +:ref:`String` **application/config/description** = ``""`` -List of internal features associated with the project, like ``Double Precision`` or ``C#``. Not to be confused with feature tags. +The project's description, displayed as a tooltip in the Project Manager when hovering the project. .. rst-class:: classref-item-separator @@ -1581,6 +1723,18 @@ Specifies a file to override project settings. For example: ``user://custom_sett ---- +.. _class_ProjectSettings_property_application/config/quit_on_go_back: + +.. rst-class:: classref-property + +:ref:`bool` **application/config/quit_on_go_back** = ``true`` + +If ``true``, the application quits automatically when navigating back (e.g. using the system "Back" button on Android). + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_application/config/use_custom_user_dir: .. rst-class:: classref-property @@ -1721,6 +1875,18 @@ Amount of sleeping between frames when the low-processor usage mode is enabled ( ---- +.. _class_ProjectSettings_property_application/run/main_loop_type: + +.. rst-class:: classref-property + +:ref:`String` **application/run/main_loop_type** = ``"SceneTree"`` + +The name of the type implementing the engine's main loop. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_application/run/main_scene: .. rst-class:: classref-property @@ -2263,6 +2429,18 @@ When set to ``warn`` or ``error``, produces a warning or an error respectively w ---- +.. _class_ProjectSettings_property_debug/gdscript/warnings/redundant_static_unload: + +.. rst-class:: classref-property + +:ref:`int` **debug/gdscript/warnings/redundant_static_unload** = ``1`` + +When set to ``warn`` or ``error``, produces a warning or an error respectively when the ``@static_unload`` annotation is used in a script without any static variables. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_debug/gdscript/warnings/renamed_in_godot_4_hint: .. rst-class:: classref-property @@ -2611,25 +2789,265 @@ Print more information to standard output when running. It displays information ---- -.. _class_ProjectSettings_property_debug/shapes/collision/contact_color: +.. _class_ProjectSettings_property_debug/shader_language/warnings/device_limit_exceeded: .. rst-class:: classref-property -:ref:`Color` **debug/shapes/collision/contact_color** = ``Color(1, 0.2, 0.1, 0.8)`` +:ref:`bool` **debug/shader_language/warnings/device_limit_exceeded** = ``true`` -Color of the contact points between collision shapes, visible when "Visible Collision Shapes" is enabled in the Debug menu. +When set to ``true``, produces a warning when the shader exceeds certain device limits. Currently, the only device limit checked is the limit on uniform buffer size. More device limits will be added in the future. .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_debug/shapes/collision/draw_2d_outlines: +.. _class_ProjectSettings_property_debug/shader_language/warnings/enable: .. rst-class:: classref-property -:ref:`bool` **debug/shapes/collision/draw_2d_outlines** = ``true`` +:ref:`bool` **debug/shader_language/warnings/enable** = ``true`` -Sets whether 2D physics will display collision outlines in game when "Visible Collision Shapes" is enabled in the Debug menu. +If ``true``, enables specific shader warnings (see ``debug/shader_language/warnings/*`` settings). If ``false``, disables all shader warnings. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/float_comparison: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/float_comparison** = ``true`` + +When set to ``true``, produces a warning when two floating point numbers are compared directly with the ``==`` operator or the ``!=`` operator. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/formatting_error: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/formatting_error** = ``true`` + +When set to ``true``, produces a warning upon encountering certain formatting errors. Currently this only checks for empty statements. More formatting errors may be added over time. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/treat_warnings_as_errors: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/treat_warnings_as_errors** = ``false`` + +When set to ``true``, warnings are treated as errors. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/unused_constant: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/unused_constant** = ``true`` + +When set to ``true``, produces a warning when a constant is never used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/unused_function: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/unused_function** = ``true`` + +When set to ``true``, produces a warning when a function is never used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/unused_local_variable: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/unused_local_variable** = ``true`` + +When set to ``true``, produces a warning when a local variable is never used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/unused_struct: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/unused_struct** = ``true`` + +When set to ``true``, produces a warning when a struct is never used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/unused_uniform: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/unused_uniform** = ``true`` + +When set to ``true``, produces a warning when a uniform is never used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shader_language/warnings/unused_varying: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shader_language/warnings/unused_varying** = ``true`` + +When set to ``true``, produces a warning when a varying is never used. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/agents_radius_color: + +.. rst-class:: classref-property + +:ref:`Color` **debug/shapes/avoidance/agents_radius_color** = ``Color(1, 1, 0, 0.25)`` + +Color of the avoidance agents radius, visible when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/enable_agents_radius: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shapes/avoidance/enable_agents_radius** = ``true`` + +If enabled, displays avoidance agents radius when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/enable_obstacles_radius: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shapes/avoidance/enable_obstacles_radius** = ``true`` + +If enabled, displays avoidance obstacles radius when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/enable_obstacles_static: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shapes/avoidance/enable_obstacles_static** = ``true`` + +If enabled, displays static avoidance obstacles when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/obstacles_radius_color: + +.. rst-class:: classref-property + +:ref:`Color` **debug/shapes/avoidance/obstacles_radius_color** = ``Color(1, 0.5, 0, 0.25)`` + +Color of the avoidance obstacles radius, visible when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/obstacles_static_edge_pushin_color: + +.. rst-class:: classref-property + +:ref:`Color` **debug/shapes/avoidance/obstacles_static_edge_pushin_color** = ``Color(1, 0, 0, 1)`` + +Color of the static avoidance obstacles edges when their vertices are winded in order to push agents in, visible when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/obstacles_static_edge_pushout_color: + +.. rst-class:: classref-property + +:ref:`Color` **debug/shapes/avoidance/obstacles_static_edge_pushout_color** = ``Color(1, 1, 0, 1)`` + +Color of the static avoidance obstacles edges when their vertices are winded in order to push agents out, visible when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/obstacles_static_face_pushin_color: + +.. rst-class:: classref-property + +:ref:`Color` **debug/shapes/avoidance/obstacles_static_face_pushin_color** = ``Color(1, 0, 0, 0)`` + +Color of the static avoidance obstacles faces when their vertices are winded in order to push agents in, visible when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/avoidance/obstacles_static_face_pushout_color: + +.. rst-class:: classref-property + +:ref:`Color` **debug/shapes/avoidance/obstacles_static_face_pushout_color** = ``Color(1, 1, 0, 0.5)`` + +Color of the static avoidance obstacles faces when their vertices are winded in order to push agents out, visible when "Visible Avoidance" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/collision/contact_color: + +.. rst-class:: classref-property + +:ref:`Color` **debug/shapes/collision/contact_color** = ``Color(1, 0.2, 0.1, 0.8)`` + +Color of the contact points between collision shapes, visible when "Visible Collision Shapes" is enabled in the Debug menu. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_debug/shapes/collision/draw_2d_outlines: + +.. rst-class:: classref-property + +:ref:`bool` **debug/shapes/collision/draw_2d_outlines** = ``true`` + +Sets whether 2D physics will display collision outlines in game when "Visible Collision Shapes" is enabled in the Debug menu. .. rst-class:: classref-item-separator @@ -3239,6 +3657,60 @@ On desktop platforms, overrides the game's initial window width. See also :ref:` ---- +.. _class_ProjectSettings_property_display/window/stretch/aspect: + +.. rst-class:: classref-property + +:ref:`String` **display/window/stretch/aspect** = ``"keep"`` + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_display/window/stretch/mode: + +.. rst-class:: classref-property + +:ref:`String` **display/window/stretch/mode** = ``"disabled"`` + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_display/window/stretch/scale: + +.. rst-class:: classref-property + +:ref:`float` **display/window/stretch/scale** = ``1.0`` + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_display/window/subwindows/embed_subwindows: + +.. rst-class:: classref-property + +:ref:`bool` **display/window/subwindows/embed_subwindows** = ``true`` + +If ``true`` subwindows are embedded in the main window. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_display/window/vsync/vsync_mode: .. rst-class:: classref-property @@ -3285,65 +3757,105 @@ Changing this value allows setting up a multi-project scenario where there are m ---- -.. _class_ProjectSettings_property_editor/movie_writer/disable_vsync: +.. _class_ProjectSettings_property_editor/export/convert_text_resources_to_binary: .. rst-class:: classref-property -:ref:`bool` **editor/movie_writer/disable_vsync** = ``false`` +:ref:`bool` **editor/export/convert_text_resources_to_binary** = ``true`` -If ``true``, requests V-Sync to be disabled when writing a movie (similar to setting :ref:`display/window/vsync/vsync_mode` to **Disabled**). This can speed up video writing if the hardware is fast enough to render, encode and save the video at a framerate higher than the monitor's refresh rate. +If ``true``, text resources are converted to a binary format on export. This decreases file sizes and speeds up loading slightly. -\ **Note:** :ref:`editor/movie_writer/disable_vsync` has no effect if the operating system or graphics driver forces V-Sync with no way for applications to disable it. +\ **Note:** If :ref:`editor/export/convert_text_resources_to_binary` is ``true``, :ref:`@GDScript.load` will not be able to return the converted files in an exported project. Some file paths within the exported PCK will also change, such as ``project.godot`` becoming ``project.binary``. If you rely on run-time loading of files present within the PCK, set :ref:`editor/export/convert_text_resources_to_binary` to ``false``. .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_editor/movie_writer/fps: +.. _class_ProjectSettings_property_editor/import/reimport_missing_imported_files: .. rst-class:: classref-property -:ref:`int` **editor/movie_writer/fps** = ``60`` +:ref:`bool` **editor/import/reimport_missing_imported_files** = ``true`` -The number of frames per second to record in the video when writing a movie. Simulation speed will adjust to always match the specified framerate, which means the engine will appear to run slower at higher :ref:`editor/movie_writer/fps` values. Certain FPS values will require you to adjust :ref:`editor/movie_writer/mix_rate` to prevent audio from desynchronizing over time. +.. container:: contribute -This can be specified manually on the command line using the ``--fixed-fps `` :doc:`command line argument <../tutorials/editor/command_line_tutorial>`. + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_editor/movie_writer/mix_rate: +.. _class_ProjectSettings_property_editor/import/use_multiple_threads: .. rst-class:: classref-property -:ref:`int` **editor/movie_writer/mix_rate** = ``48000`` +:ref:`bool` **editor/import/use_multiple_threads** = ``true`` -The audio mix rate to use in the recorded audio when writing a movie (in Hz). This can be different from :ref:`audio/driver/mix_rate`, but this value must be divisible by :ref:`editor/movie_writer/fps` to prevent audio from desynchronizing over time. +If ``true`` importing of resources is run on multiple threads. .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_editor/movie_writer/mjpeg_quality: +.. _class_ProjectSettings_property_editor/movie_writer/disable_vsync: .. rst-class:: classref-property -:ref:`float` **editor/movie_writer/mjpeg_quality** = ``0.75`` +:ref:`bool` **editor/movie_writer/disable_vsync** = ``false`` -The JPEG quality to use when writing a video to an AVI file, between ``0.01`` and ``1.0`` (inclusive). Higher ``quality`` values result in better-looking output at the cost of larger file sizes. Recommended ``quality`` values are between ``0.75`` and ``0.9``. Even at quality ``1.0``, JPEG compression remains lossy. +If ``true``, requests V-Sync to be disabled when writing a movie (similar to setting :ref:`display/window/vsync/vsync_mode` to **Disabled**). This can speed up video writing if the hardware is fast enough to render, encode and save the video at a framerate higher than the monitor's refresh rate. -\ **Note:** This does not affect the audio quality or writing PNG image sequences. +\ **Note:** :ref:`editor/movie_writer/disable_vsync` has no effect if the operating system or graphics driver forces V-Sync with no way for applications to disable it. .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_editor/movie_writer/movie_file: +.. _class_ProjectSettings_property_editor/movie_writer/fps: .. rst-class:: classref-property -:ref:`String` **editor/movie_writer/movie_file** = ``""`` +:ref:`int` **editor/movie_writer/fps** = ``60`` + +The number of frames per second to record in the video when writing a movie. Simulation speed will adjust to always match the specified framerate, which means the engine will appear to run slower at higher :ref:`editor/movie_writer/fps` values. Certain FPS values will require you to adjust :ref:`editor/movie_writer/mix_rate` to prevent audio from desynchronizing over time. + +This can be specified manually on the command line using the ``--fixed-fps `` :doc:`command line argument <../tutorials/editor/command_line_tutorial>`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_editor/movie_writer/mix_rate: + +.. rst-class:: classref-property + +:ref:`int` **editor/movie_writer/mix_rate** = ``48000`` + +The audio mix rate to use in the recorded audio when writing a movie (in Hz). This can be different from :ref:`audio/driver/mix_rate`, but this value must be divisible by :ref:`editor/movie_writer/fps` to prevent audio from desynchronizing over time. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_editor/movie_writer/mjpeg_quality: + +.. rst-class:: classref-property + +:ref:`float` **editor/movie_writer/mjpeg_quality** = ``0.75`` + +The JPEG quality to use when writing a video to an AVI file, between ``0.01`` and ``1.0`` (inclusive). Higher ``quality`` values result in better-looking output at the cost of larger file sizes. Recommended ``quality`` values are between ``0.75`` and ``0.9``. Even at quality ``1.0``, JPEG compression remains lossy. + +\ **Note:** This does not affect the audio quality or writing PNG image sequences. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_editor/movie_writer/movie_file: + +.. rst-class:: classref-property + +:ref:`String` **editor/movie_writer/movie_file** = ``""`` The output path for the movie. The file extension determines the :ref:`MovieWriter` that will be used. @@ -3421,6 +3933,18 @@ What to use to separate node name from number. This is mostly an editor setting. ---- +.. _class_ProjectSettings_property_editor/naming/scene_name_casing: + +.. rst-class:: classref-property + +:ref:`int` **editor/naming/scene_name_casing** = ``2`` + +When generating file names from scene root node, set the type of casing in this project. This is mostly an editor setting. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_editor/run/main_run_args: .. rst-class:: classref-property @@ -3465,6 +3989,34 @@ Search path for project-specific script templates. Godot will search for script ---- +.. _class_ProjectSettings_property_editor/version_control/autoload_on_startup: + +.. rst-class:: classref-property + +:ref:`bool` **editor/version_control/autoload_on_startup** = ``false`` + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_editor/version_control/plugin_name: + +.. rst-class:: classref-property + +:ref:`String` **editor/version_control/plugin_name** = ``""`` + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_filesystem/import/blender/enabled: .. rst-class:: classref-property @@ -3553,6 +4105,18 @@ Default value for :ref:`ScrollContainer.scroll_deadzone` **gui/common/snap_controls_to_pixels** = ``true`` + +If ``true``, snaps :ref:`Control` node vertices to the nearest pixel to ensure they remain crisp even when the camera moves or zooms. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_gui/common/swap_cancel_ok: .. rst-class:: classref-property @@ -3579,6 +4143,20 @@ Maximum undo/redo history size for :ref:`TextEdit` fields. ---- +.. _class_ProjectSettings_property_gui/fonts/dynamic_fonts/use_oversampling: + +.. rst-class:: classref-property + +:ref:`bool` **gui/fonts/dynamic_fonts/use_oversampling** = ``true`` + +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_gui/theme/custom: .. rst-class:: classref-property @@ -4205,7 +4783,7 @@ macOS specific override for the shortcut to add a caret below every caret. :ref:`Dictionary` **input/ui_text_caret_document_end** -Default :ref:`InputEventAction` to move the text cursor the the end of the text. +Default :ref:`InputEventAction` to move the text cursor to the end of the text. \ **Note:** Default ``ui_*`` actions cannot be removed as they are necessary for the internal logic of several :ref:`Control`\ s. The events assigned to the action can however be modified. @@ -4889,30 +5467,6 @@ If non-empty, this locale will be used when running the project from the editor. ---- -.. _class_ProjectSettings_property_internationalization/locale/translation_remaps: - -.. rst-class:: classref-property - -:ref:`PackedStringArray` **internationalization/locale/translation_remaps** - -Locale-dependent resource remaps. Edit them in the "Localization" tab of Project Settings editor. - -.. rst-class:: classref-item-separator - ----- - -.. _class_ProjectSettings_property_internationalization/locale/translations: - -.. rst-class:: classref-property - -:ref:`PackedStringArray` **internationalization/locale/translations** - -List of translation files available in the project. Edit them in the "Localization" tab of Project Settings editor. - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_internationalization/pseudolocalization/double_vowels: .. rst-class:: classref-property @@ -5029,7 +5583,19 @@ If ``true``, enables pseudolocalization for the project. This can be used to spo :ref:`bool` **internationalization/rendering/force_right_to_left_layout_direction** = ``false`` -Force layout direction and text writing direction to RTL for all locales. +Force layout direction and text writing direction to RTL for all controls. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_internationalization/rendering/root_node_layout_direction: + +.. rst-class:: classref-property + +:ref:`int` **internationalization/rendering/root_node_layout_direction** = ``0`` + +Root node default layout direction. .. rst-class:: classref-item-separator @@ -5065,6 +5631,102 @@ Optional name for the 2D navigation layer 1. If left empty, the layer will displ ---- +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_2: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_2** = ``""`` + +Optional name for the 2D navigation layer 2. If left empty, the layer will display as "Layer 2". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_3: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_3** = ``""`` + +Optional name for the 2D navigation layer 3. If left empty, the layer will display as "Layer 3". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_4: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_4** = ``""`` + +Optional name for the 2D navigation layer 4. If left empty, the layer will display as "Layer 4". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_5: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_5** = ``""`` + +Optional name for the 2D navigation layer 5. If left empty, the layer will display as "Layer 5". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_6: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_6** = ``""`` + +Optional name for the 2D navigation layer 6. If left empty, the layer will display as "Layer 6". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_7: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_7** = ``""`` + +Optional name for the 2D navigation layer 7. If left empty, the layer will display as "Layer 7". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_8: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_8** = ``""`` + +Optional name for the 2D navigation layer 8. If left empty, the layer will display as "Layer 8". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_9: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_navigation/layer_9** = ``""`` + +Optional name for the 2D navigation layer 9. If left empty, the layer will display as "Layer 9". + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_layer_names/2d_navigation/layer_10: .. rst-class:: classref-property @@ -5185,18 +5847,6 @@ Optional name for the 2D navigation layer 19. If left empty, the layer will disp ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_2: - -.. rst-class:: classref-property - -:ref:`String` **layer_names/2d_navigation/layer_2** = ``""`` - -Optional name for the 2D navigation layer 2. If left empty, the layer will display as "Layer 2". - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_layer_names/2d_navigation/layer_20: .. rst-class:: classref-property @@ -5317,18 +5967,6 @@ Optional name for the 2D navigation layer 29. If left empty, the layer will disp ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_3: - -.. rst-class:: classref-property - -:ref:`String` **layer_names/2d_navigation/layer_3** = ``""`` - -Optional name for the 2D navigation layer 3. If left empty, the layer will display as "Layer 3". - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_layer_names/2d_navigation/layer_30: .. rst-class:: classref-property @@ -5365,85 +6003,109 @@ Optional name for the 2D navigation layer 32. If left empty, the layer will disp ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_4: +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_1: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_navigation/layer_4** = ``""`` +:ref:`String` **layer_names/2d_physics/layer_1** = ``""`` -Optional name for the 2D navigation layer 4. If left empty, the layer will display as "Layer 4". +Optional name for the 2D physics layer 1. If left empty, the layer will display as "Layer 1". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_5: +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_2: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_navigation/layer_5** = ``""`` +:ref:`String` **layer_names/2d_physics/layer_2** = ``""`` -Optional name for the 2D navigation layer 5. If left empty, the layer will display as "Layer 5". +Optional name for the 2D physics layer 2. If left empty, the layer will display as "Layer 2". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_6: +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_3: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_navigation/layer_6** = ``""`` +:ref:`String` **layer_names/2d_physics/layer_3** = ``""`` -Optional name for the 2D navigation layer 6. If left empty, the layer will display as "Layer 6". +Optional name for the 2D physics layer 3. If left empty, the layer will display as "Layer 3". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_7: +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_4: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_navigation/layer_7** = ``""`` +:ref:`String` **layer_names/2d_physics/layer_4** = ``""`` -Optional name for the 2D navigation layer 7. If left empty, the layer will display as "Layer 7". +Optional name for the 2D physics layer 4. If left empty, the layer will display as "Layer 4". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_8: +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_5: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_navigation/layer_8** = ``""`` +:ref:`String` **layer_names/2d_physics/layer_5** = ``""`` -Optional name for the 2D navigation layer 8. If left empty, the layer will display as "Layer 8". +Optional name for the 2D physics layer 5. If left empty, the layer will display as "Layer 5". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_navigation/layer_9: +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_6: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_navigation/layer_9** = ``""`` +:ref:`String` **layer_names/2d_physics/layer_6** = ``""`` -Optional name for the 2D navigation layer 9. If left empty, the layer will display as "Layer 9". +Optional name for the 2D physics layer 6. If left empty, the layer will display as "Layer 6". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_1: +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_7: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_physics/layer_1** = ``""`` +:ref:`String` **layer_names/2d_physics/layer_7** = ``""`` -Optional name for the 2D physics layer 1. If left empty, the layer will display as "Layer 1". +Optional name for the 2D physics layer 7. If left empty, the layer will display as "Layer 7". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_8: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_physics/layer_8** = ``""`` + +Optional name for the 2D physics layer 8. If left empty, the layer will display as "Layer 8". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_physics/layer_9: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_physics/layer_9** = ``""`` + +Optional name for the 2D physics layer 9. If left empty, the layer will display as "Layer 9". .. rst-class:: classref-item-separator @@ -5569,18 +6231,6 @@ Optional name for the 2D physics layer 19. If left empty, the layer will display ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_2: - -.. rst-class:: classref-property - -:ref:`String` **layer_names/2d_physics/layer_2** = ``""`` - -Optional name for the 2D physics layer 2. If left empty, the layer will display as "Layer 2". - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_layer_names/2d_physics/layer_20: .. rst-class:: classref-property @@ -5701,18 +6351,6 @@ Optional name for the 2D physics layer 29. If left empty, the layer will display ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_3: - -.. rst-class:: classref-property - -:ref:`String` **layer_names/2d_physics/layer_3** = ``""`` - -Optional name for the 2D physics layer 3. If left empty, the layer will display as "Layer 3". - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_layer_names/2d_physics/layer_30: .. rst-class:: classref-property @@ -5749,85 +6387,109 @@ Optional name for the 2D physics layer 32. If left empty, the layer will display ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_4: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_1: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_physics/layer_4** = ``""`` +:ref:`String` **layer_names/2d_render/layer_1** = ``""`` -Optional name for the 2D physics layer 4. If left empty, the layer will display as "Layer 4". +Optional name for the 2D render layer 1. If left empty, the layer will display as "Layer 1". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_5: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_2: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_physics/layer_5** = ``""`` +:ref:`String` **layer_names/2d_render/layer_2** = ``""`` -Optional name for the 2D physics layer 5. If left empty, the layer will display as "Layer 5". +Optional name for the 2D render layer 2. If left empty, the layer will display as "Layer 2". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_6: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_3: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_physics/layer_6** = ``""`` +:ref:`String` **layer_names/2d_render/layer_3** = ``""`` -Optional name for the 2D physics layer 6. If left empty, the layer will display as "Layer 6". +Optional name for the 2D render layer 3. If left empty, the layer will display as "Layer 3". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_7: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_4: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_physics/layer_7** = ``""`` +:ref:`String` **layer_names/2d_render/layer_4** = ``""`` -Optional name for the 2D physics layer 7. If left empty, the layer will display as "Layer 7". +Optional name for the 2D render layer 4. If left empty, the layer will display as "Layer 4". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_8: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_5: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_physics/layer_8** = ``""`` +:ref:`String` **layer_names/2d_render/layer_5** = ``""`` -Optional name for the 2D physics layer 8. If left empty, the layer will display as "Layer 8". +Optional name for the 2D render layer 5. If left empty, the layer will display as "Layer 5". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_physics/layer_9: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_6: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_physics/layer_9** = ``""`` +:ref:`String` **layer_names/2d_render/layer_6** = ``""`` -Optional name for the 2D physics layer 9. If left empty, the layer will display as "Layer 9". +Optional name for the 2D render layer 6. If left empty, the layer will display as "Layer 6". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_1: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_7: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_1** = ``""`` +:ref:`String` **layer_names/2d_render/layer_7** = ``""`` -Optional name for the 2D render layer 1. If left empty, the layer will display as "Layer 1". +Optional name for the 2D render layer 7. If left empty, the layer will display as "Layer 7". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_render/layer_8: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_render/layer_8** = ``""`` + +Optional name for the 2D render layer 8. If left empty, the layer will display as "Layer 8". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/2d_render/layer_9: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/2d_render/layer_9** = ``""`` + +Optional name for the 2D render layer 9. If left empty, the layer will display as "Layer 9". .. rst-class:: classref-item-separator @@ -5953,121 +6615,121 @@ Optional name for the 2D render layer 19. If left empty, the layer will display ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_2: +.. _class_ProjectSettings_property_layer_names/2d_render/layer_20: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_2** = ``""`` +:ref:`String` **layer_names/2d_render/layer_20** = ``""`` -Optional name for the 2D render layer 2. If left empty, the layer will display as "Layer 2". +Optional name for the 2D render layer 20. If left empty, the layer will display as "Layer 20". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_20: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_1: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_20** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_1** = ``""`` -Optional name for the 2D render layer 20. If left empty, the layer will display as "Layer 20". +Optional name for the 3D navigation layer 1. If left empty, the layer will display as "Layer 1". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_3: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_2: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_3** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_2** = ``""`` -Optional name for the 2D render layer 3. If left empty, the layer will display as "Layer 3". +Optional name for the 3D navigation layer 2. If left empty, the layer will display as "Layer 2". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_4: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_3: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_4** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_3** = ``""`` -Optional name for the 2D render layer 4. If left empty, the layer will display as "Layer 4". +Optional name for the 3D navigation layer 3. If left empty, the layer will display as "Layer 3". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_5: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_4: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_5** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_4** = ``""`` -Optional name for the 2D render layer 5. If left empty, the layer will display as "Layer 5". +Optional name for the 3D navigation layer 4. If left empty, the layer will display as "Layer 4". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_6: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_5: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_6** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_5** = ``""`` -Optional name for the 2D render layer 6. If left empty, the layer will display as "Layer 6". +Optional name for the 3D navigation layer 5. If left empty, the layer will display as "Layer 5". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_7: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_6: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_7** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_6** = ``""`` -Optional name for the 2D render layer 7. If left empty, the layer will display as "Layer 7". +Optional name for the 3D navigation layer 6. If left empty, the layer will display as "Layer 6". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_8: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_7: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_8** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_7** = ``""`` -Optional name for the 2D render layer 8. If left empty, the layer will display as "Layer 8". +Optional name for the 3D navigation layer 7. If left empty, the layer will display as "Layer 7". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/2d_render/layer_9: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_8: .. rst-class:: classref-property -:ref:`String` **layer_names/2d_render/layer_9** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_8** = ``""`` -Optional name for the 2D render layer 9. If left empty, the layer will display as "Layer 9". +Optional name for the 3D navigation layer 8. If left empty, the layer will display as "Layer 8". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_1: +.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_9: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_navigation/layer_1** = ``""`` +:ref:`String` **layer_names/3d_navigation/layer_9** = ``""`` -Optional name for the 3D navigation layer 1. If left empty, the layer will display as "Layer 1". +Optional name for the 3D navigation layer 9. If left empty, the layer will display as "Layer 9". .. rst-class:: classref-item-separator @@ -6193,18 +6855,6 @@ Optional name for the 3D navigation layer 19. If left empty, the layer will disp ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_2: - -.. rst-class:: classref-property - -:ref:`String` **layer_names/3d_navigation/layer_2** = ``""`` - -Optional name for the 3D navigation layer 2. If left empty, the layer will display as "Layer 2". - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_layer_names/3d_navigation/layer_20: .. rst-class:: classref-property @@ -6325,18 +6975,6 @@ Optional name for the 3D navigation layer 29. If left empty, the layer will disp ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_3: - -.. rst-class:: classref-property - -:ref:`String` **layer_names/3d_navigation/layer_3** = ``""`` - -Optional name for the 3D navigation layer 3. If left empty, the layer will display as "Layer 3". - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_layer_names/3d_navigation/layer_30: .. rst-class:: classref-property @@ -6373,85 +7011,109 @@ Optional name for the 3D navigation layer 32. If left empty, the layer will disp ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_4: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_1: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_navigation/layer_4** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_1** = ``""`` -Optional name for the 3D navigation layer 4. If left empty, the layer will display as "Layer 4". +Optional name for the 3D physics layer 1. If left empty, the layer will display as "Layer 1". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_5: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_2: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_navigation/layer_5** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_2** = ``""`` -Optional name for the 3D navigation layer 5. If left empty, the layer will display as "Layer 5". +Optional name for the 3D physics layer 2. If left empty, the layer will display as "Layer 2". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_6: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_3: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_navigation/layer_6** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_3** = ``""`` -Optional name for the 3D navigation layer 6. If left empty, the layer will display as "Layer 6". +Optional name for the 3D physics layer 3. If left empty, the layer will display as "Layer 3". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_7: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_4: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_navigation/layer_7** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_4** = ``""`` -Optional name for the 3D navigation layer 7. If left empty, the layer will display as "Layer 7". +Optional name for the 3D physics layer 4. If left empty, the layer will display as "Layer 4". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_8: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_5: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_navigation/layer_8** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_5** = ``""`` -Optional name for the 3D navigation layer 8. If left empty, the layer will display as "Layer 8". +Optional name for the 3D physics layer 5. If left empty, the layer will display as "Layer 5". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_navigation/layer_9: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_6: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_navigation/layer_9** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_6** = ``""`` -Optional name for the 3D navigation layer 9. If left empty, the layer will display as "Layer 9". +Optional name for the 3D physics layer 6. If left empty, the layer will display as "Layer 6". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_1: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_7: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_1** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_7** = ``""`` -Optional name for the 3D physics layer 1. If left empty, the layer will display as "Layer 1". +Optional name for the 3D physics layer 7. If left empty, the layer will display as "Layer 7". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_8: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_8** = ``""`` + +Optional name for the 3D physics layer 8. If left empty, the layer will display as "Layer 8". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_9: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_9** = ``""`` + +Optional name for the 3D physics layer 9. If left empty, the layer will display as "Layer 9". .. rst-class:: classref-item-separator @@ -6577,503 +7239,791 @@ Optional name for the 3D physics layer 19. If left empty, the layer will display ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_2: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_20: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_2** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_20** = ``""`` -Optional name for the 3D physics layer 2. If left empty, the layer will display as "Layer 2". +Optional name for the 3D physics layer 20. If left empty, the layer will display as "Layer 20". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_20: +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_21: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_20** = ``""`` +:ref:`String` **layer_names/3d_physics/layer_21** = ``""`` -Optional name for the 3D physics layer 20. If left empty, the layer will display as "Layer 20". +Optional name for the 3D physics layer 21. If left empty, the layer will display as "Layer 21". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_22: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_22** = ``""`` + +Optional name for the 3D physics layer 22. If left empty, the layer will display as "Layer 22". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_23: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_23** = ``""`` + +Optional name for the 3D physics layer 23. If left empty, the layer will display as "Layer 23". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_24: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_24** = ``""`` + +Optional name for the 3D physics layer 24. If left empty, the layer will display as "Layer 24". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_25: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_25** = ``""`` + +Optional name for the 3D physics layer 25. If left empty, the layer will display as "Layer 25". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_26: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_26** = ``""`` + +Optional name for the 3D physics layer 26. If left empty, the layer will display as "Layer 26". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_27: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_27** = ``""`` + +Optional name for the 3D physics layer 27. If left empty, the layer will display as "Layer 27". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_28: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_28** = ``""`` + +Optional name for the 3D physics layer 28. If left empty, the layer will display as "Layer 28". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_29: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_29** = ``""`` + +Optional name for the 3D physics layer 29. If left empty, the layer will display as "Layer 29". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_30: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_30** = ``""`` + +Optional name for the 3D physics layer 30. If left empty, the layer will display as "Layer 30". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_31: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_31** = ``""`` + +Optional name for the 3D physics layer 31. If left empty, the layer will display as "Layer 31". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_physics/layer_32: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_physics/layer_32** = ``""`` + +Optional name for the 3D physics layer 32. If left empty, the layer will display as "Layer 32". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_1: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_1** = ``""`` + +Optional name for the 3D render layer 1. If left empty, the layer will display as "Layer 1". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_2: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_2** = ``""`` + +Optional name for the 3D render layer 2. If left empty, the layer will display as "Layer 2". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_3: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_3** = ``""`` + +Optional name for the 3D render layer 3. If left empty, the layer will display as "Layer 3". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_4: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_4** = ``""`` + +Optional name for the 3D render layer 4. If left empty, the layer will display as "Layer 4". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_5: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_5** = ``""`` + +Optional name for the 3D render layer 5. If left empty, the layer will display as "Layer 5". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_6: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_6** = ``""`` + +Optional name for the 3D render layer 6. If left empty, the layer will display as "Layer 6". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_7: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_7** = ``""`` + +Optional name for the 3D render layer 7. If left empty, the layer will display as "Layer 7". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_8: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_8** = ``""`` + +Optional name for the 3D render layer 8. If left empty, the layer will display as "Layer 8". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_9: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_9** = ``""`` + +Optional name for the 3D render layer 9. If left empty, the layer will display as "Layer 9". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_10: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_10** = ``""`` + +Optional name for the 3D render layer 10. If left empty, the layer will display as "Layer 10". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_11: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_11** = ``""`` + +Optional name for the 3D render layer 11. If left empty, the layer will display as "Layer 11". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_12: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_12** = ``""`` + +Optional name for the 3D render layer 12. If left empty, the layer will display as "Layer 12". + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_layer_names/3d_render/layer_13: + +.. rst-class:: classref-property + +:ref:`String` **layer_names/3d_render/layer_13** = ``""`` + +Optional name for the 3D render layer 13. If left empty, the layer will display as "Layer 13". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_21: +.. _class_ProjectSettings_property_layer_names/3d_render/layer_14: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_21** = ``""`` +:ref:`String` **layer_names/3d_render/layer_14** = ``""`` -Optional name for the 3D physics layer 21. If left empty, the layer will display as "Layer 21". +Optional name for the 3D render layer 14. If left empty, the layer will display as "Layer 14". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_22: +.. _class_ProjectSettings_property_layer_names/3d_render/layer_15: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_22** = ``""`` +:ref:`String` **layer_names/3d_render/layer_15** = ``""`` -Optional name for the 3D physics layer 22. If left empty, the layer will display as "Layer 22". +Optional name for the 3D render layer 15. If left empty, the layer will display as "Layer 15". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_23: +.. _class_ProjectSettings_property_layer_names/3d_render/layer_16: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_23** = ``""`` +:ref:`String` **layer_names/3d_render/layer_16** = ``""`` -Optional name for the 3D physics layer 23. If left empty, the layer will display as "Layer 23". +Optional name for the 3D render layer 16. If left empty, the layer will display as "Layer 16". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_24: +.. _class_ProjectSettings_property_layer_names/3d_render/layer_17: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_24** = ``""`` +:ref:`String` **layer_names/3d_render/layer_17** = ``""`` -Optional name for the 3D physics layer 24. If left empty, the layer will display as "Layer 24". +Optional name for the 3D render layer 17. If left empty, the layer will display as "Layer 17". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_25: +.. _class_ProjectSettings_property_layer_names/3d_render/layer_18: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_25** = ``""`` +:ref:`String` **layer_names/3d_render/layer_18** = ``""`` -Optional name for the 3D physics layer 25. If left empty, the layer will display as "Layer 25". +Optional name for the 3D render layer 18. If left empty, the layer will display as "Layer 18". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_26: +.. _class_ProjectSettings_property_layer_names/3d_render/layer_19: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_26** = ``""`` +:ref:`String` **layer_names/3d_render/layer_19** = ``""`` -Optional name for the 3D physics layer 26. If left empty, the layer will display as "Layer 26". +Optional name for the 3D render layer 19. If left empty, the layer will display as "Layer 19". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_27: +.. _class_ProjectSettings_property_layer_names/3d_render/layer_20: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_27** = ``""`` +:ref:`String` **layer_names/3d_render/layer_20** = ``""`` -Optional name for the 3D physics layer 27. If left empty, the layer will display as "Layer 27". +Optional name for the 3D render layer 20. If left empty, the layer will display as "Layer 20". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_28: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_1: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_28** = ``""`` +:ref:`String` **layer_names/avoidance/layer_1** = ``""`` -Optional name for the 3D physics layer 28. If left empty, the layer will display as "Layer 28". +Optional name for the navigation avoidance layer 1. If left empty, the layer will display as "Layer 1". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_29: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_2: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_29** = ``""`` +:ref:`String` **layer_names/avoidance/layer_2** = ``""`` -Optional name for the 3D physics layer 29. If left empty, the layer will display as "Layer 29". +Optional name for the navigation avoidance layer 2. If left empty, the layer will display as "Layer 2". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_3: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_3: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_3** = ``""`` +:ref:`String` **layer_names/avoidance/layer_3** = ``""`` -Optional name for the 3D physics layer 3. If left empty, the layer will display as "Layer 3". +Optional name for the navigation avoidance layer 3. If left empty, the layer will display as "Layer 3". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_30: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_4: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_30** = ``""`` +:ref:`String` **layer_names/avoidance/layer_4** = ``""`` -Optional name for the 3D physics layer 30. If left empty, the layer will display as "Layer 30". +Optional name for the navigation avoidance layer 4. If left empty, the layer will display as "Layer 4". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_31: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_5: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_31** = ``""`` +:ref:`String` **layer_names/avoidance/layer_5** = ``""`` -Optional name for the 3D physics layer 31. If left empty, the layer will display as "Layer 31". +Optional name for the navigation avoidance layer 5. If left empty, the layer will display as "Layer 5". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_32: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_6: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_32** = ``""`` +:ref:`String` **layer_names/avoidance/layer_6** = ``""`` -Optional name for the 3D physics layer 32. If left empty, the layer will display as "Layer 32". +Optional name for the navigation avoidance layer 6. If left empty, the layer will display as "Layer 6". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_4: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_7: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_4** = ``""`` +:ref:`String` **layer_names/avoidance/layer_7** = ``""`` -Optional name for the 3D physics layer 4. If left empty, the layer will display as "Layer 4". +Optional name for the navigation avoidance layer 7. If left empty, the layer will display as "Layer 7". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_5: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_8: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_5** = ``""`` +:ref:`String` **layer_names/avoidance/layer_8** = ``""`` -Optional name for the 3D physics layer 5. If left empty, the layer will display as "Layer 5". +Optional name for the navigation avoidance layer 8. If left empty, the layer will display as "Layer 8". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_6: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_9: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_6** = ``""`` +:ref:`String` **layer_names/avoidance/layer_9** = ``""`` -Optional name for the 3D physics layer 6. If left empty, the layer will display as "Layer 6". +Optional name for the navigation avoidance layer 9. If left empty, the layer will display as "Layer 9". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_7: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_10: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_7** = ``""`` +:ref:`String` **layer_names/avoidance/layer_10** = ``""`` -Optional name for the 3D physics layer 7. If left empty, the layer will display as "Layer 7". +Optional name for the navigation avoidance layer 10. If left empty, the layer will display as "Layer 10". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_8: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_11: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_8** = ``""`` +:ref:`String` **layer_names/avoidance/layer_11** = ``""`` -Optional name for the 3D physics layer 8. If left empty, the layer will display as "Layer 8". +Optional name for the navigation avoidance layer 11. If left empty, the layer will display as "Layer 11". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_physics/layer_9: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_12: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_physics/layer_9** = ``""`` +:ref:`String` **layer_names/avoidance/layer_12** = ``""`` -Optional name for the 3D physics layer 9. If left empty, the layer will display as "Layer 9". +Optional name for the navigation avoidance layer 12. If left empty, the layer will display as "Layer 12". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_1: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_13: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_1** = ``""`` +:ref:`String` **layer_names/avoidance/layer_13** = ``""`` -Optional name for the 3D render layer 1. If left empty, the layer will display as "Layer 1". +Optional name for the navigation avoidance layer 13. If left empty, the layer will display as "Layer 13". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_10: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_14: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_10** = ``""`` +:ref:`String` **layer_names/avoidance/layer_14** = ``""`` -Optional name for the 3D render layer 10. If left empty, the layer will display as "Layer 10". +Optional name for the navigation avoidance layer 14. If left empty, the layer will display as "Layer 14". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_11: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_15: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_11** = ``""`` +:ref:`String` **layer_names/avoidance/layer_15** = ``""`` -Optional name for the 3D render layer 11. If left empty, the layer will display as "Layer 11". +Optional name for the navigation avoidance layer 15. If left empty, the layer will display as "Layer 15". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_12: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_16: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_12** = ``""`` +:ref:`String` **layer_names/avoidance/layer_16** = ``""`` -Optional name for the 3D render layer 12. If left empty, the layer will display as "Layer 12". +Optional name for the navigation avoidance layer 16. If left empty, the layer will display as "Layer 16". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_13: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_17: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_13** = ``""`` +:ref:`String` **layer_names/avoidance/layer_17** = ``""`` -Optional name for the 3D render layer 13. If left empty, the layer will display as "Layer 13". +Optional name for the navigation avoidance layer 17. If left empty, the layer will display as "Layer 17". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_14: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_18: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_14** = ``""`` +:ref:`String` **layer_names/avoidance/layer_18** = ``""`` -Optional name for the 3D render layer 14. If left empty, the layer will display as "Layer 14". +Optional name for the navigation avoidance layer 18. If left empty, the layer will display as "Layer 18". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_15: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_19: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_15** = ``""`` +:ref:`String` **layer_names/avoidance/layer_19** = ``""`` -Optional name for the 3D render layer 15. If left empty, the layer will display as "Layer 15". +Optional name for the navigation avoidance layer 19. If left empty, the layer will display as "Layer 19". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_16: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_20: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_16** = ``""`` +:ref:`String` **layer_names/avoidance/layer_20** = ``""`` -Optional name for the 3D render layer 16. If left empty, the layer will display as "Layer 16". +Optional name for the navigation avoidance layer 20. If left empty, the layer will display as "Layer 20". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_17: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_21: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_17** = ``""`` +:ref:`String` **layer_names/avoidance/layer_21** = ``""`` -Optional name for the 3D render layer 17. If left empty, the layer will display as "Layer 17". +Optional name for the navigation avoidance layer 21. If left empty, the layer will display as "Layer 21". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_18: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_22: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_18** = ``""`` +:ref:`String` **layer_names/avoidance/layer_22** = ``""`` -Optional name for the 3D render layer 18. If left empty, the layer will display as "Layer 18". +Optional name for the navigation avoidance layer 22. If left empty, the layer will display as "Layer 22". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_19: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_23: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_19** = ``""`` +:ref:`String` **layer_names/avoidance/layer_23** = ``""`` -Optional name for the 3D render layer 19. If left empty, the layer will display as "Layer 19". +Optional name for the navigation avoidance layer 23. If left empty, the layer will display as "Layer 23". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_2: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_24: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_2** = ``""`` +:ref:`String` **layer_names/avoidance/layer_24** = ``""`` -Optional name for the 3D render layer 2. If left empty, the layer will display as "Layer 2". +Optional name for the navigation avoidance layer 24. If left empty, the layer will display as "Layer 24". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_20: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_25: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_20** = ``""`` +:ref:`String` **layer_names/avoidance/layer_25** = ``""`` -Optional name for the 3D render layer 20. If left empty, the layer will display as "Layer 20". +Optional name for the navigation avoidance layer 25. If left empty, the layer will display as "Layer 25". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_3: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_26: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_3** = ``""`` +:ref:`String` **layer_names/avoidance/layer_26** = ``""`` -Optional name for the 3D render layer 3. If left empty, the layer will display as "Layer 3". +Optional name for the navigation avoidance layer 26. If left empty, the layer will display as "Layer 26". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_4: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_27: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_4** = ``""`` +:ref:`String` **layer_names/avoidance/layer_27** = ``""`` -Optional name for the 3D render layer 4. If left empty, the layer will display as "Layer 4". +Optional name for the navigation avoidance layer 27. If left empty, the layer will display as "Layer 27". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_5: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_28: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_5** = ``""`` +:ref:`String` **layer_names/avoidance/layer_28** = ``""`` -Optional name for the 3D render layer 5. If left empty, the layer will display as "Layer 5". +Optional name for the navigation avoidance layer 28. If left empty, the layer will display as "Layer 28". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_6: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_29: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_6** = ``""`` +:ref:`String` **layer_names/avoidance/layer_29** = ``""`` -Optional name for the 3D render layer 6. If left empty, the layer will display as "Layer 6". +Optional name for the navigation avoidance layer 29. If left empty, the layer will display as "Layer 29". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_7: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_30: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_7** = ``""`` +:ref:`String` **layer_names/avoidance/layer_30** = ``""`` -Optional name for the 3D render layer 7. If left empty, the layer will display as "Layer 7". +Optional name for the navigation avoidance layer 30. If left empty, the layer will display as "Layer 30". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_8: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_31: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_8** = ``""`` +:ref:`String` **layer_names/avoidance/layer_31** = ``""`` -Optional name for the 3D render layer 8. If left empty, the layer will display as "Layer 8". +Optional name for the navigation avoidance layer 31. If left empty, the layer will display as "Layer 31". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_layer_names/3d_render/layer_9: +.. _class_ProjectSettings_property_layer_names/avoidance/layer_32: .. rst-class:: classref-property -:ref:`String` **layer_names/3d_render/layer_9** = ``""`` +:ref:`String` **layer_names/avoidance/layer_32** = ``""`` -Optional name for the 3D render layer 9. If left empty, the layer will display as "Layer 9". +Optional name for the navigation avoidance layer 32. If left empty, the layer will display as "Layer 32". .. rst-class:: classref-item-separator ---- -.. _class_ProjectSettings_property_memory/limits/message_queue/max_size_kb: +.. _class_ProjectSettings_property_memory/limits/message_queue/max_size_mb: .. rst-class:: classref-property -:ref:`int` **memory/limits/message_queue/max_size_kb** = ``4096`` +:ref:`int` **memory/limits/message_queue/max_size_mb** = ``32`` Godot uses a message queue to defer some function calls. If you run out of space on it (you will see an error), you can increase the size here. @@ -7129,6 +8079,18 @@ Default link connection radius for 2D navigation maps. See :ref:`NavigationServe ---- +.. _class_ProjectSettings_property_navigation/2d/use_edge_connections: + +.. rst-class:: classref-property + +:ref:`bool` **navigation/2d/use_edge_connections** = ``true`` + +If enabled 2D navigation regions will use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. This setting only affects World2D default navigation maps. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_navigation/3d/default_cell_size: .. rst-class:: classref-property @@ -7165,6 +8127,42 @@ Default link connection radius for 3D navigation maps. See :ref:`NavigationServe ---- +.. _class_ProjectSettings_property_navigation/3d/use_edge_connections: + +.. rst-class:: classref-property + +:ref:`bool` **navigation/3d/use_edge_connections** = ``true`` + +If enabled 3D navigation regions will use edge connections to connect with other navigation regions within proximity of the navigation map edge connection margin. This setting only affects World3D default navigation maps. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_navigation/avoidance/thread_model/avoidance_use_high_priority_threads: + +.. rst-class:: classref-property + +:ref:`bool` **navigation/avoidance/thread_model/avoidance_use_high_priority_threads** = ``true`` + +If enabled and avoidance calculations use multiple threads the threads run with high priority. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_navigation/avoidance/thread_model/avoidance_use_multiple_threads: + +.. rst-class:: classref-property + +:ref:`bool` **navigation/avoidance/thread_model/avoidance_use_multiple_threads** = ``true`` + +If enabled the avoidance calculations use multiple threads. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_network/limits/debugger/max_chars_per_second: .. rst-class:: classref-property @@ -7249,30 +8247,6 @@ Maximum size (in kiB) for the :ref:`WebRTCDataChannel` ---- -.. _class_ProjectSettings_property_network/remote_fs/page_read_ahead: - -.. rst-class:: classref-property - -:ref:`int` **network/remote_fs/page_read_ahead** = ``4`` - -Amount of read ahead used by remote filesystem. Higher values decrease the effects of latency at the cost of higher bandwidth usage. - -.. rst-class:: classref-item-separator - ----- - -.. _class_ProjectSettings_property_network/remote_fs/page_size: - -.. rst-class:: classref-property - -:ref:`int` **network/remote_fs/page_size** = ``65536`` - -Page size used by remote filesystem (in bytes). - -.. rst-class:: classref-item-separator - ----- - .. _class_ProjectSettings_property_network/tls/certificate_bundle_override: .. rst-class:: classref-property @@ -7785,9 +8759,11 @@ The number of fixed iterations per second. This controls how often physics simul :ref:`int` **rendering/2d/sdf/oversize** = ``1`` -.. container:: contribute +Controls how much of the original viewport size should be covered by the 2D signed distance field. This SDF can be sampled in :ref:`CanvasItem` shaders and is used for :ref:`GPUParticles2D` collision. Higher values allow portions of occluders located outside the viewport to still be taken into account in the generated signed distance field, at the cost of performance. If you notice particles falling through :ref:`LightOccluder2D`\ s as the occluders leave the viewport, increase this setting. - There is currently no description for this property. Please help us by :ref:`contributing one `! +The percentage specified is added on each axis and on both sides. For example, with the default setting of 120%, the signed distance field will cover 20% of the viewport's size outside the viewport on each side (top, right, bottom, left). + +\ **Note:** This property is only read when the project starts. To change the 2D SDF oversizing percentage at runtime, use :ref:`RenderingServer.viewport_set_sdf_oversize_and_scale` instead. .. rst-class:: classref-item-separator @@ -7799,9 +8775,9 @@ The number of fixed iterations per second. This controls how often physics simul :ref:`int` **rendering/2d/sdf/scale** = ``1`` -.. container:: contribute +The resolution scale to use for the 2D signed distance field. Higher values lead to a more precise and more stable signed distance field as the camera moves, at the cost of performance. The default value (50%) renders at half the resolution of the viewport size on each axis, which means the SDF is generated with 25% of the viewport's pixel count. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This property is only read when the project starts. To change the 2D SDF resolution scale at runtime, use :ref:`RenderingServer.viewport_set_sdf_oversize_and_scale` instead. .. rst-class:: classref-item-separator @@ -7813,9 +8789,9 @@ The number of fixed iterations per second. This controls how often physics simul :ref:`int` **rendering/2d/shadow_atlas/size** = ``2048`` -.. container:: contribute +The size of the 2D shadow atlas in pixels. Higher values result in more precise :ref:`Light2D` shadows, at the cost of performance and video memory usage. The specified value is rounded up to the nearest power of 2. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This property is only read when the project starts. To change the 2D shadow atlas size at runtime, use :ref:`RenderingServer.canvas_set_shadow_texture_size` instead. .. rst-class:: classref-item-separator @@ -7827,9 +8803,11 @@ The number of fixed iterations per second. This controls how often physics simul :ref:`bool` **rendering/2d/snap/snap_2d_transforms_to_pixel** = ``false`` -.. container:: contribute +If ``true``, :ref:`CanvasItem` nodes will internally snap to full pixels. Their position can still be sub-pixel, but the decimals will not have effect. This can lead to a crisper appearance at the cost of less smooth movement, especially when :ref:`Camera2D` smoothing is enabled. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This property is only read when the project starts. To toggle 2D transform snapping at runtime, use :ref:`RenderingServer.viewport_set_snap_2d_transforms_to_pixel` on the root :ref:`Viewport` instead. + +\ **Note:** :ref:`Control` nodes are snapped to the nearest pixel by default. This is controlled by :ref:`gui/common/snap_controls_to_pixels`. .. rst-class:: classref-item-separator @@ -7841,9 +8819,11 @@ The number of fixed iterations per second. This controls how often physics simul :ref:`bool` **rendering/2d/snap/snap_2d_vertices_to_pixel** = ``false`` -.. container:: contribute +If ``true``, vertices of :ref:`CanvasItem` nodes will snap to full pixels. Only affects the final vertex positions, not the transforms. This can lead to a crisper appearance at the cost of less smooth movement, especially when :ref:`Camera2D` smoothing is enabled. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This property is only read when the project starts. To toggle 2D vertex snapping at runtime, use :ref:`RenderingServer.viewport_set_snap_2d_vertices_to_pixel` on the root :ref:`Viewport` instead. + +\ **Note:** :ref:`Control` nodes are snapped to the nearest pixel by default. This is controlled by :ref:`gui/common/snap_controls_to_pixels`. .. rst-class:: classref-item-separator @@ -7855,7 +8835,7 @@ The number of fixed iterations per second. This controls how often physics simul :ref:`int` **rendering/anti_aliasing/quality/msaa_2d** = ``0`` -Sets the number of MSAA samples to use for 2D/Canvas rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware. This has no effect on shader-induced aliasing or texture aliasing. +Sets the number of MSAA samples to use for 2D/Canvas rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware, especially integrated graphics due to their limited memory bandwidth. This has no effect on shader-induced aliasing or texture aliasing. \ **Note:** MSAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. @@ -7869,7 +8849,7 @@ Sets the number of MSAA samples to use for 2D/Canvas rendering (as a power of tw :ref:`int` **rendering/anti_aliasing/quality/msaa_3d** = ``0`` -Sets the number of MSAA samples to use for 3D rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware. See also bilinear scaling 3d :ref:`rendering/scaling_3d/mode` for supersampling, which provides higher quality but is much more expensive. This has no effect on shader-induced aliasing or texture aliasing. +Sets the number of MSAA samples to use for 3D rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware, especially integrated graphics due to their limited memory bandwidth. See also :ref:`rendering/scaling_3d/mode` for supersampling, which provides higher quality but is much more expensive. This has no effect on shader-induced aliasing or texture aliasing. \ **Note:** MSAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. @@ -7931,9 +8911,7 @@ Enables Temporal Anti-Aliasing for the default screen :ref:`Viewport` **rendering/anti_aliasing/screen_space_roughness_limiter/amount** = ``0.25`` -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +**Note:** This property is only read when the project starts. To control the screen-space roughness limiter at runtime, call :ref:`RenderingServer.screen_space_roughness_limiter_set_active` instead. .. rst-class:: classref-item-separator @@ -7947,7 +8925,9 @@ Enables Temporal Anti-Aliasing for the default screen :ref:`Viewport`. This filter has a small performance cost, so consider disabling it if it doesn't benefit your scene noticeably. -\ **Note:** TAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. +\ **Note:** The screen-space roughness limiter is only supported in the Forward+ and Mobile rendering methods, not Compatibility. + +\ **Note:** This property is only read when the project starts. To control the screen-space roughness limiter at runtime, call :ref:`RenderingServer.screen_space_roughness_limiter_set_active` instead. .. rst-class:: classref-item-separator @@ -7959,9 +8939,7 @@ If ``true``, enables a spatial filter to limit roughness in areas with high-freq :ref:`float` **rendering/anti_aliasing/screen_space_roughness_limiter/limit** = ``0.18`` -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +**Note:** This property is only read when the project starts. To control the screen-space roughness limiter at runtime, call :ref:`RenderingServer.screen_space_roughness_limiter_set_active` instead. .. rst-class:: classref-item-separator @@ -8251,7 +9229,9 @@ Sets the quality of the screen-space indirect lighting effect. Higher values tak :ref:`float` **rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale** = ``0.01`` -Scales the depth over which the subsurface scattering effect is applied. A high value may allow light to scatter into a part of the mesh or another mesh that is close in screen space but far in depth. +Scales the depth over which the subsurface scattering effect is applied. A high value may allow light to scatter into a part of the mesh or another mesh that is close in screen space but far in depth. See also :ref:`rendering/environment/subsurface_scattering/subsurface_scattering_scale`. + +\ **Note:** This property is only read when the project starts. To set the subsurface scattering depth scale at runtime, call :ref:`RenderingServer.sub_surface_scattering_set_scale` instead. .. rst-class:: classref-item-separator @@ -8263,7 +9243,9 @@ Scales the depth over which the subsurface scattering effect is applied. A high :ref:`int` **rendering/environment/subsurface_scattering/subsurface_scattering_quality** = ``1`` -Sets the quality of the subsurface scattering effect. Higher values are slower but look nicer. +Sets the quality of the subsurface scattering effect. Higher values are slower but look nicer. This affects the rendering of materials that have :ref:`BaseMaterial3D.subsurf_scatter_enabled` set to ``true``, along with :ref:`ShaderMaterial`\ s that set ``SSS_STRENGTH``. + +\ **Note:** This property is only read when the project starts. To set the subsurface scattering quality at runtime, call :ref:`RenderingServer.sub_surface_scattering_set_quality` instead. .. rst-class:: classref-item-separator @@ -8275,7 +9257,9 @@ Sets the quality of the subsurface scattering effect. Higher values are slower b :ref:`float` **rendering/environment/subsurface_scattering/subsurface_scattering_scale** = ``0.05`` -Scales the distance over which samples are taken for subsurface scattering effect. Changing this does not impact performance, but higher values will result in significant artifacts as the samples will become obviously spread out. A lower value results in a smaller spread of scattered light. +Scales the distance over which samples are taken for subsurface scattering effect. Changing this does not impact performance, but higher values will result in significant artifacts as the samples will become obviously spread out. A lower value results in a smaller spread of scattered light. See also :ref:`rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale`. + +\ **Note:** This property is only read when the project starts. To set the subsurface scattering scale at runtime, call :ref:`RenderingServer.sub_surface_scattering_set_scale` instead. .. rst-class:: classref-item-separator @@ -8433,9 +9417,9 @@ If ``true``, renders :ref:`VoxelGI` and SDFGI (:ref:`Environment. :ref:`int` **rendering/global_illumination/sdfgi/frames_to_converge** = ``5`` -.. container:: contribute +The number of frames to use for converging signed distance field global illumination. Higher values lead to a less noisy result, at the cost of taking a longer time to fully converge. This means the scene's global illumination will be too dark for a longer period of time, especially when the camera moves fast. The actual convergence speed depends on rendered framerate. For example, with the default setting of 30 frames, rendering at 60 FPS will make SDFGI fully converge after 0.5 seconds. See also :ref:`rendering/global_illumination/sdfgi/frames_to_update_lights` and :ref:`rendering/global_illumination/sdfgi/probe_ray_count`. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This property is only read when the project starts. To control SDFGI convergence speed at runtime, call :ref:`RenderingServer.environment_set_sdfgi_frames_to_converge` instead. .. rst-class:: classref-item-separator @@ -8447,9 +9431,11 @@ If ``true``, renders :ref:`VoxelGI` and SDFGI (:ref:`Environment. :ref:`int` **rendering/global_illumination/sdfgi/frames_to_update_lights** = ``2`` -.. container:: contribute +The number of frames over which dynamic lights should be updated in signed distance field global illumination. Higher values take more time to update indirect lighting coming from dynamic lights, but result in better performance when many dynamic lights are present. See also :ref:`rendering/global_illumination/sdfgi/frames_to_converge` and :ref:`rendering/global_illumination/sdfgi/probe_ray_count`. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This only affects :ref:`Light3D` nodes whose :ref:`Light3D.light_bake_mode` is :ref:`Light3D.BAKE_DYNAMIC` (which is the default). Consider making non-moving lights use the :ref:`Light3D.BAKE_STATIC` bake mode to improve performance. + +\ **Note:** This property is only read when the project starts. To control SDFGI light update speed at runtime, call :ref:`RenderingServer.environment_set_sdfgi_frames_to_update_light` instead. .. rst-class:: classref-item-separator @@ -8461,9 +9447,9 @@ If ``true``, renders :ref:`VoxelGI` and SDFGI (:ref:`Environment. :ref:`int` **rendering/global_illumination/sdfgi/probe_ray_count** = ``1`` -.. container:: contribute +The number of rays to throw per frame when computing signed distance field global illumination. Higher values lead to a less noisy result, at the cost of performance. See also :ref:`rendering/global_illumination/sdfgi/frames_to_converge` and :ref:`rendering/global_illumination/sdfgi/frames_to_update_lights`. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This property is only read when the project starts. To control SDFGI quality at runtime, call :ref:`RenderingServer.environment_set_sdfgi_ray_count` instead. .. rst-class:: classref-item-separator @@ -8475,9 +9461,9 @@ If ``true``, renders :ref:`VoxelGI` and SDFGI (:ref:`Environment. :ref:`int` **rendering/global_illumination/voxel_gi/quality** = ``0`` -.. container:: contribute +The VoxelGI quality to use. High quality leads to more precise lighting and better reflections, but is slower to render. This setting does not affect the baked data and doesn't require baking the :ref:`VoxelGI` again to apply. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** This property is only read when the project starts. To control VoxelGI quality at runtime, call :ref:`RenderingServer.voxel_gi_set_quality` instead. .. rst-class:: classref-item-separator @@ -8645,7 +9631,7 @@ The framerate-independent update speed when representing dynamic object lighting :ref:`bool` **rendering/lights_and_shadows/directional_shadow/16_bits** = ``true`` -Use 16 bits for shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. +Use 16 bits for the directional shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. .. rst-class:: classref-item-separator @@ -8657,7 +9643,7 @@ Use 16 bits for shadow depth map. Enabling this results in shadows having less p :ref:`int` **rendering/lights_and_shadows/directional_shadow/size** = ``4096`` -The directional shadow's size in pixels. Higher values will result in sharper shadows, at the cost of performance. The value will be rounded up to the nearest power of 2. +The directional shadow's size in pixels. Higher values will result in sharper shadows, at the cost of performance. The value is rounded up to the nearest power of 2. .. rst-class:: classref-item-separator @@ -8709,7 +9695,7 @@ Lower-end override for :ref:`rendering/lights_and_shadows/directional_shadow/sof :ref:`bool` **rendering/lights_and_shadows/positional_shadow/atlas_16_bits** = ``true`` -Use 16 bits for shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. +Use 16 bits for the omni/spot shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. .. rst-class:: classref-item-separator @@ -8977,7 +9963,9 @@ The automatic LOD bias to use for meshes rendered within the :ref:`ReflectionPro :ref:`int` **rendering/occlusion_culling/bvh_build_quality** = ``2`` -The `BVH `__ quality to use when rendering the occlusion culling buffer. Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. +The `Bounding Volume Hierarchy `__ quality to use when rendering the occlusion culling buffer. Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. See also :ref:`rendering/occlusion_culling/occlusion_rays_per_thread`. + +\ **Note:** This property is only read when the project starts. To adjust the BVH build quality at runtime, use :ref:`RenderingServer.viewport_set_occlusion_culling_build_quality`. .. rst-class:: classref-item-separator @@ -8989,7 +9977,9 @@ The `BVH `__ quality to :ref:`int` **rendering/occlusion_culling/occlusion_rays_per_thread** = ``512`` -Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. The occlusion culling buffer's pixel count is roughly equal to ``occlusion_rays_per_thread * number_of_logical_cpu_cores``, so it will depend on the system's CPU. Therefore, CPUs with fewer cores will use a lower resolution to attempt keeping performance costs even across devices. +The number of occlusion rays traced per CPU thread. Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. The occlusion culling buffer's pixel count is roughly equal to ``occlusion_rays_per_thread * number_of_logical_cpu_cores``, so it will depend on the system's CPU. Therefore, CPUs with fewer cores will use a lower resolution to attempt keeping performance costs even across devices. See also :ref:`rendering/occlusion_culling/bvh_build_quality`. + +\ **Note:** This property is only read when the project starts. To adjust the number of occlusion rays traced per thread at runtime, use :ref:`RenderingServer.viewport_set_occlusion_rays_per_thread`. .. rst-class:: classref-item-separator @@ -9445,6 +10435,30 @@ Lower-end override for :ref:`rendering/shading/overrides/force_vertex_shading` **rendering/textures/canvas_textures/default_texture_filter** = ``1`` + +The default texture filtering mode to use on :ref:`CanvasItem`\ s. + +.. rst-class:: classref-item-separator + +---- + +.. _class_ProjectSettings_property_rendering/textures/canvas_textures/default_texture_repeat: + +.. rst-class:: classref-property + +:ref:`int` **rendering/textures/canvas_textures/default_texture_repeat** = ``0`` + +The default texture repeating mode to use on :ref:`CanvasItem`\ s. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_rendering/textures/decals/filter: .. rst-class:: classref-property @@ -9551,7 +10565,7 @@ If ``true``, the texture importer will import VRAM-compressed textures using the :ref:`bool` **rendering/textures/vram_compression/import_s3tc_bptc** -If ``true``, the texture importer will import VRAM-compressed textures using the S3 Texture Compression algorithm (DXT1-5) for lower quality textures and the the BPTC algorithm (BC6H and BC7) for high quality textures. This algorithm is only supported on PC desktop platforms and consoles. +If ``true``, the texture importer will import VRAM-compressed textures using the S3 Texture Compression algorithm (DXT1-5) for lower quality textures and the BPTC algorithm (BC6H and BC7) for high quality textures. This algorithm is only supported on PC desktop platforms and consoles. \ **Note:** Changing this setting does *not* impact textures that were already imported before. To make this setting apply to textures that were already imported, exit the editor, remove the ``.godot/imported/`` folder located inside the project folder then restart the editor (see :ref:`application/config/use_hidden_project_data_directory`). @@ -9654,9 +10668,7 @@ The texture *must* use a lossless compression format so that colors can be match :ref:`int` **threading/worker_pool/max_threads** = ``-1`` -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Maximum number of threads to be used by :ref:`WorkerThreadPool`. Value of ``-1`` means no limit. .. rst-class:: classref-item-separator @@ -9724,6 +10736,18 @@ Specify the default reference space. ---- +.. _class_ProjectSettings_property_xr/openxr/startup_alert: + +.. rst-class:: classref-property + +:ref:`bool` **xr/openxr/startup_alert** = ``true`` + +If ``true``, Godot will display an alert modal when OpenXR initialization fails on startup. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_xr/openxr/submit_depth_buffer: .. rst-class:: classref-property @@ -9773,11 +10797,11 @@ void **add_property_info** **(** :ref:`Dictionary` hint **)** Adds a custom property info to a property. The dictionary must contain: -- ``name``: :ref:`String` (the property's name) +- ``"name"``: :ref:`String` (the property's name) -- ``type``: :ref:`int` (see :ref:`Variant.Type`) +- ``"type"``: :ref:`int` (see :ref:`Variant.Type`) -- optionally ``hint``: :ref:`int` (see :ref:`PropertyHint`) and ``hint_string``: :ref:`String`\ +- optionally ``"hint"``: :ref:`int` (see :ref:`PropertyHint`) and ``"hint_string"``: :ref:`String`\ \ **Example:**\ diff --git a/classes/class_quaternion.rst b/classes/class_quaternion.rst index 6666ffb05b8..b865cd7ce3d 100644 --- a/classes/class_quaternion.rst +++ b/classes/class_quaternion.rst @@ -10,18 +10,18 @@ Quaternion ========== -Quaternion. +A unit quaternion used for representing 3D rotations. .. rst-class:: classref-introduction-group Description ----------- -A unit quaternion used for representing 3D rotations. Quaternions need to be normalized to be used for rotation. +Quaternions are similar to :ref:`Basis`, which implements the matrix representation of rotations. Unlike :ref:`Basis`, which stores rotation, scale, and shearing, quaternions only store rotation. -It is similar to Basis, which implements matrix representation of rotations, and can be parametrized using both an axis-angle pair or Euler angles. Basis stores rotation, scale, and shearing, while Quaternion only stores rotation. +Quaternions can be parametrized using both an axis-angle pair or Euler angles. Due to their compactness and the way they are stored in memory, certain operations (obtaining axis-angle and performing SLERP, in particular) are more efficient and robust against floating-point errors. -Due to its compactness and the way it is stored in memory, certain operations (obtaining axis-angle and performing SLERP, in particular) are more efficient and robust against floating-point errors. +\ **Note:** Quaternions need to be normalized before being used for rotation. .. rst-class:: classref-introduction-group @@ -269,9 +269,7 @@ Constructs a **Quaternion** as a copy of the given **Quaternion**. :ref:`Quaternion` **Quaternion** **(** :ref:`Vector3` arc_from, :ref:`Vector3` arc_to **)** -.. container:: contribute - - There is currently no description for this constructor. Please help us by :ref:`contributing one `! +Constructs a quaternion representing the shortest arc between two points on the surface of a sphere with a radius of ``1.0``. .. rst-class:: classref-item-separator diff --git a/classes/class_rdattachmentformat.rst b/classes/class_rdattachmentformat.rst index 698a1e77266..25ff27dd20b 100644 --- a/classes/class_rdattachmentformat.rst +++ b/classes/class_rdattachmentformat.rst @@ -12,9 +12,14 @@ RDAttachmentFormat **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Attachment format (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -52,9 +57,7 @@ Property Descriptions - void **set_format** **(** :ref:`DataFormat` value **)** - :ref:`DataFormat` **get_format** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The attachment's data format. .. rst-class:: classref-item-separator @@ -71,9 +74,7 @@ Property Descriptions - void **set_samples** **(** :ref:`TextureSamples` value **)** - :ref:`TextureSamples` **get_samples** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of samples used when sampling the attachment. .. rst-class:: classref-item-separator @@ -90,9 +91,7 @@ Property Descriptions - void **set_usage_flags** **(** :ref:`int` value **)** - :ref:`int` **get_usage_flags** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The attachment's usage flags, which determine what can be done with it. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdframebufferpass.rst b/classes/class_rdframebufferpass.rst index 5fbb6b71d5f..0f5069cfc6e 100644 --- a/classes/class_rdframebufferpass.rst +++ b/classes/class_rdframebufferpass.rst @@ -12,7 +12,7 @@ RDFramebufferPass **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Framebuffer pass attachment description. +Framebuffer pass attachment description (used by :ref:`RenderingDevice`). .. rst-class:: classref-introduction-group @@ -21,7 +21,9 @@ Description This class contains the list of attachment descriptions for a framebuffer pass. Each points with an index to a previously supplied list of texture attachments. -Multipass framebuffers can optimize some configurations in mobile, on desktop they provide little to no advantage. +Multipass framebuffers can optimize some configurations in mobile. On desktop, they provide little to no advantage. + +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -58,7 +60,7 @@ Constants **ATTACHMENT_UNUSED** = ``-1`` - +Attachment is unused. .. rst-class:: classref-section-separator diff --git a/classes/class_rdpipelinecolorblendstate.rst b/classes/class_rdpipelinecolorblendstate.rst index 05baa223108..ad95aa94fc5 100644 --- a/classes/class_rdpipelinecolorblendstate.rst +++ b/classes/class_rdpipelinecolorblendstate.rst @@ -12,9 +12,14 @@ RDPipelineColorBlendState **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Pipeline color blend state (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -54,9 +59,7 @@ Property Descriptions - void **set_attachments** **(** :ref:`RDPipelineColorBlendStateAttachment[]` value **)** - :ref:`RDPipelineColorBlendStateAttachment[]` **get_attachments** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The attachments that are blended together. .. rst-class:: classref-item-separator @@ -73,9 +76,7 @@ Property Descriptions - void **set_blend_constant** **(** :ref:`Color` value **)** - :ref:`Color` **get_blend_constant** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The constant color to blend with. See also :ref:`RenderingDevice.draw_list_set_blend_constants`. .. rst-class:: classref-item-separator @@ -92,9 +93,7 @@ Property Descriptions - void **set_enable_logic_op** **(** :ref:`bool` value **)** - :ref:`bool` **get_enable_logic_op** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, performs the logic operation defined in :ref:`logic_op`. .. rst-class:: classref-item-separator @@ -111,9 +110,7 @@ Property Descriptions - void **set_logic_op** **(** :ref:`LogicOperation` value **)** - :ref:`LogicOperation` **get_logic_op** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The logic operation to perform for blending. Only effective if :ref:`enable_logic_op` is ``true``. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdpipelinecolorblendstateattachment.rst b/classes/class_rdpipelinecolorblendstateattachment.rst index 0687b17dcf7..21056eae219 100644 --- a/classes/class_rdpipelinecolorblendstateattachment.rst +++ b/classes/class_rdpipelinecolorblendstateattachment.rst @@ -12,9 +12,81 @@ RDPipelineColorBlendStateAttachment **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Pipeline color blend state attachment (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +Controls how blending between source and destination fragments is performed when using :ref:`RenderingDevice`. + +For reference, this is how common user-facing blend modes are implemented in Godot's 2D renderer: + +\ **Mix:**\ + +:: + + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + +\ **Add:**\ + +:: + + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + +\ **Subtract:**\ + +:: + + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_SUBTRACT + attachment.color_blend_op = RenderingDevice.BLEND_OP_SUBTRACT + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + +\ **Multiply:**\ + +:: + + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_DST_COLOR + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ZERO + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_DST_ALPHA + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ZERO + +\ **Pre-multiplied alpha:**\ + +:: + + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA .. rst-class:: classref-reftable-group @@ -80,9 +152,7 @@ Property Descriptions - void **set_alpha_blend_op** **(** :ref:`BlendOperation` value **)** - :ref:`BlendOperation` **get_alpha_blend_op** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The blend mode to use for the alpha channel. .. rst-class:: classref-item-separator @@ -99,9 +169,7 @@ Property Descriptions - void **set_color_blend_op** **(** :ref:`BlendOperation` value **)** - :ref:`BlendOperation` **get_color_blend_op** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The blend mode to use for the red/green/blue color channels. .. rst-class:: classref-item-separator @@ -118,9 +186,7 @@ Property Descriptions - void **set_dst_alpha_blend_factor** **(** :ref:`BlendFactor` value **)** - :ref:`BlendFactor` **get_dst_alpha_blend_factor** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Controls how the blend factor for the alpha channel is determined based on the destination's fragments. .. rst-class:: classref-item-separator @@ -137,9 +203,7 @@ Property Descriptions - void **set_dst_color_blend_factor** **(** :ref:`BlendFactor` value **)** - :ref:`BlendFactor` **get_dst_color_blend_factor** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Controls how the blend factor for the color channels is determined based on the destination's fragments. .. rst-class:: classref-item-separator @@ -156,9 +220,7 @@ Property Descriptions - void **set_enable_blend** **(** :ref:`bool` value **)** - :ref:`bool` **get_enable_blend** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, performs blending between the source and destination according to the factors defined in :ref:`src_color_blend_factor`, :ref:`dst_color_blend_factor`, :ref:`src_alpha_blend_factor` and :ref:`dst_alpha_blend_factor`. The blend modes :ref:`color_blend_op` and :ref:`alpha_blend_op` are also taken into account, with :ref:`write_r`, :ref:`write_g`, :ref:`write_b` and :ref:`write_a` controlling the output. .. rst-class:: classref-item-separator @@ -175,9 +237,7 @@ Property Descriptions - void **set_src_alpha_blend_factor** **(** :ref:`BlendFactor` value **)** - :ref:`BlendFactor` **get_src_alpha_blend_factor** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Controls how the blend factor for the alpha channel is determined based on the source's fragments. .. rst-class:: classref-item-separator @@ -194,9 +254,7 @@ Property Descriptions - void **set_src_color_blend_factor** **(** :ref:`BlendFactor` value **)** - :ref:`BlendFactor` **get_src_color_blend_factor** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Controls how the blend factor for the color channels is determined based on the source's fragments. .. rst-class:: classref-item-separator @@ -213,9 +271,7 @@ Property Descriptions - void **set_write_a** **(** :ref:`bool` value **)** - :ref:`bool` **get_write_a** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, writes the new alpha channel to the final result. .. rst-class:: classref-item-separator @@ -232,9 +288,7 @@ Property Descriptions - void **set_write_b** **(** :ref:`bool` value **)** - :ref:`bool` **get_write_b** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, writes the new blue color channel to the final result. .. rst-class:: classref-item-separator @@ -251,9 +305,7 @@ Property Descriptions - void **set_write_g** **(** :ref:`bool` value **)** - :ref:`bool` **get_write_g** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, writes the new green color channel to the final result. .. rst-class:: classref-item-separator @@ -270,9 +322,7 @@ Property Descriptions - void **set_write_r** **(** :ref:`bool` value **)** - :ref:`bool` **get_write_r** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, writes the new red color channel to the final result. .. rst-class:: classref-section-separator @@ -289,9 +339,7 @@ Method Descriptions void **set_as_mix** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Convenience method to perform standard mix blending with straight (non-premultiplied) alpha. This sets :ref:`enable_blend` to ``true``, :ref:`src_color_blend_factor` to :ref:`RenderingDevice.BLEND_FACTOR_SRC_ALPHA`, :ref:`dst_color_blend_factor` to :ref:`RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA`, :ref:`src_alpha_blend_factor` to :ref:`RenderingDevice.BLEND_FACTOR_SRC_ALPHA` and :ref:`dst_alpha_blend_factor` to :ref:`RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA`. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdpipelinedepthstencilstate.rst b/classes/class_rdpipelinedepthstencilstate.rst index b73d92c14ac..223d67cd756 100644 --- a/classes/class_rdpipelinedepthstencilstate.rst +++ b/classes/class_rdpipelinedepthstencilstate.rst @@ -12,9 +12,14 @@ RDPipelineDepthStencilState **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Pipeline depth/stencil state (used by :ref:`RenderingDevice`). + +.. rst-class:: classref-introduction-group + +Description +----------- - There is currently no description for this class. Please help us by :ref:`contributing one `! +**RDPipelineDepthStencilState** controls the way depth and stencil comparisons are performed when sampling those values using :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -297,9 +302,7 @@ Property Descriptions - void **set_enable_depth_test** **(** :ref:`bool` value **)** - :ref:`bool` **get_enable_depth_test** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, enables depth testing which allows objects to be automatically occluded by other objects based on their depth. This also allows objects to be partially occluded by other objects. If ``false``, objects will appear in the order they were drawn (like in Godot's 2D renderer). .. rst-class:: classref-item-separator diff --git a/classes/class_rdpipelinemultisamplestate.rst b/classes/class_rdpipelinemultisamplestate.rst index 15d7ea30dec..11347140ccd 100644 --- a/classes/class_rdpipelinemultisamplestate.rst +++ b/classes/class_rdpipelinemultisamplestate.rst @@ -12,9 +12,14 @@ RDPipelineMultisampleState **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Pipeline multisample state (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +**RDPipelineMultisampleState** is used to control how multisample or supersample antialiasing is being performed when rendering using :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -58,9 +63,7 @@ Property Descriptions - void **set_enable_alpha_to_coverage** **(** :ref:`bool` value **)** - :ref:`bool` **get_enable_alpha_to_coverage** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, alpha to coverage is enabled. This generates a temporary coverage value based on the alpha component of the fragment's first color output. This allows alpha transparency to make use of multisample antialiasing. .. rst-class:: classref-item-separator @@ -77,9 +80,7 @@ Property Descriptions - void **set_enable_alpha_to_one** **(** :ref:`bool` value **)** - :ref:`bool` **get_enable_alpha_to_one** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, alpha is forced to either ``0.0`` or ``1.0``. This allows hardening the edges of antialiased alpha transparencies. Only relevant if :ref:`enable_alpha_to_coverage` is ``true``. .. rst-class:: classref-item-separator @@ -96,9 +97,7 @@ Property Descriptions - void **set_enable_sample_shading** **(** :ref:`bool` value **)** - :ref:`bool` **get_enable_sample_shading** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, enables per-sample shading which replaces MSAA by SSAA. This provides higher quality antialiasing that works with transparent (alpha scissor) edges. This has a very high performance cost. See also :ref:`min_sample_shading`. See the `per-sample shading Vulkan documentation `__ for more details. .. rst-class:: classref-item-separator @@ -115,9 +114,7 @@ Property Descriptions - void **set_min_sample_shading** **(** :ref:`float` value **)** - :ref:`float` **get_min_sample_shading** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The multiplier of :ref:`sample_count` that determines how many samples are performed for each fragment. Must be between ``0.0`` and ``1.0`` (inclusive). Only effective if :ref:`enable_sample_shading` is ``true``. If :ref:`min_sample_shading` is ``1.0``, fragment invocation must only read from the coverage index sample. Tile image access must not be used if :ref:`enable_sample_shading` is *not* ``1.0``. .. rst-class:: classref-item-separator @@ -134,9 +131,7 @@ Property Descriptions - void **set_sample_count** **(** :ref:`TextureSamples` value **)** - :ref:`TextureSamples` **get_sample_count** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of MSAA samples (or SSAA samples if :ref:`enable_sample_shading` is ``true``) to perform. Higher values result in better antialiasing, at the cost of performance. .. rst-class:: classref-item-separator @@ -153,9 +148,7 @@ Property Descriptions - void **set_sample_masks** **(** :ref:`int[]` value **)** - :ref:`int[]` **get_sample_masks** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The sampleSee the `sample mask Vulkan documentation `__ for more details. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdpipelinerasterizationstate.rst b/classes/class_rdpipelinerasterizationstate.rst index 4295a651afb..621bc13a2a2 100644 --- a/classes/class_rdpipelinerasterizationstate.rst +++ b/classes/class_rdpipelinerasterizationstate.rst @@ -12,9 +12,14 @@ RDPipelineRasterizationState **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Pipeline rasterization state (used by :ref:`RenderingDevice`). + +.. rst-class:: classref-introduction-group + +Description +----------- - There is currently no description for this class. Please help us by :ref:`contributing one `! +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -68,9 +73,7 @@ Property Descriptions - void **set_cull_mode** **(** :ref:`PolygonCullMode` value **)** - :ref:`PolygonCullMode` **get_cull_mode** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The cull mode to use when drawing polygons, which determines whether front faces or backfaces are hidden. .. rst-class:: classref-item-separator @@ -163,9 +166,7 @@ Property Descriptions - void **set_discard_primitives** **(** :ref:`bool` value **)** - :ref:`bool` **get_discard_primitives** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, primitives are discarded immediately before the rasterization stage. .. rst-class:: classref-item-separator @@ -201,9 +202,7 @@ Property Descriptions - void **set_front_face** **(** :ref:`PolygonFrontFace` value **)** - :ref:`PolygonFrontFace` **get_front_face** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The winding order to use to determine which face of a triangle is considered its front face. .. rst-class:: classref-item-separator @@ -220,9 +219,7 @@ Property Descriptions - void **set_line_width** **(** :ref:`float` value **)** - :ref:`float` **get_line_width** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +THe line width to use when drawing lines (in pixels). Thick lines may not be supported on all hardware. .. rst-class:: classref-item-separator @@ -239,9 +236,7 @@ Property Descriptions - void **set_patch_control_points** **(** :ref:`int` value **)** - :ref:`int` **get_patch_control_points** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of control points to use when drawing a patch with tessellation enabled. Higher values result in higher quality at the cost of performance. .. rst-class:: classref-item-separator @@ -258,9 +253,7 @@ Property Descriptions - void **set_wireframe** **(** :ref:`bool` value **)** - :ref:`bool` **get_wireframe** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, performs wireframe rendering for triangles instead of flat or textured rendering. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdpipelinespecializationconstant.rst b/classes/class_rdpipelinespecializationconstant.rst index 348458c5d27..615034b3e51 100644 --- a/classes/class_rdpipelinespecializationconstant.rst +++ b/classes/class_rdpipelinespecializationconstant.rst @@ -12,9 +12,16 @@ RDPipelineSpecializationConstant **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Pipeline specialization constant (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +A *specialization constant* is a way to create additional variants of shaders without actually increasing the number of shader versions that are compiled. This allows improving performance by reducing the number of shader versions and reducing ``if`` branching, while still allowing shaders to be flexible for different use cases. + +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -50,9 +57,7 @@ Property Descriptions - void **set_constant_id** **(** :ref:`int` value **)** - :ref:`int` **get_constant_id** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The identifier of the specialization constant. This is a value starting from ``0`` and that increments for every different specialization constant for a given shader. .. rst-class:: classref-item-separator @@ -69,9 +74,7 @@ Property Descriptions - void **set_value** **(** :ref:`Variant` value **)** - :ref:`Variant` **get_value** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The specialization constant's value. Only :ref:`bool`, :ref:`int` and :ref:`float` types are valid for specialization constants. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdsamplerstate.rst b/classes/class_rdsamplerstate.rst index df71f8253df..302c9aae380 100644 --- a/classes/class_rdsamplerstate.rst +++ b/classes/class_rdsamplerstate.rst @@ -12,9 +12,14 @@ RDSamplerState **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Sampler state (used by :ref:`RenderingDevice`). + +.. rst-class:: classref-introduction-group + +Description +----------- - There is currently no description for this class. Please help us by :ref:`contributing one `! +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -76,9 +81,9 @@ Property Descriptions - void **set_anisotropy_max** **(** :ref:`float` value **)** - :ref:`float` **get_anisotropy_max** **(** **)** -.. container:: contribute +Maximum anisotropy that can be used when sampling. Only effective if :ref:`use_anisotropy` is ``true``. Higher values result in a sharper sampler at oblique angles, at the cost of performance (due to memory bandwidth). This value may be limited by the graphics hardware in use. Most graphics hardware only supports values up to ``16.0``. - There is currently no description for this property. Please help us by :ref:`contributing one `! +If :ref:`anisotropy_max` is ``1.0``, forcibly disables anisotropy even if :ref:`use_anisotropy` is ``true``. .. rst-class:: classref-item-separator @@ -95,9 +100,7 @@ Property Descriptions - void **set_border_color** **(** :ref:`SamplerBorderColor` value **)** - :ref:`SamplerBorderColor` **get_border_color** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The border color that will be returned when sampling outside the sampler's bounds and the :ref:`repeat_u`, :ref:`repeat_v` or :ref:`repeat_w` modes have repeating disabled. .. rst-class:: classref-item-separator @@ -114,9 +117,7 @@ Property Descriptions - void **set_compare_op** **(** :ref:`CompareOperator` value **)** - :ref:`CompareOperator` **get_compare_op** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The compare operation to use. Only effective if :ref:`enable_compare` is ``true``. .. rst-class:: classref-item-separator @@ -133,9 +134,7 @@ Property Descriptions - void **set_enable_compare** **(** :ref:`bool` value **)** - :ref:`bool` **get_enable_compare** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, returned values will be based on the comparison operation defined in :ref:`compare_op`. This is a hardware-based approach and is therefore faster than performing this manually in a shader. For example, compare operations are used for shadow map rendering by comparing depth values from a shadow sampler. .. rst-class:: classref-item-separator @@ -152,9 +151,7 @@ Property Descriptions - void **set_lod_bias** **(** :ref:`float` value **)** - :ref:`float` **get_lod_bias** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The mipmap LOD bias to use. Positive values will make the sampler blurrier at a given distance, while negative values will make the sampler sharper at a given distance (at the risk of looking grainy). Recommended values are between ``-0.5`` and ``0.0``. Only effective if the sampler has mipmaps available. .. rst-class:: classref-item-separator @@ -171,9 +168,7 @@ Property Descriptions - void **set_mag_filter** **(** :ref:`SamplerFilter` value **)** - :ref:`SamplerFilter` **get_mag_filter** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The sampler's magnification filter. .. rst-class:: classref-item-separator @@ -190,9 +185,7 @@ Property Descriptions - void **set_max_lod** **(** :ref:`float` value **)** - :ref:`float` **get_max_lod** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The maximum mipmap LOD bias to display (lowest resolution). Only effective if the sampler has mipmaps available. .. rst-class:: classref-item-separator @@ -228,9 +221,7 @@ Property Descriptions - void **set_min_lod** **(** :ref:`float` value **)** - :ref:`float` **get_min_lod** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The minimum mipmap LOD bias to display (highest resolution). Only effective if the sampler has mipmaps available. .. rst-class:: classref-item-separator @@ -247,9 +238,7 @@ Property Descriptions - void **set_mip_filter** **(** :ref:`SamplerFilter` value **)** - :ref:`SamplerFilter` **get_mip_filter** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The filtering method to use for mipmaps. .. rst-class:: classref-item-separator @@ -266,9 +255,7 @@ Property Descriptions - void **set_repeat_u** **(** :ref:`SamplerRepeatMode` value **)** - :ref:`SamplerRepeatMode` **get_repeat_u** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The repeat mode to use along the U axis of UV coordinates. This affects the returned values if sampling outside the UV bounds. .. rst-class:: classref-item-separator @@ -285,9 +272,7 @@ Property Descriptions - void **set_repeat_v** **(** :ref:`SamplerRepeatMode` value **)** - :ref:`SamplerRepeatMode` **get_repeat_v** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The repeat mode to use along the V axis of UV coordinates. This affects the returned values if sampling outside the UV bounds. .. rst-class:: classref-item-separator @@ -304,9 +289,7 @@ Property Descriptions - void **set_repeat_w** **(** :ref:`SamplerRepeatMode` value **)** - :ref:`SamplerRepeatMode` **get_repeat_w** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The repeat mode to use along the W axis of UV coordinates. This affects the returned values if sampling outside the UV bounds. Only effective for 3D samplers. .. rst-class:: classref-item-separator @@ -342,9 +325,7 @@ Property Descriptions - void **set_use_anisotropy** **(** :ref:`bool` value **)** - :ref:`bool` **get_use_anisotropy** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +If ``true``, perform anisotropic sampling. See :ref:`anisotropy_max`. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdshaderfile.rst b/classes/class_rdshaderfile.rst index d3f01587400..819044324a2 100644 --- a/classes/class_rdshaderfile.rst +++ b/classes/class_rdshaderfile.rst @@ -12,9 +12,16 @@ RDShaderFile **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Compiled shader file in SPIR-V form (used by :ref:`RenderingDevice`). Not to be confused with Godot's own :ref:`Shader`. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +Compiled shader file in SPIR-V form. + +See also :ref:`RDShaderSource`. **RDShaderFile** is only meant to be used with the :ref:`RenderingDevice` API. It should not be confused with Godot's own :ref:`Shader` resource, which is what Godot's various nodes use for high-level shader programming. .. rst-class:: classref-reftable-group @@ -36,13 +43,13 @@ Methods .. table:: :widths: auto - +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RDShaderSPIRV` | :ref:`get_spirv` **(** :ref:`StringName` version=&"" **)** |const| | - +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`get_version_list` **(** **)** |const| | - +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_bytecode` **(** :ref:`RDShaderSPIRV` bytecode, :ref:`StringName` version=&"" **)** | - +---------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RDShaderSPIRV` | :ref:`get_spirv` **(** :ref:`StringName` version=&"" **)** |const| | + +-------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`StringName[]` | :ref:`get_version_list` **(** **)** |const| | + +-------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_bytecode` **(** :ref:`RDShaderSPIRV` bytecode, :ref:`StringName` version=&"" **)** | + +-------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -64,9 +71,7 @@ Property Descriptions - void **set_base_error** **(** :ref:`String` value **)** - :ref:`String` **get_base_error** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The base compilation error message, which indicates errors not related to a specific shader stage if non-empty. If empty, shader compilation is not necessarily successful (check :ref:`RDShaderSPIRV`'s error message members). .. rst-class:: classref-section-separator @@ -83,9 +88,7 @@ Method Descriptions :ref:`RDShaderSPIRV` **get_spirv** **(** :ref:`StringName` version=&"" **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the SPIR-V intermediate representation for the specified shader ``version``. .. rst-class:: classref-item-separator @@ -95,11 +98,9 @@ Method Descriptions .. rst-class:: classref-method -:ref:`PackedStringArray` **get_version_list** **(** **)** |const| - -.. container:: contribute +:ref:`StringName[]` **get_version_list** **(** **)** |const| - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the list of compiled versions for this shader. .. rst-class:: classref-item-separator @@ -111,9 +112,7 @@ Method Descriptions void **set_bytecode** **(** :ref:`RDShaderSPIRV` bytecode, :ref:`StringName` version=&"" **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the SPIR-V ``bytecode`` that will be compiled for the specified ``version``. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdshadersource.rst b/classes/class_rdshadersource.rst index a36cacd7ad2..5a165567323 100644 --- a/classes/class_rdshadersource.rst +++ b/classes/class_rdshadersource.rst @@ -12,9 +12,16 @@ RDShaderSource **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Shader source code (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +Shader source code in text form. + +See also :ref:`RDShaderFile`. **RDShaderSource** is only meant to be used with the :ref:`RenderingDevice` API. It should not be confused with Godot's own :ref:`Shader` resource, which is what Godot's various nodes use for high-level shader programming. .. rst-class:: classref-reftable-group @@ -72,9 +79,7 @@ Property Descriptions - void **set_language** **(** :ref:`ShaderLanguage` value **)** - :ref:`ShaderLanguage` **get_language** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The language the shader is written in. .. rst-class:: classref-item-separator @@ -91,9 +96,7 @@ Property Descriptions - void **set_stage_source** **(** :ref:`ShaderStage` stage, :ref:`String` source **)** - :ref:`String` **get_stage_source** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Source code for the shader's compute stage. .. rst-class:: classref-item-separator @@ -110,9 +113,7 @@ Property Descriptions - void **set_stage_source** **(** :ref:`ShaderStage` stage, :ref:`String` source **)** - :ref:`String` **get_stage_source** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Source code for the shader's fragment stage. .. rst-class:: classref-item-separator @@ -129,9 +130,7 @@ Property Descriptions - void **set_stage_source** **(** :ref:`ShaderStage` stage, :ref:`String` source **)** - :ref:`String` **get_stage_source** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Source code for the shader's tessellation control stage. .. rst-class:: classref-item-separator @@ -148,9 +147,7 @@ Property Descriptions - void **set_stage_source** **(** :ref:`ShaderStage` stage, :ref:`String` source **)** - :ref:`String` **get_stage_source** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Source code for the shader's tessellation evaluation stage. .. rst-class:: classref-item-separator @@ -167,9 +164,7 @@ Property Descriptions - void **set_stage_source** **(** :ref:`ShaderStage` stage, :ref:`String` source **)** - :ref:`String` **get_stage_source** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Source code for the shader's vertex stage. .. rst-class:: classref-section-separator @@ -186,9 +181,7 @@ Method Descriptions :ref:`String` **get_stage_source** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns source code for the specified shader ``stage``. Equivalent to getting one of :ref:`source_compute`, :ref:`source_fragment`, :ref:`source_tesselation_control`, :ref:`source_tesselation_evaluation` or :ref:`source_vertex`. .. rst-class:: classref-item-separator @@ -200,9 +193,7 @@ Method Descriptions void **set_stage_source** **(** :ref:`ShaderStage` stage, :ref:`String` source **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets ``source`` code for the specified shader ``stage``. Equivalent to setting one of :ref:`source_compute`, :ref:`source_fragment`, :ref:`source_tesselation_control`, :ref:`source_tesselation_evaluation` or :ref:`source_vertex`. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdshaderspirv.rst b/classes/class_rdshaderspirv.rst index 704dcaf4926..3ee7093db8c 100644 --- a/classes/class_rdshaderspirv.rst +++ b/classes/class_rdshaderspirv.rst @@ -12,9 +12,16 @@ RDShaderSPIRV **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +SPIR-V intermediate representation as part of a :ref:`RDShaderFile` (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +**RDShaderSPIRV** represents a :ref:`RDShaderFile`'s `SPIR-V `__ code for various shader stages, as well as possible compilation error messages. SPIR-V a low-level intermediate shader representation. This intermediate representation is not used directly by GPUs for rendering, but it can be compiled into binary shaders that GPUs can understand. Unlike compiled shaders, SPIR-V is portable across GPU models and driver versions. + +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -84,9 +91,7 @@ Property Descriptions - void **set_stage_bytecode** **(** :ref:`ShaderStage` stage, :ref:`PackedByteArray` bytecode **)** - :ref:`PackedByteArray` **get_stage_bytecode** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The SPIR-V bytecode for the compute shader stage. .. rst-class:: classref-item-separator @@ -103,9 +108,7 @@ Property Descriptions - void **set_stage_bytecode** **(** :ref:`ShaderStage` stage, :ref:`PackedByteArray` bytecode **)** - :ref:`PackedByteArray` **get_stage_bytecode** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The SPIR-V bytecode for the fragment shader stage. .. rst-class:: classref-item-separator @@ -122,9 +125,7 @@ Property Descriptions - void **set_stage_bytecode** **(** :ref:`ShaderStage` stage, :ref:`PackedByteArray` bytecode **)** - :ref:`PackedByteArray` **get_stage_bytecode** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The SPIR-V bytecode for the tessellation control shader stage. .. rst-class:: classref-item-separator @@ -141,9 +142,7 @@ Property Descriptions - void **set_stage_bytecode** **(** :ref:`ShaderStage` stage, :ref:`PackedByteArray` bytecode **)** - :ref:`PackedByteArray` **get_stage_bytecode** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The SPIR-V bytecode for the tessellation evaluation shader stage. .. rst-class:: classref-item-separator @@ -160,9 +159,7 @@ Property Descriptions - void **set_stage_bytecode** **(** :ref:`ShaderStage` stage, :ref:`PackedByteArray` bytecode **)** - :ref:`PackedByteArray` **get_stage_bytecode** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The SPIR-V bytecode for the vertex shader stage. .. rst-class:: classref-item-separator @@ -179,9 +176,7 @@ Property Descriptions - void **set_stage_compile_error** **(** :ref:`ShaderStage` stage, :ref:`String` compile_error **)** - :ref:`String` **get_stage_compile_error** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The compilation error message for the compute shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. .. rst-class:: classref-item-separator @@ -198,9 +193,7 @@ Property Descriptions - void **set_stage_compile_error** **(** :ref:`ShaderStage` stage, :ref:`String` compile_error **)** - :ref:`String` **get_stage_compile_error** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The compilation error message for the fragment shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. .. rst-class:: classref-item-separator @@ -217,9 +210,7 @@ Property Descriptions - void **set_stage_compile_error** **(** :ref:`ShaderStage` stage, :ref:`String` compile_error **)** - :ref:`String` **get_stage_compile_error** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The compilation error message for the tessellation control shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. .. rst-class:: classref-item-separator @@ -236,9 +227,7 @@ Property Descriptions - void **set_stage_compile_error** **(** :ref:`ShaderStage` stage, :ref:`String` compile_error **)** - :ref:`String` **get_stage_compile_error** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The compilation error message for the tessellation evaluation shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. .. rst-class:: classref-item-separator @@ -255,9 +244,7 @@ Property Descriptions - void **set_stage_compile_error** **(** :ref:`ShaderStage` stage, :ref:`String` compile_error **)** - :ref:`String` **get_stage_compile_error** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The compilation error message for the vertex shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. .. rst-class:: classref-section-separator @@ -274,9 +261,7 @@ Method Descriptions :ref:`PackedByteArray` **get_stage_bytecode** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Equivalent to getting one of :ref:`bytecode_compute`, :ref:`bytecode_fragment`, :ref:`bytecode_tesselation_control`, :ref:`bytecode_tesselation_evaluation`, :ref:`bytecode_vertex`. .. rst-class:: classref-item-separator @@ -288,9 +273,7 @@ Method Descriptions :ref:`String` **get_stage_compile_error** **(** :ref:`ShaderStage` stage **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the compilation error message for the given shader ``stage``. Equivalent to getting one of :ref:`compile_error_compute`, :ref:`compile_error_fragment`, :ref:`compile_error_tesselation_control`, :ref:`compile_error_tesselation_evaluation`, :ref:`compile_error_vertex`. .. rst-class:: classref-item-separator @@ -302,9 +285,7 @@ Method Descriptions void **set_stage_bytecode** **(** :ref:`ShaderStage` stage, :ref:`PackedByteArray` bytecode **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the SPIR-V ``bytecode`` for the given shader ``stage``. Equivalent to setting one of :ref:`bytecode_compute`, :ref:`bytecode_fragment`, :ref:`bytecode_tesselation_control`, :ref:`bytecode_tesselation_evaluation`, :ref:`bytecode_vertex`. .. rst-class:: classref-item-separator @@ -316,9 +297,7 @@ void **set_stage_bytecode** **(** :ref:`ShaderStage` stage, :ref:`String` compile_error **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the compilation error message for the given shader ``stage`` to ``compile_error``. Equivalent to setting one of :ref:`compile_error_compute`, :ref:`compile_error_fragment`, :ref:`compile_error_tesselation_control`, :ref:`compile_error_tesselation_evaluation`, :ref:`compile_error_vertex`. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rdtextureformat.rst b/classes/class_rdtextureformat.rst index 93e45236d64..16c366947c7 100644 --- a/classes/class_rdtextureformat.rst +++ b/classes/class_rdtextureformat.rst @@ -12,9 +12,14 @@ RDTextureFormat **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Texture format (used by :ref:`RenderingDevice`). + +.. rst-class:: classref-introduction-group + +Description +----------- - There is currently no description for this class. Please help us by :ref:`contributing one `! +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -78,9 +83,7 @@ Property Descriptions - void **set_array_layers** **(** :ref:`int` value **)** - :ref:`int` **get_array_layers** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of layers in the texture. Only relevant for 2D texture arrays. .. rst-class:: classref-item-separator @@ -97,9 +100,7 @@ Property Descriptions - void **set_depth** **(** :ref:`int` value **)** - :ref:`int` **get_depth** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The texture's depth (in pixels). This is always ``1`` for 2D textures. .. rst-class:: classref-item-separator @@ -116,9 +117,7 @@ Property Descriptions - void **set_format** **(** :ref:`DataFormat` value **)** - :ref:`DataFormat` **get_format** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The texture's pixel data format. .. rst-class:: classref-item-separator @@ -135,9 +134,7 @@ Property Descriptions - void **set_height** **(** :ref:`int` value **)** - :ref:`int` **get_height** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The texture's height (in pixels). .. rst-class:: classref-item-separator @@ -154,9 +151,7 @@ Property Descriptions - void **set_mipmaps** **(** :ref:`int` value **)** - :ref:`int` **get_mipmaps** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of mipmaps available in the texture. .. rst-class:: classref-item-separator @@ -173,9 +168,7 @@ Property Descriptions - void **set_samples** **(** :ref:`TextureSamples` value **)** - :ref:`TextureSamples` **get_samples** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of samples used when sampling the texture. .. rst-class:: classref-item-separator @@ -192,9 +185,7 @@ Property Descriptions - void **set_texture_type** **(** :ref:`TextureType` value **)** - :ref:`TextureType` **get_texture_type** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The texture type. .. rst-class:: classref-item-separator @@ -211,9 +202,7 @@ Property Descriptions - void **set_usage_bits** **(** :ref:`TextureUsageBits` value **)** - :ref:`TextureUsageBits` **get_usage_bits** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The texture's usage bits, which determine what can be done using the texture. .. rst-class:: classref-item-separator @@ -230,9 +219,7 @@ Property Descriptions - void **set_width** **(** :ref:`int` value **)** - :ref:`int` **get_width** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The texture's width (in pixels). .. rst-class:: classref-section-separator diff --git a/classes/class_rdtextureview.rst b/classes/class_rdtextureview.rst index bbd803f4ecb..d6bad84fd30 100644 --- a/classes/class_rdtextureview.rst +++ b/classes/class_rdtextureview.rst @@ -12,9 +12,14 @@ RDTextureView **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Texture view (used by :ref:`RenderingDevice`). - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -56,9 +61,7 @@ Property Descriptions - void **set_format_override** **(** :ref:`DataFormat` value **)** - :ref:`DataFormat` **get_format_override** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Optional override for the data format to return sampled values in. The default value of :ref:`RenderingDevice.DATA_FORMAT_MAX` does not override the format. .. rst-class:: classref-item-separator @@ -75,9 +78,7 @@ Property Descriptions - void **set_swizzle_a** **(** :ref:`TextureSwizzle` value **)** - :ref:`TextureSwizzle` **get_swizzle_a** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The channel to sample when sampling the alpha channel. .. rst-class:: classref-item-separator @@ -94,9 +95,7 @@ Property Descriptions - void **set_swizzle_b** **(** :ref:`TextureSwizzle` value **)** - :ref:`TextureSwizzle` **get_swizzle_b** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The channel to sample when sampling the blue color channel. .. rst-class:: classref-item-separator @@ -113,9 +112,7 @@ Property Descriptions - void **set_swizzle_g** **(** :ref:`TextureSwizzle` value **)** - :ref:`TextureSwizzle` **get_swizzle_g** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The channel to sample when sampling the green color channel. .. rst-class:: classref-item-separator @@ -132,9 +129,7 @@ Property Descriptions - void **set_swizzle_r** **(** :ref:`TextureSwizzle` value **)** - :ref:`TextureSwizzle` **get_swizzle_r** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The channel to sample when sampling the red color channel. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_rduniform.rst b/classes/class_rduniform.rst index 0ba311ddc34..ed331a9e46c 100644 --- a/classes/class_rduniform.rst +++ b/classes/class_rduniform.rst @@ -12,9 +12,14 @@ RDUniform **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Shader uniform (used by :ref:`RenderingDevice`). + +.. rst-class:: classref-introduction-group - There is currently no description for this class. Please help us by :ref:`contributing one `! +Description +----------- + +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group @@ -66,9 +71,7 @@ Property Descriptions - void **set_binding** **(** :ref:`int` value **)** - :ref:`int` **get_binding** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The uniform's binding. .. rst-class:: classref-item-separator @@ -85,9 +88,7 @@ Property Descriptions - void **set_uniform_type** **(** :ref:`UniformType` value **)** - :ref:`UniformType` **get_uniform_type** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The uniform's data type. .. rst-class:: classref-section-separator diff --git a/classes/class_rdvertexattribute.rst b/classes/class_rdvertexattribute.rst index bf9f1212973..3d4941740dd 100644 --- a/classes/class_rdvertexattribute.rst +++ b/classes/class_rdvertexattribute.rst @@ -12,9 +12,14 @@ RDVertexAttribute **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Vertex attribute (used by :ref:`RenderingDevice`). + +.. rst-class:: classref-introduction-group + +Description +----------- - There is currently no description for this class. Please help us by :ref:`contributing one `! +This object is used by :ref:`RenderingDevice`. .. rst-class:: classref-reftable-group diff --git a/classes/class_refcounted.rst b/classes/class_refcounted.rst index 1f9a9232c9f..5e32e23b32d 100644 --- a/classes/class_refcounted.rst +++ b/classes/class_refcounted.rst @@ -12,7 +12,7 @@ RefCounted **Inherits:** :ref:`Object` -**Inherited By:** :ref:`AESContext`, :ref:`AnimationTrackEditPlugin`, :ref:`AStar2D`, :ref:`AStar3D`, :ref:`AStarGrid2D`, :ref:`AudioEffectInstance`, :ref:`AudioStreamPlayback`, :ref:`CameraFeed`, :ref:`CharFXTransform`, :ref:`ConfigFile`, :ref:`Crypto`, :ref:`DirAccess`, :ref:`DTLSServer`, :ref:`EditorDebuggerPlugin`, :ref:`EditorDebuggerSession`, :ref:`EditorExportPlatform`, :ref:`EditorExportPlugin`, :ref:`EditorFeatureProfile`, :ref:`EditorFileSystemImportFormatSupportQuery`, :ref:`EditorInspectorPlugin`, :ref:`EditorResourceConversionPlugin`, :ref:`EditorResourcePreviewGenerator`, :ref:`EditorSceneFormatImporter`, :ref:`EditorScenePostImport`, :ref:`EditorScenePostImportPlugin`, :ref:`EditorScript`, :ref:`EditorTranslationParserPlugin`, :ref:`EncodedObjectAsID`, :ref:`ENetConnection`, :ref:`EngineProfiler`, :ref:`Expression`, :ref:`FileAccess`, :ref:`HashingContext`, :ref:`HMACContext`, :ref:`HTTPClient`, :ref:`ImageFormatLoader`, :ref:`JavaClass`, :ref:`JavaScriptObject`, :ref:`KinematicCollision2D`, :ref:`KinematicCollision3D`, :ref:`Lightmapper`, :ref:`MeshDataTool`, :ref:`MultiplayerAPI`, :ref:`Mutex`, :ref:`NavigationPathQueryParameters2D`, :ref:`NavigationPathQueryParameters3D`, :ref:`NavigationPathQueryResult2D`, :ref:`NavigationPathQueryResult3D`, :ref:`Node3DGizmo`, :ref:`OggPacketSequencePlayback`, :ref:`PackedDataContainerRef`, :ref:`PacketPeer`, :ref:`PCKPacker`, :ref:`PhysicsPointQueryParameters2D`, :ref:`PhysicsPointQueryParameters3D`, :ref:`PhysicsRayQueryParameters2D`, :ref:`PhysicsRayQueryParameters3D`, :ref:`PhysicsShapeQueryParameters2D`, :ref:`PhysicsShapeQueryParameters3D`, :ref:`PhysicsTestMotionParameters2D`, :ref:`PhysicsTestMotionParameters3D`, :ref:`PhysicsTestMotionResult2D`, :ref:`PhysicsTestMotionResult3D`, :ref:`RandomNumberGenerator`, :ref:`RDAttachmentFormat`, :ref:`RDFramebufferPass`, :ref:`RDPipelineColorBlendState`, :ref:`RDPipelineColorBlendStateAttachment`, :ref:`RDPipelineDepthStencilState`, :ref:`RDPipelineMultisampleState`, :ref:`RDPipelineRasterizationState`, :ref:`RDPipelineSpecializationConstant`, :ref:`RDSamplerState`, :ref:`RDShaderSource`, :ref:`RDTextureFormat`, :ref:`RDTextureView`, :ref:`RDUniform`, :ref:`RDVertexAttribute`, :ref:`RegEx`, :ref:`RegExMatch`, :ref:`Resource`, :ref:`ResourceFormatLoader`, :ref:`ResourceFormatSaver`, :ref:`ResourceImporter`, :ref:`SceneState`, :ref:`SceneTreeTimer`, :ref:`Semaphore`, :ref:`SkinReference`, :ref:`StreamPeer`, :ref:`SurfaceTool`, :ref:`TCPServer`, :ref:`TextLine`, :ref:`TextParagraph`, :ref:`TextServer`, :ref:`Thread`, :ref:`TLSOptions`, :ref:`TriangleMesh`, :ref:`Tween`, :ref:`Tweener`, :ref:`UDPServer`, :ref:`UPNP`, :ref:`UPNPDevice`, :ref:`WeakRef`, :ref:`WebRTCPeerConnection`, :ref:`XMLParser`, :ref:`XRInterface`, :ref:`XRPose`, :ref:`XRPositionalTracker`, :ref:`ZIPPacker`, :ref:`ZIPReader` +**Inherited By:** :ref:`AESContext`, :ref:`AStar2D`, :ref:`AStar3D`, :ref:`AStarGrid2D`, :ref:`AudioEffectInstance`, :ref:`AudioStreamPlayback`, :ref:`CameraFeed`, :ref:`CharFXTransform`, :ref:`ConfigFile`, :ref:`Crypto`, :ref:`DirAccess`, :ref:`DTLSServer`, :ref:`EditorDebuggerPlugin`, :ref:`EditorDebuggerSession`, :ref:`EditorExportPlatform`, :ref:`EditorExportPlugin`, :ref:`EditorFeatureProfile`, :ref:`EditorFileSystemImportFormatSupportQuery`, :ref:`EditorInspectorPlugin`, :ref:`EditorResourceConversionPlugin`, :ref:`EditorResourcePreviewGenerator`, :ref:`EditorResourceTooltipPlugin`, :ref:`EditorSceneFormatImporter`, :ref:`EditorScenePostImport`, :ref:`EditorScenePostImportPlugin`, :ref:`EditorScript`, :ref:`EditorTranslationParserPlugin`, :ref:`EncodedObjectAsID`, :ref:`ENetConnection`, :ref:`EngineProfiler`, :ref:`Expression`, :ref:`FileAccess`, :ref:`HashingContext`, :ref:`HMACContext`, :ref:`HTTPClient`, :ref:`ImageFormatLoader`, :ref:`JavaClass`, :ref:`JavaScriptObject`, :ref:`KinematicCollision2D`, :ref:`KinematicCollision3D`, :ref:`Lightmapper`, :ref:`MeshConvexDecompositionSettings`, :ref:`MeshDataTool`, :ref:`MultiplayerAPI`, :ref:`Mutex`, :ref:`NavigationPathQueryParameters2D`, :ref:`NavigationPathQueryParameters3D`, :ref:`NavigationPathQueryResult2D`, :ref:`NavigationPathQueryResult3D`, :ref:`Node3DGizmo`, :ref:`OggPacketSequencePlayback`, :ref:`PackedDataContainerRef`, :ref:`PacketPeer`, :ref:`PCKPacker`, :ref:`PhysicsPointQueryParameters2D`, :ref:`PhysicsPointQueryParameters3D`, :ref:`PhysicsRayQueryParameters2D`, :ref:`PhysicsRayQueryParameters3D`, :ref:`PhysicsShapeQueryParameters2D`, :ref:`PhysicsShapeQueryParameters3D`, :ref:`PhysicsTestMotionParameters2D`, :ref:`PhysicsTestMotionParameters3D`, :ref:`PhysicsTestMotionResult2D`, :ref:`PhysicsTestMotionResult3D`, :ref:`RandomNumberGenerator`, :ref:`RDAttachmentFormat`, :ref:`RDFramebufferPass`, :ref:`RDPipelineColorBlendState`, :ref:`RDPipelineColorBlendStateAttachment`, :ref:`RDPipelineDepthStencilState`, :ref:`RDPipelineMultisampleState`, :ref:`RDPipelineRasterizationState`, :ref:`RDPipelineSpecializationConstant`, :ref:`RDSamplerState`, :ref:`RDShaderSource`, :ref:`RDTextureFormat`, :ref:`RDTextureView`, :ref:`RDUniform`, :ref:`RDVertexAttribute`, :ref:`RegEx`, :ref:`RegExMatch`, :ref:`Resource`, :ref:`ResourceFormatLoader`, :ref:`ResourceFormatSaver`, :ref:`ResourceImporter`, :ref:`SceneState`, :ref:`SceneTreeTimer`, :ref:`Semaphore`, :ref:`SkinReference`, :ref:`StreamPeer`, :ref:`SurfaceTool`, :ref:`TCPServer`, :ref:`TextLine`, :ref:`TextParagraph`, :ref:`TextServer`, :ref:`Thread`, :ref:`TLSOptions`, :ref:`TriangleMesh`, :ref:`Tween`, :ref:`Tweener`, :ref:`UDPServer`, :ref:`UPNP`, :ref:`UPNPDevice`, :ref:`WeakRef`, :ref:`WebRTCPeerConnection`, :ref:`XMLParser`, :ref:`XRInterface`, :ref:`XRPose`, :ref:`XRPositionalTracker`, :ref:`ZIPPacker`, :ref:`ZIPReader` Base class for reference-counted objects. diff --git a/classes/class_reflectionprobe.rst b/classes/class_reflectionprobe.rst index 5737ea69352..ec556d5d4ab 100644 --- a/classes/class_reflectionprobe.rst +++ b/classes/class_reflectionprobe.rst @@ -119,7 +119,7 @@ enum **AmbientMode**: :ref:`AmbientMode` **AMBIENT_DISABLED** = ``0`` -Do not apply any ambient lighting inside the **ReflectionProbe**'s :ref:`size`. +Do not apply any ambient lighting inside the **ReflectionProbe**'s box defined by its :ref:`size`. .. _class_ReflectionProbe_constant_AMBIENT_ENVIRONMENT: @@ -127,7 +127,7 @@ Do not apply any ambient lighting inside the **ReflectionProbe**'s :ref:`size` **AMBIENT_ENVIRONMENT** = ``1`` -Apply automatically-sourced environment lighting inside the **ReflectionProbe**'s :ref:`size`. +Apply automatically-sourced environment lighting inside the **ReflectionProbe**'s box defined by its :ref:`size`. .. _class_ReflectionProbe_constant_AMBIENT_COLOR: @@ -135,7 +135,7 @@ Apply automatically-sourced environment lighting inside the **ReflectionProbe**' :ref:`AmbientMode` **AMBIENT_COLOR** = ``2`` -Apply custom ambient lighting inside the **ReflectionProbe**'s :ref:`size`. See :ref:`ambient_color` and :ref:`ambient_color_energy`. +Apply custom ambient lighting inside the **ReflectionProbe**'s box defined by its :ref:`size`. See :ref:`ambient_color` and :ref:`ambient_color_energy`. .. rst-class:: classref-section-separator @@ -157,7 +157,7 @@ Property Descriptions - void **set_ambient_color** **(** :ref:`Color` value **)** - :ref:`Color` **get_ambient_color** **(** **)** -The custom ambient color to use within the **ReflectionProbe**'s :ref:`size`. Only effective if :ref:`ambient_mode` is :ref:`AMBIENT_COLOR`. +The custom ambient color to use within the **ReflectionProbe**'s box defined by its :ref:`size`. Only effective if :ref:`ambient_mode` is :ref:`AMBIENT_COLOR`. .. rst-class:: classref-item-separator @@ -174,7 +174,7 @@ The custom ambient color to use within the **ReflectionProbe**'s :ref:`size` value **)** - :ref:`float` **get_ambient_color_energy** **(** **)** -The custom ambient color energy to use within the **ReflectionProbe**'s :ref:`size`. Only effective if :ref:`ambient_mode` is :ref:`AMBIENT_COLOR`. +The custom ambient color energy to use within the **ReflectionProbe**'s box defined by its :ref:`size`. Only effective if :ref:`ambient_mode` is :ref:`AMBIENT_COLOR`. .. rst-class:: classref-item-separator @@ -191,7 +191,7 @@ The custom ambient color energy to use within the **ReflectionProbe**'s :ref:`si - void **set_ambient_mode** **(** :ref:`AmbientMode` value **)** - :ref:`AmbientMode` **get_ambient_mode** **(** **)** -The ambient color to use within the **ReflectionProbe**'s :ref:`size`. The ambient color will smoothly blend with other **ReflectionProbe**\ s and the rest of the scene (outside the **ReflectionProbe**'s :ref:`size`). +The ambient color to use within the **ReflectionProbe**'s box defined by its :ref:`size`. The ambient color will smoothly blend with other **ReflectionProbe**\ s and the rest of the scene (outside the **ReflectionProbe**'s box defined by its :ref:`size`). .. rst-class:: classref-item-separator @@ -297,7 +297,7 @@ If ``true``, reflections will ignore sky contribution. The maximum distance away from the **ReflectionProbe** an object can be before it is culled. Decrease this to improve performance, especially when using the :ref:`UPDATE_ALWAYS` :ref:`update_mode`. -\ **Note:** The maximum reflection distance is always at least equal to the probe's extents. This means that decreasing :ref:`max_distance` will not always cull objects from reflections, especially if the reflection probe's :ref:`size` is already large. +\ **Note:** The maximum reflection distance is always at least equal to the probe's extents. This means that decreasing :ref:`max_distance` will not always cull objects from reflections, especially if the reflection probe's box defined by its :ref:`size` is already large. .. rst-class:: classref-item-separator diff --git a/classes/class_renderingdevice.rst b/classes/class_renderingdevice.rst index f326a0eb8d0..3de4deade10 100644 --- a/classes/class_renderingdevice.rst +++ b/classes/class_renderingdevice.rst @@ -19,16 +19,23 @@ Abstraction for working with modern low-level graphics APIs. Description ----------- -**RenderingDevice** is an abstraction for working with modern low-level graphics APIs such as Vulkan. +**RenderingDevice** is an abstraction for working with modern low-level graphics APIs such as Vulkan. Compared to :ref:`RenderingServer` (which works with Godot's own rendering subsystems), **RenderingDevice** is much lower-level and allows working more directly with the underlying graphics APIs. **RenderingDevice** is used in Godot to provide support for several modern low-level graphics APIs while reducing the amount of code duplication required. **RenderingDevice** can also be used in your own projects to perform things that are not exposed by :ref:`RenderingServer` or high-level nodes, such as using compute shaders. -On startup, Godot creates a global **RenderingDevice** which can be retrieved using :ref:`RenderingServer.get_rendering_device`. This global RenderingDevice performs drawing to the screen. - -Internally, **RenderingDevice** is used in Godot to provide support for several modern low-level graphics APIs while reducing the amount of code duplication required. +On startup, Godot creates a global **RenderingDevice** which can be retrieved using :ref:`RenderingServer.get_rendering_device`. This global **RenderingDevice** performs drawing to the screen. \ **Local RenderingDevices:** Using :ref:`RenderingServer.create_local_rendering_device`, you can create "secondary" rendering devices to perform drawing and GPU compute operations on separate threads. +\ **Note:** **RenderingDevice** assumes intermediate knowledge of modern graphics APIs such as Vulkan, Direct3D 12, Metal or WebGPU. These graphics APIs are lower-level than OpenGL or Direct3D 11, requiring you to perform what was previously done by the graphics driver itself. If you have difficulty understanding the concepts used in this class, follow the `Vulkan Tutorial `__ or `Vulkan Guide `__. It's recommended to have existing modern OpenGL or Direct3D 11 knowledge before attempting to learn a low-level graphics API. + \ **Note:** **RenderingDevice** is not available when running in headless mode or when using the Compatibility rendering method. +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- `Using compute shaders `__ + .. rst-class:: classref-reftable-group Methods @@ -64,7 +71,7 @@ Methods +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`compute_pipeline_create` **(** :ref:`RID` shader, :ref:`RDPipelineSpecializationConstant[]` specialization_constants=[] **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`compute_pipeline_is_valid` **(** :ref:`RID` compute_pieline **)** | + | :ref:`bool` | :ref:`compute_pipeline_is_valid` **(** :ref:`RID` compute_pipeline **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RenderingDevice` | :ref:`create_local_device` **(** **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -74,7 +81,7 @@ Methods +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`draw_command_insert_label` **(** :ref:`String` name, :ref:`Color` color **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`draw_list_begin` **(** :ref:`RID` framebuffer, :ref:`InitialAction` initial_color_action, :ref:`FinalAction` final_color_action, :ref:`InitialAction` initial_depth_action, :ref:`FinalAction` final_depth_action, :ref:`PackedColorArray` clear_color_values=PackedColorArray(), :ref:`float` clear_depth=1.0, :ref:`int` clear_stencil=0, :ref:`Rect2` region=Rect2(0, 0, 0, 0), :ref:`Array` storage_textures=[] **)** | + | :ref:`int` | :ref:`draw_list_begin` **(** :ref:`RID` framebuffer, :ref:`InitialAction` initial_color_action, :ref:`FinalAction` final_color_action, :ref:`InitialAction` initial_depth_action, :ref:`FinalAction` final_depth_action, :ref:`PackedColorArray` clear_color_values=PackedColorArray(), :ref:`float` clear_depth=1.0, :ref:`int` clear_stencil=0, :ref:`Rect2` region=Rect2(0, 0, 0, 0), :ref:`RID[]` storage_textures=[] **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`draw_list_begin_for_screen` **(** :ref:`int` screen=0, :ref:`Color` clear_color=Color(0, 0, 0, 1) **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -160,6 +167,8 @@ Methods +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`sampler_create` **(** :ref:`RDSamplerState` state **)** | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`sampler_is_format_supported_for_filter` **(** :ref:`DataFormat` format, :ref:`SamplerFilter` sampler_filter **)** |const| | + +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`screen_get_framebuffer_format` **(** **)** |const| | +------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`screen_get_height` **(** :ref:`int` screen=0 **)** |const| | @@ -300,7 +309,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_DEVICE** = ``0`` - +Vulkan device driver resource. This is a "global" resource and ignores the RID passed in .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_PHYSICAL_DEVICE: @@ -308,7 +317,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_PHYSICAL_DEVICE** = ``1`` - +Physical device (graphics card) driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_INSTANCE: @@ -316,7 +325,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_INSTANCE** = ``2`` - +Vulkan instance driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_QUEUE: @@ -324,7 +333,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_QUEUE** = ``3`` - +Vulkan queue driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_QUEUE_FAMILY_INDEX: @@ -332,7 +341,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_QUEUE_FAMILY_INDEX** = ``4`` - +Vulkan queue family index driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_IMAGE: @@ -340,7 +349,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_IMAGE** = ``5`` - +Vulkan image driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_IMAGE_VIEW: @@ -348,7 +357,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_IMAGE_VIEW** = ``6`` - +Vulkan image view driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_IMAGE_NATIVE_TEXTURE_FORMAT: @@ -356,7 +365,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_IMAGE_NATIVE_TEXTURE_FORMAT** = ``7`` - +Vulkan image native texture format driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_SAMPLER: @@ -364,7 +373,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_SAMPLER** = ``8`` - +Vulkan sampler driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_DESCRIPTOR_SET: @@ -372,7 +381,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_DESCRIPTOR_SET** = ``9`` - +Vulkan `descriptor set `__ driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_BUFFER: @@ -380,7 +389,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_BUFFER** = ``10`` - +Vulkan buffer driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_COMPUTE_PIPELINE: @@ -388,7 +397,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_COMPUTE_PIPELINE** = ``11`` - +Vulkan compute pipeline driver resource. .. _class_RenderingDevice_constant_DRIVER_RESOURCE_VULKAN_RENDER_PIPELINE: @@ -396,7 +405,7 @@ enum **DriverResource**: :ref:`DriverResource` **DRIVER_RESOURCE_VULKAN_RENDER_PIPELINE** = ``12`` - +Vulkan render pipeline driver resource. .. rst-class:: classref-item-separator @@ -414,7 +423,9 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R4G4_UNORM_PACK8** = ``0`` +4-bit-per-channel red/green channel data format, packed into 8 bits. Values are in the ``[0.0, 1.0]`` range. +\ **Note:** More information on all data formats can be found on the `Identification of formats `__ section of the Vulkan specification, as well as the `VkFormat `__ enum. .. _class_RenderingDevice_constant_DATA_FORMAT_R4G4B4A4_UNORM_PACK16: @@ -422,7 +433,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R4G4B4A4_UNORM_PACK16** = ``1`` - +4-bit-per-channel red/green/blue/alpha channel data format, packed into 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B4G4R4A4_UNORM_PACK16: @@ -430,7 +441,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B4G4R4A4_UNORM_PACK16** = ``2`` - +4-bit-per-channel blue/green/red/alpha channel data format, packed into 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R5G6B5_UNORM_PACK16: @@ -438,7 +449,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R5G6B5_UNORM_PACK16** = ``3`` - +Red/green/blue channel data format with 5 bits of red, 6 bits of green and 5 bits of blue, packed into 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B5G6R5_UNORM_PACK16: @@ -446,7 +457,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B5G6R5_UNORM_PACK16** = ``4`` - +Blue/green/red channel data format with 5 bits of blue, 6 bits of green and 5 bits of red, packed into 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R5G5B5A1_UNORM_PACK16: @@ -454,7 +465,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R5G5B5A1_UNORM_PACK16** = ``5`` - +Red/green/blue/alpha channel data format with 5 bits of red, 6 bits of green, 5 bits of blue and 1 bit of alpha, packed into 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B5G5R5A1_UNORM_PACK16: @@ -462,7 +473,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B5G5R5A1_UNORM_PACK16** = ``6`` - +Blue/green/red/alpha channel data format with 5 bits of blue, 6 bits of green, 5 bits of red and 1 bit of alpha, packed into 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A1R5G5B5_UNORM_PACK16: @@ -470,7 +481,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A1R5G5B5_UNORM_PACK16** = ``7`` - +Alpha/red/green/blue channel data format with 1 bit of alpha, 5 bits of red, 6 bits of green and 5 bits of blue, packed into 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8_UNORM: @@ -478,7 +489,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8_UNORM** = ``8`` - +8-bit-per-channel unsigned floating-point red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8_SNORM: @@ -486,7 +497,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8_SNORM** = ``9`` - +8-bit-per-channel signed floating-point red channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8_USCALED: @@ -494,7 +505,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8_USCALED** = ``10`` - +8-bit-per-channel unsigned floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 255.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8_SSCALED: @@ -502,7 +513,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8_SSCALED** = ``11`` - +8-bit-per-channel signed floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the ``[-127.0, 127.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8_UINT: @@ -510,7 +521,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8_UINT** = ``12`` - +8-bit-per-channel unsigned integer red channel data format. Values are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8_SINT: @@ -518,7 +529,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8_SINT** = ``13`` - +8-bit-per-channel signed integer red channel data format. Values are in the ``[-127, 127]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8_SRGB: @@ -526,7 +537,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8_SRGB** = ``14`` - +8-bit-per-channel unsigned floating-point red channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8_UNORM: @@ -534,7 +545,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8_UNORM** = ``15`` - +8-bit-per-channel unsigned floating-point red/green channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8_SNORM: @@ -542,7 +553,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8_SNORM** = ``16`` - +8-bit-per-channel signed floating-point red/green channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8_USCALED: @@ -550,7 +561,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8_USCALED** = ``17`` - +8-bit-per-channel unsigned floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 255.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8_SSCALED: @@ -558,7 +569,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8_SSCALED** = ``18`` - +8-bit-per-channel signed floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the ``[-127.0, 127.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8_UINT: @@ -566,7 +577,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8_UINT** = ``19`` - +8-bit-per-channel unsigned integer red/green channel data format. Values are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8_SINT: @@ -574,7 +585,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8_SINT** = ``20`` - +8-bit-per-channel signed integer red/green channel data format. Values are in the ``[-127, 127]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8_SRGB: @@ -582,7 +593,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8_SRGB** = ``21`` - +8-bit-per-channel unsigned floating-point red/green channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8_UNORM: @@ -590,7 +601,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8_UNORM** = ``22`` - +8-bit-per-channel unsigned floating-point red/green/blue channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8_SNORM: @@ -598,7 +609,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8_SNORM** = ``23`` - +8-bit-per-channel signed floating-point red/green/blue channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8_USCALED: @@ -606,7 +617,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8_USCALED** = ``24`` - +8-bit-per-channel unsigned floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 255.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8_SSCALED: @@ -614,7 +625,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8_SSCALED** = ``25`` - +8-bit-per-channel signed floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the ``[-127.0, 127.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8_UINT: @@ -622,7 +633,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8_UINT** = ``26`` - +8-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8_SINT: @@ -630,7 +641,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8_SINT** = ``27`` - +8-bit-per-channel signed integer red/green/blue channel data format. Values are in the ``[-127, 127]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8_SRGB: @@ -638,7 +649,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8_SRGB** = ``28`` - +8-bit-per-channel unsigned floating-point red/green/blue/blue channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8_UNORM: @@ -646,7 +657,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8_UNORM** = ``29`` - +8-bit-per-channel unsigned floating-point blue/green/red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8_SNORM: @@ -654,7 +665,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8_SNORM** = ``30`` - +8-bit-per-channel signed floating-point blue/green/red channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8_USCALED: @@ -662,7 +673,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8_USCALED** = ``31`` - +8-bit-per-channel unsigned floating-point blue/green/red channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 255.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8_SSCALED: @@ -670,7 +681,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8_SSCALED** = ``32`` - +8-bit-per-channel signed floating-point blue/green/red channel data format with scaled value (value is converted from integer to float). Values are in the ``[-127.0, 127.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8_UINT: @@ -678,7 +689,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8_UINT** = ``33`` - +8-bit-per-channel unsigned integer blue/green/red channel data format. Values are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8_SINT: @@ -686,7 +697,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8_SINT** = ``34`` - +8-bit-per-channel signed integer blue/green/red channel data format. Values are in the ``[-127, 127]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8_SRGB: @@ -694,7 +705,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8_SRGB** = ``35`` - +8-bit-per-channel unsigned floating-point blue/green/red data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8A8_UNORM: @@ -702,7 +713,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8A8_UNORM** = ``36`` - +8-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8A8_SNORM: @@ -710,7 +721,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8A8_SNORM** = ``37`` - +8-bit-per-channel signed floating-point red/green/blue/alpha channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8A8_USCALED: @@ -718,7 +729,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8A8_USCALED** = ``38`` - +8-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 255.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8A8_SSCALED: @@ -726,7 +737,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8A8_SSCALED** = ``39`` - +8-bit-per-channel signed floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the ``[-127.0, 127.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8A8_UINT: @@ -734,7 +745,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8A8_UINT** = ``40`` - +8-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8A8_SINT: @@ -742,7 +753,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8A8_SINT** = ``41`` - +8-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the ``[-127, 127]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R8G8B8A8_SRGB: @@ -750,7 +761,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R8G8B8A8_SRGB** = ``42`` - +8-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8A8_UNORM: @@ -758,7 +769,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8A8_UNORM** = ``43`` - +8-bit-per-channel unsigned floating-point blue/green/red/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8A8_SNORM: @@ -766,7 +777,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8A8_SNORM** = ``44`` - +8-bit-per-channel signed floating-point blue/green/red/alpha channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8A8_USCALED: @@ -774,7 +785,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8A8_USCALED** = ``45`` - +8-bit-per-channel unsigned floating-point blue/green/red/alpha channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 255.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8A8_SSCALED: @@ -782,7 +793,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8A8_SSCALED** = ``46`` - +8-bit-per-channel signed floating-point blue/green/red/alpha channel data format with scaled value (value is converted from integer to float). Values are in the ``[-127.0, 127.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8A8_UINT: @@ -790,7 +801,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8A8_UINT** = ``47`` - +8-bit-per-channel unsigned integer blue/green/red/alpha channel data format. Values are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8A8_SINT: @@ -798,7 +809,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8A8_SINT** = ``48`` - +8-bit-per-channel signed integer blue/green/red/alpha channel data format. Values are in the ``[-127, 127]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8A8_SRGB: @@ -806,7 +817,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8A8_SRGB** = ``49`` - +8-bit-per-channel unsigned floating-point blue/green/red/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A8B8G8R8_UNORM_PACK32: @@ -814,7 +825,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A8B8G8R8_UNORM_PACK32** = ``50`` - +8-bit-per-channel unsigned floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A8B8G8R8_SNORM_PACK32: @@ -822,7 +833,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A8B8G8R8_SNORM_PACK32** = ``51`` - +8-bit-per-channel signed floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A8B8G8R8_USCALED_PACK32: @@ -830,7 +841,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A8B8G8R8_USCALED_PACK32** = ``52`` - +8-bit-per-channel unsigned floating-point alpha/red/green/blue channel data format with scaled value (value is converted from integer to float), packed in 32 bits. Values are in the ``[0.0, 255.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A8B8G8R8_SSCALED_PACK32: @@ -838,7 +849,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A8B8G8R8_SSCALED_PACK32** = ``53`` - +8-bit-per-channel signed floating-point alpha/red/green/blue channel data format with scaled value (value is converted from integer to float), packed in 32 bits. Values are in the ``[-127.0, 127.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A8B8G8R8_UINT_PACK32: @@ -846,7 +857,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A8B8G8R8_UINT_PACK32** = ``54`` - +8-bit-per-channel unsigned integer alpha/red/green/blue channel data format, packed in 32 bits. Values are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A8B8G8R8_SINT_PACK32: @@ -854,7 +865,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A8B8G8R8_SINT_PACK32** = ``55`` - +8-bit-per-channel signed integer alpha/red/green/blue channel data format, packed in 32 bits. Values are in the ``[-127, 127]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A8B8G8R8_SRGB_PACK32: @@ -862,7 +873,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A8B8G8R8_SRGB_PACK32** = ``56`` - +8-bit-per-channel unsigned floating-point alpha/red/green/blue channel data format with normalized value and non-linear sRGB encoding, packed in 32 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A2R10G10B10_UNORM_PACK32: @@ -870,7 +881,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2R10G10B10_UNORM_PACK32** = ``57`` - +Unsigned floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A2R10G10B10_SNORM_PACK32: @@ -878,7 +889,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2R10G10B10_SNORM_PACK32** = ``58`` - +Signed floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A2R10G10B10_USCALED_PACK32: @@ -886,7 +897,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2R10G10B10_USCALED_PACK32** = ``59`` - +Unsigned floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the ``[0.0, 1023.0]`` range for red/green/blue and ``[0.0, 3.0]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_A2R10G10B10_SSCALED_PACK32: @@ -894,7 +905,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2R10G10B10_SSCALED_PACK32** = ``60`` - +Signed floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the ``[-511.0, 511.0]`` range for red/green/blue and ``[-1.0, 1.0]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_A2R10G10B10_UINT_PACK32: @@ -902,7 +913,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2R10G10B10_UINT_PACK32** = ``61`` - +Unsigned integer alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the ``[0, 1023]`` range for red/green/blue and ``[0, 3]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_A2R10G10B10_SINT_PACK32: @@ -910,7 +921,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2R10G10B10_SINT_PACK32** = ``62`` - +Signed integer alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the ``[-511, 511]`` range for red/green/blue and ``[-1, 1]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_A2B10G10R10_UNORM_PACK32: @@ -918,7 +929,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2B10G10R10_UNORM_PACK32** = ``63`` - +Unsigned floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A2B10G10R10_SNORM_PACK32: @@ -926,7 +937,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2B10G10R10_SNORM_PACK32** = ``64`` - +Signed floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_A2B10G10R10_USCALED_PACK32: @@ -934,7 +945,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2B10G10R10_USCALED_PACK32** = ``65`` - +Unsigned floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the ``[0.0, 1023.0]`` range for blue/green/red and ``[0.0, 3.0]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_A2B10G10R10_SSCALED_PACK32: @@ -942,7 +953,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2B10G10R10_SSCALED_PACK32** = ``66`` - +Signed floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the ``[-511.0, 511.0]`` range for blue/green/red and ``[-1.0, 1.0]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_A2B10G10R10_UINT_PACK32: @@ -950,7 +961,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2B10G10R10_UINT_PACK32** = ``67`` - +Unsigned integer alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the ``[0, 1023]`` range for blue/green/red and ``[0, 3]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_A2B10G10R10_SINT_PACK32: @@ -958,7 +969,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_A2B10G10R10_SINT_PACK32** = ``68`` - +Signed integer alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the ``[-511, 511]`` range for blue/green/red and ``[-1, 1]`` for alpha. .. _class_RenderingDevice_constant_DATA_FORMAT_R16_UNORM: @@ -966,7 +977,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16_UNORM** = ``69`` - +16-bit-per-channel unsigned floating-point red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16_SNORM: @@ -974,7 +985,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16_SNORM** = ``70`` - +16-bit-per-channel signed floating-point red channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16_USCALED: @@ -982,7 +993,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16_USCALED** = ``71`` - +16-bit-per-channel unsigned floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 65535.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16_SSCALED: @@ -990,7 +1001,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16_SSCALED** = ``72`` - +16-bit-per-channel signed floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the ``[-32767.0, 32767.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16_UINT: @@ -998,7 +1009,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16_UINT** = ``73`` - +16-bit-per-channel unsigned integer red channel data format. Values are in the ``[0.0, 65535]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16_SINT: @@ -1006,7 +1017,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16_SINT** = ``74`` - +16-bit-per-channel signed integer red channel data format. Values are in the ``[-32767, 32767]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16_SFLOAT: @@ -1014,7 +1025,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16_SFLOAT** = ``75`` - +16-bit-per-channel signed floating-point red channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16_UNORM: @@ -1022,7 +1033,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16_UNORM** = ``76`` - +16-bit-per-channel unsigned floating-point red/green channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16_SNORM: @@ -1030,7 +1041,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16_SNORM** = ``77`` - +16-bit-per-channel signed floating-point red/green channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16_USCALED: @@ -1038,7 +1049,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16_USCALED** = ``78`` - +16-bit-per-channel unsigned floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 65535.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16_SSCALED: @@ -1046,7 +1057,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16_SSCALED** = ``79`` - +16-bit-per-channel signed floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the ``[-32767.0, 32767.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16_UINT: @@ -1054,7 +1065,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16_UINT** = ``80`` - +16-bit-per-channel unsigned integer red/green channel data format. Values are in the ``[0.0, 65535]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16_SINT: @@ -1062,7 +1073,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16_SINT** = ``81`` - +16-bit-per-channel signed integer red/green channel data format. Values are in the ``[-32767, 32767]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16_SFLOAT: @@ -1070,7 +1081,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16_SFLOAT** = ``82`` - +16-bit-per-channel signed floating-point red/green channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16_UNORM: @@ -1078,7 +1089,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16_UNORM** = ``83`` - +16-bit-per-channel unsigned floating-point red/green/blue channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16_SNORM: @@ -1086,7 +1097,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16_SNORM** = ``84`` - +16-bit-per-channel signed floating-point red/green/blue channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16_USCALED: @@ -1094,7 +1105,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16_USCALED** = ``85`` - +16-bit-per-channel unsigned floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 65535.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16_SSCALED: @@ -1102,7 +1113,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16_SSCALED** = ``86`` - +16-bit-per-channel signed floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the ``[-32767.0, 32767.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16_UINT: @@ -1110,7 +1121,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16_UINT** = ``87`` - +16-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the ``[0.0, 65535]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16_SINT: @@ -1118,7 +1129,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16_SINT** = ``88`` - +16-bit-per-channel signed integer red/green/blue channel data format. Values are in the ``[-32767, 32767]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16_SFLOAT: @@ -1126,7 +1137,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16_SFLOAT** = ``89`` - +16-bit-per-channel signed floating-point red/green/blue channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16A16_UNORM: @@ -1134,7 +1145,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16A16_UNORM** = ``90`` - +16-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16A16_SNORM: @@ -1142,7 +1153,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16A16_SNORM** = ``91`` - +16-bit-per-channel signed floating-point red/green/blue/alpha channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16A16_USCALED: @@ -1150,7 +1161,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16A16_USCALED** = ``92`` - +16-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the ``[0.0, 65535.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16A16_SSCALED: @@ -1158,7 +1169,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16A16_SSCALED** = ``93`` - +16-bit-per-channel signed floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the ``[-32767.0, 32767.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16A16_UINT: @@ -1166,7 +1177,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16A16_UINT** = ``94`` - +16-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the ``[0.0, 65535]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16A16_SINT: @@ -1174,7 +1185,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16A16_SINT** = ``95`` - +16-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the ``[-32767, 32767]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R16G16B16A16_SFLOAT: @@ -1182,7 +1193,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R16G16B16A16_SFLOAT** = ``96`` - +16-bit-per-channel signed floating-point red/green/blue/alpha channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R32_UINT: @@ -1190,7 +1201,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32_UINT** = ``97`` - +32-bit-per-channel unsigned integer red channel data format. Values are in the ``[0, 2^32 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32_SINT: @@ -1198,7 +1209,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32_SINT** = ``98`` - +32-bit-per-channel signed integer red channel data format. Values are in the ``[2^31 + 1, 2^31 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32_SFLOAT: @@ -1206,7 +1217,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32_SFLOAT** = ``99`` - +32-bit-per-channel signed floating-point red channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32_UINT: @@ -1214,7 +1225,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32_UINT** = ``100`` - +32-bit-per-channel unsigned integer red/green channel data format. Values are in the ``[0, 2^32 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32_SINT: @@ -1222,7 +1233,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32_SINT** = ``101`` - +32-bit-per-channel signed integer red/green channel data format. Values are in the ``[2^31 + 1, 2^31 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32_SFLOAT: @@ -1230,7 +1241,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32_SFLOAT** = ``102`` - +32-bit-per-channel signed floating-point red/green channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32B32_UINT: @@ -1238,7 +1249,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32B32_UINT** = ``103`` - +32-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the ``[0, 2^32 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32B32_SINT: @@ -1246,7 +1257,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32B32_SINT** = ``104`` - +32-bit-per-channel signed integer red/green/blue channel data format. Values are in the ``[2^31 + 1, 2^31 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32B32_SFLOAT: @@ -1254,7 +1265,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32B32_SFLOAT** = ``105`` - +32-bit-per-channel signed floating-point red/green/blue channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32B32A32_UINT: @@ -1262,7 +1273,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32B32A32_UINT** = ``106`` - +32-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the ``[0, 2^32 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32B32A32_SINT: @@ -1270,7 +1281,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32B32A32_SINT** = ``107`` - +32-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the ``[2^31 + 1, 2^31 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R32G32B32A32_SFLOAT: @@ -1278,7 +1289,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R32G32B32A32_SFLOAT** = ``108`` - +32-bit-per-channel signed floating-point red/green/blue/alpha channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R64_UINT: @@ -1286,7 +1297,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64_UINT** = ``109`` - +64-bit-per-channel unsigned integer red channel data format. Values are in the ``[0, 2^64 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64_SINT: @@ -1294,7 +1305,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64_SINT** = ``110`` - +64-bit-per-channel signed integer red channel data format. Values are in the ``[2^63 + 1, 2^63 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64_SFLOAT: @@ -1302,7 +1313,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64_SFLOAT** = ``111`` - +64-bit-per-channel signed floating-point red channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64_UINT: @@ -1310,7 +1321,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64_UINT** = ``112`` - +64-bit-per-channel unsigned integer red/green channel data format. Values are in the ``[0, 2^64 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64_SINT: @@ -1318,7 +1329,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64_SINT** = ``113`` - +64-bit-per-channel signed integer red/green channel data format. Values are in the ``[2^63 + 1, 2^63 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64_SFLOAT: @@ -1326,7 +1337,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64_SFLOAT** = ``114`` - +64-bit-per-channel signed floating-point red/green channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64B64_UINT: @@ -1334,7 +1345,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64B64_UINT** = ``115`` - +64-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the ``[0, 2^64 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64B64_SINT: @@ -1342,7 +1353,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64B64_SINT** = ``116`` - +64-bit-per-channel signed integer red/green/blue channel data format. Values are in the ``[2^63 + 1, 2^63 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64B64_SFLOAT: @@ -1350,7 +1361,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64B64_SFLOAT** = ``117`` - +64-bit-per-channel signed floating-point red/green/blue channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64B64A64_UINT: @@ -1358,7 +1369,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64B64A64_UINT** = ``118`` - +64-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the ``[0, 2^64 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64B64A64_SINT: @@ -1366,7 +1377,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64B64A64_SINT** = ``119`` - +64-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the ``[2^63 + 1, 2^63 - 1]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R64G64B64A64_SFLOAT: @@ -1374,7 +1385,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R64G64B64A64_SFLOAT** = ``120`` - +64-bit-per-channel signed floating-point red/green/blue/alpha channel data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_B10G11R11_UFLOAT_PACK32: @@ -1382,7 +1393,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B10G11R11_UFLOAT_PACK32** = ``121`` - +Unsigned floating-point blue/green/red data format with the value stored as-is, packed in 32 bits. The format's precision is 10 bits of blue channel, 11 bits of green channel and 11 bits of red channel. .. _class_RenderingDevice_constant_DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32: @@ -1390,7 +1401,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32** = ``122`` - +Unsigned floating-point exposure/blue/green/red data format with the value stored as-is, packed in 32 bits. The format's precision is 5 bits of exposure, 9 bits of blue channel, 9 bits of green channel and 9 bits of red channel. .. _class_RenderingDevice_constant_DATA_FORMAT_D16_UNORM: @@ -1398,7 +1409,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_D16_UNORM** = ``123`` - +16-bit unsigned floating-point depth data format with normalized value. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_X8_D24_UNORM_PACK32: @@ -1406,7 +1417,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_X8_D24_UNORM_PACK32** = ``124`` - +24-bit unsigned floating-point depth data format with normalized value, plus 8 unused bits, packed in 32 bits. Values for depth are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_D32_SFLOAT: @@ -1414,7 +1425,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_D32_SFLOAT** = ``125`` - +32-bit signed floating-point depth data format with the value stored as-is. .. _class_RenderingDevice_constant_DATA_FORMAT_S8_UINT: @@ -1422,7 +1433,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_S8_UINT** = ``126`` - +8-bit unsigned integer stencil data format. .. _class_RenderingDevice_constant_DATA_FORMAT_D16_UNORM_S8_UINT: @@ -1430,7 +1441,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_D16_UNORM_S8_UINT** = ``127`` - +16-bit unsigned floating-point depth data format with normalized value, plus 8 bits of stencil in unsigned integer format. Values for depth are in the ``[0.0, 1.0]`` range. Values for stencil are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_D24_UNORM_S8_UINT: @@ -1438,7 +1449,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_D24_UNORM_S8_UINT** = ``128`` - +24-bit unsigned floating-point depth data format with normalized value, plus 8 bits of stencil in unsigned integer format. Values for depth are in the ``[0.0, 1.0]`` range. Values for stencil are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_D32_SFLOAT_S8_UINT: @@ -1446,7 +1457,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_D32_SFLOAT_S8_UINT** = ``129`` - +32-bit signed floating-point depth data format with the value stored as-is, plus 8 bits of stencil in unsigned integer format. Values for stencil are in the ``[0, 255]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_BC1_RGB_UNORM_BLOCK: @@ -1454,7 +1465,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC1_RGB_UNORM_BLOCK** = ``130`` - +VRAM-compressed unsigned red/green/blue channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel and 5 bits of blue channel. Using BC1 texture compression (also known as S3TC DXT1). .. _class_RenderingDevice_constant_DATA_FORMAT_BC1_RGB_SRGB_BLOCK: @@ -1462,7 +1473,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC1_RGB_SRGB_BLOCK** = ``131`` - +VRAM-compressed unsigned red/green/blue channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel and 5 bits of blue channel. Using BC1 texture compression (also known as S3TC DXT1). .. _class_RenderingDevice_constant_DATA_FORMAT_BC1_RGBA_UNORM_BLOCK: @@ -1470,7 +1481,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC1_RGBA_UNORM_BLOCK** = ``132`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 1 bit of alpha channel. Using BC1 texture compression (also known as S3TC DXT1). .. _class_RenderingDevice_constant_DATA_FORMAT_BC1_RGBA_SRGB_BLOCK: @@ -1478,7 +1489,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC1_RGBA_SRGB_BLOCK** = ``133`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 1 bit of alpha channel. Using BC1 texture compression (also known as S3TC DXT1). .. _class_RenderingDevice_constant_DATA_FORMAT_BC2_UNORM_BLOCK: @@ -1486,7 +1497,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC2_UNORM_BLOCK** = ``134`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 4 bits of alpha channel. Using BC2 texture compression (also known as S3TC DXT3). .. _class_RenderingDevice_constant_DATA_FORMAT_BC2_SRGB_BLOCK: @@ -1494,7 +1505,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC2_SRGB_BLOCK** = ``135`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 4 bits of alpha channel. Using BC2 texture compression (also known as S3TC DXT3). .. _class_RenderingDevice_constant_DATA_FORMAT_BC3_UNORM_BLOCK: @@ -1502,7 +1513,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC3_UNORM_BLOCK** = ``136`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 8 bits of alpha channel. Using BC3 texture compression (also known as S3TC DXT5). .. _class_RenderingDevice_constant_DATA_FORMAT_BC3_SRGB_BLOCK: @@ -1510,7 +1521,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC3_SRGB_BLOCK** = ``137`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 8 bits of alpha channel. Using BC3 texture compression (also known as S3TC DXT5). .. _class_RenderingDevice_constant_DATA_FORMAT_BC4_UNORM_BLOCK: @@ -1518,7 +1529,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC4_UNORM_BLOCK** = ``138`` - +VRAM-compressed unsigned red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. The format's precision is 8 bits of red channel. Using BC4 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_BC4_SNORM_BLOCK: @@ -1526,7 +1537,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC4_SNORM_BLOCK** = ``139`` - +VRAM-compressed signed red channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. The format's precision is 8 bits of red channel. Using BC4 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_BC5_UNORM_BLOCK: @@ -1534,7 +1545,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC5_UNORM_BLOCK** = ``140`` - +VRAM-compressed unsigned red/green channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. The format's precision is 8 bits of red channel and 8 bits of green channel. Using BC5 texture compression (also known as S3TC RGTC). .. _class_RenderingDevice_constant_DATA_FORMAT_BC5_SNORM_BLOCK: @@ -1542,7 +1553,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC5_SNORM_BLOCK** = ``141`` - +VRAM-compressed signed red/green channel data format with normalized value. Values are in the ``[-1.0, 1.0]`` range. The format's precision is 8 bits of red channel and 8 bits of green channel. Using BC5 texture compression (also known as S3TC RGTC). .. _class_RenderingDevice_constant_DATA_FORMAT_BC6H_UFLOAT_BLOCK: @@ -1550,7 +1561,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC6H_UFLOAT_BLOCK** = ``142`` - +VRAM-compressed unsigned red/green/blue channel data format with the floating-point value stored as-is. The format's precision is 8 bits of red channel and 8 bits of green channel. Using BC6H texture compression (also known as BPTC HDR). .. _class_RenderingDevice_constant_DATA_FORMAT_BC6H_SFLOAT_BLOCK: @@ -1558,7 +1569,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC6H_SFLOAT_BLOCK** = ``143`` - +VRAM-compressed signed red/green/blue channel data format with the floating-point value stored as-is. The format's precision is between 4 and 7 bits for the red/green/blue channels and between 0 and 8 bits for the alpha channel. Using BC7 texture compression (also known as BPTC HDR). .. _class_RenderingDevice_constant_DATA_FORMAT_BC7_UNORM_BLOCK: @@ -1566,7 +1577,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC7_UNORM_BLOCK** = ``144`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. The format's precision is between 4 and 7 bits for the red/green/blue channels and between 0 and 8 bits for the alpha channel. Also known as BPTC LDR. .. _class_RenderingDevice_constant_DATA_FORMAT_BC7_SRGB_BLOCK: @@ -1574,7 +1585,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_BC7_SRGB_BLOCK** = ``145`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. The format's precision is between 4 and 7 bits for the red/green/blue channels and between 0 and 8 bits for the alpha channel. Also known as BPTC LDR. .. _class_RenderingDevice_constant_DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: @@ -1582,7 +1593,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK** = ``146`` - +VRAM-compressed unsigned red/green/blue channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: @@ -1590,7 +1601,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK** = ``147`` - +VRAM-compressed unsigned red/green/blue channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: @@ -1598,7 +1609,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK** = ``148`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Red/green/blue use 8 bit of precision each, with alpha using 1 bit of precision. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: @@ -1606,7 +1617,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK** = ``149`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. Red/green/blue use 8 bit of precision each, with alpha using 1 bit of precision. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: @@ -1614,7 +1625,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK** = ``150`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Red/green/blue use 8 bits of precision each, with alpha using 8 bits of precision. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: @@ -1622,7 +1633,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK** = ``151`` - +VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the ``[0.0, 1.0]`` range. Red/green/blue use 8 bits of precision each, with alpha using 8 bits of precision. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_EAC_R11_UNORM_BLOCK: @@ -1630,7 +1641,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_EAC_R11_UNORM_BLOCK** = ``152`` - +11-bit VRAM-compressed unsigned red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_EAC_R11_SNORM_BLOCK: @@ -1638,7 +1649,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_EAC_R11_SNORM_BLOCK** = ``153`` - +11-bit VRAM-compressed signed red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_EAC_R11G11_UNORM_BLOCK: @@ -1646,7 +1657,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_EAC_R11G11_UNORM_BLOCK** = ``154`` - +11-bit VRAM-compressed unsigned red/green channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_EAC_R11G11_SNORM_BLOCK: @@ -1654,7 +1665,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_EAC_R11G11_SNORM_BLOCK** = ``155`` - +11-bit VRAM-compressed signed red/green channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Using ETC2 texture compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_4x4_UNORM_BLOCK: @@ -1662,7 +1673,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_4x4_UNORM_BLOCK** = ``156`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 4×4 blocks (highest quality). Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: @@ -1670,7 +1681,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_4x4_SRGB_BLOCK** = ``157`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 4×4 blocks (highest quality). Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_5x4_UNORM_BLOCK: @@ -1678,7 +1689,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_5x4_UNORM_BLOCK** = ``158`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 5×4 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_5x4_SRGB_BLOCK: @@ -1686,7 +1697,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_5x4_SRGB_BLOCK** = ``159`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 5×4 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_5x5_UNORM_BLOCK: @@ -1694,7 +1705,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_5x5_UNORM_BLOCK** = ``160`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 5×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_5x5_SRGB_BLOCK: @@ -1702,7 +1713,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_5x5_SRGB_BLOCK** = ``161`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 5×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_6x5_UNORM_BLOCK: @@ -1710,7 +1721,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_6x5_UNORM_BLOCK** = ``162`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 6×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_6x5_SRGB_BLOCK: @@ -1718,7 +1729,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_6x5_SRGB_BLOCK** = ``163`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 6×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_6x6_UNORM_BLOCK: @@ -1726,7 +1737,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_6x6_UNORM_BLOCK** = ``164`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 6×6 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_6x6_SRGB_BLOCK: @@ -1734,7 +1745,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_6x6_SRGB_BLOCK** = ``165`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 6×6 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_8x5_UNORM_BLOCK: @@ -1742,7 +1753,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_8x5_UNORM_BLOCK** = ``166`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 8×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_8x5_SRGB_BLOCK: @@ -1750,7 +1761,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_8x5_SRGB_BLOCK** = ``167`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 8×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_8x6_UNORM_BLOCK: @@ -1758,7 +1769,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_8x6_UNORM_BLOCK** = ``168`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 8×6 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_8x6_SRGB_BLOCK: @@ -1766,7 +1777,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_8x6_SRGB_BLOCK** = ``169`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 8×6 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: @@ -1774,7 +1785,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_8x8_UNORM_BLOCK** = ``170`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 8×8 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: @@ -1782,7 +1793,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_8x8_SRGB_BLOCK** = ``171`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 8×8 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x5_UNORM_BLOCK: @@ -1790,7 +1801,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x5_UNORM_BLOCK** = ``172`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 10×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x5_SRGB_BLOCK: @@ -1798,7 +1809,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x5_SRGB_BLOCK** = ``173`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10×5 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x6_UNORM_BLOCK: @@ -1806,7 +1817,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x6_UNORM_BLOCK** = ``174`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 10×6 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x6_SRGB_BLOCK: @@ -1814,7 +1825,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x6_SRGB_BLOCK** = ``175`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10×6 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x8_UNORM_BLOCK: @@ -1822,7 +1833,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x8_UNORM_BLOCK** = ``176`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 10×8 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x8_SRGB_BLOCK: @@ -1830,7 +1841,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x8_SRGB_BLOCK** = ``177`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10×8 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x10_UNORM_BLOCK: @@ -1838,7 +1849,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x10_UNORM_BLOCK** = ``178`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 10×10 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_10x10_SRGB_BLOCK: @@ -1846,7 +1857,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_10x10_SRGB_BLOCK** = ``179`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10×10 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_12x10_UNORM_BLOCK: @@ -1854,7 +1865,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_12x10_UNORM_BLOCK** = ``180`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 12×10 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_12x10_SRGB_BLOCK: @@ -1862,7 +1873,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_12x10_SRGB_BLOCK** = ``181`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 12×10 blocks. Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_12x12_UNORM_BLOCK: @@ -1870,7 +1881,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_12x12_UNORM_BLOCK** = ``182`` - +VRAM-compressed unsigned floating-point data format with normalized value, packed in 12 blocks (lowest quality). Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_ASTC_12x12_SRGB_BLOCK: @@ -1878,7 +1889,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_ASTC_12x12_SRGB_BLOCK** = ``183`` - +VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 12 blocks (lowest quality). Values are in the ``[0.0, 1.0]`` range. Using ASTC compression. .. _class_RenderingDevice_constant_DATA_FORMAT_G8B8G8R8_422_UNORM: @@ -1886,7 +1897,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G8B8G8R8_422_UNORM** = ``184`` - +8-bit-per-channel unsigned floating-point green/blue/red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_B8G8R8G8_422_UNORM: @@ -1894,7 +1905,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B8G8R8G8_422_UNORM** = ``185`` - +8-bit-per-channel unsigned floating-point blue/green/red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G8_B8_R8_3PLANE_420_UNORM: @@ -1902,7 +1913,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G8_B8_R8_3PLANE_420_UNORM** = ``186`` - +8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 3 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G8_B8R8_2PLANE_420_UNORM: @@ -1910,7 +1921,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G8_B8R8_2PLANE_420_UNORM** = ``187`` - +8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 2 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G8_B8_R8_3PLANE_422_UNORM: @@ -1918,7 +1929,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G8_B8_R8_3PLANE_422_UNORM** = ``188`` - +8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 2 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G8_B8R8_2PLANE_422_UNORM: @@ -1926,7 +1937,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G8_B8R8_2PLANE_422_UNORM** = ``189`` - +8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 2 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G8_B8_R8_3PLANE_444_UNORM: @@ -1934,7 +1945,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G8_B8_R8_3PLANE_444_UNORM** = ``190`` - +8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 3 separate planes. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R10X6_UNORM_PACK16: @@ -1942,7 +1953,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R10X6_UNORM_PACK16** = ``191`` - +10-bit-per-channel unsigned floating-point red channel data with normalized value, plus 6 unused bits, packed in 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R10X6G10X6_UNORM_2PACK16: @@ -1950,7 +1961,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R10X6G10X6_UNORM_2PACK16** = ``192`` - +10-bit-per-channel unsigned floating-point red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 2×16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: @@ -1958,7 +1969,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16** = ``193`` - +10-bit-per-channel unsigned floating-point red/green/blue/alpha channel data with normalized value, plus 6 unused bits after each channel, packed in 4×16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: @@ -1966,7 +1977,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16** = ``194`` - +10-bit-per-channel unsigned floating-point green/blue/green/red channel data with normalized value, plus 6 unused bits after each channel, packed in 4×16 bits. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. .. _class_RenderingDevice_constant_DATA_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: @@ -1974,7 +1985,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16** = ``195`` - +10-bit-per-channel unsigned floating-point blue/green/red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 4×16 bits. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. .. _class_RenderingDevice_constant_DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: @@ -1982,7 +1993,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16** = ``196`` - +10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 2 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: @@ -1990,7 +2001,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16** = ``197`` - +10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 2 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: @@ -1998,7 +2009,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16** = ``198`` - +10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 3 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: @@ -2006,7 +2017,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16** = ``199`` - +10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 3 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: @@ -2014,7 +2025,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16** = ``200`` - +10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 3 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R12X4_UNORM_PACK16: @@ -2022,7 +2033,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R12X4_UNORM_PACK16** = ``201`` - +12-bit-per-channel unsigned floating-point red channel data with normalized value, plus 6 unused bits, packed in 16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R12X4G12X4_UNORM_2PACK16: @@ -2030,7 +2041,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R12X4G12X4_UNORM_2PACK16** = ``202`` - +12-bit-per-channel unsigned floating-point red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 2×16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: @@ -2038,7 +2049,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16** = ``203`` - +12-bit-per-channel unsigned floating-point red/green/blue/alpha channel data with normalized value, plus 6 unused bits after each channel, packed in 4×16 bits. Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: @@ -2046,7 +2057,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16** = ``204`` - +12-bit-per-channel unsigned floating-point green/blue/green/red channel data with normalized value, plus 6 unused bits after each channel, packed in 4×16 bits. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. .. _class_RenderingDevice_constant_DATA_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: @@ -2054,7 +2065,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16** = ``205`` - +12-bit-per-channel unsigned floating-point blue/green/red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 4×16 bits. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. .. _class_RenderingDevice_constant_DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: @@ -2062,7 +2073,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16** = ``206`` - +12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 2 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: @@ -2070,7 +2081,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16** = ``207`` - +12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 2 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: @@ -2078,7 +2089,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16** = ``208`` - +12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 3 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: @@ -2086,7 +2097,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16** = ``209`` - +12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 3 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: @@ -2094,7 +2105,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16** = ``210`` - +12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3×16 bits and stored across 3 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_G16B16G16R16_422_UNORM: @@ -2102,7 +2113,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G16B16G16R16_422_UNORM** = ``211`` - +16-bit-per-channel unsigned floating-point green/blue/red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_B16G16R16G16_422_UNORM: @@ -2110,7 +2121,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_B16G16R16G16_422_UNORM** = ``212`` - +16-bit-per-channel unsigned floating-point blue/green/red channel data format with normalized value. Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G16_B16_R16_3PLANE_420_UNORM: @@ -2118,7 +2129,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G16_B16_R16_3PLANE_420_UNORM** = ``213`` - +16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 2 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G16_B16R16_2PLANE_420_UNORM: @@ -2126,7 +2137,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G16_B16R16_2PLANE_420_UNORM** = ``214`` - +16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 2 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2×2 adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM: @@ -2134,7 +2145,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM** = ``215`` - +16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 3 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM: @@ -2142,7 +2153,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM** = ``216`` - +16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 3 separate planes (green + blue/red). Values are in the ``[0.0, 1.0]`` range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). .. _class_RenderingDevice_constant_DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM: @@ -2150,7 +2161,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM** = ``217`` - +16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 3 separate planes (green + blue + red). Values are in the ``[0.0, 1.0]`` range. .. _class_RenderingDevice_constant_DATA_FORMAT_MAX: @@ -2158,7 +2169,7 @@ enum **DataFormat**: :ref:`DataFormat` **DATA_FORMAT_MAX** = ``218`` - +Represents the size of the :ref:`DataFormat` enum. .. rst-class:: classref-item-separator @@ -2176,7 +2187,7 @@ flags **BarrierMask**: :ref:`BarrierMask` **BARRIER_MASK_RASTER** = ``1`` - +Raster barrier mask. .. _class_RenderingDevice_constant_BARRIER_MASK_COMPUTE: @@ -2184,7 +2195,7 @@ flags **BarrierMask**: :ref:`BarrierMask` **BARRIER_MASK_COMPUTE** = ``2`` - +Compute barrier mask. .. _class_RenderingDevice_constant_BARRIER_MASK_TRANSFER: @@ -2192,7 +2203,7 @@ flags **BarrierMask**: :ref:`BarrierMask` **BARRIER_MASK_TRANSFER** = ``4`` - +Transfer barrier mask. .. _class_RenderingDevice_constant_BARRIER_MASK_ALL_BARRIERS: @@ -2200,7 +2211,7 @@ flags **BarrierMask**: :ref:`BarrierMask` **BARRIER_MASK_ALL_BARRIERS** = ``7`` - +Barrier mask for all types (raster, compute, transfer). Equivalent to ``BARRIER_MASK_RASTER | BARRIER_MASK_COMPUTE | BARRIER_MASK_TRANSFER``. .. _class_RenderingDevice_constant_BARRIER_MASK_NO_BARRIER: @@ -2208,7 +2219,7 @@ flags **BarrierMask**: :ref:`BarrierMask` **BARRIER_MASK_NO_BARRIER** = ``8`` - +No barrier for any type. .. rst-class:: classref-item-separator @@ -2300,7 +2311,7 @@ enum **TextureSamples**: :ref:`TextureSamples` **TEXTURE_SAMPLES_1** = ``0`` - +Perform 1 texture sample (this is the fastest but lowest-quality for antialiasing). .. _class_RenderingDevice_constant_TEXTURE_SAMPLES_2: @@ -2308,7 +2319,7 @@ enum **TextureSamples**: :ref:`TextureSamples` **TEXTURE_SAMPLES_2** = ``1`` - +Perform 2 texture samples. .. _class_RenderingDevice_constant_TEXTURE_SAMPLES_4: @@ -2316,7 +2327,7 @@ enum **TextureSamples**: :ref:`TextureSamples` **TEXTURE_SAMPLES_4** = ``2`` - +Perform 4 texture samples. .. _class_RenderingDevice_constant_TEXTURE_SAMPLES_8: @@ -2324,7 +2335,7 @@ enum **TextureSamples**: :ref:`TextureSamples` **TEXTURE_SAMPLES_8** = ``3`` - +Perform 8 texture samples. Not supported on mobile GPUs (including Apple Silicon). .. _class_RenderingDevice_constant_TEXTURE_SAMPLES_16: @@ -2332,7 +2343,7 @@ enum **TextureSamples**: :ref:`TextureSamples` **TEXTURE_SAMPLES_16** = ``4`` - +Perform 16 texture samples. Not supported on mobile GPUs and many desktop GPUs. .. _class_RenderingDevice_constant_TEXTURE_SAMPLES_32: @@ -2340,7 +2351,7 @@ enum **TextureSamples**: :ref:`TextureSamples` **TEXTURE_SAMPLES_32** = ``5`` - +Perform 32 texture samples. Not supported on most GPUs. .. _class_RenderingDevice_constant_TEXTURE_SAMPLES_64: @@ -2348,7 +2359,7 @@ enum **TextureSamples**: :ref:`TextureSamples` **TEXTURE_SAMPLES_64** = ``6`` - +Perform 64 texture samples (this is the slowest but highest-quality for antialiasing). Not supported on most GPUs. .. _class_RenderingDevice_constant_TEXTURE_SAMPLES_MAX: @@ -2374,7 +2385,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_SAMPLING_BIT** = ``1`` - +Texture can be sampled. .. _class_RenderingDevice_constant_TEXTURE_USAGE_COLOR_ATTACHMENT_BIT: @@ -2382,7 +2393,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_COLOR_ATTACHMENT_BIT** = ``2`` - +Texture can be used as a color attachment in a framebuffer. .. _class_RenderingDevice_constant_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT: @@ -2390,7 +2401,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT** = ``4`` - +Texture can be used as a depth/stencil attachment in a framebuffer. .. _class_RenderingDevice_constant_TEXTURE_USAGE_STORAGE_BIT: @@ -2398,7 +2409,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_STORAGE_BIT** = ``8`` - +Texture can be used as a `storage image `__. .. _class_RenderingDevice_constant_TEXTURE_USAGE_STORAGE_ATOMIC_BIT: @@ -2406,7 +2417,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_STORAGE_ATOMIC_BIT** = ``16`` - +Texture can be used as a `storage image `__ with support for atomic operations. .. _class_RenderingDevice_constant_TEXTURE_USAGE_CPU_READ_BIT: @@ -2414,7 +2425,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_CPU_READ_BIT** = ``32`` - +Texture can be read back on the CPU using :ref:`texture_get_data` faster than without this bit, since it is always kept in the system memory. .. _class_RenderingDevice_constant_TEXTURE_USAGE_CAN_UPDATE_BIT: @@ -2422,7 +2433,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_CAN_UPDATE_BIT** = ``64`` - +Texture can be updated using :ref:`texture_update`. .. _class_RenderingDevice_constant_TEXTURE_USAGE_CAN_COPY_FROM_BIT: @@ -2430,7 +2441,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_CAN_COPY_FROM_BIT** = ``128`` - +Texture can be a source for :ref:`texture_copy`. .. _class_RenderingDevice_constant_TEXTURE_USAGE_CAN_COPY_TO_BIT: @@ -2438,7 +2449,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_CAN_COPY_TO_BIT** = ``256`` - +Texture can be a destination for :ref:`texture_copy`. .. _class_RenderingDevice_constant_TEXTURE_USAGE_INPUT_ATTACHMENT_BIT: @@ -2446,7 +2457,7 @@ flags **TextureUsageBits**: :ref:`TextureUsageBits` **TEXTURE_USAGE_INPUT_ATTACHMENT_BIT** = ``512`` - +Texture can be used as a `input attachment `__ in a framebuffer. .. rst-class:: classref-item-separator @@ -2464,7 +2475,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_IDENTITY** = ``0`` - +Return the sampled value as-is. .. _class_RenderingDevice_constant_TEXTURE_SWIZZLE_ZERO: @@ -2472,7 +2483,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_ZERO** = ``1`` - +Always return ``0.0`` when sampling. .. _class_RenderingDevice_constant_TEXTURE_SWIZZLE_ONE: @@ -2480,7 +2491,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_ONE** = ``2`` - +Always return ``1.0`` when sampling. .. _class_RenderingDevice_constant_TEXTURE_SWIZZLE_R: @@ -2488,7 +2499,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_R** = ``3`` - +Sample the red color channel. .. _class_RenderingDevice_constant_TEXTURE_SWIZZLE_G: @@ -2496,7 +2507,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_G** = ``4`` - +Sample the green color channel. .. _class_RenderingDevice_constant_TEXTURE_SWIZZLE_B: @@ -2504,7 +2515,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_B** = ``5`` - +Sample the blue color channel. .. _class_RenderingDevice_constant_TEXTURE_SWIZZLE_A: @@ -2512,7 +2523,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_A** = ``6`` - +Sample the alpha channel. .. _class_RenderingDevice_constant_TEXTURE_SWIZZLE_MAX: @@ -2520,7 +2531,7 @@ enum **TextureSwizzle**: :ref:`TextureSwizzle` **TEXTURE_SWIZZLE_MAX** = ``7`` - +Represents the size of the :ref:`TextureSwizzle` enum. .. rst-class:: classref-item-separator @@ -2538,7 +2549,7 @@ enum **TextureSliceType**: :ref:`TextureSliceType` **TEXTURE_SLICE_2D** = ``0`` - +2-dimensional texture slice. .. _class_RenderingDevice_constant_TEXTURE_SLICE_CUBEMAP: @@ -2546,7 +2557,7 @@ enum **TextureSliceType**: :ref:`TextureSliceType` **TEXTURE_SLICE_CUBEMAP** = ``1`` - +Cubemap texture slice. .. _class_RenderingDevice_constant_TEXTURE_SLICE_3D: @@ -2554,7 +2565,7 @@ enum **TextureSliceType**: :ref:`TextureSliceType` **TEXTURE_SLICE_3D** = ``2`` - +3-dimensional texture slice. .. rst-class:: classref-item-separator @@ -2598,7 +2609,7 @@ enum **SamplerRepeatMode**: :ref:`SamplerRepeatMode` **SAMPLER_REPEAT_MODE_REPEAT** = ``0`` - +Sample with repeating enabled. .. _class_RenderingDevice_constant_SAMPLER_REPEAT_MODE_MIRRORED_REPEAT: @@ -2606,7 +2617,7 @@ enum **SamplerRepeatMode**: :ref:`SamplerRepeatMode` **SAMPLER_REPEAT_MODE_MIRRORED_REPEAT** = ``1`` - +Sample with mirrored repeating enabled. When sampling outside the ``[0.0, 1.0]`` range, return a mirrored version of the sampler. This mirrored version is mirrored again if sampling further away, with the pattern repeating indefinitely. .. _class_RenderingDevice_constant_SAMPLER_REPEAT_MODE_CLAMP_TO_EDGE: @@ -2614,7 +2625,7 @@ enum **SamplerRepeatMode**: :ref:`SamplerRepeatMode` **SAMPLER_REPEAT_MODE_CLAMP_TO_EDGE** = ``2`` - +Sample with repeating disabled. When sampling outside the ``[0.0, 1.0]`` range, return the color of the last pixel on the edge. .. _class_RenderingDevice_constant_SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER: @@ -2622,7 +2633,7 @@ enum **SamplerRepeatMode**: :ref:`SamplerRepeatMode` **SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER** = ``3`` - +Sample with repeating disabled. When sampling outside the ``[0.0, 1.0]`` range, return the specified :ref:`RDSamplerState.border_color`. .. _class_RenderingDevice_constant_SAMPLER_REPEAT_MODE_MIRROR_CLAMP_TO_EDGE: @@ -2630,7 +2641,7 @@ enum **SamplerRepeatMode**: :ref:`SamplerRepeatMode` **SAMPLER_REPEAT_MODE_MIRROR_CLAMP_TO_EDGE** = ``4`` - +Sample with mirrored repeating enabled, but only once. When sampling in the ``[-1.0, 0.0]`` range, return a mirrored version of the sampler. When sampling outside the ``[-1.0, 1.0]`` range, return the color of the last pixel on the edge. .. _class_RenderingDevice_constant_SAMPLER_REPEAT_MODE_MAX: @@ -2638,7 +2649,7 @@ enum **SamplerRepeatMode**: :ref:`SamplerRepeatMode` **SAMPLER_REPEAT_MODE_MAX** = ``5`` - +Represents the size of the :ref:`SamplerRepeatMode` enum. .. rst-class:: classref-item-separator @@ -2656,7 +2667,7 @@ enum **SamplerBorderColor**: :ref:`SamplerBorderColor` **SAMPLER_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK** = ``0`` - +Return a floating-point transparent black color when sampling outside the ``[0.0, 1.0]`` range. Only effective if the sampler repeat mode is :ref:`SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER`. .. _class_RenderingDevice_constant_SAMPLER_BORDER_COLOR_INT_TRANSPARENT_BLACK: @@ -2664,7 +2675,7 @@ enum **SamplerBorderColor**: :ref:`SamplerBorderColor` **SAMPLER_BORDER_COLOR_INT_TRANSPARENT_BLACK** = ``1`` - +Return a integer transparent black color when sampling outside the ``[0.0, 1.0]`` range. Only effective if the sampler repeat mode is :ref:`SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER`. .. _class_RenderingDevice_constant_SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_BLACK: @@ -2672,7 +2683,7 @@ enum **SamplerBorderColor**: :ref:`SamplerBorderColor` **SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_BLACK** = ``2`` - +Return a floating-point opaque black color when sampling outside the ``[0.0, 1.0]`` range. Only effective if the sampler repeat mode is :ref:`SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER`. .. _class_RenderingDevice_constant_SAMPLER_BORDER_COLOR_INT_OPAQUE_BLACK: @@ -2680,7 +2691,7 @@ enum **SamplerBorderColor**: :ref:`SamplerBorderColor` **SAMPLER_BORDER_COLOR_INT_OPAQUE_BLACK** = ``3`` - +Return a integer opaque black color when sampling outside the ``[0.0, 1.0]`` range. Only effective if the sampler repeat mode is :ref:`SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER`. .. _class_RenderingDevice_constant_SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_WHITE: @@ -2688,7 +2699,7 @@ enum **SamplerBorderColor**: :ref:`SamplerBorderColor` **SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_WHITE** = ``4`` - +Return a floating-point opaque white color when sampling outside the ``[0.0, 1.0]`` range. Only effective if the sampler repeat mode is :ref:`SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER`. .. _class_RenderingDevice_constant_SAMPLER_BORDER_COLOR_INT_OPAQUE_WHITE: @@ -2696,7 +2707,7 @@ enum **SamplerBorderColor**: :ref:`SamplerBorderColor` **SAMPLER_BORDER_COLOR_INT_OPAQUE_WHITE** = ``5`` - +Return a integer opaque white color when sampling outside the ``[0.0, 1.0]`` range. Only effective if the sampler repeat mode is :ref:`SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER`. .. _class_RenderingDevice_constant_SAMPLER_BORDER_COLOR_MAX: @@ -2704,7 +2715,7 @@ enum **SamplerBorderColor**: :ref:`SamplerBorderColor` **SAMPLER_BORDER_COLOR_MAX** = ``6`` - +Represents the size of the :ref:`SamplerBorderColor` enum. .. rst-class:: classref-item-separator @@ -2722,7 +2733,7 @@ enum **VertexFrequency**: :ref:`VertexFrequency` **VERTEX_FREQUENCY_VERTEX** = ``0`` - +Vertex attribute addressing is a function of the vertex. This is used to specify the rate at which vertex attributes are pulled from buffers. .. _class_RenderingDevice_constant_VERTEX_FREQUENCY_INSTANCE: @@ -2730,7 +2741,7 @@ enum **VertexFrequency**: :ref:`VertexFrequency` **VERTEX_FREQUENCY_INSTANCE** = ``1`` - +Vertex attribute addressing is a function of the instance index. This is used to specify the rate at which vertex attributes are pulled from buffers. .. rst-class:: classref-item-separator @@ -2748,7 +2759,7 @@ enum **IndexBufferFormat**: :ref:`IndexBufferFormat` **INDEX_BUFFER_FORMAT_UINT16** = ``0`` - +Index buffer in 16-bit unsigned integer format. This limits the maximum index that can be specified to ``65535``. .. _class_RenderingDevice_constant_INDEX_BUFFER_FORMAT_UINT32: @@ -2756,7 +2767,7 @@ enum **IndexBufferFormat**: :ref:`IndexBufferFormat` **INDEX_BUFFER_FORMAT_UINT32** = ``1`` - +Index buffer in 32-bit unsigned integer format. This limits the maximum index that can be specified to ``4294967295``. .. rst-class:: classref-item-separator @@ -2792,7 +2803,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_SAMPLER** = ``0`` - +Sampler uniform. TODO: Difference between sampler and texture uniform .. _class_RenderingDevice_constant_UNIFORM_TYPE_SAMPLER_WITH_TEXTURE: @@ -2800,7 +2811,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_SAMPLER_WITH_TEXTURE** = ``1`` - +Sampler uniform with a texture. .. _class_RenderingDevice_constant_UNIFORM_TYPE_TEXTURE: @@ -2808,7 +2819,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_TEXTURE** = ``2`` - +Texture uniform. .. _class_RenderingDevice_constant_UNIFORM_TYPE_IMAGE: @@ -2816,7 +2827,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_IMAGE** = ``3`` - +Image uniform. TODO: Difference between texture and image uniform .. _class_RenderingDevice_constant_UNIFORM_TYPE_TEXTURE_BUFFER: @@ -2824,7 +2835,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_TEXTURE_BUFFER** = ``4`` - +Texture buffer uniform. TODO: Difference between texture and texture buffe uniformr .. _class_RenderingDevice_constant_UNIFORM_TYPE_SAMPLER_WITH_TEXTURE_BUFFER: @@ -2832,7 +2843,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_SAMPLER_WITH_TEXTURE_BUFFER** = ``5`` - +Sampler uniform with a texture buffer. TODO: Difference between texture and texture buffer uniform .. _class_RenderingDevice_constant_UNIFORM_TYPE_IMAGE_BUFFER: @@ -2840,7 +2851,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_IMAGE_BUFFER** = ``6`` - +Image buffer uniform. TODO: Difference between texture and image uniforms .. _class_RenderingDevice_constant_UNIFORM_TYPE_UNIFORM_BUFFER: @@ -2848,7 +2859,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_UNIFORM_BUFFER** = ``7`` - +Uniform buffer uniform. .. _class_RenderingDevice_constant_UNIFORM_TYPE_STORAGE_BUFFER: @@ -2856,7 +2867,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_STORAGE_BUFFER** = ``8`` - +`Storage buffer `__ uniform. .. _class_RenderingDevice_constant_UNIFORM_TYPE_INPUT_ATTACHMENT: @@ -2864,7 +2875,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_INPUT_ATTACHMENT** = ``9`` - +Input attachment uniform. .. _class_RenderingDevice_constant_UNIFORM_TYPE_MAX: @@ -2872,7 +2883,7 @@ enum **UniformType**: :ref:`UniformType` **UNIFORM_TYPE_MAX** = ``10`` - +Represents the size of the :ref:`UniformType` enum. .. rst-class:: classref-item-separator @@ -2898,7 +2909,7 @@ Point rendering primitive (with constant size, regardless of distance from camer :ref:`RenderPrimitive` **RENDER_PRIMITIVE_LINES** = ``1`` -Line rendering primitive. +Line list rendering primitive. Lines are drawn separated from each other. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_LINES_WITH_ADJACENCY: @@ -2906,7 +2917,9 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_LINES_WITH_ADJACENCY** = ``2`` +`Line list rendering primitive with adjacency. `__\ +\ **Note:** Adjacency is only useful with geometry shaders, which Godot does not expose. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_LINESTRIPS: @@ -2914,7 +2927,7 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_LINESTRIPS** = ``3`` - +Line strip rendering primitive. Lines drawn are connected to the previous vertex. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_LINESTRIPS_WITH_ADJACENCY: @@ -2922,7 +2935,9 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_LINESTRIPS_WITH_ADJACENCY** = ``4`` +`Line strip rendering primitive with adjacency. `__\ +\ **Note:** Adjacency is only useful with geometry shaders, which Godot does not expose. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_TRIANGLES: @@ -2930,7 +2945,7 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_TRIANGLES** = ``5`` - +Triangle list rendering primitive. Triangles are drawn separated from each other. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_TRIANGLES_WITH_ADJACENCY: @@ -2938,7 +2953,9 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_TRIANGLES_WITH_ADJACENCY** = ``6`` +`Triangle list rendering primitive with adjacency. `__\ + **Note:** Adjacency is only useful with geometry shaders, which Godot does not expose. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_TRIANGLE_STRIPS: @@ -2946,7 +2963,7 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_TRIANGLE_STRIPS** = ``7`` - +Triangle strip rendering primitive. Triangles drawn are connected to the previous triangle. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_AJACENCY: @@ -2954,7 +2971,9 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_AJACENCY** = ``8`` +`Triangle strip rendering primitive with adjacency. `__\ +\ **Note:** Adjacency is only useful with geometry shaders, which Godot does not expose. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_RESTART_INDEX: @@ -2962,7 +2981,9 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_RESTART_INDEX** = ``9`` +Triangle strip rendering primitive with *primitive restart* enabled. Triangles drawn are connected to the previous triangle, but a primitive restart index can be specified before drawing to create a second triangle strip after the specified index. +\ **Note:** Only compatible with indexed draws. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_TESSELATION_PATCH: @@ -2970,7 +2991,7 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_TESSELATION_PATCH** = ``10`` - +Tessellation patch rendering primitive. Only useful with tessellation shaders, which can be used to deform these patches. .. _class_RenderingDevice_constant_RENDER_PRIMITIVE_MAX: @@ -2978,7 +2999,7 @@ Line rendering primitive. :ref:`RenderPrimitive` **RENDER_PRIMITIVE_MAX** = ``11`` - +Represents the size of the :ref:`RenderPrimitive` enum. .. rst-class:: classref-item-separator @@ -2996,7 +3017,7 @@ enum **PolygonCullMode**: :ref:`PolygonCullMode` **POLYGON_CULL_DISABLED** = ``0`` - +Do not use polygon front face or backface culling. .. _class_RenderingDevice_constant_POLYGON_CULL_FRONT: @@ -3004,7 +3025,7 @@ enum **PolygonCullMode**: :ref:`PolygonCullMode` **POLYGON_CULL_FRONT** = ``1`` - +Use polygon frontface culling (faces pointing towards the camera are hidden). .. _class_RenderingDevice_constant_POLYGON_CULL_BACK: @@ -3012,7 +3033,7 @@ enum **PolygonCullMode**: :ref:`PolygonCullMode` **POLYGON_CULL_BACK** = ``2`` - +Use polygon backface culling (faces pointing away from the camera are hidden). .. rst-class:: classref-item-separator @@ -3030,7 +3051,7 @@ enum **PolygonFrontFace**: :ref:`PolygonFrontFace` **POLYGON_FRONT_FACE_CLOCKWISE** = ``0`` - +Clockwise winding order to determine which face of a polygon is its front face. .. _class_RenderingDevice_constant_POLYGON_FRONT_FACE_COUNTER_CLOCKWISE: @@ -3038,7 +3059,7 @@ enum **PolygonFrontFace**: :ref:`PolygonFrontFace` **POLYGON_FRONT_FACE_COUNTER_CLOCKWISE** = ``1`` - +Counter-clockwise winding order to determine which face of a polygon is its front face. .. rst-class:: classref-item-separator @@ -3056,7 +3077,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_KEEP** = ``0`` - +Keep the current stencil value. .. _class_RenderingDevice_constant_STENCIL_OP_ZERO: @@ -3064,7 +3085,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_ZERO** = ``1`` - +Set the stencil value to ``0``. .. _class_RenderingDevice_constant_STENCIL_OP_REPLACE: @@ -3072,7 +3093,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_REPLACE** = ``2`` - +Replace the existing stencil value with the new one. .. _class_RenderingDevice_constant_STENCIL_OP_INCREMENT_AND_CLAMP: @@ -3080,7 +3101,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_INCREMENT_AND_CLAMP** = ``3`` - +Increment the existing stencil value and clamp to the maximum representable unsigned value if reached. Stencil bits are considered as an unsigned integer. .. _class_RenderingDevice_constant_STENCIL_OP_DECREMENT_AND_CLAMP: @@ -3088,7 +3109,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_DECREMENT_AND_CLAMP** = ``4`` - +Decrement the existing stencil value and clamp to the minimum value if reached. Stencil bits are considered as an unsigned integer. .. _class_RenderingDevice_constant_STENCIL_OP_INVERT: @@ -3096,7 +3117,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_INVERT** = ``5`` - +Bitwise-invert the existing stencil value. .. _class_RenderingDevice_constant_STENCIL_OP_INCREMENT_AND_WRAP: @@ -3104,7 +3125,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_INCREMENT_AND_WRAP** = ``6`` - +Increment the stencil value and wrap around to ``0`` if reaching the maximum representable unsigned. Stencil bits are considered as an unsigned integer. .. _class_RenderingDevice_constant_STENCIL_OP_DECREMENT_AND_WRAP: @@ -3112,7 +3133,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_DECREMENT_AND_WRAP** = ``7`` - +Decrement the stencil value and wrap around to the maximum representable unsigned if reaching the minimum. Stencil bits are considered as an unsigned integer. .. _class_RenderingDevice_constant_STENCIL_OP_MAX: @@ -3120,7 +3141,7 @@ enum **StencilOperation**: :ref:`StencilOperation` **STENCIL_OP_MAX** = ``8`` - +Represents the size of the :ref:`StencilOperation` enum. .. rst-class:: classref-item-separator @@ -3138,7 +3159,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_NEVER** = ``0`` - +"Never" comparison (opposite of :ref:`COMPARE_OP_ALWAYS`). .. _class_RenderingDevice_constant_COMPARE_OP_LESS: @@ -3146,7 +3167,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_LESS** = ``1`` - +"Less than" comparison. .. _class_RenderingDevice_constant_COMPARE_OP_EQUAL: @@ -3154,7 +3175,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_EQUAL** = ``2`` - +"Equal" comparison. .. _class_RenderingDevice_constant_COMPARE_OP_LESS_OR_EQUAL: @@ -3162,7 +3183,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_LESS_OR_EQUAL** = ``3`` - +"Less than or equal" comparison. .. _class_RenderingDevice_constant_COMPARE_OP_GREATER: @@ -3170,7 +3191,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_GREATER** = ``4`` - +"Greater than" comparison. .. _class_RenderingDevice_constant_COMPARE_OP_NOT_EQUAL: @@ -3178,7 +3199,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_NOT_EQUAL** = ``5`` - +"Not equal" comparison. .. _class_RenderingDevice_constant_COMPARE_OP_GREATER_OR_EQUAL: @@ -3186,7 +3207,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_GREATER_OR_EQUAL** = ``6`` - +"Greater than or equal" comparison. .. _class_RenderingDevice_constant_COMPARE_OP_ALWAYS: @@ -3194,7 +3215,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_ALWAYS** = ``7`` - +"Always" comparison (opposite of :ref:`COMPARE_OP_NEVER`). .. _class_RenderingDevice_constant_COMPARE_OP_MAX: @@ -3202,7 +3223,7 @@ enum **CompareOperator**: :ref:`CompareOperator` **COMPARE_OP_MAX** = ``8`` - +Represents the size of the :ref:`CompareOperator` enum. .. rst-class:: classref-item-separator @@ -3220,7 +3241,7 @@ enum **LogicOperation**: :ref:`LogicOperation` **LOGIC_OP_CLEAR** = ``0`` - +Clear logic operation (result is always ``0``). See also :ref:`LOGIC_OP_SET`. .. _class_RenderingDevice_constant_LOGIC_OP_AND: @@ -3228,7 +3249,7 @@ enum **LogicOperation**: :ref:`LogicOperation` **LOGIC_OP_AND** = ``1`` - +AND logic operation. .. _class_RenderingDevice_constant_LOGIC_OP_AND_REVERSE: @@ -3236,7 +3257,7 @@ enum **LogicOperation**: :ref:`LogicOperation` **LOGIC_OP_AND_REVERSE** = ``2`` - +AND logic operation with the *destination* operand being inverted. See also :ref:`LOGIC_OP_AND_INVERTED`. .. _class_RenderingDevice_constant_LOGIC_OP_COPY: @@ -3244,7 +3265,7 @@ enum **LogicOperation**: :ref:`LogicOperation` **LOGIC_OP_COPY** = ``3`` - +Copy logic operation (keeps the *source* value as-is). See also :ref:`LOGIC_OP_COPY_INVERTED` and :ref:`LOGIC_OP_NO_OP`. .. _class_RenderingDevice_constant_LOGIC_OP_AND_INVERTED: @@ -3252,7 +3273,7 @@ enum **LogicOperation**: :ref:`LogicOperation` **LOGIC_OP_AND_INVERTED** = ``4`` - +AND logic operation with the *source* operand being inverted. See also :ref:`LOGIC_OP_AND_REVERSE`. .. _class_RenderingDevice_constant_LOGIC_OP_NO_OP: @@ -3260,7 +3281,7 @@ enum **LogicOperation**: :ref:`LogicOperation` **LOGIC_OP_NO_OP** = ``5`` - +No-op logic operation (keeps the *destination* value as-is). See also :ref:`LOGIC_OP_COPY`. .. _class_RenderingDevice_constant_LOGIC_OP_XOR: @@ -3276,7 +3297,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_OR** = ``7`` - +OR logic operation. .. _class_RenderingDevice_constant_LOGIC_OP_NOR: @@ -3284,7 +3305,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_NOR** = ``8`` - +Not-OR (NOR) logic operation. .. _class_RenderingDevice_constant_LOGIC_OP_EQUIVALENT: @@ -3292,7 +3313,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_EQUIVALENT** = ``9`` - +Not-XOR (XNOR) logic operation. .. _class_RenderingDevice_constant_LOGIC_OP_INVERT: @@ -3300,7 +3321,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_INVERT** = ``10`` - +Invert logic operation. .. _class_RenderingDevice_constant_LOGIC_OP_OR_REVERSE: @@ -3308,7 +3329,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_OR_REVERSE** = ``11`` - +OR logic operation with the *destination* operand being inverted. See also :ref:`LOGIC_OP_OR_REVERSE`. .. _class_RenderingDevice_constant_LOGIC_OP_COPY_INVERTED: @@ -3316,7 +3337,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_COPY_INVERTED** = ``12`` - +NOT logic operation (inverts the value). See also :ref:`LOGIC_OP_COPY`. .. _class_RenderingDevice_constant_LOGIC_OP_OR_INVERTED: @@ -3324,7 +3345,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_OR_INVERTED** = ``13`` - +OR logic operation with the *source* operand being inverted. See also :ref:`LOGIC_OP_OR_REVERSE`. .. _class_RenderingDevice_constant_LOGIC_OP_NAND: @@ -3332,7 +3353,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_NAND** = ``14`` - +Not-AND (NAND) logic operation. .. _class_RenderingDevice_constant_LOGIC_OP_SET: @@ -3340,7 +3361,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_SET** = ``15`` - +SET logic operation (result is always ``1``). See also :ref:`LOGIC_OP_CLEAR`. .. _class_RenderingDevice_constant_LOGIC_OP_MAX: @@ -3348,7 +3369,7 @@ Exclusive or (XOR) logic operation. :ref:`LogicOperation` **LOGIC_OP_MAX** = ``16`` - +Represents the size of the :ref:`LogicOperation` enum. .. rst-class:: classref-item-separator @@ -3366,7 +3387,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ZERO** = ``0`` - +Constant ``0.0`` blend factor. .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE: @@ -3374,7 +3395,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE** = ``1`` - +Constant ``1.0`` blend factor. .. _class_RenderingDevice_constant_BLEND_FACTOR_SRC_COLOR: @@ -3382,7 +3403,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_SRC_COLOR** = ``2`` - +Color blend factor is ``source color``. Alpha blend factor is ``source alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: @@ -3390,7 +3411,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_SRC_COLOR** = ``3`` - +Color blend factor is ``1.0 - source color``. Alpha blend factor is ``1.0 - source alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_DST_COLOR: @@ -3398,7 +3419,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_DST_COLOR** = ``4`` - +Color blend factor is ``destination color``. Alpha blend factor is ``destination alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_DST_COLOR: @@ -3406,7 +3427,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_DST_COLOR** = ``5`` - +Color blend factor is ``1.0 - destination color``. Alpha blend factor is ``1.0 - destination alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_SRC_ALPHA: @@ -3414,7 +3435,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_SRC_ALPHA** = ``6`` - +Color and alpha blend factor is ``source alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA: @@ -3422,7 +3443,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_SRC_ALPHA** = ``7`` - +Color and alpha blend factor is ``1.0 - source alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_DST_ALPHA: @@ -3430,7 +3451,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_DST_ALPHA** = ``8`` - +Color and alpha blend factor is ``destination alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_DST_ALPHA: @@ -3438,7 +3459,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_DST_ALPHA** = ``9`` - +Color and alpha blend factor is ``1.0 - destination alpha``. .. _class_RenderingDevice_constant_BLEND_FACTOR_CONSTANT_COLOR: @@ -3446,7 +3467,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_CONSTANT_COLOR** = ``10`` - +Color blend factor is ``blend constant color``. Alpha blend factor is ``blend constant alpha`` (see :ref:`draw_list_set_blend_constants`). .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR: @@ -3454,7 +3475,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR** = ``11`` - +Color blend factor is ``1.0 - blend constant color``. Alpha blend factor is ``1.0 - blend constant alpha`` (see :ref:`draw_list_set_blend_constants`). .. _class_RenderingDevice_constant_BLEND_FACTOR_CONSTANT_ALPHA: @@ -3462,7 +3483,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_CONSTANT_ALPHA** = ``12`` - +Color and alpha blend factor is ``blend constant alpha`` (see :ref:`draw_list_set_blend_constants`). .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: @@ -3470,7 +3491,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA** = ``13`` - +Color and alpha blend factor is ``1.0 - blend constant alpha`` (see :ref:`draw_list_set_blend_constants`). .. _class_RenderingDevice_constant_BLEND_FACTOR_SRC_ALPHA_SATURATE: @@ -3478,7 +3499,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_SRC_ALPHA_SATURATE** = ``14`` - +Color blend factor is ``min(source alpha, 1.0 - destination alpha)``. Alpha blend factor is ``1.0``. .. _class_RenderingDevice_constant_BLEND_FACTOR_SRC1_COLOR: @@ -3486,7 +3507,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_SRC1_COLOR** = ``15`` - +Color blend factor is ``second source color``. Alpha blend factor is ``second source alpha``. Only relevant for dual-source blending. .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR: @@ -3494,7 +3515,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_SRC1_COLOR** = ``16`` - +Color blend factor is ``1.0 - second source color``. Alpha blend factor is ``1.0 - second source alpha``. Only relevant for dual-source blending. .. _class_RenderingDevice_constant_BLEND_FACTOR_SRC1_ALPHA: @@ -3502,7 +3523,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_SRC1_ALPHA** = ``17`` - +Color and alpha blend factor is ``second source alpha``. Only relevant for dual-source blending. .. _class_RenderingDevice_constant_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA: @@ -3510,7 +3531,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA** = ``18`` - +Color and alpha blend factor is ``1.0 - second source alpha``. Only relevant for dual-source blending. .. _class_RenderingDevice_constant_BLEND_FACTOR_MAX: @@ -3518,7 +3539,7 @@ enum **BlendFactor**: :ref:`BlendFactor` **BLEND_FACTOR_MAX** = ``19`` - +Represents the size of the :ref:`BlendFactor` enum. .. rst-class:: classref-item-separator @@ -3708,7 +3729,7 @@ enum **InitialAction**: :ref:`InitialAction` **INITIAL_ACTION_MAX** = ``6`` - +Represents the size of the :ref:`InitialAction` enum. .. rst-class:: classref-item-separator @@ -3726,7 +3747,7 @@ enum **FinalAction**: :ref:`FinalAction` **FINAL_ACTION_READ** = ``0`` - +Store the texture for reading and make it read-only if it has the :ref:`TEXTURE_USAGE_SAMPLING_BIT` bit (only applies to color, depth and stencil attachments). .. _class_RenderingDevice_constant_FINAL_ACTION_DISCARD: @@ -3734,7 +3755,7 @@ enum **FinalAction**: :ref:`FinalAction` **FINAL_ACTION_DISCARD** = ``1`` - +Discard the texture data and make it read-only if it has the :ref:`TEXTURE_USAGE_SAMPLING_BIT` bit (only applies to color, depth and stencil attachments). .. _class_RenderingDevice_constant_FINAL_ACTION_CONTINUE: @@ -3742,7 +3763,7 @@ enum **FinalAction**: :ref:`FinalAction` **FINAL_ACTION_CONTINUE** = ``2`` - +Store the texture and continue for further processing. Similar to :ref:`FINAL_ACTION_READ`, but does not make the texture read-only if it has the :ref:`TEXTURE_USAGE_SAMPLING_BIT` bit. .. _class_RenderingDevice_constant_FINAL_ACTION_MAX: @@ -3750,7 +3771,7 @@ enum **FinalAction**: :ref:`FinalAction` **FINAL_ACTION_MAX** = ``3`` - +Represents the size of the :ref:`FinalAction` enum. .. rst-class:: classref-item-separator @@ -3768,7 +3789,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_VERTEX** = ``0`` - +Vertex shader stage. This can be used to manipulate vertices from a shader (but not create new vertices). .. _class_RenderingDevice_constant_SHADER_STAGE_FRAGMENT: @@ -3776,7 +3797,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_FRAGMENT** = ``1`` - +Fragment shader stage (called "pixel shader" in Direct3D). This can be used to manipulate pixels from a shader. .. _class_RenderingDevice_constant_SHADER_STAGE_TESSELATION_CONTROL: @@ -3784,7 +3805,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_TESSELATION_CONTROL** = ``2`` - +Tessellation control shader stage. This can be used to create additional geometry from a shader. .. _class_RenderingDevice_constant_SHADER_STAGE_TESSELATION_EVALUATION: @@ -3792,7 +3813,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_TESSELATION_EVALUATION** = ``3`` - +Tessellation evaluation shader stage. This can be used to create additional geometry from a shader. .. _class_RenderingDevice_constant_SHADER_STAGE_COMPUTE: @@ -3800,7 +3821,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_COMPUTE** = ``4`` - +Compute shader stage. This can be used to run arbitrary computing tasks in a shader, performing them on the GPU instead of the CPU. .. _class_RenderingDevice_constant_SHADER_STAGE_MAX: @@ -3808,7 +3829,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_MAX** = ``5`` - +Represents the size of the :ref:`ShaderStage` enum. .. _class_RenderingDevice_constant_SHADER_STAGE_VERTEX_BIT: @@ -3816,7 +3837,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_VERTEX_BIT** = ``1`` - +Vertex shader stage bit (see also :ref:`SHADER_STAGE_VERTEX`). .. _class_RenderingDevice_constant_SHADER_STAGE_FRAGMENT_BIT: @@ -3824,7 +3845,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_FRAGMENT_BIT** = ``2`` - +Fragment shader stage bit (see also :ref:`SHADER_STAGE_FRAGMENT`). .. _class_RenderingDevice_constant_SHADER_STAGE_TESSELATION_CONTROL_BIT: @@ -3832,7 +3853,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_TESSELATION_CONTROL_BIT** = ``4`` - +Tessellation control shader stage bit (see also :ref:`SHADER_STAGE_TESSELATION_CONTROL`). .. _class_RenderingDevice_constant_SHADER_STAGE_TESSELATION_EVALUATION_BIT: @@ -3840,7 +3861,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_TESSELATION_EVALUATION_BIT** = ``8`` - +Tessellation evaluation shader stage bit (see also :ref:`SHADER_STAGE_TESSELATION_EVALUATION`). .. _class_RenderingDevice_constant_SHADER_STAGE_COMPUTE_BIT: @@ -3848,7 +3869,7 @@ enum **ShaderStage**: :ref:`ShaderStage` **SHADER_STAGE_COMPUTE_BIT** = ``16`` - +Compute shader stage bit (see also :ref:`SHADER_STAGE_COMPUTE`). .. rst-class:: classref-item-separator @@ -3866,7 +3887,7 @@ enum **ShaderLanguage**: :ref:`ShaderLanguage` **SHADER_LANGUAGE_GLSL** = ``0`` - +Khronos' GLSL shading language (used natively by OpenGL and Vulkan). This is the language used for core Godot shaders. .. _class_RenderingDevice_constant_SHADER_LANGUAGE_HLSL: @@ -3874,7 +3895,7 @@ enum **ShaderLanguage**: :ref:`ShaderLanguage` **SHADER_LANGUAGE_HLSL** = ``1`` - +Microsoft's High-Level Shading Language (used natively by Direct3D, but can also be used in Vulkan). .. rst-class:: classref-item-separator @@ -3892,7 +3913,7 @@ enum **PipelineSpecializationConstantType**: :ref:`PipelineSpecializationConstantType` **PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL** = ``0`` - +Boolean specialization constant. .. _class_RenderingDevice_constant_PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT: @@ -3900,7 +3921,7 @@ enum **PipelineSpecializationConstantType**: :ref:`PipelineSpecializationConstantType` **PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT** = ``1`` - +Integer specialization constant. .. _class_RenderingDevice_constant_PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT: @@ -3908,7 +3929,7 @@ enum **PipelineSpecializationConstantType**: :ref:`PipelineSpecializationConstantType` **PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT** = ``2`` - +Floating-point specialization constant. .. rst-class:: classref-item-separator @@ -3926,7 +3947,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_BOUND_UNIFORM_SETS** = ``0`` - +Maximum number of uniform sets that can be bound at a given time. .. _class_RenderingDevice_constant_LIMIT_MAX_FRAMEBUFFER_COLOR_ATTACHMENTS: @@ -3934,7 +3955,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_FRAMEBUFFER_COLOR_ATTACHMENTS** = ``1`` - +Maximum number of color framebuffer attachments that can be used at a given time. .. _class_RenderingDevice_constant_LIMIT_MAX_TEXTURES_PER_UNIFORM_SET: @@ -3942,7 +3963,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_TEXTURES_PER_UNIFORM_SET** = ``2`` - +Maximum number of textures that can be used per uniform set. .. _class_RenderingDevice_constant_LIMIT_MAX_SAMPLERS_PER_UNIFORM_SET: @@ -3950,7 +3971,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_SAMPLERS_PER_UNIFORM_SET** = ``3`` - +Maximum number of samplers that can be used per uniform set. .. _class_RenderingDevice_constant_LIMIT_MAX_STORAGE_BUFFERS_PER_UNIFORM_SET: @@ -3958,7 +3979,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_STORAGE_BUFFERS_PER_UNIFORM_SET** = ``4`` - +Maximum number of `storage buffers `__ per uniform set. .. _class_RenderingDevice_constant_LIMIT_MAX_STORAGE_IMAGES_PER_UNIFORM_SET: @@ -3966,7 +3987,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_STORAGE_IMAGES_PER_UNIFORM_SET** = ``5`` - +Maximum number of storage images per uniform set. .. _class_RenderingDevice_constant_LIMIT_MAX_UNIFORM_BUFFERS_PER_UNIFORM_SET: @@ -3974,7 +3995,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_UNIFORM_BUFFERS_PER_UNIFORM_SET** = ``6`` - +Maximum number of uniform buffers per uniform set. .. _class_RenderingDevice_constant_LIMIT_MAX_DRAW_INDEXED_INDEX: @@ -3982,7 +4003,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_DRAW_INDEXED_INDEX** = ``7`` - +Maximum index for an indexed draw command. .. _class_RenderingDevice_constant_LIMIT_MAX_FRAMEBUFFER_HEIGHT: @@ -3990,7 +4011,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_FRAMEBUFFER_HEIGHT** = ``8`` - +Maximum height of a framebuffer (in pixels). .. _class_RenderingDevice_constant_LIMIT_MAX_FRAMEBUFFER_WIDTH: @@ -3998,7 +4019,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_FRAMEBUFFER_WIDTH** = ``9`` - +Maximum width of a framebuffer (in pixels). .. _class_RenderingDevice_constant_LIMIT_MAX_TEXTURE_ARRAY_LAYERS: @@ -4006,7 +4027,7 @@ enum **Limit**: :ref:`Limit` **LIMIT_MAX_TEXTURE_ARRAY_LAYERS** = ``10`` - +Maximum number of texture array layers. .. _class_RenderingDevice_constant_LIMIT_MAX_TEXTURE_SIZE_1D: @@ -4046,7 +4067,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_TEXTURES_PER_SHADER_STAGE** = ``15`` - +Maximum number of textures per shader stage. .. _class_RenderingDevice_constant_LIMIT_MAX_SAMPLERS_PER_SHADER_STAGE: @@ -4054,7 +4075,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_SAMPLERS_PER_SHADER_STAGE** = ``16`` - +Maximum number of samplers per shader stage. .. _class_RenderingDevice_constant_LIMIT_MAX_STORAGE_BUFFERS_PER_SHADER_STAGE: @@ -4062,7 +4083,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_STORAGE_BUFFERS_PER_SHADER_STAGE** = ``17`` - +Maximum number of `storage buffers `__ per shader stage. .. _class_RenderingDevice_constant_LIMIT_MAX_STORAGE_IMAGES_PER_SHADER_STAGE: @@ -4070,7 +4091,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_STORAGE_IMAGES_PER_SHADER_STAGE** = ``18`` - +Maximum number of storage images per shader stage. .. _class_RenderingDevice_constant_LIMIT_MAX_UNIFORM_BUFFERS_PER_SHADER_STAGE: @@ -4078,7 +4099,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_UNIFORM_BUFFERS_PER_SHADER_STAGE** = ``19`` - +Maximum number of uniform buffers per uniform set. .. _class_RenderingDevice_constant_LIMIT_MAX_PUSH_CONSTANT_SIZE: @@ -4086,7 +4107,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_PUSH_CONSTANT_SIZE** = ``20`` - +Maximum size of a push constant. A lot of devices are limited to 128 bytes, so try to avoid exceeding 128 bytes in push constants to ensure compatibility even if your GPU is reporting a higher value. .. _class_RenderingDevice_constant_LIMIT_MAX_UNIFORM_BUFFER_SIZE: @@ -4094,7 +4115,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_UNIFORM_BUFFER_SIZE** = ``21`` - +Maximum size of a uniform buffer. .. _class_RenderingDevice_constant_LIMIT_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET: @@ -4102,7 +4123,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET** = ``22`` - +Maximum vertex input attribute offset. .. _class_RenderingDevice_constant_LIMIT_MAX_VERTEX_INPUT_ATTRIBUTES: @@ -4110,7 +4131,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_VERTEX_INPUT_ATTRIBUTES** = ``23`` - +Maximum number of vertex input attributes. .. _class_RenderingDevice_constant_LIMIT_MAX_VERTEX_INPUT_BINDINGS: @@ -4118,7 +4139,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_VERTEX_INPUT_BINDINGS** = ``24`` - +Maximum number of vertex input bindings. .. _class_RenderingDevice_constant_LIMIT_MAX_VERTEX_INPUT_BINDING_STRIDE: @@ -4126,7 +4147,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_VERTEX_INPUT_BINDING_STRIDE** = ``25`` - +Maximum vertex input binding stride. .. _class_RenderingDevice_constant_LIMIT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT: @@ -4134,7 +4155,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT** = ``26`` - +Minimum uniform buffer offset alignment. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_SHARED_MEMORY_SIZE: @@ -4142,7 +4163,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_SHARED_MEMORY_SIZE** = ``27`` - +Maximum shared memory size for compute shaders. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_X: @@ -4150,7 +4171,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_X** = ``28`` - +Maximum number of workgroups for compute shaders on the X axis. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Y: @@ -4158,7 +4179,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Y** = ``29`` - +Maximum number of workgroups for compute shaders on the Y axis. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Z: @@ -4166,7 +4187,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Z** = ``30`` - +Maximum number of workgroups for compute shaders on the Z axis. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_WORKGROUP_INVOCATIONS: @@ -4174,7 +4195,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_WORKGROUP_INVOCATIONS** = ``31`` - +Maximum number of workgroup invocations for compute shaders. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_X: @@ -4182,7 +4203,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_X** = ``32`` - +Maximum workgroup size for compute shaders on the X axis. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Y: @@ -4190,7 +4211,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Y** = ``33`` - +Maximum workgroup size for compute shaders on the Y axis. .. _class_RenderingDevice_constant_LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z: @@ -4198,7 +4219,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z** = ``34`` - +Maximum workgroup size for compute shaders on the Z axis. .. _class_RenderingDevice_constant_LIMIT_MAX_VIEWPORT_DIMENSIONS_X: @@ -4206,7 +4227,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_VIEWPORT_DIMENSIONS_X** = ``35`` - +Maximum viewport width (in pixels). .. _class_RenderingDevice_constant_LIMIT_MAX_VIEWPORT_DIMENSIONS_Y: @@ -4214,7 +4235,7 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single f :ref:`Limit` **LIMIT_MAX_VIEWPORT_DIMENSIONS_Y** = ``36`` - +Maximum viewport height (in pixels). .. rst-class:: classref-item-separator @@ -4290,9 +4311,7 @@ Method Descriptions void **barrier** **(** :ref:`BarrierMask` from=7, :ref:`BarrierMask` to=7 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Puts a memory barrier in place. This is used for synchronization to avoid data races. See also :ref:`full_barrier`, which may be useful for debugging. .. rst-class:: classref-item-separator @@ -4344,9 +4363,7 @@ Returns a copy of the data of the specified ``buffer``, optionally ``offset_byte void **capture_timestamp** **(** :ref:`String` name **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Creates a timestamp marker with the specified ``name``. This is used for performance reporting with the :ref:`get_captured_timestamp_cpu_time`, :ref:`get_captured_timestamp_gpu_time` and :ref:`get_captured_timestamp_name` methods. .. rst-class:: classref-item-separator @@ -4372,9 +4389,27 @@ void **compute_list_add_barrier** **(** :ref:`int` compute_list **)** :ref:`int` **compute_list_begin** **(** :ref:`bool` allow_draw_overlap=false **)** -.. container:: contribute +Starts a list of compute commands created with the ``compute_*`` methods. The returned value should be passed to other ``compute_list_*`` functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``allow_draw_overlap`` is true, you may have one draw list running at the same time as one compute list. Multiple compute lists cannot be created at the same time; you must finish the previous compute list first using :ref:`compute_list_end`. + +A simple compute operation might look like this (code is not a complete example): + +:: + + var rd = RenderingDevice.new() + var compute_list = rd.compute_list_begin() + + rd.compute_list_bind_compute_pipeline(compute_list, compute_shader_dilate_pipeline) + rd.compute_list_bind_uniform_set(compute_list, compute_base_uniform_set, 0) + rd.compute_list_bind_uniform_set(compute_list, dilate_uniform_set, 1) + + for i in atlas_slices: + rd.compute_list_set_push_constant(compute_list, push_constant, push_constant.size()) + rd.compute_list_dispatch(compute_list, group_size.x, group_size.y, group_size.z) + # No barrier, let them run all together. + + rd.compute_list_end() .. rst-class:: classref-item-separator @@ -4414,9 +4449,7 @@ void **compute_list_bind_uniform_set** **(** :ref:`int` compute_list, void **compute_list_dispatch** **(** :ref:`int` compute_list, :ref:`int` x_groups, :ref:`int` y_groups, :ref:`int` z_groups **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Submits the compute list for processing on the GPU. This is the compute equivalent to :ref:`draw_list_draw`. .. rst-class:: classref-item-separator @@ -4428,9 +4461,7 @@ void **compute_list_dispatch** **(** :ref:`int` compute_list, :ref:`i void **compute_list_end** **(** :ref:`BarrierMask` post_barrier=7 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Finishes a list of compute commands created with the ``compute_*`` methods. .. rst-class:: classref-item-separator @@ -4442,9 +4473,7 @@ void **compute_list_end** **(** :ref:`BarrierMask` compute_list, :ref:`PackedByteArray` buffer, :ref:`int` size_bytes **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the push constant data to ``buffer`` for the specified ``compute_list``. The shader determines how this binary data is used. The buffer's size in bytes must also be specified in ``size_bytes`` (this can be obtained by calling the :ref:`PackedByteArray.size` method on the passed ``buffer``). .. rst-class:: classref-item-separator @@ -4456,9 +4485,9 @@ void **compute_list_set_push_constant** **(** :ref:`int` compute_list :ref:`RID` **compute_pipeline_create** **(** :ref:`RID` shader, :ref:`RDPipelineSpecializationConstant[]` specialization_constants=[] **)** -.. container:: contribute +Creates a new compute pipeline. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -4468,11 +4497,9 @@ void **compute_list_set_push_constant** **(** :ref:`int` compute_list .. rst-class:: classref-method -:ref:`bool` **compute_pipeline_is_valid** **(** :ref:`RID` compute_pieline **)** - -.. container:: contribute +:ref:`bool` **compute_pipeline_is_valid** **(** :ref:`RID` compute_pipeline **)** - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the compute pipeline specified by the ``compute_pipeline`` RID is valid, ``false`` otherwise. .. rst-class:: classref-item-separator @@ -4484,9 +4511,7 @@ void **compute_list_set_push_constant** **(** :ref:`int` compute_list :ref:`RenderingDevice` **create_local_device** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Create a new local **RenderingDevice**. This is most useful for performing compute operations on the GPU independently from the rest of the engine. .. rst-class:: classref-item-separator @@ -4498,9 +4523,9 @@ void **compute_list_set_push_constant** **(** :ref:`int` compute_list void **draw_command_begin_label** **(** :ref:`String` name, :ref:`Color` color **)** -.. container:: contribute +Create a command buffer debug label region that can be displayed in third-party tools such as `RenderDoc `__. All regions must be ended with a :ref:`draw_command_end_label` call. When viewed from the linear series of submissions to a single queue, calls to :ref:`draw_command_begin_label` and :ref:`draw_command_end_label` must be matched and balanced. - There is currently no description for this method. Please help us by :ref:`contributing one `! +The ``VK_EXT_DEBUG_UTILS_EXTENSION_NAME`` Vulkan extension must be available and enabled for command buffer debug label region to work. See also :ref:`draw_command_insert_label` and :ref:`draw_command_end_label`. .. rst-class:: classref-item-separator @@ -4512,9 +4537,7 @@ void **draw_command_begin_label** **(** :ref:`String` name, :ref:` void **draw_command_end_label** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Ends the command buffer debug label region started by a :ref:`draw_command_begin_label` call. .. rst-class:: classref-item-separator @@ -4526,9 +4549,7 @@ void **draw_command_end_label** **(** **)** void **draw_command_insert_label** **(** :ref:`String` name, :ref:`Color` color **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Inserts a command buffer debug label region in the current command buffer. Unlike :ref:`draw_command_begin_label`, this region should not be ended with a :ref:`draw_command_end_label` call. .. rst-class:: classref-item-separator @@ -4538,11 +4559,32 @@ void **draw_command_insert_label** **(** :ref:`String` name, :ref: .. rst-class:: classref-method -:ref:`int` **draw_list_begin** **(** :ref:`RID` framebuffer, :ref:`InitialAction` initial_color_action, :ref:`FinalAction` final_color_action, :ref:`InitialAction` initial_depth_action, :ref:`FinalAction` final_depth_action, :ref:`PackedColorArray` clear_color_values=PackedColorArray(), :ref:`float` clear_depth=1.0, :ref:`int` clear_stencil=0, :ref:`Rect2` region=Rect2(0, 0, 0, 0), :ref:`Array` storage_textures=[] **)** +:ref:`int` **draw_list_begin** **(** :ref:`RID` framebuffer, :ref:`InitialAction` initial_color_action, :ref:`FinalAction` final_color_action, :ref:`InitialAction` initial_depth_action, :ref:`FinalAction` final_depth_action, :ref:`PackedColorArray` clear_color_values=PackedColorArray(), :ref:`float` clear_depth=1.0, :ref:`int` clear_stencil=0, :ref:`Rect2` region=Rect2(0, 0, 0, 0), :ref:`RID[]` storage_textures=[] **)** -.. container:: contribute +Starts a list of raster drawing commands created with the ``draw_*`` methods. The returned value should be passed to other ``draw_list_*`` functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Multiple draw lists cannot be created at the same time; you must finish the previous draw list first using :ref:`draw_list_end`. + +A simple drawing operation might look like this (code is not a complete example): + +:: + + var rd = RenderingDevice.new() + var clear_colors = PackedColorArray([Color(0, 0, 0, 0), Color(0, 0, 0, 0), Color(0, 0, 0, 0)] + var draw_list = rd.draw_list_begin(framebuffers[i], RenderingDevice.INITIAL_ACTION_CLEAR, RenderingDevice.FINAL_ACTION_READ, RenderingDevice.INITIAL_ACTION_CLEAR, RenderingDevice.FINAL_ACTION_DISCARD, clear_colors) + + # Draw opaque. + rd.draw_list_bind_render_pipeline(draw_list, raster_pipeline) + rd.draw_list_bind_uniform_set(draw_list, raster_base_uniform, 0) + rd.draw_list_set_push_constant(draw_list, raster_push_constant, raster_push_constant.size()) + rd.draw_list_draw(draw_list, false, 1, slice_triangle_count[i] * 3) + # Draw wire. + rd.draw_list_bind_render_pipeline(draw_list, raster_pipeline_wire) + rd.draw_list_bind_uniform_set(draw_list, raster_base_uniform, 0) + rd.draw_list_set_push_constant(draw_list, raster_push_constant, raster_push_constant.size()) + rd.draw_list_draw(draw_list, false, 1, slice_triangle_count[i] * 3) + + rd.draw_list_end() .. rst-class:: classref-item-separator @@ -4554,9 +4596,9 @@ void **draw_command_insert_label** **(** :ref:`String` name, :ref: :ref:`int` **draw_list_begin_for_screen** **(** :ref:`int` screen=0, :ref:`Color` clear_color=Color(0, 0, 0, 1) **)** -.. container:: contribute +High-level variant of :ref:`draw_list_begin`, with the parameters automtaically being adjusted for drawing onto the window specified by the ``screen`` ID. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Cannot be used with local RenderingDevices, as these don't have a screen. If called on a local RenderingDevice, :ref:`draw_list_begin_for_screen` returns :ref:`INVALID_ID`. .. rst-class:: classref-item-separator @@ -4568,9 +4610,7 @@ void **draw_command_insert_label** **(** :ref:`String` name, :ref: :ref:`PackedInt64Array` **draw_list_begin_split** **(** :ref:`RID` framebuffer, :ref:`int` splits, :ref:`InitialAction` initial_color_action, :ref:`FinalAction` final_color_action, :ref:`InitialAction` initial_depth_action, :ref:`FinalAction` final_depth_action, :ref:`PackedColorArray` clear_color_values=PackedColorArray(), :ref:`float` clear_depth=1.0, :ref:`int` clear_stencil=0, :ref:`Rect2` region=Rect2(0, 0, 0, 0), :ref:`RID[]` storage_textures=[] **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Variant of :ref:`draw_list_begin` with support for multiple splits. The ``splits`` parameter determines how many splits are created. .. rst-class:: classref-item-separator @@ -4582,9 +4622,7 @@ void **draw_command_insert_label** **(** :ref:`String` name, :ref: void **draw_list_bind_index_array** **(** :ref:`int` draw_list, :ref:`RID` index_array **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Binds ``index_array`` to the specified ``draw_list``. .. rst-class:: classref-item-separator @@ -4596,9 +4634,7 @@ void **draw_list_bind_index_array** **(** :ref:`int` draw_list, :ref: void **draw_list_bind_render_pipeline** **(** :ref:`int` draw_list, :ref:`RID` render_pipeline **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Binds ``render_pipeline`` to the specified ``draw_list``. .. rst-class:: classref-item-separator @@ -4610,9 +4646,7 @@ void **draw_list_bind_render_pipeline** **(** :ref:`int` draw_list, : void **draw_list_bind_uniform_set** **(** :ref:`int` draw_list, :ref:`RID` uniform_set, :ref:`int` set_index **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Binds ``uniform_set`` to the specified ``draw_list``. A ``set_index`` must also be specified, which is an identifier starting from ``0`` that must match the one expected by the draw list. .. rst-class:: classref-item-separator @@ -4624,9 +4658,7 @@ void **draw_list_bind_uniform_set** **(** :ref:`int` draw_list, :ref: void **draw_list_bind_vertex_array** **(** :ref:`int` draw_list, :ref:`RID` vertex_array **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Binds ``vertex_array`` to the specified ``draw_list``. .. rst-class:: classref-item-separator @@ -4638,9 +4670,7 @@ void **draw_list_bind_vertex_array** **(** :ref:`int` draw_list, :ref void **draw_list_disable_scissor** **(** :ref:`int` draw_list **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Removes and disables the scissor rectangle for the specified ``draw_list``. See also :ref:`draw_list_enable_scissor`. .. rst-class:: classref-item-separator @@ -4652,9 +4682,7 @@ void **draw_list_disable_scissor** **(** :ref:`int` draw_list **)** void **draw_list_draw** **(** :ref:`int` draw_list, :ref:`bool` use_indices, :ref:`int` instances, :ref:`int` procedural_vertex_count=0 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Submits ``draw_list`` for rendering on the GPU. This is the raster equivalent to :ref:`compute_list_dispatch`. .. rst-class:: classref-item-separator @@ -4666,9 +4694,9 @@ void **draw_list_draw** **(** :ref:`int` draw_list, :ref:`bool` draw_list, :ref:`Rect2` rect=Rect2(0, 0, 0, 0) **)** -.. container:: contribute +Creates a scissor rectangle and enables it for the specified ``draw_list``. Scissor rectangles are used for clipping by discarding fragments that fall outside a specified rectangular portion of the screen. See also :ref:`draw_list_disable_scissor`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The specified ``rect`` is automatically intersected with the screen's dimensions, which means it cannot exceed the screen's dimensions. .. rst-class:: classref-item-separator @@ -4680,9 +4708,7 @@ void **draw_list_enable_scissor** **(** :ref:`int` draw_list, :ref:`R void **draw_list_end** **(** :ref:`BarrierMask` post_barrier=7 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Finishes a list of raster drawing commands created with the ``draw_*`` methods. .. rst-class:: classref-item-separator @@ -4694,7 +4720,7 @@ void **draw_list_end** **(** :ref:`BarrierMask void **draw_list_set_blend_constants** **(** :ref:`int` draw_list, :ref:`Color` color **)** -Sets blend constants for draw list, blend constants are used only if the graphics pipeline is created with :ref:`DYNAMIC_STATE_BLEND_CONSTANTS` flag set. +Sets blend constants for the specified ``draw_list`` to ``color``. Blend constants are used only if the graphics pipeline is created with :ref:`DYNAMIC_STATE_BLEND_CONSTANTS` flag set. .. rst-class:: classref-item-separator @@ -4706,9 +4732,7 @@ Sets blend constants for draw list, blend constants are used only if the graphic void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref:`PackedByteArray` buffer, :ref:`int` size_bytes **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the push constant data to ``buffer`` for the specified ``draw_list``. The shader determines how this binary data is used. The buffer's size in bytes must also be specified in ``size_bytes`` (this can be obtained by calling the :ref:`PackedByteArray.size` method on the passed ``buffer``). .. rst-class:: classref-item-separator @@ -4720,9 +4744,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`int` **draw_list_switch_to_next_pass** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Switches to the next draw pass and returns the split's ID. Equivalent to :ref:`draw_list_switch_to_next_pass_split` with ``splits`` set to ``1``. .. rst-class:: classref-item-separator @@ -4734,9 +4756,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`PackedInt64Array` **draw_list_switch_to_next_pass_split** **(** :ref:`int` splits **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Switches to the next draw pass, with the number of splits allocated specified in ``splits``. The return value is an array containing the ID of each split. For single-split usage, see :ref:`draw_list_switch_to_next_pass`. .. rst-class:: classref-item-separator @@ -4748,9 +4768,9 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`RID` **framebuffer_create** **(** :ref:`RID[]` textures, :ref:`int` validate_with_format=-1, :ref:`int` view_count=1 **)** -.. container:: contribute +Creates a new framebuffer. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -4762,9 +4782,9 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`RID` **framebuffer_create_empty** **(** :ref:`Vector2i` size, :ref:`TextureSamples` samples=0, :ref:`int` validate_with_format=-1 **)** -.. container:: contribute +Creates a new empty framebuffer. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -4776,9 +4796,9 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`RID` **framebuffer_create_multipass** **(** :ref:`RID[]` textures, :ref:`RDFramebufferPass[]` passes, :ref:`int` validate_with_format=-1, :ref:`int` view_count=1 **)** -.. container:: contribute +Creates a new multipass framebuffer. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -4790,9 +4810,9 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`int` **framebuffer_format_create** **(** :ref:`RDAttachmentFormat[]` attachments, :ref:`int` view_count=1 **)** -.. container:: contribute +Creates a new framebuffer format with the specified ``attachments`` and ``view_count``. Returns the new framebuffer's unique framebuffer format ID. - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``view_count`` is greater than or equal to ``2``, enables multiview which is used for VR rendering. This requires support for the Vulkan multiview extension. .. rst-class:: classref-item-separator @@ -4804,9 +4824,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`int` **framebuffer_format_create_empty** **(** :ref:`TextureSamples` samples=0 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Creates a new empty framebuffer format with the specified number of ``samples`` and returns its ID. .. rst-class:: classref-item-separator @@ -4818,9 +4836,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`int` **framebuffer_format_create_multipass** **(** :ref:`RDAttachmentFormat[]` attachments, :ref:`RDFramebufferPass[]` passes, :ref:`int` view_count=1 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Creates a multipass framebuffer format with the specified ``attachments``, ``passes`` and ``view_count`` and returns its ID. If ``view_count`` is greater than or equal to ``2``, enables multiview which is used for VR rendering. This requires support for the Vulkan multiview extension. .. rst-class:: classref-item-separator @@ -4832,9 +4848,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`TextureSamples` **framebuffer_format_get_texture_samples** **(** :ref:`int` format, :ref:`int` render_pass=0 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the number of texture samples used for the given framebuffer ``format`` ID (returned by :ref:`framebuffer_get_format`). .. rst-class:: classref-item-separator @@ -4846,9 +4860,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`int` **framebuffer_get_format** **(** :ref:`RID` framebuffer **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the format ID of the framebuffer specified by the ``framebuffer`` RID. This ID is guaranteed to be unique for the same formats and does not need to be freed. .. rst-class:: classref-item-separator @@ -4860,9 +4872,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref :ref:`bool` **framebuffer_is_valid** **(** :ref:`RID` framebuffer **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the framebuffer specified by the ``framebuffer`` RID is valid, ``false`` otherwise. .. rst-class:: classref-item-separator @@ -4874,9 +4884,7 @@ void **draw_list_set_push_constant** **(** :ref:`int` draw_list, :ref void **free_rid** **(** :ref:`RID` rid **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Tries to free an object in the RenderingDevice. To avoid memory leaks, this should be called after using an object as memory management does not occur automatically when using RenderingDevice directly. .. rst-class:: classref-item-separator @@ -4888,9 +4896,7 @@ void **free_rid** **(** :ref:`RID` rid **)** void **full_barrier** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Puts a *full* memory barrier in place. This is a memory :ref:`barrier` with all flags enabled. :ref:`full_barrier` it should only be used for debugging as it can severely impact performance. .. rst-class:: classref-item-separator @@ -4902,9 +4908,7 @@ void **full_barrier** **(** **)** :ref:`int` **get_captured_timestamp_cpu_time** **(** :ref:`int` index **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the timestamp in CPU time for the rendering step specified by ``index`` (in microseconds since the engine started). See also :ref:`get_captured_timestamp_gpu_time` and :ref:`capture_timestamp`. .. rst-class:: classref-item-separator @@ -4916,9 +4920,7 @@ void **full_barrier** **(** **)** :ref:`int` **get_captured_timestamp_gpu_time** **(** :ref:`int` index **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the timestamp in GPU time for the rendering step specified by ``index`` (in microseconds since the engine started). See also :ref:`get_captured_timestamp_cpu_time` and :ref:`capture_timestamp`. .. rst-class:: classref-item-separator @@ -4930,9 +4932,7 @@ void **full_barrier** **(** **)** :ref:`String` **get_captured_timestamp_name** **(** :ref:`int` index **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the timestamp's name for the rendering step specified by ``index``. See also :ref:`capture_timestamp`. .. rst-class:: classref-item-separator @@ -4944,9 +4944,7 @@ void **full_barrier** **(** **)** :ref:`int` **get_captured_timestamps_count** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the total number of timestamps (rendering steps) available for profiling. .. rst-class:: classref-item-separator @@ -4958,9 +4956,7 @@ void **full_barrier** **(** **)** :ref:`int` **get_captured_timestamps_frame** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the index of the last frame rendered that has rendering timestamps available for querying. .. rst-class:: classref-item-separator @@ -4972,9 +4968,7 @@ void **full_barrier** **(** **)** :ref:`String` **get_device_name** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the name of the video adapter (e.g. "GeForce GTX 1080/PCIe/SSE2"). Equivalent to :ref:`RenderingServer.get_video_adapter_name`. See also :ref:`get_device_vendor_name`. .. rst-class:: classref-item-separator @@ -4986,9 +4980,7 @@ void **full_barrier** **(** **)** :ref:`String` **get_device_pipeline_cache_uuid** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the universally unique identifier for the pipeline cache. This is used to cache shader files on disk, which avoids shader recompilations on subsequent engine runs. This UUID varies depending on the graphics card model, but also the driver version. Therefore, updating graphics drivers will invalidate the shader cache. .. rst-class:: classref-item-separator @@ -5000,9 +4992,7 @@ void **full_barrier** **(** **)** :ref:`String` **get_device_vendor_name** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the vendor of the video adapter (e.g. "NVIDIA Corporation"). Equivalent to :ref:`RenderingServer.get_video_adapter_vendor`. See also :ref:`get_device_name`. .. rst-class:: classref-item-separator @@ -5014,9 +5004,7 @@ void **full_barrier** **(** **)** :ref:`int` **get_driver_resource** **(** :ref:`DriverResource` resource, :ref:`RID` rid, :ref:`int` index **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the unique identifier of the driver ``resource`` for the specified ``rid``. Some driver resource types ignore the specified ``rid`` (see :ref:`DriverResource` descriptions). ``index`` is always ignored but must be specified anyway. .. rst-class:: classref-item-separator @@ -5028,9 +5016,7 @@ void **full_barrier** **(** **)** :ref:`int` **get_frame_delay** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the frame count kept by the graphics API. Higher values result in higher input lag, but with more consistent throughput. For the main **RenderingDevice**, frames are cycled (usually 3 with triple-buffered V-Sync enabled). However, local **RenderingDevice**\ s only have 1 frame. .. rst-class:: classref-item-separator @@ -5042,9 +5028,7 @@ void **full_barrier** **(** **)** :ref:`int` **get_memory_usage** **(** :ref:`MemoryType` type **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the memory usage in bytes corresponding to the given ``type``. When using Vulkan, these statistics are calculated by `Vulkan Memory Allocator `__. .. rst-class:: classref-item-separator @@ -5056,9 +5040,9 @@ void **full_barrier** **(** **)** :ref:`RID` **index_array_create** **(** :ref:`RID` index_buffer, :ref:`int` index_offset, :ref:`int` index_count **)** -.. container:: contribute +Creates a new index array. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5070,9 +5054,9 @@ void **full_barrier** **(** **)** :ref:`RID` **index_buffer_create** **(** :ref:`int` size_indices, :ref:`IndexBufferFormat` format, :ref:`PackedByteArray` data=PackedByteArray(), :ref:`bool` use_restart_indices=false **)** -.. container:: contribute +Creates a new index buffer. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5084,9 +5068,9 @@ void **full_barrier** **(** **)** :ref:`int` **limit_get** **(** :ref:`Limit` limit **)** |const| -.. container:: contribute +Returns the value of the specified ``limit``. This limit varies depending on the current graphics hardware (and sometimes the driver version). If the given limit is exceeded, rendering errors will occur. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Limits for various graphics hardware can be found in the `Vulkan Hardware Database `__. .. rst-class:: classref-item-separator @@ -5098,9 +5082,9 @@ void **full_barrier** **(** **)** :ref:`RID` **render_pipeline_create** **(** :ref:`RID` shader, :ref:`int` framebuffer_format, :ref:`int` vertex_format, :ref:`RenderPrimitive` primitive, :ref:`RDPipelineRasterizationState` rasterization_state, :ref:`RDPipelineMultisampleState` multisample_state, :ref:`RDPipelineDepthStencilState` stencil_state, :ref:`RDPipelineColorBlendState` color_blend_state, :ref:`PipelineDynamicStateFlags` dynamic_state_flags=0, :ref:`int` for_render_pass=0, :ref:`RDPipelineSpecializationConstant[]` specialization_constants=[] **)** -.. container:: contribute +Creates a new render pipeline. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5112,9 +5096,7 @@ void **full_barrier** **(** **)** :ref:`bool` **render_pipeline_is_valid** **(** :ref:`RID` render_pipeline **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the render pipeline specified by the ``render_pipeline`` RID is valid, ``false`` otherwise. .. rst-class:: classref-item-separator @@ -5126,9 +5108,21 @@ void **full_barrier** **(** **)** :ref:`RID` **sampler_create** **(** :ref:`RDSamplerState` state **)** -.. container:: contribute +Creates a new sampler. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. + +.. rst-class:: classref-item-separator + +---- + +.. _class_RenderingDevice_method_sampler_is_format_supported_for_filter: + +.. rst-class:: classref-method + +:ref:`bool` **sampler_is_format_supported_for_filter** **(** :ref:`DataFormat` format, :ref:`SamplerFilter` sampler_filter **)** |const| + +Returns ``true`` if implementation supports using a texture of ``format`` with the given ``sampler_filter``. .. rst-class:: classref-item-separator @@ -5140,9 +5134,9 @@ void **full_barrier** **(** **)** :ref:`int` **screen_get_framebuffer_format** **(** **)** |const| -.. container:: contribute +Returns the screen's framebuffer format. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Only the main **RenderingDevice** returned by :ref:`RenderingServer.get_rendering_device` has a format. If called on a local **RenderingDevice**, this method prints an error and returns :ref:`INVALID_ID`. .. rst-class:: classref-item-separator @@ -5154,9 +5148,9 @@ void **full_barrier** **(** **)** :ref:`int` **screen_get_height** **(** :ref:`int` screen=0 **)** |const| -.. container:: contribute +Returns the window height matching the graphics API context for the given window ID (in pixels). Despite the parameter being named ``screen``, this returns the *window* size. See also :ref:`screen_get_width`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Only the main **RenderingDevice** returned by :ref:`RenderingServer.get_rendering_device` has a height. If called on a local **RenderingDevice**, this method prints an error and returns :ref:`INVALID_ID`. .. rst-class:: classref-item-separator @@ -5168,9 +5162,9 @@ void **full_barrier** **(** **)** :ref:`int` **screen_get_width** **(** :ref:`int` screen=0 **)** |const| -.. container:: contribute +Returns the window width matching the graphics API context for the given window ID (in pixels). Despite the parameter being named ``screen``, this returns the *window* size. See also :ref:`screen_get_height`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Only the main **RenderingDevice** returned by :ref:`RenderingServer.get_rendering_device` has a width. If called on a local **RenderingDevice**, this method prints an error and returns :ref:`INVALID_ID`. .. rst-class:: classref-item-separator @@ -5182,9 +5176,11 @@ void **full_barrier** **(** **)** void **set_resource_name** **(** :ref:`RID` id, :ref:`String` name **)** -.. container:: contribute +Sets the resource name for ``id`` to ``name``. This is used for debugging with third-party tools such as `RenderDoc `__. - There is currently no description for this method. Please help us by :ref:`contributing one `! +The following types of resources can be named: texture, sampler, vertex buffer, index buffer, uniform buffer, texture buffer, storage buffer, uniform set buffer, shader, render pipeline and compute pipeline. Framebuffers cannot be named. Attempting to name an incompatible resource type will print an error. + +\ **Note:** Resource names are only set when the engine runs in verbose mode (:ref:`OS.is_stdout_verbose` = ``true``), or when using an engine build compiled with the ``dev_mode=yes`` SCons option. The graphics driver must also support the ``VK_EXT_DEBUG_UTILS_EXTENSION_NAME`` Vulkan extension for named resources to work. .. rst-class:: classref-item-separator @@ -5196,9 +5192,9 @@ void **set_resource_name** **(** :ref:`RID` id, :ref:`String` **shader_compile_binary_from_spirv** **(** :ref:`RDShaderSPIRV` spirv_data, :ref:`String` name="" **)** -.. container:: contribute +Compiles a binary shader from ``spirv_data`` and returns the compiled binary data as a :ref:`PackedByteArray`. This compiled shader is specific to the GPU model and driver version used; it will not work on different GPU models or even different driver versions. See also :ref:`shader_compile_spirv_from_source`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ ``name`` is an optional human-readable name that can be given to the compiled shader for organizational purposes. .. rst-class:: classref-item-separator @@ -5210,9 +5206,9 @@ void **set_resource_name** **(** :ref:`RID` id, :ref:`String` **shader_compile_spirv_from_source** **(** :ref:`RDShaderSource` shader_source, :ref:`bool` allow_cache=true **)** -.. container:: contribute +Compiles a SPIR-V from the shader source code in ``shader_source`` and returns the SPIR-V as a :ref:`RDShaderSPIRV`. This intermediate language shader is portable across different GPU models and driver versions, but cannot be run directly by GPUs until compiled into a binary shader using :ref:`shader_compile_binary_from_spirv`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``allow_cache`` is ``true``, make use of the shader cache generated by Godot. This avoids a potentially lengthy shader compilation step if the shader is already in cache. If ``allow_cache`` is ``false``, Godot's shader cache is ignored and the shader will always be recompiled. .. rst-class:: classref-item-separator @@ -5224,9 +5220,9 @@ void **set_resource_name** **(** :ref:`RID` id, :ref:`String` **shader_create_from_bytecode** **(** :ref:`PackedByteArray` binary_data **)** -.. container:: contribute +Creates a new shader instance from a binary compiled shader. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. See also :ref:`shader_compile_binary_from_spirv` and :ref:`shader_create_from_spirv`. .. rst-class:: classref-item-separator @@ -5238,9 +5234,9 @@ void **set_resource_name** **(** :ref:`RID` id, :ref:`String` **shader_create_from_spirv** **(** :ref:`RDShaderSPIRV` spirv_data, :ref:`String` name="" **)** -.. container:: contribute +Creates a new shader instance from SPIR-V intermediate code. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. See also :ref:`shader_compile_spirv_from_source` and :ref:`shader_create_from_bytecode`. .. rst-class:: classref-item-separator @@ -5266,9 +5262,9 @@ void **set_resource_name** **(** :ref:`RID` id, :ref:`String` **storage_buffer_create** **(** :ref:`int` size_bytes, :ref:`PackedByteArray` data=PackedByteArray(), :ref:`StorageBufferUsage` usage=0 **)** -.. container:: contribute +Creates a `storage buffer `__ with the specified ``data`` and ``usage``. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5280,9 +5276,9 @@ void **set_resource_name** **(** :ref:`RID` id, :ref:`String`). - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Only available in local RenderingDevices. .. rst-class:: classref-item-separator @@ -5294,9 +5290,11 @@ void **submit** **(** **)** void **sync** **(** **)** -.. container:: contribute +Forces a synchronization between the CPU and GPU, which may be required in certain cases. Only call this when needed, as CPU-GPU synchronization has a performance cost. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Only available in local RenderingDevices. + +\ **Note:** :ref:`sync` can only be called after a :ref:`submit`. .. rst-class:: classref-item-separator @@ -5308,9 +5306,9 @@ void **sync** **(** **)** :ref:`RID` **texture_buffer_create** **(** :ref:`int` size_bytes, :ref:`DataFormat` format, :ref:`PackedByteArray` data=PackedByteArray() **)** -.. container:: contribute +Creates a new texture buffer. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5322,9 +5320,9 @@ void **sync** **(** **)** :ref:`Error` **texture_clear** **(** :ref:`RID` texture, :ref:`Color` color, :ref:`int` base_mipmap, :ref:`int` mipmap_count, :ref:`int` base_layer, :ref:`int` layer_count, :ref:`BarrierMask` post_barrier=7 **)** -.. container:: contribute +Clears the specified ``texture`` by replacing all of its pixels with the specified ``color``. ``base_mipmap`` and ``mipmap_count`` determine which mipmaps of the texture are affected by this clear operation, while ``base_layer`` and ``layer_count`` determine which layers of a 3D texture (or texture array) are affected by this clear operation. For 2D textures (which only have one layer by design), ``base_layer`` and ``layer_count`` must both be ``0``. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** ``texture`` can't be cleared while a draw list that uses it as part of a framebuffer is being created. Ensure the draw list is finalized (and that the color/depth texture using it is not set to :ref:`FINAL_ACTION_CONTINUE`) to clear this texture. .. rst-class:: classref-item-separator @@ -5336,9 +5334,17 @@ void **sync** **(** **)** :ref:`Error` **texture_copy** **(** :ref:`RID` from_texture, :ref:`RID` to_texture, :ref:`Vector3` from_pos, :ref:`Vector3` to_pos, :ref:`Vector3` size, :ref:`int` src_mipmap, :ref:`int` dst_mipmap, :ref:`int` src_layer, :ref:`int` dst_layer, :ref:`BarrierMask` post_barrier=7 **)** -.. container:: contribute +Copies the ``from_texture`` to ``to_texture`` with the specified ``from_pos``, ``to_pos`` and ``size`` coordinates. The Z axis of the ``from_pos``, ``to_pos`` and ``size`` must be ``0`` for 2-dimensional textures. Source and destination mipmaps/layers must also be specified, with these parameters being ``0`` for textures without mipmaps or single-layer textures. Returns :ref:`@GlobalScope.OK` if the texture copy was successful or :ref:`@GlobalScope.ERR_INVALID_PARAMETER` otherwise. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** ``from_texture`` texture can't be copied while a draw list that uses it as part of a framebuffer is being created. Ensure the draw list is finalized (and that the color/depth texture using it is not set to :ref:`FINAL_ACTION_CONTINUE`) to copy this texture. + +\ **Note:** ``from_texture`` texture requires the :ref:`TEXTURE_USAGE_CAN_COPY_FROM_BIT` to be retrieved. + +\ **Note:** ``to_texture`` can't be copied while a draw list that uses it as part of a framebuffer is being created. Ensure the draw list is finalized (and that the color/depth texture using it is not set to :ref:`FINAL_ACTION_CONTINUE`) to copy this texture. + +\ **Note:** ``to_texture`` requires the :ref:`TEXTURE_USAGE_CAN_COPY_TO_BIT` to be retrieved. + +\ **Note:** ``from_texture`` and ``to_texture`` must be of the same type (color or depth). .. rst-class:: classref-item-separator @@ -5350,9 +5356,11 @@ void **sync** **(** **)** :ref:`RID` **texture_create** **(** :ref:`RDTextureFormat` format, :ref:`RDTextureView` view, :ref:`PackedByteArray[]` data=[] **)** -.. container:: contribute +Creates a new texture. It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. + +\ **Note:** Not to be confused with :ref:`RenderingServer.texture_2d_create`, which creates the Godot-specific :ref:`Texture2D` resource as opposed to the graphics API's own texture type. .. rst-class:: classref-item-separator @@ -5364,9 +5372,7 @@ void **sync** **(** **)** :ref:`RID` **texture_create_shared** **(** :ref:`RDTextureView` view, :ref:`RID` with_texture **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Creates a shared texture using the specified ``view`` and the texture information from ``with_texture``. .. rst-class:: classref-item-separator @@ -5378,9 +5384,11 @@ void **sync** **(** **)** :ref:`RID` **texture_create_shared_from_slice** **(** :ref:`RDTextureView` view, :ref:`RID` with_texture, :ref:`int` layer, :ref:`int` mipmap, :ref:`int` mipmaps=1, :ref:`TextureSliceType` slice_type=0 **)** -.. container:: contribute +Creates a shared texture using the specified ``view`` and the texture information from ``with_texture``'s ``layer`` and ``mipmap``. The number of included mipmaps from the original texture can be controlled using the ``mipmaps`` parameter. Only relevant for textures with multiple layers, such as 3D textures, texture arrays and cubemaps. For single-layer textures, use :ref:`texture_create_shared`\ - There is currently no description for this method. Please help us by :ref:`contributing one `! +For 2D textures (which only have one layer), ``layer`` must be ``0``. + +\ **Note:** Layer slicing is only supported for 2D texture arrays, not 3D textures or cubemaps. .. rst-class:: classref-item-separator @@ -5392,9 +5400,11 @@ void **sync** **(** **)** :ref:`PackedByteArray` **texture_get_data** **(** :ref:`RID` texture, :ref:`int` layer **)** -.. container:: contribute +Returns the ``texture`` data for the specified ``layer`` as raw binary data. For 2D textures (which only have one layer), ``layer`` must be ``0``. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** ``texture`` can't be retrieved while a draw list that uses it as part of a framebuffer is being created. Ensure the draw list is finalized (and that the color/depth texture using it is not set to :ref:`FINAL_ACTION_CONTINUE`) to retrieve this texture. Otherwise, an error is printed and a empty :ref:`PackedByteArray` is returned. + +\ **Note:** ``texture`` requires the :ref:`TEXTURE_USAGE_CAN_COPY_FROM_BIT` to be retrieved. Otherwise, an error is printed and a empty :ref:`PackedByteArray` is returned. .. rst-class:: classref-item-separator @@ -5406,9 +5416,7 @@ void **sync** **(** **)** :ref:`bool` **texture_is_format_supported_for_usage** **(** :ref:`DataFormat` format, :ref:`TextureUsageBits` usage_flags **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the specified ``format`` is supported for the given ``usage_flags``, ``false`` otherwise. .. rst-class:: classref-item-separator @@ -5420,9 +5428,7 @@ void **sync** **(** **)** :ref:`bool` **texture_is_shared** **(** :ref:`RID` texture **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the ``texture`` is shared, ``false`` otherwise. See :ref:`RDTextureView`. .. rst-class:: classref-item-separator @@ -5434,9 +5440,7 @@ void **sync** **(** **)** :ref:`bool` **texture_is_valid** **(** :ref:`RID` texture **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the ``texture`` is valid, ``false`` otherwise. .. rst-class:: classref-item-separator @@ -5448,9 +5452,21 @@ void **sync** **(** **)** :ref:`Error` **texture_resolve_multisample** **(** :ref:`RID` from_texture, :ref:`RID` to_texture, :ref:`BarrierMask` post_barrier=7 **)** -.. container:: contribute +Resolves the ``from_texture`` texture onto ``to_texture`` with multisample antialiasing enabled. This must be used when rendering a framebuffer for MSAA to work. Returns :ref:`@GlobalScope.OK` if successful, :ref:`@GlobalScope.ERR_INVALID_PARAMETER` otherwise. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** ``from_texture`` and ``to_texture`` textures must have the same dimension, format and type (color or depth). + +\ **Note:** ``from_texture`` can't be copied while a draw list that uses it as part of a framebuffer is being created. Ensure the draw list is finalized (and that the color/depth texture using it is not set to :ref:`FINAL_ACTION_CONTINUE`) to resolve this texture. + +\ **Note:** ``from_texture`` requires the :ref:`TEXTURE_USAGE_CAN_COPY_FROM_BIT` to be retrieved. + +\ **Note:** ``from_texture`` must be multisampled and must also be 2D (or a slice of a 3D/cubemap texture). + +\ **Note:** ``to_texture`` can't be copied while a draw list that uses it as part of a framebuffer is being created. Ensure the draw list is finalized (and that the color/depth texture using it is not set to :ref:`FINAL_ACTION_CONTINUE`) to resolve this texture. + +\ **Note:** ``to_texture`` texture requires the :ref:`TEXTURE_USAGE_CAN_COPY_TO_BIT` to be retrieved. + +\ **Note:** ``to_texture`` texture must **not** be multisampled and must also be 2D (or a slice of a 3D/cubemap texture). .. rst-class:: classref-item-separator @@ -5462,9 +5478,13 @@ void **sync** **(** **)** :ref:`Error` **texture_update** **(** :ref:`RID` texture, :ref:`int` layer, :ref:`PackedByteArray` data, :ref:`BarrierMask` post_barrier=7 **)** -.. container:: contribute +Updates texture data with new data, replacing the previous data in place. The updated texture data must have the same dimensions and format. For 2D textures (which only have one layer), ``layer`` must be ``0``. Returns :ref:`@GlobalScope.OK` if the update was successful, :ref:`@GlobalScope.ERR_INVALID_PARAMETER` otherwise. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Updating textures is forbidden during creation of a draw or compute list. + +\ **Note:** The existing ``texture`` can't be updated while a draw list that uses it as part of a framebuffer is being created. Ensure the draw list is finalized (and that the color/depth texture using it is not set to :ref:`FINAL_ACTION_CONTINUE`) to update this texture. + +\ **Note:** The existing ``texture`` requires the :ref:`TEXTURE_USAGE_CAN_UPDATE_BIT` to be updatable. .. rst-class:: classref-item-separator @@ -5476,9 +5496,9 @@ void **sync** **(** **)** :ref:`RID` **uniform_buffer_create** **(** :ref:`int` size_bytes, :ref:`PackedByteArray` data=PackedByteArray() **)** -.. container:: contribute +It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5490,9 +5510,9 @@ void **sync** **(** **)** :ref:`RID` **uniform_set_create** **(** :ref:`RDUniform[]` uniforms, :ref:`RID` shader, :ref:`int` shader_set **)** -.. container:: contribute +It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5530,9 +5550,9 @@ Creates a vertex array based on the specified buffers. Optionally, ``offsets`` ( :ref:`RID` **vertex_buffer_create** **(** :ref:`int` size_bytes, :ref:`PackedByteArray` data=PackedByteArray(), :ref:`bool` use_as_storage=false **)** -.. container:: contribute +It can be accessed with the RID that is returned. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingDevice's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -5544,9 +5564,7 @@ Creates a vertex array based on the specified buffers. Optionally, ``offsets`` ( :ref:`int` **vertex_format_create** **(** :ref:`RDVertexAttribute[]` vertex_descriptions **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Creates a new vertex format with the specified ``vertex_descriptions``. Returns a unique vertex format ID corresponding to the newly created vertex format. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_renderingserver.rst b/classes/class_renderingserver.rst index 0d8dd6d9073..7706ea4b734 100644 --- a/classes/class_renderingserver.rst +++ b/classes/class_renderingserver.rst @@ -19,23 +19,21 @@ Server for anything visible. Description ----------- -The rendering server is the API backend for everything visible. The whole scene system mounts on it to display. +The rendering server is the API backend for everything visible. The whole scene system mounts on it to display. The rendering server is completely opaque: the internals are entirely implementation-specific and cannot be accessed. -The rendering server is completely opaque, the internals are entirely implementation specific and cannot be accessed. - -The rendering server can be used to bypass the scene/:ref:`Node` system entirely. +The rendering server can be used to bypass the scene/:ref:`Node` system entirely. This can improve performance in cases where the scene system is the bottleneck, but won't improve performance otherwise (for instance, if the GPU is already fully utilized). Resources are created using the ``*_create`` functions. These functions return :ref:`RID`\ s which are not references to the objects themselves, but opaque *pointers* towards these objects. All objects are drawn to a viewport. You can use the :ref:`Viewport` attached to the :ref:`SceneTree` or you can create one yourself with :ref:`viewport_create`. When using a custom scenario or canvas, the scenario or canvas needs to be attached to the viewport using :ref:`viewport_set_scenario` or :ref:`viewport_attach_canvas`. -In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any :ref:`Node3D` node with :ref:`Node3D.get_world_3d`. Otherwise, a scenario can be created with :ref:`scenario_create`. +\ **Scenarios:** In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any :ref:`Node3D` node with :ref:`Node3D.get_world_3d`. Otherwise, a scenario can be created with :ref:`scenario_create`. Similarly, in 2D, a canvas is needed to draw all canvas items. -In 3D, all visible objects are comprised of a resource and an instance. A resource can be a mesh, a particle system, a light, or any other 3D object. In order to be visible resources must be attached to an instance using :ref:`instance_set_base`. The instance must also be attached to the scenario using :ref:`instance_set_scenario` in order to be visible. +\ **3D:** In 3D, all visible objects are comprised of a resource and an instance. A resource can be a mesh, a particle system, a light, or any other 3D object. In order to be visible resources must be attached to an instance using :ref:`instance_set_base`. The instance must also be attached to the scenario using :ref:`instance_set_scenario` in order to be visible. RenderingServer methods that don't have a prefix are usually 3D-specific (but not always). -In 2D, all visible objects are some form of canvas item. In order to be visible, a canvas item needs to be the child of a canvas attached to a viewport, or it needs to be the child of another canvas item that is eventually attached to the canvas. +\ **2D:** In 2D, all visible objects are some form of canvas item. In order to be visible, a canvas item needs to be the child of a canvas attached to a viewport, or it needs to be the child of another canvas item that is eventually attached to the canvas. 2D-specific RenderingServer methods generally start with ``canvas_*``. \ **Headless mode:** Starting the engine with the ``--headless`` :doc:`command line argument <../tutorials/editor/command_line_tutorial>` disables all rendering and window management functions. Most functions from **RenderingServer** will return dummy values in this case. @@ -115,6 +113,8 @@ Methods +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`canvas_item_add_msdf_texture_rect_region` **(** :ref:`RID` item, :ref:`Rect2` rect, :ref:`RID` texture, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`int` outline_size=0, :ref:`float` px_range=1.0, :ref:`float` scale=1.0 **)** | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`canvas_item_add_multiline` **(** :ref:`RID` item, :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0 **)** | + +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`canvas_item_add_multimesh` **(** :ref:`RID` item, :ref:`RID` mesh, :ref:`RID` texture **)** | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`canvas_item_add_nine_patch` **(** :ref:`RID` item, :ref:`Rect2` rect, :ref:`Rect2` source, :ref:`RID` texture, :ref:`Vector2` topleft, :ref:`Vector2` bottomright, :ref:`NinePatchAxisMode` x_axis_mode=0, :ref:`NinePatchAxisMode` y_axis_mode=0, :ref:`bool` draw_center=true, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** | @@ -391,7 +391,7 @@ Methods +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Variant` | :ref:`global_shader_parameter_get` **(** :ref:`StringName` name **)** |const| | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`global_shader_parameter_get_list` **(** **)** |const| | + | :ref:`StringName[]` | :ref:`global_shader_parameter_get_list` **(** **)** |const| | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`GlobalShaderParameterType` | :ref:`global_shader_parameter_get_type` **(** :ref:`StringName` name **)** |const| | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -633,7 +633,7 @@ Methods +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`particles_collision_set_attractor_directionality` **(** :ref:`RID` particles_collision, :ref:`float` amount **)** | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`particles_collision_set_attractor_strength` **(** :ref:`RID` particles_collision, :ref:`float` setrngth **)** | + | void | :ref:`particles_collision_set_attractor_strength` **(** :ref:`RID` particles_collision, :ref:`float` strength **)** | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`particles_collision_set_box_extents` **(** :ref:`RID` particles_collision, :ref:`Vector3` extents **)** | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -827,6 +827,8 @@ Methods +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`texture_3d_update` **(** :ref:`RID` texture, :ref:`Image[]` data **)** | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`texture_get_native_handle` **(** :ref:`RID` texture, :ref:`bool` srgb=false **)** |const| | + +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`texture_get_path` **(** :ref:`RID` texture **)** |const| | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`texture_get_rd_texture` **(** :ref:`RID` texture, :ref:`bool` srgb=false **)** |const| | @@ -857,6 +859,8 @@ Methods +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`viewport_get_render_info` **(** :ref:`RID` viewport, :ref:`ViewportRenderInfoType` type, :ref:`ViewportRenderInfo` info **)** | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`viewport_get_render_target` **(** :ref:`RID` viewport **)** |const| | + +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID` | :ref:`viewport_get_texture` **(** :ref:`RID` viewport **)** |const| | +----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`viewport_remove_canvas` **(** :ref:`RID` viewport, :ref:`RID` canvas **)** | @@ -1030,7 +1034,7 @@ enum **TextureLayeredType**: :ref:`TextureLayeredType` **TEXTURE_LAYERED_2D_ARRAY** = ``0`` - +Array of 2-dimensional textures (see :ref:`Texture2DArray`). .. _class_RenderingServer_constant_TEXTURE_LAYERED_CUBEMAP: @@ -1038,7 +1042,7 @@ enum **TextureLayeredType**: :ref:`TextureLayeredType` **TEXTURE_LAYERED_CUBEMAP** = ``1`` - +Cubemap texture (see :ref:`Cubemap`). .. _class_RenderingServer_constant_TEXTURE_LAYERED_CUBEMAP_ARRAY: @@ -1046,7 +1050,7 @@ enum **TextureLayeredType**: :ref:`TextureLayeredType` **TEXTURE_LAYERED_CUBEMAP_ARRAY** = ``2`` - +Array of cubemap textures (see :ref:`CubemapArray`). .. rst-class:: classref-item-separator @@ -1064,7 +1068,7 @@ enum **CubeMapLayer**: :ref:`CubeMapLayer` **CUBEMAP_LAYER_LEFT** = ``0`` - +Left face of a :ref:`Cubemap`. .. _class_RenderingServer_constant_CUBEMAP_LAYER_RIGHT: @@ -1072,7 +1076,7 @@ enum **CubeMapLayer**: :ref:`CubeMapLayer` **CUBEMAP_LAYER_RIGHT** = ``1`` - +Right face of a :ref:`Cubemap`. .. _class_RenderingServer_constant_CUBEMAP_LAYER_BOTTOM: @@ -1080,7 +1084,7 @@ enum **CubeMapLayer**: :ref:`CubeMapLayer` **CUBEMAP_LAYER_BOTTOM** = ``2`` - +Bottom face of a :ref:`Cubemap`. .. _class_RenderingServer_constant_CUBEMAP_LAYER_TOP: @@ -1088,7 +1092,7 @@ enum **CubeMapLayer**: :ref:`CubeMapLayer` **CUBEMAP_LAYER_TOP** = ``3`` - +Top face of a :ref:`Cubemap`. .. _class_RenderingServer_constant_CUBEMAP_LAYER_FRONT: @@ -1096,7 +1100,7 @@ enum **CubeMapLayer**: :ref:`CubeMapLayer` **CUBEMAP_LAYER_FRONT** = ``4`` - +Front face of a :ref:`Cubemap`. .. _class_RenderingServer_constant_CUBEMAP_LAYER_BACK: @@ -1104,7 +1108,7 @@ enum **CubeMapLayer**: :ref:`CubeMapLayer` **CUBEMAP_LAYER_BACK** = ``5`` - +Back face of a :ref:`Cubemap`. .. rst-class:: classref-item-separator @@ -1138,7 +1142,7 @@ Shader is a 2D shader. :ref:`ShaderMode` **SHADER_PARTICLES** = ``2`` -Shader is a particle shader. +Shader is a particle shader (can be used in both 2D and 3D). .. _class_RenderingServer_constant_SHADER_SKY: @@ -1146,7 +1150,7 @@ Shader is a particle shader. :ref:`ShaderMode` **SHADER_SKY** = ``3`` -Shader is a sky shader. +Shader is a 3D sky shader. .. _class_RenderingServer_constant_SHADER_FOG: @@ -1154,7 +1158,7 @@ Shader is a sky shader. :ref:`ShaderMode` **SHADER_FOG** = ``4`` -Shader is a fog shader. +Shader is a 3D fog shader. .. _class_RenderingServer_constant_SHADER_MAX: @@ -1180,7 +1184,7 @@ enum **ArrayType**: :ref:`ArrayType` **ARRAY_VERTEX** = ``0`` -Array is a vertex array. +Array is a vertex position array. .. _class_RenderingServer_constant_ARRAY_NORMAL: @@ -1204,7 +1208,7 @@ Array is a tangent array. :ref:`ArrayType` **ARRAY_COLOR** = ``3`` -Array is a color array. +Array is a vertex color array. .. _class_RenderingServer_constant_ARRAY_TEX_UV: @@ -1220,7 +1224,7 @@ Array is an UV coordinates array. :ref:`ArrayType` **ARRAY_TEX_UV2** = ``5`` -Array is an UV coordinates array for the second UV coordinates. +Array is an UV coordinates array for the second set of UV coordinates. .. _class_RenderingServer_constant_ARRAY_CUSTOM0: @@ -1228,7 +1232,7 @@ Array is an UV coordinates array for the second UV coordinates. :ref:`ArrayType` **ARRAY_CUSTOM0** = ``6`` - +Array is a custom data array for the first set of custom data. .. _class_RenderingServer_constant_ARRAY_CUSTOM1: @@ -1236,7 +1240,7 @@ Array is an UV coordinates array for the second UV coordinates. :ref:`ArrayType` **ARRAY_CUSTOM1** = ``7`` - +Array is a custom data array for the second set of custom data. .. _class_RenderingServer_constant_ARRAY_CUSTOM2: @@ -1244,7 +1248,7 @@ Array is an UV coordinates array for the second UV coordinates. :ref:`ArrayType` **ARRAY_CUSTOM2** = ``8`` - +Array is a custom data array for the third set of custom data. .. _class_RenderingServer_constant_ARRAY_CUSTOM3: @@ -1252,7 +1256,7 @@ Array is an UV coordinates array for the second UV coordinates. :ref:`ArrayType` **ARRAY_CUSTOM3** = ``9`` - +Array is a custom data array for the fourth set of custom data. .. _class_RenderingServer_constant_ARRAY_BONES: @@ -1276,7 +1280,7 @@ Array is weight information. :ref:`ArrayType` **ARRAY_INDEX** = ``12`` -Array is index array. +Array is an index array. .. _class_RenderingServer_constant_ARRAY_MAX: @@ -1302,7 +1306,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_RGBA8_UNORM** = ``0`` - +Custom data array contains 8-bit-per-channel red/green/blue/alpha color data. Values are normalized, unsigned floating-point in the ``[0.0, 1.0]`` range. .. _class_RenderingServer_constant_ARRAY_CUSTOM_RGBA8_SNORM: @@ -1310,7 +1314,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_RGBA8_SNORM** = ``1`` - +Custom data array contains 8-bit-per-channel red/green/blue/alpha color data. Values are normalized, signed floating-point in the ``[-1.0, 1.0]`` range. .. _class_RenderingServer_constant_ARRAY_CUSTOM_RG_HALF: @@ -1318,7 +1322,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_RG_HALF** = ``2`` - +Custom data array contains 16-bit-per-channel red/green color data. Values are floating-point in half precision. .. _class_RenderingServer_constant_ARRAY_CUSTOM_RGBA_HALF: @@ -1326,7 +1330,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_RGBA_HALF** = ``3`` - +Custom data array contains 16-bit-per-channel red/green/blue/alpha color data. Values are floating-point in half precision. .. _class_RenderingServer_constant_ARRAY_CUSTOM_R_FLOAT: @@ -1334,7 +1338,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_R_FLOAT** = ``4`` - +Custom data array contains 32-bit-per-channel red color data. Values are floating-point in single precision. .. _class_RenderingServer_constant_ARRAY_CUSTOM_RG_FLOAT: @@ -1342,7 +1346,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_RG_FLOAT** = ``5`` - +Custom data array contains 32-bit-per-channel red/green color data. Values are floating-point in single precision. .. _class_RenderingServer_constant_ARRAY_CUSTOM_RGB_FLOAT: @@ -1350,7 +1354,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_RGB_FLOAT** = ``6`` - +Custom data array contains 32-bit-per-channel red/green/blue color data. Values are floating-point in single precision. .. _class_RenderingServer_constant_ARRAY_CUSTOM_RGBA_FLOAT: @@ -1358,7 +1362,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_RGBA_FLOAT** = ``7`` - +Custom data array contains 32-bit-per-channel red/green/blue/alpha color data. Values are floating-point in single precision. .. _class_RenderingServer_constant_ARRAY_CUSTOM_MAX: @@ -1366,7 +1370,7 @@ enum **ArrayCustomFormat**: :ref:`ArrayCustomFormat` **ARRAY_CUSTOM_MAX** = ``8`` - +Represents the size of the :ref:`ArrayCustomFormat` enum. .. rst-class:: classref-item-separator @@ -1384,7 +1388,7 @@ flags **ArrayFormat**: :ref:`ArrayFormat` **ARRAY_FORMAT_VERTEX** = ``1`` -Flag used to mark a vertex array. +Flag used to mark a vertex position array. .. _class_RenderingServer_constant_ARRAY_FORMAT_NORMAL: @@ -1408,7 +1412,7 @@ Flag used to mark a tangent array. :ref:`ArrayFormat` **ARRAY_FORMAT_COLOR** = ``8`` -Flag used to mark a color array. +Flag used to mark a vertex color array. .. _class_RenderingServer_constant_ARRAY_FORMAT_TEX_UV: @@ -1432,7 +1436,7 @@ Flag used to mark an UV coordinates array for the second UV coordinates. :ref:`ArrayFormat` **ARRAY_FORMAT_CUSTOM0** = ``64`` - +Flag used to mark an array of custom per-vertex data for the first set of custom data. .. _class_RenderingServer_constant_ARRAY_FORMAT_CUSTOM1: @@ -1440,7 +1444,7 @@ Flag used to mark an UV coordinates array for the second UV coordinates. :ref:`ArrayFormat` **ARRAY_FORMAT_CUSTOM1** = ``128`` - +Flag used to mark an array of custom per-vertex data for the second set of custom data. .. _class_RenderingServer_constant_ARRAY_FORMAT_CUSTOM2: @@ -1448,7 +1452,7 @@ Flag used to mark an UV coordinates array for the second UV coordinates. :ref:`ArrayFormat` **ARRAY_FORMAT_CUSTOM2** = ``256`` - +Flag used to mark an array of custom per-vertex data for the third set of custom data. .. _class_RenderingServer_constant_ARRAY_FORMAT_CUSTOM3: @@ -1456,7 +1460,7 @@ Flag used to mark an UV coordinates array for the second UV coordinates. :ref:`ArrayFormat` **ARRAY_FORMAT_CUSTOM3** = ``512`` - +Flag used to mark an array of custom per-vertex data for the fourth set of custom data. .. _class_RenderingServer_constant_ARRAY_FORMAT_BONES: @@ -1576,7 +1580,7 @@ Flag used to mark that the array contains 2D vertices. :ref:`ArrayFormat` **ARRAY_FLAG_USE_8_BONE_WEIGHTS** = ``134217728`` - +Flag used to mark that the array uses 8 bone weighs instead of 4. .. _class_RenderingServer_constant_ARRAY_FLAG_USES_EMPTY_VERTEX_ARRAY: @@ -1770,7 +1774,7 @@ enum **LightType**: :ref:`LightType` **LIGHT_DIRECTIONAL** = ``0`` -Is a directional (sun) light. +Directional (sun/moon) light (see :ref:`DirectionalLight3D`). .. _class_RenderingServer_constant_LIGHT_OMNI: @@ -1778,7 +1782,7 @@ Is a directional (sun) light. :ref:`LightType` **LIGHT_OMNI** = ``1`` -Is an omni light. +Omni light (see :ref:`OmniLight3D`). .. _class_RenderingServer_constant_LIGHT_SPOT: @@ -1786,7 +1790,7 @@ Is an omni light. :ref:`LightType` **LIGHT_SPOT** = ``2`` -Is a spot light. +Spot light (see :ref:`SpotLight3D`). .. rst-class:: classref-item-separator @@ -1876,7 +1880,7 @@ The spotlight's attenuation. :ref:`LightParam` **LIGHT_PARAM_SHADOW_MAX_DISTANCE** = ``9`` -Max distance that shadows will be rendered. +The maximum distance for shadow splits. Increasing this value will make directional shadows visible from further away, at the cost of lower overall shadow detail and performance (since more objects need to be included in the directional shadow rendering). .. _class_RenderingServer_constant_LIGHT_PARAM_SHADOW_SPLIT_1_OFFSET: @@ -1982,7 +1986,7 @@ enum **LightBakeMode**: :ref:`LightBakeMode` **LIGHT_BAKE_DISABLED** = ``0`` - +Light is ignored when baking. This is the fastest mode, but the light will be taken into account when baking global illumination. This mode should generally be used for dynamic lights that change quickly, as the effect of global illumination is less noticeable on those lights. .. _class_RenderingServer_constant_LIGHT_BAKE_STATIC: @@ -1990,7 +1994,7 @@ enum **LightBakeMode**: :ref:`LightBakeMode` **LIGHT_BAKE_STATIC** = ``1`` - +Light is taken into account in static baking (:ref:`VoxelGI`, :ref:`LightmapGI`, SDFGI (:ref:`Environment.sdfgi_enabled`)). The light can be moved around or modified, but its global illumination will not update in real-time. This is suitable for subtle changes (such as flickering torches), but generally not large changes such as toggling a light on and off. .. _class_RenderingServer_constant_LIGHT_BAKE_DYNAMIC: @@ -1998,7 +2002,7 @@ enum **LightBakeMode**: :ref:`LightBakeMode` **LIGHT_BAKE_DYNAMIC** = ``2`` - +Light is taken into account in dynamic baking (:ref:`VoxelGI` and SDFGI (:ref:`Environment.sdfgi_enabled`) only). The light can be moved around or modified with global illumination updating in real-time. The light's global illumination appearance will be slightly different compared to :ref:`LIGHT_BAKE_STATIC`. This has a greater performance cost compared to :ref:`LIGHT_BAKE_STATIC`. When using SDFGI, the update speed of dynamic lights is affected by :ref:`ProjectSettings.rendering/global_illumination/sdfgi/frames_to_update_lights`. .. rst-class:: classref-item-separator @@ -2160,7 +2164,7 @@ Highest low shadow filtering quality (slowest). When using this quality setting, :ref:`ShadowQuality` **SHADOW_QUALITY_MAX** = ``6`` - +Represents the size of the :ref:`ShadowQuality` enum. .. rst-class:: classref-item-separator @@ -2204,7 +2208,7 @@ enum **ReflectionProbeAmbientMode**: :ref:`ReflectionProbeAmbientMode` **REFLECTION_PROBE_AMBIENT_DISABLED** = ``0`` - +Do not apply any ambient lighting inside the reflection probe's box defined by its size. .. _class_RenderingServer_constant_REFLECTION_PROBE_AMBIENT_ENVIRONMENT: @@ -2212,7 +2216,7 @@ enum **ReflectionProbeAmbientMode**: :ref:`ReflectionProbeAmbientMode` **REFLECTION_PROBE_AMBIENT_ENVIRONMENT** = ``1`` - +Apply automatically-sourced environment lighting inside the reflection probe's box defined by its size. .. _class_RenderingServer_constant_REFLECTION_PROBE_AMBIENT_COLOR: @@ -2220,7 +2224,7 @@ enum **ReflectionProbeAmbientMode**: :ref:`ReflectionProbeAmbientMode` **REFLECTION_PROBE_AMBIENT_COLOR** = ``2`` - +Apply custom ambient lighting inside the reflection probe's box defined by its size. See :ref:`reflection_probe_set_ambient_color` and :ref:`reflection_probe_set_ambient_energy`. .. rst-class:: classref-item-separator @@ -2238,7 +2242,7 @@ enum **DecalTexture**: :ref:`DecalTexture` **DECAL_TEXTURE_ALBEDO** = ``0`` - +Albedo texture slot in a decal (:ref:`Decal.texture_albedo`). .. _class_RenderingServer_constant_DECAL_TEXTURE_NORMAL: @@ -2246,7 +2250,7 @@ enum **DecalTexture**: :ref:`DecalTexture` **DECAL_TEXTURE_NORMAL** = ``1`` - +Normal map texture slot in a decal (:ref:`Decal.texture_normal`). .. _class_RenderingServer_constant_DECAL_TEXTURE_ORM: @@ -2254,7 +2258,7 @@ enum **DecalTexture**: :ref:`DecalTexture` **DECAL_TEXTURE_ORM** = ``2`` - +Occlusion/Roughness/Metallic texture slot in a decal (:ref:`Decal.texture_orm`). .. _class_RenderingServer_constant_DECAL_TEXTURE_EMISSION: @@ -2262,7 +2266,7 @@ enum **DecalTexture**: :ref:`DecalTexture` **DECAL_TEXTURE_EMISSION** = ``3`` - +Emission texture slot in a decal (:ref:`Decal.texture_emission`). .. _class_RenderingServer_constant_DECAL_TEXTURE_MAX: @@ -2270,7 +2274,7 @@ enum **DecalTexture**: :ref:`DecalTexture` **DECAL_TEXTURE_MAX** = ``4`` - +Represents the size of the :ref:`DecalTexture` enum. .. rst-class:: classref-item-separator @@ -2346,7 +2350,7 @@ enum **VoxelGIQuality**: :ref:`VoxelGIQuality` **VOXEL_GI_QUALITY_LOW** = ``0`` - +Low :ref:`VoxelGI` rendering quality using 4 cones. .. _class_RenderingServer_constant_VOXEL_GI_QUALITY_HIGH: @@ -2354,7 +2358,7 @@ enum **VoxelGIQuality**: :ref:`VoxelGIQuality` **VOXEL_GI_QUALITY_HIGH** = ``1`` - +High :ref:`VoxelGI` rendering quality using 6 cones. .. rst-class:: classref-item-separator @@ -2372,7 +2376,7 @@ enum **ParticlesMode**: :ref:`ParticlesMode` **PARTICLES_MODE_2D** = ``0`` - +2D particles. .. _class_RenderingServer_constant_PARTICLES_MODE_3D: @@ -2380,7 +2384,7 @@ enum **ParticlesMode**: :ref:`ParticlesMode` **PARTICLES_MODE_3D** = ``1`` - +3D particles. .. rst-class:: classref-item-separator @@ -2596,7 +2600,7 @@ enum **ParticlesCollisionHeightfieldResolution**: :ref:`ParticlesCollisionHeightfieldResolution` **PARTICLES_COLLISION_HEIGHTFIELD_RESOLUTION_MAX** = ``6`` - +Represents the size of the :ref:`ParticlesCollisionHeightfieldResolution` enum. .. rst-class:: classref-item-separator @@ -2654,7 +2658,7 @@ enum **FogVolumeShape**: :ref:`FogVolumeShape` **FOG_VOLUME_SHAPE_MAX** = ``5`` - +Represents the size of the :ref:`FogVolumeShape` enum. .. rst-class:: classref-item-separator @@ -2672,7 +2676,7 @@ enum **ViewportScaling3DMode**: :ref:`ViewportScaling3DMode` **VIEWPORT_SCALING_3D_MODE_BILINEAR** = ``0`` -Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`Viewport.scaling_3d_scale`. Values less then ``1.0`` will result in undersampling while values greater than ``1.0`` will result in supersampling. A value of ``1.0`` disables scaling. +Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`Viewport.scaling_3d_scale`. Values less than ``1.0`` will result in undersampling while values greater than ``1.0`` will result in supersampling. A value of ``1.0`` disables scaling. .. _class_RenderingServer_constant_VIEWPORT_SCALING_3D_MODE_FSR: @@ -2680,7 +2684,7 @@ Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can be :ref:`ViewportScaling3DMode` **VIEWPORT_SCALING_3D_MODE_FSR** = ``1`` -Use AMD FidelityFX Super Resolution 1.0 upscaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`Viewport.scaling_3d_scale`. Values less then ``1.0`` will be result in the viewport being upscaled using FSR. Values greater than ``1.0`` are not supported and bilinear downsampling will be used instead. A value of ``1.0`` disables scaling. +Use AMD FidelityFX Super Resolution 1.0 upscaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`Viewport.scaling_3d_scale`. Values less than ``1.0`` will be result in the viewport being upscaled using FSR. Values greater than ``1.0`` are not supported and bilinear downsampling will be used instead. A value of ``1.0`` disables scaling. .. _class_RenderingServer_constant_VIEWPORT_SCALING_3D_MODE_MAX: @@ -2688,7 +2692,7 @@ Use AMD FidelityFX Super Resolution 1.0 upscaling for the viewport's 3D buffer. :ref:`ViewportScaling3DMode` **VIEWPORT_SCALING_3D_MODE_MAX** = ``2`` - +Represents the size of the :ref:`ViewportScaling3DMode` enum. .. rst-class:: classref-item-separator @@ -2706,7 +2710,7 @@ enum **ViewportUpdateMode**: :ref:`ViewportUpdateMode` **VIEWPORT_UPDATE_DISABLED** = ``0`` -Do not update the viewport. +Do not update the viewport's render target. .. _class_RenderingServer_constant_VIEWPORT_UPDATE_ONCE: @@ -2714,7 +2718,7 @@ Do not update the viewport. :ref:`ViewportUpdateMode` **VIEWPORT_UPDATE_ONCE** = ``1`` -Update the viewport once then set to disabled. +Update the viewport's render target once, then switch to :ref:`VIEWPORT_UPDATE_DISABLED`. .. _class_RenderingServer_constant_VIEWPORT_UPDATE_WHEN_VISIBLE: @@ -2722,7 +2726,7 @@ Update the viewport once then set to disabled. :ref:`ViewportUpdateMode` **VIEWPORT_UPDATE_WHEN_VISIBLE** = ``2`` -Update the viewport whenever it is visible. +Update the viewport's render target only when it is visible. This is the default value. .. _class_RenderingServer_constant_VIEWPORT_UPDATE_WHEN_PARENT_VISIBLE: @@ -2730,7 +2734,7 @@ Update the viewport whenever it is visible. :ref:`ViewportUpdateMode` **VIEWPORT_UPDATE_WHEN_PARENT_VISIBLE** = ``3`` - +Update the viewport's render target only when its parent is visible. .. _class_RenderingServer_constant_VIEWPORT_UPDATE_ALWAYS: @@ -2738,7 +2742,7 @@ Update the viewport whenever it is visible. :ref:`ViewportUpdateMode` **VIEWPORT_UPDATE_ALWAYS** = ``4`` -Always update the viewport. +Always update the viewport's render target. .. rst-class:: classref-item-separator @@ -2756,7 +2760,7 @@ enum **ViewportClearMode**: :ref:`ViewportClearMode` **VIEWPORT_CLEAR_ALWAYS** = ``0`` -The viewport is always cleared before drawing. +Always clear the viewport's render target before drawing. .. _class_RenderingServer_constant_VIEWPORT_CLEAR_NEVER: @@ -2764,7 +2768,7 @@ The viewport is always cleared before drawing. :ref:`ViewportClearMode` **VIEWPORT_CLEAR_NEVER** = ``1`` -The viewport is never cleared before drawing. +Never clear the viewport's render target. .. _class_RenderingServer_constant_VIEWPORT_CLEAR_ONLY_NEXT_FRAME: @@ -2772,7 +2776,7 @@ The viewport is never cleared before drawing. :ref:`ViewportClearMode` **VIEWPORT_CLEAR_ONLY_NEXT_FRAME** = ``2`` -The viewport is cleared once, then the clear mode is set to :ref:`VIEWPORT_CLEAR_NEVER`. +Clear the viewport's render target on the next frame, then switch to :ref:`VIEWPORT_CLEAR_NEVER`. .. rst-class:: classref-item-separator @@ -2806,7 +2810,7 @@ Enable rendering of 3D environment over 2D canvas. :ref:`ViewportEnvironmentMode` **VIEWPORT_ENVIRONMENT_INHERIT** = ``2`` -Inherit enable/disable value from parent. If topmost parent is also set to inherit, then this has the same behavior as :ref:`VIEWPORT_ENVIRONMENT_ENABLED`. +Inherit enable/disable value from parent. If the topmost parent is also set to :ref:`VIEWPORT_ENVIRONMENT_INHERIT`, then this has the same behavior as :ref:`VIEWPORT_ENVIRONMENT_ENABLED`. .. _class_RenderingServer_constant_VIEWPORT_ENVIRONMENT_MAX: @@ -2814,7 +2818,7 @@ Inherit enable/disable value from parent. If topmost parent is also set to inher :ref:`ViewportEnvironmentMode` **VIEWPORT_ENVIRONMENT_MAX** = ``3`` -Max value of :ref:`ViewportEnvironmentMode` enum. +Represents the size of the :ref:`ViewportEnvironmentMode` enum. .. rst-class:: classref-item-separator @@ -2832,7 +2836,7 @@ enum **ViewportSDFOversize**: :ref:`ViewportSDFOversize` **VIEWPORT_SDF_OVERSIZE_100_PERCENT** = ``0`` - +Do not oversize the 2D signed distance field. Occluders may disappear when touching the viewport's edges, and :ref:`GPUParticles3D` collision may stop working earlier than intended. This has the lowest GPU requirements. .. _class_RenderingServer_constant_VIEWPORT_SDF_OVERSIZE_120_PERCENT: @@ -2840,7 +2844,7 @@ enum **ViewportSDFOversize**: :ref:`ViewportSDFOversize` **VIEWPORT_SDF_OVERSIZE_120_PERCENT** = ``1`` - +2D signed distance field covers 20% of the viewport's size outside the viewport on each side (top, right, bottom, left). .. _class_RenderingServer_constant_VIEWPORT_SDF_OVERSIZE_150_PERCENT: @@ -2848,7 +2852,7 @@ enum **ViewportSDFOversize**: :ref:`ViewportSDFOversize` **VIEWPORT_SDF_OVERSIZE_150_PERCENT** = ``2`` - +2D signed distance field covers 50% of the viewport's size outside the viewport on each side (top, right, bottom, left). .. _class_RenderingServer_constant_VIEWPORT_SDF_OVERSIZE_200_PERCENT: @@ -2856,7 +2860,7 @@ enum **ViewportSDFOversize**: :ref:`ViewportSDFOversize` **VIEWPORT_SDF_OVERSIZE_200_PERCENT** = ``3`` - +2D signed distance field covers 100% of the viewport's size outside the viewport on each side (top, right, bottom, left). This has the highest GPU requirements. .. _class_RenderingServer_constant_VIEWPORT_SDF_OVERSIZE_MAX: @@ -2864,7 +2868,7 @@ enum **ViewportSDFOversize**: :ref:`ViewportSDFOversize` **VIEWPORT_SDF_OVERSIZE_MAX** = ``4`` - +Represents the size of the :ref:`ViewportSDFOversize` enum. .. rst-class:: classref-item-separator @@ -2882,7 +2886,7 @@ enum **ViewportSDFScale**: :ref:`ViewportSDFScale` **VIEWPORT_SDF_SCALE_100_PERCENT** = ``0`` - +Full resolution 2D signed distance field scale. This has the highest GPU requirements. .. _class_RenderingServer_constant_VIEWPORT_SDF_SCALE_50_PERCENT: @@ -2890,7 +2894,7 @@ enum **ViewportSDFScale**: :ref:`ViewportSDFScale` **VIEWPORT_SDF_SCALE_50_PERCENT** = ``1`` - +Half resolution 2D signed distance field scale on each axis (25% of the viewport pixel count). .. _class_RenderingServer_constant_VIEWPORT_SDF_SCALE_25_PERCENT: @@ -2898,7 +2902,7 @@ enum **ViewportSDFScale**: :ref:`ViewportSDFScale` **VIEWPORT_SDF_SCALE_25_PERCENT** = ``2`` - +Quarter resolution 2D signed distance field scale on each axis (6.25% of the viewport pixel count). This has the lowest GPU requirements. .. _class_RenderingServer_constant_VIEWPORT_SDF_SCALE_MAX: @@ -2906,7 +2910,7 @@ enum **ViewportSDFScale**: :ref:`ViewportSDFScale` **VIEWPORT_SDF_SCALE_MAX** = ``3`` - +Represents the size of the :ref:`ViewportSDFScale` enum. .. rst-class:: classref-item-separator @@ -2956,7 +2960,7 @@ Multisample antialiasing uses 8 samples per pixel for 3D. This has a very high i :ref:`ViewportMSAA` **VIEWPORT_MSAA_MAX** = ``4`` - +Represents the size of the :ref:`ViewportMSAA` enum. .. rst-class:: classref-item-separator @@ -2974,7 +2978,7 @@ enum **ViewportScreenSpaceAA**: :ref:`ViewportScreenSpaceAA` **VIEWPORT_SCREEN_SPACE_AA_DISABLED** = ``0`` - +Do not perform any antialiasing in the full screen post-process. .. _class_RenderingServer_constant_VIEWPORT_SCREEN_SPACE_AA_FXAA: @@ -2982,7 +2986,7 @@ enum **ViewportScreenSpaceAA**: :ref:`ViewportScreenSpaceAA` **VIEWPORT_SCREEN_SPACE_AA_FXAA** = ``1`` - +Use fast approximate antialiasing. FXAA is a popular screen-space antialiasing method, which is fast but will make the image look blurry, especially at lower resolutions. It can still work relatively well at large resolutions such as 1440p and 4K. .. _class_RenderingServer_constant_VIEWPORT_SCREEN_SPACE_AA_MAX: @@ -2990,7 +2994,7 @@ enum **ViewportScreenSpaceAA**: :ref:`ViewportScreenSpaceAA` **VIEWPORT_SCREEN_SPACE_AA_MAX** = ``2`` - +Represents the size of the :ref:`ViewportScreenSpaceAA` enum. .. rst-class:: classref-item-separator @@ -3008,7 +3012,7 @@ enum **ViewportOcclusionCullingBuildQuality**: :ref:`ViewportOcclusionCullingBuildQuality` **VIEWPORT_OCCLUSION_BUILD_QUALITY_LOW** = ``0`` - +Low occlusion culling BVH build quality (as defined by Embree). Results in the lowest CPU usage, but least effective culling. .. _class_RenderingServer_constant_VIEWPORT_OCCLUSION_BUILD_QUALITY_MEDIUM: @@ -3016,7 +3020,7 @@ enum **ViewportOcclusionCullingBuildQuality**: :ref:`ViewportOcclusionCullingBuildQuality` **VIEWPORT_OCCLUSION_BUILD_QUALITY_MEDIUM** = ``1`` - +Medium occlusion culling BVH build quality (as defined by Embree). .. _class_RenderingServer_constant_VIEWPORT_OCCLUSION_BUILD_QUALITY_HIGH: @@ -3024,7 +3028,7 @@ enum **ViewportOcclusionCullingBuildQuality**: :ref:`ViewportOcclusionCullingBuildQuality` **VIEWPORT_OCCLUSION_BUILD_QUALITY_HIGH** = ``2`` - +High occlusion culling BVH build quality (as defined by Embree). Results in the highest CPU usage, but most effective culling. .. rst-class:: classref-item-separator @@ -3084,7 +3088,7 @@ enum **ViewportRenderInfoType**: :ref:`ViewportRenderInfoType` **VIEWPORT_RENDER_INFO_TYPE_VISIBLE** = ``0`` - +Visible render pass (excluding shadows). .. _class_RenderingServer_constant_VIEWPORT_RENDER_INFO_TYPE_SHADOW: @@ -3092,7 +3096,7 @@ enum **ViewportRenderInfoType**: :ref:`ViewportRenderInfoType` **VIEWPORT_RENDER_INFO_TYPE_SHADOW** = ``1`` - +Shadow render pass. Objects will be rendered several times depending on the number of amounts of lights with shadows and the number of directional shadow splits. .. _class_RenderingServer_constant_VIEWPORT_RENDER_INFO_TYPE_MAX: @@ -3100,7 +3104,7 @@ enum **ViewportRenderInfoType**: :ref:`ViewportRenderInfoType` **VIEWPORT_RENDER_INFO_TYPE_MAX** = ``2`` - +Represents the size of the :ref:`ViewportRenderInfoType` enum. .. rst-class:: classref-item-separator @@ -3208,7 +3212,7 @@ Draws the shadow atlas that stores shadows from :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_SCENE_LUMINANCE** = ``11`` - +Draws the estimated scene luminance. This is a 1×1 texture that is generated when autoexposure is enabled to control the scene's exposure. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_SSAO: @@ -3240,7 +3244,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_DECAL_ATLAS** = ``15`` - +Draws the decal atlas that stores decal textures from :ref:`Decal`\ s. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_SDFGI: @@ -3248,7 +3252,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_SDFGI** = ``16`` - +Draws SDFGI cascade data. This is the data structure that is used to bounce lighting against and create reflections. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_SDFGI_PROBES: @@ -3256,7 +3260,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_SDFGI_PROBES** = ``17`` - +Draws SDFGI probe data. This is the data structure that is used to give indirect lighting dynamic objects moving within the scene. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_GI_BUFFER: @@ -3264,7 +3268,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_GI_BUFFER** = ``18`` - +Draws the global illumination buffer (:ref:`VoxelGI` or SDFGI). .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_DISABLE_LOD: @@ -3272,7 +3276,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_DISABLE_LOD** = ``19`` - +Disable mesh LOD. All meshes are drawn with full detail, which can be used to compare performance. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_CLUSTER_OMNI_LIGHTS: @@ -3280,7 +3284,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_CLUSTER_OMNI_LIGHTS** = ``20`` - +Draws the :ref:`OmniLight3D` cluster. Clustering determines where lights are positioned in screen-space, which allows the engine to only process these portions of the screen for lighting. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_CLUSTER_SPOT_LIGHTS: @@ -3288,7 +3292,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_CLUSTER_SPOT_LIGHTS** = ``21`` - +Draws the :ref:`SpotLight3D` cluster. Clustering determines where lights are positioned in screen-space, which allows the engine to only process these portions of the screen for lighting. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_CLUSTER_DECALS: @@ -3296,7 +3300,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_CLUSTER_DECALS** = ``22`` - +Draws the :ref:`Decal` cluster. Clustering determines where decals are positioned in screen-space, which allows the engine to only process these portions of the screen for decals. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_CLUSTER_REFLECTION_PROBES: @@ -3304,7 +3308,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_CLUSTER_REFLECTION_PROBES** = ``23`` - +Draws the :ref:`ReflectionProbe` cluster. Clustering determines where reflection probes are positioned in screen-space, which allows the engine to only process these portions of the screen for reflection probes. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_OCCLUDERS: @@ -3312,7 +3316,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_OCCLUDERS** = ``24`` - +Draws the occlusion culling buffer. This low-resolution occlusion culling buffer is rasterized on the CPU and is used to check whether instances are occluded by other objects. .. _class_RenderingServer_constant_VIEWPORT_DEBUG_DRAW_MOTION_VECTORS: @@ -3320,7 +3324,7 @@ Colors each PSSM split for the :ref:`DirectionalLight3D` **VIEWPORT_DEBUG_DRAW_MOTION_VECTORS** = ``25`` - +Draws the motion vectors buffer. This is used by temporal antialiasing to correct for motion that occurs during gameplay. .. rst-class:: classref-item-separator @@ -3338,7 +3342,7 @@ enum **ViewportVRSMode**: :ref:`ViewportVRSMode` **VIEWPORT_VRS_DISABLED** = ``0`` -VRS is disabled. +Variable rate shading is disabled. .. _class_RenderingServer_constant_VIEWPORT_VRS_TEXTURE: @@ -3346,7 +3350,7 @@ VRS is disabled. :ref:`ViewportVRSMode` **VIEWPORT_VRS_TEXTURE** = ``1`` -VRS uses a texture. Note, for stereoscopic use a texture atlas with a texture for each view. +Variable rate shading uses a texture. Note, for stereoscopic use a texture atlas with a texture for each view. .. _class_RenderingServer_constant_VIEWPORT_VRS_XR: @@ -3354,7 +3358,7 @@ VRS uses a texture. Note, for stereoscopic use a texture atlas with a texture fo :ref:`ViewportVRSMode` **VIEWPORT_VRS_XR** = ``2`` -VRS texture is supplied by the primary :ref:`XRInterface`. +Variable rate shading texture is supplied by the primary :ref:`XRInterface`. .. _class_RenderingServer_constant_VIEWPORT_VRS_MAX: @@ -3380,7 +3384,7 @@ enum **SkyMode**: :ref:`SkyMode` **SKY_MODE_AUTOMATIC** = ``0`` - +Automatically selects the appropriate process mode based on your sky shader. If your shader uses ``TIME`` or ``POSITION``, this will use :ref:`SKY_MODE_REALTIME`. If your shader uses any of the ``LIGHT_*`` variables or any custom uniforms, this uses :ref:`SKY_MODE_INCREMENTAL`. Otherwise, this defaults to :ref:`SKY_MODE_QUALITY`. .. _class_RenderingServer_constant_SKY_MODE_QUALITY: @@ -3388,7 +3392,7 @@ enum **SkyMode**: :ref:`SkyMode` **SKY_MODE_QUALITY** = ``1`` -Uses high quality importance sampling to process the radiance map. In general, this results in much higher quality than :ref:`Sky.PROCESS_MODE_REALTIME` but takes much longer to generate. This should not be used if you plan on changing the sky at runtime. If you are finding that the reflection is not blurry enough and is showing sparkles or fireflies, try increasing :ref:`ProjectSettings.rendering/reflections/sky_reflections/ggx_samples`. +Uses high quality importance sampling to process the radiance map. In general, this results in much higher quality than :ref:`SKY_MODE_REALTIME` but takes much longer to generate. This should not be used if you plan on changing the sky at runtime. If you are finding that the reflection is not blurry enough and is showing sparkles or fireflies, try increasing :ref:`ProjectSettings.rendering/reflections/sky_reflections/ggx_samples`. .. _class_RenderingServer_constant_SKY_MODE_INCREMENTAL: @@ -3396,7 +3400,7 @@ Uses high quality importance sampling to process the radiance map. In general, t :ref:`SkyMode` **SKY_MODE_INCREMENTAL** = ``2`` - +Uses the same high quality importance sampling to process the radiance map as :ref:`SKY_MODE_QUALITY`, but updates over several frames. The number of frames is determined by :ref:`ProjectSettings.rendering/reflections/sky_reflections/roughness_layers`. Use this when you need highest quality radiance maps, but have a sky that updates slowly. .. _class_RenderingServer_constant_SKY_MODE_REALTIME: @@ -3404,9 +3408,9 @@ Uses high quality importance sampling to process the radiance map. In general, t :ref:`SkyMode` **SKY_MODE_REALTIME** = ``3`` -Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. +Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. If you need better quality, but still need to update the sky every frame, consider turning on :ref:`ProjectSettings.rendering/reflections/sky_reflections/fast_filter_high_quality`. -\ **Note:** The fast filtering algorithm is limited to 256x256 cubemaps, so :ref:`Sky.radiance_size` must be set to :ref:`Sky.RADIANCE_SIZE_256`. +\ **Note:** The fast filtering algorithm is limited to 256×256 cubemaps, so :ref:`sky_set_radiance_size` must be set to ``256``. Otherwise, a warning is printed and the overridden radiance size is ignored. .. rst-class:: classref-item-separator @@ -3802,7 +3806,7 @@ enum **EnvironmentSDFGIYScale**: :ref:`EnvironmentSDFGIYScale` **ENV_SDFGI_Y_SCALE_50_PERCENT** = ``0`` - +Use 50% scale for SDFGI on the Y (vertical) axis. SDFGI cells will be twice as short as they are wide. This allows providing increased GI detail and reduced light leaking with thin floors and ceilings. This is usually the best choice for scenes that don't feature much verticality. .. _class_RenderingServer_constant_ENV_SDFGI_Y_SCALE_75_PERCENT: @@ -3810,7 +3814,7 @@ enum **EnvironmentSDFGIYScale**: :ref:`EnvironmentSDFGIYScale` **ENV_SDFGI_Y_SCALE_75_PERCENT** = ``1`` - +Use 75% scale for SDFGI on the Y (vertical) axis. This is a balance between the 50% and 100% SDFGI Y scales. .. _class_RenderingServer_constant_ENV_SDFGI_Y_SCALE_100_PERCENT: @@ -3818,7 +3822,7 @@ enum **EnvironmentSDFGIYScale**: :ref:`EnvironmentSDFGIYScale` **ENV_SDFGI_Y_SCALE_100_PERCENT** = ``2`` - +Use 100% scale for SDFGI on the Y (vertical) axis. SDFGI cells will be as tall as they are wide. This is usually the best choice for highly vertical scenes. The downside is that light leaking may become more noticeable with thin floors and ceilings. .. rst-class:: classref-item-separator @@ -3836,7 +3840,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_4** = ``0`` - +Throw 4 rays per frame when converging SDFGI. This has the lowest GPU requirements, but creates the most noisy result. .. _class_RenderingServer_constant_ENV_SDFGI_RAY_COUNT_8: @@ -3844,7 +3848,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_8** = ``1`` - +Throw 8 rays per frame when converging SDFGI. .. _class_RenderingServer_constant_ENV_SDFGI_RAY_COUNT_16: @@ -3852,7 +3856,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_16** = ``2`` - +Throw 16 rays per frame when converging SDFGI. .. _class_RenderingServer_constant_ENV_SDFGI_RAY_COUNT_32: @@ -3860,7 +3864,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_32** = ``3`` - +Throw 32 rays per frame when converging SDFGI. .. _class_RenderingServer_constant_ENV_SDFGI_RAY_COUNT_64: @@ -3868,7 +3872,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_64** = ``4`` - +Throw 64 rays per frame when converging SDFGI. .. _class_RenderingServer_constant_ENV_SDFGI_RAY_COUNT_96: @@ -3876,7 +3880,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_96** = ``5`` - +Throw 96 rays per frame when converging SDFGI. This has high GPU requirements. .. _class_RenderingServer_constant_ENV_SDFGI_RAY_COUNT_128: @@ -3884,7 +3888,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_128** = ``6`` - +Throw 128 rays per frame when converging SDFGI. This has very high GPU requirements, but creates the least noisy result. .. _class_RenderingServer_constant_ENV_SDFGI_RAY_COUNT_MAX: @@ -3892,7 +3896,7 @@ enum **EnvironmentSDFGIRayCount**: :ref:`EnvironmentSDFGIRayCount` **ENV_SDFGI_RAY_COUNT_MAX** = ``7`` - +Represents the size of the :ref:`EnvironmentSDFGIRayCount` enum. .. rst-class:: classref-item-separator @@ -3910,7 +3914,7 @@ enum **EnvironmentSDFGIFramesToConverge**: :ref:`EnvironmentSDFGIFramesToConverge` **ENV_SDFGI_CONVERGE_IN_5_FRAMES** = ``0`` - +Converge SDFGI over 5 frames. This is the most responsive, but creates the most noisy result with a given ray count. .. _class_RenderingServer_constant_ENV_SDFGI_CONVERGE_IN_10_FRAMES: @@ -3918,7 +3922,7 @@ enum **EnvironmentSDFGIFramesToConverge**: :ref:`EnvironmentSDFGIFramesToConverge` **ENV_SDFGI_CONVERGE_IN_10_FRAMES** = ``1`` - +Configure SDFGI to fully converge over 10 frames. .. _class_RenderingServer_constant_ENV_SDFGI_CONVERGE_IN_15_FRAMES: @@ -3926,7 +3930,7 @@ enum **EnvironmentSDFGIFramesToConverge**: :ref:`EnvironmentSDFGIFramesToConverge` **ENV_SDFGI_CONVERGE_IN_15_FRAMES** = ``2`` - +Configure SDFGI to fully converge over 15 frames. .. _class_RenderingServer_constant_ENV_SDFGI_CONVERGE_IN_20_FRAMES: @@ -3934,7 +3938,7 @@ enum **EnvironmentSDFGIFramesToConverge**: :ref:`EnvironmentSDFGIFramesToConverge` **ENV_SDFGI_CONVERGE_IN_20_FRAMES** = ``3`` - +Configure SDFGI to fully converge over 20 frames. .. _class_RenderingServer_constant_ENV_SDFGI_CONVERGE_IN_25_FRAMES: @@ -3942,7 +3946,7 @@ enum **EnvironmentSDFGIFramesToConverge**: :ref:`EnvironmentSDFGIFramesToConverge` **ENV_SDFGI_CONVERGE_IN_25_FRAMES** = ``4`` - +Configure SDFGI to fully converge over 25 frames. .. _class_RenderingServer_constant_ENV_SDFGI_CONVERGE_IN_30_FRAMES: @@ -3950,7 +3954,7 @@ enum **EnvironmentSDFGIFramesToConverge**: :ref:`EnvironmentSDFGIFramesToConverge` **ENV_SDFGI_CONVERGE_IN_30_FRAMES** = ``5`` - +Configure SDFGI to fully converge over 30 frames. This is the least responsive, but creates the least noisy result with a given ray count. .. _class_RenderingServer_constant_ENV_SDFGI_CONVERGE_MAX: @@ -3958,7 +3962,7 @@ enum **EnvironmentSDFGIFramesToConverge**: :ref:`EnvironmentSDFGIFramesToConverge` **ENV_SDFGI_CONVERGE_MAX** = ``6`` - +Represents the size of the :ref:`EnvironmentSDFGIFramesToConverge` enum. .. rst-class:: classref-item-separator @@ -3976,7 +3980,7 @@ enum **EnvironmentSDFGIFramesToUpdateLight**: :ref:`EnvironmentSDFGIFramesToUpdateLight` **ENV_SDFGI_UPDATE_LIGHT_IN_1_FRAME** = ``0`` - +Update indirect light from dynamic lights in SDFGI over 1 frame. This is the most responsive, but has the highest GPU requirements. .. _class_RenderingServer_constant_ENV_SDFGI_UPDATE_LIGHT_IN_2_FRAMES: @@ -3984,7 +3988,7 @@ enum **EnvironmentSDFGIFramesToUpdateLight**: :ref:`EnvironmentSDFGIFramesToUpdateLight` **ENV_SDFGI_UPDATE_LIGHT_IN_2_FRAMES** = ``1`` - +Update indirect light from dynamic lights in SDFGI over 2 frames. .. _class_RenderingServer_constant_ENV_SDFGI_UPDATE_LIGHT_IN_4_FRAMES: @@ -3992,7 +3996,7 @@ enum **EnvironmentSDFGIFramesToUpdateLight**: :ref:`EnvironmentSDFGIFramesToUpdateLight` **ENV_SDFGI_UPDATE_LIGHT_IN_4_FRAMES** = ``2`` - +Update indirect light from dynamic lights in SDFGI over 4 frames. .. _class_RenderingServer_constant_ENV_SDFGI_UPDATE_LIGHT_IN_8_FRAMES: @@ -4000,7 +4004,7 @@ enum **EnvironmentSDFGIFramesToUpdateLight**: :ref:`EnvironmentSDFGIFramesToUpdateLight` **ENV_SDFGI_UPDATE_LIGHT_IN_8_FRAMES** = ``3`` - +Update indirect light from dynamic lights in SDFGI over 8 frames. .. _class_RenderingServer_constant_ENV_SDFGI_UPDATE_LIGHT_IN_16_FRAMES: @@ -4008,7 +4012,7 @@ enum **EnvironmentSDFGIFramesToUpdateLight**: :ref:`EnvironmentSDFGIFramesToUpdateLight` **ENV_SDFGI_UPDATE_LIGHT_IN_16_FRAMES** = ``4`` - +Update indirect light from dynamic lights in SDFGI over 16 frames. This is the least responsive, but has the lowest GPU requirements. .. _class_RenderingServer_constant_ENV_SDFGI_UPDATE_LIGHT_MAX: @@ -4016,7 +4020,7 @@ enum **EnvironmentSDFGIFramesToUpdateLight**: :ref:`EnvironmentSDFGIFramesToUpdateLight` **ENV_SDFGI_UPDATE_LIGHT_MAX** = ``5`` - +Represents the size of the :ref:`EnvironmentSDFGIFramesToUpdateLight` enum. .. rst-class:: classref-item-separator @@ -4034,7 +4038,7 @@ enum **SubSurfaceScatteringQuality**: :ref:`SubSurfaceScatteringQuality` **SUB_SURFACE_SCATTERING_QUALITY_DISABLED** = ``0`` - +Disables subsurface scattering entirely, even on materials that have :ref:`BaseMaterial3D.subsurf_scatter_enabled` set to ``true``. This has the lowest GPU requirements. .. _class_RenderingServer_constant_SUB_SURFACE_SCATTERING_QUALITY_LOW: @@ -4042,7 +4046,7 @@ enum **SubSurfaceScatteringQuality**: :ref:`SubSurfaceScatteringQuality` **SUB_SURFACE_SCATTERING_QUALITY_LOW** = ``1`` - +Low subsurface scattering quality. .. _class_RenderingServer_constant_SUB_SURFACE_SCATTERING_QUALITY_MEDIUM: @@ -4050,7 +4054,7 @@ enum **SubSurfaceScatteringQuality**: :ref:`SubSurfaceScatteringQuality` **SUB_SURFACE_SCATTERING_QUALITY_MEDIUM** = ``2`` - +Medium subsurface scattering quality. .. _class_RenderingServer_constant_SUB_SURFACE_SCATTERING_QUALITY_HIGH: @@ -4058,7 +4062,7 @@ enum **SubSurfaceScatteringQuality**: :ref:`SubSurfaceScatteringQuality` **SUB_SURFACE_SCATTERING_QUALITY_HIGH** = ``3`` - +High subsurface scattering quality. This has the highest GPU requirements. .. rst-class:: classref-item-separator @@ -4184,7 +4188,7 @@ The instance is a particle emitter. :ref:`InstanceType` **INSTANCE_PARTICLES_COLLISION** = ``4`` - +The instance is a GPUParticles collision shape. .. _class_RenderingServer_constant_INSTANCE_LIGHT: @@ -4232,7 +4236,7 @@ The instance is a lightmap. :ref:`InstanceType` **INSTANCE_OCCLUDER** = ``10`` - +The instance is an occlusion culling occluder. .. _class_RenderingServer_constant_INSTANCE_VISIBLITY_NOTIFIER: @@ -4240,7 +4244,7 @@ The instance is a lightmap. :ref:`InstanceType` **INSTANCE_VISIBLITY_NOTIFIER** = ``11`` - +The instance is a visible on-screen notifier. .. _class_RenderingServer_constant_INSTANCE_FOG_VOLUME: @@ -4248,7 +4252,7 @@ The instance is a lightmap. :ref:`InstanceType` **INSTANCE_FOG_VOLUME** = ``12`` - +The instance is a fog volume. .. _class_RenderingServer_constant_INSTANCE_MAX: @@ -4306,7 +4310,7 @@ When set, manually requests to draw geometry on next frame. :ref:`InstanceFlags` **INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING** = ``3`` - +Always draw, even if the instance would be culled by occlusion culling. Does not affect view frustum culling. .. _class_RenderingServer_constant_INSTANCE_FLAG_MAX: @@ -4450,7 +4454,7 @@ enum **CanvasTextureChannel**: :ref:`CanvasTextureChannel` **CANVAS_TEXTURE_CHANNEL_DIFFUSE** = ``0`` - +Diffuse canvas texture (:ref:`CanvasTexture.diffuse_texture`). .. _class_RenderingServer_constant_CANVAS_TEXTURE_CHANNEL_NORMAL: @@ -4458,7 +4462,7 @@ enum **CanvasTextureChannel**: :ref:`CanvasTextureChannel` **CANVAS_TEXTURE_CHANNEL_NORMAL** = ``1`` - +Normal map canvas texture (:ref:`CanvasTexture.normal_texture`). .. _class_RenderingServer_constant_CANVAS_TEXTURE_CHANNEL_SPECULAR: @@ -4466,7 +4470,7 @@ enum **CanvasTextureChannel**: :ref:`CanvasTextureChannel` **CANVAS_TEXTURE_CHANNEL_SPECULAR** = ``2`` - +Specular map canvas texture (:ref:`CanvasTexture.specular_texture`). .. rst-class:: classref-item-separator @@ -4642,7 +4646,7 @@ enum **CanvasGroupMode**: :ref:`CanvasGroupMode` **CANVAS_GROUP_MODE_DISABLED** = ``0`` - +Child draws over parent and is not clipped. .. _class_RenderingServer_constant_CANVAS_GROUP_MODE_CLIP_ONLY: @@ -4650,7 +4654,7 @@ enum **CanvasGroupMode**: :ref:`CanvasGroupMode` **CANVAS_GROUP_MODE_CLIP_ONLY** = ``1`` - +Parent is used for the purposes of clipping only. Child is clipped to the parent's visible area, parent is not drawn. .. _class_RenderingServer_constant_CANVAS_GROUP_MODE_CLIP_AND_DRAW: @@ -4658,7 +4662,7 @@ enum **CanvasGroupMode**: :ref:`CanvasGroupMode` **CANVAS_GROUP_MODE_CLIP_AND_DRAW** = ``2`` - +Parent is used for clipping child, but parent is also drawn underneath child as normal before clipping child to its visible area. .. _class_RenderingServer_constant_CANVAS_GROUP_MODE_TRANSPARENT: @@ -4684,7 +4688,7 @@ enum **CanvasLightMode**: :ref:`CanvasLightMode` **CANVAS_LIGHT_MODE_POINT** = ``0`` - +2D point light (see :ref:`PointLight2D`). .. _class_RenderingServer_constant_CANVAS_LIGHT_MODE_DIRECTIONAL: @@ -4692,7 +4696,7 @@ enum **CanvasLightMode**: :ref:`CanvasLightMode` **CANVAS_LIGHT_MODE_DIRECTIONAL** = ``1`` - +2D directional (sun/moon) light (see :ref:`DirectionalLight2D`). .. rst-class:: classref-item-separator @@ -4820,7 +4824,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_BOOL** = ``0`` - +Boolean global shader parameter (``global uniform bool ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_BVEC2: @@ -4828,7 +4832,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_BVEC2** = ``1`` - +2-dimensional boolean vector global shader parameter (``global uniform bvec2 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_BVEC3: @@ -4836,7 +4840,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_BVEC3** = ``2`` - +3-dimensional boolean vector global shader parameter (``global uniform bvec3 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_BVEC4: @@ -4844,7 +4848,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_BVEC4** = ``3`` - +4-dimensional boolean vector global shader parameter (``global uniform bvec4 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_INT: @@ -4852,7 +4856,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_INT** = ``4`` - +Integer global shader parameter (``global uniform int ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_IVEC2: @@ -4860,7 +4864,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_IVEC2** = ``5`` - +2-dimensional integer vector global shader parameter (``global uniform ivec2 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_IVEC3: @@ -4868,7 +4872,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_IVEC3** = ``6`` - +3-dimensional integer vector global shader parameter (``global uniform ivec3 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_IVEC4: @@ -4876,7 +4880,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_IVEC4** = ``7`` - +4-dimensional integer vector global shader parameter (``global uniform ivec4 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_RECT2I: @@ -4884,7 +4888,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_RECT2I** = ``8`` - +2-dimensional integer rectangle global shader parameter (``global uniform ivec4 ...``). Equivalent to :ref:`GLOBAL_VAR_TYPE_IVEC4` in shader code, but exposed as a :ref:`Rect2i` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_UINT: @@ -4892,7 +4896,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_UINT** = ``9`` - +Unsigned integer global shader parameter (``global uniform uint ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_UVEC2: @@ -4900,7 +4904,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_UVEC2** = ``10`` - +2-dimensional unsigned integer vector global shader parameter (``global uniform uvec2 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_UVEC3: @@ -4908,7 +4912,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_UVEC3** = ``11`` - +3-dimensional unsigned integer vector global shader parameter (``global uniform uvec3 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_UVEC4: @@ -4916,7 +4920,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_UVEC4** = ``12`` - +4-dimensional unsigned integer vector global shader parameter (``global uniform uvec4 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_FLOAT: @@ -4924,7 +4928,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_FLOAT** = ``13`` - +Single-precision floating-point global shader parameter (``global uniform float ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_VEC2: @@ -4932,7 +4936,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_VEC2** = ``14`` - +2-dimensional floating-point vector global shader parameter (``global uniform vec2 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_VEC3: @@ -4940,7 +4944,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_VEC3** = ``15`` - +3-dimensional floating-point vector global shader parameter (``global uniform vec3 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_VEC4: @@ -4948,7 +4952,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_VEC4** = ``16`` - +4-dimensional floating-point vector global shader parameter (``global uniform vec4 ...``). .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_COLOR: @@ -4956,7 +4960,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_COLOR** = ``17`` - +Color global shader parameter (``global uniform vec4 ...``). Equivalent to :ref:`GLOBAL_VAR_TYPE_VEC4` in shader code, but exposed as a :ref:`Color` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_RECT2: @@ -4964,7 +4968,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_RECT2** = ``18`` - +2-dimensional floating-point rectangle global shader parameter (``global uniform vec4 ...``). Equivalent to :ref:`GLOBAL_VAR_TYPE_VEC4` in shader code, but exposed as a :ref:`Rect2` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_MAT2: @@ -4972,7 +4976,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_MAT2** = ``19`` - +2×2 matrix global shader parameter (``global uniform mat2 ...``). Exposed as a :ref:`PackedInt32Array` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_MAT3: @@ -4980,7 +4984,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_MAT3** = ``20`` - +3×3 matrix global shader parameter (``global uniform mat3 ...``). Exposed as a :ref:`Basis` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_MAT4: @@ -4988,7 +4992,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_MAT4** = ``21`` - +4×4 matrix global shader parameter (``global uniform mat4 ...``). Exposed as a :ref:`Projection` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_TRANSFORM_2D: @@ -4996,7 +5000,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_TRANSFORM_2D** = ``22`` - +2-dimensional transform global shader parameter (``global uniform mat2x3 ...``). Exposed as a :ref:`Transform2D` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_TRANSFORM: @@ -5004,7 +5008,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_TRANSFORM** = ``23`` - +3-dimensional transform global shader parameter (``global uniform mat3x4 ...``). Exposed as a :ref:`Transform3D` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_SAMPLER2D: @@ -5012,7 +5016,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_SAMPLER2D** = ``24`` - +2D sampler global shader parameter (``global uniform sampler2D ...``). Exposed as a :ref:`Texture2D` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_SAMPLER2DARRAY: @@ -5020,7 +5024,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_SAMPLER2DARRAY** = ``25`` - +2D sampler array global shader parameter (``global uniform sampler2DArray ...``). Exposed as a :ref:`Texture2DArray` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_SAMPLER3D: @@ -5028,7 +5032,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_SAMPLER3D** = ``26`` - +3D sampler global shader parameter (``global uniform sampler3D ...``). Exposed as a :ref:`Texture3D` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_SAMPLERCUBE: @@ -5036,7 +5040,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_SAMPLERCUBE** = ``27`` - +Cubemap sampler global shader parameter (``global uniform samplerCube ...``). Exposed as a :ref:`Cubemap` in the editor UI. .. _class_RenderingServer_constant_GLOBAL_VAR_TYPE_MAX: @@ -5044,7 +5048,7 @@ enum **GlobalShaderParameterType**: :ref:`GlobalShaderParameterType` **GLOBAL_VAR_TYPE_MAX** = ``28`` - +Represents the size of the :ref:`GlobalShaderParameterType` enum. .. rst-class:: classref-item-separator @@ -5062,7 +5066,7 @@ enum **RenderingInfo**: :ref:`RenderingInfo` **RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME** = ``0`` - +Number of objects rendered in the current 3D scene. This varies depending on camera position and rotation. .. _class_RenderingServer_constant_RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME: @@ -5070,7 +5074,7 @@ enum **RenderingInfo**: :ref:`RenderingInfo` **RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME** = ``1`` - +Number of vertices/indices rendered in the current 3D scene. This varies depending on camera position and rotation. .. _class_RenderingServer_constant_RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME: @@ -5078,7 +5082,7 @@ enum **RenderingInfo**: :ref:`RenderingInfo` **RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME** = ``2`` - +Number of draw calls performed to render in the current 3D scene. This varies depending on camera position and rotation. .. _class_RenderingServer_constant_RENDERING_INFO_TEXTURE_MEM_USED: @@ -5086,7 +5090,7 @@ enum **RenderingInfo**: :ref:`RenderingInfo` **RENDERING_INFO_TEXTURE_MEM_USED** = ``3`` - +Texture memory used (in bytes). .. _class_RenderingServer_constant_RENDERING_INFO_BUFFER_MEM_USED: @@ -5094,7 +5098,7 @@ enum **RenderingInfo**: :ref:`RenderingInfo` **RENDERING_INFO_BUFFER_MEM_USED** = ``4`` - +Buffer memory used (in bytes). .. _class_RenderingServer_constant_RENDERING_INFO_VIDEO_MEM_USED: @@ -5102,7 +5106,7 @@ enum **RenderingInfo**: :ref:`RenderingInfo` **RENDERING_INFO_VIDEO_MEM_USED** = ``5`` - +Video memory used (in bytes). This is always greater than the sum of :ref:`RENDERING_INFO_TEXTURE_MEM_USED` and :ref:`RENDERING_INFO_BUFFER_MEM_USED`, since there is miscellaneous data not accounted for by those two metrics. .. rst-class:: classref-item-separator @@ -5177,7 +5181,7 @@ The maximum Z-layer for canvas items. **MAX_GLOW_LEVELS** = ``7`` -Max number of glow levels that can be used with glow post-process effect. +The maximum number of glow levels that can be used with the glow post-processing effect. .. _class_RenderingServer_constant_MAX_CURSORS: @@ -5185,7 +5189,7 @@ Max number of glow levels that can be used with glow post-process effect. **MAX_CURSORS** = ``8`` -Unused enum in Godot 3.x. +*Deprecated.* This constant is unused. .. _class_RenderingServer_constant_MAX_2D_DIRECTIONAL_LIGHTS: @@ -5193,7 +5197,7 @@ Unused enum in Godot 3.x. **MAX_2D_DIRECTIONAL_LIGHTS** = ``8`` - +The maximum number of directional lights that can be rendered at a given time in 2D. .. _class_RenderingServer_constant_MATERIAL_RENDER_PRIORITY_MIN: @@ -5217,7 +5221,7 @@ The maximum renderpriority of all materials. **ARRAY_CUSTOM_COUNT** = ``4`` - +The number of custom data arrays available (:ref:`ARRAY_CUSTOM0`, :ref:`ARRAY_CUSTOM1`, :ref:`ARRAY_CUSTOM2`, :ref:`ARRAY_CUSTOM3`). .. _class_RenderingServer_constant_PARTICLES_EMIT_FLAG_POSITION: @@ -5310,7 +5314,9 @@ Bakes the material data of the Mesh passed in the ``base`` parameter with option Creates a camera attributes object and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``camera_attributes_`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`CameraAttributes`. .. rst-class:: classref-item-separator @@ -5396,9 +5402,11 @@ The exposure value can be calculated from aperture (in f-stops), shutter speed ( :ref:`RID` **camera_create** **(** **)** -Creates a camera and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``camera_*`` RenderingServer functions. +Creates a 3D camera and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``camera_*`` RenderingServer functions. + +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +\ **Note:** The equivalent node is :ref:`Camera3D`. .. rst-class:: classref-item-separator @@ -5508,7 +5516,9 @@ If ``true``, preserves the horizontal aspect ratio which is equivalent to :ref:` Creates a canvas and returns the assigned :ref:`RID`. It can be accessed with the RID that is returned. This RID will be used in all ``canvas_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +Canvas has no :ref:`Resource` or :ref:`Node` equivalent. .. rst-class:: classref-item-separator @@ -5598,6 +5608,18 @@ See also :ref:`CanvasItem.draw_msdf_texture_rect_region` item, :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0 **)** + +Draws a 2D multiline on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. See also :ref:`CanvasItem.draw_multiline` and :ref:`CanvasItem.draw_multiline_colors`. + +.. rst-class:: classref-item-separator + +---- + .. _class_RenderingServer_method_canvas_item_add_multimesh: .. rst-class:: classref-method @@ -5640,7 +5662,7 @@ Draws particles on the :ref:`CanvasItem` pointed to by the ``i void **canvas_item_add_polygon** **(** :ref:`RID` item, :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`RID` texture **)** -Draws a 2D polygon on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. See also :ref:`CanvasItem.draw_polygon`. +Draws a 2D polygon on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. If you need more flexibility (such as being able to use bones), use :ref:`canvas_item_add_triangle_array` instead. See also :ref:`CanvasItem.draw_polygon`. .. rst-class:: classref-item-separator @@ -5652,7 +5674,7 @@ Draws a 2D polygon on the :ref:`CanvasItem` pointed to by the void **canvas_item_add_polyline** **(** :ref:`RID` item, :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** -Draws a 2D polyline on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. See also :ref:`CanvasItem.draw_polyline`. +Draws a 2D polyline on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. See also :ref:`CanvasItem.draw_polyline` and :ref:`CanvasItem.draw_polyline_colors`. .. rst-class:: classref-item-separator @@ -5700,9 +5722,7 @@ Sets a :ref:`Transform2D` that will be used to transform subs void **canvas_item_add_texture_rect** **(** :ref:`RID` item, :ref:`Rect2` rect, :ref:`RID` texture, :ref:`bool` tile=false, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Draws a 2D textured rectangle on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. See also :ref:`CanvasItem.draw_texture_rect` and :ref:`Texture2D.draw_rect`. .. rst-class:: classref-item-separator @@ -5714,9 +5734,7 @@ void **canvas_item_add_texture_rect** **(** :ref:`RID` item, :ref:`Re void **canvas_item_add_texture_rect_region** **(** :ref:`RID` item, :ref:`Rect2` rect, :ref:`RID` texture, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false, :ref:`bool` clip_uv=true **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Draws the specified region of a 2D textured rectangle on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. See also :ref:`CanvasItem.draw_texture_rect_region` and :ref:`Texture2D.draw_rect_region`. .. rst-class:: classref-item-separator @@ -5728,9 +5746,9 @@ void **canvas_item_add_texture_rect_region** **(** :ref:`RID` item, : void **canvas_item_add_triangle_array** **(** :ref:`RID` item, :ref:`PackedInt32Array` indices, :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`PackedInt32Array` bones=PackedInt32Array(), :ref:`PackedFloat32Array` weights=PackedFloat32Array(), :ref:`RID` texture, :ref:`int` count=-1 **)** -.. container:: contribute +Draws a triangle array on the :ref:`CanvasItem` pointed to by the ``item`` :ref:`RID`. This is internally used by :ref:`Line2D` and :ref:`StyleBoxFlat` for rendering. :ref:`canvas_item_add_triangle_array` is highly flexible, but more complex to use than :ref:`canvas_item_add_polygon`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** ``count`` is unused and can be left unspecified. .. rst-class:: classref-item-separator @@ -5754,7 +5772,11 @@ Clears the :ref:`CanvasItem` and removes all commands in it. :ref:`RID` **canvas_item_create** **(** **)** -Creates a new :ref:`CanvasItem` instance and returns its :ref:`RID`. +Creates a new CanvasItem instance and returns its :ref:`RID`. It can be accessed with the RID that is returned. This RID will be used in all ``canvas_item_*`` RenderingServer functions. + +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent node is :ref:`CanvasItem`. .. rst-class:: classref-item-separator @@ -5766,9 +5788,9 @@ Creates a new :ref:`CanvasItem` instance and returns its :ref: void **canvas_item_set_canvas_group_mode** **(** :ref:`RID` item, :ref:`CanvasGroupMode` mode, :ref:`float` clear_margin=5.0, :ref:`bool` fit_empty=false, :ref:`float` fit_margin=0.0, :ref:`bool` blur_mipmaps=false **)** -.. container:: contribute +Sets the canvas group mode used during 2D rendering for the canvas item specified by the ``item`` RID. For faster but more limited clipping, use :ref:`canvas_item_set_clip` instead. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The equivalent node functionality is found in :ref:`CanvasGroup` and :ref:`CanvasItem.clip_children`. .. rst-class:: classref-item-separator @@ -5780,9 +5802,9 @@ void **canvas_item_set_canvas_group_mode** **(** :ref:`RID` item, :re void **canvas_item_set_clip** **(** :ref:`RID` item, :ref:`bool` clip **)** -.. container:: contribute +If ``clip`` is ``true``, makes the canvas item specified by the ``item`` RID not draw anything outside of its rect's coordinates. This clipping is fast, but works only with axis-aligned rectangles. This means that rotation is ignored by the clipping rectangle. For more advanced clipping shapes, use :ref:`canvas_item_set_canvas_group_mode` instead. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The equivalent node functionality is found in :ref:`Label.clip_text`, :ref:`RichTextLabel` (always enabled) and more. .. rst-class:: classref-item-separator @@ -5806,9 +5828,7 @@ Sets the :ref:`CanvasItem` to copy a rect to the backbuffer. void **canvas_item_set_custom_rect** **(** :ref:`RID` item, :ref:`bool` use_custom_rect, :ref:`Rect2` rect=Rect2(0, 0, 0, 0) **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``use_custom_rect`` is ``true``, sets the custom visibility rectangle (used for culling) to ``rect`` for the canvas item specified by ``item``. Setting a custom visibility rect can reduce CPU load when drawing lots of 2D instances. If ``use_custom_rect`` is ``false``, automatically computes a visibility rectangle based on the canvas item's draw commands. .. rst-class:: classref-item-separator @@ -5820,9 +5840,7 @@ void **canvas_item_set_custom_rect** **(** :ref:`RID` item, :ref:`boo void **canvas_item_set_default_texture_filter** **(** :ref:`RID` item, :ref:`CanvasItemTextureFilter` filter **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the default texture filter mode for the canvas item specified by the ``item`` RID. Equivalent to :ref:`CanvasItem.texture_filter`. .. rst-class:: classref-item-separator @@ -5834,9 +5852,7 @@ void **canvas_item_set_default_texture_filter** **(** :ref:`RID` item void **canvas_item_set_default_texture_repeat** **(** :ref:`RID` item, :ref:`CanvasItemTextureRepeat` repeat **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the default texture repeat mode for the canvas item specified by the ``item`` RID. Equivalent to :ref:`CanvasItem.texture_repeat`. .. rst-class:: classref-item-separator @@ -5848,9 +5864,7 @@ void **canvas_item_set_default_texture_repeat** **(** :ref:`RID` item void **canvas_item_set_distance_field_mode** **(** :ref:`RID` item, :ref:`bool` enabled **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``enabled`` is ``true``, enables multichannel signed distance field rendering mode for the canvas item specified by the ``item`` RID. This is meant to be used for font rendering, or with specially generated images using `msdfgen `__. .. rst-class:: classref-item-separator @@ -5862,9 +5876,7 @@ void **canvas_item_set_distance_field_mode** **(** :ref:`RID` item, : void **canvas_item_set_draw_behind_parent** **(** :ref:`RID` item, :ref:`bool` enabled **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``enabled`` is ``true``, draws the canvas item specified by the ``item`` RID behind its parent. Equivalent to :ref:`CanvasItem.show_behind_parent`. .. rst-class:: classref-item-separator @@ -5888,9 +5900,7 @@ Sets the index for the :ref:`CanvasItem`. void **canvas_item_set_light_mask** **(** :ref:`RID` item, :ref:`int` mask **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the light ``mask`` for the canvas item specified by the ``item`` RID. Equivalent to :ref:`CanvasItem.light_mask`. .. rst-class:: classref-item-separator @@ -5902,7 +5912,7 @@ void **canvas_item_set_light_mask** **(** :ref:`RID` item, :ref:`int< void **canvas_item_set_material** **(** :ref:`RID` item, :ref:`RID` material **)** -Sets a new material to the :ref:`CanvasItem`. +Sets a new ``material`` to the canvas item specified by the ``item`` RID. Equivalent to :ref:`CanvasItem.material`. .. rst-class:: classref-item-separator @@ -5914,9 +5924,7 @@ Sets a new material to the :ref:`CanvasItem`. void **canvas_item_set_modulate** **(** :ref:`RID` item, :ref:`Color` color **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Multiplies the color of the canvas item specified by the ``item`` RID, while affecting its children. See also :ref:`canvas_item_set_self_modulate`. Equivalent to :ref:`CanvasItem.modulate`. .. rst-class:: classref-item-separator @@ -5928,9 +5936,7 @@ void **canvas_item_set_modulate** **(** :ref:`RID` item, :ref:`Color< void **canvas_item_set_parent** **(** :ref:`RID` item, :ref:`RID` parent **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets a parent :ref:`CanvasItem` to the :ref:`CanvasItem`. The item will inherit transform, modulation and visibility from its parent, like :ref:`CanvasItem` nodes in the scene tree. .. rst-class:: classref-item-separator @@ -5942,9 +5948,7 @@ void **canvas_item_set_parent** **(** :ref:`RID` item, :ref:`RID` item, :ref:`Color` color **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Multiplies the color of the canvas item specified by the ``item`` RID, without affecting its children. See also :ref:`canvas_item_set_modulate`. Equivalent to :ref:`CanvasItem.self_modulate`. .. rst-class:: classref-item-separator @@ -5956,9 +5960,7 @@ void **canvas_item_set_self_modulate** **(** :ref:`RID` item, :ref:`C void **canvas_item_set_sort_children_by_y** **(** :ref:`RID` item, :ref:`bool` enabled **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``enabled`` is ``true``, child nodes with the lowest Y position are drawn before those with a higher Y position. Y-sorting only affects children that inherit from the canvas item specified by the ``item`` RID, not the canvas item itself. Equivalent to :ref:`CanvasItem.y_sort_enabled`. .. rst-class:: classref-item-separator @@ -5970,9 +5972,7 @@ void **canvas_item_set_sort_children_by_y** **(** :ref:`RID` item, :r void **canvas_item_set_transform** **(** :ref:`RID` item, :ref:`Transform2D` transform **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``transform`` of the canvas item specified by the ``item`` RID. This affects where and how the item will be drawn. Child canvas items' transforms are multiplied by their parent's transform. Equivalent to :ref:`Node2D.transform`. .. rst-class:: classref-item-separator @@ -6008,9 +6008,9 @@ Sets the rendering visibility layer associated with this :ref:`CanvasItem` item, :ref:`bool` enable, :ref:`Rect2` area, :ref:`Callable` enter_callable, :ref:`Callable` exit_callable **)** -.. container:: contribute +Sets the given :ref:`CanvasItem` as visibility notifier. ``area`` defines the area of detecting visibility. ``enter_callable`` is called when the :ref:`CanvasItem` enters the screen, ``exit_callable`` is called when the :ref:`CanvasItem` exits the screen. If ``enable`` is ``false``, the item will no longer function as notifier. - There is currently no description for this method. Please help us by :ref:`contributing one `! +This method can be used to manually mimic :ref:`VisibleOnScreenNotifier2D`. .. rst-class:: classref-item-separator @@ -6022,9 +6022,7 @@ void **canvas_item_set_visibility_notifier** **(** :ref:`RID` item, : void **canvas_item_set_visible** **(** :ref:`RID` item, :ref:`bool` visible **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the visibility of the :ref:`CanvasItem`. .. rst-class:: classref-item-separator @@ -6074,7 +6072,9 @@ Attaches the canvas light to the canvas. Removes it from its previous canvas. Creates a canvas light and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``canvas_light_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent node is :ref:`Light2D`. .. rst-class:: classref-item-separator @@ -6098,9 +6098,11 @@ Attaches a light occluder to the canvas. Removes it from its previous canvas. :ref:`RID` **canvas_light_occluder_create** **(** **)** -Creates a light occluder and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``canvas_light_ocluder_*`` RenderingServer functions. +Creates a light occluder and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``canvas_light_occluder_*`` RenderingServer functions. + +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +\ **Note:** The equivalent node is :ref:`LightOccluder2D`. .. rst-class:: classref-item-separator @@ -6392,7 +6394,9 @@ Sets the Z range of objects that will be affected by this light. Equivalent to : Creates a new light occluder polygon and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``canvas_occluder_polygon_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`OccluderPolygon2D`. .. rst-class:: classref-item-separator @@ -6466,9 +6470,7 @@ Modulates all colors in the given canvas. void **canvas_set_shadow_texture_size** **(** :ref:`int` size **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`ProjectSettings.rendering/2d/shadow_atlas/size` to use for :ref:`Light2D` shadow rendering (in pixels). The value is rounded up to the nearest power of 2. .. rst-class:: classref-item-separator @@ -6480,9 +6482,11 @@ void **canvas_set_shadow_texture_size** **(** :ref:`int` size **)** :ref:`RID` **canvas_texture_create** **(** **)** -.. container:: contribute +Creates a canvas texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``canvas_texture_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. See also :ref:`texture_2d_create`. + +\ **Note:** The equivalent resource is :ref:`CanvasTexture` and is only meant to be used in 2D rendering, not 3D. .. rst-class:: classref-item-separator @@ -6494,9 +6498,7 @@ void **canvas_set_shadow_texture_size** **(** :ref:`int` size **)** void **canvas_texture_set_channel** **(** :ref:`RID` canvas_texture, :ref:`CanvasTextureChannel` channel, :ref:`RID` texture **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``channel``'s ``texture`` for the canvas texture specified by the ``canvas_texture`` RID. Equivalent to :ref:`CanvasTexture.diffuse_texture`, :ref:`CanvasTexture.normal_texture` and :ref:`CanvasTexture.specular_texture`. .. rst-class:: classref-item-separator @@ -6508,9 +6510,7 @@ void **canvas_texture_set_channel** **(** :ref:`RID` canvas_texture, void **canvas_texture_set_shading_parameters** **(** :ref:`RID` canvas_texture, :ref:`Color` base_color, :ref:`float` shininess **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``base_color`` and ``shininess`` to use for the canvas texture specified by the ``canvas_texture`` RID. Equivalent to :ref:`CanvasTexture.specular_color` and :ref:`CanvasTexture.specular_shininess`. .. rst-class:: classref-item-separator @@ -6522,9 +6522,7 @@ void **canvas_texture_set_shading_parameters** **(** :ref:`RID` canva void **canvas_texture_set_texture_filter** **(** :ref:`RID` canvas_texture, :ref:`CanvasItemTextureFilter` filter **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the texture ``filter`` mode to use for the canvas texture specified by the ``canvas_texture`` RID. .. rst-class:: classref-item-separator @@ -6536,9 +6534,7 @@ void **canvas_texture_set_texture_filter** **(** :ref:`RID` canvas_te void **canvas_texture_set_texture_repeat** **(** :ref:`RID` canvas_texture, :ref:`CanvasItemTextureRepeat` repeat **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the texture ``repeat`` mode to use for the canvas texture specified by the ``canvas_texture`` RID. .. rst-class:: classref-item-separator @@ -6564,9 +6560,13 @@ Creates a RenderingDevice that can be used to do draw and compute operations on :ref:`RID` **decal_create** **(** **)** -.. container:: contribute +Creates a decal and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``decal_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +To place in a scene, attach this decal to an instance using :ref:`instance_set_base` using the returned RID. + +\ **Note:** The equivalent node is :ref:`Decal`. .. rst-class:: classref-item-separator @@ -6578,9 +6578,7 @@ Creates a RenderingDevice that can be used to do draw and compute operations on void **decal_set_albedo_mix** **(** :ref:`RID` decal, :ref:`float` albedo_mix **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``albedo_mix`` in the decal specified by the ``decal`` RID. Equivalent to :ref:`Decal.albedo_mix`. .. rst-class:: classref-item-separator @@ -6592,9 +6590,7 @@ void **decal_set_albedo_mix** **(** :ref:`RID` decal, :ref:`float` decal, :ref:`int` mask **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the cull ``mask`` in the decal specified by the ``decal`` RID. Equivalent to :ref:`Decal.cull_mask`. .. rst-class:: classref-item-separator @@ -6606,9 +6602,7 @@ void **decal_set_cull_mask** **(** :ref:`RID` decal, :ref:`int` decal, :ref:`bool` enabled, :ref:`float` begin, :ref:`float` length **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the distance fade parameters in the decal specified by the ``decal`` RID. Equivalent to :ref:`Decal.distance_fade_enabled`, :ref:`Decal.distance_fade_begin` and :ref:`Decal.distance_fade_length`. .. rst-class:: classref-item-separator @@ -6620,9 +6614,7 @@ void **decal_set_distance_fade** **(** :ref:`RID` decal, :ref:`bool` decal, :ref:`float` energy **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the emission ``energy`` in the decal specified by the ``decal`` RID. Equivalent to :ref:`Decal.emission_energy`. .. rst-class:: classref-item-separator @@ -6634,9 +6626,7 @@ void **decal_set_emission_energy** **(** :ref:`RID` decal, :ref:`floa void **decal_set_fade** **(** :ref:`RID` decal, :ref:`float` above, :ref:`float` below **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the upper fade (``above``) and lower fade (``below``) in the decal specified by the ``decal`` RID. Equivalent to :ref:`Decal.upper_fade` and :ref:`Decal.lower_fade`. .. rst-class:: classref-item-separator @@ -6648,9 +6638,7 @@ void **decal_set_fade** **(** :ref:`RID` decal, :ref:`float` decal, :ref:`Color` color **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the color multiplier in the decal specified by the ``decal`` RID to ``color``. Equivalent to :ref:`Decal.modulate`. .. rst-class:: classref-item-separator @@ -6662,9 +6650,7 @@ void **decal_set_modulate** **(** :ref:`RID` decal, :ref:`Color` decal, :ref:`float` fade **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the normal ``fade`` in the decal specified by the ``decal`` RID. Equivalent to :ref:`Decal.normal_fade`. .. rst-class:: classref-item-separator @@ -6676,9 +6662,7 @@ void **decal_set_normal_fade** **(** :ref:`RID` decal, :ref:`float` decal, :ref:`Vector3` size **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``size`` of the decal specified by the ``decal`` RID. Equivalent to :ref:`Decal.size`. .. rst-class:: classref-item-separator @@ -6690,9 +6674,7 @@ void **decal_set_size** **(** :ref:`RID` decal, :ref:`Vector3` decal, :ref:`DecalTexture` type, :ref:`RID` texture **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``texture`` in the given texture ``type`` slot for the specified decal. Equivalent to :ref:`Decal.set_texture`. .. rst-class:: classref-item-separator @@ -6704,9 +6686,7 @@ void **decal_set_texture** **(** :ref:`RID` decal, :ref:`DecalTexture void **decals_set_filter** **(** :ref:`DecalFilter` filter **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the texture ``filter`` mode to use when rendering decals. This parameter is global and cannot be set on a per-decal basis. .. rst-class:: classref-item-separator @@ -6720,10 +6700,12 @@ void **decals_set_filter** **(** :ref:`DecalFilter` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. To place in a scene, attach this directional light to an instance using :ref:`instance_set_base` using the returned RID. +\ **Note:** The equivalent node is :ref:`DirectionalLight3D`. + .. rst-class:: classref-item-separator ---- @@ -6734,9 +6716,7 @@ To place in a scene, attach this directional light to an instance using :ref:`in void **directional_shadow_atlas_set_size** **(** :ref:`int` size, :ref:`bool` is_16bits **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``size`` of the directional light shadows in 3D. See also :ref:`ProjectSettings.rendering/lights_and_shadows/directional_shadow/size`. This parameter is global and cannot be set on a per-viewport basis. .. rst-class:: classref-item-separator @@ -6748,9 +6728,7 @@ void **directional_shadow_atlas_set_size** **(** :ref:`int` size, :re void **directional_soft_shadow_filter_set_quality** **(** :ref:`ShadowQuality` quality **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the filter ``quality`` for directional light shadows in 3D. See also :ref:`ProjectSettings.rendering/lights_and_shadows/directional_shadow/soft_shadow_filter_quality`. This parameter is global and cannot be set on a per-viewport basis. .. rst-class:: classref-item-separator @@ -6762,9 +6740,11 @@ void **directional_soft_shadow_filter_set_quality** **(** :ref:`ShadowQuality` **environment_bake_panorama** **(** :ref:`RID` environment, :ref:`bool` bake_irradiance, :ref:`Vector2i` size **)** -.. container:: contribute +Generates and returns an :ref:`Image` containing the radiance map for the specified ``environment`` RID's sky. This supports built-in sky material and custom sky shaders. If ``bake_irradiance`` is ``true``, the irradiance map is saved instead of the radiance map. The radiance map is used to render reflected light, while the irradiance map is used to render ambient light. See also :ref:`sky_bake_panorama`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The image is saved in linear color space without any tonemapping performed, which means it will look too dark if viewed directly in an image editor. + +\ **Note:** ``size`` should be a 2:1 aspect ratio for the generated panorama to have square pixels. For radiance maps, there is no point in using a height greater than :ref:`Sky.radiance_size`, as it won't increase detail. Irradiance maps only contain low-frequency data, so there is usually no point in going past a size of 128×64 pixels when saving an irradiance map. .. rst-class:: classref-item-separator @@ -6778,7 +6758,9 @@ void **directional_soft_shadow_filter_set_quality** **(** :ref:`ShadowQuality` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`Environment`. .. rst-class:: classref-item-separator @@ -6790,9 +6772,7 @@ Once finished with your RID, you will want to free the RID using the RenderingSe void **environment_glow_set_use_bicubic_upscale** **(** :ref:`bool` enable **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``enable`` is ``true``, enables bicubic upscaling for glow which improves quality at the cost of performance. Equivalent to :ref:`ProjectSettings.rendering/environment/glow/upscale_mode`. .. rst-class:: classref-item-separator @@ -6804,7 +6784,7 @@ void **environment_glow_set_use_bicubic_upscale** **(** :ref:`bool` void **environment_set_adjustment** **(** :ref:`RID` env, :ref:`bool` enable, :ref:`float` brightness, :ref:`float` contrast, :ref:`float` saturation, :ref:`bool` use_1d_color_correction, :ref:`RID` color_correction **)** -Sets the values to be used with the "Adjustment" post-process effect. See :ref:`Environment` for more details. +Sets the values to be used with the "adjustments" post-process effect. See :ref:`Environment` for more details. .. rst-class:: classref-item-separator @@ -6816,9 +6796,7 @@ Sets the values to be used with the "Adjustment" post-process effect. See :ref:` void **environment_set_ambient_light** **(** :ref:`RID` env, :ref:`Color` color, :ref:`EnvironmentAmbientSource` ambient=0, :ref:`float` energy=1.0, :ref:`float` sky_contibution=0.0, :ref:`EnvironmentReflectionSource` reflection_source=0 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the values to be used for ambient light rendering. See :ref:`Environment` for more details. .. rst-class:: classref-item-separator @@ -6830,7 +6808,7 @@ void **environment_set_ambient_light** **(** :ref:`RID` env, :ref:`Co void **environment_set_background** **(** :ref:`RID` env, :ref:`EnvironmentBG` bg **)** -Sets the *BGMode* of the environment. Equivalent to :ref:`Environment.background_mode`. +Sets the environment's background mode. Equivalent to :ref:`Environment.background_mode`. .. rst-class:: classref-item-separator @@ -6842,7 +6820,7 @@ Sets the *BGMode* of the environment. Equivalent to :ref:`Environment.background void **environment_set_bg_color** **(** :ref:`RID` env, :ref:`Color` color **)** -Color displayed for clear areas of the scene (if using Custom color or Color+Sky background modes). +Color displayed for clear areas of the scene. Only effective if using the :ref:`ENV_BG_COLOR` background mode. .. rst-class:: classref-item-separator @@ -6878,9 +6856,7 @@ Sets the maximum layer to use if using Canvas background mode. void **environment_set_fog** **(** :ref:`RID` env, :ref:`bool` enable, :ref:`Color` light_color, :ref:`float` light_energy, :ref:`float` sun_scatter, :ref:`float` density, :ref:`float` height, :ref:`float` height_density, :ref:`float` aerial_perspective, :ref:`float` sky_affect **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Configures fog for the specified environment RID. See ``fog_*`` properties in :ref:`Environment` for more information. .. rst-class:: classref-item-separator @@ -6892,9 +6868,7 @@ void **environment_set_fog** **(** :ref:`RID` env, :ref:`bool` env, :ref:`bool` enable, :ref:`PackedFloat32Array` levels, :ref:`float` intensity, :ref:`float` strength, :ref:`float` mix, :ref:`float` bloom_threshold, :ref:`EnvironmentGlowBlendMode` blend_mode, :ref:`float` hdr_bleed_threshold, :ref:`float` hdr_bleed_scale, :ref:`float` hdr_luminance_cap, :ref:`float` glow_map_strength, :ref:`RID` glow_map **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Configures glow for the specified environment RID. See ``glow_*`` properties in :ref:`Environment` for more information. .. rst-class:: classref-item-separator @@ -6906,9 +6880,7 @@ void **environment_set_glow** **(** :ref:`RID` env, :ref:`bool` env, :ref:`bool` enable, :ref:`int` cascades, :ref:`float` min_cell_size, :ref:`EnvironmentSDFGIYScale` y_scale, :ref:`bool` use_occlusion, :ref:`float` bounce_feedback, :ref:`bool` read_sky, :ref:`float` energy, :ref:`float` normal_bias, :ref:`float` probe_bias **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Configures signed distance field global illumination for the specified environment RID. See ``sdfgi_*`` properties in :ref:`Environment` for more information. .. rst-class:: classref-item-separator @@ -6920,9 +6892,7 @@ void **environment_set_sdfgi** **(** :ref:`RID` env, :ref:`bool` frames **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the number of frames to use for converging signed distance field global illumination. Equivalent to :ref:`ProjectSettings.rendering/global_illumination/sdfgi/frames_to_converge`. .. rst-class:: classref-item-separator @@ -6934,9 +6904,7 @@ void **environment_set_sdfgi_frames_to_converge** **(** :ref:`EnvironmentSDFGIFr void **environment_set_sdfgi_frames_to_update_light** **(** :ref:`EnvironmentSDFGIFramesToUpdateLight` frames **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the update speed for dynamic lights' indirect lighting when computing signed distance field global illumination. Equivalent to :ref:`ProjectSettings.rendering/global_illumination/sdfgi/frames_to_update_lights`. .. rst-class:: classref-item-separator @@ -6948,9 +6916,7 @@ void **environment_set_sdfgi_frames_to_update_light** **(** :ref:`EnvironmentSDF void **environment_set_sdfgi_ray_count** **(** :ref:`EnvironmentSDFGIRayCount` ray_count **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the number of rays to throw per frame when computing signed distance field global illumination. Equivalent to :ref:`ProjectSettings.rendering/global_illumination/sdfgi/probe_ray_count`. .. rst-class:: classref-item-separator @@ -7034,7 +7000,7 @@ Sets the quality level of the screen-space indirect lighting (SSIL) post-process void **environment_set_ssr** **(** :ref:`RID` env, :ref:`bool` enable, :ref:`int` max_steps, :ref:`float` fade_in, :ref:`float` fade_out, :ref:`float` depth_tolerance **)** -Sets the variables to be used with the "screen space reflections" post-process effect. See :ref:`Environment` for more details. +Sets the variables to be used with the screen-space reflections (SSR) post-process effect. See :ref:`Environment` for more details. .. rst-class:: classref-item-separator @@ -7072,9 +7038,7 @@ Sets the variables to be used with the "tonemap" post-process effect. See :ref:` void **environment_set_volumetric_fog** **(** :ref:`RID` env, :ref:`bool` enable, :ref:`float` density, :ref:`Color` albedo, :ref:`Color` emission, :ref:`float` emission_energy, :ref:`float` anisotropy, :ref:`float` length, :ref:`float` p_detail_spread, :ref:`float` gi_inject, :ref:`bool` temporal_reprojection, :ref:`float` temporal_reprojection_amount, :ref:`float` ambient_inject, :ref:`float` sky_affect **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the variables to be used with the volumetric fog post-process effect. See :ref:`Environment` for more details. .. rst-class:: classref-item-separator @@ -7110,7 +7074,11 @@ Sets the resolution of the volumetric fog's froxel buffer. ``size`` is modified :ref:`RID` **fog_volume_create** **(** **)** -Creates a new fog volume and allocates an RID. +Creates a new fog volume and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``fog_volume_*`` RenderingServer functions. + +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent node is :ref:`FogVolume`. .. rst-class:: classref-item-separator @@ -7158,9 +7126,7 @@ Sets the size of the fog volume when shape is :ref:`FOG_VOLUME_SHAPE_ELLIPSOID` swap_buffers=true, :ref:`float` frame_step=0.0 **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Forces redrawing of all viewports at once. .. rst-class:: classref-item-separator @@ -7172,9 +7138,7 @@ void **force_draw** **(** :ref:`bool` swap_buffers=true, :ref:`float void **force_sync** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Forces a synchronization between the CPU and GPU, which may be required in certain cases. Only call this when needed, as CPU-GPU synchronization has a performance cost. .. rst-class:: classref-item-separator @@ -7186,7 +7150,7 @@ void **force_sync** **(** **)** void **free_rid** **(** :ref:`RID` rid **)** -Tries to free an object in the RenderingServer. +Tries to free an object in the RenderingServer. To avoid memory leaks, this should be called after using an object as memory management does not occur automatically when using RendeeringServer directly. .. rst-class:: classref-item-separator @@ -7198,7 +7162,7 @@ Tries to free an object in the RenderingServer. :ref:`Color` **get_default_clear_color** **(** **)** -Returns the default clear color which is used when a specific clear color has not been selected. +Returns the default clear color which is used when a specific clear color has not been selected. See also :ref:`set_default_clear_color`. .. rst-class:: classref-item-separator @@ -7210,9 +7174,7 @@ Returns the default clear color which is used when a specific clear color has no :ref:`float` **get_frame_setup_time_cpu** **(** **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the time taken to setup rendering on the CPU in milliseconds. This value is shared across all viewports and does *not* require :ref:`viewport_set_measure_render_time` to be enabled on a viewport to be queried. See also :ref:`viewport_get_measured_render_time_cpu`. .. rst-class:: classref-item-separator @@ -7238,9 +7200,19 @@ Returns the global RenderingDevice. :ref:`int` **get_rendering_info** **(** :ref:`RenderingInfo` info **)** -.. container:: contribute +Returns a statistic about the rendering engine which can be used for performance profiling. See :ref:`RenderingInfo` for a list of values that can be queried. See also :ref:`viewport_get_render_info`, which returns information specific to a viewport. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Only 3D rendering is currently taken into account by some of these values, such as the number of draw calls. + +\ **Note:** Rendering information is not available until at least 2 frames have been rendered by the engine. If rendering information is not available, :ref:`get_rendering_info` returns ``0``. To print rendering information in ``_ready()`` successfully, use the following: + +:: + + func _ready(): + for _i in 2: + await get_tree().process_frame + + print(RenderingServer.get_rendering_info(RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME)) .. rst-class:: classref-item-separator @@ -7264,7 +7236,7 @@ Returns the parameters of a shader. :ref:`RID` **get_test_cube** **(** **)** -Returns the ID of the test cube. Creates one if none exists. +Returns the RID of the test cube. This mesh will be created and returned on the first call to :ref:`get_test_cube`, then it will be cached for subsequent calls. See also :ref:`make_sphere_mesh`. .. rst-class:: classref-item-separator @@ -7276,7 +7248,15 @@ Returns the ID of the test cube. Creates one if none exists. :ref:`RID` **get_test_texture** **(** **)** -Returns the ID of the test texture. Creates one if none exists. +Returns the RID of a 256×256 texture with a testing pattern on it (in :ref:`Image.FORMAT_RGB8` format). This texture will be created and returned on the first call to :ref:`get_test_texture`, then it will be cached for subsequent calls. See also :ref:`get_white_texture`. + +Example of getting the test texture and applying it to a :ref:`Sprite2D` node: + +:: + + var texture_rid = RenderingServer.get_test_texture() + var texture = ImageTexture.create_from_image(RenderingServer.texture_2d_get(texture_rid)) + $Sprite2D.texture = texture .. rst-class:: classref-item-separator @@ -7288,7 +7268,7 @@ Returns the ID of the test texture. Creates one if none exists. :ref:`String` **get_video_adapter_api_version** **(** **)** |const| -Returns the version of the graphics video adapter *currently in use* (e.g. "1.2.189" for Vulkan, "3.3.0 NVIDIA 510.60.02" for OpenGL). This version may be different from the actual latest version supported by the hardware, as Godot may not always request the latest version. +Returns the version of the graphics video adapter *currently in use* (e.g. "1.2.189" for Vulkan, "3.3.0 NVIDIA 510.60.02" for OpenGL). This version may be different from the actual latest version supported by the hardware, as Godot may not always request the latest version. See also :ref:`OS.get_video_adapter_driver_info`. \ **Note:** When running a headless or server binary, this function returns an empty string. @@ -7344,7 +7324,15 @@ Returns the vendor of the video adapter (e.g. "NVIDIA Corporation"). :ref:`RID` **get_white_texture** **(** **)** -Returns the ID of a white texture. Creates one if none exists. +Returns the ID of a 4×4 white texture (in :ref:`Image.FORMAT_RGB8` format). This texture will be created and returned on the first call to :ref:`get_white_texture`, then it will be cached for subsequent calls. See also :ref:`get_test_texture`. + +Example of getting the white texture and applying it to a :ref:`Sprite2D` node: + +:: + + var texture_rid = RenderingServer.get_white_texture() + var texture = ImageTexture.create_from_image(RenderingServer.texture_2d_get(texture_rid)) + $Sprite2D.texture = texture .. rst-class:: classref-item-separator @@ -7356,7 +7344,7 @@ Returns the ID of a white texture. Creates one if none exists. void **gi_set_use_half_resolution** **(** :ref:`bool` half_resolution **)** -If ``half_resolution`` is ``true``, renders :ref:`VoxelGI` and SDFGI (:ref:`Environment.sdfgi_enabled`) buffers at halved resolution (e.g. 960×540 when the viewport size is 1920×1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. :ref:`LightmapGI` rendering is not affected by this setting. See also :ref:`ProjectSettings.rendering/global_illumination/gi/use_half_resolution`. +If ``half_resolution`` is ``true``, renders :ref:`VoxelGI` and SDFGI (:ref:`Environment.sdfgi_enabled`) buffers at halved resolution on each axis (e.g. 960×540 when the viewport size is 1920×1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. :ref:`LightmapGI` rendering is not affected by this setting. Equivalent to :ref:`ProjectSettings.rendering/global_illumination/gi/use_half_resolution`. .. rst-class:: classref-item-separator @@ -7368,9 +7356,9 @@ If ``half_resolution`` is ``true``, renders :ref:`VoxelGI` and SD void **global_shader_parameter_add** **(** :ref:`StringName` name, :ref:`GlobalShaderParameterType` type, :ref:`Variant` default_value **)** -.. container:: contribute +Creates a new global shader uniform. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Global shader parameter names are case-sensitive. .. rst-class:: classref-item-separator @@ -7382,9 +7370,9 @@ void **global_shader_parameter_add** **(** :ref:`StringName` n :ref:`Variant` **global_shader_parameter_get** **(** :ref:`StringName` name **)** |const| -.. container:: contribute +Returns the value of the global shader uniform specified by ``name``. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** :ref:`global_shader_parameter_get` has a large performance penalty as the rendering thread needs to synchronize with the calling thread, which is slow. Do not use this method during gameplay to avoid stuttering. If you need to read values in a script after setting them, consider creating an autoload where you store the values you need to query at the same time you're setting them as global parameters. .. rst-class:: classref-item-separator @@ -7394,11 +7382,11 @@ void **global_shader_parameter_add** **(** :ref:`StringName` n .. rst-class:: classref-method -:ref:`PackedStringArray` **global_shader_parameter_get_list** **(** **)** |const| +:ref:`StringName[]` **global_shader_parameter_get_list** **(** **)** |const| -.. container:: contribute +Returns the list of global shader uniform names. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** :ref:`global_shader_parameter_get` has a large performance penalty as the rendering thread needs to synchronize with the calling thread, which is slow. Do not use this method during gameplay to avoid stuttering. If you need to read values in a script after setting them, consider creating an autoload where you store the values you need to query at the same time you're setting them as global parameters. .. rst-class:: classref-item-separator @@ -7410,9 +7398,9 @@ void **global_shader_parameter_add** **(** :ref:`StringName` n :ref:`GlobalShaderParameterType` **global_shader_parameter_get_type** **(** :ref:`StringName` name **)** |const| -.. container:: contribute +Returns the type associated to the global shader uniform specified by ``name``. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** :ref:`global_shader_parameter_get` has a large performance penalty as the rendering thread needs to synchronize with the calling thread, which is slow. Do not use this method during gameplay to avoid stuttering. If you need to read values in a script after setting them, consider creating an autoload where you store the values you need to query at the same time you're setting them as global parameters. .. rst-class:: classref-item-separator @@ -7424,9 +7412,7 @@ void **global_shader_parameter_add** **(** :ref:`StringName` n void **global_shader_parameter_remove** **(** :ref:`StringName` name **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Removes the global shader uniform specified by ``name``. .. rst-class:: classref-item-separator @@ -7438,9 +7424,7 @@ void **global_shader_parameter_remove** **(** :ref:`StringName void **global_shader_parameter_set** **(** :ref:`StringName` name, :ref:`Variant` value **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the global shader uniform ``name`` to ``value``. .. rst-class:: classref-item-separator @@ -7452,9 +7436,7 @@ void **global_shader_parameter_set** **(** :ref:`StringName` n void **global_shader_parameter_set_override** **(** :ref:`StringName` name, :ref:`Variant` value **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Overrides the global shader uniform ``name`` with ``value``. Equivalent to the :ref:`ShaderGlobalsOverride` node. .. rst-class:: classref-item-separator @@ -7528,9 +7510,11 @@ Attaches a skeleton to an instance. Removes the previous skeleton from the insta Creates a visual instance and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``instance_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. -An instance is a way of placing a 3D object in the scenario. Objects like particles, meshes, and reflection probes need to be associated with an instance to be visible in the scenario using :ref:`instance_set_base`. +An instance is a way of placing a 3D object in the scenario. Objects like particles, meshes, reflection probes and decals need to be associated with an instance to be visible in the scenario using :ref:`instance_set_base`. + +\ **Note:** The equivalent node is :ref:`VisualInstance3D`. .. rst-class:: classref-item-separator @@ -7544,7 +7528,7 @@ An instance is a way of placing a 3D object in the scenario. Objects like partic Creates a visual instance, adds it to the RenderingServer, and sets both base and scenario. It can be accessed with the RID that is returned. This RID will be used in all ``instance_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. This is a shorthand for using :ref:`instance_create` and setting the base and scenario manually. .. rst-class:: classref-item-separator @@ -7556,9 +7540,9 @@ Once finished with your RID, you will want to free the RID using the RenderingSe :ref:`Variant` **instance_geometry_get_shader_parameter** **(** :ref:`RID` instance, :ref:`StringName` parameter **)** |const| -.. container:: contribute +Returns the value of the per-instance shader uniform from the specified 3D geometry instance. Equivalent to :ref:`GeometryInstance3D.get_instance_shader_parameter`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Per-instance shader parameter names are case-sensitive. .. rst-class:: classref-item-separator @@ -7570,9 +7554,7 @@ Once finished with your RID, you will want to free the RID using the RenderingSe :ref:`Variant` **instance_geometry_get_shader_parameter_default_value** **(** :ref:`RID` instance, :ref:`StringName` parameter **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the default value of the per-instance shader uniform from the specified 3D geometry instance. Equivalent to :ref:`GeometryInstance3D.get_instance_shader_parameter`. .. rst-class:: classref-item-separator @@ -7584,9 +7566,7 @@ Once finished with your RID, you will want to free the RID using the RenderingSe :ref:`Dictionary[]` **instance_geometry_get_shader_parameter_list** **(** :ref:`RID` instance **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns a dictionary of per-instance shader uniform names of the per-instance shader uniform from the specified 3D geometry instance. The returned dictionary is in PropertyInfo format, with the keys ``name``, ``class_name``, ``type``, ``hint``, ``hint_string`` and ``usage``. Equivalent to :ref:`GeometryInstance3D.get_instance_shader_parameter`. .. rst-class:: classref-item-separator @@ -7622,9 +7602,7 @@ Sets the flag for a given :ref:`InstanceFlags` instance, :ref:`RID` lightmap, :ref:`Rect2` lightmap_uv_scale, :ref:`int` lightmap_slice **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the lightmap GI instance to use for the specified 3D geometry instance. The lightmap UV scale for the specified instance (equivalent to :ref:`GeometryInstance3D.gi_lightmap_scale`) and lightmap atlas slice must also be specified. .. rst-class:: classref-item-separator @@ -7636,9 +7614,7 @@ void **instance_geometry_set_lightmap** **(** :ref:`RID` instance, :r void **instance_geometry_set_lod_bias** **(** :ref:`RID` instance, :ref:`float` lod_bias **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the level of detail bias to use when rendering the specified 3D geometry instance. Higher values result in higher detail from further away. Equivalent to :ref:`GeometryInstance3D.lod_bias`. .. rst-class:: classref-item-separator @@ -7674,9 +7650,7 @@ Sets a material that will override the material for all surfaces on the mesh ass void **instance_geometry_set_shader_parameter** **(** :ref:`RID` instance, :ref:`StringName` parameter, :ref:`Variant` value **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the per-instance shader uniform on the specified 3D geometry instance. Equivalent to :ref:`GeometryInstance3D.set_instance_shader_parameter`. .. rst-class:: classref-item-separator @@ -7718,7 +7692,7 @@ Sets the visibility range values for the given geometry instance. Equivalent to void **instance_set_base** **(** :ref:`RID` instance, :ref:`RID` base **)** -Sets the base of the instance. A base can be any of the 3D objects that are created in the RenderingServer that can be displayed. For example, any of the light types, mesh, multimesh, immediate geometry, particle system, reflection probe, lightmap, and the GI probe are all types that can be set as the base of an instance in order to be displayed in the scenario. +Sets the base of the instance. A base can be any of the 3D objects that are created in the RenderingServer that can be displayed. For example, any of the light types, mesh, multimesh, particle system, reflection probe, decal, lightmap, voxel GI and visibility notifiers are all types that can be set as the base of an instance in order to be displayed in the scenario. .. rst-class:: classref-item-separator @@ -7766,9 +7740,7 @@ Sets a margin to increase the size of the AABB when culling objects from the vie void **instance_set_ignore_culling** **(** :ref:`RID` instance, :ref:`bool` enabled **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``true``, ignores both frustum and occlusion culling on the specified 3D geometry instance. This is not the same as :ref:`GeometryInstance3D.ignore_occlusion_culling`, which only ignores occlusion culling and leaves frustum culling intact. .. rst-class:: classref-item-separator @@ -7864,7 +7836,7 @@ Sets whether an instance is drawn or not. Equivalent to :ref:`Node3D.visible` **instances_cull_aabb** **(** :ref:`AABB` aabb, :ref:`RID` scenario **)** |const| -Returns an array of object IDs intersecting with the provided AABB. Only visual 3D nodes are considered, such as :ref:`MeshInstance3D` or :ref:`DirectionalLight3D`. Use :ref:`@GlobalScope.instance_from_id` to obtain the actual nodes. A scenario RID must be provided, which is available in the :ref:`World3D` you want to query. This forces an update for all resources queued to update. +Returns an array of object IDs intersecting with the provided AABB. Only 3D nodes that inherit from :ref:`VisualInstance3D` are considered, such as :ref:`MeshInstance3D` or :ref:`DirectionalLight3D`. Use :ref:`@GlobalScope.instance_from_id` to obtain the actual nodes. A scenario RID must be provided, which is available in the :ref:`World3D` you want to query. This forces an update for all resources queued to update. \ **Warning:** This function is primarily intended for editor usage. For in-game use cases, prefer physics collision. @@ -7878,7 +7850,7 @@ Returns an array of object IDs intersecting with the provided AABB. Only visual :ref:`PackedInt64Array` **instances_cull_convex** **(** :ref:`Plane[]` convex, :ref:`RID` scenario **)** |const| -Returns an array of object IDs intersecting with the provided convex shape. Only visual 3D nodes are considered, such as :ref:`MeshInstance3D` or :ref:`DirectionalLight3D`. Use :ref:`@GlobalScope.instance_from_id` to obtain the actual nodes. A scenario RID must be provided, which is available in the :ref:`World3D` you want to query. This forces an update for all resources queued to update. +Returns an array of object IDs intersecting with the provided convex shape. Only 3D nodes that inherit from :ref:`VisualInstance3D` are considered, such as :ref:`MeshInstance3D` or :ref:`DirectionalLight3D`. Use :ref:`@GlobalScope.instance_from_id` to obtain the actual nodes. A scenario RID must be provided, which is available in the :ref:`World3D` you want to query. This forces an update for all resources queued to update. \ **Warning:** This function is primarily intended for editor usage. For in-game use cases, prefer physics collision. @@ -7892,7 +7864,7 @@ Returns an array of object IDs intersecting with the provided convex shape. Only :ref:`PackedInt64Array` **instances_cull_ray** **(** :ref:`Vector3` from, :ref:`Vector3` to, :ref:`RID` scenario **)** |const| -Returns an array of object IDs intersecting with the provided 3D ray. Only visual 3D nodes are considered, such as :ref:`MeshInstance3D` or :ref:`DirectionalLight3D`. Use :ref:`@GlobalScope.instance_from_id` to obtain the actual nodes. A scenario RID must be provided, which is available in the :ref:`World3D` you want to query. This forces an update for all resources queued to update. +Returns an array of object IDs intersecting with the provided 3D ray. Only 3D nodes that inherit from :ref:`VisualInstance3D` are considered, such as :ref:`MeshInstance3D` or :ref:`DirectionalLight3D`. Use :ref:`@GlobalScope.instance_from_id` to obtain the actual nodes. A scenario RID must be provided, which is available in the :ref:`World3D` you want to query. This forces an update for all resources queued to update. \ **Warning:** This function is primarily intended for editor usage. For in-game use cases, prefer physics collision. @@ -7954,9 +7926,7 @@ Sets whether to use a dual paraboloid or a cubemap for the shadow map. Dual para void **light_projectors_set_filter** **(** :ref:`LightProjectorFilter` filter **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the texture filter mode to use when rendering light projectors. This parameter is global and cannot be set on a per-light basis. .. rst-class:: classref-item-separator @@ -7968,9 +7938,7 @@ void **light_projectors_set_filter** **(** :ref:`LightProjectorFilter` light, :ref:`LightBakeMode` bake_mode **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the bake mode to use for the specified 3D light. Equivalent to :ref:`Light3D.light_bake_mode`. .. rst-class:: classref-item-separator @@ -7994,7 +7962,7 @@ Sets the color of the light. Equivalent to :ref:`Light3D.light_color` light, :ref:`int` mask **)** -Sets the cull mask for this Light3D. Lights only affect objects in the selected layers. Equivalent to :ref:`Light3D.light_cull_mask`. +Sets the cull mask for this 3D light. Lights only affect objects in the selected layers. Equivalent to :ref:`Light3D.light_cull_mask`. .. rst-class:: classref-item-separator @@ -8006,7 +7974,7 @@ Sets the cull mask for this Light3D. Lights only affect objects in the selected void **light_set_distance_fade** **(** :ref:`RID` decal, :ref:`bool` enabled, :ref:`float` begin, :ref:`float` shadow, :ref:`float` length **)** -Sets the distance fade for this Light3D. This acts as a form of level of detail (LOD) and can be used to improve performance. Equivalent to :ref:`Light3D.distance_fade_enabled`, :ref:`Light3D.distance_fade_begin`, :ref:`Light3D.distance_fade_shadow`, and :ref:`Light3D.distance_fade_length`. +Sets the distance fade for this 3D light. This acts as a form of level of detail (LOD) and can be used to improve performance. Equivalent to :ref:`Light3D.distance_fade_enabled`, :ref:`Light3D.distance_fade_begin`, :ref:`Light3D.distance_fade_shadow`, and :ref:`Light3D.distance_fade_length`. .. rst-class:: classref-item-separator @@ -8018,9 +7986,7 @@ Sets the distance fade for this Light3D. This acts as a form of level of detail void **light_set_max_sdfgi_cascade** **(** :ref:`RID` light, :ref:`int` cascade **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the maximum SDFGI cascade in which the 3D light's indirect lighting is rendered. Higher values allow the light to be rendered in SDFGI further away from the camera. .. rst-class:: classref-item-separator @@ -8032,7 +7998,7 @@ void **light_set_max_sdfgi_cascade** **(** :ref:`RID` light, :ref:`in void **light_set_negative** **(** :ref:`RID` light, :ref:`bool` enable **)** -If ``true``, light will subtract light instead of adding light. Equivalent to :ref:`Light3D.light_negative`. +If ``true``, the 3D light will subtract light instead of adding light. Equivalent to :ref:`Light3D.light_negative`. .. rst-class:: classref-item-separator @@ -8044,7 +8010,7 @@ If ``true``, light will subtract light instead of adding light. Equivalent to :r void **light_set_param** **(** :ref:`RID` light, :ref:`LightParam` param, :ref:`float` value **)** -Sets the specified light parameter. See :ref:`LightParam` for options. Equivalent to :ref:`Light3D.set_param`. +Sets the specified 3D light parameter. See :ref:`LightParam` for options. Equivalent to :ref:`Light3D.set_param`. .. rst-class:: classref-item-separator @@ -8056,7 +8022,7 @@ Sets the specified light parameter. See :ref:`LightParam` light, :ref:`RID` texture **)** -Not implemented in Godot 3.x. +Sets the projector texture to use for the specified 3D light. Equivalent to :ref:`Light3D.light_projector`. .. rst-class:: classref-item-separator @@ -8092,7 +8058,11 @@ If ``true``, light will cast shadows. Equivalent to :ref:`Light3D.shadow_enabled :ref:`RID` **lightmap_create** **(** **)** -Creates a new :ref:`LightmapGI` instance. +Creates a new lightmap global illumination instance and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``lightmap_*`` RenderingServer functions. + +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent node is :ref:`LightmapGI`. .. rst-class:: classref-item-separator @@ -8228,9 +8198,7 @@ void **lightmap_set_probe_interior** **(** :ref:`RID` lightmap, :ref: void **lightmap_set_textures** **(** :ref:`RID` lightmap, :ref:`RID` light, :ref:`bool` uses_sh **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Set the textures on the given ``lightmap`` GI instance to the texture array pointed to by the ``light`` RID. If the lightmap texture was baked with :ref:`LightmapGI.directional` set to ``true``, then ``uses_sh`` must also be ``true``. .. rst-class:: classref-item-separator @@ -8242,7 +8210,7 @@ void **lightmap_set_textures** **(** :ref:`RID` lightmap, :ref:`RID` **make_sphere_mesh** **(** :ref:`int` latitudes, :ref:`int` longitudes, :ref:`float` radius **)** -Returns a mesh of a sphere with the given number of horizontal and vertical subdivisions. +Returns a mesh of a sphere with the given number of horizontal subdivisions, vertical subdivisions and radius. See also :ref:`get_test_cube`. .. rst-class:: classref-item-separator @@ -8256,7 +8224,9 @@ Returns a mesh of a sphere with the given number of horizontal and vertical subd Creates an empty material and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``material_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`Material`. .. rst-class:: classref-item-separator @@ -8370,10 +8340,12 @@ Removes all surfaces from a mesh. Creates a new mesh and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``mesh_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. To place in a scene, attach this mesh to an instance using :ref:`instance_set_base` using the returned RID. +\ **Note:** The equivalent resource is :ref:`Mesh`. + .. rst-class:: classref-item-separator ---- @@ -8660,10 +8632,12 @@ void **multimesh_allocate_data** **(** :ref:`RID` multimesh, :ref:`in Creates a new multimesh on the RenderingServer and returns an :ref:`RID` handle. This RID will be used in all ``multimesh_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. To place in a scene, attach this multimesh to an instance using :ref:`instance_set_base` using the returned RID. +\ **Note:** The equivalent resource is :ref:`MultiMesh`. + .. rst-class:: classref-item-separator ---- @@ -8686,9 +8660,9 @@ Calculates and returns the axis-aligned bounding box that encloses all instances :ref:`PackedFloat32Array` **multimesh_get_buffer** **(** :ref:`RID` multimesh **)** |const| -.. container:: contribute +Returns the MultiMesh data (such as instance transforms, colors, etc). See :ref:`multimesh_set_buffer` for a description of the returned data. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** If the buffer is in the engine's internal cache, it will have to be fetched from GPU memory and possibly decompressed. This means :ref:`multimesh_get_buffer` is potentially a slow operation and should be avoided whenever possible. .. rst-class:: classref-item-separator @@ -8832,9 +8806,22 @@ Sets the :ref:`Transform2D` for this instance. For use when m void **multimesh_set_buffer** **(** :ref:`RID` multimesh, :ref:`PackedFloat32Array` buffer **)** -.. container:: contribute +Set the entire data to use for drawing the ``multimesh`` at once to ``buffer`` (such as instance transforms and colors). ``buffer``'s size must match the number of instances multiplied by the per-instance data size (which depends on the enabled MultiMesh fields). Otherwise, an error message is printed and nothing is rendered. See also :ref:`multimesh_get_buffer`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +The per-instance data size and expected data order is: + +:: + + 2D: + - Position: 8 floats (8 floats for Transform2D) + - Position + Vertex color: 12 floats (8 floats for Transform2D, 4 floats for Color) + - Position + Custom data: 12 floats (8 floats for Transform2D, 4 floats of custom data) + - Position + Vertex color + Custom data: 16 floats (8 floats for Transform2D, 4 floats for Color, 4 floats of custom data) + 3D: + - Position: 12 floats (12 floats for Transform3D) + - Position + Vertex color: 16 floats (12 floats for Transform3D, 4 floats for Color) + - Position + Custom data: 16 floats (12 floats for Transform3D, 4 floats of custom data) + - Position + Vertex color + Custom data: 20 floats (12 floats for Transform3D, 4 floats for Color, 4 floats of custom data) .. rst-class:: classref-item-separator @@ -8870,9 +8857,11 @@ Sets the number of instances visible at a given time. If -1, all instances that :ref:`RID` **occluder_create** **(** **)** -.. container:: contribute +Creates an occluder instance and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``occluder_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`Occluder3D` (not to be confused with the :ref:`OccluderInstance3D` node). .. rst-class:: classref-item-separator @@ -8884,9 +8873,7 @@ Sets the number of instances visible at a given time. If -1, all instances that void **occluder_set_mesh** **(** :ref:`RID` occluder, :ref:`PackedVector3Array` vertices, :ref:`PackedInt32Array` indices **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the mesh data for the given occluder RID, which controls the shape of the occlusion culling that will be performed. .. rst-class:: classref-item-separator @@ -8900,10 +8887,12 @@ void **occluder_set_mesh** **(** :ref:`RID` occluder, :ref:`PackedVec Creates a new omni light and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID can be used in most ``light_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. To place in a scene, attach this omni light to an instance using :ref:`instance_set_base` using the returned RID. +\ **Note:** The equivalent node is :ref:`OmniLight3D`. + .. rst-class:: classref-item-separator ---- @@ -8914,9 +8903,9 @@ To place in a scene, attach this omni light to an instance using :ref:`instance_ :ref:`RID` **particles_collision_create** **(** **)** -.. container:: contribute +Creates a new 3D GPU particle collision or attractor and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID can be used in most ``particles_collision_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The equivalent nodes are :ref:`GPUParticlesCollision3D` and :ref:`GPUParticlesAttractor3D`. .. rst-class:: classref-item-separator @@ -8928,9 +8917,7 @@ To place in a scene, attach this omni light to an instance using :ref:`instance_ void **particles_collision_height_field_update** **(** :ref:`RID` particles_collision **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Requests an update for the 3D GPU particle collision heightfield. This may be automatically called by the 3D GPU particle collision heightfield depending on its :ref:`GPUParticlesCollisionHeightField3D.update_mode`. .. rst-class:: classref-item-separator @@ -8942,9 +8929,7 @@ void **particles_collision_height_field_update** **(** :ref:`RID` par void **particles_collision_set_attractor_attenuation** **(** :ref:`RID` particles_collision, :ref:`float` curve **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the attenuation ``curve`` for the 3D GPU particles attractor specified by the ``particles_collision`` RID. Only used for attractors, not colliders. Equivalent to :ref:`GPUParticlesAttractor3D.attenuation`. .. rst-class:: classref-item-separator @@ -8956,9 +8941,7 @@ void **particles_collision_set_attractor_attenuation** **(** :ref:`RID` particles_collision, :ref:`float` amount **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the directionality ``amount`` for the 3D GPU particles attractor specified by the ``particles_collision`` RID. Only used for attractors, not colliders. Equivalent to :ref:`GPUParticlesAttractor3D.directionality`. .. rst-class:: classref-item-separator @@ -8968,11 +8951,9 @@ void **particles_collision_set_attractor_directionality** **(** :ref:`RID` particles_collision, :ref:`float` setrngth **)** - -.. container:: contribute +void **particles_collision_set_attractor_strength** **(** :ref:`RID` particles_collision, :ref:`float` strength **)** - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``strength`` for the 3D GPU particles attractor specified by the ``particles_collision`` RID. Only used for attractors, not colliders. Equivalent to :ref:`GPUParticlesAttractor3D.strength`. .. rst-class:: classref-item-separator @@ -8984,9 +8965,7 @@ void **particles_collision_set_attractor_strength** **(** :ref:`RID` void **particles_collision_set_box_extents** **(** :ref:`RID` particles_collision, :ref:`Vector3` extents **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``extents`` for the 3D GPU particles collision by the ``particles_collision`` RID. Equivalent to :ref:`GPUParticlesCollisionBox3D.size`, :ref:`GPUParticlesCollisionSDF3D.size`, :ref:`GPUParticlesCollisionHeightField3D.size`, :ref:`GPUParticlesAttractorBox3D.size` or :ref:`GPUParticlesAttractorVectorField3D.size` depending on the ``particles_collision`` type. .. rst-class:: classref-item-separator @@ -8998,9 +8977,7 @@ void **particles_collision_set_box_extents** **(** :ref:`RID` particl void **particles_collision_set_collision_type** **(** :ref:`RID` particles_collision, :ref:`ParticlesCollisionType` type **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the collision or attractor shape ``type`` for the 3D GPU particles collision or attractor specified by the ``particles_collision`` RID. .. rst-class:: classref-item-separator @@ -9012,9 +8989,7 @@ void **particles_collision_set_collision_type** **(** :ref:`RID` part void **particles_collision_set_cull_mask** **(** :ref:`RID` particles_collision, :ref:`int` mask **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the cull ``mask`` for the 3D GPU particles collision or attractor specified by the ``particles_collision`` RID. Equivalent to :ref:`GPUParticlesCollision3D.cull_mask` or :ref:`GPUParticlesAttractor3D.cull_mask` depending on the ``particles_collision`` type. .. rst-class:: classref-item-separator @@ -9026,9 +9001,7 @@ void **particles_collision_set_cull_mask** **(** :ref:`RID` particles void **particles_collision_set_field_texture** **(** :ref:`RID` particles_collision, :ref:`RID` texture **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the signed distance field ``texture`` for the 3D GPU particles collision specified by the ``particles_collision`` RID. Equivalent to :ref:`GPUParticlesCollisionSDF3D.texture` or :ref:`GPUParticlesAttractorVectorField3D.texture` depending on the ``particles_collision`` type. .. rst-class:: classref-item-separator @@ -9040,9 +9013,7 @@ void **particles_collision_set_field_texture** **(** :ref:`RID` parti void **particles_collision_set_height_field_resolution** **(** :ref:`RID` particles_collision, :ref:`ParticlesCollisionHeightfieldResolution` resolution **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the heightmap ``resolution`` for the 3D GPU particles heightfield collision specified by the ``particles_collision`` RID. Equivalent to :ref:`GPUParticlesCollisionHeightField3D.resolution`. .. rst-class:: classref-item-separator @@ -9054,9 +9025,7 @@ void **particles_collision_set_height_field_resolution** **(** :ref:`RID` particles_collision, :ref:`float` radius **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``radius`` for the 3D GPU particles sphere collision or attractor specified by the ``particles_collision`` RID. Equivalent to :ref:`GPUParticlesCollisionSphere3D.radius` or :ref:`GPUParticlesAttractorSphere3D.radius` depending on the ``particles_collision`` type. .. rst-class:: classref-item-separator @@ -9068,12 +9037,16 @@ void **particles_collision_set_sphere_radius** **(** :ref:`RID` parti :ref:`RID` **particles_create** **(** **)** -Creates a particle system and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``particles_*`` RenderingServer functions. +Creates a GPU-based particle system and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``particles_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. To place in a scene, attach these particles to an instance using :ref:`instance_set_base` using the returned RID. +\ **Note:** The equivalent nodes are :ref:`GPUParticles2D` and :ref:`GPUParticles3D`. + +\ **Note:** All ``particles_*`` methods only apply to GPU-based particles, not CPU-based particles. :ref:`CPUParticles2D` and :ref:`CPUParticles3D` do not have equivalent RenderingServer functions available, as these use :ref:`MultiMeshInstance2D` and :ref:`MultiMeshInstance3D` under the hood (see ``multimesh_*`` methods). + .. rst-class:: classref-item-separator ---- @@ -9084,9 +9057,7 @@ To place in a scene, attach these particles to an instance using :ref:`instance_ void **particles_emit** **(** :ref:`RID` particles, :ref:`Transform3D` transform, :ref:`Vector3` velocity, :ref:`Color` color, :ref:`Color` custom, :ref:`int` emit_flags **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Manually emits particles from the ``particles`` instance. .. rst-class:: classref-item-separator @@ -9318,9 +9289,7 @@ Sets the lifetime of each particle in the system. Equivalent to :ref:`GPUParticl void **particles_set_mode** **(** :ref:`RID` particles, :ref:`ParticlesMode` mode **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets whether the GPU particles specified by the ``particles`` RID should be rendered in 2D or 3D according to ``mode``. .. rst-class:: classref-item-separator @@ -9422,9 +9391,7 @@ void **particles_set_trail_bind_poses** **(** :ref:`RID` particles, : void **particles_set_trails** **(** :ref:`RID` particles, :ref:`bool` enable, :ref:`float` length_sec **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``enable`` is ``true``, enables trails for the ``particles`` with the specified ``length_sec`` in seconds. Equivalent to :ref:`GPUParticles3D.trail_enabled` and :ref:`GPUParticles3D.trail_lifetime`. .. rst-class:: classref-item-separator @@ -9462,9 +9429,7 @@ If ``true``, particles use local coordinates. If ``false`` they use global coord void **positional_soft_shadow_filter_set_quality** **(** :ref:`ShadowQuality` quality **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the filter quality for omni and spot light shadows in 3D. See also :ref:`ProjectSettings.rendering/lights_and_shadows/positional_shadow/soft_shadow_filter_quality`. This parameter is global and cannot be set on a per-viewport basis. .. rst-class:: classref-item-separator @@ -9478,10 +9443,12 @@ void **positional_soft_shadow_filter_set_quality** **(** :ref:`ShadowQuality` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. To place in a scene, attach this reflection probe to an instance using :ref:`instance_set_base` using the returned RID. +\ **Note:** The equivalent node is :ref:`ReflectionProbe`. + .. rst-class:: classref-item-separator ---- @@ -9492,9 +9459,7 @@ To place in a scene, attach this reflection probe to an instance using :ref:`ins void **reflection_probe_set_ambient_color** **(** :ref:`RID` probe, :ref:`Color` color **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the reflection probe's custom ambient light color. Equivalent to :ref:`ReflectionProbe.ambient_color`. .. rst-class:: classref-item-separator @@ -9506,9 +9471,7 @@ void **reflection_probe_set_ambient_color** **(** :ref:`RID` probe, : void **reflection_probe_set_ambient_energy** **(** :ref:`RID` probe, :ref:`float` energy **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the reflection probe's custom ambient light energy. Equivalent to :ref:`ReflectionProbe.ambient_color_energy`. .. rst-class:: classref-item-separator @@ -9520,9 +9483,7 @@ void **reflection_probe_set_ambient_energy** **(** :ref:`RID` probe, void **reflection_probe_set_ambient_mode** **(** :ref:`RID` probe, :ref:`ReflectionProbeAmbientMode` mode **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the reflection probe's ambient light mode. Equivalent to :ref:`ReflectionProbe.ambient_mode`. .. rst-class:: classref-item-separator @@ -9606,9 +9567,7 @@ Sets the max distance away from the probe an object can be before it is culled. void **reflection_probe_set_mesh_lod_threshold** **(** :ref:`RID` probe, :ref:`float` pixels **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the mesh level of detail to use in the reflection probe rendering. Higher values will use less detailed versions of meshes that have LOD variations generated, which can improve performance. Equivalent to :ref:`ReflectionProbe.mesh_lod_threshold`. .. rst-class:: classref-item-separator @@ -9632,9 +9591,7 @@ Sets the origin offset to be used when this reflection probe is in box project m void **reflection_probe_set_resolution** **(** :ref:`RID` probe, :ref:`int` resolution **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the resolution to use when rendering the specified reflection probe. The ``resolution`` is specified for each cubemap face: for instance, specifying ``512`` will allocate 6 faces of 512×512 each (plus mipmaps for roughness levels). .. rst-class:: classref-item-separator @@ -9684,7 +9641,7 @@ Schedules a callback to the given callable after a frame has been drawn. Creates a scenario and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``scenario_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. The scenario is the 3D world that all the visual instances exist in. @@ -9698,9 +9655,7 @@ The scenario is the 3D world that all the visual instances exist in. void **scenario_set_camera_attributes** **(** :ref:`RID` scenario, :ref:`RID` effects **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the camera attributes (``effects``) that will be used with this scenario. See also :ref:`CameraAttributes`. .. rst-class:: classref-item-separator @@ -9712,7 +9667,7 @@ void **scenario_set_camera_attributes** **(** :ref:`RID` scenario, :r void **scenario_set_environment** **(** :ref:`RID` scenario, :ref:`RID` environment **)** -Sets the environment that will be used with this scenario. +Sets the environment that will be used with this scenario. See also :ref:`Environment`. .. rst-class:: classref-item-separator @@ -9736,9 +9691,7 @@ Sets the fallback environment to be used by this scenario. The fallback environm void **screen_space_roughness_limiter_set_active** **(** :ref:`bool` enable, :ref:`float` amount, :ref:`float` limit **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the screen-space roughness limiter parameters, such as whether it should be enabled and its thresholds. Equivalent to :ref:`ProjectSettings.rendering/anti_aliasing/screen_space_roughness_limiter/enabled`, :ref:`ProjectSettings.rendering/anti_aliasing/screen_space_roughness_limiter/amount` and :ref:`ProjectSettings.rendering/anti_aliasing/screen_space_roughness_limiter/limit`. .. rst-class:: classref-item-separator @@ -9762,7 +9715,7 @@ Sets a boot image. The color defines the background color. If ``scale`` is ``tru void **set_debug_generate_wireframes** **(** :ref:`bool` generate **)** -If ``true``, the engine will generate wireframes for use with the wireframe debug mode. +This method is currently unimplemented and does nothing if called with ``generate`` set to ``true``. .. rst-class:: classref-item-separator @@ -9774,7 +9727,7 @@ If ``true``, the engine will generate wireframes for use with the wireframe debu void **set_default_clear_color** **(** :ref:`Color` color **)** -Sets the default clear color which is used when a specific clear color has not been selected. +Sets the default clear color which is used when a specific clear color has not been selected. See also :ref:`get_default_clear_color`. .. rst-class:: classref-item-separator @@ -9788,7 +9741,9 @@ Sets the default clear color which is used when a specific clear color has not b Creates an empty shader and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``shader_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`Shader`. .. rst-class:: classref-item-separator @@ -9800,7 +9755,7 @@ Once finished with your RID, you will want to free the RID using the RenderingSe :ref:`String` **shader_get_code** **(** :ref:`RID` shader **)** |const| -Returns a shader's code. +Returns a shader's source code as a string. .. rst-class:: classref-item-separator @@ -9826,9 +9781,7 @@ Returns a default texture from a shader searched by name. :ref:`Variant` **shader_get_parameter_default** **(** :ref:`RID` shader, :ref:`StringName` name **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns the default value for the specified shader uniform. This is usually the value written in the shader source code. .. rst-class:: classref-item-separator @@ -9840,9 +9793,7 @@ Returns a default texture from a shader searched by name. void **shader_set_code** **(** :ref:`RID` shader, :ref:`String` code **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the shader's source code (which triggers recompilation after being changed). .. rst-class:: classref-item-separator @@ -9868,9 +9819,7 @@ Sets a shader's default texture. Overwrites the texture given by name. void **shader_set_path_hint** **(** :ref:`RID` shader, :ref:`String` path **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the path hint for the specified shader. This should generally match the :ref:`Shader` resource's :ref:`Resource.resource_path`. .. rst-class:: classref-item-separator @@ -9946,7 +9895,7 @@ Sets the :ref:`Transform2D` for a specific bone of this skele Creates a skeleton and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``skeleton_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -9984,9 +9933,11 @@ void **skeleton_set_base_transform_2d** **(** :ref:`RID` skeleton, :r :ref:`Image` **sky_bake_panorama** **(** :ref:`RID` sky, :ref:`float` energy, :ref:`bool` bake_irradiance, :ref:`Vector2i` size **)** -.. container:: contribute +Generates and returns an :ref:`Image` containing the radiance map for the specified ``sky`` RID. This supports built-in sky material and custom sky shaders. If ``bake_irradiance`` is ``true``, the irradiance map is saved instead of the radiance map. The radiance map is used to render reflected light, while the irradiance map is used to render ambient light. See also :ref:`environment_bake_panorama`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The image is saved in linear color space without any tonemapping performed, which means it will look too dark if viewed directly in an image editor. ``energy`` values above ``1.0`` can be used to brighten the resulting image. + +\ **Note:** ``size`` should be a 2:1 aspect ratio for the generated panorama to have square pixels. For radiance maps, there is no point in using a height greater than :ref:`Sky.radiance_size`, as it won't increase detail. Irradiance maps only contain low-frequency data, so there is usually no point in going past a size of 128×64 pixels when saving an irradiance map. .. rst-class:: classref-item-separator @@ -10000,7 +9951,7 @@ void **skeleton_set_base_transform_2d** **(** :ref:`RID` skeleton, :r Creates an empty sky and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``sky_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. .. rst-class:: classref-item-separator @@ -10012,7 +9963,7 @@ Once finished with your RID, you will want to free the RID using the RenderingSe void **sky_set_material** **(** :ref:`RID` sky, :ref:`RID` material **)** -Sets the material that the sky uses to render the background and reflection maps. +Sets the material that the sky uses to render the background, ambient and reflection maps. .. rst-class:: classref-item-separator @@ -10024,9 +9975,7 @@ Sets the material that the sky uses to render the background and reflection maps void **sky_set_mode** **(** :ref:`RID` sky, :ref:`SkyMode` mode **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the process ``mode`` of the sky specified by the ``sky`` RID. Equivalent to :ref:`Sky.process_mode`. .. rst-class:: classref-item-separator @@ -10038,9 +9987,7 @@ void **sky_set_mode** **(** :ref:`RID` sky, :ref:`SkyMode` sky, :ref:`int` radiance_size **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the ``radiance_size`` of the sky specified by the ``sky`` RID (in pixels). Equivalent to :ref:`Sky.radiance_size`. .. rst-class:: classref-item-separator @@ -10054,7 +10001,7 @@ void **sky_set_radiance_size** **(** :ref:`RID` sky, :ref:`int` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. To place in a scene, attach this spot light to an instance using :ref:`instance_set_base` using the returned RID. @@ -10068,9 +10015,7 @@ To place in a scene, attach this spot light to an instance using :ref:`instance_ void **sub_surface_scattering_set_quality** **(** :ref:`SubSurfaceScatteringQuality` quality **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets :ref:`ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_quality` to use when rendering materials that have subsurface scattering enabled. .. rst-class:: classref-item-separator @@ -10082,9 +10027,7 @@ void **sub_surface_scattering_set_quality** **(** :ref:`SubSurfaceScatteringQual void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, :ref:`float` depth_scale **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_scale` and :ref:`ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale` to use when rendering materials that have subsurface scattering enabled. .. rst-class:: classref-item-separator @@ -10096,9 +10039,13 @@ void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, :ref:`RID` **texture_2d_create** **(** :ref:`Image` image **)** -.. container:: contribute +Creates a 2-dimensional texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``texture_2d_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`Texture2D`. + +\ **Note:** Not to be confused with :ref:`RenderingDevice.texture_create`, which creates the graphics API's own texture type as opposed to the Godot-specific :ref:`Texture2D` resource. .. rst-class:: classref-item-separator @@ -10110,9 +10057,15 @@ void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, :ref:`Image` **texture_2d_get** **(** :ref:`RID` texture **)** |const| -.. container:: contribute +Returns an :ref:`Image` instance from the given ``texture`` :ref:`RID`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Example of getting the test texture from :ref:`get_test_texture` and applying it to a :ref:`Sprite2D` node: + +:: + + var texture_rid = RenderingServer.get_test_texture() + var texture = ImageTexture.create_from_image(RenderingServer.texture_2d_get(texture_rid)) + $Sprite2D.texture = texture .. rst-class:: classref-item-separator @@ -10124,9 +10077,7 @@ void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, :ref:`Image` **texture_2d_layer_get** **(** :ref:`RID` texture, :ref:`int` layer **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns an :ref:`Image` instance from the given ``texture`` :ref:`RID` and ``layer``. .. rst-class:: classref-item-separator @@ -10138,9 +10089,11 @@ void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, :ref:`RID` **texture_2d_layered_create** **(** :ref:`Image[]` layers, :ref:`TextureLayeredType` layered_type **)** -.. container:: contribute +Creates a 2-dimensional layered texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``texture_2d_layered_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`TextureLayered`. .. rst-class:: classref-item-separator @@ -10152,9 +10105,9 @@ void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, :ref:`RID` **texture_2d_layered_placeholder_create** **(** :ref:`TextureLayeredType` layered_type **)** -.. container:: contribute +Creates a placeholder for a 2-dimensional layered texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``texture_2d_layered_*`` RenderingServer functions, although it does nothing when used. See also :ref:`texture_2d_placeholder_create`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The equivalent resource is :ref:`PlaceholderTextureLayered`. .. rst-class:: classref-item-separator @@ -10166,9 +10119,11 @@ void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, :ref:`RID` **texture_2d_placeholder_create** **(** **)** -.. container:: contribute +Creates a placeholder for a 2-dimensional layered texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``texture_2d_layered_*`` RenderingServer functions, although it does nothing when used. See also :ref:`texture_2d_layered_placeholder_create`\ - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`PlaceholderTexture2D`. .. rst-class:: classref-item-separator @@ -10180,9 +10135,9 @@ void **sub_surface_scattering_set_scale** **(** :ref:`float` scale, void **texture_2d_update** **(** :ref:`RID` texture, :ref:`Image` image, :ref:`int` layer **)** -.. container:: contribute +Updates the texture specified by the ``texture`` :ref:`RID` with the data in ``image``. A ``layer`` must also be specified, which should be ``0`` when updating a single-layer texture (:ref:`Texture2D`). - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The ``image`` must have the same width, height and format as the current ``texture`` data. Otherwise, an error will be printed and the original texture won't be modified. If you need to use different width, height or format, use :ref:`texture_replace` instead. .. rst-class:: classref-item-separator @@ -10194,9 +10149,7 @@ void **texture_2d_update** **(** :ref:`RID` texture, :ref:`Image` **texture_3d_create** **(** :ref:`Format` format, :ref:`int` width, :ref:`int` height, :ref:`int` depth, :ref:`bool` mipmaps, :ref:`Image[]` data **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +**Note:** The equivalent resource is :ref:`Texture3D`. .. rst-class:: classref-item-separator @@ -10208,9 +10161,7 @@ void **texture_2d_update** **(** :ref:`RID` texture, :ref:`Image` **texture_3d_get** **(** :ref:`RID` texture **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns 3D texture data as an array of :ref:`Image`\ s for the specified texture :ref:`RID`. .. rst-class:: classref-item-separator @@ -10222,9 +10173,11 @@ void **texture_2d_update** **(** :ref:`RID` texture, :ref:`Image` **texture_3d_placeholder_create** **(** **)** -.. container:: contribute +Creates a placeholder for a 3-dimensional texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``texture_3d_*`` RenderingServer functions, although it does nothing when used. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent resource is :ref:`PlaceholderTexture3D`. .. rst-class:: classref-item-separator @@ -10236,9 +10189,23 @@ void **texture_2d_update** **(** :ref:`RID` texture, :ref:`Image` texture, :ref:`Image[]` data **)** -.. container:: contribute +Updates the texture specified by the ``texture`` :ref:`RID`'s data with the data in ``data``. All the texture's layers must be replaced at once. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** The ``texture`` must have the same width, height, depth and format as the current texture data. Otherwise, an error will be printed and the original texture won't be modified. If you need to use different width, height, depth or format, use :ref:`texture_replace` instead. + +.. rst-class:: classref-item-separator + +---- + +.. _class_RenderingServer_method_texture_get_native_handle: + +.. rst-class:: classref-method + +:ref:`int` **texture_get_native_handle** **(** :ref:`RID` texture, :ref:`bool` srgb=false **)** |const| + +Returns the internal graphics handle for this texture object. For use when communicating with 3rd party APIs mostly with GDExternal. + +\ **Note:** This functions returns a ``uint64_t`` which internally maps to a ``GLuint`` (OpenGL) or ``VkImage`` (Vulkan). .. rst-class:: classref-item-separator @@ -10276,9 +10243,7 @@ Returns a texture :ref:`RID` that can be used with :ref:`RenderingDev :ref:`RID` **texture_proxy_create** **(** :ref:`RID` base **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +*Deprecated.* As ProxyTexture was removed in Godot 4, this method does nothing when called and always returns a null :ref:`RID`. .. rst-class:: classref-item-separator @@ -10290,9 +10255,7 @@ Returns a texture :ref:`RID` that can be used with :ref:`RenderingDev void **texture_proxy_update** **(** :ref:`RID` texture, :ref:`RID` proxy_to **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +*Deprecated.* ProxyTexture was removed in Godot 4, so this method cannot be used anymore. .. rst-class:: classref-item-separator @@ -10304,9 +10267,7 @@ void **texture_proxy_update** **(** :ref:`RID` texture, :ref:`RID` texture, :ref:`RID` by_texture **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Replaces ``texture``'s texture data by the texture specified by the ``by_texture`` RID, without changing ``texture``'s RID. .. rst-class:: classref-item-separator @@ -10415,7 +10376,9 @@ Using this can result in significant optimization, especially on lower-end devic Creates an empty viewport and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``viewport_*`` RenderingServer functions. -Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` static method. +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent node is :ref:`Viewport`. .. rst-class:: classref-item-separator @@ -10427,9 +10390,9 @@ Once finished with your RID, you will want to free the RID using the RenderingSe :ref:`float` **viewport_get_measured_render_time_cpu** **(** :ref:`RID` viewport **)** |const| -.. container:: contribute +Returns the CPU time taken to render the last frame in milliseconds. This *only* includes time spent in rendering-related operations; scripts' ``_process`` functions and other engine subsystems are not included in this readout. To get a complete readout of CPU time spent to render the scene, sum the render times of all viewports that are drawn every frame plus :ref:`get_frame_setup_time_cpu`. Unlike :ref:`Engine.get_frames_per_second`, this method will accurately reflect CPU utilization even if framerate is capped via V-Sync or :ref:`Engine.max_fps`. See also :ref:`viewport_get_measured_render_time_gpu`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Requires measurements to be enabled on the specified ``viewport`` using :ref:`viewport_set_measure_render_time`. Otherwise, this method returns ``0.0``. .. rst-class:: classref-item-separator @@ -10441,9 +10404,11 @@ Once finished with your RID, you will want to free the RID using the RenderingSe :ref:`float` **viewport_get_measured_render_time_gpu** **(** :ref:`RID` viewport **)** |const| -.. container:: contribute +Returns the GPU time taken to render the last frame in milliseconds. To get a complete readout of GPU time spent to render the scene, sum the render times of all viewports that are drawn every frame. Unlike :ref:`Engine.get_frames_per_second`, this method accurately reflects GPU utilization even if framerate is capped via V-Sync or :ref:`Engine.max_fps`. See also :ref:`viewport_get_measured_render_time_gpu`. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** Requires measurements to be enabled on the specified ``viewport`` using :ref:`viewport_set_measure_render_time`. Otherwise, this method returns ``0.0``. + +\ **Note:** When GPU utilization is low enough during a certain period of time, GPUs will decrease their power state (which in turn decreases core and memory clock speeds). This can cause the reported GPU time to increase if GPU utilization is kept low enough by a framerate cap (compared to what it would be at the GPU's highest power state). Keep this in mind when benchmarking using :ref:`viewport_get_measured_render_time_gpu`. This behavior can be overridden in the graphics driver settings at the cost of higher power usage. .. rst-class:: classref-item-separator @@ -10455,9 +10420,35 @@ Once finished with your RID, you will want to free the RID using the RenderingSe :ref:`int` **viewport_get_render_info** **(** :ref:`RID` viewport, :ref:`ViewportRenderInfoType` type, :ref:`ViewportRenderInfo` info **)** -.. container:: contribute +Returns a statistic about the rendering engine which can be used for performance profiling. This is separated into render pass ``type``\ s, each of them having the same ``info``\ s you can query (different passes will return different values). See :ref:`ViewportRenderInfoType` for a list of render pass types and :ref:`ViewportRenderInfo` for a list of information that can be queried. - There is currently no description for this method. Please help us by :ref:`contributing one `! +See also :ref:`get_rendering_info`, which returns global information across all viewports. + +\ **Note:** Viewport rendering information is not available until at least 2 frames have been rendered by the engine. If rendering information is not available, :ref:`viewport_get_render_info` returns ``0``. To print rendering information in ``_ready()`` successfully, use the following: + +:: + + func _ready(): + for _i in 2: + await get_tree().process_frame + + print( + RenderingServer.viewport_get_render_info(get_viewport().get_viewport_rid(), + RenderingServer.VIEWPORT_RENDER_INFO_TYPE_VISIBLE, + RenderingServer.VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME) + ) + +.. rst-class:: classref-item-separator + +---- + +.. _class_RenderingServer_method_viewport_get_render_target: + +.. rst-class:: classref-method + +:ref:`RID` **viewport_get_render_target** **(** :ref:`RID` viewport **)** |const| + +Returns the render target for the viewport. .. rst-class:: classref-item-separator @@ -10567,9 +10558,7 @@ Sets the debug draw mode of a viewport. See :ref:`ViewportDebugDraw` viewport, :ref:`CanvasItemTextureFilter` filter **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the default texture filtering mode for the specified ``viewport`` RID. See :ref:`CanvasItemTextureFilter` for options. .. rst-class:: classref-item-separator @@ -10581,9 +10570,7 @@ void **viewport_set_default_canvas_item_texture_filter** **(** :ref:`RID` viewport, :ref:`CanvasItemTextureRepeat` repeat **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the default texture repeat mode for the specified ``viewport`` RID. See :ref:`CanvasItemTextureRepeat` for options. .. rst-class:: classref-item-separator @@ -10595,7 +10582,7 @@ void **viewport_set_default_canvas_item_texture_repeat** **(** :ref:`RID` viewport, :ref:`bool` disable **)** -If ``true``, the viewport's canvas is not rendered. +If ``true``, the viewport's canvas (i.e. 2D and GUI elements) is not rendered. .. rst-class:: classref-item-separator @@ -10607,9 +10594,7 @@ If ``true``, the viewport's canvas is not rendered. void **viewport_set_disable_3d** **(** :ref:`RID` viewport, :ref:`bool` disable **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``true``, the viewport's 3D elements are not rendered. .. rst-class:: classref-item-separator @@ -10657,9 +10642,7 @@ Sets the viewport's global transformation matrix. void **viewport_set_measure_render_time** **(** :ref:`RID` viewport, :ref:`bool` enable **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the measurement for the given ``viewport`` RID (obtained using :ref:`Viewport.get_viewport_rid`). Once enabled, :ref:`viewport_get_measured_render_time_cpu` and :ref:`viewport_get_measured_render_time_gpu` will return values greater than ``0.0`` when queried with the given ``viewport``. .. rst-class:: classref-item-separator @@ -10671,7 +10654,7 @@ void **viewport_set_measure_render_time** **(** :ref:`RID` viewport, void **viewport_set_msaa_2d** **(** :ref:`RID` viewport, :ref:`ViewportMSAA` msaa **)** -Sets the multisample anti-aliasing mode for 2D/Canvas. See :ref:`ViewportMSAA` for options. +Sets the multisample anti-aliasing mode for 2D/Canvas on the specified ``viewport`` RID. See :ref:`ViewportMSAA` for options. .. rst-class:: classref-item-separator @@ -10683,7 +10666,7 @@ Sets the multisample anti-aliasing mode for 2D/Canvas. See :ref:`ViewportMSAA` viewport, :ref:`ViewportMSAA` msaa **)** -Sets the multisample anti-aliasing mode for 3D. See :ref:`ViewportMSAA` for options. +Sets the multisample anti-aliasing mode for 3D on the specified ``viewport`` RID. See :ref:`ViewportMSAA` for options. .. rst-class:: classref-item-separator @@ -10695,9 +10678,7 @@ Sets the multisample anti-aliasing mode for 3D. See :ref:`ViewportMSAA` quality **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`ProjectSettings.rendering/occlusion_culling/bvh_build_quality` to use for occlusion culling. This parameter is global and cannot be set on a per-viewport basis. .. rst-class:: classref-item-separator @@ -10709,9 +10690,7 @@ void **viewport_set_occlusion_culling_build_quality** **(** :ref:`ViewportOcclus void **viewport_set_occlusion_rays_per_thread** **(** :ref:`int` rays_per_thread **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`ProjectSettings.rendering/occlusion_culling/occlusion_rays_per_thread` to use for occlusion culling. This parameter is global and cannot be set on a per-viewport basis. .. rst-class:: classref-item-separator @@ -10723,7 +10702,7 @@ void **viewport_set_occlusion_rays_per_thread** **(** :ref:`int` rays void **viewport_set_parent_viewport** **(** :ref:`RID` viewport, :ref:`RID` parent_viewport **)** -Sets the viewport's parent to another viewport. +Sets the viewport's parent to the viewport specified by the ``parent_viewport`` RID. .. rst-class:: classref-item-separator @@ -10735,7 +10714,7 @@ Sets the viewport's parent to another viewport. void **viewport_set_positional_shadow_atlas_quadrant_subdivision** **(** :ref:`RID` viewport, :ref:`int` quadrant, :ref:`int` subdivision **)** -Sets the shadow atlas quadrant's subdivision. +Sets the number of subdivisions to use in the specified shadow atlas ``quadrant`` for omni and spot shadows. See also :ref:`Viewport.set_positional_shadow_atlas_quadrant_subdiv`. .. rst-class:: classref-item-separator @@ -10747,9 +10726,9 @@ Sets the shadow atlas quadrant's subdivision. void **viewport_set_positional_shadow_atlas_size** **(** :ref:`RID` viewport, :ref:`int` size, :ref:`bool` use_16_bits=false **)** -Sets the size of the shadow atlas's images (used for omni and spot lights). The value will be rounded up to the nearest power of 2. +Sets the ``size`` of the shadow atlas's images (used for omni and spot lights) on the viewport specified by the ``viewport`` RID. The value is rounded up to the nearest power of 2. If ``use_16_bits`` is ``true``, use 16 bits for the omni/spot shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. -\ **Note:** If this is set to ``0``, no shadows will be visible at all (including directional shadows). +\ **Note:** If this is set to ``0``, no positional shadows will be visible at all. This can improve performance significantly on low-end systems by reducing both the CPU and GPU load (as fewer draw calls are needed to draw the scene without shadows). .. rst-class:: classref-item-separator @@ -10773,7 +10752,7 @@ If ``true``, render the contents of the viewport directly to screen. This allows void **viewport_set_scaling_3d_mode** **(** :ref:`RID` viewport, :ref:`ViewportScaling3DMode` scaling_3d_mode **)** -Sets scaling 3d mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. FSR should be used where possible. +Sets the 3D resolution scaling mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. FSR should be used where possible. .. rst-class:: classref-item-separator @@ -10799,9 +10778,7 @@ When using FSR upscaling, AMD recommends exposing the following values as preset void **viewport_set_scenario** **(** :ref:`RID` viewport, :ref:`RID` scenario **)** -Sets a viewport's scenario. - -The scenario contains information about environment information, reflection atlas etc. +Sets a viewport's scenario. The scenario contains information about environment information, reflection atlas, etc. .. rst-class:: classref-item-separator @@ -10813,9 +10790,7 @@ The scenario contains information about environment information, reflection atla void **viewport_set_screen_space_aa** **(** :ref:`RID` viewport, :ref:`ViewportScreenSpaceAA` mode **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the viewport's screen-space antialiasing mode. .. rst-class:: classref-item-separator @@ -10827,9 +10802,7 @@ void **viewport_set_screen_space_aa** **(** :ref:`RID` viewport, :ref void **viewport_set_sdf_oversize_and_scale** **(** :ref:`RID` viewport, :ref:`ViewportSDFOversize` oversize, :ref:`ViewportSDFScale` scale **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the viewport's 2D signed distance field :ref:`ProjectSettings.rendering/2d/sdf/oversize` and :ref:`ProjectSettings.rendering/2d/sdf/scale`. This is used when sampling the signed distance field in :ref:`CanvasItem` shaders as well as :ref:`GPUParticles2D` collision. This is *not* used by SDFGI in 3D rendering. .. rst-class:: classref-item-separator @@ -10841,7 +10814,7 @@ void **viewport_set_sdf_oversize_and_scale** **(** :ref:`RID` viewpor void **viewport_set_size** **(** :ref:`RID` viewport, :ref:`int` width, :ref:`int` height **)** -Sets the viewport's width and height. +Sets the viewport's width and height in pixels. .. rst-class:: classref-item-separator @@ -10853,9 +10826,7 @@ Sets the viewport's width and height. void **viewport_set_snap_2d_transforms_to_pixel** **(** :ref:`RID` viewport, :ref:`bool` enabled **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``true``, canvas item transforms (i.e. origin position) are snapped to the nearest pixel when rendering. This can lead to a crisper appearance at the cost of less smooth movement, especially when :ref:`Camera2D` smoothing is enabled. Equivalent to :ref:`ProjectSettings.rendering/2d/snap/snap_2d_transforms_to_pixel`. .. rst-class:: classref-item-separator @@ -10867,9 +10838,7 @@ void **viewport_set_snap_2d_transforms_to_pixel** **(** :ref:`RID` vi void **viewport_set_snap_2d_vertices_to_pixel** **(** :ref:`RID` viewport, :ref:`bool` enabled **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``true``, canvas item vertices (i.e. polygon points) are snapped to the nearest pixel when rendering. This can lead to a crisper appearance at the cost of less smooth movement, especially when :ref:`Camera2D` smoothing is enabled. Equivalent to :ref:`ProjectSettings.rendering/2d/snap/snap_2d_vertices_to_pixel`. .. rst-class:: classref-item-separator @@ -10919,9 +10888,7 @@ Sets when the viewport should be updated. See :ref:`ViewportUpdateMode` viewport, :ref:`bool` enable **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``true``, enables debanding on the specified viewport. Equivalent to :ref:`ProjectSettings.rendering/anti_aliasing/quality/use_debanding`. .. rst-class:: classref-item-separator @@ -10933,9 +10900,7 @@ void **viewport_set_use_debanding** **(** :ref:`RID` viewport, :ref:` void **viewport_set_use_occlusion_culling** **(** :ref:`RID` viewport, :ref:`bool` enable **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +If ``true``, enables occlusion culling on the specified viewport. Equivalent to :ref:`ProjectSettings.rendering/occlusion_culling/use_occlusion_culling`. .. rst-class:: classref-item-separator @@ -10947,7 +10912,7 @@ void **viewport_set_use_occlusion_culling** **(** :ref:`RID` viewport void **viewport_set_use_taa** **(** :ref:`RID` viewport, :ref:`bool` enable **)** -If ``true``, use Temporal Anti-Aliasing. +If ``true``, use Temporal Anti-Aliasing. Equivalent to :ref:`ProjectSettings.rendering/anti_aliasing/quality/use_taa`. .. rst-class:: classref-item-separator @@ -10971,7 +10936,7 @@ If ``true``, the viewport uses augmented or virtual reality technologies. See :r void **viewport_set_vrs_mode** **(** :ref:`RID` viewport, :ref:`ViewportVRSMode` mode **)** -Sets the Variable Rate Shading (VRS) mode for the viewport. Note, if hardware does not support VRS this property is ignored. +Sets the Variable Rate Shading (VRS) mode for the viewport. If the GPU does not support VRS, this property is ignored. Equivalent to :ref:`ProjectSettings.rendering/vrs/mode`. .. rst-class:: classref-item-separator @@ -10983,7 +10948,7 @@ Sets the Variable Rate Shading (VRS) mode for the viewport. Note, if hardware do void **viewport_set_vrs_texture** **(** :ref:`RID` viewport, :ref:`RID` texture **)** -Texture to use when the VRS mode is set to :ref:`VIEWPORT_VRS_TEXTURE`. +The texture to use when the VRS mode is set to :ref:`VIEWPORT_VRS_TEXTURE`. Equivalent to :ref:`ProjectSettings.rendering/vrs/texture`. .. rst-class:: classref-item-separator @@ -10995,9 +10960,13 @@ Texture to use when the VRS mode is set to :ref:`VIEWPORT_VRS_TEXTURE` **visibility_notifier_create** **(** **)** -.. container:: contribute +Creates a new 3D visibility notifier object and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``visibility_notifier_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +To place in a scene, attach this mesh to an instance using :ref:`instance_set_base` using the returned RID. + +\ **Note:** The equivalent node is :ref:`VisibleOnScreenNotifier3D`. .. rst-class:: classref-item-separator @@ -11051,9 +11020,11 @@ void **voxel_gi_allocate_data** **(** :ref:`RID` voxel_gi, :ref:`Tran :ref:`RID` **voxel_gi_create** **(** **)** -.. container:: contribute +Creates a new voxel-based global illumination object and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all ``voxel_gi_*`` RenderingServer functions. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Once finished with your RID, you will want to free the RID using the RenderingServer's :ref:`free_rid` method. + +\ **Note:** The equivalent node is :ref:`VoxelGI`. .. rst-class:: classref-item-separator @@ -11161,9 +11132,7 @@ Used to inform the renderer what exposure normalization value was used while bak void **voxel_gi_set_bias** **(** :ref:`RID` voxel_gi, :ref:`float` bias **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`VoxelGIData.bias` value to use on the specified ``voxel_gi``'s :ref:`RID`. .. rst-class:: classref-item-separator @@ -11175,9 +11144,7 @@ void **voxel_gi_set_bias** **(** :ref:`RID` voxel_gi, :ref:`float` voxel_gi, :ref:`float` range **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`VoxelGIData.dynamic_range` value to use on the specified ``voxel_gi``'s :ref:`RID`. .. rst-class:: classref-item-separator @@ -11189,9 +11156,7 @@ void **voxel_gi_set_dynamic_range** **(** :ref:`RID` voxel_gi, :ref:` void **voxel_gi_set_energy** **(** :ref:`RID` voxel_gi, :ref:`float` energy **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`VoxelGIData.energy` value to use on the specified ``voxel_gi``'s :ref:`RID`. .. rst-class:: classref-item-separator @@ -11203,9 +11168,7 @@ void **voxel_gi_set_energy** **(** :ref:`RID` voxel_gi, :ref:`float` voxel_gi, :ref:`bool` enable **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`VoxelGIData.interior` value to use on the specified ``voxel_gi``'s :ref:`RID`. .. rst-class:: classref-item-separator @@ -11217,9 +11180,7 @@ void **voxel_gi_set_interior** **(** :ref:`RID` voxel_gi, :ref:`bool< void **voxel_gi_set_normal_bias** **(** :ref:`RID` voxel_gi, :ref:`float` bias **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`VoxelGIData.normal_bias` value to use on the specified ``voxel_gi``'s :ref:`RID`. .. rst-class:: classref-item-separator @@ -11231,9 +11192,7 @@ void **voxel_gi_set_normal_bias** **(** :ref:`RID` voxel_gi, :ref:`fl void **voxel_gi_set_propagation** **(** :ref:`RID` voxel_gi, :ref:`float` amount **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`VoxelGIData.propagation` value to use on the specified ``voxel_gi``'s :ref:`RID`. .. rst-class:: classref-item-separator @@ -11245,9 +11204,7 @@ void **voxel_gi_set_propagation** **(** :ref:`RID` voxel_gi, :ref:`fl void **voxel_gi_set_quality** **(** :ref:`VoxelGIQuality` quality **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`ProjectSettings.rendering/global_illumination/voxel_gi/quality` value to use when rendering. This parameter is global and cannot be set on a per-VoxelGI basis. .. rst-class:: classref-item-separator @@ -11259,9 +11216,7 @@ void **voxel_gi_set_quality** **(** :ref:`VoxelGIQuality` voxel_gi, :ref:`bool` enable **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the :ref:`VoxelGIData.use_two_bounces` value to use on the specified ``voxel_gi``'s :ref:`RID`. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_resource.rst b/classes/class_resource.rst index 96d060f0d4f..90e8c5ac906 100644 --- a/classes/class_resource.rst +++ b/classes/class_resource.rst @@ -12,7 +12,7 @@ Resource **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -**Inherited By:** :ref:`Animation`, :ref:`AnimationLibrary`, :ref:`AnimationNode`, :ref:`AnimationNodeStateMachinePlayback`, :ref:`AnimationNodeStateMachineTransition`, :ref:`AudioBusLayout`, :ref:`AudioEffect`, :ref:`AudioStream`, :ref:`BitMap`, :ref:`BoneMap`, :ref:`ButtonGroup`, :ref:`CameraAttributes`, :ref:`CryptoKey`, :ref:`Curve`, :ref:`Curve2D`, :ref:`Curve3D`, :ref:`EditorNode3DGizmoPlugin`, :ref:`EditorSettings`, :ref:`Environment`, :ref:`Font`, :ref:`GDExtension`, :ref:`GLTFAccessor`, :ref:`GLTFAnimation`, :ref:`GLTFBufferView`, :ref:`GLTFCamera`, :ref:`GLTFDocument`, :ref:`GLTFDocumentExtension`, :ref:`GLTFLight`, :ref:`GLTFMesh`, :ref:`GLTFNode`, :ref:`GLTFSkeleton`, :ref:`GLTFSkin`, :ref:`GLTFSpecGloss`, :ref:`GLTFState`, :ref:`GLTFTexture`, :ref:`GLTFTextureSampler`, :ref:`Gradient`, :ref:`Image`, :ref:`ImporterMesh`, :ref:`InputEvent`, :ref:`JSON`, :ref:`LabelSettings`, :ref:`LightmapGIData`, :ref:`Material`, :ref:`Mesh`, :ref:`MeshLibrary`, :ref:`MissingResource`, :ref:`MultiMesh`, :ref:`NavigationMesh`, :ref:`NavigationPolygon`, :ref:`Noise`, :ref:`Occluder3D`, :ref:`OccluderPolygon2D`, :ref:`OggPacketSequence`, :ref:`OpenXRAction`, :ref:`OpenXRActionMap`, :ref:`OpenXRActionSet`, :ref:`OpenXRInteractionProfile`, :ref:`OpenXRIPBinding`, :ref:`PackedDataContainer`, :ref:`PackedScene`, :ref:`PhysicsMaterial`, :ref:`PolygonPathFinder`, :ref:`RDShaderFile`, :ref:`RDShaderSPIRV`, :ref:`RichTextEffect`, :ref:`SceneReplicationConfig`, :ref:`Script`, :ref:`Shader`, :ref:`ShaderInclude`, :ref:`Shape2D`, :ref:`Shape3D`, :ref:`Shortcut`, :ref:`SkeletonModification2D`, :ref:`SkeletonModificationStack2D`, :ref:`SkeletonProfile`, :ref:`Skin`, :ref:`Sky`, :ref:`SpriteFrames`, :ref:`StyleBox`, :ref:`SyntaxHighlighter`, :ref:`Texture`, :ref:`Theme`, :ref:`TileMapPattern`, :ref:`TileSet`, :ref:`TileSetSource`, :ref:`Translation`, :ref:`VideoStream`, :ref:`VideoStreamPlayback`, :ref:`VisualShaderNode`, :ref:`VoxelGIData`, :ref:`World2D`, :ref:`World3D`, :ref:`X509Certificate` +**Inherited By:** :ref:`Animation`, :ref:`AnimationLibrary`, :ref:`AnimationNode`, :ref:`AnimationNodeStateMachinePlayback`, :ref:`AnimationNodeStateMachineTransition`, :ref:`AudioBusLayout`, :ref:`AudioEffect`, :ref:`AudioStream`, :ref:`BitMap`, :ref:`BoneMap`, :ref:`ButtonGroup`, :ref:`CameraAttributes`, :ref:`CryptoKey`, :ref:`Curve`, :ref:`Curve2D`, :ref:`Curve3D`, :ref:`EditorNode3DGizmoPlugin`, :ref:`EditorSettings`, :ref:`Environment`, :ref:`Font`, :ref:`GDExtension`, :ref:`GLTFAccessor`, :ref:`GLTFAnimation`, :ref:`GLTFBufferView`, :ref:`GLTFCamera`, :ref:`GLTFCollider`, :ref:`GLTFDocument`, :ref:`GLTFDocumentExtension`, :ref:`GLTFLight`, :ref:`GLTFMesh`, :ref:`GLTFNode`, :ref:`GLTFPhysicsBody`, :ref:`GLTFSkeleton`, :ref:`GLTFSkin`, :ref:`GLTFSpecGloss`, :ref:`GLTFState`, :ref:`GLTFTexture`, :ref:`GLTFTextureSampler`, :ref:`Gradient`, :ref:`Image`, :ref:`ImporterMesh`, :ref:`InputEvent`, :ref:`JSON`, :ref:`LabelSettings`, :ref:`LightmapGIData`, :ref:`Material`, :ref:`Mesh`, :ref:`MeshLibrary`, :ref:`MissingResource`, :ref:`MultiMesh`, :ref:`NavigationMesh`, :ref:`NavigationPolygon`, :ref:`Noise`, :ref:`Occluder3D`, :ref:`OccluderPolygon2D`, :ref:`OggPacketSequence`, :ref:`OpenXRAction`, :ref:`OpenXRActionMap`, :ref:`OpenXRActionSet`, :ref:`OpenXRInteractionProfile`, :ref:`OpenXRIPBinding`, :ref:`PackedDataContainer`, :ref:`PackedScene`, :ref:`PhysicsMaterial`, :ref:`PolygonPathFinder`, :ref:`RDShaderFile`, :ref:`RDShaderSPIRV`, :ref:`RichTextEffect`, :ref:`SceneReplicationConfig`, :ref:`Script`, :ref:`Shader`, :ref:`ShaderInclude`, :ref:`Shape2D`, :ref:`Shape3D`, :ref:`Shortcut`, :ref:`SkeletonModification2D`, :ref:`SkeletonModificationStack2D`, :ref:`SkeletonProfile`, :ref:`Skin`, :ref:`Sky`, :ref:`SpriteFrames`, :ref:`StyleBox`, :ref:`SyntaxHighlighter`, :ref:`Texture`, :ref:`Theme`, :ref:`TileMapPattern`, :ref:`TileSet`, :ref:`TileSetSource`, :ref:`Translation`, :ref:`VideoStream`, :ref:`VideoStreamPlayback`, :ref:`VisualShaderNode`, :ref:`VoxelGIData`, :ref:`World2D`, :ref:`World3D`, :ref:`X509Certificate` Base class for all resources. diff --git a/classes/class_resourceloader.rst b/classes/class_resourceloader.rst index 7a9973109d8..bd0674322b2 100644 --- a/classes/class_resourceloader.rst +++ b/classes/class_resourceloader.rst @@ -252,6 +252,8 @@ Returns an empty resource if no :ref:`ResourceFormatLoader` built-in method which can be used in most situations, leaving the use of **ResourceLoader** for more advanced scenarios. +\ **Note:** If :ref:`ProjectSettings.editor/export/convert_text_resources_to_binary` is ``true``, :ref:`@GDScript.load` will not be able to read converted files in an exported project. If you rely on run-time loading of files present within the PCK, set :ref:`ProjectSettings.editor/export/convert_text_resources_to_binary` to ``false``. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_ribbontrailmesh.rst b/classes/class_ribbontrailmesh.rst index 280eea4f007..13989c05b14 100644 --- a/classes/class_ribbontrailmesh.rst +++ b/classes/class_ribbontrailmesh.rst @@ -12,9 +12,25 @@ RibbonTrailMesh **Inherits:** :ref:`PrimitiveMesh` **<** :ref:`Mesh` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Represents a straight ribbon-shaped :ref:`PrimitiveMesh` with variable width. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +**RibbonTrailMesh** represents a straight ribbon-shaped mesh with variable width. The ribbon is composed of a number of flat or cross-shaped sections, each with the same :ref:`section_length` and number of :ref:`section_segments`. A :ref:`curve` is sampled along the total length of the ribbon, meaning that the curve determines the size of the ribbon along its length. + +This primitive mesh is usually used for particle trails. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`3D Particle trails <../tutorials/3d/particles/trails>` + +- :doc:`Particle systems (3D) <../tutorials/3d/particles/index>` .. rst-class:: classref-reftable-group @@ -59,7 +75,7 @@ enum **Shape**: :ref:`Shape` **SHAPE_FLAT** = ``0`` - +Gives the mesh a single flat face. .. _class_RibbonTrailMesh_constant_SHAPE_CROSS: @@ -67,7 +83,7 @@ enum **Shape**: :ref:`Shape` **SHAPE_CROSS** = ``1`` - +Gives the mesh two perpendicular flat faces, making a cross shape. .. rst-class:: classref-section-separator @@ -89,9 +105,7 @@ Property Descriptions - void **set_curve** **(** :ref:`Curve` value **)** - :ref:`Curve` **get_curve** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Determines the size of the ribbon along its length. The size of a particular section segment is obtained by multiplying the baseline :ref:`size` by the value of this curve at the given distance. For values smaller than ``0``, the faces will be inverted. .. rst-class:: classref-item-separator @@ -108,9 +122,7 @@ Property Descriptions - void **set_section_length** **(** :ref:`float` value **)** - :ref:`float` **get_section_length** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The length of a section of the ribbon. .. rst-class:: classref-item-separator @@ -127,9 +139,7 @@ Property Descriptions - void **set_section_segments** **(** :ref:`int` value **)** - :ref:`int` **get_section_segments** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of segments in a section. The :ref:`curve` is sampled on each segment to determine its size. Higher values result in a more detailed ribbon at the cost of performance. .. rst-class:: classref-item-separator @@ -146,9 +156,7 @@ Property Descriptions - void **set_sections** **(** :ref:`int` value **)** - :ref:`int` **get_sections** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The total number of sections on the ribbon. .. rst-class:: classref-item-separator @@ -165,9 +173,7 @@ Property Descriptions - void **set_shape** **(** :ref:`Shape` value **)** - :ref:`Shape` **get_shape** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Determines the shape of the ribbon. .. rst-class:: classref-item-separator @@ -184,9 +190,7 @@ Property Descriptions - void **set_size** **(** :ref:`float` value **)** - :ref:`float` **get_size** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The baseline size of the ribbon. The size of a particular section segment is obtained by multiplying this size by the value of the :ref:`curve` at the given distance. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_richtextlabel.rst b/classes/class_richtextlabel.rst index 79eb8a8f9b0..ef0ba32338d 100644 --- a/classes/class_richtextlabel.rst +++ b/classes/class_richtextlabel.rst @@ -193,7 +193,7 @@ Methods +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`push_italics` **(** **)** | +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_list` **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize **)** | + | void | :ref:`push_list` **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize, :ref:`String` bullet="•" **)** | +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`push_meta` **(** :ref:`Variant` data **)** | +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -1434,7 +1434,7 @@ Adds an ``[indent]`` tag to the tag stack. Multiplies ``level`` by current :ref: void **push_italics** **(** **)** -Adds a ``[font]`` tag with a italics font to the tag stack. This is the same as adding a ``[i]`` tag if not currently in a ``[b]`` tag. +Adds a ``[font]`` tag with an italics font to the tag stack. This is the same as adding an ``[i]`` tag if not currently in a ``[b]`` tag. .. rst-class:: classref-item-separator @@ -1444,7 +1444,7 @@ Adds a ``[font]`` tag with a italics font to the tag stack. This is the same as .. rst-class:: classref-method -void **push_list** **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize **)** +void **push_list** **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize, :ref:`String` bullet="•" **)** Adds ``[ol]`` or ``[ul]`` tag to the tag stack. Multiplies ``level`` by current :ref:`tab_size` to determine new margin length. diff --git a/classes/class_rigidbody2d.rst b/classes/class_rigidbody2d.rst index ce631ad44f8..374abe301dd 100644 --- a/classes/class_rigidbody2d.rst +++ b/classes/class_rigidbody2d.rst @@ -266,7 +266,7 @@ enum **CenterOfMassMode**: :ref:`CenterOfMassMode` **CENTER_OF_MASS_MODE_AUTO** = ``0`` -In this mode, the body's center of mass is calculated automatically based on its shapes. +In this mode, the body's center of mass is calculated automatically based on its shapes. This assumes that the shapes' origins are also their center of mass. .. _class_RigidBody2D_constant_CENTER_OF_MASS_MODE_CUSTOM: diff --git a/classes/class_rigidbody3d.rst b/classes/class_rigidbody3d.rst index 6d47f40d4ad..40b9a7cd5be 100644 --- a/classes/class_rigidbody3d.rst +++ b/classes/class_rigidbody3d.rst @@ -270,7 +270,7 @@ enum **CenterOfMassMode**: :ref:`CenterOfMassMode` **CENTER_OF_MASS_MODE_AUTO** = ``0`` -In this mode, the body's center of mass is calculated automatically based on its shapes. +In this mode, the body's center of mass is calculated automatically based on its shapes. This assumes that the shapes' origins are also their center of mass. .. _class_RigidBody3D_constant_CENTER_OF_MASS_MODE_CUSTOM: diff --git a/classes/class_scenetree.rst b/classes/class_scenetree.rst index 9e4188aa52c..d8e733fdb28 100644 --- a/classes/class_scenetree.rst +++ b/classes/class_scenetree.rst @@ -288,7 +288,7 @@ Property Descriptions - void **set_auto_accept_quit** **(** :ref:`bool` value **)** - :ref:`bool` **is_auto_accept_quit** **(** **)** -If ``true``, the application automatically accepts quitting. +If ``true``, the application automatically accepts quitting requests. For mobile platforms, see :ref:`quit_on_go_back`. @@ -438,7 +438,7 @@ If ``true``, the **SceneTree** is paused. Doing so will have the following behav - void **set_quit_on_go_back** **(** :ref:`bool` value **)** - :ref:`bool` **is_quit_on_go_back** **(** **)** -If ``true``, the application quits automatically on going back (e.g. on Android). +If ``true``, the application quits automatically when navigating back (e.g. using the system "Back" button on Android). To handle 'Go Back' button when this option is disabled, use :ref:`DisplayServer.WINDOW_EVENT_GO_BACK_REQUEST`. @@ -581,7 +581,7 @@ The timer will be automatically freed after its time elapses. :ref:`Tween` **create_tween** **(** **)** -Creates and returns a new :ref:`Tween`. +Creates and returns a new :ref:`Tween`. The Tween will start automatically on the next process frame or physics frame (depending on :ref:`TweenProcessMode`). .. rst-class:: classref-item-separator diff --git a/classes/class_scriptlanguageextension.rst b/classes/class_scriptlanguageextension.rst index 8cf5669e1da..95626832068 100644 --- a/classes/class_scriptlanguageextension.rst +++ b/classes/class_scriptlanguageextension.rst @@ -253,7 +253,7 @@ The option is local to the location of the code completion query - e.g. a local :ref:`CodeCompletionLocation` **LOCATION_PARENT_MASK** = ``256`` -The option is from the containing class or a parent class, relative to the location of the code completion query. Perform a bitwise OR with the class depth (e.g. 0 for the local class, 1 for the parent, 2 for the grandparent, etc) to store the depth of an option in a the class or a parent class. +The option is from the containing class or a parent class, relative to the location of the code completion query. Perform a bitwise OR with the class depth (e.g. 0 for the local class, 1 for the parent, 2 for the grandparent, etc) to store the depth of an option in the class or a parent class. .. _class_ScriptLanguageExtension_constant_LOCATION_OTHER_USER_CODE: diff --git a/classes/class_scrollcontainer.rst b/classes/class_scrollcontainer.rst index 7dc96189317..896d1a5cb51 100644 --- a/classes/class_scrollcontainer.rst +++ b/classes/class_scrollcontainer.rst @@ -42,21 +42,25 @@ Properties .. table:: :widths: auto - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ - | :ref:`bool` | clip_contents | ``true`` (overrides :ref:`Control`) | - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`follow_focus` | ``false`` | - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ - | :ref:`ScrollMode` | :ref:`horizontal_scroll_mode` | ``1`` | - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ - | :ref:`int` | :ref:`scroll_deadzone` | ``0`` | - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ - | :ref:`int` | :ref:`scroll_horizontal` | ``0`` | - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ - | :ref:`int` | :ref:`scroll_vertical` | ``0`` | - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ - | :ref:`ScrollMode` | :ref:`vertical_scroll_mode` | ``1`` | - +----------------------------------------------------+--------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`bool` | clip_contents | ``true`` (overrides :ref:`Control`) | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`follow_focus` | ``false`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`ScrollMode` | :ref:`horizontal_scroll_mode` | ``1`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`int` | :ref:`scroll_deadzone` | ``0`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`int` | :ref:`scroll_horizontal` | ``0`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`float` | :ref:`scroll_horizontal_custom_step` | ``-1.0`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`int` | :ref:`scroll_vertical` | ``0`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`float` | :ref:`scroll_vertical_custom_step` | ``-1.0`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`ScrollMode` | :ref:`vertical_scroll_mode` | ``1`` | + +----------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -233,7 +237,31 @@ Deadzone for touch scrolling. Lower deadzone makes the scrolling more sensitive. - void **set_h_scroll** **(** :ref:`int` value **)** - :ref:`int` **get_h_scroll** **(** **)** -The current horizontal scroll value. +The current horizontal scroll value. + +\ **Note:** If you are setting this value in the :ref:`Node._ready` function or earlier, it needs to be wrapped with :ref:`Object.set_deferred`, since scroll bar's :ref:`Range.max_value` is not initialized yet. + +:: + + func _ready(): + set_deferred("scroll_horizontal", 600) + +.. rst-class:: classref-item-separator + +---- + +.. _class_ScrollContainer_property_scroll_horizontal_custom_step: + +.. rst-class:: classref-property + +:ref:`float` **scroll_horizontal_custom_step** = ``-1.0`` + +.. rst-class:: classref-property-setget + +- void **set_horizontal_custom_step** **(** :ref:`float` value **)** +- :ref:`float` **get_horizontal_custom_step** **(** **)** + +Overrides the :ref:`ScrollBar.custom_step` used when clicking the internal scroll bar's horizontal increment and decrement buttons or when using arrow keys when the :ref:`ScrollBar` is focused. .. rst-class:: classref-item-separator @@ -252,6 +280,30 @@ The current horizontal scroll value. The current vertical scroll value. +\ **Note:** Setting it early needs to be deferred, just like in :ref:`scroll_horizontal`. + +:: + + func _ready(): + set_deferred("scroll_vertical", 600) + +.. rst-class:: classref-item-separator + +---- + +.. _class_ScrollContainer_property_scroll_vertical_custom_step: + +.. rst-class:: classref-property + +:ref:`float` **scroll_vertical_custom_step** = ``-1.0`` + +.. rst-class:: classref-property-setget + +- void **set_vertical_custom_step** **(** :ref:`float` value **)** +- :ref:`float` **get_vertical_custom_step** **(** **)** + +Overrides the :ref:`ScrollBar.custom_step` used when clicking the internal scroll bar's vertical increment and decrement buttons or when using arrow keys when the :ref:`ScrollBar` is focused. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_shaderglobalsoverride.rst b/classes/class_shaderglobalsoverride.rst index 7ee4e92ee7a..7f21037a085 100644 --- a/classes/class_shaderglobalsoverride.rst +++ b/classes/class_shaderglobalsoverride.rst @@ -12,9 +12,18 @@ ShaderGlobalsOverride **Inherits:** :ref:`Node` **<** :ref:`Object` -.. container:: contribute +Overrides global shader parameters' values in a specific scene. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +Similar to how a :ref:`WorldEnvironment` node can be used to override the environment while a specific scene is loaded, **ShaderGlobalsOverride** can be used to override global shader parameters temporarily. Once the node is removed, the project-wide values for the global shader parameters are restored. See the :ref:`RenderingServer` ``global_shader_parameter_*`` methods for more information. + +\ **Note:** Only one **ShaderGlobalsOverride** can be used per scene. If there is more than one **ShaderGlobalsOverride** node in the scene tree, only the first node (in tree order) will be taken into account. + +\ **Note:** All **ShaderGlobalsOverride** nodes are made part of a ``"shader_overrides_group"`` group when they are added to the scene tree. The currently active **ShaderGlobalsOverride** node also has a ``"shader_overrides_group_active"`` group added to it. You can use this to check which **ShaderGlobalsOverride** node is currently active. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_shape3d.rst b/classes/class_shape3d.rst index 8d17e3895dd..3caa0b82ed3 100644 --- a/classes/class_shape3d.rst +++ b/classes/class_shape3d.rst @@ -95,7 +95,7 @@ When set to ``0``, the default value from :ref:`ProjectSettings.physics/3d/solve - void **set_margin** **(** :ref:`float` value **)** - :ref:`float` **get_margin** **(** **)** -The collision margin for the shape. Used in Bullet Physics only. +The collision margin for the shape. This is not used in Godot Physics. Collision margins allow collision detection to be more efficient by adding an extra shell around shapes. Collision algorithms are more expensive when objects overlap by more than their margin, so a higher value for margins is better for performance, at the cost of accuracy around edges as it makes them less sharp. diff --git a/classes/class_shapecast2d.rst b/classes/class_shapecast2d.rst index d8d92203d01..fb89a2f2fba 100644 --- a/classes/class_shapecast2d.rst +++ b/classes/class_shapecast2d.rst @@ -21,7 +21,7 @@ Description Shape casting allows to detect collision objects by sweeping the :ref:`shape` along the cast direction determined by :ref:`target_position` (useful for things like beam weapons). -Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector2(0, 0)`` and by calling :ref:`force_shapecast_update` within the same **physics_frame**. This also helps to overcome some limitations of :ref:`Area2D` when used as a continuous detection area, often requiring waiting a couple of frames before collision information is available to :ref:`Area2D` nodes, and when using the signals creates unnecessary complexity. +Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector2(0, 0)`` and by calling :ref:`force_shapecast_update` within the same **physics frame**. This also helps to overcome some limitations of :ref:`Area2D` when used as a continuous detection area, often requiring waiting a couple of frames before collision information is available to :ref:`Area2D` nodes, and when using the signals creates unnecessary complexity. The node can detect multiple collision objects, but it's usually used to detect the first collision. diff --git a/classes/class_shapecast3d.rst b/classes/class_shapecast3d.rst index 18fad24083d..f1627d9f108 100644 --- a/classes/class_shapecast3d.rst +++ b/classes/class_shapecast3d.rst @@ -21,7 +21,7 @@ Description Shape casting allows to detect collision objects by sweeping the :ref:`shape` along the cast direction determined by :ref:`target_position` (useful for things like beam weapons). -Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector3(0, 0, 0)`` and by calling :ref:`force_shapecast_update` within the same **physics_frame**. This also helps to overcome some limitations of :ref:`Area3D` when used as a continuous detection area, often requiring waiting a couple of frames before collision information is available to :ref:`Area3D` nodes, and when using the signals creates unnecessary complexity. +Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector3(0, 0, 0)`` and by calling :ref:`force_shapecast_update` within the same **physics frame**. This also helps to overcome some limitations of :ref:`Area3D` when used as a continuous detection area, often requiring waiting a couple of frames before collision information is available to :ref:`Area3D` nodes, and when using the signals creates unnecessary complexity. The node can detect multiple collision objects, but it's usually used to detect the first collision. diff --git a/classes/class_skeleton2d.rst b/classes/class_skeleton2d.rst index 35490a1a99b..a973286aaa9 100644 --- a/classes/class_skeleton2d.rst +++ b/classes/class_skeleton2d.rst @@ -12,16 +12,16 @@ Skeleton2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Skeleton for 2D characters and animated objects. +The parent of a hierarchy of :ref:`Bone2D`\ s, used to create a 2D skeletal animation. .. rst-class:: classref-introduction-group Description ----------- -Skeleton2D parents a hierarchy of :ref:`Bone2D` objects. It is a requirement of :ref:`Bone2D`. Skeleton2D holds a reference to the rest pose of its children and acts as a single point of access to its bones. +**Skeleton2D** parents a hierarchy of :ref:`Bone2D` nodes. It holds a reference to each :ref:`Bone2D`'s rest pose and acts as a single point of access to its bones. -To setup different types of inverse kinematics for the given Skeleton2D, a :ref:`SkeletonModificationStack2D` should be created. They can be applied by creating the desired number of modifications, which can be done by increasing :ref:`SkeletonModificationStack2D.modification_count`. +To set up different types of inverse kinematics for the given Skeleton2D, a :ref:`SkeletonModificationStack2D` should be created. The inverse kinematics be applied by increasing :ref:`SkeletonModificationStack2D.modification_count` and creating the desired number of modifications. .. rst-class:: classref-introduction-group diff --git a/classes/class_skeleton3d.rst b/classes/class_skeleton3d.rst index 8a8c3db4587..b06260a56d8 100644 --- a/classes/class_skeleton3d.rst +++ b/classes/class_skeleton3d.rst @@ -12,14 +12,14 @@ Skeleton3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Skeleton for characters and animated objects. +A node containing a bone hierarchy, used to create a 3D skeletal animation. .. rst-class:: classref-introduction-group Description ----------- -Skeleton3D provides a hierarchical interface for managing bones, including pose, rest and animation (see :ref:`Animation`). It can also use ragdoll physics. +**Skeleton3D** provides an interface for managing a hierarchy of bones, including pose, rest and animation (see :ref:`Animation`). It can also use ragdoll physics. The overall transform of a bone with respect to the skeleton is determined by the following hierarchical order: rest pose, custom pose and pose. @@ -257,7 +257,7 @@ Property Descriptions - void **set_motion_scale** **(** :ref:`float` value **)** - :ref:`float` **get_motion_scale** **(** **)** -Multiplies the position 3D track animation. +Multiplies the 3D position track animation. \ **Note:** Unless this value is ``1.0``, the key value in animation will not match the actual position value. diff --git a/classes/class_skeletonik3d.rst b/classes/class_skeletonik3d.rst index d732e0064fc..74f0b4a4221 100644 --- a/classes/class_skeletonik3d.rst +++ b/classes/class_skeletonik3d.rst @@ -12,14 +12,14 @@ SkeletonIK3D **Inherits:** :ref:`Node` **<** :ref:`Object` -SkeletonIK3D is used to place the end bone of a :ref:`Skeleton3D` bone chain at a certain point in 3D by rotating all bones in the chain accordingly. +A node used to rotate all bones of a :ref:`Skeleton3D` bone chain a way that places the end bone at a desired 3D position. .. rst-class:: classref-introduction-group Description ----------- -SkeletonIK3D is used to place the end bone of a :ref:`Skeleton3D` bone chain at a certain point in 3D by rotating all bones in the chain accordingly. A typical scenario for IK in games is to place a characters feet on the ground or a characters hands on a currently hold object. SkeletonIK uses FabrikInverseKinematic internally to solve the bone chain and applies the results to the :ref:`Skeleton3D` ``bones_global_pose_override`` property for all affected bones in the chain. If fully applied this overwrites any bone transform from :ref:`Animation`\ s or bone custom poses set by users. The applied amount can be controlled with the ``interpolation`` property. +SkeletonIK3D is used to rotate all bones of a :ref:`Skeleton3D` bone chain a way that places the end bone at a desired 3D position. A typical scenario for IK in games is to place a character's feet on the ground or a character's hands on a currently held object. SkeletonIK uses FabrikInverseKinematic internally to solve the bone chain and applies the results to the :ref:`Skeleton3D` ``bones_global_pose_override`` property for all affected bones in the chain. If fully applied, this overwrites any bone transform from :ref:`Animation`\ s or bone custom poses set by users. The applied amount can be controlled with the :ref:`interpolation` property. :: diff --git a/classes/class_skeletonmodification2d.rst b/classes/class_skeletonmodification2d.rst index bdfa514ffe1..fccc7800f0c 100644 --- a/classes/class_skeletonmodification2d.rst +++ b/classes/class_skeletonmodification2d.rst @@ -14,7 +14,7 @@ SkeletonModification2D **Inherited By:** :ref:`SkeletonModification2DCCDIK`, :ref:`SkeletonModification2DFABRIK`, :ref:`SkeletonModification2DJiggle`, :ref:`SkeletonModification2DLookAt`, :ref:`SkeletonModification2DPhysicalBones`, :ref:`SkeletonModification2DStackHolder`, :ref:`SkeletonModification2DTwoBoneIK` -A resource that operates on :ref:`Bone2D` nodes in a :ref:`Skeleton2D`. +Base class for resources that operate on :ref:`Bone2D`\ s in a :ref:`Skeleton2D`. .. rst-class:: classref-introduction-group @@ -159,7 +159,7 @@ Called when the modification is setup. This is where the modification performs i :ref:`float` **clamp_angle** **(** :ref:`float` angle, :ref:`float` min, :ref:`float` max, :ref:`bool` invert **)** -Takes a angle and clamps it so it is within the passed-in ``min`` and ``max`` range. ``invert`` will inversely clamp the angle, clamping it to the range outside of the given bounds. +Takes an angle and clamps it so it is within the passed-in ``min`` and ``max`` range. ``invert`` will inversely clamp the angle, clamping it to the range outside of the given bounds. .. rst-class:: classref-item-separator diff --git a/classes/class_skeletonmodification2dfabrik.rst b/classes/class_skeletonmodification2dfabrik.rst index 70bb66fa52b..fc253a2e2e0 100644 --- a/classes/class_skeletonmodification2dfabrik.rst +++ b/classes/class_skeletonmodification2dfabrik.rst @@ -21,7 +21,7 @@ Description This :ref:`SkeletonModification2D` uses an algorithm called Forward And Backward Reaching Inverse Kinematics, or FABRIK, to rotate a bone chain so that it reaches a target. -FABRIK works by knowing the positions and lengths of a series of bones, typically called a "bone chain". It first starts by running a forward pass, which places the final bone at the target's position. Then all other bones are moved towards the tip bone, so they stay at the defined bone length away. Then a backwards pass is performed, where the root/first bone in the FABRIK chain is placed back at the origin. then all other bones are moved so they stay at the defined bone length away. This positions the bone chain so that it reaches the target when possible, but all of the bones stay the correct length away from each other. +FABRIK works by knowing the positions and lengths of a series of bones, typically called a "bone chain". It first starts by running a forward pass, which places the final bone at the target's position. Then all other bones are moved towards the tip bone, so they stay at the defined bone length away. Then a backwards pass is performed, where the root/first bone in the FABRIK chain is placed back at the origin. Then all other bones are moved so they stay at the defined bone length away. This positions the bone chain so that it reaches the target when possible, but all of the bones stay the correct length away from each other. Because of how FABRIK works, it often gives more natural results than those seen in :ref:`SkeletonModification2DCCDIK`. FABRIK also supports angle constraints, which are fully taken into account when solving. diff --git a/classes/class_skeletonmodification2dlookat.rst b/classes/class_skeletonmodification2dlookat.rst index 3f1fb091900..7bc27093555 100644 --- a/classes/class_skeletonmodification2dlookat.rst +++ b/classes/class_skeletonmodification2dlookat.rst @@ -104,7 +104,7 @@ The :ref:`Bone2D` node that the modification will operate on. - void **set_bone_index** **(** :ref:`int` value **)** - :ref:`int` **get_bone_index** **(** **)** -The index of the :ref:`Bone2D` node that the modification will oeprate on. +The index of the :ref:`Bone2D` node that the modification will operate on. .. rst-class:: classref-item-separator diff --git a/classes/class_skeletonmodification2dphysicalbones.rst b/classes/class_skeletonmodification2dphysicalbones.rst index 9ee32725320..56c2e2138c1 100644 --- a/classes/class_skeletonmodification2dphysicalbones.rst +++ b/classes/class_skeletonmodification2dphysicalbones.rst @@ -92,7 +92,7 @@ Method Descriptions void **fetch_physical_bones** **(** **)** -Empties the list of :ref:`PhysicalBone2D` nodes and populates it will all :ref:`PhysicalBone2D` nodes that are children of the :ref:`Skeleton2D`. +Empties the list of :ref:`PhysicalBone2D` nodes and populates it with all :ref:`PhysicalBone2D` nodes that are children of the :ref:`Skeleton2D`. .. rst-class:: classref-item-separator diff --git a/classes/class_skeletonmodification2dtwoboneik.rst b/classes/class_skeletonmodification2dtwoboneik.rst index 79c9e4d0beb..c3a0e0134b5 100644 --- a/classes/class_skeletonmodification2dtwoboneik.rst +++ b/classes/class_skeletonmodification2dtwoboneik.rst @@ -12,14 +12,14 @@ SkeletonModification2DTwoBoneIK **Inherits:** :ref:`SkeletonModification2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A modification that rotates two bones using the law of cosigns to reach the target. +A modification that rotates two bones using the law of cosines to reach the target. .. rst-class:: classref-introduction-group Description ----------- -This :ref:`SkeletonModification2D` uses an algorithm typically called TwoBoneIK. This algorithm works by leveraging the law of cosigns and the lengths of the bones to figure out what rotation the bones currently have, and what rotation they need to make a complete triangle, where the first bone, the second bone, and the target form the three vertices of the triangle. Because the algorithm works by making a triangle, it can only operate on two bones. +This :ref:`SkeletonModification2D` uses an algorithm typically called TwoBoneIK. This algorithm works by leveraging the law of cosines and the lengths of the bones to figure out what rotation the bones currently have, and what rotation they need to make a complete triangle, where the first bone, the second bone, and the target form the three vertices of the triangle. Because the algorithm works by making a triangle, it can only operate on two bones. TwoBoneIK is great for arms, legs, and really any joints that can be represented by just two bones that bend to reach a target. This solver is more lightweight than :ref:`SkeletonModification2DFABRIK`, but gives similar, natural looking results. diff --git a/classes/class_skeletonprofile.rst b/classes/class_skeletonprofile.rst index 98d7b2660a6..98629effd86 100644 --- a/classes/class_skeletonprofile.rst +++ b/classes/class_skeletonprofile.rst @@ -14,7 +14,7 @@ SkeletonProfile **Inherited By:** :ref:`SkeletonProfileHumanoid` -Profile of a virtual skeleton used as a target for retargeting. +Base class for a profile of a virtual skeleton used as a target for retargeting. .. rst-class:: classref-introduction-group diff --git a/classes/class_sky.rst b/classes/class_sky.rst index 53a60f60fda..84bf66aa920 100644 --- a/classes/class_sky.rst +++ b/classes/class_sky.rst @@ -158,7 +158,7 @@ Uses the same high quality importance sampling to process the radiance map as :r Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. If you need better quality, but still need to update the sky every frame, consider turning on :ref:`ProjectSettings.rendering/reflections/sky_reflections/fast_filter_high_quality`. -\ **Note:** The fast filtering algorithm is limited to 256x256 cubemaps, so :ref:`radiance_size` must be set to :ref:`RADIANCE_SIZE_256`. +\ **Note:** The fast filtering algorithm is limited to 256×256 cubemaps, so :ref:`radiance_size` must be set to :ref:`RADIANCE_SIZE_256`. Otherwise, a warning is printed and the overridden radiance size is ignored. .. rst-class:: classref-section-separator diff --git a/classes/class_staticbody2d.rst b/classes/class_staticbody2d.rst index b095b6b0631..9aff498a475 100644 --- a/classes/class_staticbody2d.rst +++ b/classes/class_staticbody2d.rst @@ -14,7 +14,7 @@ StaticBody2D **Inherited By:** :ref:`AnimatableBody2D` -Physics body for 2D physics which is static or moves only by script. Useful for floor and walls. +Physics body for 2D physics which is static or moves only by script (without affecting other bodies on its path). Useful for floors and walls. .. rst-class:: classref-introduction-group @@ -27,7 +27,7 @@ A static body is a simple body that doesn't move under physics simulation, i.e. They have extra functionalities to move and affect other bodies: -\ **Static transform change:** Static bodies can be moved by animation or script. In this case, they are just teleported and don't affect other bodies on their path. +\ **Static transform change:** Static bodies *can* be moved by animation or script. In this case, they are just teleported and don't affect other bodies on their path. Use :ref:`AnimatableBody2D` instead of **StaticBody2D** if you need a moving static body that affects other bodies on its path. \ **Constant velocity:** When :ref:`constant_linear_velocity` or :ref:`constant_angular_velocity` is set, static bodies don't move themselves but affect touching bodies as if they were moving. This is useful for simulating conveyor belts or conveyor wheels. diff --git a/classes/class_staticbody3d.rst b/classes/class_staticbody3d.rst index 2671396dd45..1ab6d2d11ce 100644 --- a/classes/class_staticbody3d.rst +++ b/classes/class_staticbody3d.rst @@ -14,7 +14,7 @@ StaticBody3D **Inherited By:** :ref:`AnimatableBody3D` -Physics body for 3D physics which is static or moves only by script. Useful for floor and walls. +Physics body for 3D physics which is static or moves only by script (without affecting other bodies on its path). Useful for floors and walls. .. rst-class:: classref-introduction-group @@ -27,9 +27,9 @@ A static body is a simple body that doesn't move under physics simulation, i.e. They have extra functionalities to move and affect other bodies: -\ *Static transform change:* Static bodies can be moved by animation or script. In this case, they are just teleported and don't affect other bodies on their path. +\ **Static transform change:** Static bodies *can* be moved by animation or script. In this case, they are just teleported and don't affect other bodies on their path. Use :ref:`AnimatableBody3D` instead of **StaticBody3D** if you need a moving static body that affects other bodies on its path. -\ *Constant velocity:* When :ref:`constant_linear_velocity` or :ref:`constant_angular_velocity` is set, static bodies don't move themselves but affect touching bodies as if they were moving. This is useful for simulating conveyor belts or conveyor wheels. +\ **Constant velocity:** When :ref:`constant_linear_velocity` or :ref:`constant_angular_velocity` is set, static bodies don't move themselves but affect touching bodies as if they were moving. This is useful for simulating conveyor belts or conveyor wheels. \ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. diff --git a/classes/class_streampeer.rst b/classes/class_streampeer.rst index b8296519a57..b99b7a942dd 100644 --- a/classes/class_streampeer.rst +++ b/classes/class_streampeer.rst @@ -45,6 +45,8 @@ Methods .. table:: :widths: auto + +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_8` **(** **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_16` **(** **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ @@ -52,8 +54,6 @@ Methods +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_64` **(** **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_8` **(** **)** | - +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_available_bytes` **(** **)** |const| | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Array` | :ref:`get_data` **(** :ref:`int` bytes **)** | @@ -66,26 +66,26 @@ Methods +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_string` **(** :ref:`int` bytes=-1 **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_u8` **(** **)** | + +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_u16` **(** **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_u32` **(** **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_u64` **(** **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_u8` **(** **)** | - +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_utf8_string` **(** :ref:`int` bytes=-1 **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Variant` | :ref:`get_var` **(** :ref:`bool` allow_objects=false **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`put_8` **(** :ref:`int` value **)** | + +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_16` **(** :ref:`int` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_32` **(** :ref:`int` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_64` **(** :ref:`int` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`put_8` **(** :ref:`int` value **)** | - +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`put_data` **(** :ref:`PackedByteArray` data **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_double` **(** :ref:`float` value **)** | @@ -96,14 +96,14 @@ Methods +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_string` **(** :ref:`String` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`put_u8` **(** :ref:`int` value **)** | + +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_u16` **(** :ref:`int` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_u32` **(** :ref:`int` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_u64` **(** :ref:`int` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`put_u8` **(** :ref:`int` value **)** | - +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_utf8_string` **(** :ref:`String` value **)** | +---------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`put_var` **(** :ref:`Variant` value, :ref:`bool` full_objects=false **)** | @@ -140,49 +140,49 @@ If ``true``, this **StreamPeer** will using big-endian format for encoding and d Method Descriptions ------------------- -.. _class_StreamPeer_method_get_16: +.. _class_StreamPeer_method_get_8: .. rst-class:: classref-method -:ref:`int` **get_16** **(** **)** +:ref:`int` **get_8** **(** **)** -Gets a signed 16-bit value from the stream. +Gets a signed byte from the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_get_32: +.. _class_StreamPeer_method_get_16: .. rst-class:: classref-method -:ref:`int` **get_32** **(** **)** +:ref:`int` **get_16** **(** **)** -Gets a signed 32-bit value from the stream. +Gets a signed 16-bit value from the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_get_64: +.. _class_StreamPeer_method_get_32: .. rst-class:: classref-method -:ref:`int` **get_64** **(** **)** +:ref:`int` **get_32** **(** **)** -Gets a signed 64-bit value from the stream. +Gets a signed 32-bit value from the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_get_8: +.. _class_StreamPeer_method_get_64: .. rst-class:: classref-method -:ref:`int` **get_8** **(** **)** +:ref:`int` **get_64** **(** **)** -Gets a signed byte from the stream. +Gets a signed 64-bit value from the stream. .. rst-class:: classref-item-separator @@ -260,49 +260,49 @@ Gets an ASCII string with byte-length ``bytes`` from the stream. If ``bytes`` is ---- -.. _class_StreamPeer_method_get_u16: +.. _class_StreamPeer_method_get_u8: .. rst-class:: classref-method -:ref:`int` **get_u16** **(** **)** +:ref:`int` **get_u8** **(** **)** -Gets an unsigned 16-bit value from the stream. +Gets an unsigned byte from the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_get_u32: +.. _class_StreamPeer_method_get_u16: .. rst-class:: classref-method -:ref:`int` **get_u32** **(** **)** +:ref:`int` **get_u16** **(** **)** -Gets an unsigned 32-bit value from the stream. +Gets an unsigned 16-bit value from the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_get_u64: +.. _class_StreamPeer_method_get_u32: .. rst-class:: classref-method -:ref:`int` **get_u64** **(** **)** +:ref:`int` **get_u32** **(** **)** -Gets an unsigned 64-bit value from the stream. +Gets an unsigned 32-bit value from the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_get_u8: +.. _class_StreamPeer_method_get_u64: .. rst-class:: classref-method -:ref:`int` **get_u8** **(** **)** +:ref:`int` **get_u64** **(** **)** -Gets an unsigned byte from the stream. +Gets an unsigned 64-bit value from the stream. .. rst-class:: classref-item-separator @@ -336,49 +336,49 @@ Internally, this uses the same decoding mechanism as the :ref:`@GlobalScope.byte ---- -.. _class_StreamPeer_method_put_16: +.. _class_StreamPeer_method_put_8: .. rst-class:: classref-method -void **put_16** **(** :ref:`int` value **)** +void **put_8** **(** :ref:`int` value **)** -Puts a signed 16-bit value into the stream. +Puts a signed byte into the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_put_32: +.. _class_StreamPeer_method_put_16: .. rst-class:: classref-method -void **put_32** **(** :ref:`int` value **)** +void **put_16** **(** :ref:`int` value **)** -Puts a signed 32-bit value into the stream. +Puts a signed 16-bit value into the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_put_64: +.. _class_StreamPeer_method_put_32: .. rst-class:: classref-method -void **put_64** **(** :ref:`int` value **)** +void **put_32** **(** :ref:`int` value **)** -Puts a signed 64-bit value into the stream. +Puts a signed 32-bit value into the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_put_8: +.. _class_StreamPeer_method_put_64: .. rst-class:: classref-method -void **put_8** **(** :ref:`int` value **)** +void **put_64** **(** :ref:`int` value **)** -Puts a signed byte into the stream. +Puts a signed 64-bit value into the stream. .. rst-class:: classref-item-separator @@ -447,11 +447,11 @@ Puts a zero-terminated ASCII string into the stream prepended by a 32-bit unsign .. code-tab:: gdscript - put_data("Hello world".to_ascii()) + put_data("Hello world".to_ascii_buffer()) .. code-tab:: csharp - PutData("Hello World".ToAscii()); + PutData("Hello World".ToAsciiBuffer()); @@ -459,49 +459,49 @@ Puts a zero-terminated ASCII string into the stream prepended by a 32-bit unsign ---- -.. _class_StreamPeer_method_put_u16: +.. _class_StreamPeer_method_put_u8: .. rst-class:: classref-method -void **put_u16** **(** :ref:`int` value **)** +void **put_u8** **(** :ref:`int` value **)** -Puts an unsigned 16-bit value into the stream. +Puts an unsigned byte into the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_put_u32: +.. _class_StreamPeer_method_put_u16: .. rst-class:: classref-method -void **put_u32** **(** :ref:`int` value **)** +void **put_u16** **(** :ref:`int` value **)** -Puts an unsigned 32-bit value into the stream. +Puts an unsigned 16-bit value into the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_put_u64: +.. _class_StreamPeer_method_put_u32: .. rst-class:: classref-method -void **put_u64** **(** :ref:`int` value **)** +void **put_u32** **(** :ref:`int` value **)** -Puts an unsigned 64-bit value into the stream. +Puts an unsigned 32-bit value into the stream. .. rst-class:: classref-item-separator ---- -.. _class_StreamPeer_method_put_u8: +.. _class_StreamPeer_method_put_u64: .. rst-class:: classref-method -void **put_u8** **(** :ref:`int` value **)** +void **put_u64** **(** :ref:`int` value **)** -Puts an unsigned byte into the stream. +Puts an unsigned 64-bit value into the stream. .. rst-class:: classref-item-separator @@ -522,11 +522,11 @@ Puts a zero-terminated UTF-8 string into the stream prepended by a 32 bits unsig .. code-tab:: gdscript - put_data("Hello world".to_utf8()) + put_data("Hello world".to_utf8_buffer()) .. code-tab:: csharp - PutData("Hello World".ToUtf8()); + PutData("Hello World".ToUtf8Buffer()); diff --git a/classes/class_streampeertls.rst b/classes/class_streampeertls.rst index eab95e8100f..ba9f6738b26 100644 --- a/classes/class_streampeertls.rst +++ b/classes/class_streampeertls.rst @@ -19,7 +19,7 @@ TLS stream peer. Description ----------- -TLS stream peer. This object can be used to connect to an TLS server or accept a single TLS client connection. +TLS stream peer. This object can be used to connect to a TLS server or accept a single TLS client connection. \ **Note:** When exporting to Android, make sure to enable the ``INTERNET`` permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. diff --git a/classes/class_string.rst b/classes/class_string.rst index 14f73c61833..901ae58517c 100644 --- a/classes/class_string.rst +++ b/classes/class_string.rst @@ -83,6 +83,8 @@ Methods +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`ends_with` **(** :ref:`String` text **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`erase` **(** :ref:`int` position, :ref:`int` chars=1 **)** |const| | + +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`find` **(** :ref:`String` what, :ref:`int` from=0 **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`findn` **(** :ref:`String` what, :ref:`int` from=0 **)** |const| | @@ -105,6 +107,8 @@ Methods +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`hash` **(** **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedByteArray` | :ref:`hex_decode` **(** **)** |const| | + +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`hex_to_int` **(** **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`humanize_size` **(** :ref:`int` size **)** |static| | @@ -157,6 +161,8 @@ Methods +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`md5_text` **(** **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`naturalcasecmp_to` **(** :ref:`String` to **)** |const| | + +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`naturalnocasecmp_to` **(** :ref:`String` to **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`nocasecmp_to` **(** :ref:`String` to **)** |const| | @@ -231,11 +237,13 @@ Methods +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`to_upper` **(** **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedByteArray` | :ref:`to_utf8_buffer` **(** **)** |const| | + +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedByteArray` | :ref:`to_utf16_buffer` **(** **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedByteArray` | :ref:`to_utf32_buffer` **(** **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedByteArray` | :ref:`to_utf8_buffer` **(** **)** |const| | + | :ref:`PackedByteArray` | :ref:`to_wchar_buffer` **(** **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`trim_prefix` **(** :ref:`String` prefix **)** |const| | +-----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -468,7 +476,7 @@ Performs a case-sensitive comparison to another string. Returns ``-1`` if less t With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. -To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`nocasecmp_to` and :ref:`naturalnocasecmp_to`. +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`nocasecmp_to`, :ref:`naturalcasecmp_to`, and :ref:`naturalnocasecmp_to`. .. rst-class:: classref-item-separator @@ -569,6 +577,18 @@ Returns ``true`` if the string ends with the given ``text``. See also :ref:`begi ---- +.. _class_String_method_erase: + +.. rst-class:: classref-method + +:ref:`String` **erase** **(** :ref:`int` position, :ref:`int` chars=1 **)** |const| + +Returns a string with ``chars`` characters erased starting from ``position``. If ``chars`` goes beyond the string's length given the specified ``position``, fewer characters will be erased from the returned string. Returns an empty string if either ``position`` or ``chars`` is negative. Returns the original string unmodified if ``chars`` is ``0``. + +.. rst-class:: classref-item-separator + +---- + .. _class_String_method_find: .. rst-class:: classref-method @@ -779,6 +799,35 @@ Returns the 32-bit hash value representing the string's contents. \ **Note:** Strings with equal hash values are *not* guaranteed to be the same, as a result of hash collisions. On the countrary, strings with different hash values are guaranteed to be different. +.. rst-class:: classref-item-separator + +---- + +.. _class_String_method_hex_decode: + +.. rst-class:: classref-method + +:ref:`PackedByteArray` **hex_decode** **(** **)** |const| + +Decodes a hexadecimal string as a :ref:`PackedByteArray`. + + +.. tabs:: + + .. code-tab:: gdscript + + var text = "hello world" + var encoded = text.to_utf8_buffer().hex_encode() # outputs "68656c6c6f20776f726c64" + print(buf.hex_decode().get_string_from_utf8()) + + .. code-tab:: csharp + + var text = "hello world"; + var encoded = text.ToUtf8Buffer().HexEncode(); # outputs "68656c6c6f20776f726c64" + GD.Print(buf.HexDecode().GetStringFromUtf8()); + + + .. rst-class:: classref-item-separator ---- @@ -1186,6 +1235,24 @@ Returns the `MD5 hash `__ of the string as an ---- +.. _class_String_method_naturalcasecmp_to: + +.. rst-class:: classref-method + +:ref:`int` **naturalcasecmp_to** **(** :ref:`String` to **)** |const| + +Performs a **case-sensitive**, *natural order* comparison to another string. Returns ``-1`` if less than, ``1`` if greater than, or ``0`` if equal. "Less than" or "greater than" are determined by the `Unicode code points `__ of each string, which roughly matches the alphabetical order. + +When used for sorting, natural order comparison orders sequences of numbers by the combined value of each digit as is often expected, instead of the single digit's value. A sorted sequence of numbered strings will be ``["1", "2", "3", ...]``, not ``["1", "10", "2", "3", ...]``. + +With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. + +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`naturalnocasecmp_to`, :ref:`nocasecmp_to`, and :ref:`casecmp_to`. + +.. rst-class:: classref-item-separator + +---- + .. _class_String_method_naturalnocasecmp_to: .. rst-class:: classref-method @@ -1198,7 +1265,7 @@ When used for sorting, natural order comparison orders sequences of numbers by t With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. -To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`nocasecmp_to` and :ref:`casecmp_to`. +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`naturalcasecmp_to`, :ref:`nocasecmp_to`, and :ref:`casecmp_to`. .. rst-class:: classref-item-separator @@ -1214,7 +1281,7 @@ Performs a **case-insensitive** comparison to another string. Returns ``-1`` if With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. -To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`casecmp_to` and :ref:`naturalnocasecmp_to`. +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`casecmp_to`, :ref:`naturalcasecmp_to`, and :ref:`naturalnocasecmp_to`. .. rst-class:: classref-item-separator @@ -1790,6 +1857,18 @@ Returns the string converted to uppercase. ---- +.. _class_String_method_to_utf8_buffer: + +.. rst-class:: classref-method + +:ref:`PackedByteArray` **to_utf8_buffer** **(** **)** |const| + +Converts the string to a `UTF-8 `__ encoded :ref:`PackedByteArray`. This method is slightly slower than :ref:`to_ascii_buffer`, but supports all UTF-8 characters. For most cases, prefer using this method. + +.. rst-class:: classref-item-separator + +---- + .. _class_String_method_to_utf16_buffer: .. rst-class:: classref-method @@ -1814,13 +1893,13 @@ Converts the string to a `UTF-32 `__ encod ---- -.. _class_String_method_to_utf8_buffer: +.. _class_String_method_to_wchar_buffer: .. rst-class:: classref-method -:ref:`PackedByteArray` **to_utf8_buffer** **(** **)** |const| +:ref:`PackedByteArray` **to_wchar_buffer** **(** **)** |const| -Converts the string to a `UTF-8 `__ encoded :ref:`PackedByteArray`. This method is slightly slower than :ref:`to_ascii_buffer`, but supports all UTF-8 characters. For most cases, prefer using this method. +Converts the string to a `wide character `__ (``wchar_t``, UTF-16 on Windows, UTF-32 on other platforms) encoded :ref:`PackedByteArray`. .. rst-class:: classref-item-separator @@ -1868,7 +1947,7 @@ Returns the character code at position ``at``. :ref:`String` **uri_decode** **(** **)** |const| -Decodes the string from its URL-encoded format. This method is meant to properly decode the parameters in a URL when receiving an HTTP request. +Decodes the string from its URL-encoded format. This method is meant to properly decode the parameters in a URL when receiving an HTTP request. See also :ref:`uri_encode`. .. tabs:: @@ -1895,7 +1974,7 @@ Decodes the string from its URL-encoded format. This method is meant to properly :ref:`String` **uri_encode** **(** **)** |const| -Encodes the string to URL-friendly format. This method is meant to properly encode the parameters in a URL when sending an HTTP request. +Encodes the string to URL-friendly format. This method is meant to properly encode the parameters in a URL when sending an HTTP request. See also :ref:`uri_decode`. .. tabs:: diff --git a/classes/class_stringname.rst b/classes/class_stringname.rst index cf55f2f694d..673fff49284 100644 --- a/classes/class_stringname.rst +++ b/classes/class_stringname.rst @@ -76,6 +76,8 @@ Methods +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`ends_with` **(** :ref:`String` text **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`erase` **(** :ref:`int` position, :ref:`int` chars=1 **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`find` **(** :ref:`String` what, :ref:`int` from=0 **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`findn` **(** :ref:`String` what, :ref:`int` from=0 **)** |const| | @@ -98,6 +100,8 @@ Methods +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`hash` **(** **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedByteArray` | :ref:`hex_decode` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`hex_to_int` **(** **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`indent` **(** :ref:`String` prefix **)** |const| | @@ -148,6 +152,8 @@ Methods +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`md5_text` **(** **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`naturalcasecmp_to` **(** :ref:`String` to **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`naturalnocasecmp_to` **(** :ref:`String` to **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`nocasecmp_to` **(** :ref:`String` to **)** |const| | @@ -214,11 +220,13 @@ Methods +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`to_upper` **(** **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedByteArray` | :ref:`to_utf8_buffer` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedByteArray` | :ref:`to_utf16_buffer` **(** **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedByteArray` | :ref:`to_utf32_buffer` **(** **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedByteArray` | :ref:`to_utf8_buffer` **(** **)** |const| | + | :ref:`PackedByteArray` | :ref:`to_wchar_buffer` **(** **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`trim_prefix` **(** :ref:`String` prefix **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -439,7 +447,7 @@ Performs a case-sensitive comparison to another string. Returns ``-1`` if less t With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. -To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`nocasecmp_to` and :ref:`naturalnocasecmp_to`. +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`nocasecmp_to`, :ref:`naturalcasecmp_to`, and :ref:`naturalnocasecmp_to`. .. rst-class:: classref-item-separator @@ -523,6 +531,18 @@ Returns ``true`` if the string ends with the given ``text``. See also :ref:`begi ---- +.. _class_StringName_method_erase: + +.. rst-class:: classref-method + +:ref:`String` **erase** **(** :ref:`int` position, :ref:`int` chars=1 **)** |const| + +Returns a string with ``chars`` characters erased starting from ``position``. If ``chars`` goes beyond the string's length given the specified ``position``, fewer characters will be erased from the returned string. Returns an empty string if either ``position`` or ``chars`` is negative. Returns the original string unmodified if ``chars`` is ``0``. + +.. rst-class:: classref-item-separator + +---- + .. _class_StringName_method_find: .. rst-class:: classref-method @@ -733,6 +753,35 @@ Returns the 32-bit hash value representing the string's contents. \ **Note:** Strings with equal hash values are *not* guaranteed to be the same, as a result of hash collisions. On the countrary, strings with different hash values are guaranteed to be different. +.. rst-class:: classref-item-separator + +---- + +.. _class_StringName_method_hex_decode: + +.. rst-class:: classref-method + +:ref:`PackedByteArray` **hex_decode** **(** **)** |const| + +Decodes a hexadecimal string as a :ref:`PackedByteArray`. + + +.. tabs:: + + .. code-tab:: gdscript + + var text = "hello world" + var encoded = text.to_utf8_buffer().hex_encode() # outputs "68656c6c6f20776f726c64" + print(buf.hex_decode().get_string_from_utf8()) + + .. code-tab:: csharp + + var text = "hello world"; + var encoded = text.ToUtf8Buffer().HexEncode(); # outputs "68656c6c6f20776f726c64" + GD.Print(buf.HexDecode().GetStringFromUtf8()); + + + .. rst-class:: classref-item-separator ---- @@ -1126,6 +1175,24 @@ Returns the `MD5 hash `__ of the string as an ---- +.. _class_StringName_method_naturalcasecmp_to: + +.. rst-class:: classref-method + +:ref:`int` **naturalcasecmp_to** **(** :ref:`String` to **)** |const| + +Performs a **case-sensitive**, *natural order* comparison to another string. Returns ``-1`` if less than, ``1`` if greater than, or ``0`` if equal. "Less than" or "greater than" are determined by the `Unicode code points `__ of each string, which roughly matches the alphabetical order. + +When used for sorting, natural order comparison orders sequences of numbers by the combined value of each digit as is often expected, instead of the single digit's value. A sorted sequence of numbered strings will be ``["1", "2", "3", ...]``, not ``["1", "10", "2", "3", ...]``. + +With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. + +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`naturalnocasecmp_to`, :ref:`nocasecmp_to`, and :ref:`casecmp_to`. + +.. rst-class:: classref-item-separator + +---- + .. _class_StringName_method_naturalnocasecmp_to: .. rst-class:: classref-method @@ -1138,7 +1205,7 @@ When used for sorting, natural order comparison orders sequences of numbers by t With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. -To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`nocasecmp_to` and :ref:`casecmp_to`. +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`naturalcasecmp_to`, :ref:`nocasecmp_to`, and :ref:`casecmp_to`. .. rst-class:: classref-item-separator @@ -1154,7 +1221,7 @@ Performs a **case-insensitive** comparison to another string. Returns ``-1`` if With different string lengths, returns ``1`` if this string is longer than the ``to`` string, or ``-1`` if shorter. Note that the length of empty strings is *always* ``0``. -To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`casecmp_to` and :ref:`naturalnocasecmp_to`. +To get a :ref:`bool` result from a string comparison, use the ``==`` operator instead. See also :ref:`casecmp_to`, :ref:`naturalcasecmp_to`, and :ref:`naturalnocasecmp_to`. .. rst-class:: classref-item-separator @@ -1633,6 +1700,18 @@ Returns the string converted to uppercase. ---- +.. _class_StringName_method_to_utf8_buffer: + +.. rst-class:: classref-method + +:ref:`PackedByteArray` **to_utf8_buffer** **(** **)** |const| + +Converts the string to a `UTF-8 `__ encoded :ref:`PackedByteArray`. This method is slightly slower than :ref:`to_ascii_buffer`, but supports all UTF-8 characters. For most cases, prefer using this method. + +.. rst-class:: classref-item-separator + +---- + .. _class_StringName_method_to_utf16_buffer: .. rst-class:: classref-method @@ -1657,13 +1736,13 @@ Converts the string to a `UTF-32 `__ encod ---- -.. _class_StringName_method_to_utf8_buffer: +.. _class_StringName_method_to_wchar_buffer: .. rst-class:: classref-method -:ref:`PackedByteArray` **to_utf8_buffer** **(** **)** |const| +:ref:`PackedByteArray` **to_wchar_buffer** **(** **)** |const| -Converts the string to a `UTF-8 `__ encoded :ref:`PackedByteArray`. This method is slightly slower than :ref:`to_ascii_buffer`, but supports all UTF-8 characters. For most cases, prefer using this method. +Converts the string to a `wide character `__ (``wchar_t``, UTF-16 on Windows, UTF-32 on other platforms) encoded :ref:`PackedByteArray`. .. rst-class:: classref-item-separator diff --git a/classes/class_styleboxflat.rst b/classes/class_styleboxflat.rst index f20a42c6ec5..3e673688d8e 100644 --- a/classes/class_styleboxflat.rst +++ b/classes/class_styleboxflat.rst @@ -57,7 +57,7 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------+-----------------------------+ | :ref:`bool` | :ref:`anti_aliasing` | ``true`` | +-------------------------------+-------------------------------------------------------------------------------------------+-----------------------------+ - | :ref:`float` | :ref:`anti_aliasing_size` | ``0.625`` | + | :ref:`float` | :ref:`anti_aliasing_size` | ``1.0`` | +-------------------------------+-------------------------------------------------------------------------------------------+-----------------------------+ | :ref:`Color` | :ref:`bg_color` | ``Color(0.6, 0.6, 0.6, 1)`` | +-------------------------------+-------------------------------------------------------------------------------------------+-----------------------------+ @@ -164,14 +164,16 @@ Antialiasing draws a small ring around the edges, which fades to transparency. A .. rst-class:: classref-property -:ref:`float` **anti_aliasing_size** = ``0.625`` +:ref:`float` **anti_aliasing_size** = ``1.0`` .. rst-class:: classref-property-setget - void **set_aa_size** **(** :ref:`float` value **)** - :ref:`float` **get_aa_size** **(** **)** -This changes the size of the faded ring. Higher values can be used to achieve a "blurry" effect. +This changes the size of the antialiasing effect. ``1.0`` is recommended for an optimal result at 100% scale, identical to how rounded rectangles are rendered in web browsers and most vector drawing software. + +\ **Note:** Higher values may produce a blur effect but can also create undesired artifacts on small boxes with large-radius corners. .. rst-class:: classref-item-separator diff --git a/classes/class_surfacetool.rst b/classes/class_surfacetool.rst index 515fd8c7770..4d09625b6d6 100644 --- a/classes/class_surfacetool.rst +++ b/classes/class_surfacetool.rst @@ -67,71 +67,71 @@ Methods .. table:: :widths: auto - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_index` **(** :ref:`int` index **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_triangle_fan` **(** :ref:`PackedVector3Array` vertices, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`PackedColorArray` colors=PackedColorArray(), :ref:`PackedVector2Array` uv2s=PackedVector2Array(), :ref:`PackedVector3Array` normals=PackedVector3Array(), :ref:`Array` tangents=[] **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_vertex` **(** :ref:`Vector3` vertex **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`append_from` **(** :ref:`Mesh` existing, :ref:`int` surface, :ref:`Transform3D` transform **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`begin` **(** :ref:`PrimitiveType` primitive **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear` **(** **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`ArrayMesh` | :ref:`commit` **(** :ref:`ArrayMesh` existing=null, :ref:`int` flags=0 **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Array` | :ref:`commit_to_arrays` **(** **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`create_from` **(** :ref:`Mesh` existing, :ref:`int` surface **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`create_from_blend_shape` **(** :ref:`Mesh` existing, :ref:`int` surface, :ref:`String` blend_shape **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`deindex` **(** **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedInt32Array` | :ref:`generate_lod` **(** :ref:`float` nd_threshold, :ref:`int` target_index_count=3 **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`generate_normals` **(** :ref:`bool` flip=false **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`generate_tangents` **(** **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`AABB` | :ref:`get_aabb` **(** **)** |const| | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`CustomFormat` | :ref:`get_custom_format` **(** :ref:`int` channel_index **)** |const| | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PrimitiveType` | :ref:`get_primitive_type` **(** **)** |const| | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`SkinWeightCount` | :ref:`get_skin_weight_count` **(** **)** |const| | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`index` **(** **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`optimize_indices_for_cache` **(** **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_bones` **(** :ref:`PackedInt32Array` bones **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_color` **(** :ref:`Color` color **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_custom` **(** :ref:`int` channel_index, :ref:`Color` custom_color **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_custom_format` **(** :ref:`int` channel_index, :ref:`CustomFormat` format **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_material` **(** :ref:`Material` material **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_normal` **(** :ref:`Vector3` normal **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_skin_weight_count` **(** :ref:`SkinWeightCount` count **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_smooth_group` **(** :ref:`int` index **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_tangent` **(** :ref:`Plane` tangent **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_uv` **(** :ref:`Vector2` uv **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_uv2` **(** :ref:`Vector2` uv2 **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_weights` **(** :ref:`PackedFloat32Array` weights **)** | - +----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_index` **(** :ref:`int` index **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_triangle_fan` **(** :ref:`PackedVector3Array` vertices, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`PackedColorArray` colors=PackedColorArray(), :ref:`PackedVector2Array` uv2s=PackedVector2Array(), :ref:`PackedVector3Array` normals=PackedVector3Array(), :ref:`Plane[]` tangents=[] **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_vertex` **(** :ref:`Vector3` vertex **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`append_from` **(** :ref:`Mesh` existing, :ref:`int` surface, :ref:`Transform3D` transform **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`begin` **(** :ref:`PrimitiveType` primitive **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear` **(** **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`ArrayMesh` | :ref:`commit` **(** :ref:`ArrayMesh` existing=null, :ref:`int` flags=0 **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array` | :ref:`commit_to_arrays` **(** **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`create_from` **(** :ref:`Mesh` existing, :ref:`int` surface **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`create_from_blend_shape` **(** :ref:`Mesh` existing, :ref:`int` surface, :ref:`String` blend_shape **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`deindex` **(** **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedInt32Array` | :ref:`generate_lod` **(** :ref:`float` nd_threshold, :ref:`int` target_index_count=3 **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`generate_normals` **(** :ref:`bool` flip=false **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`generate_tangents` **(** **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`AABB` | :ref:`get_aabb` **(** **)** |const| | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`CustomFormat` | :ref:`get_custom_format` **(** :ref:`int` channel_index **)** |const| | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PrimitiveType` | :ref:`get_primitive_type` **(** **)** |const| | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`SkinWeightCount` | :ref:`get_skin_weight_count` **(** **)** |const| | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`index` **(** **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`optimize_indices_for_cache` **(** **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_bones` **(** :ref:`PackedInt32Array` bones **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_color` **(** :ref:`Color` color **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_custom` **(** :ref:`int` channel_index, :ref:`Color` custom_color **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_custom_format` **(** :ref:`int` channel_index, :ref:`CustomFormat` format **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_material` **(** :ref:`Material` material **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_normal` **(** :ref:`Vector3` normal **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_skin_weight_count` **(** :ref:`SkinWeightCount` count **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_smooth_group` **(** :ref:`int` index **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_tangent` **(** :ref:`Plane` tangent **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_uv` **(** :ref:`Vector2` uv **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_uv2` **(** :ref:`Vector2` uv2 **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_weights` **(** :ref:`PackedFloat32Array` weights **)** | + +----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -271,7 +271,7 @@ Adds a vertex to index array if you are using indexed vertices. Does not need to .. rst-class:: classref-method -void **add_triangle_fan** **(** :ref:`PackedVector3Array` vertices, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`PackedColorArray` colors=PackedColorArray(), :ref:`PackedVector2Array` uv2s=PackedVector2Array(), :ref:`PackedVector3Array` normals=PackedVector3Array(), :ref:`Array` tangents=[] **)** +void **add_triangle_fan** **(** :ref:`PackedVector3Array` vertices, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`PackedColorArray` colors=PackedColorArray(), :ref:`PackedVector2Array` uv2s=PackedVector2Array(), :ref:`PackedVector3Array` normals=PackedVector3Array(), :ref:`Plane[]` tangents=[] **)** Inserts a triangle fan made of array data into :ref:`Mesh` being constructed. @@ -611,6 +611,8 @@ void **set_smooth_group** **(** :ref:`int` index **)** Specifies the smooth group to use for the *next* vertex. If this is never called, all vertices will have the default smooth group of ``0`` and will be smoothed with adjacent vertices of the same group. To produce a mesh with flat normals, set the smooth group to ``-1``. +\ **Note:** This function actually takes an ``uint32_t``, so C# users should use ``uint32.MaxValue`` instead of ``-1`` to produce a mesh with flat normals. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_syntaxhighlighter.rst b/classes/class_syntaxhighlighter.rst index 1f356b8be67..bf034614887 100644 --- a/classes/class_syntaxhighlighter.rst +++ b/classes/class_syntaxhighlighter.rst @@ -23,7 +23,7 @@ Description Base syntax highlighter resource all syntax highlighters extend from, provides syntax highlighting data to :ref:`TextEdit`. -The associated :ref:`TextEdit` node will call into the **SyntaxHighlighter** on a as needed basis. +The associated :ref:`TextEdit` node will call into the **SyntaxHighlighter** on an as-needed basis. \ **Note:** Each Syntax highlighter instance should not be shared across multiple :ref:`TextEdit` nodes. @@ -46,7 +46,7 @@ Methods +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Dictionary` | :ref:`get_line_syntax_highlighting` **(** :ref:`int` line **)** | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TextEdit` | :ref:`get_text_edit` **(** **)** | + | :ref:`TextEdit` | :ref:`get_text_edit` **(** **)** |const| | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`update_cache` **(** **)** | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -145,7 +145,7 @@ This will color columns 0-4 red, and columns 5-eol in green. .. rst-class:: classref-method -:ref:`TextEdit` **get_text_edit** **(** **)** +:ref:`TextEdit` **get_text_edit** **(** **)** |const| Returns the associated :ref:`TextEdit` node. diff --git a/classes/class_tabbar.rst b/classes/class_tabbar.rst index b60d0d07b48..999e57553a8 100644 --- a/classes/class_tabbar.rst +++ b/classes/class_tabbar.rst @@ -76,10 +76,14 @@ Methods +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Texture2D` | :ref:`get_tab_icon` **(** :ref:`int` tab_idx **)** |const| | +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_tab_icon_max_width` **(** :ref:`int` tab_idx **)** |const| | + +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_tab_idx_at_point` **(** :ref:`Vector2` point **)** |const| | +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_tab_language` **(** :ref:`int` tab_idx **)** |const| | +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get_tab_metadata` **(** :ref:`int` tab_idx **)** |const| | + +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_tab_offset` **(** **)** |const| | +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Rect2` | :ref:`get_tab_rect` **(** :ref:`int` tab_idx **)** |const| | @@ -104,8 +108,12 @@ Methods +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_tab_icon` **(** :ref:`int` tab_idx, :ref:`Texture2D` icon **)** | +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_tab_icon_max_width` **(** :ref:`int` tab_idx, :ref:`int` width **)** | + +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_tab_language` **(** :ref:`int` tab_idx, :ref:`String` language **)** | +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_tab_metadata` **(** :ref:`int` tab_idx, :ref:`Variant` metadata **)** | + +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_tab_text_direction` **(** :ref:`int` tab_idx, :ref:`TextDirection` direction **)** | +--------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_tab_title` **(** :ref:`int` tab_idx, :ref:`String` title **)** | @@ -124,6 +132,8 @@ Theme Properties +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Color` | :ref:`font_disabled_color` | ``Color(0.875, 0.875, 0.875, 0.5)`` | +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ + | :ref:`Color` | :ref:`font_hovered_color` | ``Color(0.95, 0.95, 0.95, 1)`` | + +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Color` | :ref:`font_outline_color` | ``Color(1, 1, 1, 1)`` | +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Color` | :ref:`font_selected_color` | ``Color(0.95, 0.95, 0.95, 1)`` | @@ -132,6 +142,8 @@ Theme Properties +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`int` | :ref:`h_separation` | ``4`` | +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ + | :ref:`int` | :ref:`icon_max_width` | ``0`` | + +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`int` | :ref:`outline_size` | ``0`` | +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Font` | :ref:`font` | | @@ -156,6 +168,8 @@ Theme Properties +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`StyleBox` | :ref:`tab_disabled` | | +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ + | :ref:`StyleBox` | :ref:`tab_hovered` | | + +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`StyleBox` | :ref:`tab_selected` | | +-----------------------------------+------------------------------------------------------------------------------+-------------------------------------+ | :ref:`StyleBox` | :ref:`tab_unselected` | | @@ -454,7 +468,7 @@ Sets the maximum width which all tabs should be limited to. Unlimited if set to - void **set_scroll_to_selected** **(** :ref:`bool` value **)** - :ref:`bool` **get_scroll_to_selected** **(** **)** -If ``true``, the tab offset will be changed to keep the the currently selected tab visible. +If ``true``, the tab offset will be changed to keep the currently selected tab visible. .. rst-class:: classref-item-separator @@ -635,7 +649,7 @@ Returns the previously active tab index. :ref:`Texture2D` **get_tab_button_icon** **(** :ref:`int` tab_idx **)** |const| -Returns the :ref:`Texture2D` for the right button of the tab at index ``tab_idx`` or ``null`` if the button has no :ref:`Texture2D`. +Returns the icon for the right button of the tab at index ``tab_idx`` or ``null`` if the right button has no icon. .. rst-class:: classref-item-separator @@ -647,7 +661,19 @@ Returns the :ref:`Texture2D` for the right button of the tab at :ref:`Texture2D` **get_tab_icon** **(** :ref:`int` tab_idx **)** |const| -Returns the :ref:`Texture2D` for the tab at index ``tab_idx`` or ``null`` if the tab has no :ref:`Texture2D`. +Returns the icon for the tab at index ``tab_idx`` or ``null`` if the tab has no icon. + +.. rst-class:: classref-item-separator + +---- + +.. _class_TabBar_method_get_tab_icon_max_width: + +.. rst-class:: classref-method + +:ref:`int` **get_tab_icon_max_width** **(** :ref:`int` tab_idx **)** |const| + +Returns the maximum allowed width of the icon for the tab at index ``tab_idx``. .. rst-class:: classref-item-separator @@ -677,6 +703,18 @@ Returns tab title language code. ---- +.. _class_TabBar_method_get_tab_metadata: + +.. rst-class:: classref-method + +:ref:`Variant` **get_tab_metadata** **(** :ref:`int` tab_idx **)** |const| + +Returns the metadata value set to the tab at index ``tab_idx`` using :ref:`set_tab_metadata`. If no metadata was previously set, returns ``null`` by default. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabBar_method_get_tab_offset: .. rst-class:: classref-method @@ -821,6 +859,18 @@ Sets an ``icon`` for the tab at index ``tab_idx``. ---- +.. _class_TabBar_method_set_tab_icon_max_width: + +.. rst-class:: classref-method + +void **set_tab_icon_max_width** **(** :ref:`int` tab_idx, :ref:`int` width **)** + +Sets the maximum allowed width of the icon for the tab at index ``tab_idx``. This limit is applied on top of the default size of the icon and on top of :ref:`icon_max_width`. The height is adjusted according to the icon's ratio. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabBar_method_set_tab_language: .. rst-class:: classref-method @@ -833,6 +883,18 @@ Sets language code of tab title used for line-breaking and text shaping algorith ---- +.. _class_TabBar_method_set_tab_metadata: + +.. rst-class:: classref-method + +void **set_tab_metadata** **(** :ref:`int` tab_idx, :ref:`Variant` metadata **)** + +Sets the metadata value for the tab at index ``tab_idx``, which can be retrieved later using :ref:`get_tab_metadata`. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabBar_method_set_tab_text_direction: .. rst-class:: classref-method @@ -886,6 +948,18 @@ Font color of disabled tabs. ---- +.. _class_TabBar_theme_color_font_hovered_color: + +.. rst-class:: classref-themeproperty + +:ref:`Color` **font_hovered_color** = ``Color(0.95, 0.95, 0.95, 1)`` + +Font color of the currently hovered tab. Does not apply to the selected tab. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabBar_theme_color_font_outline_color: .. rst-class:: classref-themeproperty @@ -934,6 +1008,18 @@ The horizontal separation between the elements inside tabs. ---- +.. _class_TabBar_theme_constant_icon_max_width: + +.. rst-class:: classref-themeproperty + +:ref:`int` **icon_max_width** = ``0`` + +The maximum allowed width of the tab's icon. This limit is applied on top of the default size of the icon, but before the value set with :ref:`set_tab_icon_max_width`. The height is adjusted according to the icon's ratio. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabBar_theme_constant_outline_size: .. rst-class:: classref-themeproperty @@ -1080,6 +1166,18 @@ The style of disabled tabs. ---- +.. _class_TabBar_theme_style_tab_hovered: + +.. rst-class:: classref-themeproperty + +:ref:`StyleBox` **tab_hovered** + +The style of the currently hovered tab. Does not apply to the selected tab. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabBar_theme_style_tab_selected: .. rst-class:: classref-themeproperty diff --git a/classes/class_tabcontainer.rst b/classes/class_tabcontainer.rst index d1c9bafa9cd..93ef6a925ff 100644 --- a/classes/class_tabcontainer.rst +++ b/classes/class_tabcontainer.rst @@ -85,6 +85,8 @@ Methods +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_tab_idx_from_control` **(** :ref:`Control` control **)** |const| | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Variant` | :ref:`get_tab_metadata` **(** :ref:`int` tab_idx **)** |const| | + +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_tab_title` **(** :ref:`int` tab_idx **)** |const| | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_tab_disabled` **(** :ref:`int` tab_idx **)** |const| | @@ -101,6 +103,8 @@ Methods +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_tab_icon` **(** :ref:`int` tab_idx, :ref:`Texture2D` icon **)** | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_tab_metadata` **(** :ref:`int` tab_idx, :ref:`Variant` metadata **)** | + +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_tab_title` **(** :ref:`int` tab_idx, :ref:`String` title **)** | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -117,12 +121,16 @@ Theme Properties +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Color` | :ref:`font_disabled_color` | ``Color(0.875, 0.875, 0.875, 0.5)`` | +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ + | :ref:`Color` | :ref:`font_hovered_color` | ``Color(0.95, 0.95, 0.95, 1)`` | + +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Color` | :ref:`font_outline_color` | ``Color(1, 1, 1, 1)`` | +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Color` | :ref:`font_selected_color` | ``Color(0.95, 0.95, 0.95, 1)`` | +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`Color` | :ref:`font_unselected_color` | ``Color(0.7, 0.7, 0.7, 1)`` | +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ + | :ref:`int` | :ref:`icon_max_width` | ``0`` | + +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`int` | :ref:`icon_separation` | ``4`` | +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`int` | :ref:`outline_size` | ``0`` | @@ -151,6 +159,8 @@ Theme Properties +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`StyleBox` | :ref:`tab_disabled` | | +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ + | :ref:`StyleBox` | :ref:`tab_hovered` | | + +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`StyleBox` | :ref:`tab_selected` | | +-----------------------------------+------------------------------------------------------------------------------------+-------------------------------------+ | :ref:`StyleBox` | :ref:`tab_unselected` | | @@ -167,6 +177,18 @@ Theme Properties Signals ------- +.. _class_TabContainer_signal_active_tab_rearranged: + +.. rst-class:: classref-signal + +**active_tab_rearranged** **(** :ref:`int` idx_to **)** + +Emitted when the active tab is rearranged via mouse drag. See :ref:`drag_to_rearrange_enabled`. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabContainer_signal_pre_popup_pressed: .. rst-class:: classref-signal @@ -203,6 +225,30 @@ Emitted when switching to another tab. ---- +.. _class_TabContainer_signal_tab_clicked: + +.. rst-class:: classref-signal + +**tab_clicked** **(** :ref:`int` tab **)** + +Emitted when a tab is clicked, even if it is the current tab. + +.. rst-class:: classref-item-separator + +---- + +.. _class_TabContainer_signal_tab_hovered: + +.. rst-class:: classref-signal + +**tab_hovered** **(** :ref:`int` tab **)** + +Emitted when a tab is hovered by the mouse. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabContainer_signal_tab_selected: .. rst-class:: classref-signal @@ -473,6 +519,18 @@ Returns the index of the tab tied to the given ``control``. The control must be ---- +.. _class_TabContainer_method_get_tab_metadata: + +.. rst-class:: classref-method + +:ref:`Variant` **get_tab_metadata** **(** :ref:`int` tab_idx **)** |const| + +Returns the metadata value set to the tab at index ``tab_idx`` using :ref:`set_tab_metadata`. If no metadata was previously set, returns ``null`` by default. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabContainer_method_get_tab_title: .. rst-class:: classref-method @@ -569,6 +627,18 @@ Sets an icon for the tab at index ``tab_idx``. ---- +.. _class_TabContainer_method_set_tab_metadata: + +.. rst-class:: classref-method + +void **set_tab_metadata** **(** :ref:`int` tab_idx, :ref:`Variant` metadata **)** + +Sets the metadata value for the tab at index ``tab_idx``, which can be retrieved later using :ref:`get_tab_metadata`. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabContainer_method_set_tab_title: .. rst-class:: classref-method @@ -610,6 +680,18 @@ Font color of disabled tabs. ---- +.. _class_TabContainer_theme_color_font_hovered_color: + +.. rst-class:: classref-themeproperty + +:ref:`Color` **font_hovered_color** = ``Color(0.95, 0.95, 0.95, 1)`` + +Font color of the currently hovered tab. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabContainer_theme_color_font_outline_color: .. rst-class:: classref-themeproperty @@ -646,6 +728,18 @@ Font color of the other, unselected tabs. ---- +.. _class_TabContainer_theme_constant_icon_max_width: + +.. rst-class:: classref-themeproperty + +:ref:`int` **icon_max_width** = ``0`` + +The maximum allowed width of the tab's icon. This limit is applied on top of the default size of the icon, but before the value set with :ref:`TabBar.set_tab_icon_max_width`. The height is adjusted according to the icon's ratio. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabContainer_theme_constant_icon_separation: .. rst-class:: classref-themeproperty @@ -818,6 +912,18 @@ The style of disabled tabs. ---- +.. _class_TabContainer_theme_style_tab_hovered: + +.. rst-class:: classref-themeproperty + +:ref:`StyleBox` **tab_hovered** + +The style of the currently hovered tab. + +.. rst-class:: classref-item-separator + +---- + .. _class_TabContainer_theme_style_tab_selected: .. rst-class:: classref-themeproperty diff --git a/classes/class_textedit.rst b/classes/class_textedit.rst index 369492eaaf7..00187d1d026 100644 --- a/classes/class_textedit.rst +++ b/classes/class_textedit.rst @@ -40,6 +40,8 @@ Properties +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`caret_blink_interval` | ``0.65`` | +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`caret_draw_when_editable_disabled` | ``false`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`caret_mid_grapheme` | ``true`` | +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`caret_move_on_right_click` | ``true`` | @@ -959,7 +961,7 @@ Select whole words as if the user double clicked. :ref:`SelectionMode` **SELECTION_MODE_LINE** = ``4`` -Select whole lines as if the user tripped clicked. +Select whole lines as if the user triple clicked. .. rst-class:: classref-item-separator @@ -1041,7 +1043,7 @@ Property Descriptions - void **set_caret_blink_enabled** **(** :ref:`bool` value **)** - :ref:`bool` **is_caret_blink_enabled** **(** **)** -Sets if the caret should blink. +If ``true``, makes the caret blink. .. rst-class:: classref-item-separator @@ -1058,7 +1060,24 @@ Sets if the caret should blink. - void **set_caret_blink_interval** **(** :ref:`float` value **)** - :ref:`float` **get_caret_blink_interval** **(** **)** -Duration (in seconds) of a caret's blinking cycle. +The interval at which the caret blinks (in seconds). + +.. rst-class:: classref-item-separator + +---- + +.. _class_TextEdit_property_caret_draw_when_editable_disabled: + +.. rst-class:: classref-property + +:ref:`bool` **caret_draw_when_editable_disabled** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_draw_caret_when_editable_disabled** **(** :ref:`bool` value **)** +- :ref:`bool` **is_drawing_caret_when_editable_disabled** **(** **)** + +If ``true``, caret will be visible when :ref:`editable` is disabled. .. rst-class:: classref-item-separator @@ -2453,7 +2472,7 @@ Returns the scroll position for ``wrap_index`` of ``line``. :ref:`String` **get_selected_text** **(** :ref:`int` caret_index=-1 **)** -Returns the text inside the selection. +Returns the text inside the selection of a caret, or all the carets if ``caret_index`` is its default value ``-1``. .. rst-class:: classref-item-separator diff --git a/classes/class_textserver.rst b/classes/class_textserver.rst index 49479dba4a9..49c39146c02 100644 --- a/classes/class_textserver.rst +++ b/classes/class_textserver.rst @@ -54,6 +54,8 @@ Methods +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`font_get_ascent` **(** :ref:`RID` font_rid, :ref:`int` size **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`font_get_char_from_glyph_index` **(** :ref:`RID` font_rid, :ref:`int` size, :ref:`int` glyph_index **)** |const| | + +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`font_get_descent` **(** :ref:`RID` font_rid, :ref:`int` size **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`font_get_embolden` **(** :ref:`RID` font_rid **)** |const| | @@ -1006,6 +1008,14 @@ Grapheme is connected to the previous grapheme. Breaking line before this graphe It is safe to insert a U+0640 before this grapheme for elongation. +.. _class_TextServer_constant_GRAPHEME_IS_EMBEDDED_OBJECT: + +.. rst-class:: classref-enumeration-constant + +:ref:`GraphemeFlag` **GRAPHEME_IS_EMBEDDED_OBJECT** = ``4096`` + +Grapheme is an object replacement character for the embedded object. + .. rst-class:: classref-item-separator ---- @@ -1579,6 +1589,18 @@ Returns the font ascent (number of pixels above the baseline). ---- +.. _class_TextServer_method_font_get_char_from_glyph_index: + +.. rst-class:: classref-method + +:ref:`int` **font_get_char_from_glyph_index** **(** :ref:`RID` font_rid, :ref:`int` size, :ref:`int` glyph_index **)** |const| + +Returns character code associated with ``glyph_index``, or ``0`` if ``glyph_index`` is invalid. See :ref:`font_get_glyph_index`. + +.. rst-class:: classref-item-separator + +---- + .. _class_TextServer_method_font_get_descent: .. rst-class:: classref-method @@ -1701,7 +1723,7 @@ Returns outline contours of the glyph as a ``Dictionary`` with the following con :ref:`int` **font_get_glyph_index** **(** :ref:`RID` font_rid, :ref:`int` size, :ref:`int` char, :ref:`int` variation_selector **)** |const| -Returns the glyph index of a ``char``, optionally modified by the ``variation_selector``. +Returns the glyph index of a ``char``, optionally modified by the ``variation_selector``. See :ref:`font_get_char_from_glyph_index`. .. rst-class:: classref-item-separator @@ -2929,7 +2951,7 @@ Returns ``true`` if locale is right-to-left. :ref:`bool` **is_valid_identifier** **(** :ref:`String` string **)** |const| -Returns ``true`` is ``string`` is a valid identifier. +Returns ``true`` if ``string`` is a valid identifier. If the text server supports the :ref:`FEATURE_UNICODE_IDENTIFIERS` feature, a valid identifier must: @@ -3129,7 +3151,7 @@ Draw the outline of the shaped text into a canvas item at a given position, with :ref:`float` **shaped_text_fit_to_width** **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` jst_flags=3 **)** -Adjusts text with to fit to specified width, returns new text width. +Adjusts text width to fit to specified width, returns new text width. .. rst-class:: classref-item-separator diff --git a/classes/class_textserverdummy.rst b/classes/class_textserverdummy.rst index b2f5fcb390e..9d5a9931528 100644 --- a/classes/class_textserverdummy.rst +++ b/classes/class_textserverdummy.rst @@ -12,9 +12,29 @@ TextServerDummy **Inherits:** :ref:`TextServerExtension` **<** :ref:`TextServer` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +A dummy text server that can't render text or manage fonts. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +A dummy :ref:`TextServer` interface that doesn't do anything. Useful for freeing up memory when rendering text is not needed, as text servers are resource-intensive. It can also be used for performance comparisons in complex GUIs to check the impact of text rendering. + +A dummy text server is always available at the start of a project. Here's how to access it: + +:: + + var dummy_text_server = TextServerManager.find_interface("Dummy") + if dummy_text_server != null: + TextServerManager.set_primary_interface(dummy_text_server) + # If the other text servers are unneeded, they can be removed: + for i in TextServerManager.get_interface_count(): + var text_server = TextServerManager.get_interface(i) + if text_server != dummy_text_server: + TextServerManager.remove_interface(text_server) + +The command line argument ``--text-driver Dummy`` (case-sensitive) can be used to force the "Dummy" :ref:`TextServer` on any project. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_textserverextension.rst b/classes/class_textserverextension.rst index a7f0a026c25..747df3fb640 100644 --- a/classes/class_textserverextension.rst +++ b/classes/class_textserverextension.rst @@ -56,6 +56,8 @@ Methods +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_font_get_ascent` **(** :ref:`RID` font_rid, :ref:`int` size **)** |virtual| |const| | +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`_font_get_char_from_glyph_index` **(** :ref:`RID` font_rid, :ref:`int` size, :ref:`int` glyph_index **)** |virtual| |const| | + +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_font_get_descent` **(** :ref:`RID` font_rid, :ref:`int` size **)** |virtual| |const| | +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_font_get_embolden` **(** :ref:`RID` font_rid **)** |virtual| |const| | @@ -598,6 +600,20 @@ void **_font_draw_glyph_outline** **(** :ref:`RID` font_rid, :ref:`RI ---- +.. _class_TextServerExtension_method__font_get_char_from_glyph_index: + +.. rst-class:: classref-method + +:ref:`int` **_font_get_char_from_glyph_index** **(** :ref:`RID` font_rid, :ref:`int` size, :ref:`int` glyph_index **)** |virtual| |const| + +.. container:: contribute + + There is currently no description for this method. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + .. _class_TextServerExtension_method__font_get_descent: .. rst-class:: classref-method diff --git a/classes/class_texture3d.rst b/classes/class_texture3d.rst index 5371f04ff14..508881bc162 100644 --- a/classes/class_texture3d.rst +++ b/classes/class_texture3d.rst @@ -12,7 +12,7 @@ Texture3D **Inherits:** :ref:`Texture` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -**Inherited By:** :ref:`CompressedTexture3D`, :ref:`ImageTexture3D`, :ref:`PlaceholderTexture3D` +**Inherited By:** :ref:`CompressedTexture3D`, :ref:`ImageTexture3D`, :ref:`NoiseTexture3D`, :ref:`PlaceholderTexture3D` Base class for 3-dimensionnal textures. diff --git a/classes/class_texturelayered.rst b/classes/class_texturelayered.rst index 4f0db755a3e..4ee057d8bb6 100644 --- a/classes/class_texturelayered.rst +++ b/classes/class_texturelayered.rst @@ -21,7 +21,7 @@ Base class for texture types which contain the data of multiple :ref:`Image`. Cannot be used directly, but contains all the functions necessary for accessing the derived resource types. See also :ref:`Texture3D`. +Base class for :ref:`ImageTextureLayered` and :ref:`CompressedTextureLayered`. Cannot be used directly, but contains all the functions necessary for accessing the derived resource types. See also :ref:`Texture3D`. Data is set on a per-layer basis. For :ref:`Texture2DArray`\ s, the layer specifies the array layer. @@ -135,7 +135,7 @@ Called when the **TextureLayered**'s format is queried. :ref:`int` **_get_height** **(** **)** |virtual| |const| -Called when the the **TextureLayered**'s height is queried. +Called when the **TextureLayered**'s height is queried. .. rst-class:: classref-item-separator diff --git a/classes/class_theme.rst b/classes/class_theme.rst index e67084ecf20..0e6182e14d8 100644 --- a/classes/class_theme.rst +++ b/classes/class_theme.rst @@ -704,7 +704,7 @@ Returns a list of all unique theme type names for :ref:`StyleBox Returns the theme property of ``data_type`` defined by ``name`` and ``theme_type``, if it exists. -Returns the engine fallback icon value if the property doesn't exist (see :ref:`ThemeDB`). Use :ref:`has_theme_item` to check for existence. +Returns the engine fallback value if the property doesn't exist (see :ref:`ThemeDB`). Use :ref:`has_theme_item` to check for existence. \ **Note:** This method is analogous to calling the corresponding data type specific method, but can be used for more generalized logic. diff --git a/classes/class_thread.rst b/classes/class_thread.rst index da9c11b6c67..8c01342da07 100644 --- a/classes/class_thread.rst +++ b/classes/class_thread.rst @@ -108,7 +108,7 @@ Method Descriptions :ref:`String` **get_id** **(** **)** |const| -Returns the current **Thread**'s ID, uniquely identifying it among all threads. If the **Thread** is not running this returns an empty string. +Returns the current **Thread**'s ID, uniquely identifying it among all threads. If the **Thread** has not started running or if :ref:`wait_to_finish` has been called, this returns an empty string. .. rst-class:: classref-item-separator @@ -120,7 +120,7 @@ Returns the current **Thread**'s ID, uniquely identifying it among all threads. :ref:`bool` **is_alive** **(** **)** |const| -Returns ``true`` if this **Thread** is currently running. This is useful for determining if :ref:`wait_to_finish` can be called without blocking the calling thread. +Returns ``true`` if this **Thread** is currently running the provided function. This is useful for determining if :ref:`wait_to_finish` can be called without blocking the calling thread. To check if a **Thread** is joinable, use :ref:`is_started`. diff --git a/classes/class_tilemap.rst b/classes/class_tilemap.rst index 925b704a01b..098c354ff7e 100644 --- a/classes/class_tilemap.rst +++ b/classes/class_tilemap.rst @@ -95,6 +95,8 @@ Methods +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2i` | :ref:`get_coords_for_body_rid` **(** :ref:`RID` body **)** | +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_layer_for_body_rid` **(** :ref:`RID` body **)** | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Color` | :ref:`get_layer_modulate` **(** :ref:`int` layer **)** |const| | +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`get_layer_name` **(** :ref:`int` layer **)** |const| | @@ -251,7 +253,7 @@ The TileMap's quadrant size. Optimizes drawing by batching, using chunks of this If enabled, the TileMap will see its collisions synced to the physics tick and change its collision type from static to kinematic. This is required to create TileMap-based moving platform. -\ **Note:** Enabling ``collision_animatable`` may have a small performance impact, only do it if the TileMap is moving and has colliding tiles. +\ **Note:** Enabling :ref:`collision_animatable` may have a small performance impact, only do it if the TileMap is moving and has colliding tiles. .. rst-class:: classref-item-separator @@ -495,6 +497,18 @@ Returns the coordinates of the tile for given physics body RID. Such RID can be ---- +.. _class_TileMap_method_get_layer_for_body_rid: + +.. rst-class:: classref-method + +:ref:`int` **get_layer_for_body_rid** **(** :ref:`RID` body **)** + +Returns the tilemap layer of the tile for given physics body RID. Such RID can be retrieved from :ref:`KinematicCollision2D.get_collider_rid`, when colliding with a tile. + +.. rst-class:: classref-item-separator + +---- + .. _class_TileMap_method_get_layer_modulate: .. rst-class:: classref-method @@ -763,7 +777,7 @@ Update all the cells in the ``cells`` coordinates array so that they use the giv If ``ignore_empty_terrains`` is true, empty terrains will be ignored when trying to find the best fitting tile for the given terrain constraints. -\ **Note:** To work correctly, ``set_cells_terrain_connect`` requires the TileMap's TileSet to have terrains set up with all required terrain combinations. Otherwise, it may produce unexpected results. +\ **Note:** To work correctly, this method requires the TileMap's TileSet to have terrains set up with all required terrain combinations. Otherwise, it may produce unexpected results. .. rst-class:: classref-item-separator @@ -779,7 +793,7 @@ Update all the cells in the ``path`` coordinates array so that they use the give If ``ignore_empty_terrains`` is true, empty terrains will be ignored when trying to find the best fitting tile for the given terrain constraints. -\ **Note:** To work correctly, ``set_cells_terrain_path`` requires the TileMap's TileSet to have terrains set up with all required terrain combinations. Otherwise, it may produce unexpected results. +\ **Note:** To work correctly, this method requires the TileMap's TileSet to have terrains set up with all required terrain combinations. Otherwise, it may produce unexpected results. .. rst-class:: classref-item-separator diff --git a/classes/class_tileset.rst b/classes/class_tileset.rst index bb41686c5a3..b71b886ffe7 100644 --- a/classes/class_tileset.rst +++ b/classes/class_tileset.rst @@ -27,7 +27,7 @@ Tiles are referenced by using three IDs: their source ID, their atlas coordinate A TileSet can be configured so that its tiles expose more or less properties. To do so, the TileSet resources uses property layers, that you can add or remove depending on your needs. -For example, adding a physics layer allows giving collision shapes to your tiles. Each layer having dedicated properties (physics layer an mask), you may add several TileSet physics layers for each type of collision you need. +For example, adding a physics layer allows giving collision shapes to your tiles. Each layer having dedicated properties (physics layer and mask), you may add several TileSet physics layers for each type of collision you need. See the functions to add new layers for more information. @@ -712,7 +712,7 @@ Physics layers allow assigning collision polygons to atlas tiles. Adds a :ref:`TileSetSource` to the TileSet. If ``atlas_source_id_override`` is not -1, also set its source ID. Otherwise, a unique identifier is automatically generated. -The function returns the added source source ID or -1 if the source could not be added. +The function returns the added source ID or -1 if the source could not be added. .. rst-class:: classref-item-separator @@ -860,7 +860,7 @@ Returns whether or not the specified navigation layer of the TileSet navigation :ref:`int` **get_navigation_layer_layers** **(** :ref:`int` layer_index **)** |const| -Returns the navigation layers (as in the Navigation server) of the gives TileSet navigation layer. +Returns the navigation layers (as in the Navigation server) of the given TileSet navigation layer. .. rst-class:: classref-item-separator @@ -1450,7 +1450,7 @@ Based on ``value``, enables or disables the specified navigation layer of the Ti void **set_navigation_layer_layers** **(** :ref:`int` layer_index, :ref:`int` layers **)** -Sets the navigation layers (as in the navigation server) for navigation regions is the given TileSet navigation layer. +Sets the navigation layers (as in the navigation server) for navigation regions in the given TileSet navigation layer. .. rst-class:: classref-item-separator @@ -1474,7 +1474,7 @@ Sets the occlusion layer (as in the rendering server) for occluders in the given void **set_occlusion_layer_sdf_collision** **(** :ref:`int` layer_index, :ref:`bool` sdf_collision **)** -Enables or disables sdf collision for occluders in the given TileSet occlusion layer. +Enables or disables SDF collision for occluders in the given TileSet occlusion layer. .. rst-class:: classref-item-separator @@ -1534,7 +1534,7 @@ Changes a source's ID. void **set_source_level_tile_proxy** **(** :ref:`int` source_from, :ref:`int` source_to **)** -Creates a source-level proxy for the given source ID. A proxy will map set of tile identifiers to another set of identifiers. Both the atlac coordinates ID and the alternative tile ID are kept the same when using source-level proxies. +Creates a source-level proxy for the given source ID. A proxy will map set of tile identifiers to another set of identifiers. Both the atlas coordinates ID and the alternative tile ID are kept the same when using source-level proxies. This can be used to replace a source in all TileMaps using this TileSet, as TileMap nodes will find and use the proxy's target source when one is available. diff --git a/classes/class_tilesetscenescollectionsource.rst b/classes/class_tilesetscenescollectionsource.rst index dc66578fa7c..f6c580e818d 100644 --- a/classes/class_tilesetscenescollectionsource.rst +++ b/classes/class_tilesetscenescollectionsource.rst @@ -180,7 +180,7 @@ Sets whether or not the scene tile with ``id`` should display a placeholder in t void **set_scene_tile_id** **(** :ref:`int` id, :ref:`int` new_id **)** -Changes a scene tile's ID from ``id`` to ``new_id``. This will fail if there is already a tile with a ID equal to ``new_id``. +Changes a scene tile's ID from ``id`` to ``new_id``. This will fail if there is already a tile with an ID equal to ``new_id``. .. rst-class:: classref-item-separator diff --git a/classes/class_timer.rst b/classes/class_timer.rst index eb6a3c0b061..e6a04015261 100644 --- a/classes/class_timer.rst +++ b/classes/class_timer.rst @@ -21,6 +21,8 @@ Description Counts down a specified interval and emits a signal on reaching 0. Can be set to repeat or "one-shot" mode. +\ **Note:** Timers are affected by :ref:`Engine.time_scale`, a higher scale means quicker timeouts, and vice versa. + \ **Note:** To create a one-shot timer without instantiating a node, use :ref:`SceneTree.create_timer`. .. rst-class:: classref-introduction-group @@ -226,7 +228,7 @@ The timer's remaining time in seconds. Returns 0 if the timer is inactive. The wait time in seconds. -\ **Note:** Timers can only emit once per rendered frame at most (or once per physics frame if :ref:`process_callback` is :ref:`TIMER_PROCESS_PHYSICS`). This means very low wait times (lower than 0.05 seconds) will behave in significantly different ways depending on the rendered framerate. For very low wait times, it is recommended to use a process loop in a script instead of using a Timer node. +\ **Note:** Timers can only emit once per rendered frame at most (or once per physics frame if :ref:`process_callback` is :ref:`TIMER_PROCESS_PHYSICS`). This means very low wait times (lower than 0.05 seconds) will behave in significantly different ways depending on the rendered framerate. For very low wait times, it is recommended to use a process loop in a script instead of using a Timer node. Timers are affected by :ref:`Engine.time_scale`, a higher scale means quicker timeouts, and vice versa. .. rst-class:: classref-section-separator diff --git a/classes/class_transform2d.rst b/classes/class_transform2d.rst index 7bcf08e599d..0c5a8145f4d 100644 --- a/classes/class_transform2d.rst +++ b/classes/class_transform2d.rst @@ -85,6 +85,8 @@ Methods +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2` | :ref:`basis_xform_inv` **(** :ref:`Vector2` v **)** |const| | +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`determinant` **(** **)** |const| | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2` | :ref:`get_origin` **(** **)** |const| | +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_rotation` **(** **)** |const| | @@ -326,6 +328,20 @@ This method does not account for translation (the origin vector). ---- +.. _class_Transform2D_method_determinant: + +.. rst-class:: classref-method + +:ref:`float` **determinant** **(** **)** |const| + +Returns the determinant of the basis matrix. If the basis is uniformly scaled, then its determinant equals the square of the scale factor. + +A negative determinant means the basis was flipped, so one part of the scale is negative. A zero determinant means the basis isn't invertible, and is usually considered invalid. + +.. rst-class:: classref-item-separator + +---- + .. _class_Transform2D_method_get_origin: .. rst-class:: classref-method @@ -404,7 +420,7 @@ Returns the inverse of the transform, under the assumption that the transformati :ref:`bool` **is_equal_approx** **(** :ref:`Transform2D` xform **)** |const| -Returns ``true`` if this transform and ``transform`` are approximately equal, by calling ``is_equal_approx`` on each component. +Returns ``true`` if this transform and ``xform`` are approximately equal, by calling ``is_equal_approx`` on each component. .. rst-class:: classref-item-separator @@ -428,7 +444,7 @@ Returns ``true`` if this transform is finite, by calling :ref:`@GlobalScope.is_f :ref:`Transform2D` **looking_at** **(** :ref:`Vector2` target=Vector2(0, 0) **)** |const| -Returns a copy of the transform rotated such that it's rotation on the X-axis points towards the ``target`` position. +Returns a copy of the transform rotated such that the rotated X-axis points towards the ``target`` position. Operations take place in global space. @@ -456,9 +472,7 @@ Returns the transform with the basis orthogonal (90 degrees), and normalized axi Returns a copy of the transform rotated by the given ``angle`` (in radians). -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding rotation transform ``R`` from the left, i.e., ``R * X``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding rotation transform ``R`` from the left, i.e., ``R * X``. This can be seen as transforming with respect to the global/parent frame. @@ -474,9 +488,7 @@ This can be seen as transforming with respect to the global/parent frame. Returns a copy of the transform rotated by the given ``angle`` (in radians). -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding rotation transform ``R`` from the right, i.e., ``X * R``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding rotation transform ``R`` from the right, i.e., ``X * R``. This can be seen as transforming with respect to the local frame. @@ -492,9 +504,7 @@ This can be seen as transforming with respect to the local frame. Returns a copy of the transform scaled by the given ``scale`` factor. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding scaling transform ``S`` from the left, i.e., ``S * X``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding scaling transform ``S`` from the left, i.e., ``S * X``. This can be seen as transforming with respect to the global/parent frame. @@ -510,9 +520,7 @@ This can be seen as transforming with respect to the global/parent frame. Returns a copy of the transform scaled by the given ``scale`` factor. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding scaling transform ``S`` from the right, i.e., ``X * S``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding scaling transform ``S`` from the right, i.e., ``X * S``. This can be seen as transforming with respect to the local frame. @@ -528,9 +536,7 @@ This can be seen as transforming with respect to the local frame. Returns a copy of the transform translated by the given ``offset``. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding translation transform ``T`` from the left, i.e., ``T * X``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding translation transform ``T`` from the left, i.e., ``T * X``. This can be seen as transforming with respect to the global/parent frame. @@ -546,9 +552,7 @@ This can be seen as transforming with respect to the global/parent frame. Returns a copy of the transform translated by the given ``offset``. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding translation transform ``T`` from the right, i.e., ``X * T``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding translation transform ``T`` from the right, i.e., ``X * T``. This can be seen as transforming with respect to the local frame. diff --git a/classes/class_transform3d.rst b/classes/class_transform3d.rst index b2f377d1be5..b4087924258 100644 --- a/classes/class_transform3d.rst +++ b/classes/class_transform3d.rst @@ -314,7 +314,7 @@ Returns the inverse of the transform, under the assumption that the transformati :ref:`bool` **is_equal_approx** **(** :ref:`Transform3D` xform **)** |const| -Returns ``true`` if this transform and ``transform`` are approximately equal, by calling ``is_equal_approx`` on each component. +Returns ``true`` if this transform and ``xform`` are approximately equal, by calling ``is_equal_approx`` on each component. .. rst-class:: classref-item-separator @@ -368,9 +368,7 @@ Returns a copy of the transform rotated around the given ``axis`` by the given ` The ``axis`` must be a normalized vector. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding rotation transform ``R`` from the left, i.e., ``R * X``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding rotation transform ``R`` from the left, i.e., ``R * X``. This can be seen as transforming with respect to the global/parent frame. @@ -388,9 +386,7 @@ Returns a copy of the transform rotated around the given ``axis`` by the given ` The ``axis`` must be a normalized vector. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding rotation transform ``R`` from the right, i.e., ``X * R``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding rotation transform ``R`` from the right, i.e., ``X * R``. This can be seen as transforming with respect to the local frame. @@ -406,9 +402,7 @@ This can be seen as transforming with respect to the local frame. Returns a copy of the transform scaled by the given ``scale`` factor. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding scaling transform ``S`` from the left, i.e., ``S * X``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding scaling transform ``S`` from the left, i.e., ``S * X``. This can be seen as transforming with respect to the global/parent frame. @@ -424,9 +418,7 @@ This can be seen as transforming with respect to the global/parent frame. Returns a copy of the transform scaled by the given ``scale`` factor. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding scaling transform ``S`` from the right, i.e., ``X * S``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding scaling transform ``S`` from the right, i.e., ``X * S``. This can be seen as transforming with respect to the local frame. @@ -442,9 +434,7 @@ This can be seen as transforming with respect to the local frame. Returns a copy of the transform translated by the given ``offset``. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding translation transform ``T`` from the left, i.e., ``T * X``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding translation transform ``T`` from the left, i.e., ``T * X``. This can be seen as transforming with respect to the global/parent frame. @@ -460,9 +450,7 @@ This can be seen as transforming with respect to the global/parent frame. Returns a copy of the transform translated by the given ``offset``. -This method is an optimized version of multiplying the given transform ``X``\ - -with a corresponding translation transform ``T`` from the right, i.e., ``X * T``. +This method is an optimized version of multiplying the given transform ``X`` with a corresponding translation transform ``T`` from the right, i.e., ``X * T``. This can be seen as transforming with respect to the local frame. diff --git a/classes/class_translationserver.rst b/classes/class_translationserver.rst index 6353bac2a72..dda17a771d4 100644 --- a/classes/class_translationserver.rst +++ b/classes/class_translationserver.rst @@ -379,7 +379,7 @@ Returns the current locale's translation for the given message (key) and context :ref:`StringName` **translate_plural** **(** :ref:`StringName` message, :ref:`StringName` plural_message, :ref:`int` n, :ref:`StringName` context="" **)** |const| -Returns the current locale's translation for the given message (key), plural_message and context. +Returns the current locale's translation for the given message (key), plural message and context. The number ``n`` is the number or quantity of the plural object. It will be used to guide the translation system to fetch the correct plural form for the selected language. diff --git a/classes/class_tree.rst b/classes/class_tree.rst index 87fecaee187..f61310d9fc5 100644 --- a/classes/class_tree.rst +++ b/classes/class_tree.rst @@ -69,6 +69,8 @@ Properties +------------------------------------------+---------------------------------------------------------------------------------+---------------------------------------------------------------------------+ | :ref:`bool` | :ref:`allow_rmb_select` | ``false`` | +------------------------------------------+---------------------------------------------------------------------------------+---------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`allow_search` | ``true`` | + +------------------------------------------+---------------------------------------------------------------------------------+---------------------------------------------------------------------------+ | :ref:`bool` | clip_contents | ``true`` (overrides :ref:`Control`) | +------------------------------------------+---------------------------------------------------------------------------------+---------------------------------------------------------------------------+ | :ref:`bool` | :ref:`column_titles_visible` | ``false`` | @@ -100,77 +102,81 @@ Methods .. table:: :widths: auto - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear` **(** **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TreeItem` | :ref:`create_item` **(** :ref:`TreeItem` parent=null, :ref:`int` index=-1 **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`deselect_all` **(** **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`edit_selected` **(** **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`ensure_cursor_is_visible` **(** **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_button_id_at_position` **(** :ref:`Vector2` position **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_column_at_position` **(** :ref:`Vector2` position **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_column_expand_ratio` **(** :ref:`int` column **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_column_title` **(** :ref:`int` column **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TextDirection` | :ref:`get_column_title_direction` **(** :ref:`int` column **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_column_title_language` **(** :ref:`int` column **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_column_width` **(** :ref:`int` column **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Rect2` | :ref:`get_custom_popup_rect` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_drop_section_at_position` **(** :ref:`Vector2` position **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TreeItem` | :ref:`get_edited` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_edited_column` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Rect2` | :ref:`get_item_area_rect` **(** :ref:`TreeItem` item, :ref:`int` column=-1, :ref:`int` button_index=-1 **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TreeItem` | :ref:`get_item_at_position` **(** :ref:`Vector2` position **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TreeItem` | :ref:`get_next_selected` **(** :ref:`TreeItem` from **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_pressed_button` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TreeItem` | :ref:`get_root` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_scroll` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`TreeItem` | :ref:`get_selected` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_selected_column` **(** **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_column_clipping_content` **(** :ref:`int` column **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_column_expanding` **(** :ref:`int` column **)** |const| | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scroll_to_item` **(** :ref:`TreeItem` item, :ref:`bool` center_on_item=false **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_column_clip_content` **(** :ref:`int` column, :ref:`bool` enable **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_column_custom_minimum_width` **(** :ref:`int` column, :ref:`int` min_width **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_column_expand` **(** :ref:`int` column, :ref:`bool` expand **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_column_expand_ratio` **(** :ref:`int` column, :ref:`int` ratio **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_column_title` **(** :ref:`int` column, :ref:`String` title **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_column_title_direction` **(** :ref:`int` column, :ref:`TextDirection` direction **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_column_title_language` **(** :ref:`int` column, :ref:`String` language **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_selected` **(** :ref:`TreeItem` item, :ref:`int` column **)** | - +--------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear` **(** **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`create_item` **(** :ref:`TreeItem` parent=null, :ref:`int` index=-1 **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`deselect_all` **(** **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`edit_selected` **(** :ref:`bool` force_edit=false **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`ensure_cursor_is_visible` **(** **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_button_id_at_position` **(** :ref:`Vector2` position **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_column_at_position` **(** :ref:`Vector2` position **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_column_expand_ratio` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_column_title` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`HorizontalAlignment` | :ref:`get_column_title_alignment` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TextDirection` | :ref:`get_column_title_direction` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_column_title_language` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_column_width` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Rect2` | :ref:`get_custom_popup_rect` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_drop_section_at_position` **(** :ref:`Vector2` position **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`get_edited` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_edited_column` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Rect2` | :ref:`get_item_area_rect` **(** :ref:`TreeItem` item, :ref:`int` column=-1, :ref:`int` button_index=-1 **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`get_item_at_position` **(** :ref:`Vector2` position **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`get_next_selected` **(** :ref:`TreeItem` from **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_pressed_button` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`get_root` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_scroll` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`get_selected` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_selected_column` **(** **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_column_clipping_content` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_column_expanding` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scroll_to_item` **(** :ref:`TreeItem` item, :ref:`bool` center_on_item=false **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_clip_content` **(** :ref:`int` column, :ref:`bool` enable **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_custom_minimum_width` **(** :ref:`int` column, :ref:`int` min_width **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_expand` **(** :ref:`int` column, :ref:`bool` expand **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_expand_ratio` **(** :ref:`int` column, :ref:`int` ratio **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_title` **(** :ref:`int` column, :ref:`String` title **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_title_alignment` **(** :ref:`int` column, :ref:`HorizontalAlignment` title_alignment **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_title_direction` **(** :ref:`int` column, :ref:`TextDirection` direction **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_column_title_language` **(** :ref:`int` column, :ref:`String` language **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_selected` **(** :ref:`TreeItem` item, :ref:`int` column **)** | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -211,6 +217,8 @@ Theme Properties +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`h_separation` | ``4`` | +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`icon_max_width` | ``0`` | + +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`item_margin` | ``16`` | +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`outline_size` | ``0`` | @@ -225,6 +233,18 @@ Theme Properties +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`scroll_speed` | ``12`` | +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`scrollbar_h_separation` | ``4`` | + +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`scrollbar_margin_bottom` | ``-1`` | + +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`scrollbar_margin_left` | ``-1`` | + +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`scrollbar_margin_right` | ``-1`` | + +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`scrollbar_margin_top` | ``-1`` | + +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ + | :ref:`int` | :ref:`scrollbar_v_separation` | ``4`` | + +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`int` | :ref:`v_separation` | ``4`` | +-----------------------------------+------------------------------------------------------------------------------------------+-----------------------------------+ | :ref:`Font` | :ref:`font` | | @@ -589,6 +609,23 @@ If ``true``, a right mouse button click can select items. ---- +.. _class_Tree_property_allow_search: + +.. rst-class:: classref-property + +:ref:`bool` **allow_search** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_allow_search** **(** :ref:`bool` value **)** +- :ref:`bool` **get_allow_search** **(** **)** + +If ``true``, allows navigating the **Tree** with letter keys through incremental search. + +.. rst-class:: classref-item-separator + +---- + .. _class_Tree_property_column_titles_visible: .. rst-class:: classref-property @@ -793,9 +830,13 @@ Deselects all tree items (rows and columns). In :ref:`SELECT_MULTI` **edit_selected** **(** **)** +:ref:`bool` **edit_selected** **(** :ref:`bool` force_edit=false **)** -Edits the selected tree item as if it was clicked. The item must be set editable with :ref:`TreeItem.set_editable`. Returns ``true`` if the item could be edited. Fails if no item is selected. +Edits the selected tree item as if it was clicked. + +Either the item must be set editable with :ref:`TreeItem.set_editable` or ``force_edit`` must be ``true``. + +Returns ``true`` if the item could be edited. Fails if no item is selected. .. rst-class:: classref-item-separator @@ -865,6 +906,18 @@ Returns the column's title. ---- +.. _class_Tree_method_get_column_title_alignment: + +.. rst-class:: classref-method + +:ref:`HorizontalAlignment` **get_column_title_alignment** **(** :ref:`int` column **)** |const| + +Returns the column title alignment. + +.. rst-class:: classref-item-separator + +---- + .. _class_Tree_method_get_column_title_direction: .. rst-class:: classref-method @@ -1180,6 +1233,18 @@ Sets the title of a column. ---- +.. _class_Tree_method_set_column_title_alignment: + +.. rst-class:: classref-method + +void **set_column_title_alignment** **(** :ref:`int` column, :ref:`HorizontalAlignment` title_alignment **)** + +Sets the column title alignment. Note that :ref:`@GlobalScope.HORIZONTAL_ALIGNMENT_FILL` is not supported for column titles. + +.. rst-class:: classref-item-separator + +---- + .. _class_Tree_method_set_column_title_direction: .. rst-class:: classref-method @@ -1401,6 +1466,18 @@ The horizontal space between item cells. This is also used as the margin at the ---- +.. _class_Tree_theme_constant_icon_max_width: + +.. rst-class:: classref-themeproperty + +:ref:`int` **icon_max_width** = ``0`` + +The maximum allowed width of the icon in item's cells. This limit is applied on top of the default size of the icon, but before the value set with :ref:`TreeItem.set_icon_max_width`. The height is adjusted according to the icon's ratio. + +.. rst-class:: classref-item-separator + +---- + .. _class_Tree_theme_constant_item_margin: .. rst-class:: classref-themeproperty @@ -1487,6 +1564,78 @@ The speed of border scrolling. ---- +.. _class_Tree_theme_constant_scrollbar_h_separation: + +.. rst-class:: classref-themeproperty + +:ref:`int` **scrollbar_h_separation** = ``4`` + +The horizontal separation of tree content and scrollbar. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Tree_theme_constant_scrollbar_margin_bottom: + +.. rst-class:: classref-themeproperty + +:ref:`int` **scrollbar_margin_bottom** = ``-1`` + +The bottom margin of the scrollbars. When negative, uses :ref:`panel` bottom margin. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Tree_theme_constant_scrollbar_margin_left: + +.. rst-class:: classref-themeproperty + +:ref:`int` **scrollbar_margin_left** = ``-1`` + +The left margin of the horizontal scrollbar. When negative, uses :ref:`panel` left margin. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Tree_theme_constant_scrollbar_margin_right: + +.. rst-class:: classref-themeproperty + +:ref:`int` **scrollbar_margin_right** = ``-1`` + +The right margin of the scrollbars. When negative, uses :ref:`panel` right margin. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Tree_theme_constant_scrollbar_margin_top: + +.. rst-class:: classref-themeproperty + +:ref:`int` **scrollbar_margin_top** = ``-1`` + +The right margin of the vertical scrollbar. When negative, uses :ref:`panel` top margin. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Tree_theme_constant_scrollbar_v_separation: + +.. rst-class:: classref-themeproperty + +:ref:`int` **scrollbar_v_separation** = ``4`` + +The vertical separation of tree content and scrollbar. + +.. rst-class:: classref-item-separator + +---- + .. _class_Tree_theme_constant_v_separation: .. rst-class:: classref-themeproperty diff --git a/classes/class_treeitem.rst b/classes/class_treeitem.rst index 70745b6752b..3702f91b179 100644 --- a/classes/class_treeitem.rst +++ b/classes/class_treeitem.rst @@ -110,12 +110,16 @@ Methods +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TreeItem` | :ref:`get_next` **(** **)** |const| | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`get_next_in_tree` **(** :ref:`bool` wrap=false **)** | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TreeItem` | :ref:`get_next_visible` **(** :ref:`bool` wrap=false **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TreeItem` | :ref:`get_parent` **(** **)** |const| | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TreeItem` | :ref:`get_prev` **(** **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`TreeItem` | :ref:`get_prev_in_tree` **(** :ref:`bool` wrap=false **)** | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TreeItem` | :ref:`get_prev_visible` **(** :ref:`bool` wrap=false **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_range` **(** :ref:`int` column **)** |const| | @@ -146,6 +150,8 @@ Methods +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_custom_set_as_button` **(** :ref:`int` column **)** |const| | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_edit_multiline` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_editable` **(** :ref:`int` column **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_indeterminate` **(** :ref:`int` column **)** |const| | @@ -188,6 +194,8 @@ Methods +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_custom_font_size` **(** :ref:`int` column, :ref:`int` font_size **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_edit_multiline` **(** :ref:`int` column, :ref:`bool` multiline **)** | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_editable` **(** :ref:`int` column, :ref:`bool` enabled **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_expand_right` **(** :ref:`int` column, :ref:`bool` enable **)** | @@ -654,7 +662,7 @@ Returns the given column's icon :ref:`Texture2D`. Error if no i :ref:`int` **get_icon_max_width** **(** :ref:`int` column **)** |const| -Returns the column's icon's maximum width. +Returns the maximum allowed width of the icon in the given ``column``. .. rst-class:: classref-item-separator @@ -732,13 +740,27 @@ Returns the next sibling TreeItem in the tree or a null object if there is none. ---- +.. _class_TreeItem_method_get_next_in_tree: + +.. rst-class:: classref-method + +:ref:`TreeItem` **get_next_in_tree** **(** :ref:`bool` wrap=false **)** + +Returns the next TreeItem in the tree (in the context of a depth-first search) or a ``null`` object if there is none. + +If ``wrap`` is enabled, the method will wrap around to the first element in the tree when called on the last element, otherwise it returns ``null``. + +.. rst-class:: classref-item-separator + +---- + .. _class_TreeItem_method_get_next_visible: .. rst-class:: classref-method :ref:`TreeItem` **get_next_visible** **(** :ref:`bool` wrap=false **)** -Returns the next visible sibling TreeItem in the tree or a null object if there is none. +Returns the next visible TreeItem in the tree (in the context of a depth-first search) or a ``null`` object if there is none. If ``wrap`` is enabled, the method will wrap around to the first visible element in the tree when called on the last visible element, otherwise it returns ``null``. @@ -770,13 +792,27 @@ Returns the previous sibling TreeItem in the tree or a null object if there is n ---- +.. _class_TreeItem_method_get_prev_in_tree: + +.. rst-class:: classref-method + +:ref:`TreeItem` **get_prev_in_tree** **(** :ref:`bool` wrap=false **)** + +Returns the previous TreeItem in the tree (in the context of a depth-first search) or a ``null`` object if there is none. + +If ``wrap`` is enabled, the method will wrap around to the last element in the tree when called on the first visible element, otherwise it returns ``null``. + +.. rst-class:: classref-item-separator + +---- + .. _class_TreeItem_method_get_prev_visible: .. rst-class:: classref-method :ref:`TreeItem` **get_prev_visible** **(** :ref:`bool` wrap=false **)** -Returns the previous visible sibling TreeItem in the tree or a null object if there is none. +Returns the previous visible sibling TreeItem in the tree (in the context of a depth-first search) or a ``null`` object if there is none. If ``wrap`` is enabled, the method will wrap around to the last visible element in the tree when called on the first visible element, otherwise it returns ``null``. @@ -960,6 +996,18 @@ Returns ``true`` if the given ``column`` is checked. ---- +.. _class_TreeItem_method_is_edit_multiline: + +.. rst-class:: classref-method + +:ref:`bool` **is_edit_multiline** **(** :ref:`int` column **)** |const| + +Returns ``true`` if the given ``column`` is multiline editable. + +.. rst-class:: classref-item-separator + +---- + .. _class_TreeItem_method_is_editable: .. rst-class:: classref-method @@ -1126,7 +1174,7 @@ Sets the given column's cell mode to ``mode``. See :ref:`TreeCellMode` column, :ref:`bool` checked **)** -If ``true``, the given ``column`` is checked. Clears column's indeterminate status. +If ``checked`` is ``true``, the given ``column`` is checked. Clears column's indeterminate status. .. rst-class:: classref-item-separator @@ -1220,13 +1268,27 @@ Sets custom font size used to draw text in the given ``column``. ---- +.. _class_TreeItem_method_set_edit_multiline: + +.. rst-class:: classref-method + +void **set_edit_multiline** **(** :ref:`int` column, :ref:`bool` multiline **)** + +If ``multiline`` is ``true``, the given ``column`` is multiline editable. + +\ **Note:** This option only affects the type of control (:ref:`LineEdit` or :ref:`TextEdit`) that appears when editing the column. You can set multiline values with :ref:`set_text` even if the column is not multiline editable. + +.. rst-class:: classref-item-separator + +---- + .. _class_TreeItem_method_set_editable: .. rst-class:: classref-method void **set_editable** **(** :ref:`int` column, :ref:`bool` enabled **)** -If ``true``, the given ``column`` is editable. +If ``enabled`` is ``true``, the given ``column`` is editable. .. rst-class:: classref-item-separator @@ -1238,7 +1300,7 @@ If ``true``, the given ``column`` is editable. void **set_expand_right** **(** :ref:`int` column, :ref:`bool` enable **)** -If ``true``, the given ``column`` is expanded to the right. +If ``enable`` is ``true``, the given ``column`` is expanded to the right. .. rst-class:: classref-item-separator @@ -1262,7 +1324,7 @@ Sets the given column's icon :ref:`Texture2D`. void **set_icon_max_width** **(** :ref:`int` column, :ref:`int` width **)** -Sets the given column's icon's maximum width. +Sets the maximum allowed width of the icon in the given ``column``. This limit is applied on top of the default size of the icon and on top of :ref:`Tree.icon_max_width`. The height is adjusted according to the icon's ratio. .. rst-class:: classref-item-separator @@ -1298,7 +1360,7 @@ Sets the given column's icon's texture region. void **set_indeterminate** **(** :ref:`int` column, :ref:`bool` indeterminate **)** -If ``true``, the given ``column`` is marked ``indeterminate``. +If ``indeterminate`` is ``true``, the given ``column`` is marked indeterminate. \ **Note:** If set ``true`` from ``false``, then column is cleared of checked status. @@ -1362,7 +1424,7 @@ If ``expr`` is ``true``, the edit mode slider will use an exponential scale as w void **set_selectable** **(** :ref:`int` column, :ref:`bool` selectable **)** -If ``true``, the given column is selectable. +If ``selectable`` is ``true``, the given ``column`` is selectable. .. rst-class:: classref-item-separator diff --git a/classes/class_tubetrailmesh.rst b/classes/class_tubetrailmesh.rst index 89d0d65c151..6a5f056c960 100644 --- a/classes/class_tubetrailmesh.rst +++ b/classes/class_tubetrailmesh.rst @@ -12,9 +12,25 @@ TubeTrailMesh **Inherits:** :ref:`PrimitiveMesh` **<** :ref:`Mesh` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -.. container:: contribute +Represents a straight tube-shaped :ref:`PrimitiveMesh` with variable width. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +**TubeTrailMesh** represents a straight tube-shaped mesh with variable width. The tube is composed of a number of cylindrical sections, each with the same :ref:`section_length` and number of :ref:`section_rings`. A :ref:`curve` is sampled along the total length of the tube, meaning that the curve determines the radius of the tube along its length. + +This primitive mesh is usually used for particle trails. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`3D Particle trails <../tutorials/3d/particles/trails>` + +- :doc:`Particle systems (3D) <../tutorials/3d/particles/index>` .. rst-class:: classref-reftable-group @@ -96,9 +112,7 @@ If ``true``, generates a cap at the top of the tube. This can be set to ``false` - void **set_curve** **(** :ref:`Curve` value **)** - :ref:`Curve` **get_curve** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Determines the radius of the tube along its length. The radius of a particular section ring is obtained by multiplying the baseline :ref:`radius` by the value of this curve at the given distance. For values smaller than ``0``, the faces will be inverted. .. rst-class:: classref-item-separator @@ -115,9 +129,7 @@ If ``true``, generates a cap at the top of the tube. This can be set to ``false` - void **set_radial_steps** **(** :ref:`int` value **)** - :ref:`int` **get_radial_steps** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of sides on the tube. For example, a value of ``5`` means the tube will be pentagonal. Higher values result in a more detailed tube at the cost of performance. .. rst-class:: classref-item-separator @@ -134,9 +146,7 @@ If ``true``, generates a cap at the top of the tube. This can be set to ``false` - void **set_radius** **(** :ref:`float` value **)** - :ref:`float` **get_radius** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The baseline radius of the tube. The radius of a particular section ring is obtained by multiplying this radius by the value of the :ref:`curve` at the given distance. .. rst-class:: classref-item-separator @@ -153,9 +163,7 @@ If ``true``, generates a cap at the top of the tube. This can be set to ``false` - void **set_section_length** **(** :ref:`float` value **)** - :ref:`float` **get_section_length** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The length of a section of the tube. .. rst-class:: classref-item-separator @@ -172,9 +180,7 @@ If ``true``, generates a cap at the top of the tube. This can be set to ``false` - void **set_section_rings** **(** :ref:`int` value **)** - :ref:`int` **get_section_rings** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The number of rings in a section. The :ref:`curve` is sampled on each ring to determine its radius. Higher values result in a more detailed tube at the cost of performance. .. rst-class:: classref-item-separator @@ -191,9 +197,7 @@ If ``true``, generates a cap at the top of the tube. This can be set to ``false` - void **set_sections** **(** :ref:`int` value **)** - :ref:`int` **get_sections** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The total number of sections on the tube. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_tween.rst b/classes/class_tween.rst index cc7d2259b0c..00129301fa3 100644 --- a/classes/class_tween.rst +++ b/classes/class_tween.rst @@ -141,9 +141,9 @@ Some :ref:`Tweener`\ s use transitions and eases. The first accep \ `Tween easing and transition types cheatsheet `__\ -\ **Note:** All **Tween**\ s will automatically start by default. To prevent a **Tween** from autostarting, you can call :ref:`stop` immediately after it is created. +\ **Note:** Tweens are not designed to be re-used and trying to do so results in an undefined behavior. Create a new Tween for each animation and every time you replay an animation from start. Keep in mind that Tweens start immediately, so only create a Tween when you want to start animating. -\ **Note:** **Tween**\ s are processing after all of nodes in the current frame, i.e. after :ref:`Node._process` or :ref:`Node._physics_process` (depending on :ref:`TweenProcessMode`). +\ **Note:** Tweens are processing after all of nodes in the current frame, i.e. after :ref:`Node._process` or :ref:`Node._physics_process` (depending on :ref:`TweenProcessMode`). .. rst-class:: classref-reftable-group @@ -160,6 +160,8 @@ Methods +-----------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`custom_step` **(** :ref:`float` delta **)** | +-----------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_loops_left` **(** **)** |const| | + +-----------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`get_total_elapsed_time` **(** **)** |const| | +-----------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Variant` | :ref:`interpolate_value` **(** :ref:`Variant` initial_value, :ref:`Variant` delta_value, :ref:`float` elapsed_time, :ref:`float` duration, :ref:`TransitionType` trans_type, :ref:`EaseType` ease_type **)** |static| | @@ -218,8 +220,6 @@ Signals Emitted when the **Tween** has finished all tweening. Never emitted when the **Tween** is set to infinite looping (see :ref:`set_loops`). -\ **Note:** The **Tween** is removed (invalidated) in the next processing frame after this signal is emitted. Calling :ref:`stop` inside the signal callback will prevent the **Tween** from being removed. - .. rst-class:: classref-item-separator ---- @@ -513,7 +513,17 @@ Processes the **Tween** by the given ``delta`` value, in seconds. This is mostly Returns ``true`` if the **Tween** still has :ref:`Tweener`\ s that haven't finished. -\ **Note:** The **Tween** will become invalid in the next processing frame after its animation finishes. Calling :ref:`stop` after performing :ref:`custom_step` instead keeps and resets the **Tween**. +.. rst-class:: classref-item-separator + +---- + +.. _class_Tween_method_get_loops_left: + +.. rst-class:: classref-method + +:ref:`int` **get_loops_left** **(** **)** |const| + +Returns the number of remaining loops for this **Tween** (see :ref:`set_loops`). A return value of ``-1`` indicates an infinitely looping **Tween**, and a return value of ``0`` indicates that the **Tween** has already finished. .. rst-class:: classref-item-separator diff --git a/classes/class_udpserver.rst b/classes/class_udpserver.rst index 17eadf9f752..459cf35bbba 100644 --- a/classes/class_udpserver.rst +++ b/classes/class_udpserver.rst @@ -43,7 +43,7 @@ Below a small example of how it can be used: func _process(delta): server.poll() # Important! if server.is_connection_available(): - var peer : PacketPeerUDP = server.take_connection() + var peer: PacketPeerUDP = server.take_connection() var packet = peer.get_packet() print("Accepted peer: %s:%s" % [peer.get_packet_ip(), peer.get_packet_port()]) print("Received data: %s" % [packet.get_string_from_utf8()]) @@ -112,7 +112,7 @@ Below a small example of how it can be used: func _process(delta): if !connected: # Try to contact server - udp.put_packet("The answer is... 42!".to_utf8()) + udp.put_packet("The answer is... 42!".to_utf8_buffer()) if udp.get_available_packet_count() > 0: print("Connected: %s" % udp.get_packet().get_string_from_utf8()) connected = true @@ -137,7 +137,7 @@ Below a small example of how it can be used: if (!_connected) { // Try to contact server - _udp.PutPacket("The Answer Is..42!".ToUtf8()); + _udp.PutPacket("The Answer Is..42!".ToUtf8Buffer()); } if (_udp.GetAvailablePacketCount() > 0) { diff --git a/classes/class_undoredo.rst b/classes/class_undoredo.rst index e9e64bad8ee..36dd14b8e0d 100644 --- a/classes/class_undoredo.rst +++ b/classes/class_undoredo.rst @@ -12,25 +12,25 @@ UndoRedo **Inherits:** :ref:`Object` -Helper to manage undo/redo operations in the editor or custom tools. +General-purpose helper to manage undo/redo operations. .. rst-class:: classref-introduction-group Description ----------- -Helper to manage undo/redo operations in the editor or custom tools. It works by registering methods and property changes inside "actions". +UndoRedo works by registering methods and property changes inside "actions". Common behavior is to create an action, then add do/undo calls to functions or property changes, then committing the action. -Here's an example on how to add an action to the Godot editor's own **UndoRedo**, from a plugin: +Here's an example on how to add an UndoRedo action: .. tabs:: .. code-tab:: gdscript - var undo_redo = get_undo_redo() # Method of EditorPlugin. + var undo_redo = UndoRedo.new() func do_something(): pass # Put your code here. @@ -41,8 +41,8 @@ Here's an example on how to add an action to the Godot editor's own **UndoRedo** func _on_my_button_pressed(): var node = get_node("MyNode2D") undo_redo.create_action("Move the node") - undo_redo.add_do_method(self, "do_something") - undo_redo.add_undo_method(self, "undo_something") + undo_redo.add_do_method(do_something) + undo_redo.add_undo_method(undo_something) undo_redo.add_do_property(node, "position", Vector2(100,100)) undo_redo.add_undo_property(node, "position", node.position) undo_redo.commit_action() @@ -53,7 +53,7 @@ Here's an example on how to add an action to the Godot editor's own **UndoRedo** public override void _Ready() { - _undoRedo = GetUndoRedo(); // Method of EditorPlugin. + _undoRedo = new UndoRedo(); } public void DoSomething() @@ -83,6 +83,8 @@ Here's an example on how to add an action to the Godot editor's own **UndoRedo** If you don't need to register a method, you can leave :ref:`add_do_method` and :ref:`add_undo_method` out; the same goes for properties. You can also register more than one method/property. +If you are making an :ref:`EditorPlugin` and want to integrate into the editor's undo history, use :ref:`EditorUndoRedoManager` instead. + .. rst-class:: classref-reftable-group Methods @@ -232,6 +234,15 @@ void **add_do_reference** **(** :ref:`Object` object **)** Register a reference for "do" that will be erased if the "do" history is lost. This is useful mostly for new nodes created for the "do" call. Do not use for resources. +:: + + var node = Node2D.new() + undo_redo.create_action("Add node") + undo_redo.add_do_method(add_child.bind(node)) + undo_redo.add_do_reference(node) + undo_redo.add_undo_method(remove_child.bind(node)) + undo_redo.commit_action() + .. rst-class:: classref-item-separator ---- @@ -268,6 +279,15 @@ void **add_undo_reference** **(** :ref:`Object` object **)** Register a reference for "undo" that will be erased if the "undo" history is lost. This is useful mostly for nodes removed with the "do" call (not the "undo" call!). +:: + + var node = $Node2D + undo_redo.create_action("Remove node") + undo_redo.add_do_method(remove_child.bind(node)) + undo_redo.add_undo_method(add_child.bind(node)) + undo_redo.add_undo_reference(node) + undo_redo.commit_action() + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_upnp.rst b/classes/class_upnp.rst index 3ad092e4ea3..16b9a031023 100644 --- a/classes/class_upnp.rst +++ b/classes/class_upnp.rst @@ -463,11 +463,11 @@ Adds the given :ref:`UPNPDevice` to the list of discovered dev :ref:`int` **add_port_mapping** **(** :ref:`int` port, :ref:`int` port_internal=0, :ref:`String` desc="", :ref:`String` proto="UDP", :ref:`int` duration=0 **)** |const| -Adds a mapping to forward the external ``port`` (between 1 and 65535, although recommended to use port 1024 or above) on the default gateway (see :ref:`get_gateway`) to the ``internal_port`` on the local machine for the given protocol ``proto`` (either ``"TCP"`` or ``"UDP"``, with UDP being the default). If a port mapping for the given port and protocol combination already exists on that gateway device, this method tries to overwrite it. If that is not desired, you can retrieve the gateway manually with :ref:`get_gateway` and call :ref:`add_port_mapping` on it, if any. Note that forwarding a well-known port (below 1024) with UPnP may fail depending on the device. +Adds a mapping to forward the external ``port`` (between 1 and 65535, although recommended to use port 1024 or above) on the default gateway (see :ref:`get_gateway`) to the ``port_internal`` on the local machine for the given protocol ``proto`` (either ``"TCP"`` or ``"UDP"``, with UDP being the default). If a port mapping for the given port and protocol combination already exists on that gateway device, this method tries to overwrite it. If that is not desired, you can retrieve the gateway manually with :ref:`get_gateway` and call :ref:`add_port_mapping` on it, if any. Note that forwarding a well-known port (below 1024) with UPnP may fail depending on the device. Depending on the gateway device, if a mapping for that port already exists, it will either be updated or it will refuse this command due to that conflict, especially if the existing mapping for that port wasn't created via UPnP or points to a different network address (or device) than this one. -If ``internal_port`` is ``0`` (the default), the same port number is used for both the external and the internal port (the ``port`` value). +If ``port_internal`` is ``0`` (the default), the same port number is used for both the external and the internal port (the ``port`` value). The description (``desc``) is shown in some routers management UIs and can be used to point out which application added the mapping. diff --git a/classes/class_vector2.rst b/classes/class_vector2.rst index f9318884da8..b501d9c4b35 100644 --- a/classes/class_vector2.rst +++ b/classes/class_vector2.rst @@ -534,7 +534,7 @@ This is the signed area of the parallelogram formed by the two vectors. If the s :ref:`Vector2` **cubic_interpolate** **(** :ref:`Vector2` b, :ref:`Vector2` pre_a, :ref:`Vector2` post_b, :ref:`float` weight **)** |const| -Cubically interpolates between this vector and ``b`` using ``pre_a`` and ``post_b`` as handles, and returns the result at position ``weight``. ``weight`` is on the range of 0.0 to 1.0, representing the amount of interpolation. +Performs a cubic interpolation between this vector and ``b`` using ``pre_a`` and ``post_b`` as handles, and returns the result at position ``weight``. ``weight`` is on the range of 0.0 to 1.0, representing the amount of interpolation. .. rst-class:: classref-item-separator @@ -546,7 +546,7 @@ Cubically interpolates between this vector and ``b`` using ``pre_a`` and ``post_ :ref:`Vector2` **cubic_interpolate_in_time** **(** :ref:`Vector2` b, :ref:`Vector2` pre_a, :ref:`Vector2` post_b, :ref:`float` weight, :ref:`float` b_t, :ref:`float` pre_a_t, :ref:`float` post_b_t **)** |const| -Cubically interpolates between this vector and ``b`` using ``pre_a`` and ``post_b`` as handles, and returns the result at position ``weight``. ``weight`` is on the range of 0.0 to 1.0, representing the amount of interpolation. +Performs a cubic interpolation between this vector and ``b`` using ``pre_a`` and ``post_b`` as handles, and returns the result at position ``weight``. ``weight`` is on the range of 0.0 to 1.0, representing the amount of interpolation. It can perform smoother interpolation than ``cubic_interpolate()`` by the time values. @@ -646,7 +646,7 @@ Creates a unit **Vector2** rotated to the given ``angle`` in radians. This is eq :ref:`bool` **is_equal_approx** **(** :ref:`Vector2` to **)** |const| -Returns ``true`` if this vector and ``v`` are approximately equal, by running :ref:`@GlobalScope.is_equal_approx` on each component. +Returns ``true`` if this vector and ``to`` are approximately equal, by running :ref:`@GlobalScope.is_equal_approx` on each component. .. rst-class:: classref-item-separator @@ -670,7 +670,7 @@ Returns ``true`` if this vector is finite, by calling :ref:`@GlobalScope.is_fini :ref:`bool` **is_normalized** **(** **)** |const| -Returns ``true`` if the vector is normalized, ``false`` otherwise. +Returns ``true`` if the vector is normalized, i.e. its length is approximately equal to 1. .. rst-class:: classref-item-separator @@ -722,7 +722,7 @@ This method runs faster than :ref:`length`, so pref :ref:`Vector2` **lerp** **(** :ref:`Vector2` to, :ref:`float` weight **)** |const| -Returns the result of the linear interpolation between this vector and ``to`` by amount ``weight``. ``weight`` is on the range of 0.0 to 1.0, representing the amount of interpolation. +Returns the result of the linear interpolation between this vector and ``to`` by amount ``weight``. ``weight`` is on the range of ``0.0`` to ``1.0``, representing the amount of interpolation. .. rst-class:: classref-item-separator @@ -782,7 +782,9 @@ Returns a new vector moved toward ``to`` by the fixed ``delta`` amount. Will not :ref:`Vector2` **normalized** **(** **)** |const| -Returns a new vector scaled to unit length. Equivalent to ``v / v.length()``. +Returns the result of scaling the vector to unit length. Equivalent to ``v / v.length()``. See also :ref:`is_normalized`. + +\ **Note:** This function may return incorrect values if the input vector length is near zero. .. rst-class:: classref-item-separator diff --git a/classes/class_vector2i.rst b/classes/class_vector2i.rst index 0d0fcf28b7c..8808d0408a6 100644 --- a/classes/class_vector2i.rst +++ b/classes/class_vector2i.rst @@ -279,7 +279,7 @@ Constructs a **Vector2i** as a copy of the given **Vector2i**. :ref:`Vector2i` **Vector2i** **(** :ref:`Vector2` from **)** -Constructs a new **Vector2i** from :ref:`Vector2`. The floating point coordinates will be truncated. +Constructs a new **Vector2i** from the given :ref:`Vector2` by truncating components' fractional parts (rounding towards zero). For a different behavior consider passing the result of :ref:`Vector2.ceil`, :ref:`Vector2.floor` or :ref:`Vector2.round` to this constructor instead. .. rst-class:: classref-item-separator @@ -449,7 +449,7 @@ Gets the remainder of each component of the **Vector2i** with the components of :ref:`Vector2i` **operator %** **(** :ref:`int` right **)** -Gets the remainder of each component of the **Vector2i** with the the given :ref:`int`. This operation uses truncated division, which is often not desired as it does not work well with negative numbers. Consider using :ref:`@GlobalScope.posmod` instead if you want to handle negative numbers. +Gets the remainder of each component of the **Vector2i** with the given :ref:`int`. This operation uses truncated division, which is often not desired as it does not work well with negative numbers. Consider using :ref:`@GlobalScope.posmod` instead if you want to handle negative numbers. :: diff --git a/classes/class_vector3.rst b/classes/class_vector3.rst index 597dc8eeff7..6ff2f4fbac1 100644 --- a/classes/class_vector3.rst +++ b/classes/class_vector3.rst @@ -654,7 +654,7 @@ Returns ``true`` if this vector is finite, by calling :ref:`@GlobalScope.is_fini :ref:`bool` **is_normalized** **(** **)** |const| -Returns ``true`` if the vector is :ref:`normalized`, ``false`` otherwise. +Returns ``true`` if the vector is normalized, i.e. its length is approximately equal to 1. .. rst-class:: classref-item-separator @@ -706,7 +706,7 @@ This method runs faster than :ref:`length`, so pref :ref:`Vector3` **lerp** **(** :ref:`Vector3` to, :ref:`float` weight **)** |const| -Returns the result of the linear interpolation between this vector and ``to`` by amount ``weight``. ``weight`` is on the range of 0.0 to 1.0, representing the amount of interpolation. +Returns the result of the linear interpolation between this vector and ``to`` by amount ``weight``. ``weight`` is on the range of ``0.0`` to ``1.0``, representing the amount of interpolation. .. rst-class:: classref-item-separator @@ -766,7 +766,9 @@ Returns a new vector moved toward ``to`` by the fixed ``delta`` amount. Will not :ref:`Vector3` **normalized** **(** **)** |const| -Returns the vector scaled to unit length. Equivalent to ``v / v.length()``. See also :ref:`is_normalized`. +Returns the result of scaling the vector to unit length. Equivalent to ``v / v.length()``. See also :ref:`is_normalized`. + +\ **Note:** This function may return incorrect values if the input vector length is near zero. .. rst-class:: classref-item-separator diff --git a/classes/class_vector3i.rst b/classes/class_vector3i.rst index 15bb14d6552..8b346677ba1 100644 --- a/classes/class_vector3i.rst +++ b/classes/class_vector3i.rst @@ -315,7 +315,7 @@ Constructs a **Vector3i** as a copy of the given **Vector3i**. :ref:`Vector3i` **Vector3i** **(** :ref:`Vector3` from **)** -Constructs a new **Vector3i** from :ref:`Vector3`. The floating point coordinates will be truncated. +Constructs a new **Vector3i** from the given :ref:`Vector3` by truncating components' fractional parts (rounding towards zero). For a different behavior consider passing the result of :ref:`Vector3.ceil`, :ref:`Vector3.floor` or :ref:`Vector3.round` to this constructor instead. .. rst-class:: classref-item-separator @@ -473,7 +473,7 @@ Gets the remainder of each component of the **Vector3i** with the components of :ref:`Vector3i` **operator %** **(** :ref:`int` right **)** -Gets the remainder of each component of the **Vector3i** with the the given :ref:`int`. This operation uses truncated division, which is often not desired as it does not work well with negative numbers. Consider using :ref:`@GlobalScope.posmod` instead if you want to handle negative numbers. +Gets the remainder of each component of the **Vector3i** with the given :ref:`int`. This operation uses truncated division, which is often not desired as it does not work well with negative numbers. Consider using :ref:`@GlobalScope.posmod` instead if you want to handle negative numbers. :: diff --git a/classes/class_vector4.rst b/classes/class_vector4.rst index fe4bae2e1ed..e3d2ba106c0 100644 --- a/classes/class_vector4.rst +++ b/classes/class_vector4.rst @@ -92,7 +92,7 @@ Methods +-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector4` | :ref:`inverse` **(** **)** |const| | +-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_equal_approx` **(** :ref:`Vector4` with **)** |const| | + | :ref:`bool` | :ref:`is_equal_approx` **(** :ref:`Vector4` to **)** |const| | +-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_finite` **(** **)** |const| | +-------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -483,9 +483,9 @@ Returns the inverse of the vector. This is the same as ``Vector4(1.0 / v.x, 1.0 .. rst-class:: classref-method -:ref:`bool` **is_equal_approx** **(** :ref:`Vector4` with **)** |const| +:ref:`bool` **is_equal_approx** **(** :ref:`Vector4` to **)** |const| -Returns ``true`` if this vector and ``with`` are approximately equal, by running :ref:`@GlobalScope.is_equal_approx` on each component. +Returns ``true`` if this vector and ``to`` are approximately equal, by running :ref:`@GlobalScope.is_equal_approx` on each component. .. rst-class:: classref-item-separator @@ -509,7 +509,7 @@ Returns ``true`` if this vector is finite, by calling :ref:`@GlobalScope.is_fini :ref:`bool` **is_normalized** **(** **)** |const| -Returns ``true`` if the vector is normalized, i.e. its length is equal to 1. +Returns ``true`` if the vector is normalized, i.e. its length is approximately equal to 1. .. rst-class:: classref-item-separator @@ -547,7 +547,9 @@ Returns the length (magnitude) of this vector. :ref:`float` **length_squared** **(** **)** |const| -Returns the squared length (squared magnitude) of this vector. This method runs faster than :ref:`length`. +Returns the squared length (squared magnitude) of this vector. + +This method runs faster than :ref:`length`, so prefer it if you need to compare vectors or need the squared distance for some formula. .. rst-class:: classref-item-separator @@ -595,7 +597,9 @@ Returns the axis of the vector's lowest value. See ``AXIS_*`` constants. If all :ref:`Vector4` **normalized** **(** **)** |const| -Returns the result of scaling the vector to unit length. Equivalent to ``v / v.length()``. +Returns the result of scaling the vector to unit length. Equivalent to ``v / v.length()``. See also :ref:`is_normalized`. + +\ **Note:** This function may return incorrect values if the input vector length is near zero. .. rst-class:: classref-item-separator @@ -607,7 +611,7 @@ Returns the result of scaling the vector to unit length. Equivalent to ``v / v.l :ref:`Vector4` **posmod** **(** :ref:`float` mod **)** |const| -Returns a new vector composed of the :ref:`@GlobalScope.fposmod` of this vector's components and ``mod``. +Returns a vector composed of the :ref:`@GlobalScope.fposmod` of this vector's components and ``mod``. .. rst-class:: classref-item-separator @@ -619,7 +623,7 @@ Returns a new vector composed of the :ref:`@GlobalScope.fposmod` **posmodv** **(** :ref:`Vector4` modv **)** |const| -Returns a new vector composed of the :ref:`@GlobalScope.fposmod` of this vector's components and ``modv``'s components. +Returns a vector composed of the :ref:`@GlobalScope.fposmod` of this vector's components and ``modv``'s components. .. rst-class:: classref-item-separator diff --git a/classes/class_vector4i.rst b/classes/class_vector4i.rst index e21d5f01c0f..0ee3718498c 100644 --- a/classes/class_vector4i.rst +++ b/classes/class_vector4i.rst @@ -276,7 +276,7 @@ Constructs a **Vector4i** as a copy of the given **Vector4i**. :ref:`Vector4i` **Vector4i** **(** :ref:`Vector4` from **)** -Constructs a new **Vector4i** from the given :ref:`Vector4`. +Constructs a new **Vector4i** from the given :ref:`Vector4` by truncating components' fractional parts (rounding towards zero). For a different behavior consider passing the result of :ref:`Vector4.ceil`, :ref:`Vector4.floor` or :ref:`Vector4.round` to this constructor instead. .. rst-class:: classref-item-separator @@ -339,7 +339,9 @@ Returns the length (magnitude) of this vector. :ref:`int` **length_squared** **(** **)** |const| -Returns the squared length (squared magnitude) of this vector. This method runs faster than :ref:`length`. +Returns the squared length (squared magnitude) of this vector. + +This method runs faster than :ref:`length`, so prefer it if you need to compare vectors or need the squared distance for some formula. .. rst-class:: classref-item-separator diff --git a/classes/class_vehiclewheel3d.rst b/classes/class_vehiclewheel3d.rst index 01ffe2053dd..149963048b0 100644 --- a/classes/class_vehiclewheel3d.rst +++ b/classes/class_vehiclewheel3d.rst @@ -53,7 +53,7 @@ Properties +---------------------------+---------------------------------------------------------------------------------+------------+ | :ref:`float` | :ref:`suspension_stiffness` | ``5.88`` | +---------------------------+---------------------------------------------------------------------------------+------------+ - | :ref:`float` | :ref:`suspension_travel` | ``5.0`` | + | :ref:`float` | :ref:`suspension_travel` | ``0.2`` | +---------------------------+---------------------------------------------------------------------------------+------------+ | :ref:`bool` | :ref:`use_as_steering` | ``false`` | +---------------------------+---------------------------------------------------------------------------------+------------+ @@ -222,7 +222,7 @@ This value defines the stiffness of the suspension. Use a value lower than 50 fo .. rst-class:: classref-property -:ref:`float` **suspension_travel** = ``5.0`` +:ref:`float` **suspension_travel** = ``0.2`` .. rst-class:: classref-property-setget diff --git a/classes/class_viewport.rst b/classes/class_viewport.rst index f25fc29e902..c82b113608f 100644 --- a/classes/class_viewport.rst +++ b/classes/class_viewport.rst @@ -334,7 +334,7 @@ enum **Scaling3DMode**: :ref:`Scaling3DMode` **SCALING_3D_MODE_BILINEAR** = ``0`` -Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`scaling_3d_scale`. Values less then ``1.0`` will result in undersampling while values greater than ``1.0`` will result in supersampling. A value of ``1.0`` disables scaling. +Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`scaling_3d_scale`. Values less than ``1.0`` will result in undersampling while values greater than ``1.0`` will result in supersampling. A value of ``1.0`` disables scaling. .. _class_Viewport_constant_SCALING_3D_MODE_FSR: @@ -342,7 +342,7 @@ Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can be :ref:`Scaling3DMode` **SCALING_3D_MODE_FSR** = ``1`` -Use AMD FidelityFX Super Resolution 1.0 upscaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`scaling_3d_scale`. Values less then ``1.0`` will be result in the viewport being upscaled using FSR. Values greater than ``1.0`` are not supported and bilinear downsampling will be used instead. A value of ``1.0`` disables scaling. +Use AMD FidelityFX Super Resolution 1.0 upscaling for the viewport's 3D buffer. The amount of scaling can be set using :ref:`scaling_3d_scale`. Values less than ``1.0`` will be result in the viewport being upscaled using FSR. Values greater than ``1.0`` are not supported and bilinear downsampling will be used instead. A value of ``1.0`` disables scaling. .. _class_Viewport_constant_SCALING_3D_MODE_MAX: @@ -1199,7 +1199,7 @@ If ``true``, the GUI controls on the viewport will lay pixel perfectly. - void **set_handle_input_locally** **(** :ref:`bool` value **)** - :ref:`bool` **is_handling_input_locally** **(** **)** -If ``true``, this viewport will mark incoming input events as handled by itself. If ``false``, this is instead done by the the first parent viewport that is set to handle input locally. +If ``true``, this viewport will mark incoming input events as handled by itself. If ``false``, this is instead done by the first parent viewport that is set to handle input locally. A :ref:`SubViewportContainer` will automatically set this property to ``false`` for the **Viewport** contained inside of it. @@ -1328,9 +1328,7 @@ If ``true``, objects receive mouse picking events sorted primarily by their :ref - void **set_positional_shadow_atlas_16_bits** **(** :ref:`bool` value **)** - :ref:`bool` **get_positional_shadow_atlas_16_bits** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Use 16 bits for the omni/spot shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. .. rst-class:: classref-item-separator @@ -1415,9 +1413,9 @@ The subdivision amount of the fourth quadrant on the shadow atlas. - void **set_positional_shadow_atlas_size** **(** :ref:`int` value **)** - :ref:`int` **get_positional_shadow_atlas_size** **(** **)** -The shadow atlas' resolution (used for omni and spot lights). The value will be rounded up to the nearest power of 2. +The shadow atlas' resolution (used for omni and spot lights). The value is rounded up to the nearest power of 2. -\ **Note:** If this is set to ``0``, no shadows will be visible at all (including directional shadows). +\ **Note:** If this is set to ``0``, no positional shadows will be visible at all. This can improve performance significantly on low-end systems by reducing both the CPU and GPU load (as fewer draw calls are needed to draw the scene without shadows). .. rst-class:: classref-item-separator @@ -1860,9 +1858,7 @@ Returns the :ref:`PositionalShadowAtlasQuadrantSubdiv` **get_render_info** **(** :ref:`RenderInfoType` type, :ref:`RenderInfo` info **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns rendering statistics of the given type. See :ref:`RenderInfoType` and :ref:`RenderInfo` for options. .. rst-class:: classref-item-separator @@ -2020,8 +2016,16 @@ Calling this method will propagate calls to child nodes for following methods in - :ref:`Control._gui_input` for :ref:`Control` nodes +- :ref:`Node._shortcut_input`\ + +- :ref:`Node._unhandled_input`\ + +- :ref:`Node._unhandled_key_input`\ + If an earlier method marks the input as handled via :ref:`set_input_as_handled`, any later method in this list will not be called. +If none of the methods handle the event and :ref:`physics_object_picking` is ``true``, the event is used for physics object picking. + .. rst-class:: classref-item-separator ---- @@ -2032,9 +2036,7 @@ If an earlier method marks the input as handled via :ref:`set_input_as_handled` text **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Helper method which calls the ``set_text()`` method on the currently focused :ref:`Control`, provided that it is defined (e.g. if the focused Control is :ref:`Button` or :ref:`LineEdit`). .. rst-class:: classref-item-separator @@ -2088,6 +2090,8 @@ void **set_input_as_handled** **(** **)** Stops the input from propagating further down the :ref:`SceneTree`. +\ **Note:** This does not affect the methods in :ref:`Input`, only the way events are propagated. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_viewporttexture.rst b/classes/class_viewporttexture.rst index 129310701ad..cdacc5f0684 100644 --- a/classes/class_viewporttexture.rst +++ b/classes/class_viewporttexture.rst @@ -23,7 +23,7 @@ Displays the content of a :ref:`Viewport` node as a dynamic :ref To create a ViewportTexture in code, use the :ref:`Viewport.get_texture` method on the target viewport. -\ **Note:** When local to scene, this texture uses :ref:`Resource.setup_local_to_scene` to set the proxy texture and flags in the local viewport. +\ **Note:** When local to scene, this texture uses :ref:`Resource.setup_local_to_scene` to set the proxy texture and flags in the local viewport. Local to scene viewport textures will return incorrect data until the scene root is ready (see :ref:`Node.ready`). .. rst-class:: classref-introduction-group @@ -72,6 +72,8 @@ Property Descriptions The path to the :ref:`Viewport` node to display. This is relative to the scene root, not to the node which uses the texture. +\ **Note:** In the editor, it is automatically updated when the target viewport's node path changes due to renaming or moving the viewport or its ancestors. At runtime, it may not be able to automatically update due to the inability to determine the scene root. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/classes/class_visualinstance3d.rst b/classes/class_visualinstance3d.rst index ee90f213e24..ef104aa9312 100644 --- a/classes/class_visualinstance3d.rst +++ b/classes/class_visualinstance3d.rst @@ -85,7 +85,7 @@ Property Descriptions The render layer(s) this **VisualInstance3D** is drawn on. -This object will only be visible for :ref:`Camera3D`\ s whose cull mask includes the render object this **VisualInstance3D** is set to. +This object will only be visible for :ref:`Camera3D`\ s whose cull mask includes any of the render layers this **VisualInstance3D** is set to. For :ref:`Light3D`\ s, this can be used to control which **VisualInstance3D**\ s are affected by a specific light. For :ref:`GPUParticles3D`, this can be used to control which particles are effected by a specific attractor. For :ref:`Decal`\ s, this can be used to control which **VisualInstance3D**\ s are affected by a specific decal. diff --git a/classes/class_visualshadernodetextureparameter.rst b/classes/class_visualshadernodetextureparameter.rst index f146ef8fd4d..eef8bbedb52 100644 --- a/classes/class_visualshadernodetextureparameter.rst +++ b/classes/class_visualshadernodetextureparameter.rst @@ -381,7 +381,7 @@ Sets the texture repeating mode. See :ref:`TextureRepeat` value **)** - :ref:`TextureSource` **get_texture_source** **(** **)** -Sets the texture source mode. Used for reading from the screen, depth, or normal_roughness texture. see :ref:`TextureSource` for options. +Sets the texture source mode. Used for reading from the screen, depth, or normal_roughness texture. See :ref:`TextureSource` for options. .. rst-class:: classref-item-separator diff --git a/classes/class_vslider.rst b/classes/class_vslider.rst index bfa079f579a..ed682e60acf 100644 --- a/classes/class_vslider.rst +++ b/classes/class_vslider.rst @@ -45,6 +45,8 @@ Theme Properties .. table:: :widths: auto + +-----------------------------------+---------------------------------------------------------------------------------+-------+ + | :ref:`int` | :ref:`center_grabber` | ``0`` | +-----------------------------------+---------------------------------------------------------------------------------+-------+ | :ref:`int` | :ref:`grabber_offset` | ``0`` | +-----------------------------------+---------------------------------------------------------------------------------+-------+ @@ -72,6 +74,18 @@ Theme Properties Theme Property Descriptions --------------------------- +.. _class_VSlider_theme_constant_center_grabber: + +.. rst-class:: classref-themeproperty + +:ref:`int` **center_grabber** = ``0`` + +Boolean constant. If ``1``, the grabber texture size will be ignored and it will fit within slider's bounds based only on its center position. + +.. rst-class:: classref-item-separator + +---- + .. _class_VSlider_theme_constant_grabber_offset: .. rst-class:: classref-themeproperty diff --git a/classes/class_webrtcmultiplayerpeer.rst b/classes/class_webrtcmultiplayerpeer.rst index eee4f3e7ab2..1df42307215 100644 --- a/classes/class_webrtcmultiplayerpeer.rst +++ b/classes/class_webrtcmultiplayerpeer.rst @@ -70,7 +70,7 @@ Method Descriptions Add a new peer to the mesh with the given ``peer_id``. The :ref:`WebRTCPeerConnection` must be in state :ref:`WebRTCPeerConnection.STATE_NEW`. -Three channels will be created for reliable, unreliable, and ordered transport. The value of ``unreliable_lifetime`` will be passed to the ``maxPacketLifetime`` option when creating unreliable and ordered channels (see :ref:`WebRTCPeerConnection.create_data_channel`). +Three channels will be created for reliable, unreliable, and ordered transport. The value of ``unreliable_lifetime`` will be passed to the ``"maxPacketLifetime"`` option when creating unreliable and ordered channels (see :ref:`WebRTCPeerConnection.create_data_channel`). .. rst-class:: classref-item-separator @@ -122,7 +122,7 @@ You can optionally specify a ``channels_config`` array of :ref:`TransferMode` **get_peer** **(** :ref:`int` peer_id **)** -Returns a dictionary representation of the peer with given ``peer_id`` with three keys. ``connection`` containing the :ref:`WebRTCPeerConnection` to this peer, ``channels`` an array of three :ref:`WebRTCDataChannel`, and ``connected`` a boolean representing if the peer connection is currently connected (all three channels are open). +Returns a dictionary representation of the peer with given ``peer_id`` with three keys. ``"connection"`` containing the :ref:`WebRTCPeerConnection` to this peer, ``"channels"`` an array of three :ref:`WebRTCDataChannel`, and ``"connected"`` a boolean representing if the peer connection is currently connected (all three channels are open). .. rst-class:: classref-item-separator diff --git a/classes/class_webrtcpeerconnection.rst b/classes/class_webrtcpeerconnection.rst index d315dc349c9..bc75fef6101 100644 --- a/classes/class_webrtcpeerconnection.rst +++ b/classes/class_webrtcpeerconnection.rst @@ -308,7 +308,7 @@ Close the peer connection and all data channels associated with it. Returns a new :ref:`WebRTCDataChannel` (or ``null`` on failure) with given ``label`` and optionally configured via the ``options`` dictionary. This method can only be called when the connection is in state :ref:`STATE_NEW`. -There are two ways to create a working data channel: either call :ref:`create_data_channel` on only one of the peer and listen to :ref:`data_channel_received` on the other, or call :ref:`create_data_channel` on both peers, with the same values, and the ``negotiated`` option set to ``true``. +There are two ways to create a working data channel: either call :ref:`create_data_channel` on only one of the peer and listen to :ref:`data_channel_received` on the other, or call :ref:`create_data_channel` on both peers, with the same values, and the ``"negotiated"`` option set to ``true``. Valid ``options`` are: @@ -388,9 +388,9 @@ Returns the :ref:`SignalingState` on t :ref:`Error` **initialize** **(** :ref:`Dictionary` configuration={} **)** -Re-initialize this peer connection, closing any previously active connection, and going back to state :ref:`STATE_NEW`. A dictionary of ``options`` can be passed to configure the peer connection. +Re-initialize this peer connection, closing any previously active connection, and going back to state :ref:`STATE_NEW`. A dictionary of ``configuration`` options can be passed to configure the peer connection. -Valid ``options`` are: +Valid ``configuration`` options are: :: @@ -457,9 +457,9 @@ After calling this function the peer will start emitting :ref:`ice_candidate_cre Sets the SDP description of the remote peer. This should be called with the values generated by a remote peer and received over the signaling server. -If ``type`` is ``offer`` the peer will emit :ref:`session_description_created` with the appropriate answer. +If ``type`` is ``"offer"`` the peer will emit :ref:`session_description_created` with the appropriate answer. -If ``type`` is ``answer`` the peer will start emitting :ref:`ice_candidate_created`. +If ``type`` is ``"answer"`` the peer will start emitting :ref:`ice_candidate_created`. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_websocketmultiplayerpeer.rst b/classes/class_websocketmultiplayerpeer.rst index a406303890e..e02089dc637 100644 --- a/classes/class_websocketmultiplayerpeer.rst +++ b/classes/class_websocketmultiplayerpeer.rst @@ -201,7 +201,7 @@ Starts a new multiplayer client connecting to the given ``url``. TLS certificate :ref:`Error` **create_server** **(** :ref:`int` port, :ref:`String` bind_address="*", :ref:`TLSOptions` tls_server_options=null **)** -Starts a new multiplayer server listening on the given ``port``. You can optionally specify a ``bind_address``, and provide valiid ``tls_server_options`` to use TLS. See :ref:`TLSOptions.server`. +Starts a new multiplayer server listening on the given ``port``. You can optionally specify a ``bind_address``, and provide valid ``tls_server_options`` to use TLS. See :ref:`TLSOptions.server`. .. rst-class:: classref-item-separator diff --git a/classes/class_webxrinterface.rst b/classes/class_webxrinterface.rst index 0aef1bbb046..70607330578 100644 --- a/classes/class_webxrinterface.rst +++ b/classes/class_webxrinterface.rst @@ -150,6 +150,10 @@ Methods .. table:: :widths: auto + +---------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array` | :ref:`get_available_display_refresh_rates` **(** **)** |const| | + +---------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_display_refresh_rate` **(** **)** |const| | +---------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TargetRayMode` | :ref:`get_input_source_target_ray_mode` **(** :ref:`int` input_source_id **)** |const| | +---------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -159,6 +163,8 @@ Methods +---------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`is_session_supported` **(** :ref:`String` session_mode **)** | +---------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_display_refresh_rate` **(** :ref:`float` refresh_rate **)** | + +---------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -169,6 +175,18 @@ Methods Signals ------- +.. _class_WebXRInterface_signal_display_refresh_rate_changed: + +.. rst-class:: classref-signal + +**display_refresh_rate_changed** **(** **)** + +Emitted after the display's refresh rate has changed. + +.. rst-class:: classref-item-separator + +---- + .. _class_WebXRInterface_signal_reference_space_reset: .. rst-class:: classref-signal @@ -518,6 +536,30 @@ Possible values come from `WebXR's XRVisibilityState ` **get_available_display_refresh_rates** **(** **)** |const| + +Returns display refresh rates supported by the current HMD. Only returned if this feature is supported by the web browser and after the interface has been initialized. + +.. rst-class:: classref-item-separator + +---- + +.. _class_WebXRInterface_method_get_display_refresh_rate: + +.. rst-class:: classref-method + +:ref:`float` **get_display_refresh_rate** **(** **)** |const| + +Returns the display refresh rate for the current HMD. Not supported on all HMDs and browsers. It may not report an accurate value until after using :ref:`set_display_refresh_rate`. + +.. rst-class:: classref-item-separator + +---- + .. _class_WebXRInterface_method_get_input_source_target_ray_mode: .. rst-class:: classref-method @@ -584,6 +626,18 @@ Possible values come from `WebXR's XRSessionMode ` signal with the result. +.. rst-class:: classref-item-separator + +---- + +.. _class_WebXRInterface_method_set_display_refresh_rate: + +.. rst-class:: classref-method + +void **set_display_refresh_rate** **(** :ref:`float` refresh_rate **)** + +Sets the display refresh rate for the current HMD. Not supported on all HMDs and browsers. It won't take effect right away until after :ref:`display_refresh_rate_changed` is emitted. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/classes/class_window.rst b/classes/class_window.rst index a4ce2bfe04b..62112241dbc 100644 --- a/classes/class_window.rst +++ b/classes/class_window.rst @@ -515,7 +515,7 @@ enum **Flags**: :ref:`Flags` **FLAG_RESIZE_DISABLED** = ``0`` -The window can't be resizing by dragging its resize grip. It's still possible to resize the window using :ref:`size`. This flag is ignored for full screen windows. Set with :ref:`unresizable`. +The window can't be resized by dragging its resize grip. It's still possible to resize the window using :ref:`size`. This flag is ignored for full screen windows. Set with :ref:`unresizable`. .. _class_Window_constant_FLAG_BORDERLESS: @@ -557,7 +557,7 @@ The window can't be focused. No-focus window will ignore all input, except mouse :ref:`Flags` **FLAG_POPUP** = ``5`` -Window is part of menu or :ref:`OptionButton` dropdown. This flag can't be changed when the window is visible. An active popup window will exclusively receive all input, without stealing focus from its parent. Popup windows are automatically closed when uses click outside it, or when an application is switched. Popup window must have ``transient parent`` set (see :ref:`transient`). +Window is part of menu or :ref:`OptionButton` dropdown. This flag can't be changed when the window is visible. An active popup window will exclusively receive all input, without stealing focus from its parent. Popup windows are automatically closed when uses click outside it, or when an application is switched. Popup window must have transient parent set (see :ref:`transient`). .. _class_Window_constant_FLAG_EXTEND_TO_TITLE: @@ -667,7 +667,7 @@ The content can be expanded horizontally. Scaling vertically will result in keep :ref:`ContentScaleAspect` **CONTENT_SCALE_ASPECT_EXPAND** = ``4`` -The content's aspect will be preserved. If the target size has different aspect from the base one, the content will stay in the to-left corner and add an extra visible area in the stretched space. +The content's aspect will be preserved. If the target size has different aspect from the base one, the content will stay in the top-left corner and add an extra visible area in the stretched space. .. rst-class:: classref-item-separator @@ -735,7 +735,7 @@ Initial window position is determined by :ref:`position` **WINDOW_INITIAL_POSITION_CENTER_PRIMARY_SCREEN** = ``1`` -Initial window position is a center of the primary screen. +Initial window position is the center of the primary screen. .. _class_Window_constant_WINDOW_INITIAL_POSITION_CENTER_MAIN_WINDOW_SCREEN: @@ -743,7 +743,7 @@ Initial window position is a center of the primary screen. :ref:`WindowInitialPosition` **WINDOW_INITIAL_POSITION_CENTER_MAIN_WINDOW_SCREEN** = ``2`` -Initial window position is a center of the main window screen. +Initial window position is the center of the main window screen. .. _class_Window_constant_WINDOW_INITIAL_POSITION_CENTER_OTHER_SCREEN: @@ -751,7 +751,23 @@ Initial window position is a center of the main window screen. :ref:`WindowInitialPosition` **WINDOW_INITIAL_POSITION_CENTER_OTHER_SCREEN** = ``3`` -Initial window position is a center of :ref:`current_screen` screen. +Initial window position is the center of :ref:`current_screen` screen. + +.. _class_Window_constant_WINDOW_INITIAL_POSITION_CENTER_SCREEN_WITH_MOUSE_FOCUS: + +.. rst-class:: classref-enumeration-constant + +:ref:`WindowInitialPosition` **WINDOW_INITIAL_POSITION_CENTER_SCREEN_WITH_MOUSE_FOCUS** = ``4`` + +Initial window position is the center of the screen containing the mouse pointer. + +.. _class_Window_constant_WINDOW_INITIAL_POSITION_CENTER_SCREEN_WITH_KEYBOARD_FOCUS: + +.. rst-class:: classref-enumeration-constant + +:ref:`WindowInitialPosition` **WINDOW_INITIAL_POSITION_CENTER_SCREEN_WITH_KEYBOARD_FOCUS** = ``5`` + +Initial window position is the center of the screen containing the window with the keyboard focus. .. rst-class:: classref-section-separator @@ -1054,7 +1070,7 @@ Set's the window's current mode. - void **set_flag** **(** :ref:`Flags` flag, :ref:`bool` enabled **)** - :ref:`bool` **get_flag** **(** :ref:`Flags` flag **)** |const| -If ``true``, all mouse event as passed to the underlying window of the same application. See also :ref:`mouse_passthrough_polygon`. +If ``true``, all mouse events will be passed to the underlying window of the same application. See also :ref:`mouse_passthrough_polygon`. \ **Note:** This property is implemented on Linux (X11), macOS and Windows. @@ -1144,6 +1160,8 @@ If ``true``, the **Window** will be considered a popup. Popups are sub-windows t The window's position in pixels. +If :ref:`ProjectSettings.display/window/subwindows/embed_subwindows` is ``false``, the position is in absolute screen coordinates. This typically applies to editor plugins. If the setting is ``false``, the window's position is in the coordinates of its parent :ref:`Viewport`. + .. rst-class:: classref-item-separator ---- @@ -1229,7 +1247,7 @@ The window's title. If the **Window** is non-embedded, title styles set in :ref: - void **set_transient** **(** :ref:`bool` value **)** - :ref:`bool` **is_transient** **(** **)** -If ``true``, the **Window** is transient, i.e. it's considered a child of another **Window**. Transient window is will be destroyed with its transient parent and will return focus to their parent when closed. The transient window is displayed on top of a non-exclusive full-screen parent window. Transient windows can't enter full-screen mode. +If ``true``, the **Window** is transient, i.e. it's considered a child of another **Window**. The transient window will be destroyed with its transient parent and will return focus to their parent when closed. The transient window is displayed on top of a non-exclusive full-screen parent window. Transient windows can't enter full-screen mode. Note that behavior might be different depending on the platform. @@ -1921,9 +1939,7 @@ Moves the **Window** on top of other windows and focuses it. void **popup** **(** :ref:`Rect2i` rect=Rect2i(0, 0, 0, 0) **)** -Shows the **Window** and makes it transient (see :ref:`transient`). If ``rect`` is provided, it will be set as the **Window**'s size. - -Fails if called on the main window. +Shows the **Window** and makes it transient (see :ref:`transient`). If ``rect`` is provided, it will be set as the **Window**'s size. Fails if called on the main window. .. rst-class:: classref-item-separator @@ -1935,9 +1951,7 @@ Fails if called on the main window. void **popup_centered** **(** :ref:`Vector2i` minsize=Vector2i(0, 0) **)** -Popups the **Window** at the center of the current screen, with optionally given minimum size. - -If the **Window** is embedded, it will be centered in the parent :ref:`Viewport` instead. +Popups the **Window** at the center of the current screen, with optionally given minimum size. If the **Window** is embedded, it will be centered in the parent :ref:`Viewport` instead. \ **Note:** Calling it with the default value of ``minsize`` is equivalent to calling it with :ref:`size`. @@ -1951,9 +1965,7 @@ If the **Window** is embedded, it will be centered in the parent :ref:`Viewport< void **popup_centered_clamped** **(** :ref:`Vector2i` minsize=Vector2i(0, 0), :ref:`float` fallback_ratio=0.75 **)** -Popups the **Window** centered inside its parent **Window**. - -\ ``fallback_ratio`` determines the maximum size of the **Window**, in relation to its parent. +Popups the **Window** centered inside its parent **Window**. ``fallback_ratio`` determines the maximum size of the **Window**, in relation to its parent. \ **Note:** Calling it with the default value of ``minsize`` is equivalent to calling it with :ref:`size`. @@ -1979,9 +1991,7 @@ Popups the **Window** centered inside its parent **Window** and sets its size as void **popup_on_parent** **(** :ref:`Rect2i` parent_rect **)** -Popups the **Window** with a position shifted by parent **Window**'s position. - -If the **Window** is embedded, has the same effect as :ref:`popup`. +Popups the **Window** with a position shifted by parent **Window**'s position. If the **Window** is embedded, has the same effect as :ref:`popup`. .. rst-class:: classref-item-separator diff --git a/classes/class_workerthreadpool.rst b/classes/class_workerthreadpool.rst index 0c53c112c5a..a1d13987f03 100644 --- a/classes/class_workerthreadpool.rst +++ b/classes/class_workerthreadpool.rst @@ -12,9 +12,68 @@ WorkerThreadPool **Inherits:** :ref:`Object` -.. container:: contribute +A singleton that allocates some :ref:`Thread`\ s on startup, used to offload tasks to these threads. - There is currently no description for this class. Please help us by :ref:`contributing one `! +.. rst-class:: classref-introduction-group + +Description +----------- + +The **WorkerThreadPool** singleton allocates a set of :ref:`Thread`\ s (called worker threads) on project startup and provides methods for offloading tasks to them. This can be used for simple multithreading without having to create :ref:`Thread`\ s. + +Tasks hold the :ref:`Callable` to be run by the threads. **WorkerThreadPool** can be used to create regular tasks, which will be taken by one worker thread, or group tasks, which can be distributed between multiple worker threads. Group tasks execute the :ref:`Callable` multiple times, which makes them useful for iterating over a lot of elements, such as the enemies in an arena. + +Here's a sample on how to offload an expensive function to worker threads: + + +.. tabs:: + + .. code-tab:: gdscript + + var enemies = [] # An array to be filled with enemies. + + func process_enemy_ai(enemy_index): + var processed_enemy = enemies[enemy_index] + # Expensive logic... + + func _process(delta): + var task_id = WorkerThreadPool.add_group_task(process_enemy_ai, enemies.size()) + # Other code... + WorkerThreadPool.wait_for_group_task_completion(task_id) + # Other code that depends on the enemy AI already being processed. + + .. code-tab:: csharp + + private List _enemies = new List(); // A list to be filled with enemies. + + private void ProcessEnemyAI(int enemyIndex) + { + Node processedEnemy = _enemies[enemyIndex]; + // Expensive logic here. + } + + public override void _Process(double delta) + { + long taskId = WorkerThreadPool.AddGroupTask(Callable.From(ProcessEnemyAI), _enemies.Count); + // Other code... + WorkerThreadPool.WaitForGroupTaskCompletion(taskId); + // Other code that depends on the enemy AI already being processed. + } + + + +The above code relies on the number of elements in the ``enemies`` array remaining constant during the multithreaded part. + +\ **Note:** Using this singleton could affect performance negatively if the task being distributed between threads is not computationally expensive. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using multiple threads <../tutorials/performance/using_multiple_threads>` + +- :doc:`Thread-safe APIs <../tutorials/performance/thread_safe_apis>` .. rst-class:: classref-reftable-group @@ -55,9 +114,11 @@ Method Descriptions :ref:`int` **add_group_task** **(** :ref:`Callable` action, :ref:`int` elements, :ref:`int` tasks_needed=-1, :ref:`bool` high_priority=false, :ref:`String` description="" **)** -.. container:: contribute +Adds ``action`` as a group task to be executed by the worker threads. The :ref:`Callable` will be called a number of times based on ``elements``, with the first thread calling it with the value ``0`` as a parameter, and each consecutive execution incrementing this value by 1 until it reaches ``element - 1``. - There is currently no description for this method. Please help us by :ref:`contributing one `! +The number of threads the task is distributed to is defined by ``tasks_needed``, where the default value ``-1`` means it is distributed to all worker threads. ``high_priority`` determines if the task has a high priority or a low priority (default). You can optionally provide a ``description`` to help with debugging. + +Returns a group task ID that can be used by other methods. .. rst-class:: classref-item-separator @@ -69,9 +130,9 @@ Method Descriptions :ref:`int` **add_task** **(** :ref:`Callable` action, :ref:`bool` high_priority=false, :ref:`String` description="" **)** -.. container:: contribute +Adds ``action`` as a task to be executed by a worker thread. ``high_priority`` determines if the task has a high priority or a low priority (default). You can optionally provide a ``description`` to help with debugging. - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns a task ID that can be used by other methods. .. rst-class:: classref-item-separator @@ -83,9 +144,9 @@ Method Descriptions :ref:`int` **get_group_processed_element_count** **(** :ref:`int` group_id **)** |const| -.. container:: contribute +Returns how many times the :ref:`Callable` of the group task with the given ID has already been executed by the worker threads. - There is currently no description for this method. Please help us by :ref:`contributing one `! +\ **Note:** If a thread has started executing the :ref:`Callable` but is yet to finish, it won't be counted. .. rst-class:: classref-item-separator @@ -97,9 +158,7 @@ Method Descriptions :ref:`bool` **is_group_task_completed** **(** :ref:`int` group_id **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the group task with the given ID is completed. .. rst-class:: classref-item-separator @@ -111,9 +170,7 @@ Method Descriptions :ref:`bool` **is_task_completed** **(** :ref:`int` task_id **)** |const| -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns ``true`` if the task with the given ID is completed. .. rst-class:: classref-item-separator @@ -125,9 +182,7 @@ Method Descriptions void **wait_for_group_task_completion** **(** :ref:`int` group_id **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Pauses the thread that calls this method until the group task with the given ID is completed. .. rst-class:: classref-item-separator @@ -139,9 +194,7 @@ void **wait_for_group_task_completion** **(** :ref:`int` group_id **) void **wait_for_task_completion** **(** :ref:`int` task_id **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Pauses the thread that calls this method until the task with the given ID is completed. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_x509certificate.rst b/classes/class_x509certificate.rst index d6fafacc1b9..a715e0d0e0a 100644 --- a/classes/class_x509certificate.rst +++ b/classes/class_x509certificate.rst @@ -21,7 +21,7 @@ Description The X509Certificate class represents an X509 certificate. Certificates can be loaded and saved like any other :ref:`Resource`. -They can be used as the server certificate in :ref:`StreamPeerTLS.accept_stream` (along with the proper :ref:`CryptoKey`), and to specify the only certificate that should be accepted when connecting to an TLS server via :ref:`StreamPeerTLS.connect_to_stream`. +They can be used as the server certificate in :ref:`StreamPeerTLS.accept_stream` (along with the proper :ref:`CryptoKey`), and to specify the only certificate that should be accepted when connecting to a TLS server via :ref:`StreamPeerTLS.connect_to_stream`. .. rst-class:: classref-reftable-group @@ -31,11 +31,15 @@ Methods .. table:: :widths: auto - +---------------------------------------+---------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`load` **(** :ref:`String` path **)** | - +---------------------------------------+---------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`save` **(** :ref:`String` path **)** | - +---------------------------------------+---------------------------------------------------------------------------------------------+ + +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`load` **(** :ref:`String` path **)** | + +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`load_from_string` **(** :ref:`String` string **)** | + +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`save` **(** :ref:`String` path **)** | + +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`save_to_string` **(** **)** | + +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -58,6 +62,18 @@ Loads a certificate from ``path`` ("\*.crt" file). ---- +.. _class_X509Certificate_method_load_from_string: + +.. rst-class:: classref-method + +:ref:`Error` **load_from_string** **(** :ref:`String` string **)** + +Loads a certificate from the given ``string``. + +.. rst-class:: classref-item-separator + +---- + .. _class_X509Certificate_method_save: .. rst-class:: classref-method @@ -66,6 +82,18 @@ Loads a certificate from ``path`` ("\*.crt" file). Saves a certificate to the given ``path`` (should be a "\*.crt" file). +.. rst-class:: classref-item-separator + +---- + +.. _class_X509Certificate_method_save_to_string: + +.. rst-class:: classref-method + +:ref:`String` **save_to_string** **(** **)** + +Returns a string representation of the certificate, or an empty string if the certificate is invalid. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/classes/class_xrinterface.rst b/classes/class_xrinterface.rst index 51e0ba98a83..585c73f5560 100644 --- a/classes/class_xrinterface.rst +++ b/classes/class_xrinterface.rst @@ -71,6 +71,8 @@ Methods +--------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Array` | :ref:`get_supported_environment_blend_modes` **(** **)** | +--------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_system_info` **(** **)** | + +--------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TrackingStatus` | :ref:`get_tracking_status` **(** **)** |const| | +--------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Transform3D` | :ref:`get_transform_for_view` **(** :ref:`int` view, :ref:`Transform3D` cam_transform **)** | @@ -286,7 +288,7 @@ Player is free to move around, full positional tracking. :ref:`PlayAreaMode` **XR_PLAY_AREA_STAGE** = ``4`` -Same as roomscale but origin point is fixed to the center of the physical space, XRServer.center_on_hmd disabled. +Same as :ref:`XR_PLAY_AREA_ROOMSCALE` but origin point is fixed to the center of the physical space, :ref:`XRServer.center_on_hmd` disabled. .. rst-class:: classref-item-separator @@ -471,6 +473,20 @@ Returns the an array of supported environment blend modes, see :ref:`Environment ---- +.. _class_XRInterface_method_get_system_info: + +.. rst-class:: classref-method + +:ref:`Dictionary` **get_system_info** **(** **)** + +Returns a :ref:`Dictionary` with extra system info. Interfaces are expected to return ``XRRuntimeName`` and ``XRRuntimeVersion`` providing info about the used XR runtime. Additional entries may be provided specific to an interface. + +\ **Note:**\ This information may only be available after :ref:`initialize` was successfully called. + +.. rst-class:: classref-item-separator + +---- + .. _class_XRInterface_method_get_tracking_status: .. rst-class:: classref-method @@ -493,7 +509,7 @@ Returns the transform for a view/eye. \ ``view`` is the view/eye index. -\ ``cam_transform`` is the transform that maps device coordinates to scene coordinates, typically the global_transform of the current XROrigin3D. +\ ``cam_transform`` is the transform that maps device coordinates to scene coordinates, typically the :ref:`Node3D.global_transform` of the current XROrigin3D. .. rst-class:: classref-item-separator @@ -582,9 +598,9 @@ Sets the active environment blend mode. :: func _ready(): - var xr_interface : XRInterface = XRServer.find_interface("OpenXR") + var xr_interface: XRInterface = XRServer.find_interface("OpenXR") if xr_interface and xr_interface.is_initialized(): - var vp : Viewport = get_viewport() + var vp: Viewport = get_viewport() vp.use_xr = true var acceptable_modes = [ XRInterface.XR_ENV_BLEND_MODE_OPAQUE, XRInterface.XR_ENV_BLEND_MODE_ADDITIVE ] var modes = xr_interface.get_supported_environment_blend_modes() diff --git a/classes/class_xrinterfaceextension.rst b/classes/class_xrinterfaceextension.rst index d2e120554e2..4561b5aa30f 100644 --- a/classes/class_xrinterfaceextension.rst +++ b/classes/class_xrinterfaceextension.rst @@ -58,6 +58,8 @@ Methods +--------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedStringArray` | :ref:`_get_suggested_tracker_names` **(** **)** |virtual| |const| | +--------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`_get_system_info` **(** **)** |virtual| |const| | + +--------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`TrackingStatus` | :ref:`_get_tracking_status` **(** **)** |virtual| |const| | +--------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Transform3D` | :ref:`_get_transform_for_view` **(** :ref:`int` view, :ref:`Transform3D` cam_transform **)** |virtual| | @@ -278,6 +280,18 @@ Returns a :ref:`PackedStringArray` with tracker names c ---- +.. _class_XRInterfaceExtension_method__get_system_info: + +.. rst-class:: classref-method + +:ref:`Dictionary` **_get_system_info** **(** **)** |virtual| |const| + +Returns a :ref:`Dictionary` with system informationr elated to this interface. + +.. rst-class:: classref-item-separator + +---- + .. _class_XRInterfaceExtension_method__get_tracking_status: .. rst-class:: classref-method @@ -394,7 +408,7 @@ Called if this is our primary **XRInterfaceExtension** before we start processin void **_pre_render** **(** **)** |virtual| -Called if this **XRInterfaceExtension** is active before rendering starts, most XR interfaces will sync tracking at this point in time. +Called if this **XRInterfaceExtension** is active before rendering starts. Most XR interfaces will sync tracking at this point in time. .. rst-class:: classref-item-separator @@ -406,7 +420,7 @@ Called if this **XRInterfaceExtension** is active before rendering starts, most void **_process** **(** **)** |virtual| -Called if this **XRInterfaceExtension** is active before our physics and game process is called. most XR interfaces will update its :ref:`XRPositionalTracker`\ s at this point in time. +Called if this **XRInterfaceExtension** is active before our physics and game process is called. Most XR interfaces will update its :ref:`XRPositionalTracker`\ s at this point in time. .. rst-class:: classref-item-separator diff --git a/classes/class_xrserver.rst b/classes/class_xrserver.rst index b0fabe6d579..ce89a78e0fb 100644 --- a/classes/class_xrserver.rst +++ b/classes/class_xrserver.rst @@ -36,11 +36,13 @@ Properties .. table:: :widths: auto - +---------------------------------------+---------------------------------------------------------------------+---------+ - | :ref:`XRInterface` | :ref:`primary_interface` | | - +---------------------------------------+---------------------------------------------------------------------+---------+ - | :ref:`float` | :ref:`world_scale` | ``1.0`` | - +---------------------------------------+---------------------------------------------------------------------+---------+ + +---------------------------------------+---------------------------------------------------------------------+-----------------------------------------------------+ + | :ref:`XRInterface` | :ref:`primary_interface` | | + +---------------------------------------+---------------------------------------------------------------------+-----------------------------------------------------+ + | :ref:`Transform3D` | :ref:`world_origin` | ``Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)`` | + +---------------------------------------+---------------------------------------------------------------------+-----------------------------------------------------+ + | :ref:`float` | :ref:`world_scale` | ``1.0`` | + +---------------------------------------+---------------------------------------------------------------------+-----------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -274,6 +276,25 @@ The primary :ref:`XRInterface` currently bound to the **XRSer ---- +.. _class_XRServer_property_world_origin: + +.. rst-class:: classref-property + +:ref:`Transform3D` **world_origin** = ``Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)`` + +.. rst-class:: classref-property-setget + +- void **set_world_origin** **(** :ref:`Transform3D` value **)** +- :ref:`Transform3D` **get_world_origin** **(** **)** + +The current origin of our tracking space in the virtual world. This is used by the renderer to properly position the camera with new tracking data. + +\ **Note:** This property is managed by the current :ref:`XROrigin3D` node. It is exposed for access from GDExtensions. + +.. rst-class:: classref-item-separator + +---- + .. _class_XRServer_property_world_scale: .. rst-class:: classref-property diff --git a/classes/index.rst b/classes/index.rst index f59f1761fd0..8062af4dcd4 100644 --- a/classes/index.rst +++ b/classes/index.rst @@ -92,7 +92,6 @@ Nodes class_editorfiledialog class_editorfilesystem class_editorinspector - class_editorinterface class_editorplugin class_editorproperty class_editorresourcepicker @@ -386,12 +385,14 @@ Resources class_gltfanimation class_gltfbufferview class_gltfcamera + class_gltfcollider class_gltfdocument class_gltfdocumentextension class_gltfdocumentextensionconvertimportermesh class_gltflight class_gltfmesh class_gltfnode + class_gltfphysicsbody class_gltfskeleton class_gltfskin class_gltfspecgloss @@ -438,6 +439,7 @@ Resources class_navigationpolygon class_noise class_noisetexture2d + class_noisetexture3d class_occluder3d class_occluderpolygon2d class_oggpacketsequence @@ -656,7 +658,6 @@ Other objects class_object class_aescontext - class_animationtrackeditplugin class_astar2d class_astar3d class_astargrid2d @@ -681,16 +682,25 @@ Other objects class_editordebuggerplugin class_editordebuggersession class_editorexportplatform + class_editorexportplatformandroid + class_editorexportplatformios + class_editorexportplatformlinuxbsd + class_editorexportplatformmacos + class_editorexportplatformpc + class_editorexportplatformweb + class_editorexportplatformwindows class_editorexportplugin class_editorfeatureprofile class_editorfilesystemdirectory class_editorfilesystemimportformatsupportquery class_editorimportplugin class_editorinspectorplugin + class_editorinterface class_editornode3dgizmo class_editorpaths class_editorresourceconversionplugin class_editorresourcepreviewgenerator + class_editorresourcetooltipplugin class_editorsceneformatimporter class_editorsceneformatimporterblend class_editorsceneformatimporterfbx @@ -736,6 +746,7 @@ Other objects class_lightmapperrd class_mainloop class_marshalls + class_meshconvexdecompositionsettings class_meshdatatool class_methodtweener class_mobilevrinterface @@ -877,6 +888,64 @@ Other objects class_zippacker class_zipreader +Editor-only +=========== + +.. toctree:: + :maxdepth: 1 + :name: toc-class-ref-editors + + class_editorcommandpalette + class_editordebuggerplugin + class_editordebuggersession + class_editorexportplatform + class_editorexportplatformandroid + class_editorexportplatformios + class_editorexportplatformlinuxbsd + class_editorexportplatformmacos + class_editorexportplatformpc + class_editorexportplatformweb + class_editorexportplatformwindows + class_editorexportplugin + class_editorfeatureprofile + class_editorfiledialog + class_editorfilesystem + class_editorfilesystemdirectory + class_editorfilesystemimportformatsupportquery + class_editorimportplugin + class_editorinspector + class_editorinspectorplugin + class_editorinterface + class_editornode3dgizmo + class_editornode3dgizmoplugin + class_editorpaths + class_editorplugin + class_editorproperty + class_editorresourceconversionplugin + class_editorresourcepicker + class_editorresourcepreview + class_editorresourcepreviewgenerator + class_editorresourcetooltipplugin + class_editorsceneformatimporter + class_editorsceneformatimporterblend + class_editorsceneformatimporterfbx + class_editorsceneformatimportergltf + class_editorscenepostimport + class_editorscenepostimportplugin + class_editorscript + class_editorscriptpicker + class_editorselection + class_editorsettings + class_editorspinslider + class_editorsyntaxhighlighter + class_editortranslationparserplugin + class_editorundoredomanager + class_editorvcsinterface + class_filesystemdock + class_scriptcreatedialog + class_scripteditor + class_scripteditorbase + Variant types ============= @@ -884,6 +953,7 @@ Variant types :maxdepth: 1 :name: toc-class-ref-variants + class_variant class_aabb class_array class_basis @@ -915,7 +985,6 @@ Variant types class_stringname class_transform2d class_transform3d - class_variant class_vector2 class_vector2i class_vector3 From a6b2a75cba9696543cc5261eebec61a1e9c765ef Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Tue, 16 May 2023 01:13:58 +0200 Subject: [PATCH 06/76] Update tutorials/3d/volumetric_fog.rst Co-authored-by: Clay John --- tutorials/3d/volumetric_fog.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tutorials/3d/volumetric_fog.rst b/tutorials/3d/volumetric_fog.rst index 671d0b86c05..ba823dac9b3 100644 --- a/tutorials/3d/volumetric_fog.rst +++ b/tutorials/3d/volumetric_fog.rst @@ -244,9 +244,8 @@ which has a performance cost. .. note:: NoiseTexture3D's **Color Ramp** affects FogMaterial density textures, but - not in the way you would typically expect. Since the texture's red channel - is sampled, using a color ramp will affect the resulting density if the red - channel intensity is modified in any way. + since only the texture's red channel is sampled, only the color ramp's red + channel will affect the resulting density. However, using a color ramp will *not* tint the fog volume according to the texture. You would need to use a custom shader that reads a Texture3D to From 98452b288a114ff9ffbbbcf0db1adf1d61c78ff3 Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Thu, 18 May 2023 14:23:55 +0200 Subject: [PATCH 07/76] Classref fixes --- classes/class_editorexportplatformandroid.rst | 2 +- classes/class_immediatemesh.rst | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/classes/class_editorexportplatformandroid.rst b/classes/class_editorexportplatformandroid.rst index fd08af73397..54d2a76907c 100644 --- a/classes/class_editorexportplatformandroid.rst +++ b/classes/class_editorexportplatformandroid.rst @@ -2054,7 +2054,7 @@ Allows an application to record audio. See `RECORD_AUDIO ` **permissions/reorder_tasks** -Allows an application to change the Z-order of tasks. See `REORDER_TASKS < https://developer.android.com/reference/android/Manifest.permission#REORDER_TASKS>`__. +Allows an application to change the Z-order of tasks. See `REORDER_TASKS `__. .. rst-class:: classref-item-separator diff --git a/classes/class_immediatemesh.rst b/classes/class_immediatemesh.rst index 71cc344db4b..472fb0ac0b1 100644 --- a/classes/class_immediatemesh.rst +++ b/classes/class_immediatemesh.rst @@ -26,17 +26,14 @@ Here's a sample on how to generate a triangular face: .. tabs:: -var mesh = ImmediateMesh.new() - -mesh.surface_begin(Mesh.PRIMITIVE_TRIANGLES) - -mesh.surface_add_vertex(Vector3.LEFT) - -mesh.surface_add_vertex(Vector3.FORWARD) - -mesh.surface_add_vertex(Vector3.ZERO) - -mesh.surface_end() + .. code-tab:: gdscript + + var mesh = ImmediateMesh.new() + mesh.surface_begin(Mesh.PRIMITIVE_TRIANGLES) + mesh.surface_add_vertex(Vector3.LEFT) + mesh.surface_add_vertex(Vector3.FORWARD) + mesh.surface_add_vertex(Vector3.ZERO) + mesh.surface_end() From cf9760d61a7c3b892251acee13dff5cb83ee79ec Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Sat, 13 May 2023 14:09:46 +0200 Subject: [PATCH 08/76] Update NavigationAgent doc for avoidance rework Updates NavigationAgent doc for avoidance rework. --- .../navigation_using_navigationagents.rst | 173 +++++++++++------- 1 file changed, 102 insertions(+), 71 deletions(-) diff --git a/tutorials/navigation/navigation_using_navigationagents.rst b/tutorials/navigation/navigation_using_navigationagents.rst index 23e089414b4..fd46c93edcf 100644 --- a/tutorials/navigation/navigation_using_navigationagents.rst +++ b/tutorials/navigation/navigation_using_navigationagents.rst @@ -3,123 +3,140 @@ Using NavigationAgents ====================== -NavigationsAgents are helper nodes to facilitate common calls to the NavigationServer API -on behalf of the parent actor node in a more convenient manner for beginners. +NavigationsAgents are helper nodes that combine functionality +for pathfinding, path following and agent avoidance for a Node2D/3D inheriting parent node. +They facilitate common calls to the NavigationServer API on +behalf of the parent actor node in a more convenient manner for beginners. 2D and 3D version of NavigationAgents are available as :ref:`NavigationAgent2D` and :ref:`NavigationAgent3D` respectively. -NavigationsAgents are entirely optional for navigation pathfinding. -The functionality of NavigationsAgents can be recreated with scripts and direct -calls to the NavigationServer API. If the default NavigationsAgent does not do what you want -for your game feel free to design your own NavigationsAgent with scripts. +New NavigationAgent nodes will automatically join the default navigation map on the World2D/World3D. -.. warning:: - - NavigationsAgent nodes and NavigationServer ``agents`` are not the same. - The later is an RVO avoidance agent and solely used for avoidance. - RVO avoidance agents are not involved in regular pathfinding. +The functionality of NavigationsAgent nodes can be recreated with scripts and direct +calls to the NavigationServer API should the default NavigationsAgent +nodes not do what is required for a project and specific gameplay. NavigationAgent Pathfinding --------------------------- -To use NavigationAgents for pathfinding, place a NavigationAgent2D/3D Node below a Node2D/3D inheriting parent node. +NavigationAgents query a new navigation path on their current navigation map when their ``target_position`` is set with a global position. -To have the agent query a path to a target position use the ``set_target_position()`` method. -Once the target has been set, the next position to follow in the path -can be retrieved with the ``get_next_path_position()`` function. Move the parent actor node -to this position with your own movement code. On the next ``physics_frame``, call -``get_next_path_position()`` again for the next position and repeat this until the path ends. +The result of the pathfinding can be influenced with the following properties. -NavigationAgents have their own internal logic to proceed with the current path and call for updates. -NavigationAgents recognize by distance when a path point or the final target is reached. -NavigationAgents refresh a path automatically when too far away from the current pathpoint. -The important updates are all triggered with the ``get_next_path_position()`` function -when called in ``_physics_process()``. +- The ``navigation_layers`` bitmask can be used to limit the navigation meshes that the agent can use. +- The ``pathfinding_algorithm`` controls how the pathfinding travels through the navigation mesh polygons in the path search. +- The ``path_postprocessing`` sets if or how the raw path corridor found by the pathfinding is altered before it is returned. +- The ``path_metadata_flags`` enable the collection of additional path point meta data returned by the path. + +.. warning:: + + Disabling path meta flags will disable related signal emissions on the agent. + +NavigationAgent Pathfollowing +----------------------------- -Be careful calling other NavigationAgent functions not required for path movement -while the actor is following a path, as many function trigger a full path refresh. +After a ``target_position`` has been set for the agent, the next position to follow in the path +can be retrieved with the ``get_next_path_position()`` function. + +Once the next path position is received move the parent actor node of the agent +towards this path position with your own movement code. .. note:: - New NavigationAgents will automatically join the - default navigation map for their 2D/3D dimension. + The navigation system never moves the parent node of a NavigationAgent. + The movement is entirely in the hands of users and their custom scripts. -.. warning:: +The ``get_next_path_position()`` function is responsible for updating many of the agent's internal states and properties. +The function should be repeatedly called `once` every ``physics_process`` until ``is_navigation_finished()`` tells that the path is finished. +The function should not be called after the target position or path end has been reached +as it can make the agent jitter in place due to the repeated path updates. +Always check very early in script with ``is_navigation_finished()`` if the path is already finished. - Resetting the path every frame (by accident) might get the actor to stutter or spin around in place. +NavigationAgents have their own internal logic to proceed with the current path and call for updates. -NavigationAgents were designed with ``_physics_process()`` in mind to keep in sync with both :ref:`NavigationServer3D` and :ref:`PhysicsServer3D`. +The following properties influence the path following behavior. -They work well out of the box with :ref:`CharacterBody2D` and :ref:`CharacterBody3D` as well as any rigid bodies. +- The ``path_desired_distance`` defines the distance at which the agent advances its internal path index to the next path position. +- The ``target_desired_distance`` defines the dinstance at which the agent considers the target position to be reached and the path at its end. +- The ``path_max_distance`` defines when an agent requests a new path cause it was moved to far away from the current path point segment. -.. warning:: +The important updates are all triggered with the ``get_next_path_position()`` function +when called in ``_physics_process()``. - The important restriction for non-physics characters is that the NavigationAgent node only accepts a single update each ``physics_frame`` as further updates will be blocked. +NavigationAgents can be used with ``process`` but are still limited to a single update that happens in ``physics_process``. -.. warning:: +Script examples for various nodes commonly used with NavigationAgents can be found further below. + +Pathfollowing common problems +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are some common user problems and important caveats to consider when writing agent movement scripts. - If a NavigationAgent is used with ``_process()`` at high framerate make sure to accumulate the values of multiple frames and call the NavigationAgent function only once each ``physics_frame``. +- The path is returned empty + If an agent queries a path before the navigation map synchronisation, e.g. in a _ready() function, the path might return empty. In this case the get_next_path_position() function will return the same position as the agent parent node and the agent will consider the path end reached. This is fixed by making a deferred call or using a callback e.g. waiting for the navigation map changed signal. -.. _doc_navigation_script_templates: +- The agent is stuck dancing between two positions + This is usually caused by very frequent path updates every single frame, either deliberate or by accident (e.g. max path distance set too short). The pathfinding needs to find the closest position that are valid on navigation mesh. If a new path is requested every single frame the first path positions might end up switching constantly in front and behind the agent's current position, causing it to dance between the two positions. +- The agent is backtracking sometimes + If an agent moves very fast it might overshoot the path_desired_distance check without ever advancing the path index. This can lead to the agent backtracking to the path point now behind it until it passes the distance check to increase the path index. Increase the desired distances accordingly for your agent speed and update rate usually fixes this as well as a more balanced navigation mesh polygon layout with not too many polygon edges cramped together in small spaces. + +- The agent is sometimes looking backwards for a frame + Same as with stuck dancing agents between two positions, this is usually caused by very frequent path updates every single frame. Depending on your navigation mesh layout, and especially when an agent is directly placed over a navigation mesh edge or edge connection, expect path positions to be sometimes slightly "behind" your actors current orientation. This happens due to precision issues and can not always be avoided. This is usually only a visible problem if actors are instantly rotated to face the current path position. NavigationAgent Avoidance ------------------------- This section explains how to use the built-in avoidance specific to NavigationAgent nodes. For general avoidance use and more technical details -on RVO avoidance see :ref:`doc_navigation_using_agent_avoidance`. - +on agent avoidance system see :ref:`doc_navigation_using_agent_avoidance`. In order for NavigationAgents to use the avoidance feature the ``enable_avoidance`` property must be set to ``true``. .. image:: img/agent_avoidance_enabled.png +The velocity_computed signal of the NavigationAgent node must be connected to receive the ``safe_velocity`` calculation result. + +.. image:: img/agent_safevelocity_signal.png + +In order to trigger the avoidance velocity calculation, the current velocity of the agent's parent node must be set with ``set_velocity()`` on the NavigationAgent node in ``_physics_process()``. + +After a short wait for processing the avoidance (still in the same frame) the ``safe_velocity`` vector will be received with the signal. +This velocity vector should be used to move the NavigationAgent's parent node in order to avoidance collision with other avoidance using agents or avoidance obstacles. + .. note:: Only other agents on the same map that are registered for avoidance themself will be considered in the avoidance calculation. The following NavigationAgent properties are relevant for avoidance: - - The property ``radius`` controls the size of the avoidance circle around the agent. This area describes the agents body and not the avoidance maneuver distance. + - The property ``height`` is available in 3D only. The height together with the current global y-axis position of the agent determines the vertical placement of the agent in the avoidance simulation. Agents using the 2D avoidance will automatically ignore other agents or obstacles that are below or above them. + - The property ``radius`` controls the size of the avoidance circle, or in case of 3D sphere, around the agent. This area describes the agents body and not the avoidance maneuver distance. - The property ``neighbor_distance`` controls the search radius of the agent when searching for other agents that should be avoided. A lower value reduces processing cost. - The property ``max_neighbors`` controls how many other agents are considered in the avoidance calculation if they all have overlapping radius. A lower value reduces processing cost but a too low value may result in agents ignoring the avoidance. - - The property ``time_horizion`` controls the avoidance maneuver start and end distance. - How early and for how long an agents reacts to other agents within the ``neighbor_distance`` radius to correct its own velocity. - A lower value results in avoidance kicking in with a very intense velocity change at a short distance while a high value results in very early but small velocity changes. - - The property ``max_speed`` controls the maximum velocity assumed for the agents avoidance calculation. + - The properties ``time_horizon_agents`` and ``time_horizon_obstacles`` control the avoidance prediction time for other agents or obstacles in seconds. When agents calculate their safe velocities they choose velocities that can be kept for this amount of seconds without colliding with another avoidance object. The prediction time should be kept as low as possible as agents will slow down their velocities to avoid collision in that timeframe. + - The property ``max_speed`` controls the maximum velocity allowed for the agents avoidance calculation. If the agents parents moves faster than this value the avoidance ``safe_velocity`` might not be accurate enough to avoid collision. + - The property ``use_3d_avoidance`` switches the agent between the 2D avoidance (xz axis) and the 3D avoidance (xyz axis) on the next update. + Note that 2D avoidance and 3D avoidance run in separate avoidance simulations so agents split between them do not affect each other. + - The properties ``avoidance_layers`` and ``avoidance_mask`` are bitmasks similar to e.g. physics layers. Agents will only avoid other avoidance objects that are on an avoidance layer that matches at least one of their own avoidance mask bits. + - The ``avoidance_priority`` makes agents with a higher priority ignore agents with a lower priority. This can be used to give certain agents more importance in the avoidance simulation, e.g. important npcs characters, without constantly changing their entire avoidance layers or mask. -The ``velocity_computed`` signal of the agent node must be connected to receive the ``safe_velocity`` calculation result. -.. image:: img/agent_safevelocity_signal.png - -Additional the current velocity of the agents parent must be set for the agent in ``_physics_process()`` with ``set_velocity()``. - -After a short wait for processing the avoidance (still in the same frame) the ``safe_velocity`` vector will be received with the signal. -This velocity vector should be used to move the NavigationAgent's parent node in order to avoidance collision with other avoidance registered agents in proximity. - -RVO exists in its own space and has no information from navigation meshes or physics collision. -Behind the scene avoidance agents are just circles with different radius on a flat plane. -In narrow places obstructed with collision objects, the avoidance maneuver radius needs to be -reduced considerably or disabled else the avoidance velocity will get actors stuck on collision easily. +Avoidance exists in its own space and has no information from navigation meshes or physics collision. +Behind the scene avoidance agents are just circles with different radius on a flat 2D plane or spheres in an otherwise empty 3D space. +NavigationObstacles can be used to add some environment constrains to the avoidance simulation, see :ref:`doc_navigation_using_navigationobstacles`. .. note:: - Avoidance should be seen as a last resort option for constantly moving objects that cannot be re(baked) to a navigationmesh efficiently in order to move around them. - -.. warning:: - - Actors that move according to their avoidance agent velocity will not move at - full speed, can leave the navigation mesh bounds and can make movement - pauses when the avoidance simulation becomes unsolvable. + Avoidance does not affect the pathfinding. It should be seen as an additional option for constantly moving objects that cannot be re(baked) to a navigation mesh efficiently in order to move around them. Using the NavigationAgent ``enable_avoidance`` property is the preferred option -to toggle avoidance but the following scripts for NavigationAgents can be -used to create or delete avoidance callbacks for the agent RID. +to toggle avoidance. The following code snippets can be used to +toggle avoidance on agents, create or delete avoidance callbacks or switch avoidance modes. .. tabs:: .. code-tab:: gdscript GDScript @@ -127,10 +144,15 @@ used to create or delete avoidance callbacks for the agent RID. extends NavigationAgent2D var agent: RID = get_rid() - # Enable - NavigationServer2D::get_singleton()->agent_set_callback(agent, self._avoidance_done) - # Disable - NavigationServer2D::get_singleton()->agent_set_callback(agent, Callable()) + # Enable avoidance + NavigationServer2D::get_singleton()->agent_set_avoidance_enabled(agent, true) + # Create avoidance callback + NavigationServer2D::get_singleton()->agent_set_avoidance_callback(agent, self._avoidance_done) + + # Disable avoidance + NavigationServer2D::get_singleton()->agent_set_avoidance_enabled(agent, false) + # Delete avoidance callback + NavigationServer2D::get_singleton()->agent_set_avoidance_callback(agent, Callable()) .. tabs:: .. code-tab:: gdscript GDScript @@ -138,10 +160,19 @@ used to create or delete avoidance callbacks for the agent RID. extends NavigationAgent3D var agent: RID = get_rid() - # Enable - NavigationServer3D::get_singleton()->agent_set_callback(agent, self._avoidance_done) - # Disable - NavigationServer3D::get_singleton()->agent_set_callback(agent, Callable()) + # Enable avoidance + NavigationServer3D::get_singleton()->agent_set_avoidance_enabled(agent, true) + # Create avoidance callback + NavigationServer3D::get_singleton()->agent_set_avoidance_callback(agent, self._avoidance_done) + # Switch to 3D avoidance + NavigationServer3D::get_singleton()->agent_set_use_3d_avoidance(agent, true) + + # Disable avoidance + NavigationServer3D::get_singleton()->agent_set_avoidance_enabled(agent, false) + # Delete avoidance callback + NavigationServer3D::get_singleton()->agent_set_avoidance_callback(agent, Callable()) + # Switch to 2D avoidance + NavigationServer3D::get_singleton()->agent_set_use_3d_avoidance(agent, false) NavigationAgent Script Templates -------------------------------- From 9f4ef23a9aca50467b24d51c385b13ae7872ea95 Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Thu, 18 May 2023 21:11:21 +0200 Subject: [PATCH 09/76] Fix wrong navigation agent example code Fixes wrong navigation agent example code. --- .../navigation_using_navigationagents.rst | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tutorials/navigation/navigation_using_navigationagents.rst b/tutorials/navigation/navigation_using_navigationagents.rst index fd46c93edcf..7337adabf1b 100644 --- a/tutorials/navigation/navigation_using_navigationagents.rst +++ b/tutorials/navigation/navigation_using_navigationagents.rst @@ -145,14 +145,14 @@ toggle avoidance on agents, create or delete avoidance callbacks or switch avoid var agent: RID = get_rid() # Enable avoidance - NavigationServer2D::get_singleton()->agent_set_avoidance_enabled(agent, true) + NavigationServer2D.agent_set_avoidance_enabled(agent, true) # Create avoidance callback - NavigationServer2D::get_singleton()->agent_set_avoidance_callback(agent, self._avoidance_done) + NavigationServer2D.agent_set_avoidance_callback(agent, Callable(self, "_avoidance_done")) # Disable avoidance - NavigationServer2D::get_singleton()->agent_set_avoidance_enabled(agent, false) + NavigationServer2D.agent_set_avoidance_enabled(agent, false) # Delete avoidance callback - NavigationServer2D::get_singleton()->agent_set_avoidance_callback(agent, Callable()) + NavigationServer2D.agent_set_avoidance_callback(agent, Callable()) .. tabs:: .. code-tab:: gdscript GDScript @@ -161,18 +161,18 @@ toggle avoidance on agents, create or delete avoidance callbacks or switch avoid var agent: RID = get_rid() # Enable avoidance - NavigationServer3D::get_singleton()->agent_set_avoidance_enabled(agent, true) + NavigationServer3D.agent_set_avoidance_enabled(agent, true) # Create avoidance callback - NavigationServer3D::get_singleton()->agent_set_avoidance_callback(agent, self._avoidance_done) + NavigationServer3D.agent_set_avoidance_callback(agent, Callable(self, "_avoidance_done")) # Switch to 3D avoidance - NavigationServer3D::get_singleton()->agent_set_use_3d_avoidance(agent, true) + NavigationServer3D.agent_set_use_3d_avoidance(agent, true) # Disable avoidance - NavigationServer3D::get_singleton()->agent_set_avoidance_enabled(agent, false) + NavigationServer3D.agent_set_avoidance_enabled(agent, false) # Delete avoidance callback - NavigationServer3D::get_singleton()->agent_set_avoidance_callback(agent, Callable()) + NavigationServer3D.agent_set_avoidance_callback(agent, Callable()) # Switch to 2D avoidance - NavigationServer3D::get_singleton()->agent_set_use_3d_avoidance(agent, false) + NavigationServer3D.agent_set_use_3d_avoidance(agent, false) NavigationAgent Script Templates -------------------------------- From 6441b69378e73aa4cd6e076074b376400909fe88 Mon Sep 17 00:00:00 2001 From: OgGhostJelly <94768729+OgGhostJelly@users.noreply.github.com> Date: Fri, 19 May 2023 10:54:50 +0700 Subject: [PATCH 10/76] Fixed code snippet using 3.x name for PhysicsServer2D The code was originally using Physics2DServer which has been renamed to PhysicsServer2D in 4.x --- tutorials/physics/ray-casting.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/physics/ray-casting.rst b/tutorials/physics/ray-casting.rst index ccddf279a39..4992dd3273f 100644 --- a/tutorials/physics/ray-casting.rst +++ b/tutorials/physics/ray-casting.rst @@ -56,7 +56,7 @@ Use the following code in 2D: func _physics_process(delta): var space_rid = get_world_2d().space - var space_state = Physics2DServer.space_get_direct_state(space_rid) + var space_state = PhysicsServer2D.space_get_direct_state(space_rid) .. code-tab:: csharp From 8e45b3c141847af7b0b1e71da091ad8442ee7e9e Mon Sep 17 00:00:00 2001 From: Konstantin Kopka Date: Fri, 19 May 2023 16:41:56 +0900 Subject: [PATCH 11/76] Clarify that iOS plugin's files have to be in a very specific directory to work (#7379) Co-authored-by: Max Hilbrunner --- tutorials/platform/ios/ios_plugin.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tutorials/platform/ios/ios_plugin.rst b/tutorials/platform/ios/ios_plugin.rst index 954ac5107b9..efc0ce876ea 100644 --- a/tutorials/platform/ios/ios_plugin.rst +++ b/tutorials/platform/ios/ios_plugin.rst @@ -28,6 +28,10 @@ When a plugin is active, you can access it in your using ``Engine.get_singleton( var singleton = Engine.get_singleton("MyPlugin") print(singleton.foo()) +.. note:: + + The plugin's files have to be in the ``res://ios/plugins/`` directory or a subdirectory, otherwise the Godot editor will not automatically detect them. + Creating an iOS plugin ---------------------- From 37c50b19094a01caf87f39c7cf5529aa06da8d31 Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 18 May 2023 13:00:47 +0200 Subject: [PATCH 12/76] Update GDExtension tutorial for entry functions Docs part of https://github.com/godotengine/godot-cpp/pull/1095 Same changes as https://github.com/godotengine/godot-cpp/pull/1115 --- .../scripting/gdextension/gdextension_cpp_example.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tutorials/scripting/gdextension/gdextension_cpp_example.rst b/tutorials/scripting/gdextension/gdextension_cpp_example.rst index e89ee066af6..d43716deabb 100644 --- a/tutorials/scripting/gdextension/gdextension_cpp_example.rst +++ b/tutorials/scripting/gdextension/gdextension_cpp_example.rst @@ -268,8 +268,8 @@ GDExtension plugin. extern "C" { // Initialization. - GDExtensionBool GDE_EXPORT example_library_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) { - godot::GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization); + GDExtensionBool GDE_EXPORT example_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) { + godot::GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization); init_obj.register_initializer(initialize_example_module); init_obj.register_terminator(uninitialize_example_module); @@ -348,6 +348,7 @@ loaded for each platform and the entry function for the module. It is called ``g [configuration] entry_symbol = "example_library_init" + compatibility_minimum = 4.1 [libraries] @@ -369,6 +370,8 @@ loaded for each platform and the entry function for the module. It is called ``g android.release.arm64 = "res://bin/libgdexample.android.template_release.arm64.so" This file contains a ``configuration`` section that controls the entry function of the module. +You should also set the minimum compatible Godot version with ``compatability_minimum``, +which prevents older version of Godot from trying to load your extension. The ``libraries`` section is the important bit: it tells Godot the location of the dynamic library in the project's filesystem for each supported platform. It will From 16d183167abce75a2000c8ad7a3ffaf2a852ceb6 Mon Sep 17 00:00:00 2001 From: Hana - Piralein <48352564+Piralein@users.noreply.github.com> Date: Fri, 19 May 2023 18:09:00 +0200 Subject: [PATCH 13/76] clarify UI position setup --- .../first_2d_game/06.heads_up_display.rst | 51 +++++++------------ 1 file changed, 17 insertions(+), 34 deletions(-) diff --git a/getting_started/first_2d_game/06.heads_up_display.rst b/getting_started/first_2d_game/06.heads_up_display.rst index e00cf50b1ea..973afcc0fb8 100644 --- a/getting_started/first_2d_game/06.heads_up_display.rst +++ b/getting_started/first_2d_game/06.heads_up_display.rst @@ -36,15 +36,12 @@ Inspector. The default font for ``Control`` nodes is small and doesn't scale well. There is a font file included in the game assets called "Xolonium-Regular.ttf". To use this font, do the following: -1. Under "Theme Overrides > Fonts", choose "Load" and select the "Xolonium-Regular.ttf" file. +Under "Theme Overrides > Fonts", choose "Load" and select the "Xolonium-Regular.ttf" file. .. image:: img/custom_font_load_font.webp -Once you've done this on the ``ScoreLabel``, you can click the down arrow next -to the Font property and choose "Copy", then "Paste" it in the same place -on the other two Control nodes. -Set the "Font Size" property of the ``ScoreLabel`` under "Theme Overrides > Font Sizes". -A setting of ``64`` works well. +The font size is still to small, increase it to ``64`` under "Theme Overrides > Font Sizes". +Once you've done this with the ``ScoreLabel``, repeat the changes for the ``Message`` and ``StartButton`` nodes. .. image:: img/custom_font_size.webp @@ -54,48 +51,34 @@ A setting of ``64`` works well. Arrange the nodes as shown below. You can drag the nodes to place them manually, or for more precise placement, -use "Anchor Presets" with the following settings: +use "Anchor Presets". .. image:: img/ui_anchor.webp ScoreLabel ~~~~~~~~~~ -Layout : - -- Anchor Preset : ``Center Top`` - -Label settings : - -- Text : ``0`` -- Horizontal Alignment : ``Center`` -- Vertical Alignment : ``Center`` +1. Add the text ``0``. +2. Set the "Horizontal Alignment" and "Vertical Alignment" to ``Center``. +3. Choose the "Anchor Preset" ``Center Top``. Message ~~~~~~~~~~~~ -Layout : - -- Anchor Preset : ``Center`` - -Label settings : - -- Text : ``Dodge the Creeps!`` -- Horizontal Alignment : ``Center`` -- Vertical Alignment : ``Center`` -- Autowrap Mode : ``Word`` +1. Add the text ``Dodge the creeps!``. +2. Set the "Horizontal Alignment" and "Vertical Alignment" to ``Center``. +3. Set the "Autowrap Mode" to ``Word``, otherwise the label will stay on one line. +4. Under "Control - Layout/Transform" set "Size X" to ``480`` to use the entire width of the screen. +5. Choose the "Anchor Preset" ``Center``. StartButton ~~~~~~~~~~~ -Layout : - -- Anchor Preset : ``Center Bottom`` - -Button settings : - -- Text : ``Start`` -- Position Y : ``580`` (Control - Layout/Transform) +1. Add the text ``Start``. +2. Under "Control - Layout/Transform", set "Size X" to ``200`` and "Size Y" to ``100`` + to add a little bit more padding between the border and text. +3. Choose the "Anchor Preset" ``Center Bottom``. +4. Under "Control - Layout/Transform", set "Position Y" to ``580``. On the ``MessageTimer``, set the ``Wait Time`` to ``2`` and set the ``One Shot`` property to "On". From f337bb0f825205eea97fd8418951db9f2fb89472 Mon Sep 17 00:00:00 2001 From: Hana - Piralein <48352564+Piralein@users.noreply.github.com> Date: Fri, 19 May 2023 18:19:33 +0200 Subject: [PATCH 14/76] improve description of enums --- .../scripting/gdscript/gdscript_basics.rst | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/tutorials/scripting/gdscript/gdscript_basics.rst b/tutorials/scripting/gdscript/gdscript_basics.rst index 95379c08822..4c7c02c274b 100644 --- a/tutorials/scripting/gdscript/gdscript_basics.rst +++ b/tutorials/scripting/gdscript/gdscript_basics.rst @@ -908,26 +908,38 @@ Enums Enums are basically a shorthand for constants, and are pretty useful if you want to assign consecutive integers to some constant. -If you pass a name to the enum, it will put all the keys inside a constant -dictionary of that name. - -.. important:: In Godot 3.1 and later, keys in a named enum are not registered - as global constants. They should be accessed prefixed by the - enum's name (``Name.KEY``); see an example below. - :: enum {TILE_BRICK, TILE_FLOOR, TILE_SPIKE, TILE_TELEPORT} + # Is the same as: const TILE_BRICK = 0 const TILE_FLOOR = 1 const TILE_SPIKE = 2 const TILE_TELEPORT = 3 + +If you pass a name to the enum, it will put all the keys inside a constant +:ref:`Dictionary ` of that name. This means all constant methods of +a dictionary can also be used with a named enum. + +.. important:: Keys in a named enum are not registered + as global constants. They should be accessed prefixed + by the enum's name (``Name.KEY``). + +:: + enum State {STATE_IDLE, STATE_JUMP = 5, STATE_SHOOT} + # Is the same as: const State = {STATE_IDLE = 0, STATE_JUMP = 5, STATE_SHOOT = 6} - # Access values with State.STATE_IDLE, etc. + + func _ready(): + # Access values with Name.KEY, prints '5' + print(State.STATE_JUMP) + # Use constant dictionary functions + # prints '["STATE_IDLE", "STATE_JUMP", "STATE_SHOOT"]' + print(State.keys()) Functions From 70434839458ba0919c085dccdc3e6114c37a366f Mon Sep 17 00:00:00 2001 From: Hana - Piralein <48352564+Piralein@users.noreply.github.com> Date: Fri, 19 May 2023 19:23:20 +0200 Subject: [PATCH 15/76] update images and clarify scene information --- .../step_by_step/img/signals_01_new_scene.png | Bin 4044 -> 0 bytes .../img/signals_01_new_scene.webp | Bin 0 -> 5824 bytes .../step_by_step/img/signals_02_2d_scene.png | Bin 3608 -> 0 bytes .../step_by_step/img/signals_02_2d_scene.webp | Bin 0 -> 5242 bytes .../img/signals_04_add_child_node.png | Bin 31479 -> 0 bytes .../img/signals_04_add_child_node.webp | Bin 0 -> 7638 bytes .../img/signals_05_add_button.png | Bin 8231 -> 0 bytes .../img/signals_05_add_button.webp | Bin 0 -> 12500 bytes .../img/signals_07_select_tool.png | Bin 1452 -> 0 bytes .../img/signals_07_select_tool.webp | Bin 0 -> 1556 bytes .../img/signals_08_toggle_motion_text.png | Bin 11397 -> 0 bytes .../img/signals_08_toggle_motion_text.webp | Bin 0 -> 6524 bytes .../step_by_step/img/signals_10_node_dock.png | Bin 2096 -> 0 bytes .../img/signals_10_node_dock.webp | Bin 0 -> 3640 bytes .../img/signals_11_pressed_signals.png | Bin 3747 -> 0 bytes .../img/signals_11_pressed_signals.webp | Bin 0 -> 6944 bytes getting_started/step_by_step/signals.rst | 33 +++++++++--------- 17 files changed, 17 insertions(+), 16 deletions(-) delete mode 100644 getting_started/step_by_step/img/signals_01_new_scene.png create mode 100644 getting_started/step_by_step/img/signals_01_new_scene.webp delete mode 100644 getting_started/step_by_step/img/signals_02_2d_scene.png create mode 100644 getting_started/step_by_step/img/signals_02_2d_scene.webp delete mode 100644 getting_started/step_by_step/img/signals_04_add_child_node.png create mode 100644 getting_started/step_by_step/img/signals_04_add_child_node.webp delete mode 100644 getting_started/step_by_step/img/signals_05_add_button.png create mode 100644 getting_started/step_by_step/img/signals_05_add_button.webp delete mode 100644 getting_started/step_by_step/img/signals_07_select_tool.png create mode 100644 getting_started/step_by_step/img/signals_07_select_tool.webp delete mode 100644 getting_started/step_by_step/img/signals_08_toggle_motion_text.png create mode 100644 getting_started/step_by_step/img/signals_08_toggle_motion_text.webp delete mode 100644 getting_started/step_by_step/img/signals_10_node_dock.png create mode 100644 getting_started/step_by_step/img/signals_10_node_dock.webp delete mode 100644 getting_started/step_by_step/img/signals_11_pressed_signals.png create mode 100644 getting_started/step_by_step/img/signals_11_pressed_signals.webp diff --git a/getting_started/step_by_step/img/signals_01_new_scene.png b/getting_started/step_by_step/img/signals_01_new_scene.png deleted file mode 100644 index a72018df68ea957f7e629c7cd4cbb75385310654..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4044 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 diff --git a/getting_started/step_by_step/img/signals_01_new_scene.webp b/getting_started/step_by_step/img/signals_01_new_scene.webp new file mode 100644 index 0000000000000000000000000000000000000000..3b397376cc1ae19b0c514d4e0a3dfe2e46e33d1b GIT binary patch literal 5824 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 literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/img/signals_02_2d_scene.png b/getting_started/step_by_step/img/signals_02_2d_scene.png deleted file mode 100644 index b6113054d128b4b62d34b6a1b05a2817c217971f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3608 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 diff --git a/getting_started/step_by_step/img/signals_02_2d_scene.webp b/getting_started/step_by_step/img/signals_02_2d_scene.webp new file mode 100644 index 0000000000000000000000000000000000000000..da91e3e4f5ca7adaf682a602e37c020edc6e6fe2 GIT binary patch literal 5242 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 ASO5S3 literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/img/signals_04_add_child_node.png b/getting_started/step_by_step/img/signals_04_add_child_node.png deleted file mode 100644 index c624b3dc974864296324a7a11514eba9f3876883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31479 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 AHUIzs diff --git a/getting_started/step_by_step/img/signals_04_add_child_node.webp b/getting_started/step_by_step/img/signals_04_add_child_node.webp new file mode 100644 index 0000000000000000000000000000000000000000..cea7e61a347d09dc2cfe3b5eee242c9fe7e8834f GIT binary patch literal 7638 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 E2Wn)T1ONa4 literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/img/signals_05_add_button.png b/getting_started/step_by_step/img/signals_05_add_button.png deleted file mode 100644 index e16f8896680b8f004a9c2b3717c8f596ce325e91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8231 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 JhPw6me*nPyCqw`M diff --git a/getting_started/step_by_step/img/signals_05_add_button.webp b/getting_started/step_by_step/img/signals_05_add_button.webp new file mode 100644 index 0000000000000000000000000000000000000000..07789d61347be1f5f84573c1362473214ab39f59 GIT binary patch literal 12500 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 ebT9lg(;^ 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 Gj<*00wF$2P literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/img/signals_08_toggle_motion_text.png b/getting_started/step_by_step/img/signals_08_toggle_motion_text.png deleted file mode 100644 index 9d8b14d4f0b7e4f296bfe628835d69a2cc3d8642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11397 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 literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/img/signals_10_node_dock.png b/getting_started/step_by_step/img/signals_10_node_dock.png deleted file mode 100644 index a2dad389b32911f3ecfc7ca81cb378488396817b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2096 zcmYk8eK^zWAIG<$v4dzH4lR$B$R>&QWBBDEn#}V#n5PIuF>NO+leO9zy-=o^>}iw^vp_ zPUYp^EV`SOTa=cbf03R|zK|AAqDIA>#fQcF21L2yg6y1pEo?k2tzA(E9Cw@A=y_P0j9Q6qhdkqLj1$_~|Y@fy7Xf+%MGZ+kR3Sw<=j&UxA05SS^h=&>{ z?3HFl8o7lJz)h4!+$I}X5hZz&!p7ygtDcj+y?f5%(rQ0=wJM(m=^e-nz{1MG6W zWkk!o#9N`4KJ?6blI39rsj?_ox<;q;W?0lvElOJ882&C^#*Q0ELo02z-ifFu)#{Nh zySo#`UVpw+CZCbO?2Dx)Cb^LG$(jXg;B)fUg%xV2j2|{diuL~3_sA%8>~KD{)(!LE z)2KVqmI<+MgNCHA@8H=)TGugfVr&`HpZ&8eUm^pS$e?pucl!a;@#wZ46iJ+jmLyxe zmwY28Q(o{ zx5a@&pAZ*4ne-n`rs*q`LU;2gPn)kRq0?!^lY7Is(Be|rirPh0*Si=3EsazzpBE=n z9JI>o>iTVfPWqN;yxM2_W^xEx>3udrevR)4*lWZXFBA*pSzLv+07pO;w;3B4Vv%Hn zN;T@$;wiA^<^i=$k8N7eM+zEmLZV;@Yz9jTOE)%z0|+f`HC~Dhc~E2N_T**8NAxAY zNLANn=={YcoYfzCYB zJLtLZB&YoOh;Yd{lnBT#LoEp8+)nWC{n>;R@2Ewk?U-SUVo@Xjze~$C$7qVfAP3K!ko`KlR zCM`t!a0+x;vC3aat^VL+nONRlSQVm%APr75=hNkNBK95SZ9ya*iDjAyC%!uKN-7wu zyx0R2*?M|Iqnr8+={HAtVQaqt*)S(EM!lVhCre2Q4G4a5NL+7;Cp0(Ja}$^*kc}wu z)0$i1##;?(2hWyULvTR+&9yBv0`fFJKcm6cFNt|iQ*O4oYPJnbsT)X7kM4S2y7l*3 z)p}0MtoPz=pk~r~#kN8X)#>lCbA11ERYKCeZz#WN1)WGULn{G?V(T{BvFX)+H2%MN ze@uFnOi|6U6#gx=_=6+h<5&IX30_%)@Ubz zg!F6YYiJd97(El@xZ80dF88ykNcqD09vX-7y3~i3)sufIa#WvChuV<8x0Bz4+Y5Jl zVHz@dE&%UP^!TJju>JV>X~}$lNZvd9V|Z4}FHJ$>Qq@x?jI^{>o>8>}cBuV}O0Y5X z^P{D~tcmQ~UT_@$@CuOkQNunod41s4*y+BpLu7ODzRx|gfSa#6H@e=yJL=V%h;(JG z5`kO&F1g!YCTKYS7y2-0u}7;48HsMdCKU5B3W-WqP86sWZ_?~QC64<~#}BoszJDiCop=KA)| zmn^S*UBpjnX+)1kkW5UYRWv7X;$7O2u&W2LAC_&<_r~9Zh+!@^^3Ps$qXx>no8Cv^L1{2G|sTx2D1Xa!>jN03C70 KIaN7?(f$V&_5^tV diff --git a/getting_started/step_by_step/img/signals_10_node_dock.webp b/getting_started/step_by_step/img/signals_10_node_dock.webp new file mode 100644 index 0000000000000000000000000000000000000000..a6a5acec3f37b56a914830b14465874999c48306 GIT binary patch literal 3640 zcmV-84#)9QNk&F64gdgGMM6+kP&iB@4gdfzJV7A<71^8rf05hfxs<^WHrtY!nVH!l zGs$7*#LUdh%*Qi3*NT_TUIbcC1;Rq6B(Z4^eHFu=JOP+2iAft&Iw}NCWK*Uf zG7lXUp7xY*VUR08Fq}fAR;iS`(L<$D^h%T5VUGG=#iB(;-!%Toet?dgLY zx0dz4m>FHyW8 zQV|Zrv5_>5UulNfTOJvJQKA-(%ZQ6b40v=V1(?NW&L3~9OxWMHcXibTVYnRw1tJmy3Ge%`7|a4 z)oGN_If}?JNx`=iz9GZw!?~ zCFD6+q++zPK$vqBStW-@A13)r#F^sy_fr=$p)8OFl;ZDPF z0ALe~7C2!rtaY=*w{Z{At!#NVTIErcqAIV##92#+%%SaVE?uRh`NQFqSv0NaqjfF^ ztb467n4$1Zye6tg0X!!L>S9pXS^@xY24JjeFHkEO3b_z3iP{Ho^+P1SjdN*8^z2Le z*DcZ!v}!r%Cn0k-T6$aD+NwesJ1cC?Whq%0DSNAxBIf)&Q5Nd3){UAo055%HW*z37 zxY^ImMk5D6sjH~MQ!@NSZ}CybCbR(#Op1JvsguaG`eLx&cYEKlh2l!CmY6wAmTZzr z0qhx-o;)!ZJ^&$bU~GDzwaKSTS_~am4aTrJ3}(`&Y}K%sopz&&5^Cg-R}nFIPComr zKJR`D@jF$@kt=4!sFhnl9nrWzjFDZgJikdXPU~DwKv=BOiUDk6()!9{Wk&$7$y%;D zDg-`|`XI*xUDbPxRW^KePHpvVK0K#3SB>DSb84&1 zgbxM5gH6CWwduuNnM%C{An|Rcmn7;28!7J!_98~acC&pUH|Z)%gd-K{ct?jjQxa3k z=br~XIFAw+S$czp8d1Pd|62t26Y@6`>84t%N&_1yhz{9W5)roJa={O{ohbSkY6hZ= zzY)^@4ihPRMH+6hp-&8T+$<5eW!05eo$u%gN;h#}JMK@(LUd{WOi>tWCZY^Gd&TA^ zQ9RaXpNA$ci;X=D={NRZEp&FxfzVQ8b*UJz9Rv{(2q6Txfc)}j`4~P z9mcR$>w*a70+tX_m`H6VcaF=cDg!Y`0eq8G93;pdL|E55STQD|wAq_HO>WWW*iIQ3 zHnh%_cX=iWlOuN{gpf-~r#m<&N|BhwKqWen+DxMCiem*QLI^2VqQF(8<1@MUjh8Ph zS)0ygkgsHI&w%GXU`HcTn~5y;Ild1zskgm^Qum@{)4;7sid$x-4u`=JBQ=cZO7bHwv?CcerOL-Sz7q8Vv z6KNn~1kynk9VmQu>7i%OQlm^-^Zg#rAcT$p z_~vqDg@TFKq)tKc_@1e!#~oy4#BkZfoJA-O3PoBaSeIIX-#DLmdPN$Jjq~6}KOx{ZD26;kT^c|El#*0T?GwIVd2Ggo_vJ zd$6L1YPJ9X>J-m{!?pmB4!z8;(x|4ZCbx`+He)E$Vm3NkB!#7c!2i1pE2*69c zB4vkYG|<T>+UwKL8@@k)a zHBPS5PrTGVCl8x4h6QDba*D(wt5Q&^7jsqKh_{%w&boYYVW2oLE?m3}40v}mTs2rx z4|WL2u67pg;|}d1mw(~4*T(MxW2(~B^v&cb+ z+UMq~(BC<4Yn{tAyNn88fij*gK}M~~N3xV1?t_+0QUtYDM1?q-;ELpJ&Sa^|3{;91 z@UO@;UCzRD!cP7|qbWAbS^kS7^sV1^@@(&5hlsS!J&JnxJC{49hg)yGb%Zfqxf1|pk}7c5 z3l&cWT>wA=^gFP18VX>hInF_oL;(PUw%K0N$(*LEz}*>y-FmC$kN*Nt-v6_=z%^Z20;x`1PBDVqOrzRxbUN?|8&1 zODp3jPKdKu*HHN&h`0i{%NXqIhpZsHJJ^{f&lsBq^_>7PO5<^*W*8#kUJe@Vm|3yb z`iO|O0H~{+d0`qd$@X_BX{oaL23v#>Ld0vB#!CXAqaL9B=Z(w`1Q5bd1jV4vTUZ11 z9{^LtPLXK<0H7PDxq+^4ddc+9&EX!rFv9D#8r<3V&O)pISH6=PlFDUxblbvqg!8Yp zW4|~GZN{GUykgx)wc0#KJ~>7d@haKU0<0M!8Z-b07b(YG$}&C%=oCWCgi9DB3R zc!kq<2Oh~AMx*NH4iXCXEjScwnZdA)iw_fb8pIwPmrYJ|Udn~?ntI}R)m{L5>7d<9 z7Q5>xI{MaWTaHfu(P`kiwm^w(l2D~#^`SkOk^x}>L#GqOVxD3yX`Wu5-*^p9g zB?W;uv@x&}KD+wrLX4z>h>O%Pq`WT}EduWY KSQ-kmD*ym{_TgIq literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/img/signals_11_pressed_signals.png b/getting_started/step_by_step/img/signals_11_pressed_signals.png deleted file mode 100644 index 3b7752b11d676d422f7e95217cf341107c83ad2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3747 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 diff --git a/getting_started/step_by_step/img/signals_11_pressed_signals.webp b/getting_started/step_by_step/img/signals_11_pressed_signals.webp new file mode 100644 index 0000000000000000000000000000000000000000..1aba6c1ac68e5a7239c914ffd43b9df220227f5e GIT binary patch literal 6944 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 literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/signals.rst b/getting_started/step_by_step/signals.rst index dd716253f80..e5d737b5031 100644 --- a/getting_started/step_by_step/signals.rst +++ b/getting_started/step_by_step/signals.rst @@ -38,19 +38,19 @@ Scene setup ----------- To add a button to our game, we will create a new main scene which will include -both a button and the ``Sprite2D.tscn`` scene that we scripted in previous -lessons. +both a :ref:`Button ` and the ``sprite_2d.tscn`` scene we created in +the :ref:`doc_scripting_first_script` lesson. Create a new scene by going to the menu Scene -> New Scene. -.. image:: img/signals_01_new_scene.png +.. image:: img/signals_01_new_scene.webp -In the Scene dock, click the 2D Scene button. This will add a Node2D as our -root. +In the Scene dock, click the 2D Scene button. This will add +a :ref:`Node2D ` as our root. -.. image:: img/signals_02_2d_scene.png +.. image:: img/signals_02_2d_scene.webp -In the FileSystem dock, click and drag the ``Sprite2D.tscn`` file you saved +In the FileSystem dock, click and drag the ``sprite_2d.tscn`` file you saved previously onto the Node2D to instantiate it. .. image:: img/signals_03_dragging_scene.png @@ -58,11 +58,11 @@ previously onto the Node2D to instantiate it. We want to add another node as a sibling of the Sprite2D. To do so, right-click on Node2D and select Add Child Node. -.. image:: img/signals_04_add_child_node.png +.. image:: img/signals_04_add_child_node.webp -Search for the Button node type and add it. +Search for the :ref:`Button ` node and add it. -.. image:: img/signals_05_add_button.png +.. image:: img/signals_05_add_button.webp The node is small by default. Click and drag on the bottom-right handle of the Button in the viewport to resize it. @@ -71,20 +71,21 @@ Button in the viewport to resize it. If you don't see the handles, ensure the select tool is active in the toolbar. -.. image:: img/signals_07_select_tool.png +.. image:: img/signals_07_select_tool.webp Click and drag on the button itself to move it closer to the sprite. You can also write a label on the Button by editing its Text property in the -Inspector. Enter "Toggle motion". +Inspector. Enter ``Toggle motion``. -.. image:: img/signals_08_toggle_motion_text.png +.. image:: img/signals_08_toggle_motion_text.webp Your scene tree and viewport should look like this. .. image:: img/signals_09_scene_setup.png -Save your newly created scene. You can then run it with :kbd:`F6` (:kbd:`Cmd + R` on macOS). +Save your newly created scene as ``node_2d.tscn``, if you haven't already. +You can then run it with :kbd:`F6` (:kbd:`Cmd + R` on macOS). At the moment, the button will be visible, but nothing will happen if you press it. @@ -99,11 +100,11 @@ lesson. You can connect signals in the Node dock. Select the Button node and, on the right side of the editor, click on the tab named "Node" next to the Inspector. -.. image:: img/signals_10_node_dock.png +.. image:: img/signals_10_node_dock.webp The dock displays a list of signals available on the selected node. -.. image:: img/signals_11_pressed_signals.png +.. image:: img/signals_11_pressed_signals.webp Double-click the "pressed" signal to open the node connection window. From 6593354eaa61539e8e8b1363362f7eb74c06aa4f Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sat, 20 May 2023 04:05:44 +0200 Subject: [PATCH 16/76] Mention that all font sizes in Godot are in pixels, not points in Using fonts --- tutorials/ui/gui_using_fonts.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tutorials/ui/gui_using_fonts.rst b/tutorials/ui/gui_using_fonts.rst index cb23738347c..7ee0f6511a9 100644 --- a/tutorials/ui/gui_using_fonts.rst +++ b/tutorials/ui/gui_using_fonts.rst @@ -145,9 +145,13 @@ property that accepts a Font resource. Fonts that have a pixel art appearance should have bilinear filtering disabled by changing the **Rendering > Textures > Canvas Textures > Default Texture Filter** - project setting to **Nearest**. The font size must also be an integer multiple of the - design size (which varies on a per-font basis), and the Control node using the font - must be scaled by an integer multiple as well. Otherwise, the font may look blurry. + project setting to **Nearest**. + + The font size must also be an integer multiple of the design size (which + varies on a per-font basis), and the Control node using the font must be + scaled by an integer multiple as well. Otherwise, the font may look blurry. + Font sizes in Godot are specified in pixels (px), not points (pt). Keep this + in mind when comparing font sizes across different software. The texture filter mode can also be set on individual nodes that inherit from CanvasItem by setting :ref:`CanvasItem.texture_filter `. From 167c58e46fc7b3f92feebc4d6a533fdc062fa795 Mon Sep 17 00:00:00 2001 From: Godot Organization Date: Sat, 20 May 2023 03:19:15 +0000 Subject: [PATCH 17/76] classref: Sync with current master branch (809a982) --- classes/class_@globalscope.rst | 8 +- classes/class_animationnodeoneshot.rst | 68 +++- classes/class_animationplayer.rst | 4 +- classes/class_canvasitem.rst | 244 +++++++------- classes/class_displayserver.rst | 36 ++ classes/class_editorinterface.rst | 214 +++++++----- classes/class_font.rst | 146 ++++---- classes/class_gdextension.rst | 24 +- classes/class_gdscript.rst | 4 +- classes/class_inputevent.rst | 28 ++ classes/class_inputeventmidi.rst | 8 +- classes/class_inputeventmousebutton.rst | 19 ++ classes/class_inputeventscreentouch.rst | 19 ++ classes/class_label.rst | 19 ++ classes/class_label3d.rst | 19 ++ classes/class_mutex.rst | 12 + classes/class_node.rst | 14 + classes/class_os.rst | 19 ++ classes/class_parallaxlayer.rst | 6 +- classes/class_particleprocessmaterial.rst | 324 +++++++++--------- classes/class_placeholdercubemap.rst | 2 + classes/class_placeholdercubemaparray.rst | 2 + classes/class_placeholdertexture2d.rst | 2 + classes/class_placeholdertexture2darray.rst | 2 + classes/class_placeholdertexture3d.rst | 2 + classes/class_placeholdertexturelayered.rst | 2 + classes/class_projectsettings.rst | 34 ++ classes/class_richtextlabel.rst | 256 +++++++------- classes/class_semaphore.rst | 8 + classes/class_string.rst | 2 +- classes/class_stringname.rst | 10 +- classes/class_textedit.rst | 4 +- classes/class_textmesh.rst | 19 ++ classes/class_textparagraph.rst | 6 +- classes/class_textserver.rst | 42 ++- classes/class_textserverextension.rst | 4 +- classes/class_thread.rst | 10 + classes/class_window.rst | 350 +++++++++++++------- classes/class_workerthreadpool.rst | 38 ++- 39 files changed, 1289 insertions(+), 741 deletions(-) diff --git a/classes/class_@globalscope.rst b/classes/class_@globalscope.rst index 76dce099a6e..26b8db1cf37 100644 --- a/classes/class_@globalscope.rst +++ b/classes/class_@globalscope.rst @@ -2823,7 +2823,7 @@ Enum value which doesn't correspond to any MIDI message. This is used to initial :ref:`MIDIMessage` **MIDI_MESSAGE_NOTE_OFF** = ``8`` -MIDI note OFF message. See the documentation of :ref:`InputEventMIDI` for information of how to use MIDI inputs. +MIDI note OFF message. Not all MIDI devices send this event; some send :ref:`MIDI_MESSAGE_NOTE_ON` with zero velocity instead. See the documentation of :ref:`InputEventMIDI` for information of how to use MIDI inputs. .. _class_@GlobalScope_constant_MIDI_MESSAGE_NOTE_ON: @@ -2831,7 +2831,7 @@ MIDI note OFF message. See the documentation of :ref:`InputEventMIDI` **MIDI_MESSAGE_NOTE_ON** = ``9`` -MIDI note ON message. See the documentation of :ref:`InputEventMIDI` for information of how to use MIDI inputs. +MIDI note ON message. Some MIDI devices send this event with velocity zero instead of :ref:`MIDI_MESSAGE_NOTE_OFF`, but implementations vary. See the documentation of :ref:`InputEventMIDI` for information of how to use MIDI inputs. .. _class_@GlobalScope_constant_MIDI_MESSAGE_AFTERTOUCH: @@ -3982,7 +3982,7 @@ An export preset property with this flag contains confidential information and i :ref:`PropertyUsageFlags` **PROPERTY_USAGE_DEFAULT** = ``6`` -Default usage (storage, editor and network). +Default usage (storage and editor). .. _class_@GlobalScope_constant_PROPERTY_USAGE_NO_EDITOR: @@ -3990,7 +3990,7 @@ Default usage (storage, editor and network). :ref:`PropertyUsageFlags` **PROPERTY_USAGE_NO_EDITOR** = ``2`` -Default usage but without showing the property in the editor (storage, network). +Default usage but without showing the property in the editor (storage). .. rst-class:: classref-item-separator diff --git a/classes/class_animationnodeoneshot.rst b/classes/class_animationnodeoneshot.rst index 7b102b2521d..0dd9e199cc1 100644 --- a/classes/class_animationnodeoneshot.rst +++ b/classes/class_animationnodeoneshot.rst @@ -38,10 +38,20 @@ After setting the request and changing the animation playback, the one-shot node # Alternative syntax (same result as above). animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT + # Abort child animation with fading out connected to "shot" port. + animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT) + # Alternative syntax (same result as above). + animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT + # Get current state (read-only). - animation_tree.get("parameters/OneShot/active")) + animation_tree.get("parameters/OneShot/active") # Alternative syntax (same result as above). animation_tree["parameters/OneShot/active"] + + # Get current internal state (read-only). + animation_tree.get("parameters/OneShot/internal_active") + # Alternative syntax (same result as above). + animation_tree["parameters/OneShot/internal_active"] .. code-tab:: csharp @@ -51,8 +61,14 @@ After setting the request and changing the animation playback, the one-shot node // Abort child animation connected to "shot" port. animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT); + // Abort child animation with fading out connected to "shot" port. + animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT); + // Get current state (read-only). animationTree.Get("parameters/OneShot/active"); + + // Get current internal state (read-only). + animationTree.Get("parameters/OneShot/internal_active"); @@ -80,8 +96,12 @@ Properties +---------------------------------------------------+-----------------------------------------------------------------------------------------------+-----------+ | :ref:`float` | :ref:`autorestart_random_delay` | ``0.0`` | +---------------------------------------------------+-----------------------------------------------------------------------------------------------+-----------+ + | :ref:`Curve` | :ref:`fadein_curve` | | + +---------------------------------------------------+-----------------------------------------------------------------------------------------------+-----------+ | :ref:`float` | :ref:`fadein_time` | ``0.0`` | +---------------------------------------------------+-----------------------------------------------------------------------------------------------+-----------+ + | :ref:`Curve` | :ref:`fadeout_curve` | | + +---------------------------------------------------+-----------------------------------------------------------------------------------------------+-----------+ | :ref:`float` | :ref:`fadeout_time` | ``0.0`` | +---------------------------------------------------+-----------------------------------------------------------------------------------------------+-----------+ | :ref:`MixMode` | :ref:`mix_mode` | ``0`` | @@ -126,6 +146,14 @@ The request to play the animation connected to "shot" port. The request to stop the animation connected to "shot" port. +.. _class_AnimationNodeOneShot_constant_ONE_SHOT_REQUEST_FADE_OUT: + +.. rst-class:: classref-enumeration-constant + +:ref:`OneShotRequest` **ONE_SHOT_REQUEST_FADE_OUT** = ``3`` + +The request to fade out the animation connected to "shot" port. + .. rst-class:: classref-item-separator ---- @@ -214,6 +242,23 @@ If :ref:`autorestart` is ``true ---- +.. _class_AnimationNodeOneShot_property_fadein_curve: + +.. rst-class:: classref-property + +:ref:`Curve` **fadein_curve** + +.. rst-class:: classref-property-setget + +- void **set_fadein_curve** **(** :ref:`Curve` value **)** +- :ref:`Curve` **get_fadein_curve** **(** **)** + +Determines how cross-fading between animations is eased. If empty, the transition will be linear. + +.. rst-class:: classref-item-separator + +---- + .. _class_AnimationNodeOneShot_property_fadein_time: .. rst-class:: classref-property @@ -225,7 +270,24 @@ If :ref:`autorestart` is ``true - void **set_fadein_time** **(** :ref:`float` value **)** - :ref:`float` **get_fadein_time** **(** **)** -The fade-in duration. For example, setting this to ``1.0`` for a 5 second length animation will produce a crossfade that starts at 0 second and ends at 1 second during the animation. +The fade-in duration. For example, setting this to ``1.0`` for a 5 second length animation will produce a cross-fade that starts at 0 second and ends at 1 second during the animation. + +.. rst-class:: classref-item-separator + +---- + +.. _class_AnimationNodeOneShot_property_fadeout_curve: + +.. rst-class:: classref-property + +:ref:`Curve` **fadeout_curve** + +.. rst-class:: classref-property-setget + +- void **set_fadeout_curve** **(** :ref:`Curve` value **)** +- :ref:`Curve` **get_fadeout_curve** **(** **)** + +Determines how cross-fading between animations is eased. If empty, the transition will be linear. .. rst-class:: classref-item-separator @@ -242,7 +304,7 @@ The fade-in duration. For example, setting this to ``1.0`` for a 5 second length - void **set_fadeout_time** **(** :ref:`float` value **)** - :ref:`float` **get_fadeout_time** **(** **)** -The fade-out duration. For example, setting this to ``1.0`` for a 5 second length animation will produce a crossfade that starts at 4 second and ends at 5 second during the animation. +The fade-out duration. For example, setting this to ``1.0`` for a 5 second length animation will produce a cross-fade that starts at 4 second and ends at 5 second during the animation. .. rst-class:: classref-item-separator diff --git a/classes/class_animationplayer.rst b/classes/class_animationplayer.rst index 28c190beec3..6052e4bb834 100644 --- a/classes/class_animationplayer.rst +++ b/classes/class_animationplayer.rst @@ -798,7 +798,9 @@ See also :ref:`stop`. void **play** **(** :ref:`StringName` name="", :ref:`float` custom_blend=-1, :ref:`float` custom_speed=1.0, :ref:`bool` from_end=false **)** -Plays the animation with key ``name``. Custom blend times and speed can be set. If ``custom_speed`` is negative and ``from_end`` is ``true``, the animation will play backwards (which is equivalent to calling :ref:`play_backwards`). +Plays the animation with key ``name``. Custom blend times and speed can be set. + +The ``from_end`` option only affects when switching to a new animation track, or if the same track but at the start or end. It does not affect resuming playback that was paused in the middle of an animation. If ``custom_speed`` is negative and ``from_end`` is ``true``, the animation will play backwards (which is equivalent to calling :ref:`play_backwards`). The **AnimationPlayer** keeps track of its current or last played animation with :ref:`assigned_animation`. If this method is called with that same animation ``name``, or with no ``name`` parameter, the assigned animation will resume playing if it was paused. diff --git a/classes/class_canvasitem.rst b/classes/class_canvasitem.rst index 48e37ee3336..fe7816188e3 100644 --- a/classes/class_canvasitem.rst +++ b/classes/class_canvasitem.rst @@ -92,121 +92,121 @@ Methods .. table:: :widths: auto - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_draw` **(** **)** |virtual| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_animation_slice` **(** :ref:`float` animation_length, :ref:`float` slice_begin, :ref:`float` slice_end, :ref:`float` offset=0.0 **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_arc` **(** :ref:`Vector2` center, :ref:`float` radius, :ref:`float` start_angle, :ref:`float` end_angle, :ref:`int` point_count, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_char` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` char, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_char_outline` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` char, :ref:`int` font_size=16, :ref:`int` size=-1, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_circle` **(** :ref:`Vector2` position, :ref:`float` radius, :ref:`Color` color **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_colored_polygon` **(** :ref:`PackedVector2Array` points, :ref:`Color` color, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`Texture2D` texture=null **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_dashed_line` **(** :ref:`Vector2` from, :ref:`Vector2` to, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`float` dash=2.0, :ref:`bool` aligned=true **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_end_animation` **(** **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_lcd_texture_rect_region` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_line` **(** :ref:`Vector2` from, :ref:`Vector2` to, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_mesh` **(** :ref:`Mesh` mesh, :ref:`Texture2D` texture, :ref:`Transform2D` transform=Transform2D(1, 0, 0, 1, 0, 0), :ref:`Color` modulate=Color(1, 1, 1, 1) **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_msdf_texture_rect_region` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`float` outline=0.0, :ref:`float` pixel_range=4.0, :ref:`float` scale=1.0 **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_multiline` **(** :ref:`PackedVector2Array` points, :ref:`Color` color, :ref:`float` width=-1.0 **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_multiline_colors` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0 **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_multiline_string` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_multiline_string_outline` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_multimesh` **(** :ref:`MultiMesh` multimesh, :ref:`Texture2D` texture **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_polygon` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`Texture2D` texture=null **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_polyline` **(** :ref:`PackedVector2Array` points, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_polyline_colors` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_primitive` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`PackedVector2Array` uvs, :ref:`Texture2D` texture=null **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_rect` **(** :ref:`Rect2` rect, :ref:`Color` color, :ref:`bool` filled=true, :ref:`float` width=-1.0 **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_set_transform` **(** :ref:`Vector2` position, :ref:`float` rotation=0.0, :ref:`Vector2` scale=Vector2(1, 1) **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_set_transform_matrix` **(** :ref:`Transform2D` xform **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_string` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_string_outline` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_style_box` **(** :ref:`StyleBox` style_box, :ref:`Rect2` rect **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_texture` **(** :ref:`Texture2D` texture, :ref:`Vector2` position, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_texture_rect` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`bool` tile, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_texture_rect_region` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false, :ref:`bool` clip_uv=true **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`force_update_transform` **(** **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_canvas` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_canvas_item` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform2D` | :ref:`get_canvas_transform` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_global_mouse_position` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform2D` | :ref:`get_global_transform` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform2D` | :ref:`get_global_transform_with_canvas` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_local_mouse_position` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform2D` | :ref:`get_screen_transform` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform2D` | :ref:`get_transform` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Rect2` | :ref:`get_viewport_rect` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform2D` | :ref:`get_viewport_transform` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`get_visibility_layer_bit` **(** :ref:`int` layer **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`World2D` | :ref:`get_world_2d` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`hide` **(** **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_local_transform_notification_enabled` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_transform_notification_enabled` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_visible_in_tree` **(** **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`make_canvas_position_local` **(** :ref:`Vector2` screen_point **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`InputEvent` | :ref:`make_input_local` **(** :ref:`InputEvent` event **)** |const| | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`move_to_front` **(** **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`queue_redraw` **(** **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_notify_local_transform` **(** :ref:`bool` enable **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_notify_transform` **(** :ref:`bool` enable **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_visibility_layer_bit` **(** :ref:`int` layer, :ref:`bool` enabled **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`show` **(** **)** | - +---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_draw` **(** **)** |virtual| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_animation_slice` **(** :ref:`float` animation_length, :ref:`float` slice_begin, :ref:`float` slice_end, :ref:`float` offset=0.0 **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_arc` **(** :ref:`Vector2` center, :ref:`float` radius, :ref:`float` start_angle, :ref:`float` end_angle, :ref:`int` point_count, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_char` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` char, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_char_outline` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` char, :ref:`int` font_size=16, :ref:`int` size=-1, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_circle` **(** :ref:`Vector2` position, :ref:`float` radius, :ref:`Color` color **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_colored_polygon` **(** :ref:`PackedVector2Array` points, :ref:`Color` color, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`Texture2D` texture=null **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_dashed_line` **(** :ref:`Vector2` from, :ref:`Vector2` to, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`float` dash=2.0, :ref:`bool` aligned=true **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_end_animation` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_lcd_texture_rect_region` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_line` **(** :ref:`Vector2` from, :ref:`Vector2` to, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_mesh` **(** :ref:`Mesh` mesh, :ref:`Texture2D` texture, :ref:`Transform2D` transform=Transform2D(1, 0, 0, 1, 0, 0), :ref:`Color` modulate=Color(1, 1, 1, 1) **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_msdf_texture_rect_region` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`float` outline=0.0, :ref:`float` pixel_range=4.0, :ref:`float` scale=1.0 **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_multiline` **(** :ref:`PackedVector2Array` points, :ref:`Color` color, :ref:`float` width=-1.0 **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_multiline_colors` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0 **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_multiline_string` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_multiline_string_outline` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_multimesh` **(** :ref:`MultiMesh` multimesh, :ref:`Texture2D` texture **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_polygon` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`PackedVector2Array` uvs=PackedVector2Array(), :ref:`Texture2D` texture=null **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_polyline` **(** :ref:`PackedVector2Array` points, :ref:`Color` color, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_polyline_colors` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_primitive` **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`PackedVector2Array` uvs, :ref:`Texture2D` texture=null **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_rect` **(** :ref:`Rect2` rect, :ref:`Color` color, :ref:`bool` filled=true, :ref:`float` width=-1.0 **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_set_transform` **(** :ref:`Vector2` position, :ref:`float` rotation=0.0, :ref:`Vector2` scale=Vector2(1, 1) **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_set_transform_matrix` **(** :ref:`Transform2D` xform **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_string` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_string_outline` **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_style_box` **(** :ref:`StyleBox` style_box, :ref:`Rect2` rect **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_texture` **(** :ref:`Texture2D` texture, :ref:`Vector2` position, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_texture_rect` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`bool` tile, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_texture_rect_region` **(** :ref:`Texture2D` texture, :ref:`Rect2` rect, :ref:`Rect2` src_rect, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`bool` transpose=false, :ref:`bool` clip_uv=true **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`force_update_transform` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_canvas` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_canvas_item` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform2D` | :ref:`get_canvas_transform` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_global_mouse_position` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform2D` | :ref:`get_global_transform` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform2D` | :ref:`get_global_transform_with_canvas` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_local_mouse_position` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform2D` | :ref:`get_screen_transform` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform2D` | :ref:`get_transform` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Rect2` | :ref:`get_viewport_rect` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform2D` | :ref:`get_viewport_transform` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_visibility_layer_bit` **(** :ref:`int` layer **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`World2D` | :ref:`get_world_2d` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`hide` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_local_transform_notification_enabled` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_transform_notification_enabled` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_visible_in_tree` **(** **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`make_canvas_position_local` **(** :ref:`Vector2` screen_point **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`InputEvent` | :ref:`make_input_local` **(** :ref:`InputEvent` event **)** |const| | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`move_to_front` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`queue_redraw` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_notify_local_transform` **(** :ref:`bool` enable **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_notify_transform` **(** :ref:`bool` enable **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_visibility_layer_bit` **(** :ref:`int` layer, :ref:`bool` enabled **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`show` **(** **)** | + +---------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -965,7 +965,7 @@ Value of the ``pixel_range`` should the same that was used during distance field void **draw_multiline** **(** :ref:`PackedVector2Array` points, :ref:`Color` color, :ref:`float` width=-1.0 **)** -Draws multiple disconnected lines with a uniform ``color``. When drawing large amounts of lines, this is faster than using individual :ref:`draw_line` calls. To draw interconnected lines, use :ref:`draw_polyline` instead. +Draws multiple disconnected lines with a uniform ``width`` and ``color``. Each line is defined by two consecutive points from ``points`` array, i.e. i-th segment consists of ``points[2 * i]``, ``points[2 * i + 1]`` endpoints. When drawing large amounts of lines, this is faster than using individual :ref:`draw_line` calls. To draw interconnected lines, use :ref:`draw_polyline` instead. If ``width`` is negative, then two-point primitives will be drawn instead of a four-point ones. This means that when the CanvasItem is scaled, the lines will remain thin. If this behavior is not desired, then pass a positive ``width`` like ``1.0``. @@ -979,7 +979,7 @@ If ``width`` is negative, then two-point primitives will be drawn instead of a f void **draw_multiline_colors** **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0 **)** -Draws multiple disconnected lines with a uniform ``width`` and segment-by-segment coloring. Colors assigned to line segments match by index between ``points`` and ``colors``. When drawing large amounts of lines, this is faster than using individual :ref:`draw_line` calls. To draw interconnected lines, use :ref:`draw_polyline_colors` instead. +Draws multiple disconnected lines with a uniform ``width`` and segment-by-segment coloring. Each segment is defined by two consecutive points from ``points`` array and a corresponding color from ``colors`` array, i.e. i-th segment consists of ``points[2 * i]``, ``points[2 * i + 1]`` endpoints and has ``colors[i]`` color. When drawing large amounts of lines, this is faster than using individual :ref:`draw_line` calls. To draw interconnected lines, use :ref:`draw_polyline_colors` instead. If ``width`` is negative, then two-point primitives will be drawn instead of a four-point ones. This means that when the CanvasItem is scaled, the lines will remain thin. If this behavior is not desired, then pass a positive ``width`` like ``1.0``. @@ -991,7 +991,7 @@ If ``width`` is negative, then two-point primitives will be drawn instead of a f .. rst-class:: classref-method -void **draw_multiline_string** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_multiline_string** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Breaks ``text`` into lines and draws it using the specified ``font`` at the ``pos`` (top-left corner). The text will have its color multiplied by ``modulate``. If ``width`` is greater than or equal to 0, the text will be clipped if it exceeds the specified width. @@ -1003,7 +1003,7 @@ Breaks ``text`` into lines and draws it using the specified ``font`` at the ``po .. rst-class:: classref-method -void **draw_multiline_string_outline** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_multiline_string_outline** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Breaks ``text`` to the lines and draws text outline using the specified ``font`` at the ``pos`` (top-left corner). The text will have its color multiplied by ``modulate``. If ``width`` is greater than or equal to 0, the text will be clipped if it exceeds the specified width. @@ -1055,7 +1055,7 @@ If ``width`` is negative, the polyline is drawn using :ref:`RenderingServer.PRIM void **draw_polyline_colors** **(** :ref:`PackedVector2Array` points, :ref:`PackedColorArray` colors, :ref:`float` width=-1.0, :ref:`bool` antialiased=false **)** -Draws interconnected line segments with a uniform ``width`` and segment-by-segment coloring, and optional antialiasing (supported only for positive ``width``). Colors assigned to line segments match by index between ``points`` and ``colors``. When drawing large amounts of lines, this is faster than using individual :ref:`draw_line` calls. To draw disconnected lines, use :ref:`draw_multiline_colors` instead. See also :ref:`draw_polygon`. +Draws interconnected line segments with a uniform ``width``, point-by-point coloring, and optional antialiasing (supported only for positive ``width``). Colors assigned to line points match by index between ``points`` and ``colors``, i.e. each line segment is filled with a gradient between the colors of the endpoints. When drawing large amounts of lines, this is faster than using individual :ref:`draw_line` calls. To draw disconnected lines, use :ref:`draw_multiline_colors` instead. See also :ref:`draw_polygon`. If ``width`` is negative, then the polyline is drawn using :ref:`RenderingServer.PRIMITIVE_LINE_STRIP`. This means that when the CanvasItem is scaled, the polyline will remain thin. If this behavior is not desired, then pass a positive ``width`` like ``1.0``. @@ -1123,7 +1123,7 @@ Sets a custom transform for drawing via matrix. Anything drawn afterwards will b .. rst-class:: classref-method -void **draw_string** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_string** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Draws ``text`` using the specified ``font`` at the ``pos`` (bottom-left corner using the baseline of the font). The text will have its color multiplied by ``modulate``. If ``width`` is greater than or equal to 0, the text will be clipped if it exceeds the specified width. @@ -1162,7 +1162,7 @@ See also :ref:`Font.draw_string`. .. rst-class:: classref-method -void **draw_string_outline** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_string_outline** **(** :ref:`Font` font, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Draws ``text`` outline using the specified ``font`` at the ``pos`` (bottom-left corner using the baseline of the font). The text will have its color multiplied by ``modulate``. If ``width`` is greater than or equal to 0, the text will be clipped if it exceeds the specified width. diff --git a/classes/class_displayserver.rst b/classes/class_displayserver.rst index 78411c1df22..59a7833466d 100644 --- a/classes/class_displayserver.rst +++ b/classes/class_displayserver.rst @@ -202,6 +202,8 @@ Methods +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`screen_get_dpi` **(** :ref:`int` screen=-1 **)** |const| | +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`screen_get_image` **(** :ref:`int` screen=-1 **)** |const| | + +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`screen_get_max_scale` **(** **)** |const| | +----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`ScreenOrientation` | :ref:`screen_get_orientation` **(** :ref:`int` screen=-1 **)** |const| | @@ -2648,6 +2650,22 @@ Returns the dots per inch density of the specified screen. If ``screen`` is :ref ---- +.. _class_DisplayServer_method_screen_get_image: + +.. rst-class:: classref-method + +:ref:`Image` **screen_get_image** **(** :ref:`int` screen=-1 **)** |const| + +Returns screenshot of the ``screen``. + +\ **Note:** This method is implemented on Linux (X11), macOS, and Windows. + +\ **Note:** On macOS, this method requires "Screen Recording" permission, if permission is not granted it will return desktop wallpaper color. + +.. rst-class:: classref-item-separator + +---- + .. _class_DisplayServer_method_screen_get_max_scale: .. rst-class:: classref-method @@ -2915,6 +2933,8 @@ Note that Godot depends on system libraries for text-to-speech functionality. Th \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -2929,6 +2949,8 @@ Returns an :ref:`PackedStringArray` of voice identifier \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -2943,6 +2965,8 @@ Returns ``true`` if the synthesizer is in a paused state. \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -2957,6 +2981,8 @@ Returns ``true`` if the synthesizer is generating speech, or have utterance wait \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -2971,6 +2997,8 @@ Puts the synthesizer into a paused state. \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -2985,6 +3013,8 @@ Resumes the synthesizer if it was paused. \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -3005,6 +3035,8 @@ Adds a callback, which is called when the utterance has started, finished, cance \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -3033,6 +3065,8 @@ Adds an utterance to the queue. If ``interrupt`` is ``true``, the queue is clear \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- @@ -3047,6 +3081,8 @@ Stops synthesis in progress and removes all utterances from the queue. \ **Note:** This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows. +\ **Note:** :ref:`ProjectSettings.audio/general/text_to_speech` should be ``true`` to use text-to-speech. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_editorinterface.rst b/classes/class_editorinterface.rst index 56ca27e1a9c..2c8cf444bce 100644 --- a/classes/class_editorinterface.rst +++ b/classes/class_editorinterface.rst @@ -45,81 +45,89 @@ Methods .. table:: :widths: auto - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`edit_node` **(** :ref:`Node` node **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`edit_resource` **(** :ref:`Resource` resource **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`edit_script` **(** :ref:`Script` script, :ref:`int` line=-1, :ref:`int` column=0, :ref:`bool` grab_focus=true **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Control` | :ref:`get_base_control` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorCommandPalette` | :ref:`get_command_palette` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_current_directory` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_current_path` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Node` | :ref:`get_edited_scene_root` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`VBoxContainer` | :ref:`get_editor_main_screen` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorPaths` | :ref:`get_editor_paths` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_editor_scale` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorSettings` | :ref:`get_editor_settings` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`FileSystemDock` | :ref:`get_file_system_dock` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorInspector` | :ref:`get_inspector` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`get_open_scenes` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_playing_scene` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorFileSystem` | :ref:`get_resource_filesystem` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorResourcePreview` | :ref:`get_resource_previewer` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`ScriptEditor` | :ref:`get_script_editor` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`get_selected_paths` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`EditorSelection` | :ref:`get_selection` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`inspect_object` **(** :ref:`Object` object, :ref:`String` for_property="", :ref:`bool` inspector_only=false **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_playing_scene` **(** **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_plugin_enabled` **(** :ref:`String` plugin **)** |const| | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Texture2D[]` | :ref:`make_mesh_previews` **(** :ref:`Mesh[]` meshes, :ref:`int` preview_size **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`open_scene_from_path` **(** :ref:`String` scene_filepath **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`play_current_scene` **(** **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`play_custom_scene` **(** :ref:`String` scene_filepath **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`play_main_scene` **(** **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`reload_scene_from_path` **(** :ref:`String` scene_filepath **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`restart_editor` **(** :ref:`bool` save=true **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`save_scene` **(** **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`save_scene_as` **(** :ref:`String` path, :ref:`bool` with_preview=true **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`select_file` **(** :ref:`String` file **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_main_screen_editor` **(** :ref:`String` name **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_plugin_enabled` **(** :ref:`String` plugin, :ref:`bool` enabled **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`stop_playing_scene` **(** **)** | - +-----------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`edit_node` **(** :ref:`Node` node **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`edit_resource` **(** :ref:`Resource` resource **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`edit_script` **(** :ref:`Script` script, :ref:`int` line=-1, :ref:`int` column=0, :ref:`bool` grab_focus=true **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Control` | :ref:`get_base_control` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`EditorCommandPalette` | :ref:`get_command_palette` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_current_directory` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_current_path` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Node` | :ref:`get_edited_scene_root` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`VBoxContainer` | :ref:`get_editor_main_screen` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`EditorPaths` | :ref:`get_editor_paths` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_editor_scale` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`EditorSettings` | :ref:`get_editor_settings` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`FileSystemDock` | :ref:`get_file_system_dock` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`EditorInspector` | :ref:`get_inspector` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedStringArray` | :ref:`get_open_scenes` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_playing_scene` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`EditorFileSystem` | :ref:`get_resource_filesystem` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`EditorResourcePreview` | :ref:`get_resource_previewer` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`ScriptEditor` | :ref:`get_script_editor` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedStringArray` | :ref:`get_selected_paths` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`EditorSelection` | :ref:`get_selection` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`inspect_object` **(** :ref:`Object` object, :ref:`String` for_property="", :ref:`bool` inspector_only=false **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_playing_scene` **(** **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_plugin_enabled` **(** :ref:`String` plugin **)** |const| | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Texture2D[]` | :ref:`make_mesh_previews` **(** :ref:`Mesh[]` meshes, :ref:`int` preview_size **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`open_scene_from_path` **(** :ref:`String` scene_filepath **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`play_current_scene` **(** **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`play_custom_scene` **(** :ref:`String` scene_filepath **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`play_main_scene` **(** **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_dialog` **(** :ref:`Window` dialog, :ref:`Rect2i` rect=Rect2i(0, 0, 0, 0) **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_dialog_centered` **(** :ref:`Window` dialog, :ref:`Vector2i` minsize=Vector2i(0, 0) **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_dialog_centered_clamped` **(** :ref:`Window` dialog, :ref:`Vector2i` minsize=Vector2i(0, 0), :ref:`float` fallback_ratio=0.75 **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_dialog_centered_ratio` **(** :ref:`Window` dialog, :ref:`float` ratio=0.8 **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`reload_scene_from_path` **(** :ref:`String` scene_filepath **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`restart_editor` **(** :ref:`bool` save=true **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`save_scene` **(** **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`save_scene_as` **(** :ref:`String` path, :ref:`bool` with_preview=true **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`select_file` **(** :ref:`String` file **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_main_screen_editor` **(** :ref:`String` name **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_plugin_enabled` **(** :ref:`String` plugin, :ref:`bool` enabled **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`stop_playing_scene` **(** **)** | + +-----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -531,6 +539,62 @@ Plays the main scene. ---- +.. _class_EditorInterface_method_popup_dialog: + +.. rst-class:: classref-method + +void **popup_dialog** **(** :ref:`Window` dialog, :ref:`Rect2i` rect=Rect2i(0, 0, 0, 0) **)** + +Pops up the ``dialog`` in the editor UI with :ref:`Window.popup_exclusive`. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`Window.set_unparent_when_invisible`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorInterface_method_popup_dialog_centered: + +.. rst-class:: classref-method + +void **popup_dialog_centered** **(** :ref:`Window` dialog, :ref:`Vector2i` minsize=Vector2i(0, 0) **)** + +Pops up the ``dialog`` in the editor UI with :ref:`Window.popup_exclusive_centered`. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`Window.set_unparent_when_invisible`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorInterface_method_popup_dialog_centered_clamped: + +.. rst-class:: classref-method + +void **popup_dialog_centered_clamped** **(** :ref:`Window` dialog, :ref:`Vector2i` minsize=Vector2i(0, 0), :ref:`float` fallback_ratio=0.75 **)** + +Pops up the ``dialog`` in the editor UI with :ref:`Window.popup_exclusive_centered_clamped`. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`Window.set_unparent_when_invisible`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_EditorInterface_method_popup_dialog_centered_ratio: + +.. rst-class:: classref-method + +void **popup_dialog_centered_ratio** **(** :ref:`Window` dialog, :ref:`float` ratio=0.8 **)** + +Pops up the ``dialog`` in the editor UI with :ref:`Window.popup_exclusive_centered_ratio`. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`Window.set_unparent_when_invisible`. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorInterface_method_reload_scene_from_path: .. rst-class:: classref-method diff --git a/classes/class_font.rst b/classes/class_font.rst index a9b12fa5dc4..e97079ea096 100644 --- a/classes/class_font.rst +++ b/classes/class_font.rst @@ -31,73 +31,73 @@ Methods .. table:: :widths: auto - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`draw_char` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`int` char, :ref:`int` font_size, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`draw_char_outline` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`int` char, :ref:`int` font_size, :ref:`int` size=-1, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_multiline_string` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_multiline_string_outline` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_string` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`draw_string_outline` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`find_variation` **(** :ref:`Dictionary` variation_coordinates, :ref:`int` face_index=0, :ref:`float` strength=0.0, :ref:`Transform2D` transform=Transform2D(1, 0, 0, 1, 0, 0) **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_ascent` **(** :ref:`int` font_size=16 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_char_size` **(** :ref:`int` char, :ref:`int` font_size **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_descent` **(** :ref:`int` font_size=16 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_face_count` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Font[]` | :ref:`get_fallbacks` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_font_name` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_font_stretch` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`FontStyle` | :ref:`get_font_style` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_font_style_name` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_font_weight` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_height` **(** :ref:`int` font_size=16 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_multiline_string_size` **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`get_opentype_features` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID[]` | :ref:`get_rids` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_spacing` **(** :ref:`SpacingType` spacing **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_string_size` **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_supported_chars` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`get_supported_feature_list` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`get_supported_variation_list` **(** **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_underline_position` **(** :ref:`int` font_size=16 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_underline_thickness` **(** :ref:`int` font_size=16 **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_char` **(** :ref:`int` char **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_language_supported` **(** :ref:`String` language **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_script_supported` **(** :ref:`String` script **)** |const| | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cache_capacity` **(** :ref:`int` single_line, :ref:`int` multi_line **)** | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_fallbacks` **(** :ref:`Font[]` fallbacks **)** | - +---------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`draw_char` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`int` char, :ref:`int` font_size, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`draw_char_outline` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`int` char, :ref:`int` font_size, :ref:`int` size=-1, :ref:`Color` modulate=Color(1, 1, 1, 1) **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_multiline_string` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_multiline_string_outline` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_string` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`draw_string_outline` **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`find_variation` **(** :ref:`Dictionary` variation_coordinates, :ref:`int` face_index=0, :ref:`float` strength=0.0, :ref:`Transform2D` transform=Transform2D(1, 0, 0, 1, 0, 0) **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_ascent` **(** :ref:`int` font_size=16 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_char_size` **(** :ref:`int` char, :ref:`int` font_size **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_descent` **(** :ref:`int` font_size=16 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_face_count` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Font[]` | :ref:`get_fallbacks` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_font_name` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_font_stretch` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`FontStyle` | :ref:`get_font_style` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_font_style_name` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_font_weight` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_height` **(** :ref:`int` font_size=16 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_multiline_string_size` **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_opentype_features` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID[]` | :ref:`get_rids` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_spacing` **(** :ref:`SpacingType` spacing **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_string_size` **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_supported_chars` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_supported_feature_list` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_supported_variation_list` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_underline_position` **(** :ref:`int` font_size=16 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_underline_thickness` **(** :ref:`int` font_size=16 **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_char` **(** :ref:`int` char **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_language_supported` **(** :ref:`String` language **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_script_supported` **(** :ref:`String` script **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cache_capacity` **(** :ref:`int` single_line, :ref:`int` multi_line **)** | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_fallbacks` **(** :ref:`Font[]` fallbacks **)** | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -140,7 +140,7 @@ Draw a single Unicode character ``char`` outline into a canvas item using the fo .. rst-class:: classref-method -void **draw_multiline_string** **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_multiline_string** **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Breaks ``text`` into lines using rules specified by ``brk_flags`` and draws it into a canvas item using the font, at a given position, with ``modulate`` color, optionally clipping the width and aligning horizontally. ``pos`` specifies the baseline of the first line, not the top. To draw from the top, *ascent* must be added to the Y axis. @@ -154,7 +154,7 @@ See also :ref:`CanvasItem.draw_multiline_string` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_multiline_string_outline** **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Breaks ``text`` to the lines using rules specified by ``brk_flags`` and draws text outline into a canvas item using the font, at a given position, with ``modulate`` color and ``size`` outline size, optionally clipping the width and aligning horizontally. ``pos`` specifies the baseline of the first line, not the top. To draw from the top, *ascent* must be added to the Y axis. @@ -168,7 +168,7 @@ See also :ref:`CanvasItem.draw_multiline_string_outline` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_string** **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Draw ``text`` into a canvas item using the font, at a given position, with ``modulate`` color, optionally clipping the width and aligning horizontally. ``pos`` specifies the baseline, not the top. To draw from the top, *ascent* must be added to the Y axis. @@ -182,7 +182,7 @@ See also :ref:`CanvasItem.draw_string`. .. rst-class:: classref-method -void **draw_string_outline** **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +void **draw_string_outline** **(** :ref:`RID` canvas_item, :ref:`Vector2` pos, :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` size=1, :ref:`Color` modulate=Color(1, 1, 1, 1), :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Draw ``text`` outline into a canvas item using the font, at a given position, with ``modulate`` color and ``size`` outline size, optionally clipping the width and aligning horizontally. ``pos`` specifies the baseline, not the top. To draw from the top, *ascent* must be added to the Y axis. @@ -348,7 +348,7 @@ Returns the total average font height (ascent plus descent) in pixels. .. rst-class:: classref-method -:ref:`Vector2` **get_multiline_string_size** **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +:ref:`Vector2` **get_multiline_string_size** **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`int` max_lines=-1, :ref:`LineBreakFlag` brk_flags=3, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Returns the size of a bounding box of a string broken into the lines, taking kerning and advance into account. @@ -398,7 +398,7 @@ Returns the spacing for the given ``type`` (see :ref:`SpacingType` **get_string_size** **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`JustificationFlag` jst_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| +:ref:`Vector2` **get_string_size** **(** :ref:`String` text, :ref:`HorizontalAlignment` alignment=0, :ref:`float` width=-1, :ref:`int` font_size=16, :ref:`JustificationFlag` justification_flags=3, :ref:`Direction` direction=0, :ref:`Orientation` orientation=0 **)** |const| Returns the size of a bounding box of a single-line string, taking kerning, advance and subpixel positioning into account. See also :ref:`get_multiline_string_size` and :ref:`draw_string`. diff --git a/classes/class_gdextension.rst b/classes/class_gdextension.rst index fbac307a26a..0a1647d161c 100644 --- a/classes/class_gdextension.rst +++ b/classes/class_gdextension.rst @@ -24,17 +24,17 @@ Methods .. table:: :widths: auto - +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`close_library` **(** **)** | - +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`InitializationLevel` | :ref:`get_minimum_library_initialization_level` **(** **)** |const| | - +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`initialize_library` **(** :ref:`InitializationLevel` level **)** | - +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_library_open` **(** **)** |const| | - +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`open_library` **(** :ref:`String` path, :ref:`String` entry_symbol **)** | - +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`close_library` **(** **)** | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`InitializationLevel` | :ref:`get_minimum_library_initialization_level` **(** **)** |const| | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`initialize_library` **(** :ref:`InitializationLevel` level **)** | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_library_open` **(** **)** |const| | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`open_library` **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface **)** | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -152,7 +152,7 @@ void **initialize_library** **(** :ref:`InitializationLevel` **open_library** **(** :ref:`String` path, :ref:`String` entry_symbol **)** +:ref:`Error` **open_library** **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface **)** .. container:: contribute diff --git a/classes/class_gdscript.rst b/classes/class_gdscript.rst index e3f6f2a88a2..112f7f72bbf 100644 --- a/classes/class_gdscript.rst +++ b/classes/class_gdscript.rst @@ -21,7 +21,9 @@ Description A script implemented in the GDScript programming language. The script extends the functionality of all objects that instantiate it. -\ :ref:`new` creates a new instance of the script. :ref:`Object.set_script` extends an existing object, if that object's class matches one of the script's base classes. +Calling :ref:`new` creates a new instance of the script. :ref:`Object.set_script` extends an existing object, if that object's class matches one of the script's base classes. + +If you are looking for GDScript's built-in functions, see :ref:`@GDScript` instead. .. rst-class:: classref-introduction-group diff --git a/classes/class_inputevent.rst b/classes/class_inputevent.rst index 3e6b8fba274..826051533d1 100644 --- a/classes/class_inputevent.rst +++ b/classes/class_inputevent.rst @@ -71,12 +71,16 @@ Methods +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_action_type` **(** **)** |const| | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_canceled` **(** **)** |const| | + +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_echo` **(** **)** |const| | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_match` **(** :ref:`InputEvent` event, :ref:`bool` exact_match=true **)** |const| | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_pressed` **(** **)** |const| | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_released` **(** **)** |const| | + +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`InputEvent` | :ref:`xformed_by` **(** :ref:`Transform2D` xform, :ref:`Vector2` local_ofs=Vector2(0, 0) **)** |const| | +-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -209,6 +213,18 @@ Returns ``true`` if this input event's type is one that can be assigned to an in ---- +.. _class_InputEvent_method_is_canceled: + +.. rst-class:: classref-method + +:ref:`bool` **is_canceled** **(** **)** |const| + +Returns ``true`` if this input event has been canceled. + +.. rst-class:: classref-item-separator + +---- + .. _class_InputEvent_method_is_echo: .. rst-class:: classref-method @@ -249,6 +265,18 @@ Returns ``true`` if this input event is pressed. Not relevant for events of type ---- +.. _class_InputEvent_method_is_released: + +.. rst-class:: classref-method + +:ref:`bool` **is_released** **(** **)** |const| + +Returns ``true`` if this input event is released. Not relevant for events of type :ref:`InputEventMouseMotion` or :ref:`InputEventScreenDrag`. + +.. rst-class:: classref-item-separator + +---- + .. _class_InputEvent_method_xformed_by: .. rst-class:: classref-method diff --git a/classes/class_inputeventmidi.rst b/classes/class_inputeventmidi.rst index 54d3c61116a..468d535484d 100644 --- a/classes/class_inputeventmidi.rst +++ b/classes/class_inputeventmidi.rst @@ -213,7 +213,9 @@ For MIDI messages between 0x80 and 0xEF, only the left half of the bits are retu Notes will return :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_ON` when activated, but they might not always return :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_OFF` when deactivated, therefore your code should treat the input as stopped if some period of time has passed. -For more information, see the MIDI message status byte list chart linked above. +Some MIDI devices may send :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_ON` with zero velocity instead of :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_OFF`. + +For more information, see the note in :ref:`velocity` and the MIDI message status byte list chart linked above. .. rst-class:: classref-item-separator @@ -264,7 +266,9 @@ The pressure of the MIDI signal. This value ranges from 0 to 127. For many devic - void **set_velocity** **(** :ref:`int` value **)** - :ref:`int` **get_velocity** **(** **)** -The velocity of the MIDI signal. This value ranges from 0 to 127. For a piano, this corresponds to how quickly the key was pressed, and is rarely above about 110 in practice. Note that some MIDI devices may send a :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_ON` message with zero velocity and expect this to be treated the same as a :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_OFF` message, but device implementations vary so Godot reports event data exactly as received. +The velocity of the MIDI signal. This value ranges from 0 to 127. For a piano, this corresponds to how quickly the key was pressed, and is rarely above about 110 in practice. + +\ **Note:** Some MIDI devices may send a :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_ON` message with zero velocity and expect this to be treated the same as a :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_OFF` message, but device implementations vary so Godot reports event data exactly as received. Depending on the hardware and the needs of the game/app, this MIDI quirk can be handled robustly with a couple lines of script (check for :ref:`@GlobalScope.MIDI_MESSAGE_NOTE_ON` with velocity zero). .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_inputeventmousebutton.rst b/classes/class_inputeventmousebutton.rst index e309097a510..ac70e894399 100644 --- a/classes/class_inputeventmousebutton.rst +++ b/classes/class_inputeventmousebutton.rst @@ -39,6 +39,8 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------+-----------+ | :ref:`MouseButton` | :ref:`button_index` | ``0`` | +---------------------------------------------------+------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`canceled` | ``false`` | + +---------------------------------------------------+------------------------------------------------------------------------+-----------+ | :ref:`bool` | :ref:`double_click` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------+-----------+ | :ref:`float` | :ref:`factor` | ``1.0`` | @@ -72,6 +74,23 @@ The mouse button identifier, one of the :ref:`MouseButton` **canceled** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_canceled** **(** :ref:`bool` value **)** +- :ref:`bool` **is_canceled** **(** **)** + +If ``true``, the mouse button event has been canceled. + +.. rst-class:: classref-item-separator + +---- + .. _class_InputEventMouseButton_property_double_click: .. rst-class:: classref-property diff --git a/classes/class_inputeventscreentouch.rst b/classes/class_inputeventscreentouch.rst index 3660fb1f466..ad4d3e4d91d 100644 --- a/classes/class_inputeventscreentouch.rst +++ b/classes/class_inputeventscreentouch.rst @@ -38,6 +38,8 @@ Properties .. table:: :widths: auto + +-------------------------------+--------------------------------------------------------------------+-------------------+ + | :ref:`bool` | :ref:`canceled` | ``false`` | +-------------------------------+--------------------------------------------------------------------+-------------------+ | :ref:`bool` | :ref:`double_tap` | ``false`` | +-------------------------------+--------------------------------------------------------------------+-------------------+ @@ -57,6 +59,23 @@ Properties Property Descriptions --------------------- +.. _class_InputEventScreenTouch_property_canceled: + +.. rst-class:: classref-property + +:ref:`bool` **canceled** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_canceled** **(** :ref:`bool` value **)** +- :ref:`bool` **is_canceled** **(** **)** + +If ``true``, the touch event has been canceled. + +.. rst-class:: classref-item-separator + +---- + .. _class_InputEventScreenTouch_property_double_tap: .. rst-class:: classref-property diff --git a/classes/class_label.rst b/classes/class_label.rst index 45566598503..4f5b011e868 100644 --- a/classes/class_label.rst +++ b/classes/class_label.rst @@ -45,6 +45,8 @@ Properties +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ | :ref:`HorizontalAlignment` | :ref:`horizontal_alignment` | ``0`` | +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ + | :ref:`JustificationFlag` | :ref:`justification_flags` | ``163`` | + +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ | :ref:`LabelSettings` | :ref:`label_settings` | | +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ | :ref:`String` | :ref:`language` | ``""`` | @@ -188,6 +190,23 @@ Controls the text's horizontal alignment. Supports left, center, right, and fill ---- +.. _class_Label_property_justification_flags: + +.. rst-class:: classref-property + +:ref:`JustificationFlag` **justification_flags** = ``163`` + +.. rst-class:: classref-property-setget + +- void **set_justification_flags** **(** :ref:`JustificationFlag` value **)** +- :ref:`JustificationFlag` **get_justification_flags** **(** **)** + +Line fill alignment rules. For more info see :ref:`JustificationFlag`. + +.. rst-class:: classref-item-separator + +---- + .. _class_Label_property_label_settings: .. rst-class:: classref-property diff --git a/classes/class_label3d.rst b/classes/class_label3d.rst index 9328f147e3e..134872eb155 100644 --- a/classes/class_label3d.rst +++ b/classes/class_label3d.rst @@ -58,6 +58,8 @@ Properties +---------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------+ | :ref:`HorizontalAlignment` | :ref:`horizontal_alignment` | ``1`` | +---------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------+ + | :ref:`JustificationFlag` | :ref:`justification_flags` | ``163`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`language` | ``""`` | +---------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`line_spacing` | ``0.0`` | @@ -431,6 +433,23 @@ Controls the text's horizontal alignment. Supports left, center, right, and fill ---- +.. _class_Label3D_property_justification_flags: + +.. rst-class:: classref-property + +:ref:`JustificationFlag` **justification_flags** = ``163`` + +.. rst-class:: classref-property-setget + +- void **set_justification_flags** **(** :ref:`JustificationFlag` value **)** +- :ref:`JustificationFlag` **get_justification_flags** **(** **)** + +Line fill alignment rules. For more info see :ref:`JustificationFlag`. + +.. rst-class:: classref-item-separator + +---- + .. _class_Label3D_property_language: .. rst-class:: classref-property diff --git a/classes/class_mutex.rst b/classes/class_mutex.rst index 41e261e466d..11492e01119 100644 --- a/classes/class_mutex.rst +++ b/classes/class_mutex.rst @@ -21,6 +21,16 @@ Description A synchronization mutex (mutual exclusion). This is used to synchronize multiple :ref:`Thread`\ s, and is equivalent to a binary :ref:`Semaphore`. It guarantees that only one thread can ever acquire the lock at a time. A mutex can be used to protect a critical section; however, be careful to avoid deadlocks. +It's of the recursive kind, so it can be locked multiple times by one thread, provided it also unlocks it as many times. + +\ **Warning:**\ + +To guarantee that the operating system is able to perform proper cleanup (no crashes, no deadlocks), these conditions must be met: + +- By the time a **Mutex**'s reference count reaches zero and therefore it is destroyed, no threads (including the one on which the destruction will happen) must have it locked. + +- By the time a :ref:`Thread`'s reference count reaches zero and therefore it is destroyed, it must not have any mutex locked. + .. rst-class:: classref-introduction-group Tutorials @@ -91,6 +101,8 @@ Unlocks this **Mutex**, leaving it to other threads. \ **Note:** If a thread called :ref:`lock` or :ref:`try_lock` multiple times while already having ownership of the mutex, it must also call :ref:`unlock` the same number of times in order to unlock it correctly. +\ **Warning:** Calling :ref:`unlock` more times that :ref:`lock` on a given thread, thus ending up trying to unlock a non-locked mutex, is wrong and may causes crashes or deadlocks. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/classes/class_node.rst b/classes/class_node.rst index 81fa49024b6..968fa4ce328 100644 --- a/classes/class_node.rst +++ b/classes/class_node.rst @@ -149,6 +149,8 @@ Methods +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_index` **(** :ref:`bool` include_internal=false **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Window` | :ref:`get_last_exclusive_window` **(** **)** |const| | + +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_multiplayer_authority` **(** **)** |const| | +---------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Node` | :ref:`get_node` **(** :ref:`NodePath` path **)** |const| | @@ -1720,6 +1722,18 @@ If ``include_internal`` is ``false``, the index won't take internal children int ---- +.. _class_Node_method_get_last_exclusive_window: + +.. rst-class:: classref-method + +:ref:`Window` **get_last_exclusive_window** **(** **)** |const| + +Returns the :ref:`Window` that contains this node, or the last exclusive child in a chain of windows starting with the one that contains this node. + +.. rst-class:: classref-item-separator + +---- + .. _class_Node_method_get_multiplayer_authority: .. rst-class:: classref-method diff --git a/classes/class_os.rst b/classes/class_os.rst index 1bb8351a210..fed61bc5267 100644 --- a/classes/class_os.rst +++ b/classes/class_os.rst @@ -38,6 +38,8 @@ Properties .. table:: :widths: auto + +-------------------------+---------------------------------------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`delta_smoothing` | ``true`` | +-------------------------+---------------------------------------------------------------------------------------------------+-----------+ | :ref:`bool` | :ref:`low_processor_usage_mode` | ``false`` | +-------------------------+---------------------------------------------------------------------------------------------------+-----------+ @@ -292,6 +294,23 @@ Ringtones directory path. Property Descriptions --------------------- +.. _class_OS_property_delta_smoothing: + +.. rst-class:: classref-property + +:ref:`bool` **delta_smoothing** = ``true`` + +.. rst-class:: classref-property-setget + +- void **set_delta_smoothing** **(** :ref:`bool` value **)** +- :ref:`bool` **is_delta_smoothing_enabled** **(** **)** + +If ``true``, the engine filters the time delta measured between each frame, and attempts to compensate for random variation. This will only operate on systems where V-Sync is active. + +.. rst-class:: classref-item-separator + +---- + .. _class_OS_property_low_processor_usage_mode: .. rst-class:: classref-property diff --git a/classes/class_parallaxlayer.rst b/classes/class_parallaxlayer.rst index 38dc746d57e..f15cf55140b 100644 --- a/classes/class_parallaxlayer.rst +++ b/classes/class_parallaxlayer.rst @@ -61,9 +61,11 @@ Property Descriptions - void **set_mirroring** **(** :ref:`Vector2` value **)** - :ref:`Vector2` **get_mirroring** **(** **)** -The ParallaxLayer's :ref:`Texture2D` mirroring. Useful for creating an infinite scrolling background. If an axis is set to ``0``, the :ref:`Texture2D` will not be mirrored. +The ParallaxLayer's :ref:`Texture2D` repeating. Useful for creating an infinite scrolling background. If an axis is set to ``0``, the :ref:`Texture2D` will not be repeated. -If the length of the viewport axis is bigger than twice the mirrored axis size, it will not repeat infinitely, as the parallax layer only draws 2 instances of the texture at any one time. +If the length of the viewport axis is bigger than twice the repeated axis size, it will not repeat infinitely, as the parallax layer only draws 2 instances of the texture at any given time. + +\ **Note:** Despite its name, the texture will not be mirrored, it will simply be repeated. .. rst-class:: classref-item-separator diff --git a/classes/class_particleprocessmaterial.rst b/classes/class_particleprocessmaterial.rst index 7868e981975..0fe7399a857 100644 --- a/classes/class_particleprocessmaterial.rst +++ b/classes/class_particleprocessmaterial.rst @@ -33,161 +33,161 @@ Properties .. table:: :widths: auto - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`angle_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`angle_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`angle_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`angular_velocity_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`angular_velocity_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`angular_velocity_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`anim_offset_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`anim_offset_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`anim_offset_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`anim_speed_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`anim_speed_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`anim_speed_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`bool` | :ref:`attractor_interaction_enabled` | ``true`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`collision_bounce` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`collision_friction` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`CollisionMode` | :ref:`collision_mode` | ``0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`bool` | :ref:`collision_use_scale` | ``false`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Color` | :ref:`color` | ``Color(1, 1, 1, 1)`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`color_initial_ramp` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`color_ramp` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`damping_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`damping_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`damping_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Vector3` | :ref:`direction` | ``Vector3(1, 0, 0)`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Vector3` | :ref:`emission_box_extents` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`emission_color_texture` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`emission_normal_texture` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`int` | :ref:`emission_point_count` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`emission_point_texture` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Vector3` | :ref:`emission_ring_axis` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`emission_ring_height` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`emission_ring_inner_radius` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`emission_ring_radius` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`EmissionShape` | :ref:`emission_shape` | ``0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`emission_sphere_radius` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`flatness` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Vector3` | :ref:`gravity` | ``Vector3(0, -9.8, 0)`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`hue_variation_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`hue_variation_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`hue_variation_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`initial_velocity_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`initial_velocity_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`lifetime_randomness` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`linear_accel_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`linear_accel_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`linear_accel_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`orbit_velocity_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`orbit_velocity_max` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`orbit_velocity_min` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`bool` | :ref:`particle_flag_align_y` | ``false`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`bool` | :ref:`particle_flag_disable_z` | ``false`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`bool` | :ref:`particle_flag_rotate_y` | ``false`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`radial_accel_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`radial_accel_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`radial_accel_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`scale_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`scale_max` | ``1.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`scale_min` | ``1.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`spread` | ``45.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`int` | :ref:`sub_emitter_amount_at_collision` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`int` | :ref:`sub_emitter_amount_at_end` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`sub_emitter_frequency` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`bool` | :ref:`sub_emitter_keep_velocity` | ``false`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`SubEmitterMode` | :ref:`sub_emitter_mode` | ``0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`tangential_accel_curve` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`tangential_accel_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`tangential_accel_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`bool` | :ref:`turbulence_enabled` | ``false`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`turbulence_influence_max` | ``0.1`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`turbulence_influence_min` | ``0.1`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Texture2D` | :ref:`turbulence_influence_over_life` | | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`turbulence_initial_displacement_max` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`turbulence_initial_displacement_min` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`turbulence_noise_scale` | ``9.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`Vector3` | :ref:`turbulence_noise_speed` | ``Vector3(0.5, 0.5, 0.5)`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`turbulence_noise_speed_random` | ``0.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ - | :ref:`float` | :ref:`turbulence_noise_strength` | ``1.0`` | - +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+----------------------------+ + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`angle_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`angle_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`angle_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`angular_velocity_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`angular_velocity_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`angular_velocity_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`anim_offset_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`anim_offset_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`anim_offset_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`anim_speed_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`anim_speed_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`anim_speed_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`bool` | :ref:`attractor_interaction_enabled` | ``true`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`collision_bounce` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`collision_friction` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`CollisionMode` | :ref:`collision_mode` | ``0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`bool` | :ref:`collision_use_scale` | ``false`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Color` | :ref:`color` | ``Color(1, 1, 1, 1)`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`color_initial_ramp` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`color_ramp` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`damping_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`damping_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`damping_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Vector3` | :ref:`direction` | ``Vector3(1, 0, 0)`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Vector3` | :ref:`emission_box_extents` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`emission_color_texture` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`emission_normal_texture` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`int` | :ref:`emission_point_count` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`emission_point_texture` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Vector3` | :ref:`emission_ring_axis` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`emission_ring_height` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`emission_ring_inner_radius` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`emission_ring_radius` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`EmissionShape` | :ref:`emission_shape` | ``0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`emission_sphere_radius` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`flatness` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Vector3` | :ref:`gravity` | ``Vector3(0, -9.8, 0)`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`hue_variation_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`hue_variation_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`hue_variation_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`initial_velocity_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`initial_velocity_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`lifetime_randomness` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`linear_accel_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`linear_accel_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`linear_accel_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`orbit_velocity_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`orbit_velocity_max` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`orbit_velocity_min` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`bool` | :ref:`particle_flag_align_y` | ``false`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`bool` | :ref:`particle_flag_disable_z` | ``false`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`bool` | :ref:`particle_flag_rotate_y` | ``false`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`radial_accel_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`radial_accel_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`radial_accel_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`scale_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`scale_max` | ``1.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`scale_min` | ``1.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`spread` | ``45.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`int` | :ref:`sub_emitter_amount_at_collision` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`int` | :ref:`sub_emitter_amount_at_end` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`sub_emitter_frequency` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`bool` | :ref:`sub_emitter_keep_velocity` | ``false`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`SubEmitterMode` | :ref:`sub_emitter_mode` | ``0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`tangential_accel_curve` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`tangential_accel_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`tangential_accel_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`bool` | :ref:`turbulence_enabled` | ``false`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`turbulence_influence_max` | ``0.1`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`turbulence_influence_min` | ``0.1`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Texture2D` | :ref:`turbulence_influence_over_life` | | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`turbulence_initial_displacement_max` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`turbulence_initial_displacement_min` | ``0.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`turbulence_noise_scale` | ``9.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`Vector3` | :ref:`turbulence_noise_speed` | ``Vector3(0, 0, 0)`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`turbulence_noise_speed_random` | ``0.2`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ + | :ref:`float` | :ref:`turbulence_noise_strength` | ``1.0`` | + +--------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-------------------------+ .. rst-class:: classref-reftable-group @@ -1879,16 +1879,16 @@ A small scale will result in smaller features with more detail while a high scal .. rst-class:: classref-property -:ref:`Vector3` **turbulence_noise_speed** = ``Vector3(0.5, 0.5, 0.5)`` +:ref:`Vector3` **turbulence_noise_speed** = ``Vector3(0, 0, 0)`` .. rst-class:: classref-property-setget - void **set_turbulence_noise_speed** **(** :ref:`Vector3` value **)** - :ref:`Vector3` **get_turbulence_noise_speed** **(** **)** -The movement speed of the turbulence pattern. This changes how quickly the noise changes over time. +A scrolling velocity for the turbulence field. This sets a directional trend for the pattern to move in over time. -A value of ``Vector3(0.0, 0.0, 0.0)`` will freeze the turbulence pattern in place. +The default value of ``Vector3(0, 0, 0)`` turns off the scrolling. .. rst-class:: classref-item-separator @@ -1898,14 +1898,16 @@ A value of ``Vector3(0.0, 0.0, 0.0)`` will freeze the turbulence pattern in plac .. rst-class:: classref-property -:ref:`float` **turbulence_noise_speed_random** = ``0.0`` +:ref:`float` **turbulence_noise_speed_random** = ``0.2`` .. rst-class:: classref-property-setget - void **set_turbulence_noise_speed_random** **(** :ref:`float` value **)** - :ref:`float` **get_turbulence_noise_speed_random** **(** **)** -Use to influence the noise speed in a random pattern. This helps break up visible movement patterns. +The in-place rate of change of the turbulence field. This defines how quickly the noise pattern varies over time. + +A value of 0.0 will result in a fixed pattern. .. rst-class:: classref-item-separator @@ -1922,7 +1924,7 @@ Use to influence the noise speed in a random pattern. This helps break up visibl - void **set_turbulence_noise_strength** **(** :ref:`float` value **)** - :ref:`float` **get_turbulence_noise_strength** **(** **)** -The turbulence noise strength. Increasing this will result in a stronger, more contrasting noise pattern. +The turbulence noise strength. Increasing this will result in a stronger, more contrasting, flow pattern. .. rst-class:: classref-section-separator diff --git a/classes/class_placeholdercubemap.rst b/classes/class_placeholdercubemap.rst index 777f5908ab7..e687597e138 100644 --- a/classes/class_placeholdercubemap.rst +++ b/classes/class_placeholdercubemap.rst @@ -25,6 +25,8 @@ This class is used when loading a project that uses a :ref:`Cubemap` | :ref:`application/config/windows_native_icon` | ``""`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`application/run/delta_smoothing` | ``true`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`application/run/disable_stderr` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`application/run/disable_stdout` | ``false`` | @@ -125,6 +127,8 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`audio/general/3d_panning_strength` | ``0.5`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`audio/general/text_to_speech` | ``false`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`audio/video/video_delay_compensation_ms` | ``0`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`compression/formats/gzip/compression_level` | ``-1`` | @@ -1779,6 +1783,22 @@ Icon set in ``.ico`` format used on Windows to set the game's icon. This is done ---- +.. _class_ProjectSettings_property_application/run/delta_smoothing: + +.. rst-class:: classref-property + +:ref:`bool` **application/run/delta_smoothing** = ``true`` + +Time samples for frame deltas are subject to random variation introduced by the platform, even when frames are displayed at regular intervals thanks to V-Sync. This can lead to jitter. Delta smoothing can often give a better result by filtering the input deltas to correct for minor fluctuations from the refresh rate. + +\ **Note:** Delta smoothing is only attempted when :ref:`display/window/vsync/vsync_mode` is set to ``enabled``, as it does not work well without V-Sync. + +It may take several seconds at a stable frame rate before the smoothing is initially activated. It will only be active on machines where performance is adequate to render frames at the refresh rate. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_application/run/disable_stderr: .. rst-class:: classref-property @@ -2069,6 +2089,20 @@ The default value of ``0.5`` is tuned for headphones. When using speakers, you m ---- +.. _class_ProjectSettings_property_audio/general/text_to_speech: + +.. rst-class:: classref-property + +:ref:`bool` **audio/general/text_to_speech** = ``false`` + +If ``true``, text-to-speech support is enabled, see :ref:`DisplayServer.tts_get_voices` and :ref:`DisplayServer.tts_speak`. + +\ **Note:** Enabling TTS can cause addition idle CPU usage and interfere with the sleep mode, so consider disabling it if TTS is not used. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_audio/video/video_delay_compensation_ms: .. rst-class:: classref-property diff --git a/classes/class_richtextlabel.rst b/classes/class_richtextlabel.rst index ef0ba32338d..3f2deecbe40 100644 --- a/classes/class_richtextlabel.rst +++ b/classes/class_richtextlabel.rst @@ -106,133 +106,133 @@ Methods .. table:: :widths: auto - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_image` **(** :ref:`Texture2D` image, :ref:`int` width=0, :ref:`int` height=0, :ref:`Color` color=Color(1, 1, 1, 1), :ref:`InlineAlignment` inline_align=5, :ref:`Rect2` region=Rect2(0, 0, 0, 0) **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_text` **(** :ref:`String` text **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`append_text` **(** :ref:`String` bbcode **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`deselect` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_character_line` **(** :ref:`int` character **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_character_paragraph` **(** :ref:`int` character **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_content_height` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_content_width` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_line_count` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_line_offset` **(** :ref:`int` line **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PopupMenu` | :ref:`get_menu` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_paragraph_count` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_paragraph_offset` **(** :ref:`int` paragraph **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_parsed_text` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_selected_text` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_selection_from` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_selection_to` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_total_character_count` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`VScrollBar` | :ref:`get_v_scroll_bar` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_visible_line_count` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_visible_paragraph_count` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`install_effect` **(** :ref:`Variant` effect **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_menu_visible` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_ready` **(** **)** |const| | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`menu_option` **(** :ref:`int` option **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`newline` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`parse_bbcode` **(** :ref:`String` bbcode **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`parse_expressions_for_values` **(** :ref:`PackedStringArray` expressions **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`pop` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_bgcolor` **(** :ref:`Color` bgcolor **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_bold` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_bold_italics` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_cell` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_color` **(** :ref:`Color` color **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_customfx` **(** :ref:`RichTextEffect` effect, :ref:`Dictionary` env **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_dropcap` **(** :ref:`String` string, :ref:`Font` font, :ref:`int` size, :ref:`Rect2` dropcap_margins=Rect2(0, 0, 0, 0), :ref:`Color` color=Color(1, 1, 1, 1), :ref:`int` outline_size=0, :ref:`Color` outline_color=Color(0, 0, 0, 0) **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_fgcolor` **(** :ref:`Color` fgcolor **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_font` **(** :ref:`Font` font, :ref:`int` font_size **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_font_size` **(** :ref:`int` font_size **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_hint` **(** :ref:`String` description **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_indent` **(** :ref:`int` level **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_italics` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_list` **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize, :ref:`String` bullet="•" **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_meta` **(** :ref:`Variant` data **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_mono` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_normal` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_outline_color` **(** :ref:`Color` color **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_outline_size` **(** :ref:`int` outline_size **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_paragraph` **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0 **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_strikethrough` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_table` **(** :ref:`int` columns, :ref:`InlineAlignment` inline_align=0, :ref:`int` align_to_row=-1 **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_underline` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`remove_paragraph` **(** :ref:`int` paragraph **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scroll_to_line` **(** :ref:`int` line **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scroll_to_paragraph` **(** :ref:`int` paragraph **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scroll_to_selection` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`select_all` **(** **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_border_color` **(** :ref:`Color` color **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_padding` **(** :ref:`Rect2` padding **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_row_background_color` **(** :ref:`Color` odd_row_bg, :ref:`Color` even_row_bg **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_size_override` **(** :ref:`Vector2` min_size, :ref:`Vector2` max_size **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_table_column_expand` **(** :ref:`int` column, :ref:`bool` expand, :ref:`int` ratio **)** | - +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_image` **(** :ref:`Texture2D` image, :ref:`int` width=0, :ref:`int` height=0, :ref:`Color` color=Color(1, 1, 1, 1), :ref:`InlineAlignment` inline_align=5, :ref:`Rect2` region=Rect2(0, 0, 0, 0) **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_text` **(** :ref:`String` text **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`append_text` **(** :ref:`String` bbcode **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`deselect` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_character_line` **(** :ref:`int` character **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_character_paragraph` **(** :ref:`int` character **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_content_height` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_content_width` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_line_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_line_offset` **(** :ref:`int` line **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PopupMenu` | :ref:`get_menu` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_paragraph_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_paragraph_offset` **(** :ref:`int` paragraph **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_parsed_text` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_selected_text` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_selection_from` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_selection_to` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_total_character_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`VScrollBar` | :ref:`get_v_scroll_bar` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_visible_line_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_visible_paragraph_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`install_effect` **(** :ref:`Variant` effect **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_menu_visible` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_ready` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`menu_option` **(** :ref:`int` option **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`newline` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`parse_bbcode` **(** :ref:`String` bbcode **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`parse_expressions_for_values` **(** :ref:`PackedStringArray` expressions **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`pop` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_bgcolor` **(** :ref:`Color` bgcolor **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_bold` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_bold_italics` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_cell` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_color` **(** :ref:`Color` color **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_customfx` **(** :ref:`RichTextEffect` effect, :ref:`Dictionary` env **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_dropcap` **(** :ref:`String` string, :ref:`Font` font, :ref:`int` size, :ref:`Rect2` dropcap_margins=Rect2(0, 0, 0, 0), :ref:`Color` color=Color(1, 1, 1, 1), :ref:`int` outline_size=0, :ref:`Color` outline_color=Color(0, 0, 0, 0) **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_fgcolor` **(** :ref:`Color` fgcolor **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_font` **(** :ref:`Font` font, :ref:`int` font_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_font_size` **(** :ref:`int` font_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_hint` **(** :ref:`String` description **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_indent` **(** :ref:`int` level **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_italics` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_list` **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize, :ref:`String` bullet="•" **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_meta` **(** :ref:`Variant` data **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_mono` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_normal` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_outline_color` **(** :ref:`Color` color **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_outline_size` **(** :ref:`int` outline_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_paragraph` **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0, :ref:`JustificationFlag` justification_flags=163 **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_strikethrough` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_table` **(** :ref:`int` columns, :ref:`InlineAlignment` inline_align=0, :ref:`int` align_to_row=-1 **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_underline` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`remove_paragraph` **(** :ref:`int` paragraph **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scroll_to_line` **(** :ref:`int` line **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scroll_to_paragraph` **(** :ref:`int` paragraph **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scroll_to_selection` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`select_all` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_border_color` **(** :ref:`Color` color **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_padding` **(** :ref:`Rect2` padding **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_row_background_color` **(** :ref:`Color` odd_row_bg, :ref:`Color` even_row_bg **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_size_override` **(** :ref:`Vector2` min_size, :ref:`Vector2` max_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_table_column_expand` **(** :ref:`int` column, :ref:`bool` expand, :ref:`int` ratio **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -1516,7 +1516,7 @@ Adds a ``[outline_size]`` tag to the tag stack. Overrides default text outline s .. rst-class:: classref-method -void **push_paragraph** **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0 **)** +void **push_paragraph** **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0, :ref:`JustificationFlag` justification_flags=163 **)** Adds a ``[p]`` tag to the tag stack. diff --git a/classes/class_semaphore.rst b/classes/class_semaphore.rst index fec8c052c98..aa951296f86 100644 --- a/classes/class_semaphore.rst +++ b/classes/class_semaphore.rst @@ -21,6 +21,14 @@ Description A synchronization semaphore which can be used to synchronize multiple :ref:`Thread`\ s. Initialized to zero on creation. Be careful to avoid deadlocks. For a binary version, see :ref:`Mutex`. +\ **Warning:**\ + +To guarantee that the operating system is able to perform proper cleanup (no crashes, no deadlocks), these conditions must be met: + +- By the time a **Semaphore**'s reference count reaches zero and therefore it is destroyed, no threads must be waiting on it. + +- By the time a :ref:`Thread`'s reference count reaches zero and therefore it is destroyed, it must not be waiting on any semaphore. + .. rst-class:: classref-introduction-group Tutorials diff --git a/classes/class_string.rst b/classes/class_string.rst index 901ae58517c..8ecc1efa4a8 100644 --- a/classes/class_string.rst +++ b/classes/class_string.rst @@ -823,7 +823,7 @@ Decodes a hexadecimal string as a :ref:`PackedByteArray`. .. code-tab:: csharp var text = "hello world"; - var encoded = text.ToUtf8Buffer().HexEncode(); # outputs "68656c6c6f20776f726c64" + var encoded = text.ToUtf8Buffer().HexEncode(); // outputs "68656c6c6f20776f726c64" GD.Print(buf.HexDecode().GetStringFromUtf8()); diff --git a/classes/class_stringname.rst b/classes/class_stringname.rst index 673fff49284..e1630dfe864 100644 --- a/classes/class_stringname.rst +++ b/classes/class_stringname.rst @@ -777,7 +777,7 @@ Decodes a hexadecimal string as a :ref:`PackedByteArray`. .. code-tab:: csharp var text = "hello world"; - var encoded = text.ToUtf8Buffer().HexEncode(); # outputs "68656c6c6f20776f726c64" + var encoded = text.ToUtf8Buffer().HexEncode(); // outputs "68656c6c6f20776f726c64" GD.Print(buf.HexDecode().GetStringFromUtf8()); @@ -1965,7 +1965,7 @@ Appends ``right`` at the end of this **StringName**, returning a :ref:`String` **operator <** **(** :ref:`StringName` right **)** -Returns ``true`` if the left :ref:`String` comes before ``right`` in `Unicode order `__, which roughly matches the alphabetical order. Useful for sorting. +Returns ``true`` if the left **StringName**'s pointer comes before ``right``. Note that this will not match their `Unicode order `__. .. rst-class:: classref-item-separator @@ -1977,7 +1977,7 @@ Returns ``true`` if the left :ref:`String` comes before ``right`` :ref:`bool` **operator <=** **(** :ref:`StringName` right **)** -Returns ``true`` if the left :ref:`String` comes before ``right`` in `Unicode order `__, which roughly matches the alphabetical order, or if both are equal. +Returns ``true`` if the left **StringName**'s pointer comes before ``right`` or if they are the same. Note that this will not match their `Unicode order `__. .. rst-class:: classref-item-separator @@ -2013,7 +2013,7 @@ Returns ``true`` if the **StringName** and ``right`` refer to the same name. Com :ref:`bool` **operator >** **(** :ref:`StringName` right **)** -Returns ``true`` if the left **StringName** comes after ``right`` in `Unicode order `__, which roughly matches the alphabetical order. Useful for sorting. +Returns ``true`` if the left **StringName**'s pointer comes after ``right``. Note that this will not match their `Unicode order `__. .. rst-class:: classref-item-separator @@ -2025,7 +2025,7 @@ Returns ``true`` if the left **StringName** comes after ``right`` in `Unicode or :ref:`bool` **operator >=** **(** :ref:`StringName` right **)** -Returns ``true`` if the left **StringName** comes after ``right`` in `Unicode order `__, which roughly matches the alphabetical order, or if both are equal. +Returns ``true`` if the left **StringName**'s pointer comes after ``right`` or if they are the same. Note that this will not match their `Unicode order `__. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_textedit.rst b/classes/class_textedit.rst index 00187d1d026..30d745d0f6b 100644 --- a/classes/class_textedit.rst +++ b/classes/class_textedit.rst @@ -2241,7 +2241,9 @@ Returns the text currently in ``gutter`` at ``line``. :ref:`int` **get_line_height** **(** **)** |const| -Returns the height of a largest line. +Returns the maximum value of the line height among all lines. + +\ **Note:** The return value is influenced by :ref:`line_spacing` and :ref:`font_size`. And it will not be less than ``1``. .. rst-class:: classref-item-separator diff --git a/classes/class_textmesh.rst b/classes/class_textmesh.rst index fd70f2637f9..c6f8ecd927d 100644 --- a/classes/class_textmesh.rst +++ b/classes/class_textmesh.rst @@ -46,6 +46,8 @@ Properties +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------+ | :ref:`HorizontalAlignment` | :ref:`horizontal_alignment` | ``1`` | +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------+ + | :ref:`JustificationFlag` | :ref:`justification_flags` | ``163`` | + +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------+ | :ref:`String` | :ref:`language` | ``""`` | +-------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------+-------------------+ | :ref:`float` | :ref:`line_spacing` | ``0.0`` | @@ -180,6 +182,23 @@ Controls the text's horizontal alignment. Supports left, center, right, and fill ---- +.. _class_TextMesh_property_justification_flags: + +.. rst-class:: classref-property + +:ref:`JustificationFlag` **justification_flags** = ``163`` + +.. rst-class:: classref-property-setget + +- void **set_justification_flags** **(** :ref:`JustificationFlag` value **)** +- :ref:`JustificationFlag` **get_justification_flags** **(** **)** + +Line fill alignment rules. For more info see :ref:`JustificationFlag`. + +.. rst-class:: classref-item-separator + +---- + .. _class_TextMesh_property_language: .. rst-class:: classref-property diff --git a/classes/class_textparagraph.rst b/classes/class_textparagraph.rst index 22490704352..744fba7717a 100644 --- a/classes/class_textparagraph.rst +++ b/classes/class_textparagraph.rst @@ -38,7 +38,7 @@ Properties +-------------------------------------------------------------------+----------------------------------------------------------------------------------+-----------+ | :ref:`Direction` | :ref:`direction` | ``0`` | +-------------------------------------------------------------------+----------------------------------------------------------------------------------+-----------+ - | :ref:`JustificationFlag` | :ref:`justification_flags` | ``3`` | + | :ref:`JustificationFlag` | :ref:`justification_flags` | ``163`` | +-------------------------------------------------------------------+----------------------------------------------------------------------------------+-----------+ | :ref:`int` | :ref:`max_lines_visible` | ``-1`` | +-------------------------------------------------------------------+----------------------------------------------------------------------------------+-----------+ @@ -208,14 +208,14 @@ Text writing direction. .. rst-class:: classref-property -:ref:`JustificationFlag` **justification_flags** = ``3`` +:ref:`JustificationFlag` **justification_flags** = ``163`` .. rst-class:: classref-property-setget - void **set_justification_flags** **(** :ref:`JustificationFlag` value **)** - :ref:`JustificationFlag` **get_justification_flags** **(** **)** -Line alignment rules. For more info see :ref:`TextServer`. +Line fill alignment rules. For more info see :ref:`JustificationFlag`. .. rst-class:: classref-item-separator diff --git a/classes/class_textserver.rst b/classes/class_textserver.rst index 49c39146c02..bf8a5bfc634 100644 --- a/classes/class_textserver.rst +++ b/classes/class_textserver.rst @@ -304,7 +304,7 @@ Methods +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`shaped_text_draw_outline` **(** :ref:`RID` shaped, :ref:`RID` canvas, :ref:`Vector2` pos, :ref:`float` clip_l=-1, :ref:`float` clip_r=-1, :ref:`int` outline_size=1, :ref:`Color` color=Color(1, 1, 1, 1) **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`shaped_text_fit_to_width` **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` jst_flags=3 **)** | + | :ref:`float` | :ref:`shaped_text_fit_to_width` **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` justification_flags=3 **)** | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`shaped_text_get_ascent` **(** :ref:`RID` shaped **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -366,6 +366,8 @@ Methods +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedInt32Array` | :ref:`shaped_text_get_word_breaks` **(** :ref:`RID` shaped, :ref:`GraphemeFlag` grapheme_flags=264 **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`shaped_text_has_visible_chars` **(** :ref:`RID` shaped **)** |const| | + +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`shaped_text_hit_test_grapheme` **(** :ref:`RID` shaped, :ref:`float` coords **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`shaped_text_hit_test_position` **(** :ref:`RID` shaped, :ref:`float` coords **)** |const| | @@ -644,6 +646,30 @@ Only apply justification to the part of the text after the last tab. Apply justification to the trimmed line with ellipsis. +.. _class_TextServer_constant_JUSTIFICATION_SKIP_LAST_LINE: + +.. rst-class:: classref-enumeration-constant + +:ref:`JustificationFlag` **JUSTIFICATION_SKIP_LAST_LINE** = ``32`` + +Do not apply justification to the last line of the paragraph. + +.. _class_TextServer_constant_JUSTIFICATION_SKIP_LAST_LINE_WITH_VISIBLE_CHARS: + +.. rst-class:: classref-enumeration-constant + +:ref:`JustificationFlag` **JUSTIFICATION_SKIP_LAST_LINE_WITH_VISIBLE_CHARS** = ``64`` + +Do not apply justification to the last line of the paragraph with visible characters (takes precedence over :ref:`JUSTIFICATION_SKIP_LAST_LINE`). + +.. _class_TextServer_constant_JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE: + +.. rst-class:: classref-enumeration-constant + +:ref:`JustificationFlag` **JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE** = ``128`` + +Always apply justification to the paragraphs with a single line (:ref:`JUSTIFICATION_SKIP_LAST_LINE` and :ref:`JUSTIFICATION_SKIP_LAST_LINE_WITH_VISIBLE_CHARS` are ignored). + .. rst-class:: classref-item-separator ---- @@ -3149,7 +3175,7 @@ Draw the outline of the shaped text into a canvas item at a given position, with .. rst-class:: classref-method -:ref:`float` **shaped_text_fit_to_width** **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` jst_flags=3 **)** +:ref:`float` **shaped_text_fit_to_width** **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` justification_flags=3 **)** Adjusts text width to fit to specified width, returns new text width. @@ -3523,6 +3549,18 @@ Breaks text into words and returns array of character ranges. Use ``grapheme_fla ---- +.. _class_TextServer_method_shaped_text_has_visible_chars: + +.. rst-class:: classref-method + +:ref:`bool` **shaped_text_has_visible_chars** **(** :ref:`RID` shaped **)** |const| + +Returns ``true``, if text buffer contents any visible characters. + +.. rst-class:: classref-item-separator + +---- + .. _class_TextServer_method_shaped_text_hit_test_grapheme: .. rst-class:: classref-method diff --git a/classes/class_textserverextension.rst b/classes/class_textserverextension.rst index 747df3fb640..6db7070b4b0 100644 --- a/classes/class_textserverextension.rst +++ b/classes/class_textserverextension.rst @@ -308,7 +308,7 @@ Methods +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`_shaped_text_draw_outline` **(** :ref:`RID` shaped, :ref:`RID` canvas, :ref:`Vector2` pos, :ref:`float` clip_l, :ref:`float` clip_r, :ref:`int` outline_size, :ref:`Color` color **)** |virtual| |const| | +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`_shaped_text_fit_to_width` **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` jst_flags **)** |virtual| | + | :ref:`float` | :ref:`_shaped_text_fit_to_width` **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` justification_flags **)** |virtual| | +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_shaped_text_get_ascent` **(** :ref:`RID` shaped **)** |virtual| |const| | +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -2368,7 +2368,7 @@ void **_shaped_text_draw_outline** **(** :ref:`RID` shaped, :ref:`RID .. rst-class:: classref-method -:ref:`float` **_shaped_text_fit_to_width** **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` jst_flags **)** |virtual| +:ref:`float` **_shaped_text_fit_to_width** **(** :ref:`RID` shaped, :ref:`float` width, :ref:`JustificationFlag` justification_flags **)** |virtual| .. container:: contribute diff --git a/classes/class_thread.rst b/classes/class_thread.rst index 8c01342da07..175c80e7565 100644 --- a/classes/class_thread.rst +++ b/classes/class_thread.rst @@ -23,6 +23,16 @@ A unit of execution in a process. Can run methods on :ref:`Object` \ **Note:** Breakpoints won't break on code if it's running in a thread. This is a current limitation of the GDScript debugger. +\ **Warning:**\ + +To guarantee that the operating system is able to perform proper cleanup (no crashes, no deadlocks), these conditions must be met by the time a **Thread**'s reference count reaches zero and therefore it is destroyed: + +- It must not have any :ref:`Mutex` objects locked. + +- It must not be waiting on any :ref:`Semaphore` objects. + +- :ref:`wait_to_finish` should have been called on it. + .. rst-class:: classref-introduction-group Tutorials diff --git a/classes/class_window.rst b/classes/class_window.rst index 62112241dbc..1921ca44480 100644 --- a/classes/class_window.rst +++ b/classes/class_window.rst @@ -99,133 +99,145 @@ Methods .. table:: :widths: auto - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_theme_color_override` **(** :ref:`StringName` name, :ref:`Color` color **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_theme_constant_override` **(** :ref:`StringName` name, :ref:`int` constant **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_theme_font_override` **(** :ref:`StringName` name, :ref:`Font` font **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_theme_font_size_override` **(** :ref:`StringName` name, :ref:`int` font_size **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_theme_icon_override` **(** :ref:`StringName` name, :ref:`Texture2D` texture **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_theme_stylebox_override` **(** :ref:`StringName` name, :ref:`StyleBox` stylebox **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`begin_bulk_theme_override` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`can_draw` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`child_controls_changed` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`end_bulk_theme_override` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_contents_minimum_size` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`get_flag` **(** :ref:`Flags` flag **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`LayoutDirection` | :ref:`get_layout_direction` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2i` | :ref:`get_position_with_decorations` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2i` | :ref:`get_size_with_decorations` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Color` | :ref:`get_theme_color` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_theme_constant` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_theme_default_base_scale` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Font` | :ref:`get_theme_default_font` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_theme_default_font_size` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Font` | :ref:`get_theme_font` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_theme_font_size` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Texture2D` | :ref:`get_theme_icon` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`StyleBox` | :ref:`get_theme_stylebox` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`grab_focus` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_focus` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_color` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_color_override` **(** :ref:`StringName` name **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_constant` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_constant_override` **(** :ref:`StringName` name **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_font` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_font_override` **(** :ref:`StringName` name **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_font_size` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_font_size_override` **(** :ref:`StringName` name **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_icon` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_icon_override` **(** :ref:`StringName` name **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_stylebox` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_theme_stylebox_override` **(** :ref:`StringName` name **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`hide` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_embedded` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_layout_rtl` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_maximize_allowed` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_using_font_oversampling` **(** **)** |const| | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`move_to_foreground` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`popup` **(** :ref:`Rect2i` rect=Rect2i(0, 0, 0, 0) **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`popup_centered` **(** :ref:`Vector2i` minsize=Vector2i(0, 0) **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`popup_centered_clamped` **(** :ref:`Vector2i` minsize=Vector2i(0, 0), :ref:`float` fallback_ratio=0.75 **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`popup_centered_ratio` **(** :ref:`float` ratio=0.8 **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`popup_on_parent` **(** :ref:`Rect2i` parent_rect **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_theme_color_override` **(** :ref:`StringName` name **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_theme_constant_override` **(** :ref:`StringName` name **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_theme_font_override` **(** :ref:`StringName` name **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_theme_font_size_override` **(** :ref:`StringName` name **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_theme_icon_override` **(** :ref:`StringName` name **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_theme_stylebox_override` **(** :ref:`StringName` name **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`request_attention` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`reset_size` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_flag` **(** :ref:`Flags` flag, :ref:`bool` enabled **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_ime_active` **(** :ref:`bool` active **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_ime_position` **(** :ref:`Vector2i` position **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_layout_direction` **(** :ref:`LayoutDirection` direction **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_use_font_oversampling` **(** :ref:`bool` enable **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`show` **(** **)** | - +-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_theme_color_override` **(** :ref:`StringName` name, :ref:`Color` color **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_theme_constant_override` **(** :ref:`StringName` name, :ref:`int` constant **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_theme_font_override` **(** :ref:`StringName` name, :ref:`Font` font **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_theme_font_size_override` **(** :ref:`StringName` name, :ref:`int` font_size **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_theme_icon_override` **(** :ref:`StringName` name, :ref:`Texture2D` texture **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_theme_stylebox_override` **(** :ref:`StringName` name, :ref:`StyleBox` stylebox **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`begin_bulk_theme_override` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`can_draw` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`child_controls_changed` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`end_bulk_theme_override` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_contents_minimum_size` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`get_flag` **(** :ref:`Flags` flag **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`LayoutDirection` | :ref:`get_layout_direction` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2i` | :ref:`get_position_with_decorations` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2i` | :ref:`get_size_with_decorations` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`get_theme_color` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_theme_constant` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_theme_default_base_scale` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Font` | :ref:`get_theme_default_font` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_theme_default_font_size` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Font` | :ref:`get_theme_font` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_theme_font_size` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Texture2D` | :ref:`get_theme_icon` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`StyleBox` | :ref:`get_theme_stylebox` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`grab_focus` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_focus` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_color` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_color_override` **(** :ref:`StringName` name **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_constant` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_constant_override` **(** :ref:`StringName` name **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_font` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_font_override` **(** :ref:`StringName` name **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_font_size` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_font_size_override` **(** :ref:`StringName` name **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_icon` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_icon_override` **(** :ref:`StringName` name **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_stylebox` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_theme_stylebox_override` **(** :ref:`StringName` name **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`hide` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_embedded` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_layout_rtl` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_maximize_allowed` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_using_font_oversampling` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`move_to_foreground` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup` **(** :ref:`Rect2i` rect=Rect2i(0, 0, 0, 0) **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_centered` **(** :ref:`Vector2i` minsize=Vector2i(0, 0) **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_centered_clamped` **(** :ref:`Vector2i` minsize=Vector2i(0, 0), :ref:`float` fallback_ratio=0.75 **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_centered_ratio` **(** :ref:`float` ratio=0.8 **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_exclusive` **(** :ref:`Node` from_node, :ref:`Rect2i` rect=Rect2i(0, 0, 0, 0) **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_exclusive_centered` **(** :ref:`Node` from_node, :ref:`Vector2i` minsize=Vector2i(0, 0) **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_exclusive_centered_clamped` **(** :ref:`Node` from_node, :ref:`Vector2i` minsize=Vector2i(0, 0), :ref:`float` fallback_ratio=0.75 **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_exclusive_centered_ratio` **(** :ref:`Node` from_node, :ref:`float` ratio=0.8 **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_exclusive_on_parent` **(** :ref:`Node` from_node, :ref:`Rect2i` parent_rect **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`popup_on_parent` **(** :ref:`Rect2i` parent_rect **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_theme_color_override` **(** :ref:`StringName` name **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_theme_constant_override` **(** :ref:`StringName` name **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_theme_font_override` **(** :ref:`StringName` name **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_theme_font_size_override` **(** :ref:`StringName` name **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_theme_icon_override` **(** :ref:`StringName` name **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_theme_stylebox_override` **(** :ref:`StringName` name **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`request_attention` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`reset_size` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_flag` **(** :ref:`Flags` flag, :ref:`bool` enabled **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_ime_active` **(** :ref:`bool` active **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_ime_position` **(** :ref:`Vector2i` position **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_layout_direction` **(** :ref:`LayoutDirection` direction **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_unparent_when_invisible` **(** :ref:`bool` unparent **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_use_font_oversampling` **(** :ref:`bool` enable **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`show` **(** **)** | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -1985,6 +1997,76 @@ Popups the **Window** centered inside its parent **Window** and sets its size as ---- +.. _class_Window_method_popup_exclusive: + +.. rst-class:: classref-method + +void **popup_exclusive** **(** :ref:`Node` from_node, :ref:`Rect2i` rect=Rect2i(0, 0, 0, 0) **)** + +Attempts to parent this dialog to the last exclusive window relative to ``from_node``, and then calls :ref:`popup` on it. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`set_unparent_when_invisible` and :ref:`Node.get_last_exclusive_window`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Window_method_popup_exclusive_centered: + +.. rst-class:: classref-method + +void **popup_exclusive_centered** **(** :ref:`Node` from_node, :ref:`Vector2i` minsize=Vector2i(0, 0) **)** + +Attempts to parent this dialog to the last exclusive window relative to ``from_node``, and then calls :ref:`popup_centered` on it. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`set_unparent_when_invisible` and :ref:`Node.get_last_exclusive_window`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Window_method_popup_exclusive_centered_clamped: + +.. rst-class:: classref-method + +void **popup_exclusive_centered_clamped** **(** :ref:`Node` from_node, :ref:`Vector2i` minsize=Vector2i(0, 0), :ref:`float` fallback_ratio=0.75 **)** + +Attempts to parent this dialog to the last exclusive window relative to ``from_node``, and then calls :ref:`popup_centered_clamped` on it. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`set_unparent_when_invisible` and :ref:`Node.get_last_exclusive_window`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Window_method_popup_exclusive_centered_ratio: + +.. rst-class:: classref-method + +void **popup_exclusive_centered_ratio** **(** :ref:`Node` from_node, :ref:`float` ratio=0.8 **)** + +Attempts to parent this dialog to the last exclusive window relative to ``from_node``, and then calls :ref:`popup_centered_ratio` on it. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`set_unparent_when_invisible` and :ref:`Node.get_last_exclusive_window`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Window_method_popup_exclusive_on_parent: + +.. rst-class:: classref-method + +void **popup_exclusive_on_parent** **(** :ref:`Node` from_node, :ref:`Rect2i` parent_rect **)** + +Attempts to parent this dialog to the last exclusive window relative to ``from_node``, and then calls :ref:`popup_on_parent` on it. The dialog must have no current parent, otherwise the method fails. + +See also :ref:`set_unparent_when_invisible` and :ref:`Node.get_last_exclusive_window`. + +.. rst-class:: classref-item-separator + +---- + .. _class_Window_method_popup_on_parent: .. rst-class:: classref-method @@ -2141,6 +2223,20 @@ Sets layout direction and text writing direction. Right-to-left layouts are nece ---- +.. _class_Window_method_set_unparent_when_invisible: + +.. rst-class:: classref-method + +void **set_unparent_when_invisible** **(** :ref:`bool` unparent **)** + +If ``unparent`` is ``true``, the window is automatically unparented when going invisible. + +\ **Note:** Make sure to keep a reference to the node, otherwise it will be orphaned. You also need to manually call :ref:`Node.queue_free` to free the window if it's not parented. + +.. rst-class:: classref-item-separator + +---- + .. _class_Window_method_set_use_font_oversampling: .. rst-class:: classref-method diff --git a/classes/class_workerthreadpool.rst b/classes/class_workerthreadpool.rst index a1d13987f03..f889dbd089b 100644 --- a/classes/class_workerthreadpool.rst +++ b/classes/class_workerthreadpool.rst @@ -83,21 +83,21 @@ Methods .. table:: :widths: auto - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`add_group_task` **(** :ref:`Callable` action, :ref:`int` elements, :ref:`int` tasks_needed=-1, :ref:`bool` high_priority=false, :ref:`String` description="" **)** | - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`add_task` **(** :ref:`Callable` action, :ref:`bool` high_priority=false, :ref:`String` description="" **)** | - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_group_processed_element_count` **(** :ref:`int` group_id **)** |const| | - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_group_task_completed` **(** :ref:`int` group_id **)** |const| | - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_task_completed` **(** :ref:`int` task_id **)** |const| | - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`wait_for_group_task_completion` **(** :ref:`int` group_id **)** | - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`wait_for_task_completion` **(** :ref:`int` task_id **)** | - +-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`add_group_task` **(** :ref:`Callable` action, :ref:`int` elements, :ref:`int` tasks_needed=-1, :ref:`bool` high_priority=false, :ref:`String` description="" **)** | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`add_task` **(** :ref:`Callable` action, :ref:`bool` high_priority=false, :ref:`String` description="" **)** | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_group_processed_element_count` **(** :ref:`int` group_id **)** |const| | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_group_task_completed` **(** :ref:`int` group_id **)** |const| | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_task_completed` **(** :ref:`int` task_id **)** |const| | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`wait_for_group_task_completion` **(** :ref:`int` group_id **)** | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`wait_for_task_completion` **(** :ref:`int` task_id **)** | + +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -192,10 +192,16 @@ Pauses the thread that calls this method until the group task with the given ID .. rst-class:: classref-method -void **wait_for_task_completion** **(** :ref:`int` task_id **)** +:ref:`Error` **wait_for_task_completion** **(** :ref:`int` task_id **)** Pauses the thread that calls this method until the task with the given ID is completed. +Returns :ref:`@GlobalScope.OK` if the task could be successfully awaited. + +Returns :ref:`@GlobalScope.ERR_INVALID_PARAMETER` if a task with the passed ID does not exist (maybe because it was already awaited and disposed of). + +Returns :ref:`@GlobalScope.ERR_BUSY` if the call is made from another running task and, due to task scheduling, the task to await is at a lower level in the call stack and therefore can't progress. This is an advanced situation that should only matter when some tasks depend on others. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` From e6cd08fa799cd12dcdf6b0dc201d71b0a9814839 Mon Sep 17 00:00:00 2001 From: yashmistri Date: Sat, 20 May 2023 15:06:56 -0400 Subject: [PATCH 18/76] Fix vector math tutorial --- tutorials/math/vector_math.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tutorials/math/vector_math.rst b/tutorials/math/vector_math.rst index b1d22287a54..525d956dbf1 100644 --- a/tutorials/math/vector_math.rst +++ b/tutorials/math/vector_math.rst @@ -232,18 +232,18 @@ Here is a GDScript example of the diagram above using a :ref:`CharacterBody2D # object "collision" contains information about the collision var collision = move_and_collide(velocity * delta) if collision: - var reflect = collision.remainder.bounce(collision.normal) - velocity = velocity.bounce(collision.normal) + var reflect = collision.get_remainder().bounce(collision.get_normal()) + velocity = velocity.bounce(collision.get_normal()) move_and_collide(reflect) .. code-tab:: csharp // KinematicCollision2D contains information about the collision - KinematicCollision2D collision = MoveAndCollide(_velocity * delta); + KinematicCollision2D collision = MoveAndCollide(_velocity * (float)delta); if (collision != null) { - var reflect = collision.Remainder.Bounce(collision.Normal); - _velocity = _velocity.Bounce(collision.Normal); + var reflect = collision.GetRemainder().Bounce(collision.GetNormal()); + _velocity = _velocity.Bounce(collision.GetNormal()); MoveAndCollide(reflect); } From 5f75ad7712505471139605e19424735e919a2d6f Mon Sep 17 00:00:00 2001 From: hakro Date: Sun, 21 May 2023 02:43:07 +0200 Subject: [PATCH 19/76] Update standard_material_3d.rst No Depth Test, is below, not above. --- tutorials/3d/standard_material_3d.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/3d/standard_material_3d.rst b/tutorials/3d/standard_material_3d.rst index 4bb37273963..9c45a7204f2 100644 --- a/tutorials/3d/standard_material_3d.rst +++ b/tutorials/3d/standard_material_3d.rst @@ -114,7 +114,7 @@ Specifies when depth rendering must take place. * **Opaque Only (default):** Depth is only drawn for opaque objects. * **Always:** Depth draw is drawn for both opaque and transparent objects. * **Never:** No depth draw takes place - (do not confuse this with the No Depth Test option above). + (do not confuse this with the No Depth Test option below). * **Depth Pre-Pass:** For transparent objects, an opaque pass is made first with the opaque parts, then transparency is drawn above. Use this option with transparent grass or tree foliage. From b3f0c96ed31ada801fa71f820d967218766e123f Mon Sep 17 00:00:00 2001 From: "Leonid V. Fedorenchik" Date: Sun, 21 May 2023 12:12:35 +0800 Subject: [PATCH 20/76] Fix code typos * change parameter name to p_amplitude * add const to get_speed() --- tutorials/scripting/gdextension/gdextension_cpp_example.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/scripting/gdextension/gdextension_cpp_example.rst b/tutorials/scripting/gdextension/gdextension_cpp_example.rst index d43716deabb..54ef0f55b9c 100644 --- a/tutorials/scripting/gdextension/gdextension_cpp_example.rst +++ b/tutorials/scripting/gdextension/gdextension_cpp_example.rst @@ -443,7 +443,7 @@ functions: double amplitude; public: - void set_amplitude(const double amplitude); + void set_amplitude(const double p_amplitude); double get_amplitude() const; ... @@ -500,7 +500,7 @@ code: ... void _process(double delta) override; void set_speed(double p_speed); - double get_speed(); + double get_speed() const; ... This requires a few more changes to our ``gdexample.cpp`` file, again we're only From c2b9aecf7872a7782069d245b1e0b59269859f5e Mon Sep 17 00:00:00 2001 From: John Doughty Date: Mon, 22 May 2023 10:31:37 -0500 Subject: [PATCH 21/76] =?UTF-8?q?Update=20animation=5Ftree.rst=20to=20refl?= =?UTF-8?q?ect=20One=20Shot's=20C#=20enums=20not=20being=20li=E2=80=A6=20(?= =?UTF-8?q?#7391)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/animation/animation_tree.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/animation/animation_tree.rst b/tutorials/animation/animation_tree.rst index 1e75c9b50fb..547ee62d435 100644 --- a/tutorials/animation/animation_tree.rst +++ b/tutorials/animation/animation_tree.rst @@ -116,10 +116,10 @@ After setting the request and changing the animation playback, the one-shot node .. code-tab:: csharp // Play child animation connected to "shot" port. - animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE); + animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Fire); // Abort child animation connected to "shot" port. - animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT); + animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Abort); // Get current state (read-only). animationTree.Get("parameters/OneShot/active"); From ec366a691d23800eef89f4e97a49c04c988bb00e Mon Sep 17 00:00:00 2001 From: RaspberryEuphoria Date: Mon, 22 May 2023 21:49:46 +0200 Subject: [PATCH 22/76] doc: replace incorrect Speed variable with _speed --- getting_started/step_by_step/scripting_player_input.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/step_by_step/scripting_player_input.rst b/getting_started/step_by_step/scripting_player_input.rst index 69ca1752c90..acd007726a9 100644 --- a/getting_started/step_by_step/scripting_player_input.rst +++ b/getting_started/step_by_step/scripting_player_input.rst @@ -102,7 +102,7 @@ velocity. Replace the line starting with ``var velocity`` with the code below. var velocity = Vector2.Zero; if (Input.IsActionPressed("ui_up")) { - velocity = Vector2.Up.Rotated(Rotation) * Speed; + velocity = Vector2.Up.Rotated(Rotation) * _speed; } We initialize the ``velocity`` with a value of ``Vector2.ZERO``, another From 554735982d9b80efdfea77b6da09a36212736d3a Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Tue, 23 May 2023 20:40:57 -0500 Subject: [PATCH 23/76] Add a note about 3D asset direction conventions to "Importing 3D scenes" --- .../assets_pipeline/importing_scenes.rst | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tutorials/assets_pipeline/importing_scenes.rst b/tutorials/assets_pipeline/importing_scenes.rst index 965b2114a63..463557dc5f9 100644 --- a/tutorials/assets_pipeline/importing_scenes.rst +++ b/tutorials/assets_pipeline/importing_scenes.rst @@ -29,6 +29,33 @@ Copy the scene file together with the textures and mesh data (if separate) to the project repository, then Godot will do a full import when focusing the editor window. +3D asset direction conventions +------------------------------ + +Godot uses a right-handed, Y-is-up coordinate system, with the -Z axis as +the camera's forward direction. This is the same as OpenGL. This implies +that +Z is back, +X is right, and -X is left for a camera. + +The convention for 3D assets is to face the opposite direction as the camera, +so that characters and other assets are facing the camera by default. +This convention is extremely common in 3D modeling applications, and is +`codified in glTF as part of the glTF 2.0 specification `. +This means that for oriented 3D assets (such as characters), +the +Z axis is the direction of the front, so -Z is the rear, ++X is the left side, and -X is the right side for a 3D asset. +In Blender, this means that +Y is rear and -Y is front for an asset. + +When rotating an oriented 3D asset in Godot, use the ``use_model_front`` +option on the ``look_at`` functions, and use the ``Vector3.MODEL_*`` +constants to perform calculations in the oriented asset's local space. + +For assets without an intrinsic front side or forward direction, such as +a game map or terrain, take note of the cardinal directions instead. +The convention in Godot and the vast majority of other applications is +that +X is east and -X is west. Due to Godot's right-handed Y-is-up +coordinate system, this implies that +Z is south and -Z is north. +In Blender, this means that +Y is north and -Y is south. + Exporting glTF 2.0 files from Blender (recommended) --------------------------------------------------- From 787cfa61ca44ba8e513752a8d717aae9c8e49809 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 24 May 2023 11:53:17 +0200 Subject: [PATCH 24/76] Fix `:abbr:` usage in Internal rendering architecture --- .../core_and_modules/internal_rendering_architecture.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/core_and_modules/internal_rendering_architecture.rst b/contributing/development/core_and_modules/internal_rendering_architecture.rst index da61b0ae0cc..439492b9fac 100644 --- a/contributing/development/core_and_modules/internal_rendering_architecture.rst +++ b/contributing/development/core_and_modules/internal_rendering_architecture.rst @@ -311,7 +311,7 @@ this. ensure shader compilation doesn't become too slow. If you use ``if`` branching in a shader, performance may decrease as - :abbr`VGPR (Vector General-Purpose Register)` usage will increase in the + :abbr:`VGPR (Vector General-Purpose Register)` usage will increase in the shader. This happens even if all pixels evaluate to ``true`` or ``false`` in a given frame. From b57807b618deea344439bf059b307ab16af1d951 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 24 May 2023 11:59:17 +0200 Subject: [PATCH 25/76] Make it possible to read abbreviations by tapping on mobile --- _static/css/custom.css | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/_static/css/custom.css b/_static/css/custom.css index b2134a1551c..815d26eebce 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -112,7 +112,7 @@ --copybtn-tooltip-background-color: #24292f; --copybtn-box-shadow: 0 1px 0 rgba(27,31,36,0.04), inset 0 1px 0 rgba(255,255,255,0.25); --copybtn-border-color-success: #2da44e; - + --contribute-background-color: #d7dee8; --contribute-text-color: #646e72; @@ -1714,7 +1714,7 @@ p + .classref-constant { left: 3.5px; top: 3.5px; color: var(--copybtn-icon-color); - pointer-events: none; + pointer-events: none; } .highlight button.copybtn.success { border-color: var(--copybtn-border-color-success); @@ -1729,3 +1729,29 @@ p + .classref-constant { border-radius: 6px; padding: 0.5em 0.75em; } + +/* Allow :abbr: tags' content to be displayed on mobile platforms by tapping the word */ +@media (hover: none), (hover: on-demand), (-moz-touch-enabled: 1), (pointer:coarse) { + /* Do not enable on desktop platforms to avoid doubling the tooltip */ + abbr[title] { + position: relative; + } + + abbr[title]:hover::after, + abbr[title]:focus::after { + content: attr(title); + + position: absolute; + left: 0; + bottom: -32px; + width: auto; + white-space: nowrap; + + background-color: #1e1e1e; + color: #fff; + border-radius: 3px; + box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.4); + font-size: 14px; + padding: 3px 5px; + } +} From 4ec777d15e551ab211440c4ddc8fbd8b7ce5933b Mon Sep 17 00:00:00 2001 From: worstname <76739765+worstname@users.noreply.github.com> Date: Wed, 24 May 2023 07:49:53 -0600 Subject: [PATCH 26/76] Update embree library version (embree3-devel) to install for Fedora. (#7404) --- contributing/development/compiling/compiling_for_linuxbsd.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/compiling/compiling_for_linuxbsd.rst b/contributing/development/compiling/compiling_for_linuxbsd.rst index 5689ad9dbe0..e7633dad8b4 100644 --- a/contributing/development/compiling/compiling_for_linuxbsd.rst +++ b/contributing/development/compiling/compiling_for_linuxbsd.rst @@ -436,7 +436,7 @@ listed in the :ref:`doc_compiling_for_linuxbsd_oneliners`: +------------------+-----------------------------------------------------------------------------------------------------------+ | **Fedora** | :: | | | | -| | sudo dnf install embree-devel enet-devel glslang-devel graphite2-devel harfbuzz-devel libicu-devel \ | +| | sudo dnf install embree3-devel enet-devel glslang-devel graphite2-devel harfbuzz-devel libicu-devel \ | | | libsquish-devel libtheora-devel libvorbis-devel libwebp-devel libzstd-devel mbedtls-devel \ | | | miniupnpc-devel | +------------------+-----------------------------------------------------------------------------------------------------------+ From 9c2a7bafd0e9cc4bd1595bb56c1d0a46001eade3 Mon Sep 17 00:00:00 2001 From: Pav Soor <1pssoor@gmail.com> Date: Wed, 24 May 2023 20:25:06 +0100 Subject: [PATCH 27/76] Update instancing.rst Changed typo of tabel.tscn to label.tscn --- getting_started/step_by_step/instancing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/step_by_step/instancing.rst b/getting_started/step_by_step/instancing.rst index b4497fff3c2..8fd4d6900ec 100644 --- a/getting_started/step_by_step/instancing.rst +++ b/getting_started/step_by_step/instancing.rst @@ -11,7 +11,7 @@ into any number of scenes. This feature helps you break down and organize your game's different components. You can create as many scenes as you'd like and save them as files with the -``.tscn`` extension, which stands for "text scene". The ``tabel.tscn`` file from +``.tscn`` extension, which stands for "text scene". The ``label.tscn`` file from the previous lesson was an example. We call those files "Packed Scenes" as they pack information about your scene's content. From af34f53490064670628c9c0bbb3db7b5b8d20c55 Mon Sep 17 00:00:00 2001 From: Dipal Zambare Date: Thu, 25 May 2023 10:57:43 +0200 Subject: [PATCH 28/76] Remove outdated warning from Importing translations tutorial --- tutorials/assets_pipeline/importing_translations.rst | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tutorials/assets_pipeline/importing_translations.rst b/tutorials/assets_pipeline/importing_translations.rst index 5c01cc0909d..bd6e5a65390 100644 --- a/tutorials/assets_pipeline/importing_translations.rst +++ b/tutorials/assets_pipeline/importing_translations.rst @@ -44,15 +44,6 @@ editors can export to this format, so the only requirement is that the files have a special arrangement. The CSV files **must** be saved with UTF-8 encoding without a `byte order mark `__. -.. warning:: - - By default, Microsoft Excel will always save CSV files with ANSI encoding - rather than UTF-8. There is no built-in way to save as UTF-8, but there are - workarounds as described - `here `__. - - We recommend using `LibreOffice `__ or Google Sheets instead. - CSV files must be formatted as follows: +--------+----------+----------+----------+ From 06c6c3c18cf8e1899a321204ccbcfed441ad7414 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 26 May 2023 03:02:28 +0200 Subject: [PATCH 29/76] Update guidelines on headless exporting in Command line tutorial --- tutorials/editor/command_line_tutorial.rst | 27 ++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/tutorials/editor/command_line_tutorial.rst b/tutorials/editor/command_line_tutorial.rst index 6e9d9044f14..0f3fd7000f7 100644 --- a/tutorials/editor/command_line_tutorial.rst +++ b/tutorials/editor/command_line_tutorial.rst @@ -237,7 +237,9 @@ For example, the full command for exporting your game (as explained below) might :: - godot --path path_to_your_project --export-release my_export_preset_name game.exe + godot --headless --path path_to_your_project --export-release my_export_preset_name game.exe + +.. Creating a project ------------------ @@ -324,27 +326,34 @@ Exporting --------- Exporting the project from the command line is also supported. This is -especially useful for continuous integration setups. The version of Godot -that is headless (server build, no video) is ideal for this. +especially useful for continuous integration setups. + +.. note:: + + Using the ``--headless`` command line argument is **required** on platforms + that do not have GPU access (such as continuous integration). On platforms + with GPU access, ``--headless`` prevents a window from spawning while the + project is exporting. :: # `godot` must be a Godot editor binary, not an export template. # Also, export templates must be installed for the editor # (or a valid custom export template must be defined in the export preset). - godot --export-release "Linux/X11" /var/builds/project - godot --export-release Android /var/builds/project.apk + godot --headless --export-release "Linux/X11" /var/builds/project + godot --headless --export-release Android /var/builds/project.apk The preset name must match the name of an export preset defined in the project's ``export_presets.cfg`` file. If the preset name contains spaces or special characters (such as "Windows Desktop"), it must be surrounded with quotes. -To export a debug version of the game, use the ``--export-debug`` switch -instead of ``--export``. Their parameters and usage are the same. +To export a debug version of the game, use the ``--export-debug`` switch instead +of ``--export-release``. Their parameters and usage are the same. To export only a PCK file, use the ``--export-pack`` option followed by the -preset name and output path, with the file extension, instead of ``--export``. -The output path extension determines the package's format, either PCK or ZIP. +preset name and output path, with the file extension, instead of +``--export-release`` or ``--export-debug``. The output path extension determines +the package's format, either PCK or ZIP. .. warning:: From faeb8ebd960a2c15fac5ecf0ae88c8a9e2f73c22 Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Fri, 26 May 2023 11:00:24 +0200 Subject: [PATCH 30/76] Remove agent avoidance page Removes agent avoidance page. --- tutorials/navigation/index.rst | 1 - .../navigation_using_agent_avoidance.rst | 72 ------------------- .../navigation_using_navigationagents.rst | 4 +- .../navigation_using_navigationservers.rst | 1 - 4 files changed, 1 insertion(+), 77 deletions(-) delete mode 100644 tutorials/navigation/navigation_using_agent_avoidance.rst diff --git a/tutorials/navigation/index.rst b/tutorials/navigation/index.rst index 738e9e5c13f..68becd28477 100644 --- a/tutorials/navigation/index.rst +++ b/tutorials/navigation/index.rst @@ -17,7 +17,6 @@ Navigation navigation_using_navigationobstacles navigation_using_navigationlinks navigation_using_navigationlayers - navigation_using_agent_avoidance navigation_debug_tools navigation_connecting_navmesh navigation_different_actor_types diff --git a/tutorials/navigation/navigation_using_agent_avoidance.rst b/tutorials/navigation/navigation_using_agent_avoidance.rst deleted file mode 100644 index a574038beed..00000000000 --- a/tutorials/navigation/navigation_using_agent_avoidance.rst +++ /dev/null @@ -1,72 +0,0 @@ -.. _doc_navigation_using_agent_avoidance: - -Using Agent Avoidance -===================== - -This section is about how to use agent avoidance with the NavigationServer and -documents how agent avoidance is implemented in Godot. - -For avoidance with NavigationAgents see :ref:`doc_navigation_using_navigationagents`. - -Agent avoidance helps to prevent direct collision with other agents or moving obstacles -while the agents still follow their original velocity as best as possible. - -Avoidance in Godot is implemented with the help of the RVO library (Reciprocal Velocity Obstacle). -RVO places agents on a flat RVO map and gives each agent a ``radius`` and a ``position``. -Agents with overlapping radius compute a ``safe_velocity`` from their -current ``velocity``. The ``safe_velocity`` then needs to replace the original -submitted ``velocity`` to move the actor behind the agent with custom movement code. - -.. note:: - - RVO avoidance is not involved in regular pathfinding, it is a completely separate system. - If used inappropriately, the RVO avoidance can actively harm the perceived pathfinding quality. - -Creating Avoidance Agents with Scripts --------------------------------------- - -Agents and obstacles share the same NavigationServer API functions. - -Creating agents on the NavigationServer is only required for avoidance but not for normal pathfinding. -Pathfinding is map and region navmesh based while avoidance is purely map and agent based. - -.. tabs:: - .. code-tab:: gdscript GDScript - - extends Node3D - - var new_agent_rid: RID = NavigationServer3D.agent_create() - var default_3d_map_rid: RID = get_world_3d().get_navigation_map() - - NavigationServer3D.agent_set_map(new_agent_rid, default_3d_map_rid) - NavigationServer3D.agent_set_radius(new_agent_rid, 0.5) - NavigationServer3D.agent_set_position(new_agent_rid, global_transform.origin) - -To receive safe_velocity signals for avoidance for the agent a callback needs to be registered on the NavigationServer. - -.. tabs:: - .. code-tab:: gdscript GDScript - - extends Node3D - - var agent_rid: RID = NavigationServer3D.agent_create() - NavigationServer3D.agent_set_callback(agent_rid, self.on_safe_velocity_computed) - - func on_safe_velocity_computed(safe_velocity: Vector3): - # do your avoidance movement - -After the current and new calculated velocity needs to be passed to the NavigationServer each physics frame to trigger the safe_velocity callback when the avoidance processing is finished. - -.. tabs:: - .. code-tab:: gdscript GDScript - - func _physics_process(delta): - - NavigationServer3D.agent_set_velocity(current_velocity) - NavigationServer3D.agent_set_target_velocity(new_velocity) - -.. warning:: - - If _process() is used instead of _physics_process() at a higher framerate - than physics the agent velocity should not be updated more than ones each - physics frame e.g. by tracking the Engine.get_physics_frames(). diff --git a/tutorials/navigation/navigation_using_navigationagents.rst b/tutorials/navigation/navigation_using_navigationagents.rst index 7337adabf1b..eeceedb4d5d 100644 --- a/tutorials/navigation/navigation_using_navigationagents.rst +++ b/tutorials/navigation/navigation_using_navigationagents.rst @@ -89,9 +89,7 @@ There are some common user problems and important caveats to consider when writi NavigationAgent Avoidance ------------------------- -This section explains how to use the built-in avoidance specific -to NavigationAgent nodes. For general avoidance use and more technical details -on agent avoidance system see :ref:`doc_navigation_using_agent_avoidance`. +This section explains how to use the navigation avoidance specific to NavigationAgents. In order for NavigationAgents to use the avoidance feature the ``enable_avoidance`` property must be set to ``true``. diff --git a/tutorials/navigation/navigation_using_navigationservers.rst b/tutorials/navigation/navigation_using_navigationservers.rst index 6c22ad2547e..c63aa15f4e4 100644 --- a/tutorials/navigation/navigation_using_navigationservers.rst +++ b/tutorials/navigation/navigation_using_navigationservers.rst @@ -170,7 +170,6 @@ If RVO avoidance agents are registered for avoidance callbacks the NavigationSer their ``safe_velocity`` signals just before the PhysicsServer synchronization. To learn more about NavigationAgents see :ref:`doc_navigation_using_navigationagents`. -To learn more about RVO Avoidance see :ref:`doc_navigation_using_agent_avoidance`. The simplified order of execution for NavigationAgents that use avoidance: From 5de74ca72d2c704fbbd0c85af82a0aac83ca50e0 Mon Sep 17 00:00:00 2001 From: Godot Organization Date: Sat, 27 May 2023 03:19:07 +0000 Subject: [PATCH 31/76] classref: Sync with current master branch (2210111) --- classes/class_basis.rst | 78 +++--- classes/class_control.rst | 4 +- classes/class_font.rst | 14 + classes/class_gdextension.rst | 24 +- classes/class_gltfdocumentextension.rst | 78 ++++-- classes/class_gltfstate.rst | 8 +- classes/class_gltftexture.rst | 8 +- classes/class_multiplayersynchronizer.rst | 37 ++- classes/class_node3d.rst | 154 +++++------ classes/class_object.rst | 2 +- classes/class_optionbutton.rst | 2 + classes/class_pathfollow2d.rst | 19 -- classes/class_pathfollow3d.rst | 53 ++-- classes/class_polygon2d.rst | 2 +- classes/class_popupmenu.rst | 2 + classes/class_projectsettings.rst | 16 +- ...ss_rdpipelinecolorblendstateattachment.rst | 4 +- classes/class_richtextlabel.rst | 256 +++++++++--------- classes/class_scenemultiplayer.rst | 38 +++ classes/class_scenereplicationconfig.rst | 30 ++ classes/class_textserver.rst | 14 + classes/class_textserverextension.rst | 16 ++ classes/class_transform3d.rst | 58 ++-- classes/class_treeitem.rst | 2 + classes/class_tween.rst | 8 + classes/class_vector3.rst | 50 +++- classes/class_window.rst | 14 + 27 files changed, 629 insertions(+), 362 deletions(-) diff --git a/classes/class_basis.rst b/classes/class_basis.rst index b244793e00d..4ffed86dec2 100644 --- a/classes/class_basis.rst +++ b/classes/class_basis.rst @@ -88,43 +88,43 @@ Methods .. table:: :widths: auto - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`determinant` **(** **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`from_euler` **(** :ref:`Vector3` euler, :ref:`int` order=2 **)** |static| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`from_scale` **(** :ref:`Vector3` scale **)** |static| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`get_euler` **(** :ref:`int` order=2 **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Quaternion` | :ref:`get_rotation_quaternion` **(** **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`get_scale` **(** **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`inverse` **(** **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_equal_approx` **(** :ref:`Basis` b **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_finite` **(** **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`looking_at` **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** |static| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`orthonormalized` **(** **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`rotated` **(** :ref:`Vector3` axis, :ref:`float` angle **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`scaled` **(** :ref:`Vector3` scale **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`slerp` **(** :ref:`Basis` to, :ref:`float` weight **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`tdotx` **(** :ref:`Vector3` with **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`tdoty` **(** :ref:`Vector3` with **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`tdotz` **(** :ref:`Vector3` with **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Basis` | :ref:`transposed` **(** **)** |const| | - +-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`determinant` **(** **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`from_euler` **(** :ref:`Vector3` euler, :ref:`int` order=2 **)** |static| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`from_scale` **(** :ref:`Vector3` scale **)** |static| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`get_euler` **(** :ref:`int` order=2 **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Quaternion` | :ref:`get_rotation_quaternion` **(** **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`get_scale` **(** **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`inverse` **(** **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_equal_approx` **(** :ref:`Basis` b **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_finite` **(** **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`looking_at` **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** |static| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`orthonormalized` **(** **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`rotated` **(** :ref:`Vector3` axis, :ref:`float` angle **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`scaled` **(** :ref:`Vector3` scale **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`slerp` **(** :ref:`Basis` to, :ref:`float` weight **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`tdotx` **(** :ref:`Vector3` with **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`tdoty` **(** :ref:`Vector3` with **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`tdotz` **(** :ref:`Vector3` with **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Basis` | :ref:`transposed` **(** **)** |const| | + +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -416,12 +416,14 @@ Returns ``true`` if this basis is finite, by calling :ref:`@GlobalScope.is_finit .. rst-class:: classref-method -:ref:`Basis` **looking_at** **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** |static| +:ref:`Basis` **looking_at** **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** |static| Creates a Basis with a rotation such that the forward axis (-Z) points towards the ``target`` position. The up axis (+Y) points as close to the ``up`` vector as possible while staying perpendicular to the forward axis. The resulting Basis is orthonormalized. The ``target`` and ``up`` vectors cannot be zero, and cannot be parallel to each other. +If ``use_model_front`` is ``true``, the +Z axis (asset front) is treated as forward (implies +X is left) and points toward the ``target`` position. By default, the -Z axis (camera forward) is treated as forward (implies +X is right). + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_control.rst b/classes/class_control.rst index ba2c6cdb567..c5d563fd2ba 100644 --- a/classes/class_control.rst +++ b/classes/class_control.rst @@ -155,7 +155,7 @@ Methods +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`_drop_data` **(** :ref:`Vector2` at_position, :ref:`Variant` data **)** |virtual| | +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Variant` | :ref:`_get_drag_data` **(** :ref:`Vector2` at_position **)** |virtual| |const| | + | :ref:`Variant` | :ref:`_get_drag_data` **(** :ref:`Vector2` at_position **)** |virtual| | +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2` | :ref:`_get_minimum_size` **(** **)** |virtual| |const| | +----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -1948,7 +1948,7 @@ Godot calls this method to pass you the ``data`` from a control's :ref:`_get_dra .. rst-class:: classref-method -:ref:`Variant` **_get_drag_data** **(** :ref:`Vector2` at_position **)** |virtual| |const| +:ref:`Variant` **_get_drag_data** **(** :ref:`Vector2` at_position **)** |virtual| Godot calls this method to get data that can be dragged and dropped onto controls that expect drop data. Returns ``null`` if there is no data to drag. Controls that want to receive drop data should implement :ref:`_can_drop_data` and :ref:`_drop_data`. ``at_position`` is local to this control. Drag may be forced with :ref:`force_drag`. diff --git a/classes/class_font.rst b/classes/class_font.rst index e97079ea096..d53cd4edc8f 100644 --- a/classes/class_font.rst +++ b/classes/class_font.rst @@ -72,6 +72,8 @@ Methods +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Dictionary` | :ref:`get_opentype_features` **(** **)** |const| | +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_ot_name_strings` **(** **)** |const| | + +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`RID[]` | :ref:`get_rids` **(** **)** |const| | +---------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_spacing` **(** :ref:`SpacingType` spacing **)** |const| | @@ -370,6 +372,18 @@ Returns a set of OpenType feature tags. More info: `OpenType feature tags ` **get_ot_name_strings** **(** **)** |const| + +Returns :ref:`Dictionary` with OpenType font name strings (localized font names, version, description, license information, sample text, etc.). + +.. rst-class:: classref-item-separator + +---- + .. _class_Font_method_get_rids: .. rst-class:: classref-method diff --git a/classes/class_gdextension.rst b/classes/class_gdextension.rst index 0a1647d161c..2a5c8ba20fe 100644 --- a/classes/class_gdextension.rst +++ b/classes/class_gdextension.rst @@ -24,17 +24,17 @@ Methods .. table:: :widths: auto - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`close_library` **(** **)** | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`InitializationLevel` | :ref:`get_minimum_library_initialization_level` **(** **)** |const| | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`initialize_library` **(** :ref:`InitializationLevel` level **)** | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_library_open` **(** **)** |const| | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`open_library` **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface **)** | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`close_library` **(** **)** | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`InitializationLevel` | :ref:`get_minimum_library_initialization_level` **(** **)** |const| | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`initialize_library` **(** :ref:`InitializationLevel` level **)** | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_library_open` **(** **)** |const| | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`open_library` **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface=false **)** | + +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -152,7 +152,7 @@ void **initialize_library** **(** :ref:`InitializationLevel` **open_library** **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface **)** +:ref:`Error` **open_library** **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface=false **)** .. container:: contribute diff --git a/classes/class_gltfdocumentextension.rst b/classes/class_gltfdocumentextension.rst index 98ea59caec2..d5d8b87fdbb 100644 --- a/classes/class_gltfdocumentextension.rst +++ b/classes/class_gltfdocumentextension.rst @@ -35,29 +35,33 @@ Methods .. table:: :widths: auto - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_convert_scene_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Node` scene_node **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_export_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Dictionary` json, :ref:`Node` node **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_export_post` **(** :ref:`GLTFState` state **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_export_preflight` **(** :ref:`GLTFState` state, :ref:`Node` root **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Node3D` | :ref:`_generate_scene_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Node` scene_parent **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedStringArray` | :ref:`_get_supported_extensions` **(** **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_import_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Dictionary` json, :ref:`Node` node **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_import_post` **(** :ref:`GLTFState` state, :ref:`Node` root **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_import_post_parse` **(** :ref:`GLTFState` state **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_import_preflight` **(** :ref:`GLTFState` state, :ref:`PackedStringArray` extensions **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`_parse_node_extensions` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Dictionary` extensions **)** |virtual| | - +---------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_convert_scene_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Node` scene_node **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_export_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Dictionary` json, :ref:`Node` node **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_export_post` **(** :ref:`GLTFState` state **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_export_preflight` **(** :ref:`GLTFState` state, :ref:`Node` root **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Node3D` | :ref:`_generate_scene_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Node` scene_parent **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedStringArray` | :ref:`_get_supported_extensions` **(** **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_import_node` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Dictionary` json, :ref:`Node` node **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_import_post` **(** :ref:`GLTFState` state, :ref:`Node` root **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_import_post_parse` **(** :ref:`GLTFState` state **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_import_preflight` **(** :ref:`GLTFState` state, :ref:`PackedStringArray` extensions **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_parse_image_data` **(** :ref:`GLTFState` state, :ref:`PackedByteArray` image_data, :ref:`String` mime_type, :ref:`Image` ret_image **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_parse_node_extensions` **(** :ref:`GLTFState` state, :ref:`GLTFNode` gltf_node, :ref:`Dictionary` extensions **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`_parse_texture_json` **(** :ref:`GLTFState` state, :ref:`Dictionary` texture_json, :ref:`GLTFTexture` ret_gltf_texture **)** |virtual| | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -208,6 +212,20 @@ The return value is used to determine if this **GLTFDocumentExtension** instance ---- +.. _class_GLTFDocumentExtension_method__parse_image_data: + +.. rst-class:: classref-method + +:ref:`Error` **_parse_image_data** **(** :ref:`GLTFState` state, :ref:`PackedByteArray` image_data, :ref:`String` mime_type, :ref:`Image` ret_image **)** |virtual| + +Part of the import process. This method is run after :ref:`_parse_node_extensions` and before :ref:`_parse_texture_json`. + +Runs when parsing image data from a GLTF file. The data could be sourced from a separate file, a URI, or a buffer, and then is passed as a byte array. + +.. rst-class:: classref-item-separator + +---- + .. _class_GLTFDocumentExtension_method__parse_node_extensions: .. rst-class:: classref-method @@ -218,6 +236,20 @@ Part of the import process. This method is run after :ref:`_get_supported_extens Runs when parsing the node extensions of a GLTFNode. This method can be used to process the extension JSON data into a format that can be used by :ref:`_generate_scene_node`. The return value should be a member of the :ref:`Error` enum. +.. rst-class:: classref-item-separator + +---- + +.. _class_GLTFDocumentExtension_method__parse_texture_json: + +.. rst-class:: classref-method + +:ref:`Error` **_parse_texture_json** **(** :ref:`GLTFState` state, :ref:`Dictionary` texture_json, :ref:`GLTFTexture` ret_gltf_texture **)** |virtual| + +Part of the import process. This method is run after :ref:`_parse_image_data` and before :ref:`_generate_scene_node`. + +Runs when parsing the texture JSON from the GLTF textures array. This can be used to set the source image index to use as the texture. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/classes/class_gltfstate.rst b/classes/class_gltfstate.rst index a47f9d000c6..42f885fb904 100644 --- a/classes/class_gltfstate.rst +++ b/classes/class_gltfstate.rst @@ -502,9 +502,7 @@ Returns an array of all :ref:`GLTFCamera`\ s in the GLTF file. :ref:`Texture2D[]` **get_images** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Gets the images of the GLTF file as an array of :ref:`Texture2D`\ s. These are the images that the :ref:`GLTFTexture.src_image` index refers to. .. rst-class:: classref-item-separator @@ -732,9 +730,7 @@ void **set_handle_binary_image** **(** :ref:`int` method **)** void **set_images** **(** :ref:`Texture2D[]` images **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets the images in the state stored as an array of :ref:`Texture2D`\ s. This can be used during export. These are the images that the :ref:`GLTFTexture.src_image` index refers to. .. rst-class:: classref-item-separator diff --git a/classes/class_gltftexture.rst b/classes/class_gltftexture.rst index 934b0361456..87821a8d0b8 100644 --- a/classes/class_gltftexture.rst +++ b/classes/class_gltftexture.rst @@ -27,7 +27,7 @@ Properties +-----------------------+--------------------------------------------------------+--------+ | :ref:`int` | :ref:`sampler` | ``-1`` | +-----------------------+--------------------------------------------------------+--------+ - | :ref:`int` | :ref:`src_image` | ``0`` | + | :ref:`int` | :ref:`src_image` | ``-1`` | +-----------------------+--------------------------------------------------------+--------+ .. rst-class:: classref-section-separator @@ -60,16 +60,14 @@ ID of the texture sampler to use when sampling the image. If -1, then the defaul .. rst-class:: classref-property -:ref:`int` **src_image** = ``0`` +:ref:`int` **src_image** = ``-1`` .. rst-class:: classref-property-setget - void **set_src_image** **(** :ref:`int` value **)** - :ref:`int` **get_src_image** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +The index of the image associated with this texture, see :ref:`GLTFState.get_images`. If -1, then this texture does not have an image assigned. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_multiplayersynchronizer.rst b/classes/class_multiplayersynchronizer.rst index b9f4459743a..ae4a703bfd0 100644 --- a/classes/class_multiplayersynchronizer.rst +++ b/classes/class_multiplayersynchronizer.rst @@ -27,6 +27,8 @@ Visibility can be handled directly with :ref:`set_visibility_for` to notify synchronization start passing the :ref:`Node` at :ref:`root_path` as the ``object`` and itself as the ``configuration``, and uses :ref:`MultiplayerAPI.object_configuration_remove` to notify synchronization end in a similar way. +\ **Note:** Synchronization is not supported for :ref:`Object` type properties, like :ref:`Resource`. Properties that are unique to each peer, like the instance IDs of :ref:`Object`\ s (see :ref:`Object.get_instance_id`) or :ref:`RID`\ s, will also not work in synchronization. + .. rst-class:: classref-reftable-group Properties @@ -35,6 +37,8 @@ Properties .. table:: :widths: auto + +--------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+--------------------+ + | :ref:`float` | :ref:`delta_interval` | ``0.0`` | +--------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+--------------------+ | :ref:`bool` | :ref:`public_visibility` | ``true`` | +--------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+--------------------+ @@ -76,13 +80,25 @@ Methods Signals ------- +.. _class_MultiplayerSynchronizer_signal_delta_synchronized: + +.. rst-class:: classref-signal + +**delta_synchronized** **(** **)** + +Emitted when a new delta synchronization state is received by this synchronizer after the properties have been updated. + +.. rst-class:: classref-item-separator + +---- + .. _class_MultiplayerSynchronizer_signal_synchronized: .. rst-class:: classref-signal **synchronized** **(** **)** -Emitted when a new synchronization state is received by this synchronizer after the variables have been updated. +Emitted when a new synchronization state is received by this synchronizer after the properties have been updated. .. rst-class:: classref-item-separator @@ -144,6 +160,23 @@ Visibility filters are not updated automatically, and must be updated manually b Property Descriptions --------------------- +.. _class_MultiplayerSynchronizer_property_delta_interval: + +.. rst-class:: classref-property + +:ref:`float` **delta_interval** = ``0.0`` + +.. rst-class:: classref-property-setget + +- void **set_delta_interval** **(** :ref:`float` value **)** +- :ref:`float` **get_delta_interval** **(** **)** + +Time interval between delta synchronizations. When set to ``0.0`` (the default), delta synchronizations happen every network process frame. + +.. rst-class:: classref-item-separator + +---- + .. _class_MultiplayerSynchronizer_property_public_visibility: .. rst-class:: classref-property @@ -189,7 +222,7 @@ Resource containing which properties to synchronize. - void **set_replication_interval** **(** :ref:`float` value **)** - :ref:`float` **get_replication_interval** **(** **)** -Time interval between synchronizes. When set to ``0.0`` (the default), synchronizes happen every network process frame. +Time interval between synchronizations. When set to ``0.0`` (the default), synchronizations happen every network process frame. .. rst-class:: classref-item-separator diff --git a/classes/class_node3d.rst b/classes/class_node3d.rst index 7508bd0cf6e..ead2f73dddc 100644 --- a/classes/class_node3d.rst +++ b/classes/class_node3d.rst @@ -88,79 +88,79 @@ Methods .. table:: :widths: auto - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_gizmo` **(** :ref:`Node3DGizmo` gizmo **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear_gizmos` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear_subgizmo_selection` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`force_update_transform` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Node3DGizmo[]` | :ref:`get_gizmos` **(** **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Node3D` | :ref:`get_parent_node_3d` **(** **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`World3D` | :ref:`get_world_3d` **(** **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`global_rotate` **(** :ref:`Vector3` axis, :ref:`float` angle **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`global_scale` **(** :ref:`Vector3` scale **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`global_translate` **(** :ref:`Vector3` offset **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`hide` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_local_transform_notification_enabled` **(** **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_scale_disabled` **(** **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_transform_notification_enabled` **(** **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_visible_in_tree` **(** **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`look_at` **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`look_at_from_position` **(** :ref:`Vector3` position, :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`orthonormalize` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`rotate` **(** :ref:`Vector3` axis, :ref:`float` angle **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`rotate_object_local` **(** :ref:`Vector3` axis, :ref:`float` angle **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`rotate_x` **(** :ref:`float` angle **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`rotate_y` **(** :ref:`float` angle **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`rotate_z` **(** :ref:`float` angle **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scale_object_local` **(** :ref:`Vector3` scale **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_disable_scale` **(** :ref:`bool` disable **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_identity` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_ignore_transform_notification` **(** :ref:`bool` enabled **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_notify_local_transform` **(** :ref:`bool` enable **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_notify_transform` **(** :ref:`bool` enable **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_subgizmo_selection` **(** :ref:`Node3DGizmo` gizmo, :ref:`int` id, :ref:`Transform3D` transform **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`show` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`to_global` **(** :ref:`Vector3` local_point **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`to_local` **(** :ref:`Vector3` global_point **)** |const| | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`translate` **(** :ref:`Vector3` offset **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`translate_object_local` **(** :ref:`Vector3` offset **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`update_gizmos` **(** **)** | - +-----------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_gizmo` **(** :ref:`Node3DGizmo` gizmo **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear_gizmos` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear_subgizmo_selection` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`force_update_transform` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Node3DGizmo[]` | :ref:`get_gizmos` **(** **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Node3D` | :ref:`get_parent_node_3d` **(** **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`World3D` | :ref:`get_world_3d` **(** **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`global_rotate` **(** :ref:`Vector3` axis, :ref:`float` angle **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`global_scale` **(** :ref:`Vector3` scale **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`global_translate` **(** :ref:`Vector3` offset **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`hide` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_local_transform_notification_enabled` **(** **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_scale_disabled` **(** **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_transform_notification_enabled` **(** **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_visible_in_tree` **(** **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`look_at` **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`look_at_from_position` **(** :ref:`Vector3` position, :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`orthonormalize` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`rotate` **(** :ref:`Vector3` axis, :ref:`float` angle **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`rotate_object_local` **(** :ref:`Vector3` axis, :ref:`float` angle **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`rotate_x` **(** :ref:`float` angle **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`rotate_y` **(** :ref:`float` angle **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`rotate_z` **(** :ref:`float` angle **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scale_object_local` **(** :ref:`Vector3` scale **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_disable_scale` **(** :ref:`bool` disable **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_identity` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_ignore_transform_notification` **(** :ref:`bool` enabled **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_notify_local_transform` **(** :ref:`bool` enable **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_notify_transform` **(** :ref:`bool` enable **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_subgizmo_selection` **(** :ref:`Node3DGizmo` gizmo, :ref:`int` id, :ref:`Transform3D` transform **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`show` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`to_global` **(** :ref:`Vector3` local_point **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`to_local` **(** :ref:`Vector3` global_point **)** |const| | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`translate` **(** :ref:`Vector3` offset **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`translate_object_local` **(** :ref:`Vector3` offset **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`update_gizmos` **(** **)** | + +-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -751,9 +751,9 @@ Returns ``true`` if the node is present in the :ref:`SceneTree` .. rst-class:: classref-method -void **look_at** **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** +void **look_at** **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** -Rotates the node so that the local forward axis (-Z) points toward the ``target`` position. +Rotates the node so that the local forward axis (-Z, :ref:`Vector3.FORWARD`) points toward the ``target`` position. The local up axis (+Y) points as close to the ``up`` vector as possible while staying perpendicular to the local forward axis. The resulting transform is orthogonal, and the scale is preserved. Non-uniform scaling may not work correctly. @@ -761,6 +761,8 @@ The ``target`` position cannot be the same as the node's position, the ``up`` ve Operations take place in global space, which means that the node must be in the scene tree. +If ``use_model_front`` is ``true``, the +Z axis (asset front) is treated as forward (implies +X is left) and points toward the ``target`` position. By default, the -Z axis (camera forward) is treated as forward (implies +X is right). + .. rst-class:: classref-item-separator ---- @@ -769,7 +771,7 @@ Operations take place in global space, which means that the node must be in the .. rst-class:: classref-method -void **look_at_from_position** **(** :ref:`Vector3` position, :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** +void **look_at_from_position** **(** :ref:`Vector3` position, :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** Moves the node to the specified ``position``, and then rotates the node to point toward the ``target`` as per :ref:`look_at`. Operations take place in global space. diff --git a/classes/class_object.rst b/classes/class_object.rst index 197aa7cebdc..af9abbf4e82 100644 --- a/classes/class_object.rst +++ b/classes/class_object.rst @@ -474,7 +474,7 @@ Called when the object receives a notification, which can be identified in ``wha .. code-tab:: csharp - public override void _Notification(long what) + public override void _Notification(int what) { if (what == NotificationPredelete) { diff --git a/classes/class_optionbutton.rst b/classes/class_optionbutton.rst index d2c5516ccfc..ee64e5cfa20 100644 --- a/classes/class_optionbutton.rst +++ b/classes/class_optionbutton.rst @@ -25,6 +25,8 @@ See also :ref:`BaseButton` which contains common properties an \ **Note:** Properties :ref:`Button.text` and :ref:`Button.icon` are automatically set based on the selected item. They shouldn't be changed manually. +\ **Note:** The ID values used for items are limited to 32 bits, not full 64 bits of :ref:`int`. This has a range of ``-2^32`` to ``2^32 - 1``, i.e. ``-2147483648`` to ``2147483647``. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_pathfollow2d.rst b/classes/class_pathfollow2d.rst index e03a035fbbc..33bb434bb6c 100644 --- a/classes/class_pathfollow2d.rst +++ b/classes/class_pathfollow2d.rst @@ -36,8 +36,6 @@ Properties +---------------------------+-------------------------------------------------------------------+----------+ | :ref:`float` | :ref:`h_offset` | ``0.0`` | +---------------------------+-------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`lookahead` | ``4.0`` | - +---------------------------+-------------------------------------------------------------------+----------+ | :ref:`bool` | :ref:`loop` | ``true`` | +---------------------------+-------------------------------------------------------------------+----------+ | :ref:`float` | :ref:`progress` | ``0.0`` | @@ -96,23 +94,6 @@ The node's offset along the curve. ---- -.. _class_PathFollow2D_property_lookahead: - -.. rst-class:: classref-property - -:ref:`float` **lookahead** = ``4.0`` - -.. rst-class:: classref-property-setget - -- void **set_lookahead** **(** :ref:`float` value **)** -- :ref:`float` **get_lookahead** **(** **)** - -How far to look ahead of the curve to calculate the tangent if the node is rotating. E.g. shorter lookaheads will lead to faster rotations. - -.. rst-class:: classref-item-separator - ----- - .. _class_PathFollow2D_property_loop: .. rst-class:: classref-property diff --git a/classes/class_pathfollow3d.rst b/classes/class_pathfollow3d.rst index fab23919aa8..02375ea90a1 100644 --- a/classes/class_pathfollow3d.rst +++ b/classes/class_pathfollow3d.rst @@ -31,23 +31,25 @@ Properties .. table:: :widths: auto - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`bool` | :ref:`cubic_interp` | ``true`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`h_offset` | ``0.0`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`bool` | :ref:`loop` | ``true`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`progress` | ``0.0`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`progress_ratio` | ``0.0`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`RotationMode` | :ref:`rotation_mode` | ``3`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`bool` | :ref:`tilt_enabled` | ``true`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ - | :ref:`float` | :ref:`v_offset` | ``0.0`` | - +-----------------------------------------------------+-------------------------------------------------------------------+----------+ + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`cubic_interp` | ``true`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`float` | :ref:`h_offset` | ``0.0`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`loop` | ``true`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`float` | :ref:`progress` | ``0.0`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`float` | :ref:`progress_ratio` | ``0.0`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`RotationMode` | :ref:`rotation_mode` | ``3`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`tilt_enabled` | ``true`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`bool` | :ref:`use_model_front` | ``false`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ + | :ref:`float` | :ref:`v_offset` | ``0.0`` | + +-----------------------------------------------------+---------------------------------------------------------------------+-----------+ .. rst-class:: classref-reftable-group @@ -248,6 +250,23 @@ If ``true``, the tilt property of :ref:`Curve3D` takes effect. ---- +.. _class_PathFollow3D_property_use_model_front: + +.. rst-class:: classref-property + +:ref:`bool` **use_model_front** = ``false`` + +.. rst-class:: classref-property-setget + +- void **set_use_model_front** **(** :ref:`bool` value **)** +- :ref:`bool` **is_using_model_front** **(** **)** + +If ``true``, the node moves on the travel path with orienting the +Z axis as forward. See also :ref:`Vector3.FORWARD` and :ref:`Vector3.MODEL_FRONT`. + +.. rst-class:: classref-item-separator + +---- + .. _class_PathFollow3D_property_v_offset: .. rst-class:: classref-property diff --git a/classes/class_polygon2d.rst b/classes/class_polygon2d.rst index 1a6ad715ff7..c125fa28cdb 100644 --- a/classes/class_polygon2d.rst +++ b/classes/class_polygon2d.rst @@ -438,7 +438,7 @@ Returns the path to the node associated with the specified bone. :ref:`PackedFloat32Array` **get_bone_weights** **(** :ref:`int` index **)** |const| -Returns the height values of the specified bone. +Returns the weight values of the specified bone. .. rst-class:: classref-item-separator diff --git a/classes/class_popupmenu.rst b/classes/class_popupmenu.rst index 02e973e5397..c6e0d44242a 100644 --- a/classes/class_popupmenu.rst +++ b/classes/class_popupmenu.rst @@ -29,6 +29,8 @@ All ``set_*`` methods allow negative item index, which makes the item accessed f \ **Incremental search:** Like :ref:`ItemList` and :ref:`Tree`, **PopupMenu** supports searching within the list while the control is focused. Press a key that matches the first letter of an item's name to select the first item starting with the given letter. After that point, there are two ways to perform incremental search: 1) Press the same key again before the timeout duration to select the next item starting with the same letter. 2) Press letter keys that match the rest of the word before the timeout duration to match to select the item in question directly. Both of these actions will be reset to the beginning of the list if the timeout duration has passed since the last keystroke was registered. You can adjust the timeout duration by changing :ref:`ProjectSettings.gui/timers/incremental_search_max_interval_msec`. +\ **Note:** The ID values used for items are limited to 32 bits, not full 64 bits of :ref:`int`. This has a range of ``-2^32`` to ``2^32 - 1``, i.e. ``-2147483648`` to ``2147483647``. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_projectsettings.rst b/classes/class_projectsettings.rst index e7caec8ea6a..da1edfb1c87 100644 --- a/classes/class_projectsettings.rst +++ b/classes/class_projectsettings.rst @@ -1533,6 +1533,8 @@ Methods +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`save_custom` **(** :ref:`String` file **)** | +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_as_basic` **(** :ref:`String` name, :ref:`bool` basic **)** | + +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_initial_value` **(** :ref:`String` name, :ref:`Variant` value **)** | +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_order` **(** :ref:`String` name, :ref:`int` position **)** | @@ -11079,13 +11081,25 @@ Saves the configuration to a custom file. The file extension must be ``.godot`` ---- +.. _class_ProjectSettings_method_set_as_basic: + +.. rst-class:: classref-method + +void **set_as_basic** **(** :ref:`String` name, :ref:`bool` basic **)** + +Defines if the specified setting is considered basic or advanced. Basic settings will always be shown in the project settings. Advanced settings will only be shown if the user enables the "Advanced Settings" option. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_method_set_initial_value: .. rst-class:: classref-method void **set_initial_value** **(** :ref:`String` name, :ref:`Variant` value **)** -Sets the specified property's initial value. This is the value the property reverts to. +Sets the specified setting's initial value. This is the value the setting reverts to. .. rst-class:: classref-item-separator diff --git a/classes/class_rdpipelinecolorblendstateattachment.rst b/classes/class_rdpipelinecolorblendstateattachment.rst index 21056eae219..d94b15983de 100644 --- a/classes/class_rdpipelinecolorblendstateattachment.rst +++ b/classes/class_rdpipelinecolorblendstateattachment.rst @@ -55,8 +55,8 @@ For reference, this is how common user-facing blend modes are implemented in God var attachment = RDPipelineColorBlendStateAttachment.new() attachment.enable_blend = true - attachment.alpha_blend_op = RenderingDevice.BLEND_OP_SUBTRACT - attachment.color_blend_op = RenderingDevice.BLEND_OP_SUBTRACT + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_REVERSE_SUBTRACT + attachment.color_blend_op = RenderingDevice.BLEND_OP_REVERSE_SUBTRACT attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA diff --git a/classes/class_richtextlabel.rst b/classes/class_richtextlabel.rst index 3f2deecbe40..52cf82de64f 100644 --- a/classes/class_richtextlabel.rst +++ b/classes/class_richtextlabel.rst @@ -106,133 +106,133 @@ Methods .. table:: :widths: auto - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_image` **(** :ref:`Texture2D` image, :ref:`int` width=0, :ref:`int` height=0, :ref:`Color` color=Color(1, 1, 1, 1), :ref:`InlineAlignment` inline_align=5, :ref:`Rect2` region=Rect2(0, 0, 0, 0) **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_text` **(** :ref:`String` text **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`append_text` **(** :ref:`String` bbcode **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`deselect` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_character_line` **(** :ref:`int` character **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_character_paragraph` **(** :ref:`int` character **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_content_height` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_content_width` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_line_count` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_line_offset` **(** :ref:`int` line **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PopupMenu` | :ref:`get_menu` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_paragraph_count` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_paragraph_offset` **(** :ref:`int` paragraph **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_parsed_text` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_selected_text` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_selection_from` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_selection_to` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_total_character_count` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`VScrollBar` | :ref:`get_v_scroll_bar` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_visible_line_count` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_visible_paragraph_count` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`install_effect` **(** :ref:`Variant` effect **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_menu_visible` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_ready` **(** **)** |const| | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`menu_option` **(** :ref:`int` option **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`newline` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`parse_bbcode` **(** :ref:`String` bbcode **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`parse_expressions_for_values` **(** :ref:`PackedStringArray` expressions **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`pop` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_bgcolor` **(** :ref:`Color` bgcolor **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_bold` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_bold_italics` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_cell` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_color` **(** :ref:`Color` color **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_customfx` **(** :ref:`RichTextEffect` effect, :ref:`Dictionary` env **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_dropcap` **(** :ref:`String` string, :ref:`Font` font, :ref:`int` size, :ref:`Rect2` dropcap_margins=Rect2(0, 0, 0, 0), :ref:`Color` color=Color(1, 1, 1, 1), :ref:`int` outline_size=0, :ref:`Color` outline_color=Color(0, 0, 0, 0) **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_fgcolor` **(** :ref:`Color` fgcolor **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_font` **(** :ref:`Font` font, :ref:`int` font_size **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_font_size` **(** :ref:`int` font_size **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_hint` **(** :ref:`String` description **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_indent` **(** :ref:`int` level **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_italics` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_list` **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize, :ref:`String` bullet="•" **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_meta` **(** :ref:`Variant` data **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_mono` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_normal` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_outline_color` **(** :ref:`Color` color **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_outline_size` **(** :ref:`int` outline_size **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_paragraph` **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0, :ref:`JustificationFlag` justification_flags=163 **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_strikethrough` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_table` **(** :ref:`int` columns, :ref:`InlineAlignment` inline_align=0, :ref:`int` align_to_row=-1 **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`push_underline` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`remove_paragraph` **(** :ref:`int` paragraph **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scroll_to_line` **(** :ref:`int` line **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scroll_to_paragraph` **(** :ref:`int` paragraph **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`scroll_to_selection` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`select_all` **(** **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_border_color` **(** :ref:`Color` color **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_padding` **(** :ref:`Rect2` padding **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_row_background_color` **(** :ref:`Color` odd_row_bg, :ref:`Color` even_row_bg **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_cell_size_override` **(** :ref:`Vector2` min_size, :ref:`Vector2` max_size **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_table_column_expand` **(** :ref:`int` column, :ref:`bool` expand, :ref:`int` ratio **)** | - +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_image` **(** :ref:`Texture2D` image, :ref:`int` width=0, :ref:`int` height=0, :ref:`Color` color=Color(1, 1, 1, 1), :ref:`InlineAlignment` inline_align=5, :ref:`Rect2` region=Rect2(0, 0, 0, 0) **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_text` **(** :ref:`String` text **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`append_text` **(** :ref:`String` bbcode **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`deselect` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_character_line` **(** :ref:`int` character **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_character_paragraph` **(** :ref:`int` character **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_content_height` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_content_width` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_line_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_line_offset` **(** :ref:`int` line **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PopupMenu` | :ref:`get_menu` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_paragraph_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_paragraph_offset` **(** :ref:`int` paragraph **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_parsed_text` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_selected_text` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_selection_from` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_selection_to` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_total_character_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`VScrollBar` | :ref:`get_v_scroll_bar` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_visible_line_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_visible_paragraph_count` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`install_effect` **(** :ref:`Variant` effect **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_menu_visible` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_ready` **(** **)** |const| | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`menu_option` **(** :ref:`int` option **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`newline` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`parse_bbcode` **(** :ref:`String` bbcode **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`parse_expressions_for_values` **(** :ref:`PackedStringArray` expressions **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`pop` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_bgcolor` **(** :ref:`Color` bgcolor **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_bold` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_bold_italics` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_cell` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_color` **(** :ref:`Color` color **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_customfx` **(** :ref:`RichTextEffect` effect, :ref:`Dictionary` env **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_dropcap` **(** :ref:`String` string, :ref:`Font` font, :ref:`int` size, :ref:`Rect2` dropcap_margins=Rect2(0, 0, 0, 0), :ref:`Color` color=Color(1, 1, 1, 1), :ref:`int` outline_size=0, :ref:`Color` outline_color=Color(0, 0, 0, 0) **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_fgcolor` **(** :ref:`Color` fgcolor **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_font` **(** :ref:`Font` font, :ref:`int` font_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_font_size` **(** :ref:`int` font_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_hint` **(** :ref:`String` description **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_indent` **(** :ref:`int` level **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_italics` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_list` **(** :ref:`int` level, :ref:`ListType` type, :ref:`bool` capitalize, :ref:`String` bullet="•" **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_meta` **(** :ref:`Variant` data **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_mono` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_normal` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_outline_color` **(** :ref:`Color` color **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_outline_size` **(** :ref:`int` outline_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_paragraph` **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0, :ref:`JustificationFlag` justification_flags=163, :ref:`PackedFloat32Array` tab_stops=PackedFloat32Array() **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_strikethrough` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_table` **(** :ref:`int` columns, :ref:`InlineAlignment` inline_align=0, :ref:`int` align_to_row=-1 **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`push_underline` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`remove_paragraph` **(** :ref:`int` paragraph **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scroll_to_line` **(** :ref:`int` line **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scroll_to_paragraph` **(** :ref:`int` paragraph **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`scroll_to_selection` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`select_all` **(** **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_border_color` **(** :ref:`Color` color **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_padding` **(** :ref:`Rect2` padding **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_row_background_color` **(** :ref:`Color` odd_row_bg, :ref:`Color` even_row_bg **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_cell_size_override` **(** :ref:`Vector2` min_size, :ref:`Vector2` max_size **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_table_column_expand` **(** :ref:`int` column, :ref:`bool` expand, :ref:`int` ratio **)** | + +-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -1516,7 +1516,7 @@ Adds a ``[outline_size]`` tag to the tag stack. Overrides default text outline s .. rst-class:: classref-method -void **push_paragraph** **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0, :ref:`JustificationFlag` justification_flags=163 **)** +void **push_paragraph** **(** :ref:`HorizontalAlignment` alignment, :ref:`TextDirection` base_direction=0, :ref:`String` language="", :ref:`StructuredTextParser` st_parser=0, :ref:`JustificationFlag` justification_flags=163, :ref:`PackedFloat32Array` tab_stops=PackedFloat32Array() **)** Adds a ``[p]`` tag to the tag stack. diff --git a/classes/class_scenemultiplayer.rst b/classes/class_scenemultiplayer.rst index aee346bb05a..3f20ed79059 100644 --- a/classes/class_scenemultiplayer.rst +++ b/classes/class_scenemultiplayer.rst @@ -44,6 +44,10 @@ Properties +---------------------------------+---------------------------------------------------------------------------------------+------------------+ | :ref:`float` | :ref:`auth_timeout` | ``3.0`` | +---------------------------------+---------------------------------------------------------------------------------------+------------------+ + | :ref:`int` | :ref:`max_delta_packet_size` | ``65535`` | + +---------------------------------+---------------------------------------------------------------------------------------+------------------+ + | :ref:`int` | :ref:`max_sync_packet_size` | ``1350`` | + +---------------------------------+---------------------------------------------------------------------------------------+------------------+ | :ref:`bool` | :ref:`refuse_new_connections` | ``false`` | +---------------------------------+---------------------------------------------------------------------------------------+------------------+ | :ref:`NodePath` | :ref:`root_path` | ``NodePath("")`` | @@ -176,6 +180,40 @@ If set to a value greater than ``0.0``, the maximum amount of time peers can sta ---- +.. _class_SceneMultiplayer_property_max_delta_packet_size: + +.. rst-class:: classref-property + +:ref:`int` **max_delta_packet_size** = ``65535`` + +.. rst-class:: classref-property-setget + +- void **set_max_delta_packet_size** **(** :ref:`int` value **)** +- :ref:`int` **get_max_delta_packet_size** **(** **)** + +Maximum size of each delta packet. Higher values increase the chance of receiving full updates in a single frame, but also the chance of causing networking congestion (higher latency, disconnections). See :ref:`MultiplayerSynchronizer`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_SceneMultiplayer_property_max_sync_packet_size: + +.. rst-class:: classref-property + +:ref:`int` **max_sync_packet_size** = ``1350`` + +.. rst-class:: classref-property-setget + +- void **set_max_sync_packet_size** **(** :ref:`int` value **)** +- :ref:`int` **get_max_sync_packet_size** **(** **)** + +Maximum size of each synchronization packet. Higher values increase the chance of receiving full updates in a single frame, but also the chance of packet loss. See :ref:`MultiplayerSynchronizer`. + +.. rst-class:: classref-item-separator + +---- + .. _class_SceneMultiplayer_property_refuse_new_connections: .. rst-class:: classref-property diff --git a/classes/class_scenereplicationconfig.rst b/classes/class_scenereplicationconfig.rst index 4b5e5219ffe..6e7013d7db1 100644 --- a/classes/class_scenereplicationconfig.rst +++ b/classes/class_scenereplicationconfig.rst @@ -35,10 +35,14 @@ Methods +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`property_get_sync` **(** :ref:`NodePath` path **)** | +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`property_get_watch` **(** :ref:`NodePath` path **)** | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`property_set_spawn` **(** :ref:`NodePath` path, :ref:`bool` enabled **)** | +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`property_set_sync` **(** :ref:`NodePath` path, :ref:`bool` enabled **)** | +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`property_set_watch` **(** :ref:`NodePath` path, :ref:`bool` enabled **)** | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`remove_property` **(** :ref:`NodePath` path **)** | +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -59,6 +63,8 @@ void **add_property** **(** :ref:`NodePath` path, :ref:`int`. + .. rst-class:: classref-item-separator ---- @@ -123,6 +129,18 @@ Returns whether the property identified by the given ``path`` is configured to b ---- +.. _class_SceneReplicationConfig_method_property_get_watch: + +.. rst-class:: classref-method + +:ref:`bool` **property_get_watch** **(** :ref:`NodePath` path **)** + +Returns whether the property identified by the given ``path`` is configured to be reliably synchronized when changes are detected on process. + +.. rst-class:: classref-item-separator + +---- + .. _class_SceneReplicationConfig_method_property_set_spawn: .. rst-class:: classref-method @@ -147,6 +165,18 @@ Sets whether the property identified by the given ``path`` is configured to be s ---- +.. _class_SceneReplicationConfig_method_property_set_watch: + +.. rst-class:: classref-method + +void **property_set_watch** **(** :ref:`NodePath` path, :ref:`bool` enabled **)** + +Sets whether the property identified by the given ``path`` is configured to be reliably synchronized when changes are detected on process. + +.. rst-class:: classref-item-separator + +---- + .. _class_SceneReplicationConfig_method_remove_property: .. rst-class:: classref-method diff --git a/classes/class_textserver.rst b/classes/class_textserver.rst index bf8a5bfc634..8329e941fd7 100644 --- a/classes/class_textserver.rst +++ b/classes/class_textserver.rst @@ -108,6 +108,8 @@ Methods +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Dictionary` | :ref:`font_get_opentype_feature_overrides` **(** :ref:`RID` font_rid **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`font_get_ot_name_strings` **(** :ref:`RID` font_rid **)** |const| | + +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`font_get_oversampling` **(** :ref:`RID` font_rid **)** |const| | +-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`font_get_scale` **(** :ref:`RID` font_rid, :ref:`int` size **)** |const| | @@ -1951,6 +1953,18 @@ Returns font OpenType feature set override. ---- +.. _class_TextServer_method_font_get_ot_name_strings: + +.. rst-class:: classref-method + +:ref:`Dictionary` **font_get_ot_name_strings** **(** :ref:`RID` font_rid **)** |const| + +Returns :ref:`Dictionary` with OpenType font name strings (localized font names, version, description, license information, sample text, etc.). + +.. rst-class:: classref-item-separator + +---- + .. _class_TextServer_method_font_get_oversampling: .. rst-class:: classref-method diff --git a/classes/class_textserverextension.rst b/classes/class_textserverextension.rst index 6db7070b4b0..88c2b8c4dcd 100644 --- a/classes/class_textserverextension.rst +++ b/classes/class_textserverextension.rst @@ -110,6 +110,8 @@ Methods +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Dictionary` | :ref:`_font_get_opentype_feature_overrides` **(** :ref:`RID` font_rid **)** |virtual| |const| | +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`_font_get_ot_name_strings` **(** :ref:`RID` font_rid **)** |virtual| |const| | + +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_font_get_oversampling` **(** :ref:`RID` font_rid **)** |virtual| |const| | +-----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`float` | :ref:`_font_get_scale` **(** :ref:`RID` font_rid, :ref:`int` size **)** |virtual| |const| | @@ -978,6 +980,20 @@ void **_font_draw_glyph_outline** **(** :ref:`RID` font_rid, :ref:`RI ---- +.. _class_TextServerExtension_method__font_get_ot_name_strings: + +.. rst-class:: classref-method + +:ref:`Dictionary` **_font_get_ot_name_strings** **(** :ref:`RID` font_rid **)** |virtual| |const| + +.. container:: contribute + + There is currently no description for this method. Please help us by :ref:`contributing one `! + +.. rst-class:: classref-item-separator + +---- + .. _class_TextServerExtension_method__font_get_oversampling: .. rst-class:: classref-method diff --git a/classes/class_transform3d.rst b/classes/class_transform3d.rst index b4087924258..2965cc7b00b 100644 --- a/classes/class_transform3d.rst +++ b/classes/class_transform3d.rst @@ -80,33 +80,33 @@ Methods .. table:: :widths: auto - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`affine_inverse` **(** **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`interpolate_with` **(** :ref:`Transform3D` xform, :ref:`float` weight **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`inverse` **(** **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_equal_approx` **(** :ref:`Transform3D` xform **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_finite` **(** **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`looking_at` **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`orthonormalized` **(** **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`rotated` **(** :ref:`Vector3` axis, :ref:`float` angle **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`rotated_local` **(** :ref:`Vector3` axis, :ref:`float` angle **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`scaled` **(** :ref:`Vector3` scale **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`scaled_local` **(** :ref:`Vector3` scale **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`translated` **(** :ref:`Vector3` offset **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Transform3D` | :ref:`translated_local` **(** :ref:`Vector3` offset **)** |const| | - +---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`affine_inverse` **(** **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`interpolate_with` **(** :ref:`Transform3D` xform, :ref:`float` weight **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`inverse` **(** **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_equal_approx` **(** :ref:`Transform3D` xform **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_finite` **(** **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`looking_at` **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`orthonormalized` **(** **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`rotated` **(** :ref:`Vector3` axis, :ref:`float` angle **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`rotated_local` **(** :ref:`Vector3` axis, :ref:`float` angle **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`scaled` **(** :ref:`Vector3` scale **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`scaled_local` **(** :ref:`Vector3` scale **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`translated` **(** :ref:`Vector3` offset **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Transform3D` | :ref:`translated_local` **(** :ref:`Vector3` offset **)** |const| | + +---------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -336,12 +336,14 @@ Returns ``true`` if this transform is finite, by calling :ref:`@GlobalScope.is_f .. rst-class:: classref-method -:ref:`Transform3D` **looking_at** **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0) **)** |const| +:ref:`Transform3D` **looking_at** **(** :ref:`Vector3` target, :ref:`Vector3` up=Vector3(0, 1, 0), :ref:`bool` use_model_front=false **)** |const| Returns a copy of the transform rotated such that the forward axis (-Z) points towards the ``target`` position. The up axis (+Y) points as close to the ``up`` vector as possible while staying perpendicular to the forward axis. The resulting transform is orthonormalized. The existing rotation, scale, and skew information from the original transform is discarded. The ``target`` and ``up`` vectors cannot be zero, cannot be parallel to each other, and are defined in global/parent space. +If ``use_model_front`` is ``true``, the +Z axis (asset front) is treated as forward (implies +X is left) and points toward the ``target`` position. By default, the -Z axis (camera forward) is treated as forward (implies +X is right). + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_treeitem.rst b/classes/class_treeitem.rst index 3702f91b179..70ea745be9e 100644 --- a/classes/class_treeitem.rst +++ b/classes/class_treeitem.rst @@ -23,6 +23,8 @@ Control for a single item inside a :ref:`Tree`. May have child **Tre You can remove a **TreeItem** by using :ref:`Object.free`. +\ **Note:** The ID values used for buttons are limited to 32 bits, not full 64 bits of :ref:`int`. This has a range of ``-2^32`` to ``2^32 - 1``, i.e. ``-2147483648`` to ``2147483647``. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_tween.rst b/classes/class_tween.rst index 00129301fa3..716f1850715 100644 --- a/classes/class_tween.rst +++ b/classes/class_tween.rst @@ -407,6 +407,14 @@ The animation is interpolated by bouncing at the end. The animation is interpolated backing out at ends. +.. _class_Tween_constant_TRANS_SPRING: + +.. rst-class:: classref-enumeration-constant + +:ref:`TransitionType` **TRANS_SPRING** = ``11`` + +The animation is interpolated like a spring towards the end. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_vector3.rst b/classes/class_vector3.rst index 6ff2f4fbac1..2f46417f0e7 100644 --- a/classes/class_vector3.rst +++ b/classes/class_vector3.rst @@ -315,7 +315,7 @@ Down unit vector. **FORWARD** = ``Vector3(0, 0, -1)`` -Forward unit vector. Represents the local direction of forward, and the global direction of north. +Forward unit vector. Represents the local direction of forward, and the global direction of north. Keep in mind that the forward direction for lights, cameras, etc is different from 3D assets like characters, which face towards the camera by convention. Use :ref:`MODEL_FRONT` and similar constants when working in 3D asset space. .. _class_Vector3_constant_BACK: @@ -325,6 +325,54 @@ Forward unit vector. Represents the local direction of forward, and the global d Back unit vector. Represents the local direction of back, and the global direction of south. +.. _class_Vector3_constant_MODEL_LEFT: + +.. rst-class:: classref-constant + +**MODEL_LEFT** = ``Vector3(1, 0, 0)`` + +Unit vector pointing towards the left side of imported 3D assets. + +.. _class_Vector3_constant_MODEL_RIGHT: + +.. rst-class:: classref-constant + +**MODEL_RIGHT** = ``Vector3(-1, 0, 0)`` + +Unit vector pointing towards the right side of imported 3D assets. + +.. _class_Vector3_constant_MODEL_TOP: + +.. rst-class:: classref-constant + +**MODEL_TOP** = ``Vector3(0, 1, 0)`` + +Unit vector pointing towards the top side (up) of imported 3D assets. + +.. _class_Vector3_constant_MODEL_BOTTOM: + +.. rst-class:: classref-constant + +**MODEL_BOTTOM** = ``Vector3(0, -1, 0)`` + +Unit vector pointing towards the bottom side (down) of imported 3D assets. + +.. _class_Vector3_constant_MODEL_FRONT: + +.. rst-class:: classref-constant + +**MODEL_FRONT** = ``Vector3(0, 0, 1)`` + +Unit vector pointing towards the front side (facing forward) of imported 3D assets. + +.. _class_Vector3_constant_MODEL_REAR: + +.. rst-class:: classref-constant + +**MODEL_REAR** = ``Vector3(0, 0, -1)`` + +Unit vector pointing towards the rear side (back) of imported 3D assets. + .. rst-class:: classref-section-separator ---- diff --git a/classes/class_window.rst b/classes/class_window.rst index 1921ca44480..706a2e1c604 100644 --- a/classes/class_window.rst +++ b/classes/class_window.rst @@ -148,6 +148,8 @@ Methods +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`StyleBox` | :ref:`get_theme_stylebox` **(** :ref:`StringName` name, :ref:`StringName` theme_type="" **)** |const| | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_window_id` **(** **)** |const| | + +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`grab_focus` **(** **)** | +-----------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`has_focus` **(** **)** |const| | @@ -1681,6 +1683,18 @@ See :ref:`Control.get_theme_color` for det ---- +.. _class_Window_method_get_window_id: + +.. rst-class:: classref-method + +:ref:`int` **get_window_id** **(** **)** |const| + +Returns the ID of the window. + +.. rst-class:: classref-item-separator + +---- + .. _class_Window_method_grab_focus: .. rst-class:: classref-method From edb7d9e02ec15216cea250dda7dbcac055269777 Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Sat, 27 May 2023 12:40:26 +0200 Subject: [PATCH 32/76] Minor fixes to navigationagent doc Addes some minor fixes to navigationagent doc. --- .../navigation_using_navigationagents.rst | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tutorials/navigation/navigation_using_navigationagents.rst b/tutorials/navigation/navigation_using_navigationagents.rst index eeceedb4d5d..b14a288b81c 100644 --- a/tutorials/navigation/navigation_using_navigationagents.rst +++ b/tutorials/navigation/navigation_using_navigationagents.rst @@ -14,9 +14,8 @@ behalf of the parent actor node in a more convenient manner for beginners. New NavigationAgent nodes will automatically join the default navigation map on the World2D/World3D. -The functionality of NavigationsAgent nodes can be recreated with scripts and direct -calls to the NavigationServer API should the default NavigationsAgent -nodes not do what is required for a project and specific gameplay. +NavigationsAgent nodes are optional and not a hard requirement to use the navigation system. +Their entire functionality can be replaced with scripts and direct calls to the NavigationServer API. NavigationAgent Pathfinding --------------------------- @@ -48,19 +47,19 @@ towards this path position with your own movement code. The navigation system never moves the parent node of a NavigationAgent. The movement is entirely in the hands of users and their custom scripts. +NavigationAgents have their own internal logic to proceed with the current path and call for updates. + The ``get_next_path_position()`` function is responsible for updating many of the agent's internal states and properties. The function should be repeatedly called `once` every ``physics_process`` until ``is_navigation_finished()`` tells that the path is finished. The function should not be called after the target position or path end has been reached as it can make the agent jitter in place due to the repeated path updates. Always check very early in script with ``is_navigation_finished()`` if the path is already finished. -NavigationAgents have their own internal logic to proceed with the current path and call for updates. - The following properties influence the path following behavior. - The ``path_desired_distance`` defines the distance at which the agent advances its internal path index to the next path position. -- The ``target_desired_distance`` defines the dinstance at which the agent considers the target position to be reached and the path at its end. -- The ``path_max_distance`` defines when an agent requests a new path cause it was moved to far away from the current path point segment. +- The ``target_desired_distance`` defines the distance at which the agent considers the target position to be reached and the path at its end. +- The ``path_max_distance`` defines when an agent requests a new path cause it was moved too far away from the current path point segment. The important updates are all triggered with the ``get_next_path_position()`` function when called in ``_physics_process()``. @@ -130,7 +129,7 @@ NavigationObstacles can be used to add some environment constrains to the avoida .. note:: - Avoidance does not affect the pathfinding. It should be seen as an additional option for constantly moving objects that cannot be re(baked) to a navigation mesh efficiently in order to move around them. + Avoidance does not affect the pathfinding. It should be seen as an additional option for constantly moving objects that cannot be (re)baked to a navigation mesh efficiently in order to move around them. Using the NavigationAgent ``enable_avoidance`` property is the preferred option to toggle avoidance. The following code snippets can be used to From 15f32c54079c2697440717ca3b73e3b525fa773c Mon Sep 17 00:00:00 2001 From: Danil Alexeev Date: Sat, 27 May 2023 12:57:23 +0300 Subject: [PATCH 33/76] GDScript: Add mention that `@onready @export` doesn't work as expected --- .../scripting/gdscript/gdscript_basics.rst | 37 +++++++++++++++---- .../gdscript_documentation_comments.rst | 1 - 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/tutorials/scripting/gdscript/gdscript_basics.rst b/tutorials/scripting/gdscript/gdscript_basics.rst index 4c7c02c274b..35f80d046de 100644 --- a/tutorials/scripting/gdscript/gdscript_basics.rst +++ b/tutorials/scripting/gdscript/gdscript_basics.rst @@ -404,11 +404,11 @@ between parentheses and separated by commas. Both of these are the same:: - @onready - @export_node_path("TextEdit", "LineEdit") - var input_field + @annotation_a + @annotation_b + var variable - @onready @export_node_path("TextEdit", "LineEdit") var input_field + @annotation_a @annotation_b var variable .. _doc_gdscript_onready_annotation: @@ -435,6 +435,29 @@ can replace the above code with a single line:: @onready var my_label = get_node("MyLabel") +.. warning:: + + Applying ``@onready`` and any ``@export`` annotation to the same variable + doesn't work as you might expect. The ``@onready`` annotation will cause + the default value to be set after the ``@export`` takes effect and will + override it:: + + @export var a = "init_value_a" + @onready @export var b = "init_value_b" + + func _init(): + prints(a, b) # init_value_a + + func _notification(what): + if what == NOTIFICATION_SCENE_INSTANTIATED: + prints(a, b) # exported_value_a exported_value_b + + func _ready(): + prints(a, b) # exported_value_a init_value_b + + Therefore, the ``ONREADY_WITH_EXPORT`` warning is generated, which is treated + as an error by default. We do not recommend disabling or ignoring it. + Comments ~~~~~~~~ @@ -911,7 +934,7 @@ want to assign consecutive integers to some constant. :: enum {TILE_BRICK, TILE_FLOOR, TILE_SPIKE, TILE_TELEPORT} - + # Is the same as: const TILE_BRICK = 0 const TILE_FLOOR = 1 @@ -930,10 +953,10 @@ a dictionary can also be used with a named enum. :: enum State {STATE_IDLE, STATE_JUMP = 5, STATE_SHOOT} - + # Is the same as: const State = {STATE_IDLE = 0, STATE_JUMP = 5, STATE_SHOOT = 6} - + func _ready(): # Access values with Name.KEY, prints '5' print(State.STATE_JUMP) diff --git a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst index eeac476f00d..52290553169 100644 --- a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst +++ b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst @@ -106,7 +106,6 @@ Examples ## If the member has any annotation, the annotation should ## immediately precede it. - @export @onready var v3 := some_func() From 8078590ef8b744ba487b4b86b254a603d6ee4fba Mon Sep 17 00:00:00 2001 From: kkoang <1029339374@qq.com> Date: Sun, 28 May 2023 01:05:11 +0800 Subject: [PATCH 34/76] Update using_character_body_2d.rst --- tutorials/physics/using_character_body_2d.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/physics/using_character_body_2d.rst b/tutorials/physics/using_character_body_2d.rst index ef84a7cad38..f5978b00b60 100644 --- a/tutorials/physics/using_character_body_2d.rst +++ b/tutorials/physics/using_character_body_2d.rst @@ -223,7 +223,7 @@ Movement and walls If you've downloaded the sample project, this example is in "basic_movement.tscn". For this example, add a ``CharacterBody2D`` with two children: a ``Sprite2D`` and a -``CollisionShape2D``. Use the Godot "icon.png" as the Sprite2D's texture (drag it +``CollisionShape2D``. Use the Godot "icon.svg" as the Sprite2D's texture (drag it from the Filesystem dock to the *Texture* property of the ``Sprite2D``). In the ``CollisionShape2D``'s *Shape* property, select "New RectangleShape2D" and size the rectangle to fit over the sprite image. @@ -272,7 +272,7 @@ Attach a script to the CharacterBody2D and add the following code: Run this scene and you'll see that ``move_and_collide()`` works as expected, moving the body along the velocity vector. Now let's see what happens when you add some obstacles. Add a :ref:`StaticBody2D ` with a -rectangular collision shape. For visibility, you can use a sprite, a +rectangular collision shape. For visibility, you can use a Sprite2D, a Polygon2D, or turn on "Visible Collision Shapes" from the "Debug" menu. Run the scene again and try moving into the obstacle. You'll see that the ``CharacterBody2D`` @@ -436,7 +436,7 @@ And the code for the Bullet: The action happens in ``_physics_process()``. After using ``move_and_collide()``, if a collision occurs, a ``KinematicCollision2D`` object is returned (otherwise, the return -is ``Nil``). +is ``null``). If there is a returned collision, we use the ``normal`` of the collision to reflect the bullet's ``velocity`` with the ``Vector2.bounce()`` method. From a1a5660268fc2ad2203982bdf54dc2fbac7bb785 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sat, 27 May 2023 23:12:22 +0200 Subject: [PATCH 35/76] Add notes on color/depth buffer formats in Internal rendering architecture (#7410) --- .../core_and_modules/internal_rendering_architecture.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contributing/development/core_and_modules/internal_rendering_architecture.rst b/contributing/development/core_and_modules/internal_rendering_architecture.rst index 439492b9fac..dad9baa6ae2 100644 --- a/contributing/development/core_and_modules/internal_rendering_architecture.rst +++ b/contributing/development/core_and_modules/internal_rendering_architecture.rst @@ -368,6 +368,12 @@ this. in :abbr:`LDR (Low Dynamic Range)` sRGB-space while 3D rendering uses :abbr:`HDR (High Dynamic Range)` linear space. +The color format used for 2D rendering is RGB8 (RGBA8 if the **Transparent** +property on the Viewport is enabled). 3D rendering uses a 24-bit unsigned +normalized integer depth buffer, or 32-bit signed floating-point if a 24-bit +depth buffer is not supported by the hardware. 2D rendering does not use a depth +buffer. + 3D resolution scaling is performed differently depending on whether bilinear or FSR 1.0 scaling is used. When bilinear scaling is used, no special upscaling shader is run. Instead, the viewport's texture is stretched and displayed with a From 47bacc95fd0daf03f5a4fcb15a5cc0c01d9428dd Mon Sep 17 00:00:00 2001 From: br1trs <88297220+br1trs@users.noreply.github.com> Date: Sun, 28 May 2023 00:46:21 -0600 Subject: [PATCH 36/76] Added configuring ide for rider (#7420) Co-authored-by: Max Hilbrunner --- .gitignore | 3 + .../img/rider_attach_to_process.webp | Bin 0 -> 36510 bytes .../img/rider_configurations.webp | Bin 0 -> 3654 bytes .../img/rider_configurations_changed.webp | Bin 0 -> 21258 bytes .../img/rider_run_debug.webp | Bin 0 -> 866 bytes .../development/configuring_an_ide/index.rst | 1 + .../development/configuring_an_ide/rider.rst | 69 ++++++++++++++++++ 7 files changed, 73 insertions(+) create mode 100644 contributing/development/configuring_an_ide/img/rider_attach_to_process.webp create mode 100644 contributing/development/configuring_an_ide/img/rider_configurations.webp create mode 100644 contributing/development/configuring_an_ide/img/rider_configurations_changed.webp create mode 100644 contributing/development/configuring_an_ide/img/rider_run_debug.webp create mode 100644 contributing/development/configuring_an_ide/rider.rst diff --git a/.gitignore b/.gitignore index 94c3fee6bc2..b9e2fbe6c42 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,6 @@ tmp-unused-images-history # User created Python virtual environement as described in the docs godot-docs-venv/ + +# Jetbrains IDE files +/.idea/ diff --git a/contributing/development/configuring_an_ide/img/rider_attach_to_process.webp b/contributing/development/configuring_an_ide/img/rider_attach_to_process.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6b05f817be6eeb53aa51f840dd304a18dae3513 GIT binary patch literal 36510 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 YtLD^e(kA2s@6jGy?^=Y&irfGI00bu`+W-In literal 0 HcmV?d00001 diff --git a/contributing/development/configuring_an_ide/img/rider_configurations_changed.webp b/contributing/development/configuring_an_ide/img/rider_configurations_changed.webp new file mode 100644 index 0000000000000000000000000000000000000000..0436dafc7b2c469498368eaf229fbfb6ae025d15 GIT binary patch literal 21258 zcmZsBW0WP`wrtt9?W!)@wrzFUwr$(C(PbN5wr$(>`op>J-0@!i$}w{9wI(8F#8{b% z5~89&N&onGoAtnte9Q(UWWEa|!GjTY`Nz6Fn0u~wc&Oh?Z_(e8r?#ilUutF78+7vc%{k56 zFI|e?ai>P##oyoG$Gt62_^&;G?mnQt(Y_JS{m*`XMb2H%0DphC$Vv97eD{C*UTM8= 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 M00C@-)%x%N04&4k_y7O^ literal 0 HcmV?d00001 diff --git a/contributing/development/configuring_an_ide/img/rider_run_debug.webp b/contributing/development/configuring_an_ide/img/rider_run_debug.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6e87cea69105205d63d5092da66988d232618e2 GIT binary patch literal 866 zcmV-o1D*U*Nk&Fm0{{S5MM6+kP&gn?0{{SU766?ADpvt406vjKolB*oqM@U5NuaP2 z31_O3q>h=E*1s|~*QoZ}yJ~hlA3aTzcm_QCg6wc~x#LjYmM$z1261BAd@VDn zsOqF%%EUZOG3woT^wF^CxvNB3$kN^APTuhGr&;`Iis?x{UNYJ4P>T)sQzGpa^QV%C z6w;k)Odq3pPxn*!MY|nr<6D0zs#&!vgft#}Wq6VzxR5eYUx45^cp$qpw7GL*Km7rfT=74M|!_rRzx8@wjkgC zjWJ<|aY1J|?8n_Pcj@`Ta!34BxjoU)&-fR#%Mpug?jYOiXu^Ujiq8_Ii#%@gn^A9b zW_L$ZY9Pp9T>vFAF}>t>1Uj7N6tA_p`ffbcHD*A5g;L5_5mH#uG)EzU8)#{n^py%vZ{_ znoSnyl>(gx&!nhY{f4A3;3t=YSr>BOrU*(<5P-?!R0){BJ&Ygi#1h|#{7Xzhc}#Z! zv0N+$$}q@+lAXWGMxig@nl?-36#1XI?f3vn2%~teHyl$$CBFZ&brVkMm^*0@Hp+!6 z9*So(x3@tn_;GJqm$Lf=bxWMbZkfYjE-}jekTrjjw&eZ?!v4o9nMc;MC6B3Lv19IS zscjzRM1NQ(NmkBHXW_wa+ICg4Jm8lhSI4+GEtVV^6g6ygm>l-g33L1O*2pNul`?l6 sp-Yk_Nd%c19o@mYSAD9g4QpJ!rSPeu62SQ2LIJIw$vM2h000000H_?TW&i*H literal 0 HcmV?d00001 diff --git a/contributing/development/configuring_an_ide/index.rst b/contributing/development/configuring_an_ide/index.rst index 32bb8bb9b63..b8624988477 100644 --- a/contributing/development/configuring_an_ide/index.rst +++ b/contributing/development/configuring_an_ide/index.rst @@ -19,6 +19,7 @@ Development Environment), here are setup instructions for some popular ones: code_blocks kdevelop qt_creator + rider visual_studio visual_studio_code xcode diff --git a/contributing/development/configuring_an_ide/rider.rst b/contributing/development/configuring_an_ide/rider.rst new file mode 100644 index 00000000000..af7daf57167 --- /dev/null +++ b/contributing/development/configuring_an_ide/rider.rst @@ -0,0 +1,69 @@ +.. _doc_configuring_an_ide_rider: + +Rider +===== + +`Rider `_ is a commercial +`JetBrains `_ IDE for C# and C++ that uses the same solution system as Visual Studio. + +Importing the project +--------------------- + +.. tip:: If you already use Visual Studio as your main IDE, you can use the same solution file in Rider. + Rider and Visual Studio use the same solution format, so you can switch between the two IDEs without rebuilding the solution file. + Debug configurations need to be changed when going from one IDE to another. + +Rider requires a solution file to work on a project. While Godot does not come +with the solution file, it can be generated using SCons. + +- Navigate to the Godot root folder and open a Command Prompt or PowerShell window. +- Copy, paste and run the next command to generate the solution. + +:: + + scons platform=windows vsproj=yes dev_build=yes + +The ``vsproj`` parameter signals that you want Visual Studio solution generated. +The ``dev_build`` parameter makes sure the debug symbols are included, allowing to e.g. step through code using breakpoints. + +- If you have Rider setup as your main IDE for .sln, you can now open the project by double-clicking on the ``godot.sln`` in the project root + or by using the **Open** option inside of Rider. + +.. note:: Rider could fail to build the first time you open the project. + If that is the case, you can close Rider and open the solution in Visual Studio, build it, close Visual Studio, + and open the solution in Rider again. You are now able to build the project from Rider. + +Compiling and debugging the project +----------------------------------- +Rider comes with a built-in debugger that can be used to debug the Godot project. You can launch the debugger +by pressing the **Debug** icon at the top of the screen, this only works for the Project manager, +if you want to debug the editor, you need to configure the debugger first. + +.. figure:: img/rider_run_debug.webp + :align: center + +- Click on the **Godot > Edit Configurations** option at the top of the screen. + +.. figure:: img/rider_configurations.webp + :align: center + +- Delete what is under **Program arguments** and paste the following line: + +:: + + --e --path + +This will tell the executable to debug the specified project without using the project manager. +Use the root path to the project folder, not ``project.godot`` file path. + +.. figure:: img/rider_configurations_changed.webp + :align: center + +- Finally click on apply and ok to save the changes. + +- You can now launch the debugger by pressing the **Debug** icon at the top of the screen and it will open the project to debug. + +Alternatively you can use **Run > Attach to Process** to attach the debugger to a running Godot instance. + +.. figure:: img/rider_attach_to_process.webp + :align: center From d37226e0d71235ace90c5fe2d86c97cd3e33e4be Mon Sep 17 00:00:00 2001 From: Jason McGhee Date: Mon, 29 May 2023 02:18:17 -0700 Subject: [PATCH 37/76] Fix compute_shaders.rst C# code snippets to compile (#7433) --- tutorials/shaders/compute_shaders.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tutorials/shaders/compute_shaders.rst b/tutorials/shaders/compute_shaders.rst index 569a128fb6b..2a51883feda 100644 --- a/tutorials/shaders/compute_shaders.rst +++ b/tutorials/shaders/compute_shaders.rst @@ -185,8 +185,8 @@ and create a precompiled version of it using this: // Load GLSL shader var shaderFile = GD.Load("res://compute_example.glsl"); - var shaderBytecode = shaderFile.GetSpirv(); - var shader = rd.ShaderCreateFromSpirv(shaderBytecode); + var shaderBytecode = shaderFile.GetSpirV(); + var shader = rd.ShaderCreateFromSpirV(shaderBytecode); Provide input data @@ -356,11 +356,11 @@ the data and print the results to our console. .. code-tab:: csharp // Read back the data from the buffers - var outputBytes = rd.BufferGetData(outputBuffer); + var outputBytes = rd.BufferGetData(buffer); var output = new float[input.Length]; Buffer.BlockCopy(outputBytes, 0, output, 0, outputBytes.Length); - GD.Print("Input: ", input) - GD.Print("Output: ", output) + GD.Print("Input: ", string.Join(", ", input)); + GD.Print("Output: ", string.Join(", ", output)); With that, you have everything you need to get started working with compute shaders. From b3db4c16b4f2afc85347040e05ef71fc05524f0d Mon Sep 17 00:00:00 2001 From: bitsawer Date: Mon, 29 May 2023 17:53:09 +0300 Subject: [PATCH 38/76] Update pygments to 2.15.1 and restore fixed shader syntax highlighting --- requirements.txt | 2 +- tutorials/shaders/shader_reference/shader_preprocessor.rst | 3 +-- tutorials/shaders/shaders_style_guide.rst | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index dd4a325d8a1..b25d1e97310 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ # https://github.com/readthedocs/readthedocs.org/blob/master/requirements/docs.txt # Base dependencies -pygments==2.14.0 +pygments==2.15.1 # Sphinx base and RTD theme. sphinx==4.4.0 diff --git a/tutorials/shaders/shader_reference/shader_preprocessor.rst b/tutorials/shaders/shader_reference/shader_preprocessor.rst index 23c96851d45..fa2a855765b 100644 --- a/tutorials/shaders/shader_reference/shader_preprocessor.rst +++ b/tutorials/shaders/shader_reference/shader_preprocessor.rst @@ -61,8 +61,7 @@ anywhere within the shader (including in uniform hints). ``#define`` can also be used to insert arbitrary shader code at any location, while constants can't do that. -.. FIXME: An upstream bug (https://github.com/pygments/pygments/pull/2350), fixed but not published yet. -.. code-block:: none +.. code-block:: glsl shader_type spatial; diff --git a/tutorials/shaders/shaders_style_guide.rst b/tutorials/shaders/shaders_style_guide.rst index 0d5185e13c5..107de14f703 100644 --- a/tutorials/shaders/shaders_style_guide.rst +++ b/tutorials/shaders/shaders_style_guide.rst @@ -346,8 +346,7 @@ the console, extra indentation should **not** be added within ``#if``, **Bad**: -.. FIXME: An upstream bug in Pygment related to #ifdef. -.. code-block:: none +.. code-block:: glsl #define heightmap_enabled From d8e71f7453e6168454828263e20758a7c21156a0 Mon Sep 17 00:00:00 2001 From: Danil Alexeev Date: Mon, 29 May 2023 21:32:20 +0300 Subject: [PATCH 39/76] Update info about BBCode in doc comments and Class Reference --- .../documentation/class_reference_primer.rst | 127 ++++++----- .../gdscript_documentation_comments.rst | 198 ++++++++++-------- .../gdscript/gdscript_styleguide.rst | 122 ++++++----- 3 files changed, 253 insertions(+), 194 deletions(-) diff --git a/contributing/documentation/class_reference_primer.rst b/contributing/documentation/class_reference_primer.rst index 29f78947977..c73744c3175 100644 --- a/contributing/documentation/class_reference_primer.rst +++ b/contributing/documentation/class_reference_primer.rst @@ -134,62 +134,93 @@ Linking Whenever you link to a member of another class, you need to specify the class name. For links to the same class, the class name is optional and can be omitted. -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| Tag | Effect | Usage | Result | -+=========================+=================================================+=========================================+=============================================================================+ -| [Class] | Link to class ``Class`` | Move the [Sprite2D]. | Move the :ref:`class_Sprite2D`. | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| [annotation Class.name] | Link to annotation ``name`` in class ``Class``, | See [annotation @GDScript.@export]. | See :ref:`@GDScript.@export`. | -| | many default annotations are in ``@GDScript`` | | | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| [constant Class.name] | Link to constant ``name`` in class ``Class`` | See [constant @GlobalScope.KEY_ESCAPE]. | See :ref:`@GlobalScope.KEY_ESCAPE`. | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| [enum Class.name] | Link to enum ``name`` in class ``Class`` | See [enum Mesh.ArrayType]. | See :ref:`ArrayType`. | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| [method Class.name] | Link to method ``name`` in class ``Class`` | Call [method Node3D.hide]. | Call :ref:`hide`. | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| [member Class.name] | Link to member ``name`` in class ``Class`` | Get [member Node2D.scale]. | Get :ref:`scale`. | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| [signal Class.name] | Link to signal ``name`` in class ``Class`` | Emit [signal Node.renamed]. | Emit :ref:`renamed`. | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ -| [theme_item Class.name] | Link to theme item ``name`` in class ``Class`` | See [theme_item GraphNode.position]. | See :ref:`position`. | -+-------------------------+-------------------------------------------------+-----------------------------------------+-----------------------------------------------------------------------------+ ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| Tag and Description | Example | Result | ++===============================+=========================================+======================================================================+ +| | ``[Class]`` | ``Move the [Sprite2D].`` | Move the :ref:`class_Sprite2D`. | +| | Link to class | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[annotation Class.name]`` | ``See [annotation @GDScript.@export].`` | See :ref:`@GDScript.@export `. | +| | Link to annotation | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[constant Class.name]`` | ``See [constant @GlobalScope.KEY_F1].`` | See :ref:`@GlobalScope.KEY_F1 `. | +| | Link to constant | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[enum Class.name]`` | ``See [enum Mesh.ArrayType].`` | See :ref:`Mesh.ArrayType `. | +| | Link to enum | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[method Class.name]`` | ``Call [method Node3D.hide].`` | Call :ref:`Node3D.hide() `. | +| | Link to method | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[member Class.name]`` | ``Get [member Node2D.scale].`` | Get :ref:`Node2D.scale `. | +| | Link to member | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[signal Class.name]`` | ``Emit [signal Node.renamed].`` | Emit :ref:`Node.renamed `. | +| | Link to signal | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[theme_item Class.name]`` | ``See [theme_item Label.font].`` | See :ref:`Label.font `. | +| | Link to theme item | | | ++-------------------------------+-----------------------------------------+----------------------------------------------------------------------+ + +.. note:: + + Currently only :ref:`class_@GDScript` has annotations. Formatting text """"""""""""""" -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| Tag | Effect | Usage | Result | -+============================+=====================================================+=====================================+===================================================================+ -| [param name] | Formats a parameter name (as code) | Takes [param size] for the size. | Takes ``size`` for the size. | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| [b] [/b] | Bold | Some [b]bold[/b] text. | Some **bold** text. | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| [i] [/i] | Italic | Some [i]italic[/i] text. | Some *italic* text. | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| [kbd] [/kbd] | Keyboard/mouse shortcut | Some [kbd]Ctrl + C[/kbd] key. | Some :kbd:`Ctrl + C` key. | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ ++--------------------------------------+--------------------------------------+------------------------------+ +| Tag and Description | Example | Result | ++======================================+======================================+==============================+ +| | ``[param name]`` | ``Takes [param size] for the size.`` | Takes ``size`` for the size. | +| | Formats a parameter name (as code) | | | ++--------------------------------------+--------------------------------------+------------------------------+ +| | ``[br]`` | | ``Line 1.[br]`` | | Line 1. | +| | Line break | | ``Line 2.`` | | Line 2. | ++--------------------------------------+--------------------------------------+------------------------------+ +| | ``[b]`` ``[/b]`` | ``Some [b]bold[/b] text.`` | Some **bold** text. | +| | Bold | | | ++--------------------------------------+--------------------------------------+------------------------------+ +| | ``[i]`` ``[/i]`` | ``Some [i]italic[/i] text.`` | Some *italic* text. | +| | Italic | | | ++--------------------------------------+--------------------------------------+------------------------------+ +| | ``[kbd]`` ``[/kbd]`` | ``Some [kbd]Ctrl + C[/kbd] key.`` | Some :kbd:`Ctrl + C` key. | +| | Keyboard/mouse shortcut | | | ++--------------------------------------+--------------------------------------+------------------------------+ Formatting code """"""""""""""" -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| Tag | Effect | Usage | Result | -+============================+=====================================================+=====================================+===================================================================+ -| [code] [/code] | Monospace | Some [code]monospace[/code] text. | Some ``monospace`` text. | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| [codeblock] [/codeblock] | Multiline preformatted block | *See below.* | *See below.* | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| [codeblocks] [/codeblocks] | [codeblock] for multiple languages | *See below.* | *See below.* | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| [gdscript] [/gdscript] | GDScript codeblock tab in codeblocks | *See below.* | *See below.* | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ -| [csharp] [/csharp] | C# codeblock tab in codeblocks | *See below.* | *See below.* | -+----------------------------+-----------------------------------------------------+-------------------------------------+-------------------------------------------------------------------+ - -Use ``[codeblock]`` for pre-formatted code blocks. Inside ``[codeblock]``, -always use **four spaces** for indentation. The parser will delete tabs. For -example: ++----------------------------------------+---------------------------------------+--------------------------+ +| Tag and Description | Example | Result | ++========================================+=======================================+==========================+ +| | ``[code]`` ``[/code]`` | ``Some [code]monospace[/code] text.`` | Some ``monospace`` text. | +| | Monospace | | | ++----------------------------------------+---------------------------------------+--------------------------+ +| | ``[codeblock]`` ``[/codeblock]`` | *See below.* | *See below.* | +| | Multiline preformatted block | | | ++----------------------------------------+---------------------------------------+--------------------------+ +| | ``[codeblocks]`` ``[/codeblocks]`` | *See below.* | *See below.* | +| | Codeblock for multiple languages | | | ++----------------------------------------+---------------------------------------+--------------------------+ +| | ``[gdscript]`` ``[/gdscript]`` | *See below.* | *See below.* | +| | GDScript codeblock tab in codeblocks | | | ++----------------------------------------+---------------------------------------+--------------------------+ +| | ``[csharp]`` ``[/csharp]`` | *See below.* | *See below.* | +| | C# codeblock tab in codeblocks | | | ++----------------------------------------+---------------------------------------+--------------------------+ + +.. note:: + + 1. ``[code]`` disables BBCode until the parser encounters ``[/code]``. + 2. ``[codeblock]`` disables BBCode until the parser encounters ``[/codeblock]``. + +.. warning:: + + Use ``[codeblock]`` for pre-formatted code blocks. Inside ``[codeblock]``, + always use **four spaces** for indentation. The parser will delete tabs. + +For example: .. code-block:: none diff --git a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst index 52290553169..86492b1e6d6 100644 --- a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst +++ b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst @@ -35,29 +35,33 @@ Tags | Description | Use one blank line to separate the description from | | | the brief. | +-------------------+--------------------------------------------------------+ -| Tutorial | ``@tutorial[( The Title Here )]:`` | -| | | +| Tutorial | | ``@tutorial:`` | +| | | ``@tutorial(The Title Here):`` | +-------------------+--------------------------------------------------------+ -**Example:** +For example: :: extends Node2D - - ## A brief description of your script. + ## A brief description of the class's role and functionality. ## - ## A more detailed description of the script. + ## The description of the script, what it can do, + ## and any further detail. ## ## @tutorial: https://the/tutorial1/url.com ## @tutorial(Tutorial2): https://the/tutorial2/url.com -.. warning:: If there is any space in between the tag name and colon, for example - ``@tutorial :``, it won't be treated as a valid tag and will be ignored. +.. warning:: + + If there is any space in between the tag name and colon, for example + ``@tutorial :``, it won't be treated as a valid tag and will be ignored. + +.. note:: -.. note:: When the description spans multiple lines, the preceding and trailing white - spaces will be stripped and joined with a single space. To preserve the line - break use ``[br]``. See also `BBCode and class reference`_ below. + When the description spans multiple lines, the preceding and trailing white + spaces will be stripped and joined with a single space. To preserve the line + break use ``[br]``. See also `BBCode and class reference`_ below. Documenting script members -------------------------- @@ -82,14 +86,13 @@ Members that are applicable for documentation: - Enum - Enum value -Examples --------- +Example +------- :: extends Node2D - - ## A brief description of your script. + ## A brief description of the class's role and functionality. ## ## The description of the script, what it can do, ## and any further detail. @@ -97,18 +100,6 @@ Examples ## @tutorial: https://the/tutorial1/url.com ## @tutorial(Tutorial2): https://the/tutorial2/url.com - ## The description of the variable v1. - var v1 - - ## This is a multi line description of the variable v2. The type - ## information below will be extracted for the documentation. - var v2: int - - ## If the member has any annotation, the annotation should - ## immediately precede it. - @onready - var v3 := some_func() - ## The description of a constant. const GRAVITY = 9.8 @@ -124,16 +115,34 @@ Examples RIGHT = 3, ## Direction right. } + ## The description of a constant. + const GRAVITY = 9.8 + + ## The description of the variable v1. + var v1 + + ## This is a multiline description of the variable v2.[br] + ## The type information below will be extracted for the documentation. + var v2: int + + ## If the member has any annotation, the annotation should + ## immediately precede it. + @export + var v3 := some_func() + + ## As the following function is documented, even though its name starts with ## an underscore, it will appear in the help window. func _fn(p1: int, p2: String) -> int: return 0 + # The below function isn't documented and its name starts with an underscore # so it will treated as private and will not be shown in the help window. func _internal() -> void: pass + ## Documenting an inner class. ## ## The same rules apply here. The documentation must @@ -145,6 +154,7 @@ Examples ## Inner class variable v4. var v4 + ## Inner class function fn. func fn(): pass @@ -158,73 +168,83 @@ URLs, animation effects, etc. can be added with the :ref:`bbcode `. + +Whenever you link to a member of another class, you need to specify the class name. +For links to the same class, the class name is optional and can be omitted. + Here's the list of available tags: -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| Tag | Effect | Usage | Result | -+===========================+================================+=====================================+=========================================================================+ -| [Class] | Link a class | Move the [Sprite2D]. | Move the :ref:`class_Sprite2D`. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [annotation name] | Link to an annotation in this | See | See | -| | class | [annotation @export]. | :ref:`@GDScript.@export`. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [annotation Class.name] | Link to another class's | See | See | -| | annotation, many default | [annotation @GDScript.@export]. | :ref:`@GDScript.@export`. | -| | annotations are in | | | -| | ``@GDScript`` | | | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [constant name] | Link to a constant in this | See | See | -| | class | [constant KEY_ESCAPE]. | :ref:`@GlobalScope.KEY_ESCAPE`. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [constant Class.name] | Link to another class's | See | See | -| | constant | [constant @GlobalScope.KEY_ESCAPE]. | :ref:`@GlobalScope.KEY_ESCAPE`. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [enum enumname] | Link to an enum in this class | See [enum ArrayType]. | See :ref:`ArrayType `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [enum Class.enumname] | Link to another class's enum | See [enum Mesh.ArrayType]. | See :ref:`ArrayType `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [method methodname] | Link to a method in this class | Call [method hide]. | Call :ref:`hide `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [method Class.methodname] | Link to another class's method | Call [method Node3D.hide]. | Call :ref:`hide `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [member membername] | Link to a member in this class | Get [member scale]. | Get :ref:`scale `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [member Class.membername] | Link to another class's member | Get [member Node2D.scale]. | Get :ref:`scale `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [signal signalname] | Link to a signal in this class | Emit [signal renamed]. | Emit :ref:`renamed `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [signal Class.signalname] | Link to another class's signal | Emit [signal Node.renamed]. | Emit :ref:`renamed `. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [br] | Line break | | Line 1.[br] | | Line 1. | -| | | | Line 2. | | Line 2. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [b] [/b] | Bold | Some [b]bold[/b] text. | Some **bold** text. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [i] [/i] | Italic | Some [i]italic[/i] text. | Some *italic* text. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [code] [/code] | Monospace | Some [code]monospace[/code] text. | Some ``monospace`` text. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [kbd] [/kbd] | Keyboard/mouse shortcut | Some [kbd]Ctrl + C[/kbd] key. | Some :kbd:`Ctrl + C` key. | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ -| [codeblock] [/codeblock] | Multiline preformatted block | *See below.* | *See below.* | -+---------------------------+--------------------------------+-------------------------------------+-------------------------------------------------------------------------+ - -.. warning:: Use ``[codeblock]`` for pre-formatted code blocks. Inside - ``[codeblock]``, always use **four spaces** for indentation - (the parser will delete tabs). ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| Tag and Description | Example | Result | ++======================================+=========================================+======================================================================+ +| | ``[Class]`` | ``Move the [Sprite2D].`` | Move the :ref:`class_Sprite2D`. | +| | Link to class | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[annotation Class.name]`` | ``See [annotation @GDScript.@export].`` | See :ref:`@GDScript.@export `. | +| | Link to annotation | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[constant Class.name]`` | ``See [constant @GlobalScope.KEY_F1].`` | See :ref:`@GlobalScope.KEY_F1 `. | +| | Link to constant | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[enum Class.name]`` | ``See [enum Mesh.ArrayType].`` | See :ref:`Mesh.ArrayType `. | +| | Link to enum | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[method Class.name]`` | ``Call [method Node3D.hide].`` | Call :ref:`Node3D.hide() `. | +| | Link to method | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[member Class.name]`` | ``Get [member Node2D.scale].`` | Get :ref:`Node2D.scale `. | +| | Link to member | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[signal Class.name]`` | ``Emit [signal Node.renamed].`` | Emit :ref:`Node.renamed `. | +| | Link to signal | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[theme_item Class.name]`` | ``See [theme_item Label.font].`` | See :ref:`Label.font `. | +| | Link to theme item | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[param name]`` | ``Takes [param size] for the size.`` | Takes ``size`` for the size. | +| | Formats a parameter name (as code) | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[br]`` | | ``Line 1.[br]`` | | Line 1. | +| | Line break | | ``Line 2.`` | | Line 2. | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[b]`` ``[/b]`` | ``Some [b]bold[/b] text.`` | Some **bold** text. | +| | Bold | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[i]`` ``[/i]`` | ``Some [i]italic[/i] text.`` | Some *italic* text. | +| | Italic | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[kbd]`` ``[/kbd]`` | ``Some [kbd]Ctrl + C[/kbd] key.`` | Some :kbd:`Ctrl + C` key. | +| | Keyboard/mouse shortcut | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[code]`` ``[/code]`` | ``Some [code]monospace[/code] text.`` | Some ``monospace`` text. | +| | Monospace | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ +| | ``[codeblock]`` ``[/codeblock]`` | *See below.* | *See below.* | +| | Multiline preformatted block | | | ++--------------------------------------+-----------------------------------------+----------------------------------------------------------------------+ + +.. note:: + + 1. Currently only :ref:`class_@GDScript` has annotations. + 2. ``[code]`` disables BBCode until the parser encounters ``[/code]``. + 3. ``[codeblock]`` disables BBCode until the parser encounters ``[/codeblock]``. + +.. warning:: + + Use ``[codeblock]`` for pre-formatted code blocks. Inside ``[codeblock]``, + always use **four spaces** for indentation (the parser will delete tabs). :: - ## The do_something method for this plugin. before using the - ## method you first have to initialize [MyPlugin]. - ## see : [method initialize] - ## [color=yellow]Warning:[/color] always [method clean] after use. + ## Do something for this plugin. Before using the method + ## you first have to [method initialize] [MyPlugin].[br] + ## [color=yellow]Warning:[/color] Always [method clean] after use.[br] ## Usage: - ## [codeblock] - ## func _ready(): - ## the_plugin.initialize() - ## the_plugin.do_something() - ## the_plugin.clean() - ## [/codeblock] + ## [codeblock] + ## func _ready(): + ## the_plugin.initialize() + ## the_plugin.do_something() + ## the_plugin.clean() + ## [/codeblock] func do_something(): pass diff --git a/tutorials/scripting/gdscript/gdscript_styleguide.rst b/tutorials/scripting/gdscript/gdscript_styleguide.rst index ac4322b8eb0..ef314e186b7 100644 --- a/tutorials/scripting/gdscript/gdscript_styleguide.rst +++ b/tutorials/scripting/gdscript/gdscript_styleguide.rst @@ -19,8 +19,10 @@ and ask fellow developers for insights. In general, keeping your code consistent in your projects and within your team is more important than following this guide to a tee. -.. note:: Godot's built-in script editor uses a lot of these conventions - by default. Let it help you. +.. note:: + + Godot's built-in script editor uses a lot of these conventions + by default. Let it help you. Here is a complete class example based on these guidelines: @@ -28,9 +30,10 @@ Here is a complete class example based on these guidelines: class_name StateMachine extends Node - # Hierarchical State machine for the player. - # Initializes states and delegates engine callbacks - # (_physics_process, _unhandled_input) to the state. + ## Hierarchical State machine for the player. + ## + ## Initializes states and delegates engine callbacks ([method Node._physics_process], + ## [method Node._unhandled_input]) to the state. signal state_changed(previous, new) @@ -46,11 +49,11 @@ Here is a complete class example based on these guidelines: func _init(): add_to_group("state_machine") - - + + func _enter_tree(): print("this happens before the ready method!") - + func _ready(): state_changed.connect(_on_state_changed) @@ -287,8 +290,10 @@ Surround functions and class definitions with two blank lines: Use one blank line inside functions to separate logical sections. -.. note:: We use a single line between classes and function definitions in the class reference and - in short code snippets in this documentation. +.. note:: + + We use a single line between classes and function definitions in the class reference and + in short code snippets in this documentation. Line length ~~~~~~~~~~~ @@ -331,7 +336,7 @@ The only exception to that rule is the ternary operator: :: - next_state = "idle" if is_on_floor() else "fall" + next_state = "idle" if is_on_floor() else "fall" Format multiline statements for readability ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -467,9 +472,9 @@ This helps differentiate text comments from disabled code. .. note:: - In the script editor, to toggle the selected code commented, press - :kbd:`Ctrl + K`. This feature adds a single # sign at the start - of the selected lines. + In the script editor, to toggle the selected code commented, press + :kbd:`Ctrl + K`. This feature adds a single # sign at the start + of the selected lines. Whitespace ~~~~~~~~~~ @@ -636,7 +641,7 @@ Use PascalCase for class and node names: :: - extends CharacterBody3D + extends CharacterBody3D Also use PascalCase when loading a class into a constant or a variable: @@ -651,16 +656,16 @@ Use snake\_case to name functions and variables: :: - var particle_effect - func load_level(): + var particle_effect + func load_level(): Prepend a single underscore (\_) to virtual methods functions the user must override, private functions, and private variables: :: - var _counter = 0 - func _recalculate_path(): + var _counter = 0 + func _recalculate_path(): Signals ~~~~~~~ @@ -745,22 +750,25 @@ Class declaration If the code is meant to run in the editor, place the ``@tool`` annotation on the first line of the script. -Follow with the `class_name` if necessary. You can turn a GDScript file into a +Follow with the ``class_name`` if necessary. You can turn a GDScript file into a global type in your project using this feature. For more information, see :ref:`doc_gdscript`. -Then, add the `extends` keyword if the class extends a built-in type. +Then, add the ``extends`` keyword if the class extends a built-in type. -Following that, you should have the class's optional docstring as comments. You -can use that to explain the role of your class to your teammates, how it works, +Following that, you should have the class's optional +:ref:`documentation comments `. +You can use that to explain the role of your class to your teammates, how it works, and how other developers should use it, for example. :: - class_name MyNode - extends Node - # A brief description of the class's role and functionality. - # Longer description. + class_name MyNode + extends Node + ## A brief description of the class's role and functionality. + ## + ## The description of the script, what it can do, + ## and any further detail. Signals and properties ~~~~~~~~~~~~~~~~~~~~~~ @@ -776,32 +784,32 @@ variables, in that order. :: - signal spawn_player(position) + signal spawn_player(position) - enum Jobs {KNIGHT, WIZARD, ROGUE, HEALER, SHAMAN} + enum Jobs {KNIGHT, WIZARD, ROGUE, HEALER, SHAMAN} - const MAX_LIVES = 3 + const MAX_LIVES = 3 - @export var job: Jobs = Jobs.KNIGHT - @export var max_health = 50 - @export var attack = 5 + @export var job: Jobs = Jobs.KNIGHT + @export var max_health = 50 + @export var attack = 5 - var health = max_health: - set(new_health): - health = new_health + var health = max_health: + set(new_health): + health = new_health - var _speed = 300.0 + var _speed = 300.0 - @onready var sword = get_node("Sword") - @onready var gun = get_node("Gun") + @onready var sword = get_node("Sword") + @onready var gun = get_node("Gun") .. note:: - The GDScript compiler evaluates onready variables right before the ``_ready`` - callback. You can use that to cache node dependencies, that is to say, to get - child nodes in the scene that your class relies on. This is what the example - above shows. + The GDScript compiler evaluates onready variables right before the ``_ready`` + callback. You can use that to cache node dependencies, that is to say, to get + child nodes in the scene that your class relies on. This is what the example + above shows. Member variables ~~~~~~~~~~~~~~~~ @@ -881,13 +889,13 @@ To declare a variable's type, use ``: ``: :: - var health: int = 0 + var health: int = 0 To declare the return type of a function, use ``-> ``: :: - func heal(amount: int) -> void: + func heal(amount: int) -> void: Inferred types ~~~~~~~~~~~~~~ @@ -902,8 +910,8 @@ otherwise prefer writing the type explicitly. :: - var health: int = 0 # The type can be int or float, and thus should be stated explicitly. - var direction := Vector3(1, 2, 3) # The type is clearly inferred as Vector3. + var health: int = 0 # The type can be int or float, and thus should be stated explicitly. + var direction := Vector3(1, 2, 3) # The type is clearly inferred as Vector3. Include the type hint when the type is ambiguous, and omit the type hint when it's redundant. @@ -914,11 +922,11 @@ omit the type hint when it's redundant. :: - var health := 0 # Typed as int, but it could be that float was intended. - var direction: Vector3 = Vector3(1, 2, 3) # The type hint has redundant information. + var health := 0 # Typed as int, but it could be that float was intended. + var direction: Vector3 = Vector3(1, 2, 3) # The type hint has redundant information. - # What type is this? It's not immediately clear to the reader, so it's bad. - var value := complex_function() + # What type is this? It's not immediately clear to the reader, so it's bad. + var value := complex_function() In some cases, the type must be stated explicitly, otherwise the behavior will not be as expected because the compiler will only be able to use @@ -932,7 +940,7 @@ should set the type explicitly. :: - @onready var health_bar: ProgressBar = get_node("UI/LifeBar") + @onready var health_bar: ProgressBar = get_node("UI/LifeBar") Alternatively, you can use the ``as`` keyword to cast the return type, and that type will be used to infer the type of the var. @@ -941,8 +949,8 @@ that type will be used to infer the type of the var. :: - @onready var health_bar := get_node("UI/LifeBar") as ProgressBar - # health_bar will be typed as ProgressBar + @onready var health_bar := get_node("UI/LifeBar") as ProgressBar + # health_bar will be typed as ProgressBar This option is also considered more :ref:`type-safe` than the first. @@ -952,6 +960,6 @@ This option is also considered more :ref:`type-safe Date: Mon, 29 May 2023 18:24:25 -0700 Subject: [PATCH 40/76] Add a section for the Android editor --- tutorials/editor/index.rst | 14 +++++ tutorials/editor/using_the_android_editor.rst | 55 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 tutorials/editor/using_the_android_editor.rst diff --git a/tutorials/editor/index.rst b/tutorials/editor/index.rst index 383ae61bdf5..ff9d40cb88a 100644 --- a/tutorials/editor/index.rst +++ b/tutorials/editor/index.rst @@ -24,6 +24,20 @@ in other sections where appropriate. For example, the :ref:`animation editor default_key_mapping customizing_editor +Android editor +-------------- + +Godot offers a native port of the editor running entirely on Android devices. +The Android port can be downloaded from the `Android Downloads page `__. +While we strive for feature parity with the Desktop version of the editor, +the Android port has a certain amount of caveats you should be aware of. + +.. toctree:: + :maxdepth: 1 + :name: toc-android-editor + + using_the_android_editor + Web editor ---------- diff --git a/tutorials/editor/using_the_android_editor.rst b/tutorials/editor/using_the_android_editor.rst new file mode 100644 index 00000000000..12868368e26 --- /dev/null +++ b/tutorials/editor/using_the_android_editor.rst @@ -0,0 +1,55 @@ +.. _doc_using_the_android_editor: + +Using the Android editor +======================== + +In 2023, `we added `__ +a `Android port of the editor `__ +that can be used to work on new or existing projects on Android devices. + +.. note:: + + The Android editor is in beta testing stage, while we continue to refine the experience, + and bring it up to parity with the Desktop version of the editor. See :ref:`doc_using_the_android_editor_limitations` below. + +Android devices support +----------------------- + +The Android editor requires devices running Android 5 Lollipop or higher, with at least OpenGL 3 support. This includes (not exhaustive): + +- Android tablets, foldables and large phones +- Android-powered netbooks +- Chromebooks supporting Android apps + +.. _doc_using_the_android_editor_limitations: + +Required Permissions +-------------------- + +The Android editor requires the `All files access permission `__. +The permission allows the editor to create / import / read project files from any file locations on the device. +Without the permission, the editor is still functional, but has limited access to the device's files and directories. + +Limitations & known issues +-------------------------- + +Here are the known limitations and issues of the Android editor: + +- No C#/Mono support +- No GDExtension support +- No support for external script editors +- While available, the *Vulkan Forward+* renderer is not recommended due to severe performance issues +- No support for building and exporting an Android APK binary. + As a workaround, you can generate and export a `Godot PCK or ZIP file `__ +- No support for building and exporting binaries for other platforms +- Performance and stability issues when using the *Vulkan Mobile* renderer for a project +- UX not optimized for Android phones form-factor +- `Android Go devices `__ lacks + the *All files access* permission required for device read/write access. + As a workaround, when using a Android Go device, it's recommended to create new projects only in the Android *Documents* or *Downloads* directories. +- The editor doesn't properly resume when *Don't keep activities* is enabled in the *Developer Options* + +.. seealso:: + + See the + `list of open issues on GitHub related to the Android editor `__ for a list of known bugs. From b50c605e696d91df22501ec8cbd9e81d1cceaaf8 Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Mon, 29 May 2023 23:43:44 -0500 Subject: [PATCH 41/76] Fix RST link in importing 3D scenes asset direction conventions --- tutorials/assets_pipeline/importing_scenes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/assets_pipeline/importing_scenes.rst b/tutorials/assets_pipeline/importing_scenes.rst index 463557dc5f9..d07db08e560 100644 --- a/tutorials/assets_pipeline/importing_scenes.rst +++ b/tutorials/assets_pipeline/importing_scenes.rst @@ -39,7 +39,7 @@ that +Z is back, +X is right, and -X is left for a camera. The convention for 3D assets is to face the opposite direction as the camera, so that characters and other assets are facing the camera by default. This convention is extremely common in 3D modeling applications, and is -`codified in glTF as part of the glTF 2.0 specification `. +`codified in glTF as part of the glTF 2.0 specification `__. This means that for oriented 3D assets (such as characters), the +Z axis is the direction of the front, so -Z is the rear, +X is the left side, and -X is the right side for a 3D asset. From 92d962ab75c4399f45e4beadf21bdb198c57e94a Mon Sep 17 00:00:00 2001 From: br1trs <88297220+br1trs@users.noreply.github.com> Date: Mon, 29 May 2023 23:17:31 -0600 Subject: [PATCH 42/76] delete get_root() handling quit requests multiple resolutions change scenes manually scene tree --- tutorials/inputs/handling_quit_requests.rst | 2 +- tutorials/rendering/multiple_resolutions.rst | 2 +- tutorials/scripting/change_scenes_manually.rst | 8 ++++---- tutorials/scripting/scene_tree.rst | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tutorials/inputs/handling_quit_requests.rst b/tutorials/inputs/handling_quit_requests.rst index 2ce7a77ec06..73aff713791 100644 --- a/tutorials/inputs/handling_quit_requests.rst +++ b/tutorials/inputs/handling_quit_requests.rst @@ -78,7 +78,7 @@ program termination, you should send the notification yourself: .. tabs:: .. code-tab:: gdscript GDScript - get_tree().get_root().propagate_notification(NOTIFICATION_WM_CLOSE_REQUEST) + get_tree().root.propagate_notification(NOTIFICATION_WM_CLOSE_REQUEST) .. code-tab:: csharp diff --git a/tutorials/rendering/multiple_resolutions.rst b/tutorials/rendering/multiple_resolutions.rst index b5c85909633..7e125ca7d46 100644 --- a/tutorials/rendering/multiple_resolutions.rst +++ b/tutorials/rendering/multiple_resolutions.rst @@ -109,7 +109,7 @@ little easier. The :ref:`Viewport ` node has several functions to handle resizing, and the root node of the scene tree is always a viewport (scenes loaded are instanced as a child of it, and it can always be accessed by calling -``get_tree().get_root()`` or ``get_node("/root")``). +``get_tree().root`` or ``get_node("/root")``). In any case, while changing the root Viewport params is probably the most flexible way to deal with the problem, it can be a lot of work, diff --git a/tutorials/scripting/change_scenes_manually.rst b/tutorials/scripting/change_scenes_manually.rst index f2d6ccd1125..a41b2dcc8bd 100644 --- a/tutorials/scripting/change_scenes_manually.rst +++ b/tutorials/scripting/change_scenes_manually.rst @@ -17,7 +17,7 @@ scenes which one instances and adds to the tree at runtime: func _add_a_scene_manually(): # This is like autoloading the scene, only # it happens after already loading the main scene. - get_tree().get_root().add_child(simultaneous_scene) + get_tree().root.add_child(simultaneous_scene) .. code-tab:: csharp @@ -32,7 +32,7 @@ scenes which one instances and adds to the tree at runtime: { // This is like autoloading the scene, only // it happens after already loading the main scene. - GetTree().GetRoot().AddChild(simultaneousScene); + GetTree().Root.AddChild(simultaneousScene); } To complete the cycle and swap out the new scene with the old one, @@ -124,11 +124,11 @@ a scene's data between scene changes (adding the scene to the root node). .. tabs:: .. code-tab:: gdscript GDScript - get_tree().get_root().add_child(scene) + get_tree().root.add_child(scene) .. code-tab:: csharp - GetTree().GetRoot().AddChild(scene); + GetTree().Root.AddChild(scene); Perhaps instead they wish to display multiple scenes at the same time using :ref:`SubViewportContainers `. This is optimal in diff --git a/tutorials/scripting/scene_tree.rst b/tutorials/scripting/scene_tree.rst index 943230efcbf..6a30f0503b8 100644 --- a/tutorials/scripting/scene_tree.rst +++ b/tutorials/scripting/scene_tree.rst @@ -69,12 +69,12 @@ two different ways: .. tabs:: .. code-tab:: gdscript GDScript - get_tree().get_root() # Access via scene main loop. + get_tree().root # Access via scene main loop. get_node("/root") # Access via absolute path. .. code-tab:: csharp - GetTree().GetRoot(); // Access via scene main loop. + GetTree().Root // Access via scene main loop. GetNode("/root"); // Access via absolute path. This node contains the main viewport. Anything that is a child of a From 485116d8a3867b24eff2e25fb22d684fd1e62997 Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Wed, 31 May 2023 18:07:27 +0200 Subject: [PATCH 43/76] Character and typo fixes --- about/introduction.rst | 2 +- .../development/compiling/compiling_for_ios.rst | 2 +- contributing/documentation/building_the_manual.rst | 2 +- .../contributing_to_the_documentation.rst | 4 ++-- .../documentation/docs_image_guidelines.rst | 2 +- getting_started/first_3d_game/going_further.rst | 14 +++++++------- getting_started/step_by_step/signals.rst | 2 +- tutorials/2d/2d_lights_and_shadows.rst | 2 +- tutorials/3d/procedural_geometry/surfacetool.rst | 2 +- tutorials/animation/introduction.rst | 2 +- .../assets_pipeline/escn_exporter/animation.rst | 2 +- tutorials/audio/audio_effects.rst | 2 +- .../platform/android/android_in_app_purchases.rst | 2 +- tutorials/platform/ios/plugins_for_ios.rst | 2 +- tutorials/platform/web/customizing_html5_shell.rst | 2 +- tutorials/rendering/jitter_stutter.rst | 2 +- 16 files changed, 23 insertions(+), 23 deletions(-) diff --git a/about/introduction.rst b/about/introduction.rst index c6c9accc05a..d4339d46fe9 100644 --- a/about/introduction.rst +++ b/about/introduction.rst @@ -65,7 +65,7 @@ This documentation is organized into several sections: engine to make games. It starts with the :ref:`Step by step ` tutorial which should be the entry point for all new users. **This is the best place to start if you're new!** -- The **Manual** can be read or referenced as needed, +- The **Manual** can be read or referenced as needed, in any order. It contains feature-specific tutorials and documentation. - **Contributing** gives information related to contributing to Godot, whether to the core engine, documentation, demos or other parts. diff --git a/contributing/development/compiling/compiling_for_ios.rst b/contributing/development/compiling/compiling_for_ios.rst index a79c0ea4076..a5b2257cc6b 100644 --- a/contributing/development/compiling/compiling_for_ios.rst +++ b/contributing/development/compiling/compiling_for_ios.rst @@ -82,7 +82,7 @@ should be placed in ``libgodot.ios.debug.xcframework`` and ``libgodot.ios.releas $ lipo -create libgodot.ios.debug.arm64.simulator.a libgodot.ios.debug.x86_64.simulator.a -output ios_xcode/libgodot.ios.debug.xcframework/ios-arm64_x86_64-simulator/libgodot.a $ cp libgodot.ios.opt.arm64.a ios_xcode/libgodot.ios.release.xcframework/ios-arm64/libgodot.a - $ lipo -create libgodot.ios.opt.arm64.simulator.a libgodot.ios.opt.x86_64.simulator.a -output ios_xcode/libgodot.ios.release.xcframework/ios-arm64_x86_64-simulator/libgodot.a + $ lipo -create libgodot.ios.opt.arm64.simulator.a libgodot.ios.opt.x86_64.simulator.a -output ios_xcode/libgodot.ios.release.xcframework/ios-arm64_x86_64-simulator/libgodot.a The MoltenVK static ``.xcframework`` folder must also be placed in the ``ios_xcode`` folder once it has been created. diff --git a/contributing/documentation/building_the_manual.rst b/contributing/documentation/building_the_manual.rst index 7fe9cb35b0e..732d17f2d5b 100644 --- a/contributing/documentation/building_the_manual.rst +++ b/contributing/documentation/building_the_manual.rst @@ -10,7 +10,7 @@ documentation as a PDF, EPUB, or LaTeX file, for example. Before you get started, make sure that you have: - `Git `_ -- `make `_ (unless you’re using Windows) +- `make `_ (unless you're using Windows) - `Python `_ 3 .. note:: Python 3 should come with the ``pip3`` command. You may need to write diff --git a/contributing/documentation/contributing_to_the_documentation.rst b/contributing/documentation/contributing_to_the_documentation.rst index b43ff354a0d..7d9d7916a6d 100644 --- a/contributing/documentation/contributing_to_the_documentation.rst +++ b/contributing/documentation/contributing_to_the_documentation.rst @@ -63,7 +63,7 @@ Editing existing pages To edit an existing page, locate its ``.rst`` source file and open it in your favorite text editor. You can then commit the changes, push them to your fork, and make a pull request. **Note that the pages in** ``classes/`` **should not be -edited here.** They are automatically generated from Godot’s `XML class +edited here.** They are automatically generated from Godot's `XML class reference `__. See :ref:`doc_updating_the_class_reference` for details. @@ -145,7 +145,7 @@ first letter capitalized. Sphinx and reStructuredText syntax ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Check Sphinx’s `reST Primer `__ +Check Sphinx's `reST Primer `__ and the `official reference `__ for details on the syntax. diff --git a/contributing/documentation/docs_image_guidelines.rst b/contributing/documentation/docs_image_guidelines.rst index 833d3210349..4476a220184 100644 --- a/contributing/documentation/docs_image_guidelines.rst +++ b/contributing/documentation/docs_image_guidelines.rst @@ -31,7 +31,7 @@ All screenshots should ideally be taken on a 1080p screen. Anything higher resolution is adding detail that doesn't make the documentation better and dramatically increases file size. If you're taking screenshots on a higher resolution screen the screenshot should be scaled down. There are instructions -on how to do this later on this page. +on how to do this later on this page. Format conversion ----------------- diff --git a/getting_started/first_3d_game/going_further.rst b/getting_started/first_3d_game/going_further.rst index 96323d37597..3ba482ca7ad 100644 --- a/getting_started/first_3d_game/going_further.rst +++ b/getting_started/first_3d_game/going_further.rst @@ -9,29 +9,29 @@ You can pat yourself on the back for having completed your first 3D game with Godot. In this series, we went over a wide range of techniques and editor features. -Hopefully, you’ve witnessed how intuitive Godot’s scene system can be and +Hopefully, you've witnessed how intuitive Godot's scene system can be and learned a few tricks you can apply in your projects. But we just scratched the surface: Godot has a lot more in store for you to save time creating games. And you can learn all that by browsing the documentation. -Where should you begin? Below, you’ll find a few pages to start exploring and -build upon what you’ve learned so far. +Where should you begin? Below, you'll find a few pages to start exploring and +build upon what you've learned so far. -But before that, here’s a link to download a completed version of the project: +But before that, here's a link to download a completed version of the project: ``_. Exploring the manual -------------------- -The manual is your ally whenever you have a doubt or you’re curious about a +The manual is your ally whenever you have a doubt or you're curious about a feature. It does not contain tutorials about specific game genres or mechanics. Instead, it explains how Godot works in general. In it, you will find information about 2D, 3D, physics, rendering and performance, and much more. Here are the sections we recommend you to explore next: -1. Read the :ref:`Scripting section ` to learn essential programming features you’ll use +1. Read the :ref:`Scripting section ` to learn essential programming features you'll use in every project. 2. The :ref:`3D ` and :ref:`Physics ` sections will teach you more about 3D game creation in the engine. @@ -40,5 +40,5 @@ Here are the sections we recommend you to explore next: You can start with these or, if you prefer, look at the sidebar menu on the left and pick your options. -We hope you enjoyed this tutorial series, and we’re looking forward to seeing +We hope you enjoyed this tutorial series, and we're looking forward to seeing what you achieve using Godot. diff --git a/getting_started/step_by_step/signals.rst b/getting_started/step_by_step/signals.rst index e5d737b5031..9d8bffa5ba2 100644 --- a/getting_started/step_by_step/signals.rst +++ b/getting_started/step_by_step/signals.rst @@ -22,7 +22,7 @@ limits `coupling code flexible. For example, you might have a life bar on the screen that represents the -player’s health. When the player takes damage or uses a healing potion, you want +player's health. When the player takes damage or uses a healing potion, you want the bar to reflect the change. To do so, in Godot, you would use signals. .. note:: As mentioned in the introduction, signals are Godot's version of the diff --git a/tutorials/2d/2d_lights_and_shadows.rst b/tutorials/2d/2d_lights_and_shadows.rst index e8c5342484f..e7f4d193ae3 100644 --- a/tutorials/2d/2d_lights_and_shadows.rst +++ b/tutorials/2d/2d_lights_and_shadows.rst @@ -216,7 +216,7 @@ Manually drawing a light occluder ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Create a LightOccluder2D node, then select the node and click the "+" button at -the top top of the 2D editor. When asked to create a polygon resource, answer +the top of the 2D editor. When asked to create a polygon resource, answer **Yes**. You can then start drawing an occluder polygon by clicking to create new points. You can remove existing points by right-clicking them, and you can create new points from the existing line by clicking on the line then dragging. diff --git a/tutorials/3d/procedural_geometry/surfacetool.rst b/tutorials/3d/procedural_geometry/surfacetool.rst index f63bda50f79..aee6e652184 100644 --- a/tutorials/3d/procedural_geometry/surfacetool.rst +++ b/tutorials/3d/procedural_geometry/surfacetool.rst @@ -95,7 +95,7 @@ note, ``generate_normals()`` only works if the primitive type is set to ``Mesh.P You may notice that normal mapping or other material properties look broken on the generated mesh. This is because normal mapping **requires** the mesh to feature *tangents*, which are separate from *normals*. You can either add custom -tangents manually, or generate them automatically with with +tangents manually, or generate them automatically with ``generate_tangents()``. This method requires that each vertex have UVs and normals set already. diff --git a/tutorials/animation/introduction.rst b/tutorials/animation/introduction.rst index 46424483347..0b6370a1d0a 100644 --- a/tutorials/animation/introduction.rst +++ b/tutorials/animation/introduction.rst @@ -86,7 +86,7 @@ at various points, and change their timing. Each line in the Animation Panel is an animation track that references a Normal or Transform property of a node. Each track stores a path to a node and its affected property. For example, the position track -in the illustration refers to to the ``position`` property of the Sprite2D +in the illustration refers to the ``position`` property of the Sprite2D node. .. figure:: img/animation_normal_track.png diff --git a/tutorials/assets_pipeline/escn_exporter/animation.rst b/tutorials/assets_pipeline/escn_exporter/animation.rst index 65066d77283..7ab057e16de 100644 --- a/tutorials/assets_pipeline/escn_exporter/animation.rst +++ b/tutorials/assets_pipeline/escn_exporter/animation.rst @@ -34,7 +34,7 @@ Or it can be done stashing the action in ``Dope Sheet`` An NLA track can be ``mute`` or ``unmute``, the exporter will export all the ``mute`` NLA track as a separate action, while blends all the ``unmute`` -NLA tracks into every action (including the action action) being exported. +NLA tracks into every action (including the action) being exported. .. image:: img/nla_strip.jpg diff --git a/tutorials/audio/audio_effects.rst b/tutorials/audio/audio_effects.rst index 72bf61c04c4..eada442a546 100644 --- a/tutorials/audio/audio_effects.rst +++ b/tutorials/audio/audio_effects.rst @@ -91,7 +91,7 @@ a low-quality speaker or device. EQ ~~ -EQ is what all other equalizers inherit from. It can be extended with with Custom +EQ is what all other equalizers inherit from. It can be extended with Custom scripts to create an equalizer with a custom number of bands. EQ6, EQ10, EQ21 diff --git a/tutorials/platform/android/android_in_app_purchases.rst b/tutorials/platform/android/android_in_app_purchases.rst index 71333691886..fb7ba07bc4e 100644 --- a/tutorials/platform/android/android_in_app_purchases.rst +++ b/tutorials/platform/android/android_in_app_purchases.rst @@ -94,7 +94,7 @@ Query available items ********************* Once the API has connected, query SKUs using ``querySkuDetails()``. You must successfully complete -a SKU query before before calling the ``purchase()`` or ``queryPurchases()`` functions, +a SKU query before calling the ``purchase()`` or ``queryPurchases()`` functions, or they will return an error. ``querySkuDetails()`` takes two parameters: an array of SKU name strings, and a string specifying the type of SKU being queried. The SKU type string should be ``"inapp"`` for normal in-app purchases or ``"subs"`` for subscriptions. diff --git a/tutorials/platform/ios/plugins_for_ios.rst b/tutorials/platform/ios/plugins_for_ios.rst index ec84d3aeb33..5fa7a3d84f9 100644 --- a/tutorials/platform/ios/plugins_for_ios.rst +++ b/tutorials/platform/ios/plugins_for_ios.rst @@ -184,7 +184,7 @@ The response event will be a dictionary with the following fields: "invalid_ids": [ list of requested IDs that were invalid ], "ids": [ list of IDs that were valid ], "titles": [ list of valid product titles (corresponds with list of valid IDs) ], - "descriptions": [ list of valid product descriptions ] , + "descriptions": [ list of valid product descriptions ], "prices": [ list of valid product prices ], "localized_prices": [ list of valid product localized prices ], } diff --git a/tutorials/platform/web/customizing_html5_shell.rst b/tutorials/platform/web/customizing_html5_shell.rst index 68e7f29fb20..69c9a6e7848 100644 --- a/tutorials/platform/web/customizing_html5_shell.rst +++ b/tutorials/platform/web/customizing_html5_shell.rst @@ -101,7 +101,7 @@ optionally overriding any :js:attr:`EngineConfig` parameters. }); This snippet of code automatically loads and initializes the engine before starting the game. -It uses the given configuration to to load the engine. The :js:meth:`engine.startGame ` +It uses the given configuration to load the engine. The :js:meth:`engine.startGame ` method is asynchronous and returns a ``Promise``. This allows your control code to track if the game was loaded correctly without blocking execution or relying on polling. diff --git a/tutorials/rendering/jitter_stutter.rst b/tutorials/rendering/jitter_stutter.rst index 2dc52b4961f..57386520198 100644 --- a/tutorials/rendering/jitter_stutter.rst +++ b/tutorials/rendering/jitter_stutter.rst @@ -220,7 +220,7 @@ better troubleshoot it. If you are reporting input lag problems, please include a capture made with a high speed camera (such as your phone's slow motion video mode). The capture **must** have both the screen and the input device visible so that the number of -frames between an input and the on-screen result can can be counted. Also, make +frames between an input and the on-screen result can be counted. Also, make sure to mention your monitor's refresh rate and your input device's polling rate (especially for mice). From 837ac94c0a614742ec6978aa2fc20854e71dfc89 Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Wed, 31 May 2023 18:54:05 +0200 Subject: [PATCH 44/76] Fix NavigationLink doc using old property names Fixes NavigationLink doc using old property names --- .../navigation_using_navigationlinks.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tutorials/navigation/navigation_using_navigationlinks.rst b/tutorials/navigation/navigation_using_navigationlinks.rst index 60b2d786e11..642ecb30223 100644 --- a/tutorials/navigation/navigation_using_navigationlinks.rst +++ b/tutorials/navigation/navigation_using_navigationlinks.rst @@ -5,7 +5,7 @@ Using NavigationLinks .. image:: img/nav_navmesh_links.png -NavigationLinks are used to connect navmesh polygons from :ref:`NavigationRegion2D` +NavigationLinks are used to connect navigation mesh polygons from :ref:`NavigationRegion2D` and :ref:`NavigationRegion3D` over arbitrary distances for pathfinding. NavigationLinks are also used to consider movement shortcuts in pathfinding available through @@ -15,7 +15,7 @@ interacting with gameplay objects e.g. ladders, jump pads or teleports. :ref:`NavigationLink2D` and :ref:`NavigationLink3D` respectively. -Different NavigationRegions can connect their navmeshes without the need for a NavigationLink +Different NavigationRegions can connect their navigation meshes without the need for a NavigationLink as long as they are within navigation map ``edge_connection_margin`` and have compatible ``navigation_layers``. As soon as the distance becomes too large, building valid connections becomes a problem - a problem that NavigationLinks can solve. @@ -26,17 +26,17 @@ See :ref:`doc_navigation_connecting_navmesh` to learn more about how to connect NavigationLinks share many properties with NavigationRegions like ``navigation_layers``. NavigationLinks add a single connection between two positions over an arbitrary distance -compared to NavigationRegions that add a more local traversable area with a navmesh resource. +compared to NavigationRegions that add a more local traversable area with a navigation mesh resource. -NavigationLinks have a ``start_location`` and ``end_location`` and can go in both directions when ``bidirectional`` is enabled. -When placed a navigationlink connects the navmesh polygons closest to its ``start_location`` and ``end_location`` within search radius for pathfinding. +NavigationLinks have a ``start_position`` and ``end_position`` and can go in both directions when ``bidirectional`` is enabled. +When placed a navigationlink connects the navigation mesh polygons closest to its ``start_position`` and ``end_position`` within search radius for pathfinding. The polygon search radius can be configured globally in the ProjectSettings under ``navigation/2d_or_3d/default_link_connection_radius`` or set for each navigation ``map`` individually using the ``NavigationServer.map_set_link_connection_radius()`` function. -Both ``start_location`` and ``end_location`` have debug markers in the Editor. +Both ``start_position`` and ``end_position`` have debug markers in the Editor. The visible radius of a position shows the polygon search radius. -All navmesh polygons inside are compared and the closest is picked for the edge connection. +All navigation mesh polygons inside are compared and the closest is picked for the edge connection. If no valid polygon is found within the search radius the navigation link gets disabled. .. image:: img/nav_link_debug_visuals.png From 15e35f27d2ece4db235005bc76ccb8faf2aaa237 Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Thu, 1 Jun 2023 11:40:13 +0200 Subject: [PATCH 45/76] Update navigation examples that use NavigationMesh.create_from_mesh() Updates navigation examples that use NavigationMesh.create_from_mesh() --- .../navigation_using_navigationmeshes.rst | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/tutorials/navigation/navigation_using_navigationmeshes.rst b/tutorials/navigation/navigation_using_navigationmeshes.rst index 7b8626b5cc5..d5ce14994f9 100644 --- a/tutorials/navigation/navigation_using_navigationmeshes.rst +++ b/tutorials/navigation/navigation_using_navigationmeshes.rst @@ -208,16 +208,22 @@ The following script creates a new 3D navigation region and fills it with proced NavigationServer3D.region_set_map(new_3d_region_rid, default_3d_map_rid) var new_navigation_mesh: NavigationMesh = NavigationMesh.new() - var new_plane_mesh: PlaneMesh = PlaneMesh.new() - new_plane_mesh.size = Vector2(10.0, 10.0) - new_navigation_mesh.create_from_mesh(new_plane_mesh) - + # Add vertices for a triangle. + new_navigation_mesh.vertices = PackedVector3Array([ + Vector3(-1.0, 0.0, 1.0), + Vector3(1.0, 0.0, 1.0), + Vector3(1.0, 0.0, -1.0) + ]) + # Add indices for the polygon. + new_navigation_mesh.add_polygon( + PackedInt32Array([0, 1, 2]) + ) NavigationServer3D.region_set_navigation_mesh(new_3d_region_rid, new_navigation_mesh) Navmesh for 3D GridMaps ~~~~~~~~~~~~~~~~~~~~~~~ -The following script creates a new 3D navmesh from the mesh of a GridMap item, clears the current grid cells and adds new procedual grid cells with the new navmesh. +The following script creates a new 3D navigation mesh for each GridMap items, clears the current grid cells and adds new procedual grid cells with the new navigation mesh. .. tabs:: .. code-tab:: gdscript GDScript @@ -227,12 +233,21 @@ The following script creates a new 3D navmesh from the mesh of a GridMap item, c # enable navigation mesh for grid items set_bake_navigation(true) - # get mesh from grid item, bake and set a new navigation mesh for the library + # get grid items, create and set a new navigation mesh for each item in the MeshLibrary var gridmap_item_list: PackedInt32Array = mesh_library.get_item_list() for item in gridmap_item_list: - var item_mesh: Mesh = mesh_library.get_item_mesh(item) var new_item_navigation_mesh: NavigationMesh = NavigationMesh.new() - new_item_navigation_mesh.create_from_mesh(item_mesh) + # Add vertices and polygons that describe the traversable ground surface. + # E.g. for a convex polygon that resembles a flat square. + new_item_navigation_mesh.vertices = PackedVector3Array([ + Vector3(-1.0, 0.0, 1.0), + Vector3(1.0, 0.0, 1.0), + Vector3(1.0, 0.0, -1.0), + Vector3(-1.0, 0.0, -1.0), + ]) + new_item_navigation_mesh.add_polygon( + PackedInt32Array([0, 1, 2, 3]) + ) mesh_library.set_item_navigation_mesh(item, new_item_navigation_mesh) mesh_library.set_item_navigation_mesh_transform(item, Transform3D()) From a54fffd60a18a01df1e04eafa7271bfc2d18b66c Mon Sep 17 00:00:00 2001 From: Anthony Good Date: Thu, 1 Jun 2023 20:44:17 +0100 Subject: [PATCH 46/76] Access NoiseType on FastNoiseLite class Fixes 'Identifier "NoiseType" not declared in the current scope' when following example. --- tutorials/math/random_number_generation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/math/random_number_generation.rst b/tutorials/math/random_number_generation.rst index c31a1d5c079..e11b1f40d12 100644 --- a/tutorials/math/random_number_generation.rst +++ b/tutorials/math/random_number_generation.rst @@ -445,7 +445,7 @@ terrain. Godot provides :ref:`class_fastnoiselite` for this, which supports func _ready(): randomize() # Configure the FastNoiseLite instance. - _noise.noise_type = NoiseType.TYPE_SIMPLEX_SMOOTH + _noise.noise_type = FastNoiseLite.NoiseType.TYPE_SIMPLEX_SMOOTH _noise.seed = randi() _noise.fractal_octaves = 4 _noise.frequency = 1.0 / 20.0 From b360bbc40bde30d151e38e30a40e54ba6220e3f5 Mon Sep 17 00:00:00 2001 From: Angad Singh Josan <97420031+ajosan25@users.noreply.github.com> Date: Fri, 2 Jun 2023 03:31:28 -0700 Subject: [PATCH 47/76] Include collide_with_areas in ray-casting.rst (#7449) Co-authored-by: Raul Santos --- tutorials/physics/ray-casting.rst | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tutorials/physics/ray-casting.rst b/tutorials/physics/ray-casting.rst index 4992dd3273f..7741ae9b5ac 100644 --- a/tutorials/physics/ray-casting.rst +++ b/tutorials/physics/ray-casting.rst @@ -151,7 +151,24 @@ data: metadata: Variant() # metadata of collider } -The data is similar in 3D space, using Vector3 coordinates. +The data is similar in 3D space, using Vector3 coordinates. Note that to enable collisions +with Area3D, the boolean parameter ``collide_with_areas`` must be set to ``true``. + +.. tabs:: + .. code-tab:: gdscript GDScript + const RAY_LENGTH = 1000 + + func _physics_process(delta): + var space_state = get_world_3d().direct_space_state + var cam = $Camera3D + var mousepos = get_viewport().get_mouse_position() + + var origin = cam.project_ray_origin(mousepos) + var end = origin + cam.project_ray_normal(mousepos) * RAY_LENGTH + var query = PhysicsRayQueryParameters3D.create(origin, end) + query.collide_with_areas = true + + var result = space_state.intersect_ray(query) Collision exceptions -------------------- @@ -278,6 +295,5 @@ To obtain it using a camera, the following code can be used: } } - Remember that during ``_input()``, the space may be locked, so in practice this query should be run in ``_physics_process()``. From 9056197dded70ccd287de9d604dab3af6d84d09c Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 2 Jun 2023 13:17:26 +0200 Subject: [PATCH 48/76] Fix canvas_items stretch mode name in Multiple resolutions --- tutorials/rendering/multiple_resolutions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/rendering/multiple_resolutions.rst b/tutorials/rendering/multiple_resolutions.rst index 7e125ca7d46..7bf8b783c89 100644 --- a/tutorials/rendering/multiple_resolutions.rst +++ b/tutorials/rendering/multiple_resolutions.rst @@ -147,7 +147,7 @@ demonstrate the effect of different stretch modes. A single sprite, also .. image:: img/stretch_disabled_expand.gif -- **Stretch Mode = 2D**: In this mode, the base size specified in +- **Stretch Mode = Canvas Items**: In this mode, the base size specified in width and height in the project settings is stretched to cover the whole screen (taking the **Stretch Aspect** setting into account). This means that everything is rendered From f9340bddb2413a7db6779ddc70a2acf9904da187 Mon Sep 17 00:00:00 2001 From: Godot Organization Date: Sat, 3 Jun 2023 03:19:05 +0000 Subject: [PATCH 49/76] classref: Sync with current master branch (543750a) --- classes/class_@gdscript.rst | 4 +- classes/class_@globalscope.rst | 6 +- classes/class_aabb.rst | 2 +- classes/class_acceptdialog.rst | 4 +- classes/class_aescontext.rst | 4 +- classes/class_animatablebody2d.rst | 8 +- classes/class_animatablebody3d.rst | 10 +- classes/class_animationnode.rst | 34 ++--- classes/class_animationnodeadd2.rst | 6 +- classes/class_animationnodeadd3.rst | 10 +- classes/class_animationnodeblend2.rst | 4 +- classes/class_animationnodeblend3.rst | 12 +- classes/class_animationnodeblendspace1d.rst | 2 +- classes/class_animationnodeblendspace2d.rst | 2 +- classes/class_animationnodeblendtree.rst | 22 +-- classes/class_animationnodeoneshot.rst | 8 +- classes/class_animationnodestatemachine.rst | 20 +-- ...lass_animationnodestatemachineplayback.rst | 2 +- classes/class_animationnodesub2.rst | 42 ++++++ classes/class_animationnodesync.rst | 2 +- classes/class_animationnodetimeseek.rst | 2 +- classes/class_animationnodetransition.rst | 4 +- classes/class_animationplayer.rst | 2 + classes/class_animationrootnode.rst | 2 + classes/class_area2d.rst | 8 +- classes/class_area3d.rst | 12 +- classes/class_array.rst | 6 +- classes/class_arrayoccluder3d.rst | 12 +- classes/class_aspectratiocontainer.rst | 6 +- classes/class_astar2d.rst | 10 +- classes/class_astar3d.rst | 6 +- classes/class_astargrid2d.rst | 8 +- .../class_audiostreamplaybackpolyphonic.rst | 2 +- classes/class_basebutton.rst | 4 +- classes/class_basis.rst | 10 +- classes/class_bool.rst | 92 +++--------- classes/class_boxcontainer.rst | 6 +- classes/class_boxshape3d.rst | 6 +- classes/class_button.rst | 8 +- classes/class_buttongroup.rst | 6 +- classes/class_callable.rst | 2 +- classes/class_camera3d.rst | 12 +- classes/class_canvasitem.rst | 14 +- classes/class_canvaslayer.rst | 10 +- classes/class_canvasmodulate.rst | 4 +- classes/class_capsuleshape2d.rst | 6 +- classes/class_capsuleshape3d.rst | 6 +- classes/class_centercontainer.rst | 6 +- classes/class_characterbody2d.rst | 8 +- classes/class_characterbody3d.rst | 10 +- classes/class_checkbox.rst | 6 +- classes/class_checkbutton.rst | 4 +- classes/class_circleshape2d.rst | 6 +- classes/class_classdb.rst | 2 +- classes/class_codeedit.rst | 6 +- classes/class_codehighlighter.rst | 4 +- classes/class_collisionobject2d.rst | 4 +- classes/class_collisionobject3d.rst | 6 +- classes/class_collisionpolygon2d.rst | 8 +- classes/class_collisionpolygon3d.rst | 8 +- classes/class_collisionshape2d.rst | 6 +- classes/class_collisionshape3d.rst | 8 +- classes/class_color.rst | 16 +-- classes/class_colorpicker.rst | 6 +- classes/class_colorpickerbutton.rst | 4 +- classes/class_colorrect.rst | 19 +-- classes/class_concavepolygonshape2d.rst | 16 +-- classes/class_concavepolygonshape3d.rst | 16 +-- classes/class_conetwistjoint3d.rst | 8 +- classes/class_confirmationdialog.rst | 4 +- classes/class_container.rst | 8 +- classes/class_control.rst | 6 +- classes/class_convexpolygonshape2d.rst | 12 +- classes/class_convexpolygonshape3d.rst | 12 +- classes/class_crypto.rst | 6 +- classes/class_cylindershape3d.rst | 6 +- classes/class_dampedspringjoint2d.rst | 4 +- classes/class_dictionary.rst | 16 +-- classes/class_diraccess.rst | 6 +- classes/class_displayserver.rst | 132 +++++++++--------- classes/class_editorfiledialog.rst | 2 +- classes/class_editorimportplugin.rst | 8 +- classes/class_editorinterface.rst | 2 +- classes/class_editornode3dgizmoplugin.rst | 2 +- classes/class_editorproperty.rst | 4 +- classes/class_editorresourcepreview.rst | 4 +- classes/class_editorresourcetooltipplugin.rst | 38 +++-- classes/class_editorsettings.rst | 30 +--- classes/class_editorsyntaxhighlighter.rst | 4 +- classes/class_engine.rst | 2 +- classes/class_fileaccess.rst | 23 +-- classes/class_filedialog.rst | 4 +- classes/class_filesystemdock.rst | 4 +- classes/class_float.rst | 20 ++- classes/class_flowcontainer.rst | 11 +- classes/class_font.rst | 4 +- classes/class_fontfile.rst | 6 +- classes/class_fontvariation.rst | 4 +- classes/class_generic6dofjoint3d.rst | 6 +- classes/class_geometry2d.rst | 4 +- classes/class_geometry3d.rst | 4 +- classes/class_gltfstate.rst | 20 ++- classes/class_gradient.rst | 71 ++++++++-- classes/class_gradienttexture2d.rst | 8 ++ classes/class_graphedit.rst | 8 +- classes/class_graphnode.rst | 10 +- classes/class_gridcontainer.rst | 10 +- classes/class_groovejoint2d.rst | 4 +- classes/class_hashingcontext.rst | 4 +- classes/class_hboxcontainer.rst | 6 +- classes/class_heightmapshape3d.rst | 6 +- classes/class_hflowcontainer.rst | 11 +- classes/class_hingejoint3d.rst | 4 +- classes/class_hscrollbar.rst | 4 +- classes/class_hseparator.rst | 4 +- classes/class_hslider.rst | 6 +- classes/class_hsplitcontainer.rst | 6 +- classes/class_httpclient.rst | 2 +- classes/class_httprequest.rst | 8 +- classes/class_input.rst | 10 +- classes/class_inputevent.rst | 6 +- classes/class_inputeventaction.rst | 6 +- classes/class_inputeventfromwindow.rst | 2 +- classes/class_inputeventgesture.rst | 11 +- classes/class_inputeventjoypadbutton.rst | 4 +- classes/class_inputeventjoypadmotion.rst | 6 +- classes/class_inputeventkey.rst | 8 +- classes/class_inputeventmagnifygesture.rst | 13 +- classes/class_inputeventmidi.rst | 4 +- classes/class_inputeventmouse.rst | 4 +- classes/class_inputeventmousebutton.rst | 6 +- classes/class_inputeventmousemotion.rst | 6 +- classes/class_inputeventpangesture.rst | 11 +- classes/class_inputeventscreendrag.rst | 6 +- classes/class_inputeventscreentouch.rst | 8 +- classes/class_inputeventshortcut.rst | 4 +- classes/class_inputeventwithmodifiers.rst | 6 +- classes/class_inputmap.rst | 4 +- classes/class_int.rst | 2 +- classes/class_itemlist.rst | 8 +- classes/class_javascriptobject.rst | 2 +- classes/class_joint2d.rst | 4 +- classes/class_joint3d.rst | 4 +- classes/class_kinematiccollision2d.rst | 6 +- classes/class_kinematiccollision3d.rst | 6 +- classes/class_label.rst | 6 +- classes/class_label3d.rst | 4 +- classes/class_labelsettings.rst | 4 +- classes/class_lineedit.rst | 22 ++- classes/class_linkbutton.rst | 4 +- classes/class_margincontainer.rst | 8 +- classes/class_menubar.rst | 4 +- classes/class_menubutton.rst | 6 +- classes/class_mesh.rst | 8 +- classes/class_missingnode.rst | 6 +- classes/class_missingresource.rst | 6 +- classes/class_mutex.rst | 16 ++- classes/class_navigationagent2d.rst | 8 +- classes/class_navigationagent3d.rst | 8 +- classes/class_navigationlink2d.rst | 4 +- classes/class_navigationlink3d.rst | 4 +- classes/class_navigationmesh.rst | 2 +- .../class_navigationpathqueryparameters2d.rst | 4 +- .../class_navigationpathqueryparameters3d.rst | 4 +- classes/class_navigationpathqueryresult2d.rst | 4 +- classes/class_navigationpathqueryresult3d.rst | 4 +- classes/class_navigationpolygon.rst | 2 +- classes/class_navigationregion2d.rst | 6 +- classes/class_navigationregion3d.rst | 4 +- classes/class_navigationserver2d.rst | 12 +- classes/class_navigationserver3d.rst | 10 +- classes/class_ninepatchrect.rst | 4 +- classes/class_node.rst | 2 +- classes/class_nodepath.rst | 4 +- classes/class_noisetexture2d.rst | 18 +-- classes/class_noisetexture3d.rst | 10 +- classes/class_object.rst | 14 +- classes/class_optimizedtranslation.rst | 4 +- classes/class_optionbutton.rst | 8 +- classes/class_os.rst | 8 +- classes/class_packeddatacontainerref.rst | 2 +- classes/class_packedfloat32array.rst | 12 ++ classes/class_packedfloat64array.rst | 12 ++ classes/class_packedvector2array.rst | 12 ++ classes/class_packedvector3array.rst | 12 ++ classes/class_panel.rst | 6 +- classes/class_panelcontainer.rst | 6 +- classes/class_parallaxbackground.rst | 2 + classes/class_physicsbody2d.rst | 4 +- classes/class_physicsbody3d.rst | 6 +- classes/class_physicsdirectbodystate2d.rst | 4 +- ...lass_physicsdirectbodystate2dextension.rst | 11 +- classes/class_physicsdirectbodystate3d.rst | 4 +- ...lass_physicsdirectbodystate3dextension.rst | 11 +- classes/class_physicsdirectspacestate2d.rst | 4 +- ...ass_physicsdirectspacestate2dextension.rst | 11 +- classes/class_physicsdirectspacestate3d.rst | 4 +- ...ass_physicsdirectspacestate3dextension.rst | 11 +- classes/class_physicsmaterial.rst | 4 +- .../class_physicspointqueryparameters2d.rst | 4 +- .../class_physicspointqueryparameters3d.rst | 4 +- classes/class_physicsrayqueryparameters2d.rst | 4 +- classes/class_physicsrayqueryparameters3d.rst | 4 +- classes/class_physicsserver2d.rst | 8 +- classes/class_physicsserver2dextension.rst | 11 +- classes/class_physicsserver2dmanager.rst | 4 +- classes/class_physicsserver3d.rst | 18 ++- classes/class_physicsserver3dextension.rst | 11 +- classes/class_physicsserver3dmanager.rst | 4 +- ..._physicsserver3drenderingserverhandler.rst | 4 +- .../class_physicsshapequeryparameters2d.rst | 4 +- .../class_physicsshapequeryparameters3d.rst | 4 +- .../class_physicstestmotionparameters2d.rst | 4 +- .../class_physicstestmotionparameters3d.rst | 4 +- classes/class_physicstestmotionresult2d.rst | 4 +- classes/class_physicstestmotionresult3d.rst | 4 +- classes/class_pinjoint2d.rst | 4 +- classes/class_pinjoint3d.rst | 4 +- classes/class_plane.rst | 4 +- classes/class_popup.rst | 4 +- classes/class_popupmenu.rst | 10 +- classes/class_popuppanel.rst | 6 +- classes/class_progressbar.rst | 4 +- classes/class_projection.rst | 4 +- classes/class_projectsettings.rst | 46 +++++- classes/class_randomnumbergenerator.rst | 10 +- classes/class_range.rst | 16 +-- classes/class_raycast2d.rst | 12 +- classes/class_raycast3d.rst | 12 +- classes/class_rect2.rst | 2 +- classes/class_rect2i.rst | 2 +- classes/class_rectangleshape2d.rst | 6 +- classes/class_referencerect.rst | 6 +- classes/class_renderingdevice.rst | 2 +- classes/class_renderingserver.rst | 8 +- classes/class_resource.rst | 4 +- classes/class_resourceimporter.rst | 4 +- classes/class_resourceloader.rst | 4 +- classes/class_resourcepreloader.rst | 2 +- classes/class_resourcesaver.rst | 6 +- classes/class_resourceuid.rst | 8 +- classes/class_richtexteffect.rst | 4 +- classes/class_richtextlabel.rst | 8 +- classes/class_rid.rst | 2 +- classes/class_rigidbody2d.rst | 12 +- classes/class_rigidbody3d.rst | 10 +- classes/class_scenestate.rst | 4 +- classes/class_scriptcreatedialog.rst | 2 +- classes/class_scripteditor.rst | 4 +- classes/class_scripteditorbase.rst | 2 +- classes/class_scrollbar.rst | 4 +- classes/class_scrollcontainer.rst | 10 +- classes/class_segmentshape2d.rst | 6 +- classes/class_semaphore.rst | 14 +- classes/class_separationrayshape2d.rst | 6 +- classes/class_separationrayshape3d.rst | 6 +- classes/class_separator.rst | 4 +- classes/class_shape2d.rst | 6 +- classes/class_shape3d.rst | 6 +- classes/class_shapecast2d.rst | 10 +- classes/class_shapecast3d.rst | 10 +- classes/class_signal.rst | 2 +- classes/class_skeleton3d.rst | 6 +- classes/class_slider.rst | 6 +- classes/class_sliderjoint3d.rst | 4 +- classes/class_softbody3d.rst | 6 +- classes/class_sphereshape3d.rst | 6 +- classes/class_spinbox.rst | 4 +- classes/class_splitcontainer.rst | 6 +- classes/class_springarm3d.rst | 10 +- classes/class_staticbody2d.rst | 12 +- classes/class_staticbody3d.rst | 14 +- classes/class_streampeer.rst | 8 +- classes/class_streampeerbuffer.rst | 4 +- classes/class_streampeergzip.rst | 4 +- classes/class_streampeertcp.rst | 4 +- classes/class_streampeertls.rst | 4 +- classes/class_string.rst | 4 +- classes/class_stringname.rst | 10 +- classes/class_stylebox.rst | 6 +- classes/class_styleboxempty.rst | 4 +- classes/class_styleboxflat.rst | 12 +- classes/class_styleboxline.rst | 4 +- classes/class_styleboxtexture.rst | 4 +- classes/class_subviewport.rst | 6 +- classes/class_subviewportcontainer.rst | 8 +- classes/class_surfacetool.rst | 4 +- classes/class_syntaxhighlighter.rst | 8 +- classes/class_systemfont.rst | 6 +- classes/class_tabbar.rst | 4 +- classes/class_tabcontainer.rst | 10 +- classes/class_textedit.rst | 4 +- classes/class_textline.rst | 2 +- classes/class_textparagraph.rst | 2 +- classes/class_textserver.rst | 6 +- classes/class_textserveradvanced.rst | 9 +- classes/class_textserverextension.rst | 4 +- classes/class_textserverfallback.rst | 11 +- classes/class_textservermanager.rst | 12 +- classes/class_texturebutton.rst | 2 +- classes/class_texturerect.rst | 4 +- classes/class_theme.rst | 4 +- classes/class_themedb.rst | 4 +- classes/class_thread.rst | 2 +- classes/class_time.rst | 2 +- classes/class_transform2d.rst | 4 +- classes/class_transform3d.rst | 4 +- classes/class_translation.rst | 4 +- classes/class_translationserver.rst | 18 +-- classes/class_tree.rst | 6 +- classes/class_treeitem.rst | 26 +++- classes/class_undoredo.rst | 10 +- classes/class_variant.rst | 5 +- classes/class_vboxcontainer.rst | 6 +- classes/class_vector2.rst | 16 ++- classes/class_vector2i.rst | 4 +- classes/class_vector3.rst | 16 ++- classes/class_vector3i.rst | 4 +- classes/class_vector4.rst | 16 ++- classes/class_vector4i.rst | 6 +- classes/class_vehiclebody3d.rst | 10 +- classes/class_vehiclewheel3d.rst | 6 +- classes/class_vflowcontainer.rst | 11 +- classes/class_videostreamplayer.rst | 4 +- classes/class_viewport.rst | 22 ++- classes/class_viewporttexture.rst | 12 +- classes/class_visualinstance3d.rst | 4 + classes/class_vscrollbar.rst | 4 +- classes/class_vseparator.rst | 4 +- classes/class_vslider.rst | 6 +- classes/class_vsplitcontainer.rst | 6 +- classes/class_weakref.rst | 4 +- classes/class_window.rst | 42 ++++-- classes/class_world2d.rst | 4 +- classes/class_world3d.rst | 4 +- classes/class_worldboundaryshape2d.rst | 6 +- classes/class_worldboundaryshape3d.rst | 6 +- classes/class_xmlparser.rst | 4 +- classes/class_zippacker.rst | 6 +- classes/index.rst | 1 + 340 files changed, 1505 insertions(+), 1258 deletions(-) create mode 100644 classes/class_animationnodesub2.rst diff --git a/classes/class_@gdscript.rst b/classes/class_@gdscript.rst index 5b50257c835..b02122829b2 100644 --- a/classes/class_@gdscript.rst +++ b/classes/class_@gdscript.rst @@ -10,7 +10,7 @@ @GDScript ========= -Built-in GDScript functions. +Built-in GDScript constants, functions, and annotations. .. rst-class:: classref-introduction-group @@ -109,7 +109,7 @@ Positive floating-point infinity. This is the result of floating-point division **NAN** = ``nan`` -"Not a Number", an invalid floating-point value. :ref:`NAN` has special properties, including that it is not equal to itself (``NAN == NAN`` returns ``false``). It is output by some invalid operations, such as dividing floating-point ``0.0`` by ``0.0``. +"Not a Number", an invalid floating-point value. :ref:`NAN` has special properties, including that ``!=`` always returns ``true``, while other comparison operators always return ``false``. This is true even when comparing with itself (``NAN == NAN`` returns ``false`` and ``NAN != NAN`` returns ``true``). It is returned by some invalid operations, such as dividing floating-point ``0.0`` by ``0.0``. \ **Warning:** "Not a Number" is only a concept with floating-point numbers, and has no equivalent for integers. Dividing an integer ``0`` by ``0`` will not result in :ref:`NAN` and will result in a run-time error instead. diff --git a/classes/class_@globalscope.rst b/classes/class_@globalscope.rst index 26b8db1cf37..1d6c8cb06d9 100644 --- a/classes/class_@globalscope.rst +++ b/classes/class_@globalscope.rst @@ -5303,7 +5303,7 @@ A type-safe version of :ref:`ceil`, returning an :ref:`Variant` **clamp** **(** :ref:`Variant` value, :ref:`Variant` min, :ref:`Variant` max **)** -Clamps the ``value``, returning a :ref:`Variant` not less than ``min`` and not more than ``max``. Supported types: :ref:`int`, :ref:`float`, :ref:`Vector2`, :ref:`Vector2i`, :ref:`Vector3`, :ref:`Vector3i`, :ref:`Vector4`, :ref:`Vector4i`. +Clamps the ``value``, returning a :ref:`Variant` not less than ``min`` and not more than ``max``. Any values that can be compared with the less than and greater than operators will work. :: @@ -5325,7 +5325,7 @@ Clamps the ``value``, returning a :ref:`Variant` not less than `` var f = clamp(Vector3i(-7, -8, -9), Vector3i(-1, 2, 3), Vector3i(-4, -5, -6)) # f is (-4, -5, -6) -\ **Note:** For better type safety, use :ref:`clampf`, :ref:`clampi`, :ref:`Vector2.clamp`, :ref:`Vector2i.clamp`, :ref:`Vector3.clamp`, :ref:`Vector3i.clamp`, :ref:`Vector4.clamp`, or :ref:`Vector4i.clamp`. +\ **Note:** For better type safety, use :ref:`clampf`, :ref:`clampi`, :ref:`Vector2.clamp`, :ref:`Vector2i.clamp`, :ref:`Vector3.clamp`, :ref:`Vector3i.clamp`, :ref:`Vector4.clamp`, :ref:`Vector4i.clamp`, or :ref:`Color.clamp`. .. rst-class:: classref-item-separator @@ -6230,7 +6230,7 @@ The following BBCode tags are supported: ``b``, ``i``, ``u``, ``s``, ``indent``, Color tags only support the following named colors: ``black``, ``red``, ``green``, ``yellow``, ``blue``, ``magenta``, ``pink``, ``purple``, ``cyan``, ``white``, ``orange``, ``gray``. Hexadecimal color codes are not supported. -URL tags only support URLs wrapped by an URL tag, not URLs with a different title. +URL tags only support URLs wrapped by a URL tag, not URLs with a different title. When printing to standard output, the supported subset of BBCode is converted to ANSI escape codes for the terminal emulator to display. Support for ANSI escape codes varies across terminal emulators, especially for italic and strikethrough. In standard output, ``code`` is represented with faint text but without any font change. Unsupported tags are left as-is in standard output. diff --git a/classes/class_aabb.rst b/classes/class_aabb.rst index 3dce76104d7..ea5ab670e96 100644 --- a/classes/class_aabb.rst +++ b/classes/class_aabb.rst @@ -10,7 +10,7 @@ AABB ==== -Axis-Aligned Bounding Box. +A 3D axis-aligned bounding box. .. rst-class:: classref-introduction-group diff --git a/classes/class_acceptdialog.rst b/classes/class_acceptdialog.rst index 0ab313ec234..b7742ded138 100644 --- a/classes/class_acceptdialog.rst +++ b/classes/class_acceptdialog.rst @@ -14,14 +14,14 @@ AcceptDialog **Inherited By:** :ref:`ConfirmationDialog` -Base dialog for user notification. +A base dialog used for user notification. .. rst-class:: classref-introduction-group Description ----------- -This dialog is useful for small notifications to the user about an event. It can only be accepted or closed, with the same result. +The default use of **AcceptDialog** is to allow it to only be accepted or closed, with the same result. However, the :ref:`confirmed` and :ref:`canceled` signals allow to make the two actions different, and the :ref:`add_button` method allows to add custom buttons and actions. .. rst-class:: classref-reftable-group diff --git a/classes/class_aescontext.rst b/classes/class_aescontext.rst index 88c84a081f7..7face9d113d 100644 --- a/classes/class_aescontext.rst +++ b/classes/class_aescontext.rst @@ -12,14 +12,14 @@ AESContext **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Interface to low level AES encryption features. +Provides access to AES encryption/decryption of raw data. .. rst-class:: classref-introduction-group Description ----------- -This class provides access to AES encryption/decryption of raw data. Both AES-ECB and AES-CBC mode are supported. +This class holds the context information required for encryption and decryption operations with AES (Advanced Encryption Standard). Both AES-ECB and AES-CBC modes are supported. .. tabs:: diff --git a/classes/class_animatablebody2d.rst b/classes/class_animatablebody2d.rst index 8d9003e0f66..88eafe26ae4 100644 --- a/classes/class_animatablebody2d.rst +++ b/classes/class_animatablebody2d.rst @@ -12,18 +12,16 @@ AnimatableBody2D **Inherits:** :ref:`StaticBody2D` **<** :ref:`PhysicsBody2D` **<** :ref:`CollisionObject2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Physics body for 2D physics which moves only by script or animation (while affecting other bodies on its path). Useful for moving platforms and doors. +A 2D physics body that can't be moved by external forces. When moved manually, it affects other bodies in its path. .. rst-class:: classref-introduction-group Description ----------- -Animatable body for 2D physics. +An animatable 2D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, :ref:`AnimationPlayer`\ s (with :ref:`AnimationPlayer.playback_process_mode` set to ``ANIMATION_PROCESS_PHYSICS``), and :ref:`RemoteTransform2D`. -An animatable body can't be moved by external forces or contacts, but can be moved by script or animation to affect other bodies in its path. It is ideal for implementing moving objects in the environment, such as moving platforms or doors. - -When the body is moved manually, either from code or from an :ref:`AnimationPlayer` (with :ref:`AnimationPlayer.playback_process_mode` set to ``physics``), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). +When **AnimatableBody2D** is moved, its linear and angular velocity are estimated and used to affect other physics bodies in its path. This makes it useful for moving platforms, doors, and other moving objects. .. rst-class:: classref-reftable-group diff --git a/classes/class_animatablebody3d.rst b/classes/class_animatablebody3d.rst index 563e7eb7a85..38153de4ecb 100644 --- a/classes/class_animatablebody3d.rst +++ b/classes/class_animatablebody3d.rst @@ -12,20 +12,16 @@ AnimatableBody3D **Inherits:** :ref:`StaticBody3D` **<** :ref:`PhysicsBody3D` **<** :ref:`CollisionObject3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Physics body for 3D physics which moves only by script or animation (while affecting other bodies on its path). Useful for moving platforms and doors. +A 3D physics body that can't be moved by external forces. When moved manually, it affects other bodies in its path. .. rst-class:: classref-introduction-group Description ----------- -Animatable body for 3D physics. +An animatable 3D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, :ref:`AnimationPlayer`\ s (with :ref:`AnimationPlayer.playback_process_mode` set to ``ANIMATION_PROCESS_PHYSICS``), and :ref:`RemoteTransform3D`. -An animatable body can't be moved by external forces or contacts, but can be moved by script or animation to affect other bodies in its path. It is ideal for implementing moving objects in the environment, such as moving platforms or doors. - -When the body is moved manually, either from code or from an :ref:`AnimationPlayer` (with :ref:`AnimationPlayer.playback_process_mode` set to ``physics``), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). - -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +When **AnimatableBody3D** is moved, its linear and angular velocity are estimated and used to affect other physics bodies in its path. This makes it useful for moving platforms, doors, and other moving objects. .. rst-class:: classref-introduction-group diff --git a/classes/class_animationnode.rst b/classes/class_animationnode.rst index 8aa6db6d2b5..23f52a02932 100644 --- a/classes/class_animationnode.rst +++ b/classes/class_animationnode.rst @@ -23,7 +23,7 @@ Description Base resource for :ref:`AnimationTree` nodes. In general, it's not used directly, but you can create custom ones with custom blending formulas. -Inherit this when creating nodes mainly for use in :ref:`AnimationNodeBlendTree`, otherwise :ref:`AnimationRootNode` should be used instead. +Inherit this when creating animation nodes mainly for use in :ref:`AnimationNodeBlendTree`, otherwise :ref:`AnimationRootNode` should be used instead. .. rst-class:: classref-introduction-group @@ -111,7 +111,7 @@ Signals **animation_node_removed** **(** :ref:`int` object_id, :ref:`String` name **)** -Emitted by nodes that inherit from this class and that have an internal tree when one of their nodes removes. The nodes that emit this signal are :ref:`AnimationNodeBlendSpace1D`, :ref:`AnimationNodeBlendSpace2D`, :ref:`AnimationNodeStateMachine`, and :ref:`AnimationNodeBlendTree`. +Emitted by nodes that inherit from this class and that have an internal tree when one of their animation nodes removes. The animation nodes that emit this signal are :ref:`AnimationNodeBlendSpace1D`, :ref:`AnimationNodeBlendSpace2D`, :ref:`AnimationNodeStateMachine`, and :ref:`AnimationNodeBlendTree`. .. rst-class:: classref-item-separator @@ -123,7 +123,7 @@ Emitted by nodes that inherit from this class and that have an internal tree whe **animation_node_renamed** **(** :ref:`int` object_id, :ref:`String` old_name, :ref:`String` new_name **)** -Emitted by nodes that inherit from this class and that have an internal tree when one of their node names changes. The nodes that emit this signal are :ref:`AnimationNodeBlendSpace1D`, :ref:`AnimationNodeBlendSpace2D`, :ref:`AnimationNodeStateMachine`, and :ref:`AnimationNodeBlendTree`. +Emitted by nodes that inherit from this class and that have an internal tree when one of their animation node names changes. The animation nodes that emit this signal are :ref:`AnimationNodeBlendSpace1D`, :ref:`AnimationNodeBlendSpace2D`, :ref:`AnimationNodeStateMachine`, and :ref:`AnimationNodeBlendTree`. .. rst-class:: classref-item-separator @@ -135,7 +135,7 @@ Emitted by nodes that inherit from this class and that have an internal tree whe **tree_changed** **(** **)** -Emitted by nodes that inherit from this class and that have an internal tree when one of their nodes changes. The nodes that emit this signal are :ref:`AnimationNodeBlendSpace1D`, :ref:`AnimationNodeBlendSpace2D`, :ref:`AnimationNodeStateMachine`, :ref:`AnimationNodeBlendTree` and :ref:`AnimationNodeTransition`. +Emitted by nodes that inherit from this class and that have an internal tree when one of their animation nodes changes. The animation nodes that emit this signal are :ref:`AnimationNodeBlendSpace1D`, :ref:`AnimationNodeBlendSpace2D`, :ref:`AnimationNodeStateMachine`, :ref:`AnimationNodeBlendTree` and :ref:`AnimationNodeTransition`. .. rst-class:: classref-section-separator @@ -221,7 +221,7 @@ Method Descriptions :ref:`String` **_get_caption** **(** **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to override the text caption for this node. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to override the text caption for this animation node. .. rst-class:: classref-item-separator @@ -233,7 +233,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen :ref:`AnimationNode` **_get_child_by_name** **(** :ref:`StringName` name **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return a child node by its ``name``. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return a child animation node by its ``name``. .. rst-class:: classref-item-separator @@ -245,7 +245,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen :ref:`Dictionary` **_get_child_nodes** **(** **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return all children nodes in order as a ``name: node`` dictionary. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return all children animation nodes in order as a ``name: node`` dictionary. .. rst-class:: classref-item-separator @@ -257,7 +257,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen :ref:`Variant` **_get_parameter_default_value** **(** :ref:`StringName` parameter **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return the default value of a ``parameter``. Parameters are custom local memory used for your nodes, given a resource can be reused in multiple trees. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return the default value of a ``parameter``. Parameters are custom local memory used for your animation nodes, given a resource can be reused in multiple trees. .. rst-class:: classref-item-separator @@ -269,7 +269,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen :ref:`Array` **_get_parameter_list** **(** **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return a list of the properties on this node. Parameters are custom local memory used for your nodes, given a resource can be reused in multiple trees. Format is similar to :ref:`Object.get_property_list`. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return a list of the properties on this animation node. Parameters are custom local memory used for your animation nodes, given a resource can be reused in multiple trees. Format is similar to :ref:`Object.get_property_list`. .. rst-class:: classref-item-separator @@ -281,7 +281,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen :ref:`bool` **_has_filter** **(** **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return whether the blend tree editor should display filter editing on this node. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return whether the blend tree editor should display filter editing on this animation node. .. rst-class:: classref-item-separator @@ -293,7 +293,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen :ref:`bool` **_is_parameter_read_only** **(** :ref:`StringName` parameter **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return whether the ``parameter`` is read-only. Parameters are custom local memory used for your nodes, given a resource can be reused in multiple trees. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to return whether the ``parameter`` is read-only. Parameters are custom local memory used for your animation nodes, given a resource can be reused in multiple trees. .. rst-class:: classref-item-separator @@ -305,7 +305,7 @@ When inheriting from :ref:`AnimationRootNode`, implemen :ref:`float` **_process** **(** :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`bool` test_only **)** |virtual| |const| -When inheriting from :ref:`AnimationRootNode`, implement this virtual method to run some code when this node is processed. The ``time`` parameter is a relative delta, unless ``seek`` is ``true``, in which case it is absolute. +When inheriting from :ref:`AnimationRootNode`, implement this virtual method to run some code when this animation node is processed. The ``time`` parameter is a relative delta, unless ``seek`` is ``true``, in which case it is absolute. Here, call the :ref:`blend_input`, :ref:`blend_node` or :ref:`blend_animation` functions. You can also use :ref:`get_parameter` and :ref:`set_parameter` to modify local memory. @@ -321,7 +321,7 @@ This function should return the time left for the current animation to finish (i :ref:`bool` **add_input** **(** :ref:`String` name **)** -Adds an input to the node. This is only useful for nodes created for use in an :ref:`AnimationNodeBlendTree`. If the addition fails, returns ``false``. +Adds an input to the animation node. This is only useful for animation nodes created for use in an :ref:`AnimationNodeBlendTree`. If the addition fails, returns ``false``. .. rst-class:: classref-item-separator @@ -347,7 +347,7 @@ A ``looped_flag`` is used by internal processing immediately after the loop. See :ref:`float` **blend_input** **(** :ref:`int` input_index, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true, :ref:`bool` test_only=false **)** -Blend an input. This is only useful for nodes created for an :ref:`AnimationNodeBlendTree`. The ``time`` parameter is a relative delta, unless ``seek`` is ``true``, in which case it is absolute. A filter mode may be optionally passed (see :ref:`FilterAction` for options). +Blend an input. This is only useful for animation nodes created for an :ref:`AnimationNodeBlendTree`. The ``time`` parameter is a relative delta, unless ``seek`` is ``true``, in which case it is absolute. A filter mode may be optionally passed (see :ref:`FilterAction` for options). .. rst-class:: classref-item-separator @@ -359,7 +359,7 @@ Blend an input. This is only useful for nodes created for an :ref:`AnimationNode :ref:`float` **blend_node** **(** :ref:`StringName` name, :ref:`AnimationNode` node, :ref:`float` time, :ref:`bool` seek, :ref:`bool` is_external_seeking, :ref:`float` blend, :ref:`FilterAction` filter=0, :ref:`bool` sync=true, :ref:`bool` test_only=false **)** -Blend another animation node (in case this node contains children animation nodes). This function is only useful if you inherit from :ref:`AnimationRootNode` instead, else editors will not display your node for addition. +Blend another animation node (in case this animation node contains children animation nodes). This function is only useful if you inherit from :ref:`AnimationRootNode` instead, else editors will not display your animation node for addition. .. rst-class:: classref-item-separator @@ -383,7 +383,7 @@ Returns the input index which corresponds to ``name``. If not found, returns ``- :ref:`int` **get_input_count** **(** **)** |const| -Amount of inputs in this node, only useful for nodes that go into :ref:`AnimationNodeBlendTree`. +Amount of inputs in this animation node, only useful for animation nodes that go into :ref:`AnimationNodeBlendTree`. .. rst-class:: classref-item-separator @@ -407,7 +407,7 @@ Gets the name of an input by index. :ref:`Variant` **get_parameter** **(** :ref:`StringName` name **)** |const| -Gets the value of a parameter. Parameters are custom local memory used for your nodes, given a resource can be reused in multiple trees. +Gets the value of a parameter. Parameters are custom local memory used for your animation nodes, given a resource can be reused in multiple trees. .. rst-class:: classref-item-separator diff --git a/classes/class_animationnodeadd2.rst b/classes/class_animationnodeadd2.rst index a5d84302898..e365005da7e 100644 --- a/classes/class_animationnodeadd2.rst +++ b/classes/class_animationnodeadd2.rst @@ -19,7 +19,11 @@ Blends two animations additively inside of an :ref:`AnimationNodeBlendTree`. Blends two animations additively based on an amount value in the ``[0.0, 1.0]`` range. +A resource to add to an :ref:`AnimationNodeBlendTree`. Blends two animations additively based on the amount value. + +If the amount is greater than ``1.0``, the animation connected to "in" port is blended with the amplified animation connected to "add" port. + +If the amount is less than ``0.0``, the animation connected to "in" port is blended with the inverted animation connected to "add" port. .. rst-class:: classref-introduction-group diff --git a/classes/class_animationnodeadd3.rst b/classes/class_animationnodeadd3.rst index 9f7231ac6af..78109d78fc4 100644 --- a/classes/class_animationnodeadd3.rst +++ b/classes/class_animationnodeadd3.rst @@ -19,15 +19,17 @@ Blends two of three animations additively inside of an :ref:`AnimationNodeBlendT Description ----------- -A resource to add to an :ref:`AnimationNodeBlendTree`. Blends two animations together additively out of three based on a value in the ``[-1.0, 1.0]`` range. +A resource to add to an :ref:`AnimationNodeBlendTree`. Blends two animations out of three additively out of three based on the amounmt value. -This node has three inputs: +This animation node has three inputs: - The base animation to add to -- A -add animation to blend with when the blend amount is in the ``[-1.0, 0.0]`` range. +- A "-add" animation to blend with when the blend amount is negative -- A +add animation to blend with when the blend amount is in the ``[0.0, 1.0]`` range +- A "+add" animation to blend with when the blend amount is positive + +If the absolute value of the amount is greater than ``1.0``, the animation connected to "in" port is blended with the amplified animation connected to "-add"/"+add" port. .. rst-class:: classref-introduction-group diff --git a/classes/class_animationnodeblend2.rst b/classes/class_animationnodeblend2.rst index 211a716f3ab..abceca448ac 100644 --- a/classes/class_animationnodeblend2.rst +++ b/classes/class_animationnodeblend2.rst @@ -19,7 +19,9 @@ Blends two animations linearly inside of an :ref:`AnimationNodeBlendTree`. Blends two animations linearly based on an amount value in the ``[0.0, 1.0]`` range. +A resource to add to an :ref:`AnimationNodeBlendTree`. Blends two animations linearly based on the amount value. + +In general, the blend value should be in the ``[0.0, 1.0]`` range. Values outside of this range can blend amplified or inverted animations, however, :ref:`AnimationNodeAdd2` works better for this purpose. .. rst-class:: classref-introduction-group diff --git a/classes/class_animationnodeblend3.rst b/classes/class_animationnodeblend3.rst index 73b5678af8f..743ee5a56bf 100644 --- a/classes/class_animationnodeblend3.rst +++ b/classes/class_animationnodeblend3.rst @@ -19,15 +19,17 @@ Blends two of three animations linearly inside of an :ref:`AnimationNodeBlendTre Description ----------- -A resource to add to an :ref:`AnimationNodeBlendTree`. Blends two animations together linearly out of three based on a value in the ``[-1.0, 1.0]`` range. +A resource to add to an :ref:`AnimationNodeBlendTree`. Blends two animations out of three linearly out of three based on the amounmt value. -This node has three inputs: +This animation node has three inputs: -- The base animation +- The base animation to blend with -- A -blend animation to blend with when the blend amount is in the ``[-1.0, 0.0]`` range. +- A "-blend" animation to blend with when the blend amount is negative value -- A +blend animation to blend with when the blend amount is in the ``[0.0, 1.0]`` range +- A "+blend" animation to blend with when the blend amount is positive value + +In general, the blend value should be in the ``[-1.0, 1.0]`` range. Values outside of this range can blend amplified animations, however, :ref:`AnimationNodeAdd3` works better for this purpose. .. rst-class:: classref-introduction-group diff --git a/classes/class_animationnodeblendspace1d.rst b/classes/class_animationnodeblendspace1d.rst index abb31233fd4..0d9f8384315 100644 --- a/classes/class_animationnodeblendspace1d.rst +++ b/classes/class_animationnodeblendspace1d.rst @@ -107,7 +107,7 @@ The interpolation between animations is linear. :ref:`BlendMode` **BLEND_MODE_DISCRETE** = ``1`` -The blend space plays the animation of the node the blending position is closest to. Useful for frame-by-frame 2D animations. +The blend space plays the animation of the animation node which blending position is closest to. Useful for frame-by-frame 2D animations. .. _class_AnimationNodeBlendSpace1D_constant_BLEND_MODE_DISCRETE_CARRY: diff --git a/classes/class_animationnodeblendspace2d.rst b/classes/class_animationnodeblendspace2d.rst index c36929ea833..7638c947edd 100644 --- a/classes/class_animationnodeblendspace2d.rst +++ b/classes/class_animationnodeblendspace2d.rst @@ -138,7 +138,7 @@ The interpolation between animations is linear. :ref:`BlendMode` **BLEND_MODE_DISCRETE** = ``1`` -The blend space plays the animation of the node the blending position is closest to. Useful for frame-by-frame 2D animations. +The blend space plays the animation of the animation node which blending position is closest to. Useful for frame-by-frame 2D animations. .. _class_AnimationNodeBlendSpace2D_constant_BLEND_MODE_DISCRETE_CARRY: diff --git a/classes/class_animationnodeblendtree.rst b/classes/class_animationnodeblendtree.rst index 90da4bcb69b..48b1d6cec75 100644 --- a/classes/class_animationnodeblendtree.rst +++ b/classes/class_animationnodeblendtree.rst @@ -12,14 +12,14 @@ AnimationNodeBlendTree **Inherits:** :ref:`AnimationRootNode` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A sub-tree of blend type :ref:`AnimationNode`\ s used for complex animations. Used by :ref:`AnimationTree`. +A sub-tree of many type :ref:`AnimationNode`\ s used for complex animations. Used by :ref:`AnimationTree`. .. rst-class:: classref-introduction-group Description ----------- -This node may contain a sub-tree of any other blend type nodes, such as :ref:`AnimationNodeTransition`, :ref:`AnimationNodeBlend2`, :ref:`AnimationNodeBlend3`, :ref:`AnimationNodeOneShot`, etc. This is one of the most commonly used animation node roots. +This animation node may contain a sub-tree of any other type animation nodes, such as :ref:`AnimationNodeTransition`, :ref:`AnimationNodeBlend2`, :ref:`AnimationNodeBlend3`, :ref:`AnimationNodeOneShot`, etc. This is one of the most commonly used animation node roots. An :ref:`AnimationNodeOutput` node named ``output`` is created by default. @@ -164,7 +164,7 @@ Property Descriptions - void **set_graph_offset** **(** :ref:`Vector2` value **)** - :ref:`Vector2` **get_graph_offset** **(** **)** -The global offset of all sub-nodes. +The global offset of all sub animation nodes. .. rst-class:: classref-section-separator @@ -181,7 +181,7 @@ Method Descriptions void **add_node** **(** :ref:`StringName` name, :ref:`AnimationNode` node, :ref:`Vector2` position=Vector2(0, 0) **)** -Adds an :ref:`AnimationNode` at the given ``position``. The ``name`` is used to identify the created sub-node later. +Adds an :ref:`AnimationNode` at the given ``position``. The ``name`` is used to identify the created sub animation node later. .. rst-class:: classref-item-separator @@ -205,7 +205,7 @@ Connects the output of an :ref:`AnimationNode` as input for void **disconnect_node** **(** :ref:`StringName` input_node, :ref:`int` input_index **)** -Disconnects the node connected to the specified input. +Disconnects the animation node connected to the specified input. .. rst-class:: classref-item-separator @@ -217,7 +217,7 @@ Disconnects the node connected to the specified input. :ref:`AnimationNode` **get_node** **(** :ref:`StringName` name **)** |const| -Returns the sub-node with the specified ``name``. +Returns the sub animation node with the specified ``name``. .. rst-class:: classref-item-separator @@ -229,7 +229,7 @@ Returns the sub-node with the specified ``name``. :ref:`Vector2` **get_node_position** **(** :ref:`StringName` name **)** |const| -Returns the position of the sub-node with the specified ``name``. +Returns the position of the sub animation node with the specified ``name``. .. rst-class:: classref-item-separator @@ -241,7 +241,7 @@ Returns the position of the sub-node with the specified ``name``. :ref:`bool` **has_node** **(** :ref:`StringName` name **)** |const| -Returns ``true`` if a sub-node with specified ``name`` exists. +Returns ``true`` if a sub animation node with specified ``name`` exists. .. rst-class:: classref-item-separator @@ -253,7 +253,7 @@ Returns ``true`` if a sub-node with specified ``name`` exists. void **remove_node** **(** :ref:`StringName` name **)** -Removes a sub-node. +Removes a sub animation node. .. rst-class:: classref-item-separator @@ -265,7 +265,7 @@ Removes a sub-node. void **rename_node** **(** :ref:`StringName` name, :ref:`StringName` new_name **)** -Changes the name of a sub-node. +Changes the name of a sub animation node. .. rst-class:: classref-item-separator @@ -277,7 +277,7 @@ Changes the name of a sub-node. void **set_node_position** **(** :ref:`StringName` name, :ref:`Vector2` position **)** -Modifies the position of a sub-node. +Modifies the position of a sub animation node. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_animationnodeoneshot.rst b/classes/class_animationnodeoneshot.rst index 0dd9e199cc1..e28b64332da 100644 --- a/classes/class_animationnodeoneshot.rst +++ b/classes/class_animationnodeoneshot.rst @@ -19,7 +19,7 @@ Plays an animation once in an :ref:`AnimationNodeBlendTree`. This node will execute a sub-animation and return once it finishes. Blend times for fading in and out can be customized, as well as filters. +A resource to add to an :ref:`AnimationNodeBlendTree`. This animation node will execute a sub-animation and return once it finishes. Blend times for fading in and out can be customized, as well as filters. After setting the request and changing the animation playback, the one-shot node automatically clears the request on the next process frame by setting its ``request`` value to :ref:`ONE_SHOT_REQUEST_NONE`. @@ -56,13 +56,13 @@ After setting the request and changing the animation playback, the one-shot node .. code-tab:: csharp // Play child animation connected to "shot" port. - animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE); + animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Fire); // Abort child animation connected to "shot" port. - animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT); + animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Abort); // Abort child animation with fading out connected to "shot" port. - animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT); + animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.FadeOut); // Get current state (read-only). animationTree.Get("parameters/OneShot/active"); diff --git a/classes/class_animationnodestatemachine.rst b/classes/class_animationnodestatemachine.rst index 0161f01da9b..520a4021f01 100644 --- a/classes/class_animationnodestatemachine.rst +++ b/classes/class_animationnodestatemachine.rst @@ -19,7 +19,7 @@ A state machine with multiple :ref:`AnimationRootNode`\ Description ----------- -Contains multiple :ref:`AnimationRootNode`\ s representing animation states, connected in a graph. Node transitions can be configured to happen automatically or via code, using a shortest-path algorithm. Retrieve the :ref:`AnimationNodeStateMachinePlayback` object from the :ref:`AnimationTree` node to control it programmatically. +Contains multiple :ref:`AnimationRootNode`\ s representing animation states, connected in a graph. State transitions can be configured to happen automatically or via code, using a shortest-path algorithm. Retrieve the :ref:`AnimationNodeStateMachinePlayback` object from the :ref:`AnimationTree` node to control it programmatically. \ **Example:**\ @@ -221,7 +221,7 @@ Method Descriptions void **add_node** **(** :ref:`StringName` name, :ref:`AnimationNode` node, :ref:`Vector2` position=Vector2(0, 0) **)** -Adds a new node to the graph. The ``position`` is used for display in the editor. +Adds a new animation node to the graph. The ``position`` is used for display in the editor. .. rst-class:: classref-item-separator @@ -233,7 +233,7 @@ Adds a new node to the graph. The ``position`` is used for display in the editor void **add_transition** **(** :ref:`StringName` from, :ref:`StringName` to, :ref:`AnimationNodeStateMachineTransition` transition **)** -Adds a transition between the given nodes. +Adds a transition between the given animation nodes. .. rst-class:: classref-item-separator @@ -281,7 +281,7 @@ Returns the given animation node's name. :ref:`Vector2` **get_node_position** **(** :ref:`StringName` name **)** |const| -Returns the given node's coordinates. Used for display in the editor. +Returns the given animation node's coordinates. Used for display in the editor. .. rst-class:: classref-item-separator @@ -341,7 +341,7 @@ Returns the given transition's end node. :ref:`bool` **has_node** **(** :ref:`StringName` name **)** |const| -Returns ``true`` if the graph contains the given node. +Returns ``true`` if the graph contains the given animation node. .. rst-class:: classref-item-separator @@ -353,7 +353,7 @@ Returns ``true`` if the graph contains the given node. :ref:`bool` **has_transition** **(** :ref:`StringName` from, :ref:`StringName` to **)** |const| -Returns ``true`` if there is a transition between the given nodes. +Returns ``true`` if there is a transition between the given animation nodes. .. rst-class:: classref-item-separator @@ -365,7 +365,7 @@ Returns ``true`` if there is a transition between the given nodes. void **remove_node** **(** :ref:`StringName` name **)** -Deletes the given node from the graph. +Deletes the given animation node from the graph. .. rst-class:: classref-item-separator @@ -377,7 +377,7 @@ Deletes the given node from the graph. void **remove_transition** **(** :ref:`StringName` from, :ref:`StringName` to **)** -Deletes the transition between the two specified nodes. +Deletes the transition between the two specified animation nodes. .. rst-class:: classref-item-separator @@ -401,7 +401,7 @@ Deletes the given transition by index. void **rename_node** **(** :ref:`StringName` name, :ref:`StringName` new_name **)** -Renames the given node. +Renames the given animation node. .. rst-class:: classref-item-separator @@ -439,7 +439,7 @@ Sets the draw offset of the graph. Used for display in the editor. void **set_node_position** **(** :ref:`StringName` name, :ref:`Vector2` position **)** -Sets the node's coordinates. Used for display in the editor. +Sets the animation node's coordinates. Used for display in the editor. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_animationnodestatemachineplayback.rst b/classes/class_animationnodestatemachineplayback.rst index 2f5bc71ad84..412ac528b5c 100644 --- a/classes/class_animationnodestatemachineplayback.rst +++ b/classes/class_animationnodestatemachineplayback.rst @@ -33,7 +33,7 @@ Allows control of :ref:`AnimationTree` state machines creat .. code-tab:: csharp - var stateMachine = GetNode("AnimationTree").Get("parameters/playback") as AnimationNodeStateMachinePlayback; + var stateMachine = GetNode("AnimationTree").Get("parameters/playback").As(); stateMachine.Travel("some_state"); diff --git a/classes/class_animationnodesub2.rst b/classes/class_animationnodesub2.rst new file mode 100644 index 00000000000..7fdcd1b35c8 --- /dev/null +++ b/classes/class_animationnodesub2.rst @@ -0,0 +1,42 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/master/doc/classes/AnimationNodeSub2.xml. + +.. _class_AnimationNodeSub2: + +AnimationNodeSub2 +================= + +**Inherits:** :ref:`AnimationNodeSync` **<** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` + +Blends two animations subtractively inside of an :ref:`AnimationNodeBlendTree`. + +.. rst-class:: classref-introduction-group + +Description +----------- + +A resource to add to an :ref:`AnimationNodeBlendTree`. Blends two animations subtractively based on the amount value. + +This animation node is usually used for pre-calculation to cancel out any extra poses from the animation for the "add" animation source in :ref:`AnimationNodeAdd2` or :ref:`AnimationNodeAdd3`. + +In general, the blend value should be in the ``[0.0, 1.0]`` range, but values outside of this range can be used for amplified or inverted animations. + +\ **Note:** This calculation is different from using a negative value in :ref:`AnimationNodeAdd2`, since the transformation matrices do not satisfy the commutative law. **AnimationNodeSub2** multiplies the transformation matrix of the inverted animation from the left side, while negative :ref:`AnimationNodeAdd2` multiplies it from the right side. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`AnimationTree <../tutorials/animation/animation_tree>` + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` diff --git a/classes/class_animationnodesync.rst b/classes/class_animationnodesync.rst index 45f96b81239..b6afa72d80d 100644 --- a/classes/class_animationnodesync.rst +++ b/classes/class_animationnodesync.rst @@ -12,7 +12,7 @@ AnimationNodeSync **Inherits:** :ref:`AnimationNode` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -**Inherited By:** :ref:`AnimationNodeAdd2`, :ref:`AnimationNodeAdd3`, :ref:`AnimationNodeBlend2`, :ref:`AnimationNodeBlend3`, :ref:`AnimationNodeOneShot`, :ref:`AnimationNodeTransition` +**Inherited By:** :ref:`AnimationNodeAdd2`, :ref:`AnimationNodeAdd3`, :ref:`AnimationNodeBlend2`, :ref:`AnimationNodeBlend3`, :ref:`AnimationNodeOneShot`, :ref:`AnimationNodeSub2`, :ref:`AnimationNodeTransition` Base class for :ref:`AnimationNode`\ s with more than two input ports that must be synchronized. diff --git a/classes/class_animationnodetimeseek.rst b/classes/class_animationnodetimeseek.rst index e5b16b3b7a9..4a4de14776f 100644 --- a/classes/class_animationnodetimeseek.rst +++ b/classes/class_animationnodetimeseek.rst @@ -19,7 +19,7 @@ A time-seeking animation node used in :ref:`AnimationTree`. Description ----------- -This node can be used to cause a seek command to happen to any sub-children of the animation graph. Use this node type to play an :ref:`Animation` from the start or a certain playback position inside the :ref:`AnimationNodeBlendTree`. +This animation node can be used to cause a seek command to happen to any sub-children of the animation graph. Use to play an :ref:`Animation` from the start or a certain playback position inside the :ref:`AnimationNodeBlendTree`. After setting the time and changing the animation playback, the time seek node automatically goes into sleep mode on the next process frame by setting its ``seek_request`` value to ``-1.0``. diff --git a/classes/class_animationnodetransition.rst b/classes/class_animationnodetransition.rst index ba47bd5aed3..3bcea87e908 100644 --- a/classes/class_animationnodetransition.rst +++ b/classes/class_animationnodetransition.rst @@ -41,7 +41,7 @@ After setting the request and changing the animation playback, the transition no animation_tree["parameters/Transition/current_state"] # Get current state index (read-only). - animation_tree.get("parameters/Transition/current_index")) + animation_tree.get("parameters/Transition/current_index") # Alternative syntax (same result as above). animation_tree["parameters/Transition/current_index"] @@ -142,7 +142,7 @@ If ``true``, allows transition to the self state. When the reset option is enabl - void **set_input_count** **(** :ref:`int` value **)** - :ref:`int` **get_input_count** **(** **)** -The number of enabled input ports for this node. +The number of enabled input ports for this animation node. .. rst-class:: classref-item-separator diff --git a/classes/class_animationplayer.rst b/classes/class_animationplayer.rst index 6052e4bb834..57ac31c3745 100644 --- a/classes/class_animationplayer.rst +++ b/classes/class_animationplayer.rst @@ -676,6 +676,8 @@ Returns the :ref:`Animation` with the key ``name``. If the anim Returns the first :ref:`AnimationLibrary` with key ``name`` or ``null`` if not found. +To get the **AnimationPlayer**'s global animation library, use ``get_animation_library("")``. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_animationrootnode.rst b/classes/class_animationrootnode.rst index f20b3753b40..52a9089c52d 100644 --- a/classes/class_animationrootnode.rst +++ b/classes/class_animationrootnode.rst @@ -23,6 +23,8 @@ Description **AnimationRootNode** is a base class for :ref:`AnimationNode`\ s that hold a complete animation. A complete animation refers to the output of an :ref:`AnimationNodeOutput` in an :ref:`AnimationNodeBlendTree` or the output of another **AnimationRootNode**. Used for :ref:`AnimationTree.tree_root` or in other **AnimationRootNode**\ s. +Examples of built-in root nodes include :ref:`AnimationNodeBlendTree` (allows blending nodes between each other using various modes), :ref:`AnimationNodeStateMachine` (allows to configure blending and transitions between nodes using a state machine pattern), :ref:`AnimationNodeBlendSpace2D` (allows linear blending between **three** :ref:`AnimationNode`\ s), :ref:`AnimationNodeBlendSpace1D` (allows linear blending only between **two** :ref:`AnimationNode`\ s). + .. rst-class:: classref-introduction-group Tutorials diff --git a/classes/class_area2d.rst b/classes/class_area2d.rst index 81fd8f82f58..9cef9783d95 100644 --- a/classes/class_area2d.rst +++ b/classes/class_area2d.rst @@ -12,18 +12,16 @@ Area2D **Inherits:** :ref:`CollisionObject2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -2D area for detection, as well as physics and audio influence. +A region of 2D space that detects other :ref:`CollisionObject2D`\ s entering or exiting it. .. rst-class:: classref-introduction-group Description ----------- -2D area that detects :ref:`CollisionObject2D` nodes overlapping, entering, or exiting. Can also alter or override local physics parameters (gravity, damping) and route audio to custom audio buses. +**Area2D** is a region of 2D space defined by one or multiple :ref:`CollisionShape2D` or :ref:`CollisionPolygon2D` child nodes. It detects when other :ref:`CollisionObject2D`\ s enter or exit it, and it also keeps track of which collision objects haven't exited it yet (i.e. which one are overlapping it). -To give the area its shape, add a :ref:`CollisionShape2D` or a :ref:`CollisionPolygon2D` node as a *direct* child (or add multiple such nodes as direct children) of the area. - -\ **Warning:** See :ref:`ConcavePolygonShape2D` for a warning about possibly unexpected behavior when using that shape for an area. +This node can also locally alter or override physics parameters (gravity, damping) and route audio to custom audio buses. .. rst-class:: classref-introduction-group diff --git a/classes/class_area3d.rst b/classes/class_area3d.rst index 01b702fe1f1..05a46ecf674 100644 --- a/classes/class_area3d.rst +++ b/classes/class_area3d.rst @@ -12,26 +12,26 @@ Area3D **Inherits:** :ref:`CollisionObject3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -3D area for detection, as well as physics and audio influence. +A region of 3D space that detects other :ref:`CollisionObject3D`\ s entering or exiting it. .. rst-class:: classref-introduction-group Description ----------- -3D area that detects :ref:`CollisionObject3D` nodes overlapping, entering, or exiting. Can also alter or override local physics parameters (gravity, damping) and route audio to custom audio buses. +**Area3D** is a region of 3D space defined by one or multiple :ref:`CollisionShape3D` or :ref:`CollisionPolygon3D` child nodes. It detects when other :ref:`CollisionObject3D`\ s enter or exit it, and it also keeps track of which collision objects haven't exited it yet (i.e. which one are overlapping it). -To give the area its shape, add a :ref:`CollisionShape3D` or a :ref:`CollisionPolygon3D` node as a *direct* child (or add multiple such nodes as direct children) of the area. +This node can also locally alter or override physics parameters (gravity, damping) and route audio to custom audio buses. -\ **Warning:** See :ref:`ConcavePolygonShape3D` (also called "trimesh") for a warning about possibly unexpected behavior when using that shape for an area. - -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +\ **Warning:** Using a :ref:`ConcavePolygonShape3D` inside a :ref:`CollisionShape3D` child of this node (created e.g. by using the *Create Trimesh Collision Sibling* option in the *Mesh* menu that appears when selecting a :ref:`MeshInstance3D` node) may give unexpected results, since this collision shape is hollow. If this is not desired, it has to be split into multiple :ref:`ConvexPolygonShape3D`\ s or primitive shapes like :ref:`BoxShape3D`, or in some cases it may be replaceable by a :ref:`CollisionPolygon3D`. .. rst-class:: classref-introduction-group Tutorials --------- +- :doc:`Using Area2D <../tutorials/physics/using_area_2d>` + - `3D Platformer Demo `__ - `GUI in 3D Demo `__ diff --git a/classes/class_array.rst b/classes/class_array.rst index 0d33e1730c1..9c16314554a 100644 --- a/classes/class_array.rst +++ b/classes/class_array.rst @@ -10,14 +10,14 @@ Array ===== -A generic array datatype. +A built-in data structure that holds a sequence of elements. .. rst-class:: classref-introduction-group Description ----------- -A generic array that can contain several elements of any type, accessible by a numerical index starting at 0. Negative indices can be used to count from the back, like in Python (-1 is the last element, -2 is the second to last, etc.). +An array data structure that can contain a sequence of elements of any type. Elements are accessed by a numerical index starting at 0. Negative indices are used to count from the back (-1 is the last element, -2 is the second to last, etc.). \ **Example:**\ @@ -64,8 +64,6 @@ Arrays can be concatenated using the ``+`` operator: -\ **Note:** Concatenating with the ``+=`` operator will create a new array, which has a cost. If you want to append another array to an existing array, :ref:`append_array` is more efficient. - \ **Note:** Arrays are always passed by reference. To get a copy of an array that can be modified independently of the original array, use :ref:`duplicate`. \ **Note:** Erasing elements while iterating over arrays is **not** supported and will result in unpredictable behavior. diff --git a/classes/class_arrayoccluder3d.rst b/classes/class_arrayoccluder3d.rst index 1d8f63c1a32..96707157921 100644 --- a/classes/class_arrayoccluder3d.rst +++ b/classes/class_arrayoccluder3d.rst @@ -69,9 +69,9 @@ Property Descriptions - void **set_indices** **(** :ref:`PackedInt32Array` value **)** - :ref:`PackedInt32Array` **get_indices** **(** **)** -.. container:: contribute +The occluder's index position. Indices determine which points from the :ref:`vertices` array should be drawn, and in which order. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** The occluder is always updated after setting this value. If creating occluders procedurally, consider using :ref:`set_arrays` instead to avoid updating the occluder twice when it's created. .. rst-class:: classref-item-separator @@ -88,9 +88,9 @@ Property Descriptions - void **set_vertices** **(** :ref:`PackedVector3Array` value **)** - :ref:`PackedVector3Array` **get_vertices** **(** **)** -.. container:: contribute +The occluder's vertex positions in local 3D coordinates. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **Note:** The occluder is always updated after setting this value. If creating occluders procedurally, consider using :ref:`set_arrays` instead to avoid updating the occluder twice when it's created. .. rst-class:: classref-section-separator @@ -107,9 +107,7 @@ Method Descriptions void **set_arrays** **(** :ref:`PackedVector3Array` vertices, :ref:`PackedInt32Array` indices **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets :ref:`indices` and :ref:`vertices`, while updating the final occluder only once after both values are set. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_aspectratiocontainer.rst b/classes/class_aspectratiocontainer.rst index ea65e31d234..5600b7ffe43 100644 --- a/classes/class_aspectratiocontainer.rst +++ b/classes/class_aspectratiocontainer.rst @@ -12,21 +12,21 @@ AspectRatioContainer **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Container that preserves its child controls' aspect ratio. +A container that preserves the proportions of its child controls. .. rst-class:: classref-introduction-group Description ----------- -Arranges child controls in a way to preserve their aspect ratio automatically whenever the container is resized. Solves the problem where the container size is dynamic and the contents' size needs to adjust accordingly without losing proportions. +A container type that arranges its child controls in a way that preserves their proportions automatically when the container is resized. Useful when a container has a dynamic size and the child nodes must adjust their sizes accordingly without losing their aspect ratios. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_astar2d.rst b/classes/class_astar2d.rst index d034edeebec..5a056c9259c 100644 --- a/classes/class_astar2d.rst +++ b/classes/class_astar2d.rst @@ -12,14 +12,16 @@ AStar2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -AStar class representation that uses 2D vectors as edges. +An implementation of A\* for finding the shortest path between two vertices on a connected graph in 2D space. .. rst-class:: classref-introduction-group Description ----------- -This is a wrapper for the :ref:`AStar3D` class which uses 2D vectors instead of 3D vectors. +An implementation of the A\* algorithm, used to find the shortest path between two vertices on a connected graph in 2D space. + +See :ref:`AStar3D` for a more thorough explanation on how to use this class. **AStar2D** is a wrapper for :ref:`AStar3D` that enforces 2D coordinates. .. rst-class:: classref-reftable-group @@ -98,7 +100,7 @@ Method Descriptions Called when computing the cost between two connected points. -Note that this function is hidden in the default ``AStar2D`` class. +Note that this function is hidden in the default **AStar2D** class. .. rst-class:: classref-item-separator @@ -112,7 +114,7 @@ Note that this function is hidden in the default ``AStar2D`` class. Called when estimating the cost between a point and the path's ending point. -Note that this function is hidden in the default ``AStar2D`` class. +Note that this function is hidden in the default **AStar2D** class. .. rst-class:: classref-item-separator diff --git a/classes/class_astar3d.rst b/classes/class_astar3d.rst index eeb2a5cc4f1..2d21ffa47e3 100644 --- a/classes/class_astar3d.rst +++ b/classes/class_astar3d.rst @@ -12,16 +12,16 @@ AStar3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -An implementation of A\* to find the shortest paths among connected points in space. +An implementation of A\* for finding the shortest path between two vertices on a connected graph in 3D space. .. rst-class:: classref-introduction-group Description ----------- -A\* (A star) is a computer algorithm that is widely used in pathfinding and graph traversal, the process of plotting short paths among vertices (points), passing through a given set of edges (segments). It enjoys widespread use due to its performance and accuracy. Godot's A\* implementation uses points in three-dimensional space and Euclidean distances by default. +A\* (A star) is a computer algorithm used in pathfinding and graph traversal, the process of plotting short paths among vertices (points), passing through a given set of edges (segments). It enjoys widespread use due to its performance and accuracy. Godot's A\* implementation uses points in 3D space and Euclidean distances by default. -You must add points manually with :ref:`add_point` and create segments manually with :ref:`connect_points`. Then you can test if there is a path between two points with the :ref:`are_points_connected` function, get a path containing indices by :ref:`get_id_path`, or one containing actual coordinates with :ref:`get_point_path`. +You must add points manually with :ref:`add_point` and create segments manually with :ref:`connect_points`. Once done, you can test if there is a path between two points with the :ref:`are_points_connected` function, get a path containing indices by :ref:`get_id_path`, or one containing actual coordinates with :ref:`get_point_path`. It is also possible to use non-Euclidean distances. To do so, create a class that extends ``AStar3D`` and override methods :ref:`_compute_cost` and :ref:`_estimate_cost`. Both take two indices and return a length, as is shown in the following example. diff --git a/classes/class_astargrid2d.rst b/classes/class_astargrid2d.rst index 5315e3c38ba..571856c3726 100644 --- a/classes/class_astargrid2d.rst +++ b/classes/class_astargrid2d.rst @@ -12,16 +12,16 @@ AStarGrid2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -A\* (or "A-Star") pathfinding tailored to find the shortest paths on 2D grids. +An implementation of A\* for finding the shortest path between two points on a partial 2D grid. .. rst-class:: classref-introduction-group Description ----------- -Compared to :ref:`AStar2D` you don't need to manually create points or connect them together. It also supports multiple type of heuristics and modes for diagonal movement. This class also provides a jumping mode which is faster to calculate than without it in the :ref:`AStar2D` class. +**AStarGrid2D** is a variant of :ref:`AStar2D` that is specialized for partial 2D grids. It is simpler to use because it doesn't require you to manually create points and connect them together. This class also supports multiple types of heuristics, modes for diagonal movement, and a jumping mode to speed up calculations. -In contrast to :ref:`AStar2D`, you only need set the :ref:`region` of the grid, optionally set the :ref:`cell_size` and then call the :ref:`update` method: +To use **AStarGrid2D**, you only need to set the :ref:`region` of the grid, optionally set the :ref:`cell_size`, and then call the :ref:`update` method: .. tabs:: @@ -46,6 +46,8 @@ In contrast to :ref:`AStar2D`, you only need set the :ref:`region +To remove a point from the pathfinding grid, it must be set as "solid" with :ref:`set_point_solid`. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_audiostreamplaybackpolyphonic.rst b/classes/class_audiostreamplaybackpolyphonic.rst index 4545835bc79..f343acd3133 100644 --- a/classes/class_audiostreamplaybackpolyphonic.rst +++ b/classes/class_audiostreamplaybackpolyphonic.rst @@ -87,7 +87,7 @@ Return true whether the stream associated with an integer ID is still playing. C Play an :ref:`AudioStream` at a given offset, volume and pitch scale. Playback starts immediately. -The return value is an unique integer ID that is associated to this playback stream and which can be used to control it. +The return value is a unique integer ID that is associated to this playback stream and which can be used to control it. This ID becomes invalid when the stream ends (if it does not loop), when the **AudioStreamPlaybackPolyphonic** is stopped, or when :ref:`stop_stream` is called. diff --git a/classes/class_basebutton.rst b/classes/class_basebutton.rst index f88a660008a..ec3b46dbd6f 100644 --- a/classes/class_basebutton.rst +++ b/classes/class_basebutton.rst @@ -14,14 +14,14 @@ BaseButton **Inherited By:** :ref:`Button`, :ref:`LinkButton`, :ref:`TextureButton` -Base class for different kinds of buttons. +Abstract base class for GUI buttons. .. rst-class:: classref-introduction-group Description ----------- -BaseButton is the abstract base class for buttons, so it shouldn't be used directly (it doesn't display anything). Other types of buttons inherit from it. +**BaseButton** is an abstract base class for GUI buttons. It doesn't display anything by itself. .. rst-class:: classref-reftable-group diff --git a/classes/class_basis.rst b/classes/class_basis.rst index 4ffed86dec2..1c48c14f38c 100644 --- a/classes/class_basis.rst +++ b/classes/class_basis.rst @@ -10,18 +10,18 @@ Basis ===== -3×3 matrix datatype. +A 3×3 matrix for representing 3D rotation and scale. .. rst-class:: classref-introduction-group Description ----------- -3×3 matrix used for 3D rotation and scale. Almost always used as an orthogonal basis for a :ref:`Transform3D`. +A 3×3 matrix used for representing 3D rotation and scale. Usually used as an orthogonal basis for a :ref:`Transform3D`. Contains 3 vector fields X, Y and Z as its columns, which are typically interpreted as the local basis vectors of a transformation. For such use, it is composed of a scaling and a rotation matrix, in that order (M = R.S). -Can also be accessed as array of 3D vectors. These vectors are normally orthogonal to each other, but are not necessarily normalized (due to scaling). +Basis can also be accessed as an array of 3D vectors. These vectors are usually orthogonal to each other, but are not necessarily normalized (due to scaling). For more information, read the "Matrices and transforms" documentation article. @@ -394,7 +394,7 @@ Returns the inverse of the matrix. :ref:`bool` **is_equal_approx** **(** :ref:`Basis` b **)** |const| -Returns ``true`` if this basis and ``b`` are approximately equal, by calling ``is_equal_approx`` on each component. +Returns ``true`` if this basis and ``b`` are approximately equal, by calling :ref:`@GlobalScope.is_equal_approx` on all vector components. .. rst-class:: classref-item-separator @@ -406,7 +406,7 @@ Returns ``true`` if this basis and ``b`` are approximately equal, by calling ``i :ref:`bool` **is_finite** **(** **)** |const| -Returns ``true`` if this basis is finite, by calling :ref:`@GlobalScope.is_finite` on each component. +Returns ``true`` if this basis is finite, by calling :ref:`@GlobalScope.is_finite` on all vector components. .. rst-class:: classref-item-separator diff --git a/classes/class_bool.rst b/classes/class_bool.rst index b892a09c038..3f28dfed530 100644 --- a/classes/class_bool.rst +++ b/classes/class_bool.rst @@ -10,113 +10,59 @@ bool ==== -Boolean built-in type. +A built-in boolean type. .. rst-class:: classref-introduction-group Description ----------- -Boolean is a built-in type. There are two boolean values: ``true`` and ``false``. You can think of it as a switch with on or off (1 or 0) setting. Booleans are used in programming for logic in condition statements, like ``if`` statements. +A **bool** is always one of two values: ``true`` or ``false``, similar to a switch that is either on or off. Booleans are used in programming for logic in condition statements. -Booleans can be directly used in ``if`` statements. The code below demonstrates this on the ``if can_shoot:`` line. You don't need to use ``== true``, you only need ``if can_shoot:``. Similarly, use ``if not can_shoot:`` rather than ``== false``. +Booleans can be directly used in ``if`` and ``elif`` statements. You don't need to add ``== true`` or ``== false``: .. tabs:: .. code-tab:: gdscript - var _can_shoot = true - - func shoot(): - if _can_shoot: - pass # Perform shooting actions here. + if can_shoot: + launch_bullet() .. code-tab:: csharp - private bool _canShoot = true; - - public void Shoot() + if (canShoot) { - if (_canShoot) - { - // Perform shooting actions here. - } + launchBullet(); } -The following code will only create a bullet if both conditions are met: action "shoot" is pressed and if ``can_shoot`` is ``true``. +Many common methods and operations return **bool**\ s, for example, ``shooting_cooldown <= 0.0`` may evaluate to ``true`` or ``false`` depending on the number's value. -\ **Note:** ``Input.is_action_pressed("shoot")`` is also a boolean that is ``true`` when "shoot" is pressed and ``false`` when "shoot" isn't pressed. +\ **bool**\ s are usually used with the logical operators ``and``, ``or``, and ``not`` to create complex conditions: .. tabs:: .. code-tab:: gdscript - var _can_shoot = true + if bullets > 0 and not is_reloading: + launch_bullet() - func shoot(): - if _can_shoot and Input.is_action_pressed("shoot"): - create_bullet() + if bullets == 0 or is_reloading: + play_clack_sound() .. code-tab:: csharp - private bool _canShoot = true; - - public void Shoot() - { - if (_canShoot && Input.IsActionPressed("shoot")) - { - CreateBullet(); - } - } - - - -The following code will set ``can_shoot`` to ``false`` and start a timer. This will prevent player from shooting until the timer runs out. Next ``can_shoot`` will be set to ``true`` again allowing player to shoot once again. - - -.. tabs:: - - .. code-tab:: gdscript - - var _can_shoot = true - @onready var _cool_down = $CoolDownTimer - - func shoot(): - if _can_shoot and Input.is_action_pressed("shoot"): - create_bullet() - _can_shoot = false - _cool_down.start() - - func _on_cool_down_timer_timeout(): - _can_shoot = true - - .. code-tab:: csharp - - private bool _canShoot = true; - private Timer _coolDown; - - public override void _Ready() - { - _coolDown = GetNode("CoolDownTimer"); - } - - public void Shoot() + if (bullets > 0 && !isReloading) { - if (_canShoot && Input.IsActionPressed("shoot")) - { - CreateBullet(); - _canShoot = false; - _coolDown.Start(); - } + launchBullet(); } - public void OnCoolDownTimerTimeout() + if (bullets == 0 || isReloading) { - _canShoot = true; + playClackSound(); } @@ -192,7 +138,7 @@ Constructs a **bool** as a copy of the given **bool**. :ref:`bool` **bool** **(** :ref:`float` from **)** -Cast a :ref:`float` value to a boolean value, this method will return ``false`` if ``0.0`` is passed in, and ``true`` for all other floats. +Cast a :ref:`float` value to a boolean value. This method will return ``false`` if ``0.0`` is passed in, and ``true`` for all other values. .. rst-class:: classref-item-separator @@ -202,7 +148,7 @@ Cast a :ref:`float` value to a boolean value, this method will retu :ref:`bool` **bool** **(** :ref:`int` from **)** -Cast an :ref:`int` value to a boolean value, this method will return ``false`` if ``0`` is passed in, and ``true`` for all other ints. +Cast an :ref:`int` value to a boolean value. This method will return ``false`` if ``0`` is passed in, and ``true`` for all other values. .. rst-class:: classref-section-separator diff --git a/classes/class_boxcontainer.rst b/classes/class_boxcontainer.rst index 50ecac93f14..ee43c27fe98 100644 --- a/classes/class_boxcontainer.rst +++ b/classes/class_boxcontainer.rst @@ -14,21 +14,21 @@ BoxContainer **Inherited By:** :ref:`HBoxContainer`, :ref:`VBoxContainer` -Base class for box containers. +A container that arranges its child controls horizontally or vertically. .. rst-class:: classref-introduction-group Description ----------- -Arranges child :ref:`Control` nodes vertically or horizontally, and rearranges them automatically when their minimum size changes. +A container that arranges its child controls horizontally or vertically, rearranging them automatically when their minimum size changes. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_boxshape3d.rst b/classes/class_boxshape3d.rst index 82884ba67ed..a34883af8b0 100644 --- a/classes/class_boxshape3d.rst +++ b/classes/class_boxshape3d.rst @@ -12,16 +12,16 @@ BoxShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Box shape resource for 3D collisions. +A 3D box shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -3D box shape to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. +A 3D box shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape3D`. -\ **Performance:** Being a primitive collision shape, **BoxShape3D** is fast to check collisions against (though not as fast as :ref:`SphereShape3D`). +\ **Performance:** **BoxShape3D** is fast to check collisions against. It is faster than :ref:`CapsuleShape3D` and :ref:`CylinderShape3D`, but slower than :ref:`SphereShape3D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_button.rst b/classes/class_button.rst index eab1f85fbfc..a0393dcb2a0 100644 --- a/classes/class_button.rst +++ b/classes/class_button.rst @@ -14,14 +14,14 @@ Button **Inherited By:** :ref:`CheckBox`, :ref:`CheckButton`, :ref:`ColorPickerButton`, :ref:`MenuButton`, :ref:`OptionButton` -Standard themed Button. +A themed button that can contain text and an icon. .. rst-class:: classref-introduction-group Description ----------- -Button is the standard themed button. It can contain text and an icon, and will display them according to the current :ref:`Theme`. +**Button** is the standard themed button. It can contain text and an icon, and it will display them according to the current :ref:`Theme`. \ **Example of creating a button and assigning an action when pressed by code:**\ @@ -56,11 +56,9 @@ Button is the standard themed button. It can contain text and an icon, and will -Buttons (like all Control nodes) can also be created in the editor, but some situations may require creating them from code. - See also :ref:`BaseButton` which contains common properties and methods associated with this node. -\ **Note:** Buttons do not interpret touch input and therefore don't support multitouch, since mouse emulation can only press one button at a given time. Use :ref:`TouchScreenButton` for buttons that trigger gameplay movement or actions, as :ref:`TouchScreenButton` supports multitouch. +\ **Note:** Buttons do not interpret touch input and therefore don't support multitouch, since mouse emulation can only press one button at a given time. Use :ref:`TouchScreenButton` for buttons that trigger gameplay movement or actions. .. rst-class:: classref-introduction-group diff --git a/classes/class_buttongroup.rst b/classes/class_buttongroup.rst index ca28dce45d1..43d2ec067fc 100644 --- a/classes/class_buttongroup.rst +++ b/classes/class_buttongroup.rst @@ -12,16 +12,16 @@ ButtonGroup **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Group of Buttons. +A group of buttons that doesn't allow more than one button to be pressed at a time. .. rst-class:: classref-introduction-group Description ----------- -Group of :ref:`BaseButton`. The members of this group are treated like radio buttons in the sense that only one button can be pressed at the same time. Some types of buttons (such as :ref:`CheckBox`) may have a special appearance for this state. +A group of :ref:`BaseButton`-derived buttons. The buttons in a **ButtonGroup** are treated like radio buttons: No more than one button can be pressed at a time. Some types of buttons (such as :ref:`CheckBox`) may have a special appearance in this state. -Every member of the ButtonGroup should have :ref:`BaseButton.toggle_mode` set to ``true``. +Every member of a **ButtonGroup** should have :ref:`BaseButton.toggle_mode` set to ``true``. .. rst-class:: classref-reftable-group diff --git a/classes/class_callable.rst b/classes/class_callable.rst index 90a9ace5560..e435574a69a 100644 --- a/classes/class_callable.rst +++ b/classes/class_callable.rst @@ -10,7 +10,7 @@ Callable ======== -Built-in type representing a method in an object instance or a standalone function. +A built-in type representing a method or a standalone function. .. rst-class:: classref-introduction-group diff --git a/classes/class_camera3d.rst b/classes/class_camera3d.rst index 5b53b19ecd4..eedde2e4f5f 100644 --- a/classes/class_camera3d.rst +++ b/classes/class_camera3d.rst @@ -250,7 +250,13 @@ The :ref:`CameraAttributes` to use for this camera. - void **set_cull_mask** **(** :ref:`int` value **)** - :ref:`int` **get_cull_mask** **(** **)** -The culling mask that describes which 3D render layers are rendered by this camera. +The culling mask that describes which :ref:`VisualInstance3D.layers` are rendered by this camera. By default, all 20 user-visible layers are rendered. + +\ **Note:** Since the :ref:`cull_mask` allows for 32 layers to be stored in total, there are an additional 12 layers that are only used internally by the engine and aren't exposed in the editor. Setting :ref:`cull_mask` using a script allows you to toggle those reserved layers, which can be useful for editor plugins. + +To adjust :ref:`cull_mask` more easily using a script, use :ref:`get_cull_mask_value` and :ref:`set_cull_mask_value`. + +\ **Note:** :ref:`VoxelGI`, SDFGI and :ref:`LightmapGI` will always take all layers into account to determine what contributes to global illumination. If this is an issue, set :ref:`GeometryInstance3D.gi_mode` to :ref:`GeometryInstance3D.GI_MODE_DISABLED` for meshes and :ref:`Light3D.light_bake_mode` to :ref:`Light3D.BAKE_DISABLED` for lights to exclude them from global illumination. .. rst-class:: classref-item-separator @@ -320,7 +326,7 @@ The :ref:`Environment` to use for this camera. - void **set_far** **(** :ref:`float` value **)** - :ref:`float` **get_far** **(** **)** -The distance to the far culling boundary for this camera relative to its local Z axis. +The distance to the far culling boundary for this camera relative to its local Z axis. Higher values allow the camera to see further away, while decreasing :ref:`far` can improve performance if it results in objects being partially or fully culled. .. rst-class:: classref-item-separator @@ -417,7 +423,7 @@ The axis to lock during :ref:`fov`/:ref:`size` value **)** - :ref:`float` **get_near** **(** **)** -The distance to the near culling boundary for this camera relative to its local Z axis. +The distance to the near culling boundary for this camera relative to its local Z axis. Lower values allow the camera to see objects more up close to its origin, at the cost of lower precision across the *entire* range. Values lower than the default can lead to increased Z-fighting. .. rst-class:: classref-item-separator diff --git a/classes/class_canvasitem.rst b/classes/class_canvasitem.rst index fe7816188e3..ca646c126f3 100644 --- a/classes/class_canvasitem.rst +++ b/classes/class_canvasitem.rst @@ -14,24 +14,20 @@ CanvasItem **Inherited By:** :ref:`Control`, :ref:`Node2D` -Base class of anything 2D. +Abstract base class for everything in 2D space. .. rst-class:: classref-introduction-group Description ----------- -Base class of anything 2D. Canvas items are laid out in a tree; children inherit and extend their parent's transform. **CanvasItem** is extended by :ref:`Control` for anything GUI-related, and by :ref:`Node2D` for anything related to the 2D engine. +Abstract base class for everything in 2D space. Canvas items are laid out in a tree; children inherit and extend their parent's transform. **CanvasItem** is extended by :ref:`Control` for GUI-related nodes, and by :ref:`Node2D` for 2D game objects. -Any **CanvasItem** can draw. For this, :ref:`queue_redraw` is called by the engine, then :ref:`NOTIFICATION_DRAW` will be received on idle time to request redraw. Because of this, canvas items don't need to be redrawn on every frame, improving the performance significantly. Several functions for drawing on the **CanvasItem** are provided (see ``draw_*`` functions). However, they can only be used inside :ref:`_draw`, its corresponding :ref:`Object._notification` or methods connected to the :ref:`draw` signal. +Any **CanvasItem** can draw. For this, :ref:`queue_redraw` is called by the engine, then :ref:`NOTIFICATION_DRAW` will be received on idle time to request a redraw. Because of this, canvas items don't need to be redrawn on every frame, improving the performance significantly. Several functions for drawing on the **CanvasItem** are provided (see ``draw_*`` functions). However, they can only be used inside :ref:`_draw`, its corresponding :ref:`Object._notification` or methods connected to the :ref:`draw` signal. -Canvas items are drawn in tree order. By default, children are on top of their parents so a root **CanvasItem** will be drawn behind everything. This behavior can be changed on a per-item basis. +Canvas items are drawn in tree order. By default, children are on top of their parents, so a root **CanvasItem** will be drawn behind everything. This behavior can be changed on a per-item basis. -A **CanvasItem** can also be hidden, which will also hide its children. It provides many ways to change parameters such as modulation (for itself and its children) and self modulation (only for itself), as well as its blend mode. - -Ultimately, a transform notification can be requested, which will notify the node that its global position changed in case the parent tree changed. - -\ **Note:** Unless otherwise specified, all methods that have angle parameters must have angles specified as *radians*. To convert degrees to radians, use :ref:`@GlobalScope.deg_to_rad`. +A **CanvasItem** can be hidden, which will also hide its children. By adjusting various other properties of a **CanvasItem**, you can also modulate its color (via :ref:`modulate` or :ref:`self_modulate`), change its Z-index, blend mode, and more. .. rst-class:: classref-introduction-group diff --git a/classes/class_canvaslayer.rst b/classes/class_canvaslayer.rst index dacd4239ef2..3c7262ce264 100644 --- a/classes/class_canvaslayer.rst +++ b/classes/class_canvaslayer.rst @@ -14,16 +14,20 @@ CanvasLayer **Inherited By:** :ref:`ParallaxBackground` -Canvas drawing layer. +A node used for independent rendering of objects within a 2D scene. .. rst-class:: classref-introduction-group Description ----------- -Canvas drawing layer. :ref:`CanvasItem` nodes that are direct or indirect children of a **CanvasLayer** will be drawn in that layer. The layer is a numeric index that defines the draw order. The default 2D scene renders with index 0, so a **CanvasLayer** with index -1 will be drawn below, and one with index 1 will be drawn above. This is very useful for HUDs (in layer 1+ or above), or backgrounds (in layer -1 or below). +:ref:`CanvasItem`-derived nodes that are direct or indirect children of a **CanvasLayer** will be drawn in that layer. The layer is a numeric index that defines the draw order. The default 2D scene renders with index ``0``, so a **CanvasLayer** with index ``-1`` will be drawn below, and a **CanvasLayer** with index ``1`` will be drawn above. This order will hold regardless of the :ref:`CanvasItem.z_index` of the nodes within each layer. -Embedded :ref:`Window`\ s are placed in layer 1024. CanvasItems in layer 1025 or above appear in front of embedded windows, CanvasItems in layer 1023 or below appear behind embedded windows. +\ **CanvasLayer**\ s can be hidden and they can also optionally follow the viewport. This makes them useful for HUDs like health bar overlays (on layers ``1`` and higher) or backgrounds (on layers ``-1`` and lower). + +\ **Note:** Embedded :ref:`Window`\ s are placed on layer ``1024``. :ref:`CanvasItem`\ s on layers ``1025`` and higher appear in front of embedded windows. + +\ **Note:** Each **CanvasLayer** is drawn on one specific :ref:`Viewport` and cannot be shared between multiple :ref:`Viewport`\ s, see :ref:`custom_viewport`. When using multiple :ref:`Viewport`\ s, for example in a split-screen game, you need create an individual **CanvasLayer** for each :ref:`Viewport` you want it to be drawn on. .. rst-class:: classref-introduction-group diff --git a/classes/class_canvasmodulate.rst b/classes/class_canvasmodulate.rst index 7bfaa1d9aac..dc8deec85f8 100644 --- a/classes/class_canvasmodulate.rst +++ b/classes/class_canvasmodulate.rst @@ -12,14 +12,14 @@ CanvasModulate **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Tint the entire canvas. +A node that applies a color tint to a canvas. .. rst-class:: classref-introduction-group Description ----------- -**CanvasModulate** tints the canvas elements using its assigned :ref:`color`. +**CanvasModulate** applies a color tint to all nodes on a canvas. Only one can be used to tint a canvas, but :ref:`CanvasLayer`\ s can be used to render things independently. .. rst-class:: classref-reftable-group diff --git a/classes/class_capsuleshape2d.rst b/classes/class_capsuleshape2d.rst index e6da37198a9..50eecef30c1 100644 --- a/classes/class_capsuleshape2d.rst +++ b/classes/class_capsuleshape2d.rst @@ -12,16 +12,16 @@ CapsuleShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Capsule shape resource for 2D physics. +A 2D capsule shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -2D capsule shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. In 2D, a capsule is a rectangle shape with half-circles at both ends. +A 2D capsule shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape2D`. -\ **Performance:** Being a primitive collision shape, **CapsuleShape2D** is fast to check collisions against (though not as fast as :ref:`CircleShape2D`). +\ **Performance:** **CapsuleShape2D** is fast to check collisions against, but it is slower than :ref:`RectangleShape2D` and :ref:`CircleShape2D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_capsuleshape3d.rst b/classes/class_capsuleshape3d.rst index 18fe5c3d830..e0827225ccf 100644 --- a/classes/class_capsuleshape3d.rst +++ b/classes/class_capsuleshape3d.rst @@ -12,16 +12,16 @@ CapsuleShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Capsule shape resource for 3D collisions. +A 3D capsule shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -3D capsule shape to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. In 3D, a capsule is a cylinder shape with hemispheres at both ends. +A 3D capsule shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape3D`. -\ **Performance:** Being a primitive collision shape, **CapsuleShape3D** is fast to check collisions against (though not as fast as :ref:`SphereShape3D`). **CapsuleShape3D** is cheaper to check collisions against compared to :ref:`CylinderShape3D`. +\ **Performance:** **CapsuleShape3D** is fast to check collisions against. It is faster than :ref:`CylinderShape3D`, but slower than :ref:`SphereShape3D` and :ref:`BoxShape3D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_centercontainer.rst b/classes/class_centercontainer.rst index a9d885315a0..667f8c4fdc9 100644 --- a/classes/class_centercontainer.rst +++ b/classes/class_centercontainer.rst @@ -12,21 +12,21 @@ CenterContainer **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Keeps children controls centered. +A container that keeps child controls in its center. .. rst-class:: classref-introduction-group Description ----------- -CenterContainer keeps children controls centered. This container keeps all children to their minimum size, in the center. +**CenterContainer** is a container that keeps all of its child controls in its center at their minimum size. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_characterbody2d.rst b/classes/class_characterbody2d.rst index 69cfba3a510..11635f1e1a1 100644 --- a/classes/class_characterbody2d.rst +++ b/classes/class_characterbody2d.rst @@ -12,18 +12,16 @@ CharacterBody2D **Inherits:** :ref:`PhysicsBody2D` **<** :ref:`CollisionObject2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Specialized 2D physics body node for characters moved by script. +A 2D physics body specialized for characters moved by script. .. rst-class:: classref-introduction-group Description ----------- -Character bodies are special types of bodies that are meant to be user-controlled. They are not affected by physics at all; to other types of bodies, such as a rigid body, these are the same as a :ref:`AnimatableBody2D`. However, they have two main uses: +**CharacterBody2D** is a specialized class for physics bodies that are meant to be user-controlled. They are not affected by physics at all, but they affect other physics bodies in their path. They are mainly used to provide high-level API to move objects with wall and slope detection (:ref:`move_and_slide` method) in addition to the general collision detection provided by :ref:`PhysicsBody2D.move_and_collide`. This makes it useful for highly configurable physics bodies that must move in specific ways and collide with the world, as is often the case with user-controlled characters. -\ **Kinematic characters:** Character bodies have an API for moving objects with walls and slopes detection (:ref:`move_and_slide` method), in addition to collision detection (also done with :ref:`PhysicsBody2D.move_and_collide`). This makes them really useful to implement characters that move in specific ways and collide with the world, but don't require advanced physics. - -\ **Kinematic motion:** Character bodies can also be used for kinematic motion (same functionality as :ref:`AnimatableBody2D`), which allows them to be moved by code and push other bodies on their path. +For game objects that don't require complex movement or collision detection, such as moving platforms, :ref:`AnimatableBody2D` is simpler to configure. .. rst-class:: classref-introduction-group diff --git a/classes/class_characterbody3d.rst b/classes/class_characterbody3d.rst index d1104863695..2ca2a5b6ac0 100644 --- a/classes/class_characterbody3d.rst +++ b/classes/class_characterbody3d.rst @@ -12,20 +12,16 @@ CharacterBody3D **Inherits:** :ref:`PhysicsBody3D` **<** :ref:`CollisionObject3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Specialized 3D physics body node for characters moved by script. +A 3D physics body specialized for characters moved by script. .. rst-class:: classref-introduction-group Description ----------- -Character bodies are special types of bodies that are meant to be user-controlled. They are not affected by physics at all; to other types of bodies, such as a rigid body, these are the same as a :ref:`AnimatableBody3D`. However, they have two main uses: +**CharacterBody3D** is a specialized class for physics bodies that are meant to be user-controlled. They are not affected by physics at all, but they affect other physics bodies in their path. They are mainly used to provide high-level API to move objects with wall and slope detection (:ref:`move_and_slide` method) in addition to the general collision detection provided by :ref:`PhysicsBody3D.move_and_collide`. This makes it useful for highly configurable physics bodies that must move in specific ways and collide with the world, as is often the case with user-controlled characters. -\ *Kinematic characters:* Character bodies have an API for moving objects with walls and slopes detection (:ref:`move_and_slide` method), in addition to collision detection (also done with :ref:`PhysicsBody3D.move_and_collide`). This makes them really useful to implement characters that move in specific ways and collide with the world, but don't require advanced physics. - -\ *Kinematic motion:* Character bodies can also be used for kinematic motion (same functionality as :ref:`AnimatableBody3D`), which allows them to be moved by code and push other bodies on their path. - -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +For game objects that don't require complex movement or collision detection, such as moving platforms, :ref:`AnimatableBody3D` is simpler to configure. .. rst-class:: classref-introduction-group diff --git a/classes/class_checkbox.rst b/classes/class_checkbox.rst index f37d92cdd39..d6c64713d1b 100644 --- a/classes/class_checkbox.rst +++ b/classes/class_checkbox.rst @@ -12,18 +12,18 @@ CheckBox **Inherits:** :ref:`Button` **<** :ref:`BaseButton` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Binary choice user interface widget. See also :ref:`CheckButton`. +A button that represents a binary choice. .. rst-class:: classref-introduction-group Description ----------- -A checkbox allows the user to make a binary choice (choosing only one of two possible options). It's similar to :ref:`CheckButton` in functionality, but it has a different appearance. To follow established UX patterns, it's recommended to use CheckBox when toggling it has **no** immediate effect on something. For example, it could be used when toggling it will only do something once a confirmation button is pressed. +**CheckBox** allows the user to choose one of only two possible options. It's similar to :ref:`CheckButton` in functionality, but it has a different appearance. To follow established UX patterns, it's recommended to use **CheckBox** when toggling it has **no** immediate effect on something. For example, it could be used when toggling it will only do something once a confirmation button is pressed. See also :ref:`BaseButton` which contains common properties and methods associated with this node. -\ **Note:** CheckBox changes its appearance when it's configured as a radio button. See various ``radio_*`` theme properties. To configure CheckBox to act as a radio button, use :ref:`BaseButton.button_group` and :ref:`ButtonGroup`. +When :ref:`BaseButton.button_group` specifies a :ref:`ButtonGroup`, **CheckBox** changes its appearance to that of a radio button and uses the various ``radio_*`` theme properties. .. rst-class:: classref-reftable-group diff --git a/classes/class_checkbutton.rst b/classes/class_checkbutton.rst index 1c89da3dd96..9feeee9442a 100644 --- a/classes/class_checkbutton.rst +++ b/classes/class_checkbutton.rst @@ -12,14 +12,14 @@ CheckButton **Inherits:** :ref:`Button` **<** :ref:`BaseButton` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Checkable button. See also :ref:`CheckBox`. +A button that represents a binary choice. .. rst-class:: classref-introduction-group Description ----------- -CheckButton is a toggle button displayed as a check field. It's similar to :ref:`CheckBox` in functionality, but it has a different appearance. To follow established UX patterns, it's recommended to use CheckButton when toggling it has an **immediate** effect on something. For example, it could be used if toggling it enables/disables a setting without requiring the user to press a confirmation button. +**CheckButton** is a toggle button displayed as a check field. It's similar to :ref:`CheckBox` in functionality, but it has a different appearance. To follow established UX patterns, it's recommended to use **CheckButton** when toggling it has an **immediate** effect on something. For example, it can be used when pressing it shows or hides advanced settings, without asking the user to confirm this action. See also :ref:`BaseButton` which contains common properties and methods associated with this node. diff --git a/classes/class_circleshape2d.rst b/classes/class_circleshape2d.rst index dc453acbcac..a6e43ce21d3 100644 --- a/classes/class_circleshape2d.rst +++ b/classes/class_circleshape2d.rst @@ -12,16 +12,16 @@ CircleShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Circular shape resource for 2D physics. +A 2D circle shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -2D circular shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. This shape is useful for modeling balls or small characters and its collision detection with everything else is very fast. +A 2D circle shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape2D`. -\ **Performance:** Being a primitive collision shape, **CircleShape2D** is the fastest collision shape to check collisions against, as it only requires a distance check with the shape's origin. +\ **Performance:** **CircleShape2D** is fast to check collisions against. It is faster than :ref:`RectangleShape2D` and :ref:`CapsuleShape2D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_classdb.rst b/classes/class_classdb.rst index 57e0559819c..8483398b7c2 100644 --- a/classes/class_classdb.rst +++ b/classes/class_classdb.rst @@ -12,7 +12,7 @@ ClassDB **Inherits:** :ref:`Object` -Class information repository. +A class information repository. .. rst-class:: classref-introduction-group diff --git a/classes/class_codeedit.rst b/classes/class_codeedit.rst index 2fefce2f522..3965e178e28 100644 --- a/classes/class_codeedit.rst +++ b/classes/class_codeedit.rst @@ -12,16 +12,16 @@ CodeEdit **Inherits:** :ref:`TextEdit` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Multiline text control intended for editing code. +A multiline text editor designed for editing code. .. rst-class:: classref-introduction-group Description ----------- -CodeEdit is a specialized :ref:`TextEdit` designed for editing plain text code files. It contains a bunch of features commonly found in code editors such as line numbers, line folding, code completion, indent management and string / comment management. +CodeEdit is a specialized :ref:`TextEdit` designed for editing plain text code files. It has many features commonly found in code editors such as line numbers, line folding, code completion, indent management, and string/comment management. -\ **Note:** By default **CodeEdit** always use left-to-right text direction to correctly display source code. +\ **Note:** Regardless of locale, **CodeEdit** will by default always use left-to-right text direction to correctly display source code. .. rst-class:: classref-reftable-group diff --git a/classes/class_codehighlighter.rst b/classes/class_codehighlighter.rst index 7e2d3e0387b..022185e42c6 100644 --- a/classes/class_codehighlighter.rst +++ b/classes/class_codehighlighter.rst @@ -12,14 +12,14 @@ CodeHighlighter **Inherits:** :ref:`SyntaxHighlighter` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A syntax highlighter for code. +A syntax highlighter intended for code. .. rst-class:: classref-introduction-group Description ----------- -A syntax highlighter for code. +By adjusting various properties of this resource, you can change the colors of strings, comments, numbers, and other text patterns inside a :ref:`TextEdit` control. .. rst-class:: classref-reftable-group diff --git a/classes/class_collisionobject2d.rst b/classes/class_collisionobject2d.rst index 123f4188713..5bcbf56944d 100644 --- a/classes/class_collisionobject2d.rst +++ b/classes/class_collisionobject2d.rst @@ -14,14 +14,14 @@ CollisionObject2D **Inherited By:** :ref:`Area2D`, :ref:`PhysicsBody2D` -Base node for 2D collision objects. +Abstract base class for 2D physics objects. .. rst-class:: classref-introduction-group Description ----------- -CollisionObject2D is the base class for 2D physics objects. It can hold any number of 2D collision :ref:`Shape2D`\ s. Each shape must be assigned to a *shape owner*. The CollisionObject2D can have any number of shape owners. Shape owners are not nodes and do not appear in the editor, but are accessible through code using the ``shape_owner_*`` methods. +Abstract base class for 2D physics objects. **CollisionObject2D** can hold any number of :ref:`Shape2D`\ s for collision. Each shape must be assigned to a *shape owner*. Shape owners are not nodes and do not appear in the editor, but are accessible through code using the ``shape_owner_*`` methods. \ **Note:** Only collisions between objects within the same canvas (:ref:`Viewport` canvas or :ref:`CanvasLayer`) are supported. The behavior of collisions between objects in different canvases is undefined. diff --git a/classes/class_collisionobject3d.rst b/classes/class_collisionobject3d.rst index 9766d82f93b..b31de7da96b 100644 --- a/classes/class_collisionobject3d.rst +++ b/classes/class_collisionobject3d.rst @@ -14,16 +14,16 @@ CollisionObject3D **Inherited By:** :ref:`Area3D`, :ref:`PhysicsBody3D` -Base node for collision objects. +Abstract base class for 3D physics objects. .. rst-class:: classref-introduction-group Description ----------- -CollisionObject3D is the base class for physics objects. It can hold any number of collision :ref:`Shape3D`\ s. Each shape must be assigned to a *shape owner*. The CollisionObject3D can have any number of shape owners. Shape owners are not nodes and do not appear in the editor, but are accessible through code using the ``shape_owner_*`` methods. +Abstract base class for 3D physics objects. **CollisionObject3D** can hold any number of :ref:`Shape3D`\ s for collision. Each shape must be assigned to a *shape owner*. Shape owners are not nodes and do not appear in the editor, but are accessible through code using the ``shape_owner_*`` methods. -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +\ **Warning:** With a non-uniform scale, this node will likely not behave as expected. It is advised to keep its scale the same on all axes and adjust its collision shape(s) instead. .. rst-class:: classref-reftable-group diff --git a/classes/class_collisionpolygon2d.rst b/classes/class_collisionpolygon2d.rst index f066c8cf48a..059269aa9a5 100644 --- a/classes/class_collisionpolygon2d.rst +++ b/classes/class_collisionpolygon2d.rst @@ -12,18 +12,16 @@ CollisionPolygon2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Node that represents a 2D collision polygon. +A node that provides a polygon shape to a :ref:`CollisionObject2D` parent. .. rst-class:: classref-introduction-group Description ----------- -Provides a 2D collision polygon to a :ref:`CollisionObject2D` parent. Polygons can be drawn in the editor or specified by a list of vertices. +A node that provides a thickened polygon shape (a prism) to a :ref:`CollisionObject2D` parent and allows to edit it. The polygon can be concave or convex. This can give a detection shape to an :ref:`Area2D` or turn :ref:`PhysicsBody2D` into a solid object. -Depending on the build mode, this node effectively provides several convex shapes (by convex decomposition of the polygon) or a single concave shape made of the polygon's segments. - -In the editor, a **CollisionPolygon2D** can be generated from a :ref:`Sprite2D`'s outline by selecting a :ref:`Sprite2D` node, going to the **Sprite2D** menu at the top of the 2D editor viewport then choosing **Create CollisionPolygon2D Sibling**. +\ **Warning:** A non-uniformly scaled :ref:`CollisionShape3D` will likely not behave as expected. Make sure to keep its scale the same on all axes and adjust its shape resource instead. .. rst-class:: classref-reftable-group diff --git a/classes/class_collisionpolygon3d.rst b/classes/class_collisionpolygon3d.rst index e811559a9c0..79dcc77bfb0 100644 --- a/classes/class_collisionpolygon3d.rst +++ b/classes/class_collisionpolygon3d.rst @@ -12,18 +12,16 @@ CollisionPolygon3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Node that represents a 3D collision polygon, given by the thickening of a 2D polygon in the local XY plane along the local Z axis. +A node that provides a thickened polygon shape (a prism) to a :ref:`CollisionObject3D` parent. .. rst-class:: classref-introduction-group Description ----------- -Provides a 3D collision polygon to a :ref:`CollisionObject3D` parent, by thickening a 2D (convex or concave) polygon in the local XY plane along the local Z axis. The 2D polygon in the local XY plane can be drawn in the editor or specified by a list of vertices. That 2D polygon is thickened evenly in the local Z and -Z directions. +A node that provides a thickened polygon shape (a prism) to a :ref:`CollisionObject3D` parent and allows to edit it. The polygon can be concave or convex. This can give a detection shape to an :ref:`Area3D` or turn :ref:`PhysicsBody3D` into a solid object. -This node has the same effect as several :ref:`ConvexPolygonShape3D` nodes, created by thickening the 2D convex polygons in the convex decomposition of the given 2D polygon (but without the overhead of multiple nodes). - -\ **Warning:** A non-uniformly scaled CollisionPolygon3D node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change its :ref:`polygon`'s vertices instead. +\ **Warning:** A non-uniformly scaled :ref:`CollisionShape3D` will likely not behave as expected. Make sure to keep its scale the same on all axes and adjust its shape resource instead. .. rst-class:: classref-reftable-group diff --git a/classes/class_collisionshape2d.rst b/classes/class_collisionshape2d.rst index 07579d5cfd4..a4f216f3e49 100644 --- a/classes/class_collisionshape2d.rst +++ b/classes/class_collisionshape2d.rst @@ -12,16 +12,14 @@ CollisionShape2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Node that represents collision shape data in 2D space. +A node that provides a :ref:`Shape2D` to a :ref:`CollisionObject2D` parent. .. rst-class:: classref-introduction-group Description ----------- -Editor facility for creating and editing collision shapes in 2D space. Set the :ref:`shape` property to configure the shape. - -You can use this node to represent all sorts of collision shapes, for example, add this to an :ref:`Area2D` to give it a detection shape, or add it to a :ref:`PhysicsBody2D` to create a solid object. +A node that provides a :ref:`Shape2D` to a :ref:`CollisionObject2D` parent and allows to edit it. This can give a detection shape to an :ref:`Area2D` or turn a :ref:`PhysicsBody2D` into a solid object. .. rst-class:: classref-introduction-group diff --git a/classes/class_collisionshape3d.rst b/classes/class_collisionshape3d.rst index 0802b638da7..2ecafb7a1f9 100644 --- a/classes/class_collisionshape3d.rst +++ b/classes/class_collisionshape3d.rst @@ -12,18 +12,16 @@ CollisionShape3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Node that represents collision shape data in 3D space. +A node that provides a :ref:`Shape3D` to a :ref:`CollisionObject3D` parent. .. rst-class:: classref-introduction-group Description ----------- -Editor facility for creating and editing collision shapes in 3D space. Set the :ref:`shape` property to configure the shape. +A node that provides a :ref:`Shape3D` to a :ref:`CollisionObject3D` parent and allows to edit it. This can give a detection shape to an :ref:`Area3D` or turn a :ref:`PhysicsBody3D` into a solid object. -You can use this node to represent all sorts of collision shapes, for example, add this to an :ref:`Area3D` to give it a detection shape, or add it to a :ref:`PhysicsBody3D` to create a solid object. - -\ **Warning:** A non-uniformly scaled CollisionShape3D node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size of its :ref:`shape` resource instead. +\ **Warning:** A non-uniformly scaled **CollisionShape3D** will likely not behave as expected. Make sure to keep its scale the same on all axes and adjust its :ref:`shape` resource instead. .. rst-class:: classref-introduction-group diff --git a/classes/class_color.rst b/classes/class_color.rst index 22f6485d4d2..b9264ceb3e7 100644 --- a/classes/class_color.rst +++ b/classes/class_color.rst @@ -10,18 +10,18 @@ Color ===== -Color built-in type, in RGBA format. +A color represented in RGBA format. .. rst-class:: classref-introduction-group Description ----------- -A color represented in RGBA format by red (:ref:`r`), green (:ref:`g`), blue (:ref:`b`), and alpha (:ref:`a`) components. Each component is a 16-bit floating-point value, usually ranging from 0 to 1. Some properties (such as :ref:`CanvasItem.modulate`) may support values greater than 1, for overbright or High Dynamic Range colors. If you want to supply values in a range of 0 to 255, you should use :ref:`@GDScript.Color8`. +A color represented in RGBA format by a red (:ref:`r`), green (:ref:`g`), blue (:ref:`b`), and alpha (:ref:`a`) component. Each component is a 16-bit floating-point value, usually ranging from ``0.0`` to ``1.0``. Some properties (such as :ref:`CanvasItem.modulate`) may support values greater than ``1.0``, for overbright or HDR (High Dynamic Range) colors. -Colors can also be created by name from a set of standardized colors, through the :ref:`String` constructor, :ref:`from_string`, or by directly fetching the color constants documented here. The standardized color set is based on the `X11 color names `__, with the addition of :ref:`TRANSPARENT`. +Colors can be created in various ways: By the various **Color** constructors, by static methods such as :ref:`from_hsv`, and by using a name from the set of standardized colors based on `X11 color names `__ with the addition of :ref:`TRANSPARENT`. GDScript also provides :ref:`@GDScript.Color8`, which uses integers from ``0`` to ``255`` and doesn't support overbright colors. -\ **Note:** In a boolean context, a Color will evaluate to ``false`` if it's equal to ``Color(0, 0, 0, 1)`` (opaque black). Otherwise, a Color will always evaluate to ``true``. +\ **Note:** In a boolean context, a Color will evaluate to ``false`` if it is equal to ``Color(0, 0, 0, 1)`` (opaque black). Otherwise, a Color will always evaluate to ``true``. \ `Color constants cheatsheet `__ @@ -1791,9 +1791,9 @@ Returns the light intensity of the color, as a value between 0.0 and 1.0 (inclus :ref:`Color` **hex** **(** :ref:`int` hex **)** |static| -Returns the **Color** associated with the provided ``hex`` integer in 32-bit RGBA format (8 bits per channel, alpha channel first). +Returns the **Color** associated with the provided ``hex`` integer in 32-bit RGBA format (8 bits per channel). -In GDScript and C#, the :ref:`int` is best visualized with hexadecimal notation (``"0x"`` prefix). +In GDScript and C#, the :ref:`int` is best visualized with hexadecimal notation (``"0x"`` prefix, making it ``"0xRRGGBBAA"``). .. tabs:: @@ -1822,9 +1822,9 @@ In GDScript and C#, the :ref:`int` is best visualized with hexadecima :ref:`Color` **hex64** **(** :ref:`int` hex **)** |static| -Returns the **Color** associated with the provided ``hex`` integer in 64-bit RGBA format (16 bits per channel, alpha channel first). +Returns the **Color** associated with the provided ``hex`` integer in 64-bit RGBA format (16 bits per channel). -In GDScript and C#, the :ref:`int` is best visualized with hexadecimal notation (``"0x"`` prefix). +In GDScript and C#, the :ref:`int` is best visualized with hexadecimal notation (``"0x"`` prefix, making it ``"0xRRRRGGGGBBBBAAAA"``). .. rst-class:: classref-item-separator diff --git a/classes/class_colorpicker.rst b/classes/class_colorpicker.rst index 228db859c99..9fccb00575b 100644 --- a/classes/class_colorpicker.rst +++ b/classes/class_colorpicker.rst @@ -12,16 +12,16 @@ ColorPicker **Inherits:** :ref:`VBoxContainer` **<** :ref:`BoxContainer` **<** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Color picker control. +A widget that provides an interface for selecting or modifying a color. .. rst-class:: classref-introduction-group Description ----------- -Displays a color picker widget. Useful for selecting a color from an RGB/RGBA colorspace. +A widget that provides an interface for selecting or modifying a color. It can optionally provide functionalities like a color sampler (eyedropper), color modes, and presets. -\ **Note:** This control is the color picker widget itself. You can use a :ref:`ColorPickerButton` instead if you need a button that brings up a **ColorPicker** in a pop-up. +\ **Note:** This control is the color picker widget itself. You can use a :ref:`ColorPickerButton` instead if you need a button that brings up a **ColorPicker** in a popup. .. rst-class:: classref-introduction-group diff --git a/classes/class_colorpickerbutton.rst b/classes/class_colorpickerbutton.rst index 7d706e611b6..86186be2b16 100644 --- a/classes/class_colorpickerbutton.rst +++ b/classes/class_colorpickerbutton.rst @@ -12,14 +12,14 @@ ColorPickerButton **Inherits:** :ref:`Button` **<** :ref:`BaseButton` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Button that pops out a :ref:`ColorPicker`. +A button that brings up a :ref:`ColorPicker` when pressed. .. rst-class:: classref-introduction-group Description ----------- -Encapsulates a :ref:`ColorPicker` making it accessible by pressing a button. Pressing the button will toggle the :ref:`ColorPicker` visibility. +Encapsulates a :ref:`ColorPicker`, making it accessible by pressing a button. Pressing the button will toggle the :ref:`ColorPicker`'s visibility. See also :ref:`BaseButton` which contains common properties and methods associated with this node. diff --git a/classes/class_colorrect.rst b/classes/class_colorrect.rst index 532f8c328d5..8453cf5e70b 100644 --- a/classes/class_colorrect.rst +++ b/classes/class_colorrect.rst @@ -12,14 +12,14 @@ ColorRect **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Colored rectangle. +A control that displays a solid color rectangle. .. rst-class:: classref-introduction-group Description ----------- -Displays a rectangle filled with a solid :ref:`color`. If you need to display the border alone, consider using :ref:`ReferenceRect` instead. +Displays a rectangle filled with a solid :ref:`color`. If you need to display the border alone, consider using a :ref:`Panel` instead. .. rst-class:: classref-introduction-group @@ -60,20 +60,7 @@ Property Descriptions - void **set_color** **(** :ref:`Color` value **)** - :ref:`Color` **get_color** **(** **)** -The fill color. - - -.. tabs:: - - .. code-tab:: gdscript - - $ColorRect.color = Color(1, 0, 0, 1) # Set ColorRect's color to red. - - .. code-tab:: csharp - - GetNode("ColorRect").Color = new Color(1, 0, 0, 1); // Set ColorRect's color to red. - - +The fill color of the rectangle. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_concavepolygonshape2d.rst b/classes/class_concavepolygonshape2d.rst index 4661fe96d1c..43efacf3bce 100644 --- a/classes/class_concavepolygonshape2d.rst +++ b/classes/class_concavepolygonshape2d.rst @@ -12,26 +12,22 @@ ConcavePolygonShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Concave polygon shape resource for 2D physics. +A 2D polyline shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -2D concave polygon shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. +A 2D polyline shape, intended for use in physics. Used internally in :ref:`CollisionPolygon2D` when it's in ``BUILD_SEGMENTS`` mode. -The shape consists of a collection of line segments, and as such it does not include any "inside" that the segments might be enclosing. If the segments do enclose anything, then the shape is *hollow*, as opposed to a :ref:`ConvexPolygonShape2D` which is solid. See also :ref:`CollisionPolygon2D`. +Being just a collection of interconnected line segments, **ConcavePolygonShape2D** is the most freely configurable single 2D shape. It can be used to form polygons of any nature, or even shapes that don't enclose an area. However, :ref:`ConvexPolygonShape2D` is *hollow* even if the interconnected line segments do enclose an area, which often makes it unsuitable for physics or detection. -Being made out of line segments, this shape is the most freely configurable single 2D shape. It can be used to form (hollow) polygons of any nature, convex or concave. +\ **Note:** When used for collision, **ConcavePolygonShape2D** is intended to work with static :ref:`CollisionShape2D` nodes like :ref:`StaticBody2D` and will likely not behave well for :ref:`CharacterBody2D`\ s or :ref:`RigidBody2D`\ s in a mode other than Static. -\ **Note:** When used for collision, **ConcavePolygonShape2D** is intended to work with static :ref:`PhysicsBody2D` nodes like :ref:`StaticBody2D` and is not recommended to use with :ref:`RigidBody2D` nodes in a mode other than Static. A :ref:`CollisionPolygon2D` in convex decomposition mode (solids) or several convex objects are advised for that instead. Otherwise, a concave polygon 2D shape is better suited for static bodies. +\ **Warning:** Physics bodies that are small have a chance to clip through this shape when moving fast. This happens because on one frame, the physics body may be on the "outside" of the shape, and on the next frame it may be "inside" it. **ConcavePolygonShape2D** is hollow, so it won't detect a collision. -\ **Warning:** The nature of this shape makes it extra prone to being tunneled through by (small) fast physics bodies. For example, consider a (small) rigid body *Ball* traveling toward a static body *Box* at high speed. If the box uses a **ConcavePolygonShape2D** consisting of four segments, then the ball might end up inside the box or tunnel all the way through the box, if it goes fast enough. This is (partly) because the ball can only collide against the individual segments of the hollow box. In interactions with rigid bodies tunneling can be avoided by enabling continuous collision detection on the rigid body. - -\ **Warning:** Using this shape for an :ref:`Area2D` (via a :ref:`CollisionShape2D` node) may give unexpected results: the area will only detect collisions with the segments in the **ConcavePolygonShape2D** (and not with any "inside" of the shape, for example). - -\ **Performance:** Due to its complexity, **ConcavePolygonShape2D** is the slowest collision shape to check collisions against. Its use should generally be limited to level geometry. For convex geometry, using :ref:`ConvexPolygonShape2D` will perform better. For dynamic physics bodies that need concave collision, several :ref:`ConvexPolygonShape2D`\ s can be used to represent its collision by using convex decomposition; see :ref:`ConvexPolygonShape2D`'s documentation for instructions. However, consider using primitive collision shapes such as :ref:`CircleShape2D` or :ref:`RectangleShape2D` first. +\ **Performance:** Due to its complexity, **ConcavePolygonShape2D** is the slowest 2D collision shape to check collisions against. Its use should generally be limited to level geometry. If the polyline is closed, :ref:`CollisionPolygon2D`'s ``BUILD_SOLIDS`` mode can be used, which decomposes the polygon into convex ones; see :ref:`ConvexPolygonShape2D`'s documentation for instructions. .. rst-class:: classref-reftable-group diff --git a/classes/class_concavepolygonshape3d.rst b/classes/class_concavepolygonshape3d.rst index 39496bc2946..c2bcb29b111 100644 --- a/classes/class_concavepolygonshape3d.rst +++ b/classes/class_concavepolygonshape3d.rst @@ -12,26 +12,22 @@ ConcavePolygonShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Concave polygon shape resource (also called "trimesh") for 3D physics. +A 3D trimesh shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -3D concave polygon shape resource (also called "trimesh") to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. +A 3D trimesh shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape3D`. -The shape consists of a collection of triangle faces, and as such it does not include any "inside" that the faces might be enclosing. If the faces enclose anything, then the shape is *hollow*, as opposed to a :ref:`ConvexPolygonShape3D` which is solid. See also :ref:`CollisionPolygon3D`. +Being just a collection of interconnected triangles, **ConcavePolygonShape3D** is the most freely configurable single 3D shape. It can be used to form polyhedra of any nature, or even shapes that don't enclose a volume. However, :ref:`ConvexPolygonShape3D` is *hollow* even if the interconnected triangles do enclose a volume, which often makes it unsuitable for physics or detection. -Being made out of triangle faces, this shape is the most freely configurable single 3D shape. Despite its name, it can be used to form (hollow) polyhedra of any nature, convex or concave. +\ **Note:** When used for collision, **ConcavePolygonShape3D** is intended to work with static :ref:`CollisionShape3D` nodes like :ref:`StaticBody3D` and will likely not behave well for :ref:`CharacterBody3D`\ s or :ref:`RigidBody3D`\ s in a mode other than Static. -\ **Note:** When used for collision, **ConcavePolygonShape3D** is intended to work with static :ref:`PhysicsBody3D` nodes like :ref:`StaticBody3D` and will not work with :ref:`CharacterBody3D` or :ref:`RigidBody3D` in a mode other than Static. +\ **Warning:** Physics bodies that are small have a chance to clip through this shape when moving fast. This happens because on one frame, the physics body may be on the "outside" of the shape, and on the next frame it may be "inside" it. **ConcavePolygonShape3D** is hollow, so it won't detect a collision. -\ **Warning:** The nature of this shape makes it extra prone to being tunneled through by (small) fast physics bodies. For example, consider a (small) rigid body *Ball* traveling toward a static body *Box* at high speed. If the box uses a **ConcavePolygonShape3D** consisting of twelve triangle faces (two triangle faces for each of the six sides of the box), then the ball might end up inside the box or tunnel all the way through the box, if it goes fast enough. This is (partly) because the ball can only collide against the individual faces of the hollow box. In interactions with rigid bodies tunneling can be avoided by enabling continuous collision detection on the rigid body. - -\ **Warning:** Using this shape for an :ref:`Area3D` (via a :ref:`CollisionShape3D` node, created e.g. by using the *Create Trimesh Collision Sibling* option in the *Mesh* menu that appears when selecting a :ref:`MeshInstance3D` node) may give unexpected results: the area will only detect collisions with the triangle faces in the **ConcavePolygonShape3D** (and not with any "inside" of the shape, for example); moreover it will only detect all such collisions if :ref:`backface_collision` is ``true``. - -\ **Performance:** Due to its complexity, **ConcavePolygonShape3D** is the slowest collision shape to check collisions against. Its use should generally be limited to level geometry. For convex geometry, using :ref:`ConvexPolygonShape3D` will perform better. For dynamic physics bodies that need concave collision, several :ref:`ConvexPolygonShape3D`\ s can be used to represent its collision by using convex decomposition; see :ref:`ConvexPolygonShape3D`'s documentation for instructions. However, consider using primitive collision shapes such as :ref:`SphereShape3D` or :ref:`BoxShape3D` first. +\ **Performance:** Due to its complexity, **ConcavePolygonShape3D** is the slowest 3D collision shape to check collisions against. Its use should generally be limited to level geometry. For convex geometry, :ref:`ConvexPolygonShape3D` should be used. For dynamic physics bodies that need concave collision, several :ref:`ConvexPolygonShape3D`\ s can be used to represent its collision by using convex decomposition; see :ref:`ConvexPolygonShape3D`'s documentation for instructions. .. rst-class:: classref-introduction-group diff --git a/classes/class_conetwistjoint3d.rst b/classes/class_conetwistjoint3d.rst index 4a06f9c14d2..a59a8105781 100644 --- a/classes/class_conetwistjoint3d.rst +++ b/classes/class_conetwistjoint3d.rst @@ -12,18 +12,14 @@ ConeTwistJoint3D **Inherits:** :ref:`Joint3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -A twist joint between two 3D PhysicsBodies. +A physics joint that connects two 3D physics bodies in a way that simulates a ball-and-socket joint. .. rst-class:: classref-introduction-group Description ----------- -The joint can rotate the bodies across an axis defined by the local x-axes of the :ref:`Joint3D`. - -The twist axis is initiated as the X axis of the :ref:`Joint3D`. - -Once the Bodies swing, the twist axis is calculated as the middle of the x-axes of the Joint3D in the local space of the two Bodies. See also :ref:`Generic6DOFJoint3D`. +A physics joint that connects two 3D physics bodies in a way that simulates a ball-and-socket joint. The twist axis is initiated as the X axis of the **ConeTwistJoint3D**. Once the physics bodies swing, the twist axis is calculated as the middle of the X axes of the joint in the local space of the two physics bodies. Useful for limbs like shoulders and hips, lamps hanging off a ceiling, etc. .. rst-class:: classref-reftable-group diff --git a/classes/class_confirmationdialog.rst b/classes/class_confirmationdialog.rst index 7ab479c1d9b..d1c61ba2fc0 100644 --- a/classes/class_confirmationdialog.rst +++ b/classes/class_confirmationdialog.rst @@ -14,14 +14,14 @@ ConfirmationDialog **Inherited By:** :ref:`EditorCommandPalette`, :ref:`EditorFileDialog`, :ref:`FileDialog`, :ref:`ScriptCreateDialog` -Dialog for confirmation of actions. +A dialog used for confirmation of actions. .. rst-class:: classref-introduction-group Description ----------- -Dialog for confirmation of actions. This dialog inherits from :ref:`AcceptDialog`, but has by default an OK and Cancel button (in host OS order). +A dialog used for confirmation of actions. This window is similar to :ref:`AcceptDialog`, but pressing its Cancel button can have a different outcome from pressing the OK button. The order of the two buttons varies depending on the host OS. To get cancel action, you can use: diff --git a/classes/class_container.rst b/classes/class_container.rst index 19b40f838d4..cdf194f5166 100644 --- a/classes/class_container.rst +++ b/classes/class_container.rst @@ -14,23 +14,21 @@ Container **Inherited By:** :ref:`AspectRatioContainer`, :ref:`BoxContainer`, :ref:`CenterContainer`, :ref:`EditorProperty`, :ref:`FlowContainer`, :ref:`GraphNode`, :ref:`GridContainer`, :ref:`MarginContainer`, :ref:`PanelContainer`, :ref:`ScrollContainer`, :ref:`SplitContainer`, :ref:`SubViewportContainer`, :ref:`TabContainer` -Base node for containers. +Base class for all GUI containers. .. rst-class:: classref-introduction-group Description ----------- -Base node for containers. A **Container** contains other controls and automatically arranges them in a certain way. - -A Control can inherit this to create custom container classes. +Base class for all GUI containers. A **Container** automatically arranges its child controls in a certain way. This class can be inherited to make custom container types. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_control.rst b/classes/class_control.rst index c5d563fd2ba..b68e9086afc 100644 --- a/classes/class_control.rst +++ b/classes/class_control.rst @@ -14,7 +14,7 @@ Control **Inherited By:** :ref:`BaseButton`, :ref:`ColorRect`, :ref:`Container`, :ref:`GraphEdit`, :ref:`ItemList`, :ref:`Label`, :ref:`LineEdit`, :ref:`MenuBar`, :ref:`NinePatchRect`, :ref:`Panel`, :ref:`Range`, :ref:`ReferenceRect`, :ref:`RichTextLabel`, :ref:`Separator`, :ref:`TabBar`, :ref:`TextEdit`, :ref:`TextureRect`, :ref:`Tree`, :ref:`VideoStreamPlayer` -All user interface nodes inherit from Control. A control's anchors and offsets adapt its position and size relative to its parent. +Base class for all GUI controls. Adapts its position and size based on its parent control. .. rst-class:: classref-introduction-group @@ -1898,7 +1898,7 @@ This method should only be used to test the data. Process the data in :ref:`_dro { // Check position if it is relevant to you // Otherwise, just check data - return data.VariantType == Variant.Type.Dictionary && data.AsGodotDictionary().Contains("expected"); + return data.VariantType == Variant.Type.Dictionary && data.AsGodotDictionary().ContainsKey("expected"); } @@ -1930,7 +1930,7 @@ Godot calls this method to pass you the ``data`` from a control's :ref:`_get_dra public override bool _CanDropData(Vector2 atPosition, Variant data) { - return data.VariantType == Variant.Type.Dictionary && dict.AsGodotDictionary().Contains("color"); + return data.VariantType == Variant.Type.Dictionary && dict.AsGodotDictionary().ContainsKey("color"); } public override void _DropData(Vector2 atPosition, Variant data) diff --git a/classes/class_convexpolygonshape2d.rst b/classes/class_convexpolygonshape2d.rst index 0d06c0eab26..b9bac56eb57 100644 --- a/classes/class_convexpolygonshape2d.rst +++ b/classes/class_convexpolygonshape2d.rst @@ -12,22 +12,20 @@ ConvexPolygonShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Convex polygon shape resource for 2D physics. +A 2D convex polygon shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -2D convex polygon shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. +A 2D convex polygon shape, intended for use in physics. Used internally in :ref:`CollisionPolygon2D` when it's in ``BUILD_SOLIDS`` mode. -The shape is a *solid* that includes all the points that it encloses, as opposed to :ref:`ConcavePolygonShape2D` which is hollow if it encloses anything. See also :ref:`CollisionPolygon2D`. +\ **ConvexPolygonShape2D** is *solid*, which means it detects collisions from objects that are fully inside it, unlike :ref:`ConcavePolygonShape2D` which is hollow. This makes it more suitable for both detection and physics. -The solid nature of the shape makes it well-suited for both detection and physics; in physics body interactions this allows depenetrating even those shapes which end up (e.g. due to high speed) fully inside the convex shape (similarly to primitive shapes, but unlike :ref:`ConcavePolygonShape2D`). The convexity limits the possible geometric shape of a single **ConvexPolygonShape2D**: it cannot be concave. +\ **Convex decomposition:** A concave polygon can be split up into several convex polygons. This allows dynamic physics bodies to have complex concave collisions (at a performance cost) and can be achieved by using several :ref:`ConvexPolygonShape3D` nodes or by using the :ref:`CollisionPolygon2D` node in ``BUILD_SOLIDS`` mode. To generate a collision polygon from a sprite, select the :ref:`Sprite2D` node, go to the **Sprite2D** menu that appears above the viewport, and choose **Create Polygon2D Sibling**. -\ **Convex decomposition:** Concave objects' collisions can be represented accurately using *several* convex shapes. This allows dynamic physics bodies to have complex concave collisions (at a performance cost). It can be achieved using several **ConvexPolygonShape2D** nodes or by using the :ref:`CollisionPolygon2D` node in Solids build mode. To generate a collision polygon from a sprite, select the :ref:`Sprite2D` node, go to the **Sprite2D** menu that appears above the viewport, and choose **Create Polygon2D Sibling**. - -\ **Performance:** **ConvexPolygonShape2D** is faster to check collisions against compared to :ref:`ConcavePolygonShape2D`, but it is slower than primitive collision shapes such as :ref:`CircleShape2D` or :ref:`RectangleShape2D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by primitive shapes. +\ **Performance:** **ConvexPolygonShape2D** is faster to check collisions against compared to :ref:`ConcavePolygonShape2D`, but it is slower than primitive collision shapes such as :ref:`CircleShape2D` and :ref:`RectangleShape2D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by primitive shapes. .. rst-class:: classref-reftable-group diff --git a/classes/class_convexpolygonshape3d.rst b/classes/class_convexpolygonshape3d.rst index a0f39a2a941..aeec2733152 100644 --- a/classes/class_convexpolygonshape3d.rst +++ b/classes/class_convexpolygonshape3d.rst @@ -12,22 +12,20 @@ ConvexPolygonShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Convex polygon shape resource for 3D physics. +A 3D convex polyhedron shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -3D convex polygon shape resource to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. +A 3D convex polyhedron shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape3D`. -The shape is a *solid* that includes all the points that it encloses, as opposed to :ref:`ConcavePolygonShape3D` which is hollow if it encloses anything. See also :ref:`CollisionPolygon3D`. +\ **ConvexPolygonShape3D** is *solid*, which means it detects collisions from objects that are fully inside it, unlike :ref:`ConcavePolygonShape3D` which is hollow. This makes it more suitable for both detection and physics. -The solid nature of the shape makes it well-suited for both detection and physics; in physics body interactions this allows depenetrating even those shapes which end up (e.g. due to high speed) fully inside the convex shape (similarly to primitive shapes, but unlike :ref:`ConcavePolygonShape3D` and :ref:`HeightMapShape3D`). The convexity restricts the possible geometric shape of a single **ConvexPolygonShape3D**: it cannot be concave. +\ **Convex decomposition:** A concave polyhedron can be split up into several convex polyhedra. This allows dynamic physics bodies to have complex concave collisions (at a performance cost) and can be achieved by using several **ConvexPolygonShape3D** nodes. To generate a convex decomposition from a mesh, select the :ref:`MeshInstance3D` node, go to the **Mesh** menu that appears above the viewport, and choose **Create Multiple Convex Collision Siblings**. Alternatively, :ref:`MeshInstance3D.create_multiple_convex_collisions` can be called in a script to perform this decomposition at run-time. -\ **Convex decomposition:** Concave objects' collisions can be represented accurately using *several* convex shapes. This allows dynamic physics bodies to have complex concave collisions (at a performance cost). It can be achieved by using several **ConvexPolygonShape3D** nodes or by using the :ref:`CollisionPolygon3D` node. To generate a collision polygon from a mesh, select the :ref:`MeshInstance3D` node, go to the **Mesh** menu that appears above the viewport and choose **Create Multiple Convex Collision Siblings**. Alternatively, :ref:`MeshInstance3D.create_multiple_convex_collisions` can be called in a script to perform this decomposition at run-time. - -\ **Performance:** **ConvexPolygonShape3D** is faster to check collisions against compared to :ref:`ConcavePolygonShape3D`, but it is slower than primitive collision shapes such as :ref:`SphereShape3D` or :ref:`BoxShape3D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by primitive shapes. +\ **Performance:** **ConvexPolygonShape3D** is faster to check collisions against compared to :ref:`ConcavePolygonShape3D`, but it is slower than primitive collision shapes such as :ref:`SphereShape3D` and :ref:`BoxShape3D`. Its use should generally be limited to medium-sized objects that cannot have their collision accurately represented by primitive shapes. .. rst-class:: classref-introduction-group diff --git a/classes/class_crypto.rst b/classes/class_crypto.rst index a808cc1a61b..30d78589c98 100644 --- a/classes/class_crypto.rst +++ b/classes/class_crypto.rst @@ -12,16 +12,16 @@ Crypto **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Access to advanced cryptographic functionalities. +Provides access to advanced cryptographic functionalities. .. rst-class:: classref-introduction-group Description ----------- -The Crypto class allows you to access some more advanced cryptographic functionalities in Godot. +The Crypto class provides access to advanced cryptographic functionalities. -For now, this includes generating cryptographically secure random bytes, RSA keys and self-signed X509 certificates generation, asymmetric key encryption/decryption, and signing/verification. +Currently, this includes asymmetric key encryption/decryption, signing/verification, and generating cryptographically secure random bytes, RSA keys, HMAC digests, and self-signed :ref:`X509Certificate`\ s. .. tabs:: diff --git a/classes/class_cylindershape3d.rst b/classes/class_cylindershape3d.rst index 7bb50c0dc2e..45a6a9fded0 100644 --- a/classes/class_cylindershape3d.rst +++ b/classes/class_cylindershape3d.rst @@ -12,18 +12,18 @@ CylinderShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Cylinder shape for 3D collisions. +A 3D cylinder shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -Cylinder shape for collisions. Like :ref:`CapsuleShape3D`, but without hemispheres at the cylinder's ends. +A 2D capsule shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape3D`. \ **Note:** There are several known bugs with cylinder collision shapes. Using :ref:`CapsuleShape3D` or :ref:`BoxShape3D` instead is recommended. -\ **Performance:** Being a primitive collision shape, **CylinderShape3D** is fast to check collisions against (though not as fast as :ref:`SphereShape3D`). **CylinderShape3D** is also more demanding compared to :ref:`CapsuleShape3D`. +\ **Performance:** **CylinderShape3D** is fast to check collisions against, but it is slower than :ref:`CapsuleShape3D`, :ref:`BoxShape3D`, and **CylinderShape3D**. .. rst-class:: classref-introduction-group diff --git a/classes/class_dampedspringjoint2d.rst b/classes/class_dampedspringjoint2d.rst index ef1a58c0c2f..86d9137161a 100644 --- a/classes/class_dampedspringjoint2d.rst +++ b/classes/class_dampedspringjoint2d.rst @@ -12,14 +12,14 @@ DampedSpringJoint2D **Inherits:** :ref:`Joint2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Damped spring constraint for 2D physics. +A physics joint that connects two 2D physics bodies with a spring-like force. .. rst-class:: classref-introduction-group Description ----------- -Damped spring constraint for 2D physics. This resembles a spring joint that always wants to go back to a given length. +A physics joint that connects two 2D physics bodies with a spring-like force. This resembles a spring that always wants to stretch to a given length. .. rst-class:: classref-reftable-group diff --git a/classes/class_dictionary.rst b/classes/class_dictionary.rst index 7e2f971f6fa..fe6c63adf5f 100644 --- a/classes/class_dictionary.rst +++ b/classes/class_dictionary.rst @@ -10,18 +10,16 @@ Dictionary ========== -Dictionary type. +A built-in data structure that holds key-value pairs. .. rst-class:: classref-introduction-group Description ----------- -Dictionary type. Associative container, which contains values referenced by unique keys. Dictionaries are composed of pairs of keys (which must be unique) and values. Dictionaries will preserve the insertion order when adding new entries. In other programming languages, this data structure is sometimes referred to as a hash map or associative array. +Dictionaries are associative containers that contain values referenced by unique keys. Dictionaries will preserve the insertion order when adding new entries. In other programming languages, this data structure is often referred to as a hash map or an associative array. -You can define a dictionary by placing a comma-separated list of ``key: value`` pairs in curly braces ``{}``. - -\ **Note:** Dictionaries are always passed by reference. To get a copy of a dictionary which can be modified independently of the original dictionary, use :ref:`duplicate`. +You can define a dictionary by placing a comma-separated list of ``key: value`` pairs inside curly braces ``{}``. Creating a dictionary: @@ -187,6 +185,8 @@ The keys of a dictionary can be iterated with the ``for`` keyword: +\ **Note:** Dictionaries are always passed by reference. To get a copy of a dictionary which can be modified independently of the original dictionary, use :ref:`duplicate`. + \ **Note:** Erasing elements while iterating over dictionaries is **not** supported and will result in unpredictable behavior. .. rst-class:: classref-introduction-group @@ -400,9 +400,9 @@ Returns ``true`` if the dictionary contains an entry with the given ``key``. { 210, default }, }; - GD.Print(myDict.Contains("Godot")); // Prints true - GD.Print(myDict.Contains(210)); // Prints true - GD.Print(myDict.Contains(4)); // Prints false + GD.Print(myDict.ContainsKey("Godot")); // Prints true + GD.Print(myDict.ContainsKey(210)); // Prints true + GD.Print(myDict.ContainsKey(4)); // Prints false diff --git a/classes/class_diraccess.rst b/classes/class_diraccess.rst index a6b58cbb168..a42aabc0158 100644 --- a/classes/class_diraccess.rst +++ b/classes/class_diraccess.rst @@ -12,14 +12,14 @@ DirAccess **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Type used to handle the filesystem. +Provides methods for managing directories and their content. .. rst-class:: classref-introduction-group Description ----------- -Directory type. It is used to manage directories and their content (not restricted to the project folder). +This class is used to manage directories and their content, even outside of the project folder. \ **DirAccess** can't be instantiated directly. Instead it is created with a static method that takes a path for which it will be opened. @@ -417,7 +417,7 @@ Returns a :ref:`PackedStringArray` containing filenames Affected by :ref:`include_hidden`. -\ **Note:** When used on a ``res://`` path in an exported project, only the files actually included in the PCK at the given folder level are returned. In practice, this means that since imported resources are stored in a top-level ``.godot/`` folder, only paths to ``*.gd`` and ``*.import`` files are returned (plus a few files such as ``project.godot`` or ``project.binary[code] and the project icon). In an exported project, the list of returned files will also vary depending on whether [member ProjectSettings.editor/export/convert_text_resources_to_binary] is [code]true``. +\ **Note:** When used on a ``res://`` path in an exported project, only the files actually included in the PCK at the given folder level are returned. In practice, this means that since imported resources are stored in a top-level ``.godot/`` folder, only paths to ``*.gd`` and ``*.import`` files are returned (plus a few files such as ``project.godot`` or ``project.binary`` and the project icon). In an exported project, the list of returned files will also vary depending on whether :ref:`ProjectSettings.editor/export/convert_text_resources_to_binary` is ``true``. .. rst-class:: classref-item-separator diff --git a/classes/class_displayserver.rst b/classes/class_displayserver.rst index 59a7833466d..4551dcff910 100644 --- a/classes/class_displayserver.rst +++ b/classes/class_displayserver.rst @@ -12,14 +12,14 @@ DisplayServer **Inherits:** :ref:`Object` -Singleton for window management functions. +A server interface for low-level window management. .. rst-class:: classref-introduction-group Description ----------- -**DisplayServer** handles everything related to window management. This is separated from :ref:`OS` as a single operating system may support multiple display servers. +**DisplayServer** handles everything related to window management. It is separated from :ref:`OS` as a single operating system may support multiple display servers. \ **Headless mode:** Starting the engine with the ``--headless`` :doc:`command line argument <../tutorials/editor/command_line_tutorial>` disables all rendering and window management functions. Most functions from **DisplayServer** will return dummy values in this case. @@ -758,7 +758,7 @@ I-beam cursor shape. This is used by default when hovering a control that accept :ref:`CursorShape` **CURSOR_POINTING_HAND** = ``2`` -Pointing hand cursor shape. This is used by default when hovering a :ref:`LinkButton` or an URL tag in a :ref:`RichTextLabel`. +Pointing hand cursor shape. This is used by default when hovering a :ref:`LinkButton` or a URL tag in a :ref:`RichTextLabel`. .. _class_DisplayServer_constant_CURSOR_CROSS: @@ -1018,7 +1018,7 @@ Use :ref:`window_set_window_buttons_offset` to determine area under the title bar that is not covered by decorations. -\ **Note:** This flag is implemented on macOS. +\ **Note:** This flag is implemented only on macOS. .. _class_DisplayServer_constant_WINDOW_FLAG_MOUSE_PASSTHROUGH: @@ -1094,7 +1094,7 @@ Sent when the user has attempted to close the window (e.g. close button is press Sent when the device "Back" button is pressed, see :ref:`window_set_window_event_callback`. -\ **Note:** This event is implemented on Android. +\ **Note:** This event is implemented only on Android. .. _class_DisplayServer_constant_WINDOW_EVENT_DPI_CHANGE: @@ -1104,7 +1104,7 @@ Sent when the device "Back" button is pressed, see :ref:`window_set_window_event Sent when the window is moved to the display with different DPI, or display DPI is changed, see :ref:`window_set_window_event_callback`. -\ **Note:** This flag is implemented on macOS. +\ **Note:** This flag is implemented only on macOS. .. _class_DisplayServer_constant_WINDOW_EVENT_TITLEBAR_CHANGE: @@ -1114,7 +1114,7 @@ Sent when the window is moved to the display with different DPI, or display DPI Sent when the window title bar decoration is changed (e.g. :ref:`WINDOW_FLAG_EXTEND_TO_TITLE` is set or window entered/exited full screen mode), see :ref:`window_set_window_event_callback`. -\ **Note:** This flag is implemented on macOS. +\ **Note:** This flag is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1446,7 +1446,7 @@ Sets the default mouse cursor shape. The cursor's appearance will vary depending Shows a text input dialog which uses the operating system's native look-and-feel. ``callback`` will be called with a :ref:`String` argument equal to the text field's contents when the dialog is closed for any reason. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1460,7 +1460,7 @@ Shows a text input dialog which uses the operating system's native look-and-feel Shows a text dialog which uses the operating system's native look-and-feel. ``callback`` will be called when the dialog is closed for any reason. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1474,7 +1474,7 @@ void **enable_for_stealing_focus** **(** :ref:`int` process_id **)** Allows the ``process_id`` PID to steal focus from this window. In other words, this disables the operating system's focus stealing protection for the specified PID. -\ **Note:** This method is implemented on Windows. +\ **Note:** This method is implemented only on Windows. .. rst-class:: classref-item-separator @@ -1659,7 +1659,7 @@ An ``accelerator`` can optionally be defined, which is a keyboard shortcut that \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1686,7 +1686,7 @@ An ``accelerator`` can optionally be defined, which is a keyboard shortcut that \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1713,7 +1713,7 @@ An ``accelerator`` can optionally be defined, which is a keyboard shortcut that \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1742,7 +1742,7 @@ An ``accelerator`` can optionally be defined, which is a keyboard shortcut that \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1769,7 +1769,7 @@ An ``accelerator`` can optionally be defined, which is a keyboard shortcut that \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1800,7 +1800,7 @@ An ``accelerator`` can optionally be defined, which is a keyboard shortcut that \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1829,7 +1829,7 @@ An ``accelerator`` can optionally be defined, which is a keyboard shortcut that \ **Note:** The ``callback`` and ``key_callback`` Callables need to accept exactly one Variant parameter, the parameter passed to the Callables will be the value passed to ``tag``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1852,7 +1852,7 @@ Adds a separator between items to the global menu with ID ``menu_root``. Separat Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1875,7 +1875,7 @@ Adds an item that will act as a submenu of the global menu ``menu_root``. The `` Returns index of the inserted item, it's not guaranteed to be the same as ``index`` value. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1896,7 +1896,7 @@ void **global_menu_clear** **(** :ref:`String` menu_root **)** Removes all items from the global menu with ID ``menu_root``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Supported system menu IDs:**\ @@ -1917,7 +1917,7 @@ Removes all items from the global menu with ID ``menu_root``. Returns the accelerator of the item at index ``idx``. Accelerators are special combinations of keys that activate the item, no matter which control is focused. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1931,7 +1931,7 @@ Returns the accelerator of the item at index ``idx``. Accelerators are special c Returns the callback of the item at index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1945,7 +1945,7 @@ Returns the callback of the item at index ``idx``. Returns number of items in the global menu with ID ``menu_root``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1959,7 +1959,7 @@ Returns number of items in the global menu with ID ``menu_root``. Returns the icon of the item at index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1973,7 +1973,7 @@ Returns the icon of the item at index ``idx``. Returns the horizontal offset of the item at the given ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -1987,7 +1987,7 @@ Returns the horizontal offset of the item at the given ``idx``. Returns the index of the item with the specified ``tag``. Index is automatically assigned to each item by the engine. Index can not be set manually. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2001,7 +2001,7 @@ Returns the index of the item with the specified ``tag``. Index is automatically Returns the index of the item with the specified ``text``. Index is automatically assigned to each item by the engine. Index can not be set manually. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2015,7 +2015,7 @@ Returns the index of the item with the specified ``text``. Index is automaticall Returns the callback of the item accelerator at index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2029,7 +2029,7 @@ Returns the callback of the item accelerator at index ``idx``. Returns number of states of a multistate item. See :ref:`global_menu_add_multistate_item` for details. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2043,7 +2043,7 @@ Returns number of states of a multistate item. See :ref:`global_menu_add_multist Returns the state of a multistate item. See :ref:`global_menu_add_multistate_item` for details. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2057,7 +2057,7 @@ Returns the state of a multistate item. See :ref:`global_menu_add_multistate_ite Returns the submenu ID of the item at index ``idx``. See :ref:`global_menu_add_submenu_item` for more info on how to add a submenu. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2071,7 +2071,7 @@ Returns the submenu ID of the item at index ``idx``. See :ref:`global_menu_add_s Returns the metadata of the specified item, which might be of any type. You can set it with :ref:`global_menu_set_item_tag`, which provides a simple way of assigning context data to items. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2085,7 +2085,7 @@ Returns the metadata of the specified item, which might be of any type. You can Returns the text of the item at index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2099,7 +2099,7 @@ Returns the text of the item at index ``idx``. Returns the tooltip associated with the specified index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2113,7 +2113,7 @@ Returns the tooltip associated with the specified index ``idx``. Returns ``true`` if the item at index ``idx`` is checkable in some way, i.e. if it has a checkbox or radio button. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2127,7 +2127,7 @@ Returns ``true`` if the item at index ``idx`` is checkable in some way, i.e. if Returns ``true`` if the item at index ``idx`` is checked. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2143,7 +2143,7 @@ Returns ``true`` if the item at index ``idx`` is disabled. When it is disabled i See :ref:`global_menu_set_item_disabled` for more info on how to disable an item. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2159,7 +2159,7 @@ Returns ``true`` if the item at index ``idx`` has radio button-style checkabilit \ **Note:** This is purely cosmetic; you must add the logic for checking/unchecking items in radio groups. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2175,7 +2175,7 @@ Removes the item at index ``idx`` from the global menu ``menu_root``. \ **Note:** The indices of items after the removed item will be shifted by one. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2189,7 +2189,7 @@ void **global_menu_set_item_accelerator** **(** :ref:`String` menu Sets the accelerator of the item at index ``idx``. ``keycode`` can be a single :ref:`Key`, or a combination of :ref:`KeyModifierMask`\ s and :ref:`Key`\ s using bitwise OR such as ``KEY_MASK_CTRL | KEY_A`` (:kbd:`Ctrl + A`). -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2205,7 +2205,7 @@ Sets the callback of the item at index ``idx``. Callback is emitted when an item \ **Note:** The ``callback`` Callable needs to accept exactly one Variant parameter, the parameter passed to the Callable will be the value passed to the ``tag`` parameter when the menu item was created. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2219,7 +2219,7 @@ void **global_menu_set_item_checkable** **(** :ref:`String` menu_r Sets whether the item at index ``idx`` has a checkbox. If ``false``, sets the type of the item to plain text. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2233,7 +2233,7 @@ void **global_menu_set_item_checked** **(** :ref:`String` menu_roo Sets the checkstate status of the item at index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2247,7 +2247,7 @@ void **global_menu_set_item_disabled** **(** :ref:`String` menu_ro Enables/disables the item at index ``idx``. When it is disabled, it can't be selected and its action can't be invoked. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2261,7 +2261,7 @@ void **global_menu_set_item_icon** **(** :ref:`String` menu_root, Replaces the :ref:`Texture2D` icon of the specified ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. \ **Note:** This method is not supported by macOS "_dock" menu items. @@ -2277,7 +2277,7 @@ void **global_menu_set_item_indentation_level** **(** :ref:`String Sets the horizontal offset of the item at the given ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2293,7 +2293,7 @@ Sets the callback of the item at index ``idx``. Callback is emitted when its acc \ **Note:** The ``key_callback`` Callable needs to accept exactly one Variant parameter, the parameter passed to the Callable will be the value passed to the ``tag`` parameter when the menu item was created. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2307,7 +2307,7 @@ void **global_menu_set_item_max_states** **(** :ref:`String` menu_ Sets number of state of a multistate item. See :ref:`global_menu_add_multistate_item` for details. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2323,7 +2323,7 @@ Sets the type of the item at the specified index ``idx`` to radio button. If ``f \ **Note:** This is purely cosmetic; you must add the logic for checking/unchecking items in radio groups. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2337,7 +2337,7 @@ void **global_menu_set_item_state** **(** :ref:`String` menu_root, Sets the state of a multistate item. See :ref:`global_menu_add_multistate_item` for details. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2351,7 +2351,7 @@ void **global_menu_set_item_submenu** **(** :ref:`String` menu_roo Sets the submenu of the item at index ``idx``. The submenu is the ID of a global menu root that would be shown when the item is clicked. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2365,7 +2365,7 @@ void **global_menu_set_item_tag** **(** :ref:`String` menu_root, : Sets the metadata of an item, which may be of any type. You can later get it with :ref:`global_menu_get_item_tag`, which provides a simple way of assigning context data to items. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2379,7 +2379,7 @@ void **global_menu_set_item_text** **(** :ref:`String` menu_root, Sets the text of the item at index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2393,7 +2393,7 @@ void **global_menu_set_item_tooltip** **(** :ref:`String` menu_roo Sets the :ref:`String` tooltip of the item at the specified index ``idx``. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2419,7 +2419,7 @@ Returns ``true`` if the specified ``feature`` is supported by the current **Disp Returns the text selection in the `Input Method Editor `__ composition string, with the :ref:`Vector2i`'s ``x`` component being the caret position and ``y`` being the length of the selection. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2433,7 +2433,7 @@ Returns the text selection in the `Input Method Editor `__ window. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2676,7 +2676,7 @@ Returns the greatest scale factor of all screens. \ **Note:** On macOS returned value is ``2.0`` if there is at least one hiDPI (Retina) screen in the system, and ``1.0`` in all other cases. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2767,7 +2767,7 @@ Returns the scale factor of the specified screen by index. \ **Note:** On macOS returned value is ``2.0`` for hiDPI (Retina) screen, and ``1.0`` for all other cases. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -2865,7 +2865,7 @@ Sets the window icon (usually displayed in the top-left corner) in the operating Returns current active tablet driver name. -\ **Note:** This method is implemented on Windows. +\ **Note:** This method is implemented only on Windows. .. rst-class:: classref-item-separator @@ -2879,7 +2879,7 @@ Returns current active tablet driver name. Returns the total number of available tablet drivers. -\ **Note:** This method is implemented on Windows. +\ **Note:** This method is implemented only on Windows. .. rst-class:: classref-item-separator @@ -2893,7 +2893,7 @@ Returns the total number of available tablet drivers. Returns the tablet driver name for the given index. -\ **Note:** This method is implemented on Windows. +\ **Note:** This method is implemented only on Windows. .. rst-class:: classref-item-separator @@ -2907,7 +2907,7 @@ void **tablet_set_current_driver** **(** :ref:`String` name **)** Set active tablet driver name. -\ **Note:** This method is implemented on Windows. +\ **Note:** This method is implemented only on Windows. .. rst-class:: classref-item-separator @@ -3181,7 +3181,7 @@ Returns ID of the active popup window, or :ref:`INVALID_WINDOW_ID` **window_get_attached_instance_id** **(** :ref:`int` window_id=0 **)** |const| -Returns the :ref:`Object.get_instance_id` of the :ref:`Window` the ``window_id`` is attached to. also :ref:`window_get_attached_instance_id`. +Returns the :ref:`Object.get_instance_id` of the :ref:`Window` the ``window_id`` is attached to. .. rst-class:: classref-item-separator @@ -3365,7 +3365,7 @@ Returns ``true`` if the given window can be maximized (the maximize button is en Returns ``true``, if double-click on a window title should maximize it. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -3379,7 +3379,7 @@ Returns ``true``, if double-click on a window title should maximize it. Returns ``true``, if double-click on a window title should minimize it. -\ **Note:** This method is implemented on macOS. +\ **Note:** This method is implemented only on macOS. .. rst-class:: classref-item-separator @@ -3725,7 +3725,7 @@ void **window_set_window_buttons_offset** **(** :ref:`Vector2i` When :ref:`WINDOW_FLAG_EXTEND_TO_TITLE` flag is set, set offset to the center of the first titlebar button. -\ **Note:** This flag is implemented on macOS. +\ **Note:** This flag is implemented only on macOS. .. rst-class:: classref-item-separator diff --git a/classes/class_editorfiledialog.rst b/classes/class_editorfiledialog.rst index 0715ea7dd00..34cecd55025 100644 --- a/classes/class_editorfiledialog.rst +++ b/classes/class_editorfiledialog.rst @@ -19,7 +19,7 @@ A modified version of :ref:`FileDialog` used by the editor. Description ----------- -**EditorFileDialog** is an enhanced version of :ref:`FileDialog` available only to editor plugins. Additional features include list of favorited/recent files and ability to see files as thumbnails grid instead of list. +**EditorFileDialog** is an enhanced version of :ref:`FileDialog` available only to editor plugins. Additional features include list of favorited/recent files and the ability to see files as thumbnails grid instead of list. .. rst-class:: classref-reftable-group diff --git a/classes/class_editorimportplugin.rst b/classes/class_editorimportplugin.rst index babd4362e32..4dbc9ade898 100644 --- a/classes/class_editorimportplugin.rst +++ b/classes/class_editorimportplugin.rst @@ -115,7 +115,7 @@ Below is an example EditorImportPlugin that imports a :ref:`Mesh` fr new Godot.Collections.Dictionary { { "name", "myOption" }, - { "defaultValue", false }, + { "default_value", false }, } }; } @@ -249,12 +249,12 @@ This method can be overridden to hide specific import options if conditions are .. code-tab:: csharp - public void GetOptionVisibility(string option, Godot.Collections.Dictionary options) + public void _GetOptionVisibility(string option, Godot.Collections.Dictionary options) { // Only show the lossy quality setting if the compression mode is set to "Lossy". - if (option == "compress/lossyQuality" && options.Contains("compress/mode")) + if (option == "compress/lossy_quality" && options.ContainsKey("compress/mode")) { - return (int)options["compress/mode"] == COMPRESS_LOSSY; // This is a constant you set + return (int)options["compress/mode"] == CompressLossy; // This is a constant you set } return true; diff --git a/classes/class_editorinterface.rst b/classes/class_editorinterface.rst index 2c8cf444bce..0a68c6d0843 100644 --- a/classes/class_editorinterface.rst +++ b/classes/class_editorinterface.rst @@ -19,7 +19,7 @@ Godot editor's interface. Description ----------- -EditorInterface gives you control over Godot editor's window. It allows customizing the window, saving and (re-)loading scenes, rendering mesh previews, inspecting and editing resources and objects, and provides access to :ref:`EditorSettings`, :ref:`EditorFileSystem`, :ref:`EditorResourcePreview`, :ref:`ScriptEditor`, the editor viewport, and information about scenes. +**EditorInterface** gives you control over Godot editor's window. It allows customizing the window, saving and (re-)loading scenes, rendering mesh previews, inspecting and editing resources and objects, and provides access to :ref:`EditorSettings`, :ref:`EditorFileSystem`, :ref:`EditorResourcePreview`, :ref:`ScriptEditor`, the editor viewport, and information about scenes. \ **Note:** This class shouldn't be instantiated directly. Instead, access the singleton using :ref:`EditorPlugin.get_editor_interface`. diff --git a/classes/class_editornode3dgizmoplugin.rst b/classes/class_editornode3dgizmoplugin.rst index c75964bdb9c..786f2010410 100644 --- a/classes/class_editornode3dgizmoplugin.rst +++ b/classes/class_editornode3dgizmoplugin.rst @@ -12,7 +12,7 @@ EditorNode3DGizmoPlugin **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Used by the editor to define Node3D gizmo types. +A class used by the editor to define Node3D gizmo types. .. rst-class:: classref-introduction-group diff --git a/classes/class_editorproperty.rst b/classes/class_editorproperty.rst index 8cb02a9f0a2..a5ff52a2098 100644 --- a/classes/class_editorproperty.rst +++ b/classes/class_editorproperty.rst @@ -12,14 +12,14 @@ EditorProperty **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Custom control to edit properties for adding into the inspector. +Custom control for editing properties that can be added to the :ref:`EditorInspector`. .. rst-class:: classref-introduction-group Description ----------- -This control allows property editing for one or multiple properties into :ref:`EditorInspector`. It is added via :ref:`EditorInspectorPlugin`. +A custom control for editing properties that can be added to the :ref:`EditorInspector`. It is added via :ref:`EditorInspectorPlugin`. .. rst-class:: classref-reftable-group diff --git a/classes/class_editorresourcepreview.rst b/classes/class_editorresourcepreview.rst index 249921c4f9c..d7f89c79b6b 100644 --- a/classes/class_editorresourcepreview.rst +++ b/classes/class_editorresourcepreview.rst @@ -12,14 +12,14 @@ EditorResourcePreview **Inherits:** :ref:`Node` **<** :ref:`Object` -Helper to generate previews of resources or files. +A node used to generate previews of resources or files. .. rst-class:: classref-introduction-group Description ----------- -This object is used to generate previews for resources of files. +This node is used to generate previews for resources of files. \ **Note:** This class shouldn't be instantiated directly. Instead, access the singleton using :ref:`EditorInterface.get_resource_previewer`. diff --git a/classes/class_editorresourcetooltipplugin.rst b/classes/class_editorresourcetooltipplugin.rst index c9c66e1c2f3..d4a7ad3cd52 100644 --- a/classes/class_editorresourcetooltipplugin.rst +++ b/classes/class_editorresourcetooltipplugin.rst @@ -31,15 +31,13 @@ Methods .. table:: :widths: auto - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`_handles` **(** :ref:`String` type **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Object` | :ref:`_make_tooltip_for_path` **(** :ref:`String` path, :ref:`Dictionary` metadata **)** |virtual| |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`VBoxContainer` | :ref:`make_default_tooltip` **(** :ref:`String` path **)** |static| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`request_thumbnail` **(** :ref:`String` path, :ref:`TextureRect` control **)** |const| | - +-------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`_handles` **(** :ref:`String` type **)** |virtual| |const| | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Control` | :ref:`_make_tooltip_for_path` **(** :ref:`String` path, :ref:`Dictionary` metadata, :ref:`Control` base **)** |virtual| |const| | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`request_thumbnail` **(** :ref:`String` path, :ref:`TextureRect` control **)** |const| | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -66,25 +64,25 @@ Return ``true`` if the plugin is going to handle the given :ref:`Resource` **_make_tooltip_for_path** **(** :ref:`String` path, :ref:`Dictionary` metadata **)** |virtual| |const| +:ref:`Control` **_make_tooltip_for_path** **(** :ref:`String` path, :ref:`Dictionary` metadata, :ref:`Control` base **)** |virtual| |const| -Create and return a tooltip that will be displayed when the user hovers resource under given ``path`` in filesystem dock. For best results, use :ref:`make_default_tooltip` as a base. +Create and return a tooltip that will be displayed when the user hovers a resource under the given ``path`` in filesystem dock. The ``metadata`` dictionary is provided by preview generator (see method EditorResourcePreviewGenerator._generate]). -\ **Note:** It's unadvised to use :ref:`ResourceLoader.load`, especially with heavy resources like models or textures, because it will make the editor unresponsive when creating the tooltip. You can use :ref:`request_thumbnail` if you want to display a preview in your tooltip. - -.. rst-class:: classref-item-separator +\ ``base`` is the base default tooltip, which is a :ref:`VBoxContainer` with a file name, type and size labels. If another plugin handled the same file type, ``base`` will be output from the previous plugin. For best result, make sure the base tooltip is part of the returned :ref:`Control`. ----- - -.. _class_EditorResourceTooltipPlugin_method_make_default_tooltip: +\ **Note:** It's unadvised to use :ref:`ResourceLoader.load`, especially with heavy resources like models or textures, because it will make the editor unresponsive when creating the tooltip. You can use :ref:`request_thumbnail` if you want to display a preview in your tooltip. -.. rst-class:: classref-method +\ **Note:** If you decide to discard the ``base``, make sure to call :ref:`Node.queue_free`, because it's not freed automatically. -:ref:`VBoxContainer` **make_default_tooltip** **(** :ref:`String` path **)** |static| +:: -Creates a default file tooltip. The tooltip includes file name, file size and :ref:`Resource` type if available. + func _make_tooltip_for_path(path, metadata, base): + var t_rect = TextureRect.new() + request_thumbnail(path, t_rect) + base.add_child(t_rect) # The TextureRect will appear at the bottom of the tooltip. + return base .. rst-class:: classref-item-separator diff --git a/classes/class_editorsettings.rst b/classes/class_editorsettings.rst index a259033ff75..7a40b941d16 100644 --- a/classes/class_editorsettings.rst +++ b/classes/class_editorsettings.rst @@ -89,8 +89,6 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`editors/2d/bone_width` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`editors/2d/constrain_editor_view` | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Color` | :ref:`editors/2d/grid_color` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Color` | :ref:`editors/2d/guides_color` | @@ -395,8 +393,6 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`text_editor/appearance/gutters/line_numbers_zero_padded` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`text_editor/appearance/gutters/show_bookmark_gutter` | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`text_editor/appearance/gutters/show_info_gutter` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`text_editor/appearance/gutters/show_line_numbers` | @@ -813,18 +809,6 @@ The bone width in the 2D skeleton editor (in pixels). See also :ref:`editors/2d/ ---- -.. _class_EditorSettings_property_editors/2d/constrain_editor_view: - -.. rst-class:: classref-property - -:ref:`bool` **editors/2d/constrain_editor_view** - -If ``true``, prevents the 2D editor viewport from leaving the scene. Limits are calculated dynamically based on nodes present in the current scene. If ``false``, the 2D editor viewport will be able to move freely, but you risk getting lost when zooming out too far. You can refocus on the scene by selecting a node then pressing :kbd:`F`. - -.. rst-class:: classref-item-separator - ----- - .. _class_EditorSettings_property_editors/2d/grid_color: .. rst-class:: classref-property @@ -2753,25 +2737,13 @@ If ``true``, displays line numbers with zero padding (e.g. ``007`` instead of `` ---- -.. _class_EditorSettings_property_text_editor/appearance/gutters/show_bookmark_gutter: - -.. rst-class:: classref-property - -:ref:`bool` **text_editor/appearance/gutters/show_bookmark_gutter** - -If ``true``, displays icons for bookmarks in a gutter at the left. Bookmarks remain functional when this setting is disabled. - -.. rst-class:: classref-item-separator - ----- - .. _class_EditorSettings_property_text_editor/appearance/gutters/show_info_gutter: .. rst-class:: classref-property :ref:`bool` **text_editor/appearance/gutters/show_info_gutter** -If ``true``, displays a gutter at the left containing icons for methods with signal connections. +If ``true``, displays a gutter at the left containing icons for methods with signal connections and for overridden methods. .. rst-class:: classref-item-separator diff --git a/classes/class_editorsyntaxhighlighter.rst b/classes/class_editorsyntaxhighlighter.rst index 17b9f482ca9..6357b895f19 100644 --- a/classes/class_editorsyntaxhighlighter.rst +++ b/classes/class_editorsyntaxhighlighter.rst @@ -12,14 +12,14 @@ EditorSyntaxHighlighter **Inherits:** :ref:`SyntaxHighlighter` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Base Syntax highlighter resource for the :ref:`ScriptEditor`. +Base class for :ref:`SyntaxHighlighter` used by the :ref:`ScriptEditor`. .. rst-class:: classref-introduction-group Description ----------- -Base syntax highlighter resource all editor syntax highlighters extend from, it is used in the :ref:`ScriptEditor`. +Base class that all :ref:`SyntaxHighlighter`\ s used by the :ref:`ScriptEditor` extend from. Add a syntax highlighter to an individual script by calling :ref:`ScriptEditorBase.add_syntax_highlighter`. To apply to all scripts on open, call :ref:`ScriptEditor.register_syntax_highlighter` diff --git a/classes/class_engine.rst b/classes/class_engine.rst index 7c4ec586704..ce6b666ea91 100644 --- a/classes/class_engine.rst +++ b/classes/class_engine.rst @@ -12,7 +12,7 @@ Engine **Inherits:** :ref:`Object` -Access to engine properties. +Provides access to engine properties. .. rst-class:: classref-introduction-group diff --git a/classes/class_fileaccess.rst b/classes/class_fileaccess.rst index 876b8148981..4cf9c3c4e26 100644 --- a/classes/class_fileaccess.rst +++ b/classes/class_fileaccess.rst @@ -12,14 +12,14 @@ FileAccess **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Type to handle file reading and writing operations. +Provides methods for file reading and writing operations. .. rst-class:: classref-introduction-group Description ----------- -File type. This is used to permanently store data into the user device's file system and to read from it. This can be used to store game save data or player configuration files, for example. +This class can be used to permanently store data in the user device's file system and to read from it. This is useful for store game save data or player configuration files. Here's a sample on how to write and read from a file: @@ -56,24 +56,9 @@ Here's a sample on how to write and read from a file: In the example above, the file will be saved in the user data folder as specified in the :doc:`Data paths <../tutorials/io/data_paths>` documentation. -\ **FileAccess** will close when it's freed, which happens when it goes out of scope or when it gets assigned with ``null``. In C# the reference must be disposed after we are done using it, this can be done with the ``using`` statement or calling the ``Dispose`` method directly. +\ **FileAccess** will close when it's freed, which happens when it goes out of scope or when it gets assigned with ``null``. :ref:`close` can be used to close it before then explicitly. In C# the reference must be disposed manually, which can be done with the ``using`` statement or by calling the ``Dispose`` method directly. - -.. tabs:: - - .. code-tab:: gdscript - - var file = FileAccess.open("res://something") # File is opened and locked for use. - file = null # File is closed. - - .. code-tab:: csharp - - using var file = FileAccess.Open("res://something"); // File is opened and locked for use. - // The using statement calls Dispose when going out of scope. - - - -\ **Note:** To access project resources once exported, it is recommended to use :ref:`ResourceLoader` instead of the **FileAccess** API, as some files are converted to engine-specific formats and their original source files might not be present in the exported PCK package. +\ **Note:** To access project resources once exported, it is recommended to use :ref:`ResourceLoader` instead of **FileAccess**, as some files are converted to engine-specific formats and their original source files might not be present in the exported PCK package. \ **Note:** Files are automatically closed only if the process exits "normally" (such as by clicking the window manager's close button or pressing **Alt + F4**). If you stop the project execution by pressing **F8** while the project is running, the file won't be closed as the game process will be killed. You can work around this by calling :ref:`flush` at regular intervals. diff --git a/classes/class_filedialog.rst b/classes/class_filedialog.rst index 9ab009a9158..1b0dd2ecdc0 100644 --- a/classes/class_filedialog.rst +++ b/classes/class_filedialog.rst @@ -12,14 +12,14 @@ FileDialog **Inherits:** :ref:`ConfirmationDialog` **<** :ref:`AcceptDialog` **<** :ref:`Window` **<** :ref:`Viewport` **<** :ref:`Node` **<** :ref:`Object` -Dialog for selecting files or directories in the filesystem. +A dialog for selecting files or directories in the filesystem. .. rst-class:: classref-introduction-group Description ----------- -FileDialog is a preset dialog used to choose files and directories in the filesystem. It supports filter masks. The FileDialog automatically sets its window title according to the :ref:`file_mode`. If you want to use a custom title, disable this by setting :ref:`mode_overrides_title` to ``false``. +**FileDialog** is a preset dialog used to choose files and directories in the filesystem. It supports filter masks. **FileDialog** automatically sets its window title according to the :ref:`file_mode`. If you want to use a custom title, disable this by setting :ref:`mode_overrides_title` to ``false``. .. rst-class:: classref-reftable-group diff --git a/classes/class_filesystemdock.rst b/classes/class_filesystemdock.rst index f67b2eb41ca..b98c8de8a87 100644 --- a/classes/class_filesystemdock.rst +++ b/classes/class_filesystemdock.rst @@ -12,7 +12,7 @@ FileSystemDock **Inherits:** :ref:`VBoxContainer` **<** :ref:`BoxContainer` **<** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Editor dock for managing files in the project. +Godot editor's dock for managing files in the project. .. rst-class:: classref-introduction-group @@ -21,7 +21,7 @@ Description This class is available only in :ref:`EditorPlugin`\ s and can't be instantiated. You can access it using :ref:`EditorInterface.get_file_system_dock`. -While FileSystemDock doesn't expose any methods for file manipulation, you can listen for various file-related signals. +While **FileSystemDock** doesn't expose any methods for file manipulation, it can listen for various file-related signals. .. rst-class:: classref-reftable-group diff --git a/classes/class_float.rst b/classes/class_float.rst index d7e59a9a1f6..b8bc8076a98 100644 --- a/classes/class_float.rst +++ b/classes/class_float.rst @@ -10,18 +10,18 @@ float ===== -Float built-in type. +A built-in type for floating point numbers. .. rst-class:: classref-introduction-group Description ----------- -The **float** built-in type is a 64-bit double-precision floating-point number, equivalent to ``double`` in C++. This type has 14 reliable decimal digits of precision. The **float** type can be stored in :ref:`Variant`, which is the generic type used by the engine. The maximum value of **float** is approximately ``1.79769e308``, and the minimum is approximately ``-1.79769e308``. +The **float** built-in type is a 64-bit double-precision floating-point number, equivalent to ``double`` in C++. This type has 14 reliable decimal digits of precision. The maximum value of **float** is approximately ``1.79769e308``, and the minimum is approximately ``-1.79769e308``. Many methods and properties in the engine use 32-bit single-precision floating-point numbers instead, equivalent to ``float`` in C++, which have 6 reliable decimal digits of precision. For data structures such as :ref:`Vector2` and :ref:`Vector3`, Godot uses 32-bit floating-point numbers by default, but it can be changed to use 64-bit doubles if Godot is compiled with the ``precision=double`` option. -Math done using the **float** type is not guaranteed to be exact or deterministic, and will often result in small errors. You should usually use the :ref:`@GlobalScope.is_equal_approx` and :ref:`@GlobalScope.is_zero_approx` methods instead of ``==`` to compare **float** values for equality. +Math done using the **float** type is not guaranteed to be exact and will often result in small errors. You should usually use the :ref:`@GlobalScope.is_equal_approx` and :ref:`@GlobalScope.is_zero_approx` methods instead of ``==`` to compare **float** values for equality. .. rst-class:: classref-introduction-group @@ -200,6 +200,8 @@ Operator Descriptions Returns ``true`` if two floats are different from each other. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -222,7 +224,7 @@ Returns ``true`` if the integer has different value than the float. :ref:`Color` **operator *** **(** :ref:`Color` right **)** -Multiplies each component of the :ref:`Color` by the given **float**. +Multiplies each component of the :ref:`Color`, including the alpha, by the given **float**. :: @@ -468,6 +470,8 @@ Divides a **float** by an :ref:`int`. The result is a **float**. Returns ``true`` if the left float is less than the right one. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -492,6 +496,8 @@ Returns ``true`` if this **float** is less than the given :ref:`int`. Returns ``true`` if the left float is less than or equal to the right one. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -518,6 +524,8 @@ Returns ``true`` if both floats are exactly equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`@GlobalScope.is_equal_approx` or :ref:`@GlobalScope.is_zero_approx` instead, which are more reliable. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -542,6 +550,8 @@ Returns ``true`` if the **float** and the given :ref:`int` are equal. Returns ``true`` if the left float is greater than the right one. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -566,6 +576,8 @@ Returns ``true`` if this **float** is greater than the given :ref:`int` doesn't behave the same as other numbers. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_flowcontainer.rst b/classes/class_flowcontainer.rst index 943a33194e5..862e9d7b5d5 100644 --- a/classes/class_flowcontainer.rst +++ b/classes/class_flowcontainer.rst @@ -14,16 +14,21 @@ FlowContainer **Inherited By:** :ref:`HFlowContainer`, :ref:`VFlowContainer` -Base class for flow containers. +A container that arranges its child controls horizontally or vertically and wraps them around at the borders. .. rst-class:: classref-introduction-group Description ----------- -Arranges child :ref:`Control` nodes vertically or horizontally in a left-to-right or top-to-bottom flow. +A container that arranges its child controls horizontally or vertically and wraps them around at the borders. This is similar to how text in a book wraps around when no more words can fit on a line. -A line is filled with :ref:`Control` nodes until no more fit on the same line, similar to text in an autowrapped label. +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_font.rst b/classes/class_font.rst index d53cd4edc8f..7cf794d10e1 100644 --- a/classes/class_font.rst +++ b/classes/class_font.rst @@ -14,14 +14,14 @@ Font **Inherited By:** :ref:`FontFile`, :ref:`FontVariation`, :ref:`SystemFont` -Base class for fonts and font variations. +Abstract base class for fonts and font variations. .. rst-class:: classref-introduction-group Description ----------- -Font is the abstract base class for font, so it shouldn't be used directly. Other types of fonts inherit from it. +Abstract base class for different font types. It has methods for drawing text and font character introspection. .. rst-class:: classref-reftable-group diff --git a/classes/class_fontfile.rst b/classes/class_fontfile.rst index 4a611a30b28..902e05dd6e1 100644 --- a/classes/class_fontfile.rst +++ b/classes/class_fontfile.rst @@ -12,7 +12,7 @@ FontFile **Inherits:** :ref:`Font` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Font source data and prerendered glyph cache, imported from dynamic or bitmap font. +Holds font source data and prerendered glyph cache, imported from a dynamic or a bitmap font. .. rst-class:: classref-introduction-group @@ -35,9 +35,9 @@ Supported font formats: \ **Note:** A character is a symbol that represents an item (letter, digit etc.) in an abstract way. -\ **Note:** A glyph is a bitmap or shape used to draw one or more characters in a context-dependent manner. Glyph indices are bound to the specific font data source. +\ **Note:** A glyph is a bitmap or a shape used to draw one or more characters in a context-dependent manner. Glyph indices are bound to the specific font data source. -\ **Note:** If a none of the font data sources contain glyphs for a character used in a string, the character in question will be replaced with a box displaying its hexadecimal code. +\ **Note:** If none of the font data sources contain glyphs for a character used in a string, the character in question will be replaced with a box displaying its hexadecimal code. .. tabs:: diff --git a/classes/class_fontvariation.rst b/classes/class_fontvariation.rst index ed48d8300ad..3d5ba494c41 100644 --- a/classes/class_fontvariation.rst +++ b/classes/class_fontvariation.rst @@ -12,14 +12,14 @@ FontVariation **Inherits:** :ref:`Font` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Variation of the :ref:`Font`. +A variation of a font with additional settings. .. rst-class:: classref-introduction-group Description ----------- -OpenType variations, simulated bold / slant, and additional font settings like OpenType features and extra spacing. +Provides OpenType variations, simulated bold / slant, and additional font settings like OpenType features and extra spacing. To use simulated bold font variant: diff --git a/classes/class_generic6dofjoint3d.rst b/classes/class_generic6dofjoint3d.rst index a154d1572a9..f00d0bbb4b8 100644 --- a/classes/class_generic6dofjoint3d.rst +++ b/classes/class_generic6dofjoint3d.rst @@ -12,14 +12,16 @@ Generic6DOFJoint3D **Inherits:** :ref:`Joint3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -The generic 6-degrees-of-freedom joint can implement a variety of joint types by locking certain axes' rotation or translation. +A physics joint that allows for complex movement and rotation between two 3D physics bodies. .. rst-class:: classref-introduction-group Description ----------- -The first 3 DOF axes are linear axes, which represent translation of Bodies, and the latter 3 DOF axes represent the angular motion. Each axis can be either locked, or limited. +The **Generic6DOFJoint3D** (6 Degrees Of Freedom) joint allows for implementing custom types of joints by locking the rotation and translation of certain axes. + +The first 3 DOF represent the linear motion of the physics bodies and the last 3 DOF represent the angular motion of the physics bodies. Each axis can be either locked, or limited. .. rst-class:: classref-reftable-group diff --git a/classes/class_geometry2d.rst b/classes/class_geometry2d.rst index f97703f6049..168c23f0481 100644 --- a/classes/class_geometry2d.rst +++ b/classes/class_geometry2d.rst @@ -12,14 +12,14 @@ Geometry2D **Inherits:** :ref:`Object` -Helper node to calculate generic geometry operations in 2D space. +Provides methods for some common 2D geometric operations. .. rst-class:: classref-introduction-group Description ----------- -Geometry2D provides users with a set of helper functions to create geometric shapes, compute intersections between shapes, and process various other geometric operations. +Provides a set of helper functions to create geometric shapes, compute intersections between shapes, and process various other geometric operations in 2D. .. rst-class:: classref-reftable-group diff --git a/classes/class_geometry3d.rst b/classes/class_geometry3d.rst index 1f866f21cd1..af0b8a0352a 100644 --- a/classes/class_geometry3d.rst +++ b/classes/class_geometry3d.rst @@ -12,14 +12,14 @@ Geometry3D **Inherits:** :ref:`Object` -Helper node to calculate generic geometry operations in 3D space. +Provides methods for some common 3D geometric operations. .. rst-class:: classref-introduction-group Description ----------- -Geometry3D provides users with a set of helper functions to create geometric shapes, compute intersections between shapes, and process various other geometric operations. +Provides a set of helper functions to create geometric shapes, compute intersections between shapes, and process various other geometric operations in 3D. .. rst-class:: classref-reftable-group diff --git a/classes/class_gltfstate.rst b/classes/class_gltfstate.rst index 42f885fb904..f190555ff6c 100644 --- a/classes/class_gltfstate.rst +++ b/classes/class_gltfstate.rst @@ -88,6 +88,8 @@ Methods +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`GLTFMesh[]` | :ref:`get_meshes` **(** **)** | +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_node_index` **(** :ref:`Node` scene_node **)** | + +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`GLTFNode[]` | :ref:`get_nodes` **(** **)** | +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Node` | :ref:`get_scene_node` **(** :ref:`int` idx **)** | @@ -546,6 +548,20 @@ Returns an array of all :ref:`GLTFMesh`\ es in the GLTF file. Th ---- +.. _class_GLTFState_method_get_node_index: + +.. rst-class:: classref-method + +:ref:`int` **get_node_index** **(** :ref:`Node` scene_node **)** + +Returns the index of the :ref:`GLTFNode` corresponding to this Godot scene node. This is the inverse of :ref:`get_scene_node`. Useful during the export process. + +\ **Note:** Not every Godot scene node will have a corresponding :ref:`GLTFNode`, and not every :ref:`GLTFNode` will have a scene node generated. If there is no :ref:`GLTFNode` index for this scene node, ``-1`` is returned. + +.. rst-class:: classref-item-separator + +---- + .. _class_GLTFState_method_get_nodes: .. rst-class:: classref-method @@ -564,7 +580,9 @@ Returns an array of all :ref:`GLTFNode`\ s in the GLTF file. The :ref:`Node` **get_scene_node** **(** :ref:`int` idx **)** -Returns the Godot scene node that corresponds to the same index as the :ref:`GLTFNode` it was generated from. Not every :ref:`GLTFNode` will have a scene node generated, and not every generated scene node will have a corresponding :ref:`GLTFNode`. +Returns the Godot scene node that corresponds to the same index as the :ref:`GLTFNode` it was generated from. This is the inverse of :ref:`get_node_index`. Useful during the import process. + +\ **Note:** Not every :ref:`GLTFNode` will have a scene node generated, and not every generated scene node will have a corresponding :ref:`GLTFNode`. If there is no scene node for this :ref:`GLTFNode` index, ``null`` is returned. .. rst-class:: classref-item-separator diff --git a/classes/class_gradient.rst b/classes/class_gradient.rst index 577b425424e..8fdeb2b646e 100644 --- a/classes/class_gradient.rst +++ b/classes/class_gradient.rst @@ -31,13 +31,15 @@ Properties .. table:: :widths: auto - +-----------------------------------------------------------+-----------------------------------------------------------------------+----------------------------------------------+ - | :ref:`PackedColorArray` | :ref:`colors` | ``PackedColorArray(0, 0, 0, 1, 1, 1, 1, 1)`` | - +-----------------------------------------------------------+-----------------------------------------------------------------------+----------------------------------------------+ - | :ref:`InterpolationMode` | :ref:`interpolation_mode` | ``0`` | - +-----------------------------------------------------------+-----------------------------------------------------------------------+----------------------------------------------+ - | :ref:`PackedFloat32Array` | :ref:`offsets` | ``PackedFloat32Array(0, 1)`` | - +-----------------------------------------------------------+-----------------------------------------------------------------------+----------------------------------------------+ + +-----------------------------------------------------------+-------------------------------------------------------------------------------------+----------------------------------------------+ + | :ref:`PackedColorArray` | :ref:`colors` | ``PackedColorArray(0, 0, 0, 1, 1, 1, 1, 1)`` | + +-----------------------------------------------------------+-------------------------------------------------------------------------------------+----------------------------------------------+ + | :ref:`ColorSpace` | :ref:`interpolation_color_space` | ``0`` | + +-----------------------------------------------------------+-------------------------------------------------------------------------------------+----------------------------------------------+ + | :ref:`InterpolationMode` | :ref:`interpolation_mode` | ``0`` | + +-----------------------------------------------------------+-------------------------------------------------------------------------------------+----------------------------------------------+ + | :ref:`PackedFloat32Array` | :ref:`offsets` | ``PackedFloat32Array(0, 1)`` | + +-----------------------------------------------------------+-------------------------------------------------------------------------------------+----------------------------------------------+ .. rst-class:: classref-reftable-group @@ -106,6 +108,40 @@ Constant interpolation, color changes abruptly at each point and stays uniform b Cubic interpolation. +.. rst-class:: classref-item-separator + +---- + +.. _enum_Gradient_ColorSpace: + +.. rst-class:: classref-enumeration + +enum **ColorSpace**: + +.. _class_Gradient_constant_GRADIENT_COLOR_SPACE_SRGB: + +.. rst-class:: classref-enumeration-constant + +:ref:`ColorSpace` **GRADIENT_COLOR_SPACE_SRGB** = ``0`` + +sRGB color space. + +.. _class_Gradient_constant_GRADIENT_COLOR_SPACE_LINEAR_SRGB: + +.. rst-class:: classref-enumeration-constant + +:ref:`ColorSpace` **GRADIENT_COLOR_SPACE_LINEAR_SRGB** = ``1`` + +Linear sRGB color space. + +.. _class_Gradient_constant_GRADIENT_COLOR_SPACE_OKLAB: + +.. rst-class:: classref-enumeration-constant + +:ref:`ColorSpace` **GRADIENT_COLOR_SPACE_OKLAB** = ``2`` + +`Oklab `__ color space. This color space provides a smooth and uniform-looking transition between colors. + .. rst-class:: classref-section-separator ---- @@ -132,6 +168,25 @@ Gradient's colors returned as a :ref:`PackedColorArray`. ---- +.. _class_Gradient_property_interpolation_color_space: + +.. rst-class:: classref-property + +:ref:`ColorSpace` **interpolation_color_space** = ``0`` + +.. rst-class:: classref-property-setget + +- void **set_interpolation_color_space** **(** :ref:`ColorSpace` value **)** +- :ref:`ColorSpace` **get_interpolation_color_space** **(** **)** + +The color space used to interpolate between points of the gradient. It does not affect the returned colors, which will always be in sRGB space. See :ref:`ColorSpace` for available modes. + +\ **Note:** This setting has no effect when :ref:`interpolation_mode` is set to :ref:`GRADIENT_INTERPOLATE_CONSTANT`. + +.. rst-class:: classref-item-separator + +---- + .. _class_Gradient_property_interpolation_mode: .. rst-class:: classref-property @@ -143,7 +198,7 @@ Gradient's colors returned as a :ref:`PackedColorArray`. - void **set_interpolation_mode** **(** :ref:`InterpolationMode` value **)** - :ref:`InterpolationMode` **get_interpolation_mode** **(** **)** -Defines how the colors between points of the gradient are interpolated. See :ref:`InterpolationMode` for available modes. +The algorithm used to interpolate between points of the gradient. See :ref:`InterpolationMode` for available modes. .. rst-class:: classref-item-separator diff --git a/classes/class_gradienttexture2d.rst b/classes/class_gradienttexture2d.rst index d9913c3af51..11f191c422e 100644 --- a/classes/class_gradienttexture2d.rst +++ b/classes/class_gradienttexture2d.rst @@ -80,6 +80,14 @@ The colors are linearly interpolated in a straight line. The colors are linearly interpolated in a circular pattern. +.. _class_GradientTexture2D_constant_FILL_SQUARE: + +.. rst-class:: classref-enumeration-constant + +:ref:`Fill` **FILL_SQUARE** = ``2`` + +The colors are linearly interpolated in a square pattern. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_graphedit.rst b/classes/class_graphedit.rst index 752fb56f360..37b1e1207a9 100644 --- a/classes/class_graphedit.rst +++ b/classes/class_graphedit.rst @@ -12,18 +12,16 @@ GraphEdit **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -GraphEdit is a control responsible for displaying and manipulating graph-like data using :ref:`GraphNode`\ s. It provides access to creation, removal, connection, and disconnection of nodes. +An editor for graph-like structures, using :ref:`GraphNode`\ s. .. rst-class:: classref-introduction-group Description ----------- -**Note:** Please be aware that this node will undergo extensive refactoring in a future 4.x version involving compatibility-breaking API changes. +**GraphEdit** provides tools for creation, manipulation, and display of various graphs. Its main purpose in the engine is to power the visual programming systems, such as visual shaders, but it is also available for use in user projects. -GraphEdit provides tools for creation, manipulation, and display of various graphs. Its main purpose in the engine is to power the visual programming systems, such as visual shaders, but it is also available for use in user projects. - -GraphEdit by itself is only an empty container, representing an infinite grid where :ref:`GraphNode`\ s can be placed. Each :ref:`GraphNode` represent a node in the graph, a single unit of data in the connected scheme. GraphEdit, in turn, helps to control various interactions with nodes and between nodes. When the user attempts to connect, disconnect, or close a :ref:`GraphNode`, a signal is emitted in the GraphEdit, but no action is taken by default. It is the responsibility of the programmer utilizing this control to implement the necessary logic to determine how each request should be handled. +\ **GraphEdit** by itself is only an empty container, representing an infinite grid where :ref:`GraphNode`\ s can be placed. Each :ref:`GraphNode` represents a node in the graph, a single unit of data in the connected scheme. **GraphEdit**, in turn, helps to control various interactions with nodes and between nodes. When the user attempts to connect, disconnect, or close a :ref:`GraphNode`, a signal is emitted in the **GraphEdit**, but no action is taken by default. It is the responsibility of the programmer utilizing this control to implement the necessary logic to determine how each request should be handled. \ **Performance:** It is greatly advised to enable low-processor usage mode (see :ref:`OS.low_processor_usage_mode`) when using GraphEdits. diff --git a/classes/class_graphnode.rst b/classes/class_graphnode.rst index 40e5af47b9c..11bba183c16 100644 --- a/classes/class_graphnode.rst +++ b/classes/class_graphnode.rst @@ -12,22 +12,20 @@ GraphNode **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -GraphNode is a :ref:`Container` control that represents a single data unit in a :ref:`GraphEdit` graph. You can customize the number, type, and color of left- and right-side connection ports. +A container with connection ports, representing a node in a :ref:`GraphEdit`. .. rst-class:: classref-introduction-group Description ----------- -**Note:** Please be aware that this node will undergo extensive refactoring in a future 4.x version involving compatibility-breaking API changes. +**GraphNode** allows to create nodes for a :ref:`GraphEdit` graph with customizable content based on its child controls. **GraphNode** is derived from :ref:`Container` and it is responsible for placing its children on screen. This works similar to :ref:`VBoxContainer`. Children, in turn, provide **GraphNode** with so-called slots, each of which can have a connection port on either side. -GraphNode allows to create nodes for a :ref:`GraphEdit` graph with customizable content based on its child :ref:`Control`\ s. GraphNode is a :ref:`Container` and is responsible for placing its children on screen. This works similar to :ref:`VBoxContainer`. Children, in turn, provide GraphNode with so-called slots, each of which can have a connection port on either side. This is similar to how :ref:`TabContainer` uses children to create the tabs. - -Each GraphNode slot is defined by its index and can provide the node with up to two ports: one on the left, and one on the right. By convention the left port is also referred to as the input port and the right port is referred to as the output port. Each port can be enabled and configured individually, using different type and color. The type is an arbitrary value that you can define using your own considerations. The parent :ref:`GraphEdit` will receive this information on each connect and disconnect request. +Each **GraphNode** slot is defined by its index and can provide the node with up to two ports: one on the left, and one on the right. By convention the left port is also referred to as the **input port** and the right port is referred to as the **output port**. Each port can be enabled and configured individually, using different type and color. The type is an arbitrary value that you can define using your own considerations. The parent :ref:`GraphEdit` will receive this information on each connect and disconnect request. Slots can be configured in the Inspector dock once you add at least one child :ref:`Control`. The properties are grouped by each slot's index in the "Slot" section. -\ **Note:** While GraphNode is set up using slots and slot indices, connections are made between the ports which are enabled. Because of that :ref:`GraphEdit` uses port's index and not slot's index. You can use :ref:`get_connection_input_slot` and :ref:`get_connection_output_slot` to get the slot index from the port index. +\ **Note:** While GraphNode is set up using slots and slot indices, connections are made between the ports which are enabled. Because of that, :ref:`GraphEdit` uses the port's index and not the slot's index. You can use :ref:`get_connection_input_slot` and :ref:`get_connection_output_slot` to get the slot index from the port index. .. rst-class:: classref-reftable-group diff --git a/classes/class_gridcontainer.rst b/classes/class_gridcontainer.rst index 00019f4451c..09701b1b18d 100644 --- a/classes/class_gridcontainer.rst +++ b/classes/class_gridcontainer.rst @@ -12,25 +12,23 @@ GridContainer **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Grid container used to arrange Control-derived children in a grid like layout. +A container that arranges its child controls in a grid layout. .. rst-class:: classref-introduction-group Description ----------- -GridContainer will arrange its Control-derived children in a grid like structure, the grid columns are specified using the :ref:`columns` property and the number of rows will be equal to the number of children in the container divided by the number of columns. For example, if the container has 5 children, and 2 columns, there will be 3 rows in the container. +**GridContainer** arranges its child controls in a grid layout. The number of columns is specified by the :ref:`columns` property, whereas the number of rows depends on how many are needed for the child controls. The number of rows and columns is preserved for every size of the container. -Notice that grid layout will preserve the columns and rows for every size of the container, and that empty columns will be expanded automatically. - -\ **Note:** GridContainer only works with child nodes inheriting from Control. It won't rearrange child nodes inheriting from Node2D. +\ **Note:** **GridContainer** only works with child nodes inheriting from :ref:`Control`. It won't rearrange child nodes inheriting from :ref:`Node2D`. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` - `OS Test Demo `__ diff --git a/classes/class_groovejoint2d.rst b/classes/class_groovejoint2d.rst index f150e0a0a76..770d6c199ab 100644 --- a/classes/class_groovejoint2d.rst +++ b/classes/class_groovejoint2d.rst @@ -12,14 +12,14 @@ GrooveJoint2D **Inherits:** :ref:`Joint2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Groove constraint for 2D physics. +A physics joint that restricts the movement of two 2D physics bodies to a fixed axis. .. rst-class:: classref-introduction-group Description ----------- -Groove constraint for 2D physics. This is useful for making a body "slide" through a segment placed in another. +A physics joint that restricts the movement of two 2D physics bodies to a fixed axis. For example, a :ref:`StaticBody2D` representing a piston base can be attached to a :ref:`RigidBody2D` representing the piston head, moving up and down. .. rst-class:: classref-reftable-group diff --git a/classes/class_hashingcontext.rst b/classes/class_hashingcontext.rst index 0f8934568ba..879d0ad0722 100644 --- a/classes/class_hashingcontext.rst +++ b/classes/class_hashingcontext.rst @@ -12,14 +12,14 @@ HashingContext **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Context to compute cryptographic hashes over multiple iterations. +Provides functionality for computing cryptographic hashes chunk by chunk. .. rst-class:: classref-introduction-group Description ----------- -The HashingContext class provides an interface for computing cryptographic hashes over multiple iterations. This is useful for example when computing hashes of big files (so you don't have to load them all in memory), network streams, and data streams in general (so you don't have to hold buffers). +The HashingContext class provides an interface for computing cryptographic hashes over multiple iterations. Useful for computing hashes of big files (so you don't have to load them all in memory), network streams, and data streams in general (so you don't have to hold buffers). The :ref:`HashType` enum shows the supported hashing algorithms. diff --git a/classes/class_hboxcontainer.rst b/classes/class_hboxcontainer.rst index 33859f18cbb..d304213d540 100644 --- a/classes/class_hboxcontainer.rst +++ b/classes/class_hboxcontainer.rst @@ -14,21 +14,21 @@ HBoxContainer **Inherited By:** :ref:`EditorResourcePicker` -Horizontal box container. +A container that arranges its child controls horizontally. .. rst-class:: classref-introduction-group Description ----------- -Horizontal box container. See :ref:`BoxContainer`. +A variant of :ref:`BoxContainer` that can only arrange its child controls horizontally. Child controls are rearranged automatically when their minimum size changes. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_heightmapshape3d.rst b/classes/class_heightmapshape3d.rst index 46f8074b964..8603b283b1f 100644 --- a/classes/class_heightmapshape3d.rst +++ b/classes/class_heightmapshape3d.rst @@ -12,16 +12,16 @@ HeightMapShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Height map shape resource for 3D physics. +A 3D height map shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -Height map shape resource, which can be added to a :ref:`PhysicsBody3D` or :ref:`Area3D`. Heightmap collision is typically used for colliding with terrains. However, since heightmaps cannot store overhangs, collisions with other structures (such as buildings) must be done with other collision shapes such as :ref:`ConcavePolygonShape3D`. If needed, "holes" can be created in an **HeightMapShape3D** by assigning very low points (like ``-100000``) in the desired area. +A 3D heightmap shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape3D`. This is useful for terrain, but it is limited as overhangs (such as caves) cannot be stored. Holes in a **HeightMapShape3D** are created by assigning very low values to points in the desired area. -\ **Performance:** **HeightMapShape3D** is faster to check collisions against compared to :ref:`ConcavePolygonShape3D`, but it is slower than primitive collision shapes such as :ref:`SphereShape3D` or :ref:`BoxShape3D`. +\ **Performance:** **HeightMapShape3D** is faster to check collisions against than :ref:`ConcavePolygonShape3D`, but it is significantly slower than primitive shapes like :ref:`BoxShape3D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_hflowcontainer.rst b/classes/class_hflowcontainer.rst index 580a1fe892c..00ab895c355 100644 --- a/classes/class_hflowcontainer.rst +++ b/classes/class_hflowcontainer.rst @@ -12,14 +12,21 @@ HFlowContainer **Inherits:** :ref:`FlowContainer` **<** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Horizontal flow container. +A container that arranges its child controls horizontally and wraps them around at the borders. .. rst-class:: classref-introduction-group Description ----------- -Horizontal version of :ref:`FlowContainer`. +A variant of :ref:`FlowContainer` that can only arrange its child controls horizontally, wrapping them around at the borders. This is similar to how text in a book wraps around when no more words can fit on a line. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_hingejoint3d.rst b/classes/class_hingejoint3d.rst index 1c852c33770..47e56490aff 100644 --- a/classes/class_hingejoint3d.rst +++ b/classes/class_hingejoint3d.rst @@ -12,14 +12,14 @@ HingeJoint3D **Inherits:** :ref:`Joint3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -A hinge between two 3D PhysicsBodies. +A physics joint that restricts the rotation of a 3D physics body around an axis relative to another physics body. .. rst-class:: classref-introduction-group Description ----------- -A HingeJoint3D normally uses the Z axis of body A as the hinge axis, another axis can be specified when adding it manually though. See also :ref:`Generic6DOFJoint3D`. +A physics joint that restricts the rotation of a 3D physics body around an axis relative to another physics body. For example, Body A can be a :ref:`StaticBody3D` representing a door hinge that a :ref:`RigidBody3D` rotates around. .. rst-class:: classref-reftable-group diff --git a/classes/class_hscrollbar.rst b/classes/class_hscrollbar.rst index fc55875a1f1..6017dd3c86c 100644 --- a/classes/class_hscrollbar.rst +++ b/classes/class_hscrollbar.rst @@ -12,14 +12,14 @@ HScrollBar **Inherits:** :ref:`ScrollBar` **<** :ref:`Range` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Horizontal scroll bar. +A horizontal scrollbar that goes from left (min) to right (max). .. rst-class:: classref-introduction-group Description ----------- -Horizontal version of :ref:`ScrollBar`, which goes from left (min) to right (max). +A horizontal scrollbar, typically used to navigate through content that extends beyond the visible width of a control. It is a :ref:`Range`-based control and goes from left (min) to right (max). .. rst-class:: classref-reftable-group diff --git a/classes/class_hseparator.rst b/classes/class_hseparator.rst index 06f01ed7ec1..150e0f99fb7 100644 --- a/classes/class_hseparator.rst +++ b/classes/class_hseparator.rst @@ -12,14 +12,14 @@ HSeparator **Inherits:** :ref:`Separator` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Horizontal separator. +A horizontal line used for separating other controls. .. rst-class:: classref-introduction-group Description ----------- -Horizontal separator. See :ref:`Separator`. Even though it looks horizontal, it is used to separate objects vertically. +A horizontal separator used for separating other controls that are arranged **vertically**. **HSeparator** is purely visual and normally drawn as a :ref:`StyleBoxLine`. .. rst-class:: classref-reftable-group diff --git a/classes/class_hslider.rst b/classes/class_hslider.rst index b83747fc75e..800f756f39d 100644 --- a/classes/class_hslider.rst +++ b/classes/class_hslider.rst @@ -12,16 +12,14 @@ HSlider **Inherits:** :ref:`Slider` **<** :ref:`Range` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Horizontal slider. +A horizontal slider that goes from left (min) to right (max). .. rst-class:: classref-introduction-group Description ----------- -Horizontal slider. See :ref:`Slider`. This one goes from left (min) to right (max). - -\ **Note:** The :ref:`Range.changed` and :ref:`Range.value_changed` signals are part of the :ref:`Range` class which this class inherits from. +A horizontal slider, used to adjust a value by moving a grabber along a horizontal axis. It is a :ref:`Range`-based control and goes from left (min) to right (max). .. rst-class:: classref-reftable-group diff --git a/classes/class_hsplitcontainer.rst b/classes/class_hsplitcontainer.rst index 0f1dc3bd827..334c110e602 100644 --- a/classes/class_hsplitcontainer.rst +++ b/classes/class_hsplitcontainer.rst @@ -12,21 +12,21 @@ HSplitContainer **Inherits:** :ref:`SplitContainer` **<** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Horizontal split container. +A container that splits two child controls horizontally and provides a grabber for adjusting the split ratio. .. rst-class:: classref-introduction-group Description ----------- -Horizontal split container. See :ref:`SplitContainer`. This goes from left to right. +A container that accepts only two child controls, then arranges them horizontally and creates a divisor between them. The divisor can be dragged around to change the size relation between the child controls. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_httpclient.rst b/classes/class_httpclient.rst index 55bac119dce..3ad584fed49 100644 --- a/classes/class_httpclient.rst +++ b/classes/class_httpclient.rst @@ -27,7 +27,7 @@ See the :ref:`HTTPRequest` node for a higher-level alternativ A **HTTPClient** should be reused between multiple requests or to connect to different hosts instead of creating one client per request. Supports Transport Layer Security (TLS), including server certificate verification. HTTP status codes in the 2xx range indicate success, 3xx redirection (i.e. "try again, but over here"), 4xx something was wrong with the request, and 5xx something went wrong on the server's side. -For more information on HTTP, see https://developer.mozilla.org/en-US/docs/Web/HTTP (or read RFC 2616 to get it straight from the source: https://tools.ietf.org/html/rfc2616). +For more information on HTTP, see `MDN's documentation on HTTP `__ (or read `RFC 2616 `__ to get it straight from the source). \ **Note:** When exporting to Android, make sure to enable the ``INTERNET`` permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. diff --git a/classes/class_httprequest.rst b/classes/class_httprequest.rst index 4972f8174e3..94172fe96f7 100644 --- a/classes/class_httprequest.rst +++ b/classes/class_httprequest.rst @@ -49,7 +49,7 @@ Can be used to make HTTP requests, i.e. download or upload files or web content # Note: Don't make simultaneous requests using a single HTTPRequest node. # The snippet below is provided for reference only. var body = JSON.new().stringify({"name": "Godette"}) - error = http_request.request("https://httpbin.org/post", [], true, HTTPClient.METHOD_POST, body) + error = http_request.request("https://httpbin.org/post", [], HTTPClient.METHOD_POST, body) if error != OK: push_error("An error occurred in the HTTP request.") @@ -85,7 +85,7 @@ Can be used to make HTTP requests, i.e. download or upload files or web content { { "name", "Godette" } }); - error = httpRequest.Request("https://httpbin.org/post", null, true, HTTPClient.Method.Post, body); + error = httpRequest.Request("https://httpbin.org/post", null, HTTPClient.Method.Post, body); if (error != Error.Ok) { GD.PushError("An error occurred in the HTTP request."); @@ -386,7 +386,7 @@ Request reached its maximum redirect limit, see :ref:`max_redirects` **RESULT_TIMEOUT** = ``13`` - +Request failed due to a timeout. If you expect requests to take a long time, try increasing the value of :ref:`timeout` or setting it to ``0.0`` to remove the timeout completely. .. rst-class:: classref-section-separator @@ -501,7 +501,7 @@ Maximum number of allowed redirects. - void **set_timeout** **(** :ref:`float` value **)** - :ref:`float` **get_timeout** **(** **)** -If set to a value greater than ``0.0`` before the request starts, the HTTP request will time out after ``timeout`` seconds have passed and the request is not *completed* yet. For small HTTP requests such as REST API usage, set :ref:`timeout` to a value between ``10.0`` and ``30.0`` to prevent the application from getting stuck if the request fails to get a response in a timely manner. For file downloads, leave this to ``0.0`` to prevent the download from failing if it takes too much time. +The duration to wait in seconds before a request times out. If :ref:`timeout` is set to ``0.0`` then the request will never time out. For simple requests, such as communication with a REST API, it is recommended that :ref:`timeout` is set to a value suitable for the server response time (e.g. between ``1.0`` and ``10.0``). This will help prevent unwanted timeouts caused by variation in server response times while still allowing the application to detect when a request has timed out. For larger requests such as file downloads it is suggested the :ref:`timeout` be set to ``0.0``, disabling the timeout functionality. This will help to prevent large transfers from failing due to exceeding the timeout value. .. rst-class:: classref-item-separator diff --git a/classes/class_input.rst b/classes/class_input.rst index 07051b63de6..e7adb7b5733 100644 --- a/classes/class_input.rst +++ b/classes/class_input.rst @@ -12,16 +12,16 @@ Input **Inherits:** :ref:`Object` -A singleton that deals with inputs. +A singleton for handling inputs. .. rst-class:: classref-introduction-group Description ----------- -A singleton that deals with inputs. This includes key presses, mouse buttons and movement, joypads, and input actions. Actions and their events can be set in the **Input Map** tab in the **Project > Project Settings**, or with the :ref:`InputMap` class. +The **Input** singleton handles key presses, mouse buttons and movement, gamepads, and input actions. Actions and their events can be set in the **Input Map** tab in **Project > Project Settings**, or with the :ref:`InputMap` class. -\ **Note:** The methods here reflect the global input state and are not affected by :ref:`Control.accept_event` or :ref:`Viewport.set_input_as_handled`, which only deal with the way input is propagated in the :ref:`SceneTree`. +\ **Note:** **Input**'s methods reflect the global input state and are not affected by :ref:`Control.accept_event` or :ref:`Viewport.set_input_as_handled`, as those methods only deal with the way input is propagated in the :ref:`SceneTree`. .. rst-class:: classref-introduction-group @@ -600,7 +600,7 @@ Returns the current value of the joypad axis at given index (see :ref:`JoyAxis` **get_joy_guid** **(** :ref:`int` device **)** |const| -Returns a SDL2-compatible device GUID on platforms that use gamepad remapping. Returns ``"Default Gamepad"`` otherwise. +Returns a SDL2-compatible device GUID on platforms that use gamepad remapping, e.g. ``030000004c050000c405000000010000``. Returns ``"Default Gamepad"`` otherwise. Godot uses the `SDL2 game controller database `__ to determine gamepad names and mappings based on this GUID. .. rst-class:: classref-item-separator @@ -612,7 +612,7 @@ Returns a SDL2-compatible device GUID on platforms that use gamepad remapping. R :ref:`String` **get_joy_name** **(** :ref:`int` device **)** -Returns the name of the joypad at the specified device index. +Returns the name of the joypad at the specified device index, e.g. ``PS4 Controller``. Godot uses the `SDL2 game controller database `__ to determine gamepad names. .. rst-class:: classref-item-separator diff --git a/classes/class_inputevent.rst b/classes/class_inputevent.rst index 826051533d1..cf935daba16 100644 --- a/classes/class_inputevent.rst +++ b/classes/class_inputevent.rst @@ -14,21 +14,21 @@ InputEvent **Inherited By:** :ref:`InputEventAction`, :ref:`InputEventFromWindow`, :ref:`InputEventJoypadButton`, :ref:`InputEventJoypadMotion`, :ref:`InputEventMIDI`, :ref:`InputEventShortcut` -Generic input event. +Abstract base class for input events. .. rst-class:: classref-introduction-group Description ----------- -Base class of all sort of input event. See :ref:`Node._input`. +Abstract base class of all types of input events. See :ref:`Node._input`. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` - :doc:`Viewport and canvas transforms <../tutorials/2d/2d_transforms>` diff --git a/classes/class_inputeventaction.rst b/classes/class_inputeventaction.rst index 840586210db..c5bf81377eb 100644 --- a/classes/class_inputeventaction.rst +++ b/classes/class_inputeventaction.rst @@ -12,14 +12,14 @@ InputEventAction **Inherits:** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event type for actions. +An input event type for actions. .. rst-class:: classref-introduction-group Description ----------- -Contains a generic action which can be targeted from several types of inputs. Actions can be created from the **Input Map** tab in the **Project > Project Settings** menu. See :ref:`Node._input`. +Contains a generic action which can be targeted from several types of inputs. Actions and their events can be set in the **Input Map** tab in **Project > Project Settings**, or with the :ref:`InputMap` class. \ **Note:** Unlike the other :ref:`InputEvent` subclasses which map to unique physical events, this virtual one is not emitted by the engine. This class is useful to emit actions manually with :ref:`Input.parse_input_event`, which are then received in :ref:`Node._input`. To check if a physical event matches an action from the Input Map, use :ref:`InputEvent.is_action` and :ref:`InputEvent.is_action_pressed`. @@ -28,7 +28,7 @@ Contains a generic action which can be targeted from several types of inputs. Ac Tutorials --------- -- `InputEvent: Actions <../tutorials/inputs/inputevent.html#actions>`__ +- `Using InputEvent: Actions <../tutorials/inputs/inputevent.html#actions>`__ - `2D Dodge The Creeps Demo `__ diff --git a/classes/class_inputeventfromwindow.rst b/classes/class_inputeventfromwindow.rst index 7065219ff08..a4d52d695bb 100644 --- a/classes/class_inputeventfromwindow.rst +++ b/classes/class_inputeventfromwindow.rst @@ -14,7 +14,7 @@ InputEventFromWindow **Inherited By:** :ref:`InputEventScreenDrag`, :ref:`InputEventScreenTouch`, :ref:`InputEventWithModifiers` -Base class for :ref:`Viewport`-based input events. +Abstract base class for :ref:`Viewport`-based input events. .. rst-class:: classref-introduction-group diff --git a/classes/class_inputeventgesture.rst b/classes/class_inputeventgesture.rst index ceb0aa276e5..111e1f7fe2d 100644 --- a/classes/class_inputeventgesture.rst +++ b/classes/class_inputeventgesture.rst @@ -14,14 +14,21 @@ InputEventGesture **Inherited By:** :ref:`InputEventMagnifyGesture`, :ref:`InputEventPanGesture` -Base class for touch control gestures. +Abstract base class for touch gestures. .. rst-class:: classref-introduction-group Description ----------- -InputEventGesture is sent when a user performs a supported gesture on a touch screen. Gestures can't be emulated using mouse, because they typically require multi-touch. +InputEventGestures are sent when a user performs a supported gesture on a touch screen. Gestures can't be emulated using mouse, because they typically require multi-touch. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventjoypadbutton.rst b/classes/class_inputeventjoypadbutton.rst index 18cfadc24a9..ab5300b2e52 100644 --- a/classes/class_inputeventjoypadbutton.rst +++ b/classes/class_inputeventjoypadbutton.rst @@ -12,7 +12,7 @@ InputEventJoypadButton **Inherits:** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event for gamepad buttons. +Represents a gamepad button being pressed or released. .. rst-class:: classref-introduction-group @@ -26,7 +26,7 @@ Input event type for gamepad buttons. For gamepad analog sticks and joysticks, s Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventjoypadmotion.rst b/classes/class_inputeventjoypadmotion.rst index 129a0303f3f..6ef2c21a6fd 100644 --- a/classes/class_inputeventjoypadmotion.rst +++ b/classes/class_inputeventjoypadmotion.rst @@ -12,21 +12,21 @@ InputEventJoypadMotion **Inherits:** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event type for gamepad joysticks and other motions. For buttons, see ``InputEventJoypadButton``. +Represents axis motions (such as joystick or analog triggers) from a gamepad. .. rst-class:: classref-introduction-group Description ----------- -Stores information about joystick motions. One **InputEventJoypadMotion** represents one axis at a time. +Stores information about joystick motions. One **InputEventJoypadMotion** represents one axis at a time. For gamepad buttons, see :ref:`InputEventJoypadButton`. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventkey.rst b/classes/class_inputeventkey.rst index 988b208deae..e2b2c46dc7b 100644 --- a/classes/class_inputeventkey.rst +++ b/classes/class_inputeventkey.rst @@ -12,25 +12,25 @@ InputEventKey **Inherits:** :ref:`InputEventWithModifiers` **<** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event type for keyboard events. +Represents a key on a keyboard being pressed or released. .. rst-class:: classref-introduction-group Description ----------- -Stores key presses on the keyboard. Supports key presses, key releases and :ref:`echo` events. +An input event for keys on a keyboard. Supports key presses, key releases and :ref:`echo` events. It can also be received in :ref:`Node._unhandled_key_input`. \ **Note:** Events received from the keyboard usually have all properties set. Event mappings should have only one of the :ref:`keycode`, :ref:`physical_keycode` or :ref:`unicode` set. -When events are compared, properties are checked in the following priority - :ref:`keycode`, :ref:`physical_keycode` and :ref:`unicode`, events with the first matching value will be considered equal. +When events are compared, properties are checked in the following priority - :ref:`keycode`, :ref:`physical_keycode` and :ref:`unicode`. Events with the first matching value will be considered equal. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventmagnifygesture.rst b/classes/class_inputeventmagnifygesture.rst index cb93e7ae582..7f3f2659d4c 100644 --- a/classes/class_inputeventmagnifygesture.rst +++ b/classes/class_inputeventmagnifygesture.rst @@ -12,14 +12,21 @@ InputEventMagnifyGesture **Inherits:** :ref:`InputEventGesture` **<** :ref:`InputEventWithModifiers` **<** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -:ref:`InputEvent` that represents a magnifying touch gesture. +Represents a magnifying touch gesture. .. rst-class:: classref-introduction-group Description ----------- -Magnify gesture is performed when the user pinches the touch screen. It's typically used for zooming. +Stores the factor of a magnifying touch gesture. This is usually performed when the user pinches the touch screen and used for zooming in/out. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group @@ -53,7 +60,7 @@ Property Descriptions - void **set_factor** **(** :ref:`float` value **)** - :ref:`float` **get_factor** **(** **)** -The amount (or delta) of the event. This value is higher the faster the gesture is performed. +The amount (or delta) of the event. This value is closer to ``1.0`` the slower the gesture is performed. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_inputeventmidi.rst b/classes/class_inputeventmidi.rst index 468d535484d..02c671c28ce 100644 --- a/classes/class_inputeventmidi.rst +++ b/classes/class_inputeventmidi.rst @@ -12,14 +12,14 @@ InputEventMIDI **Inherits:** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event for MIDI inputs. +Represents an input event from a MIDI device, such as a piano. .. rst-class:: classref-introduction-group Description ----------- -InputEventMIDI allows receiving input events from MIDI devices such as a piano. MIDI stands for Musical Instrument Digital Interface. +InputEventMIDI allows receiving input events from MIDI (Musical Instrument Digital Interface) devices such as a piano. MIDI signals can be sent over a 5-pin MIDI connector or over USB, if your device supports both be sure to check the settings in the device to see which output it's using. diff --git a/classes/class_inputeventmouse.rst b/classes/class_inputeventmouse.rst index a9f62fed2a9..cfe1e28cc9e 100644 --- a/classes/class_inputeventmouse.rst +++ b/classes/class_inputeventmouse.rst @@ -21,14 +21,14 @@ Base input event type for mouse events. Description ----------- -Stores general mouse events information. +Stores general information about mouse events. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventmousebutton.rst b/classes/class_inputeventmousebutton.rst index ac70e894399..ddd0465e8af 100644 --- a/classes/class_inputeventmousebutton.rst +++ b/classes/class_inputeventmousebutton.rst @@ -12,20 +12,22 @@ InputEventMouseButton **Inherits:** :ref:`InputEventMouse` **<** :ref:`InputEventWithModifiers` **<** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event type for mouse button events. +Represents a mouse button being pressed or released. .. rst-class:: classref-introduction-group Description ----------- -Contains mouse click information. See :ref:`Node._input`. +Stores information about mouse click events. See :ref:`Node._input`. .. rst-class:: classref-introduction-group Tutorials --------- +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` + - :doc:`Mouse and input coordinates <../tutorials/inputs/mouse_and_input_coordinates>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventmousemotion.rst b/classes/class_inputeventmousemotion.rst index 2c7aad2c565..fc84c79fd7a 100644 --- a/classes/class_inputeventmousemotion.rst +++ b/classes/class_inputeventmousemotion.rst @@ -12,14 +12,14 @@ InputEventMouseMotion **Inherits:** :ref:`InputEventMouse` **<** :ref:`InputEventWithModifiers` **<** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event type for mouse motion events. +Represents a mouse or a pen movement. .. rst-class:: classref-introduction-group Description ----------- -Contains mouse and pen motion information. Supports relative, absolute positions and velocity. See :ref:`Node._input`. +Stores information about a mouse or a pen motion. This includes relative position, absolute position, and velocity. See :ref:`Node._input`. \ **Note:** By default, this event is only emitted once per frame rendered at most. If you need more precise input reporting, set :ref:`Input.use_accumulated_input` to ``false`` to make events emitted as often as possible. If you use InputEventMouseMotion to draw lines, consider implementing `Bresenham's line algorithm `__ as well to avoid visible gaps in lines if the user is moving the mouse quickly. @@ -28,6 +28,8 @@ Contains mouse and pen motion information. Supports relative, absolute positions Tutorials --------- +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` + - :doc:`Mouse and input coordinates <../tutorials/inputs/mouse_and_input_coordinates>` - `3D Voxel Demo `__ diff --git a/classes/class_inputeventpangesture.rst b/classes/class_inputeventpangesture.rst index 1c58524a15b..9c1ade7e2e2 100644 --- a/classes/class_inputeventpangesture.rst +++ b/classes/class_inputeventpangesture.rst @@ -12,14 +12,21 @@ InputEventPanGesture **Inherits:** :ref:`InputEventGesture` **<** :ref:`InputEventWithModifiers` **<** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -:ref:`InputEvent` that represents a panning touch gesture. +Represents a panning touch gesture. .. rst-class:: classref-introduction-group Description ----------- -Pan gesture is performed when the user swipes the touch screen with two fingers. It's typically used for panning/scrolling. +Stores information about pan gestures. A pan gesture is performed when the user swipes the touch screen with two fingers. It's typically used for panning/scrolling. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventscreendrag.rst b/classes/class_inputeventscreendrag.rst index 0b5177879ee..c1d47f63da1 100644 --- a/classes/class_inputeventscreendrag.rst +++ b/classes/class_inputeventscreendrag.rst @@ -12,21 +12,21 @@ InputEventScreenDrag **Inherits:** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event type for screen drag events. Only available on mobile devices. +Represents a screen drag event. .. rst-class:: classref-introduction-group Description ----------- -Contains screen drag information. See :ref:`Node._input`. +Stores information about screen drag events. See :ref:`Node._input`. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventscreentouch.rst b/classes/class_inputeventscreentouch.rst index ad4d3e4d91d..1d5f6cd8546 100644 --- a/classes/class_inputeventscreentouch.rst +++ b/classes/class_inputeventscreentouch.rst @@ -12,23 +12,21 @@ InputEventScreenTouch **Inherits:** :ref:`InputEventFromWindow` **<** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Input event type for screen touch events. - -(only available on mobile devices) +Represents a screen touch event. .. rst-class:: classref-introduction-group Description ----------- -Stores multi-touch press/release information. Supports touch press, touch release and :ref:`index` for multi-touch count and order. +Stores information about multi-touch press/release input events. Supports touch press, touch release and :ref:`index` for multi-touch count and order. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventshortcut.rst b/classes/class_inputeventshortcut.rst index 392c478b742..12c6aaf760a 100644 --- a/classes/class_inputeventshortcut.rst +++ b/classes/class_inputeventshortcut.rst @@ -12,14 +12,14 @@ InputEventShortcut **Inherits:** :ref:`InputEvent` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -:ref:`InputEvent` that signifies a triggered keyboard :ref:`Shortcut`. +Represents a triggered keyboard :ref:`Shortcut`. .. rst-class:: classref-introduction-group Description ----------- -InputEventShortcut is a special event that can be received in :ref:`Node._unhandled_key_input`. It's typically sent by the editor's Command Palette to trigger actions, but can also be sent manually using :ref:`Viewport.push_unhandled_input`. +InputEventShortcut is a special event that can be received in :ref:`Node._unhandled_key_input`. It is typically sent by the editor's Command Palette to trigger actions, but can also be sent manually using :ref:`Viewport.push_input`. .. rst-class:: classref-reftable-group diff --git a/classes/class_inputeventwithmodifiers.rst b/classes/class_inputeventwithmodifiers.rst index e3e1f0488c1..5b8eab0acec 100644 --- a/classes/class_inputeventwithmodifiers.rst +++ b/classes/class_inputeventwithmodifiers.rst @@ -14,21 +14,21 @@ InputEventWithModifiers **Inherited By:** :ref:`InputEventGesture`, :ref:`InputEventKey`, :ref:`InputEventMouse` -Base class for keys events with modifiers. +Abstract base class for input events affected by modifier keys like :kbd:`Shift` and :kbd:`Alt`. .. rst-class:: classref-introduction-group Description ----------- -Contains keys events information with modifiers support like :kbd:`Shift` or :kbd:`Alt`. See :ref:`Node._input`. +Stores information about mouse, keyboard, and touch gesture input events. This includes information about which modifier keys are pressed, such as :kbd:`Shift` or :kbd:`Alt`. See :ref:`Node._input`. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`InputEvent <../tutorials/inputs/inputevent>` +- :doc:`Using InputEvent <../tutorials/inputs/inputevent>` .. rst-class:: classref-reftable-group diff --git a/classes/class_inputmap.rst b/classes/class_inputmap.rst index efe9d5373d7..2902bd71cc9 100644 --- a/classes/class_inputmap.rst +++ b/classes/class_inputmap.rst @@ -12,7 +12,7 @@ InputMap **Inherits:** :ref:`Object` -Singleton that manages :ref:`InputEventAction`. +A singleton that manages all :ref:`InputEventAction`\ s. .. rst-class:: classref-introduction-group @@ -26,7 +26,7 @@ Manages all :ref:`InputEventAction` which can be created Tutorials --------- -- `InputEvent: InputMap <../tutorials/inputs/inputevent.html#inputmap>`__ +- `Using InputEvent: InputMap <../tutorials/inputs/inputevent.html#inputmap>`__ .. rst-class:: classref-reftable-group diff --git a/classes/class_int.rst b/classes/class_int.rst index 2dda122c1fa..3b3cf8ad25a 100644 --- a/classes/class_int.rst +++ b/classes/class_int.rst @@ -10,7 +10,7 @@ int === -Built-in integer Variant type. +A built-in type for integers. .. rst-class:: classref-introduction-group diff --git a/classes/class_itemlist.rst b/classes/class_itemlist.rst index 7d65c664dd4..23b687fd9ee 100644 --- a/classes/class_itemlist.rst +++ b/classes/class_itemlist.rst @@ -12,20 +12,20 @@ ItemList **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Control that provides a list of selectable items (and/or icons) in a single column, or optionally in multiple columns. +A vertical list of selectable items with one or multiple columns. .. rst-class:: classref-introduction-group Description ----------- -This control provides a selectable list of items that may be in a single (or multiple columns) with option of text, icons, or both text and icon. Tooltips are supported and may be different for every item in the list. +This control provides a vertical list of selectable items that may be in a single or in multiple columns, with each item having options for text and an icon. Tooltips are supported and may be different for every item in the list. Selectable items in the list may be selected or deselected and multiple selection may be enabled. Selection with right mouse button may also be enabled to allow use of popup context menus. Items may also be "activated" by double-clicking them or by pressing :kbd:`Enter`. -Item text only supports single-line strings, newline characters (e.g. ``\n``) in the string won't produce a newline. Text wrapping is enabled in :ref:`ICON_MODE_TOP` mode, but column's width is adjusted to fully fit its content by default. You need to set :ref:`fixed_column_width` greater than zero to wrap the text. +Item text only supports single-line strings. Newline characters (e.g. ``\n``) in the string won't produce a newline. Text wrapping is enabled in :ref:`ICON_MODE_TOP` mode, but the column's width is adjusted to fully fit its content by default. You need to set :ref:`fixed_column_width` greater than zero to wrap the text. -All ``set_*`` methods allow negative item index, which makes the item accessed from the last one. +All ``set_*`` methods allow negative item indices, i.e. ``-1`` to access the last item, ``-2`` to select the second-to-last item, and so on. \ **Incremental search:** Like :ref:`PopupMenu` and :ref:`Tree`, **ItemList** supports searching within the list while the control is focused. Press a key that matches the first letter of an item's name to select the first item starting with the given letter. After that point, there are two ways to perform incremental search: 1) Press the same key again before the timeout duration to select the next item starting with the same letter. 2) Press letter keys that match the rest of the word before the timeout duration to match to select the item in question directly. Both of these actions will be reset to the beginning of the list if the timeout duration has passed since the last keystroke was registered. You can adjust the timeout duration by changing :ref:`ProjectSettings.gui/timers/incremental_search_max_interval_msec`. diff --git a/classes/class_javascriptobject.rst b/classes/class_javascriptobject.rst index ec7c6688e00..65dafaadaf8 100644 --- a/classes/class_javascriptobject.rst +++ b/classes/class_javascriptobject.rst @@ -27,7 +27,7 @@ JavaScriptObject is used to interact with JavaScript objects retrieved or create extends Node - var _my_js_callback = JavaScriptBridge.create_callback(self, "myCallback") # This reference must be kept + var _my_js_callback = JavaScriptBridge.create_callback(myCallback) # This reference must be kept var console = JavaScriptBridge.get_interface("console") func _init(): diff --git a/classes/class_joint2d.rst b/classes/class_joint2d.rst index 92a1a40c39b..e08e3521df0 100644 --- a/classes/class_joint2d.rst +++ b/classes/class_joint2d.rst @@ -14,14 +14,14 @@ Joint2D **Inherited By:** :ref:`DampedSpringJoint2D`, :ref:`GrooveJoint2D`, :ref:`PinJoint2D` -Base node for all joint constraints in 2D physics. +Abstract base class for all 2D physics joints. .. rst-class:: classref-introduction-group Description ----------- -Base node for all joint constraints in 2D physics. Joints take 2 bodies and apply a custom constraint. +Abstract base class for all joints in 2D physics. 2D joints bind together two physics bodies and apply a constraint. .. rst-class:: classref-reftable-group diff --git a/classes/class_joint3d.rst b/classes/class_joint3d.rst index 716b348686d..487f13cc9b7 100644 --- a/classes/class_joint3d.rst +++ b/classes/class_joint3d.rst @@ -14,14 +14,14 @@ Joint3D **Inherited By:** :ref:`ConeTwistJoint3D`, :ref:`Generic6DOFJoint3D`, :ref:`HingeJoint3D`, :ref:`PinJoint3D`, :ref:`SliderJoint3D` -Base class for all 3D joints. +Abstract base class for all 3D physics joints. .. rst-class:: classref-introduction-group Description ----------- -Joints are used to bind together two physics bodies. They have a solver priority and can define if the bodies of the two attached nodes should be able to collide with each other. See also :ref:`Generic6DOFJoint3D`. +Abstract base class for all joints in 3D physics. 3D joints bind together two physics bodies and apply a constraint. .. rst-class:: classref-introduction-group diff --git a/classes/class_kinematiccollision2d.rst b/classes/class_kinematiccollision2d.rst index ed9b00d88d3..ced69cc9629 100644 --- a/classes/class_kinematiccollision2d.rst +++ b/classes/class_kinematiccollision2d.rst @@ -12,16 +12,16 @@ KinematicCollision2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Collision data for :ref:`PhysicsBody2D.move_and_collide` collisions. +Holds collision data from the movement of a :ref:`PhysicsBody2D`. .. rst-class:: classref-introduction-group Description ----------- -Contains collision data for :ref:`PhysicsBody2D.move_and_collide` collisions. When a :ref:`PhysicsBody2D` is moved using :ref:`PhysicsBody2D.move_and_collide`, it stops if it detects a collision with another body. If a collision is detected, a **KinematicCollision2D** object is returned. +Holds collision data from the movement of a :ref:`PhysicsBody2D`, usually from :ref:`PhysicsBody2D.move_and_collide`. When a :ref:`PhysicsBody2D` is moved, it stops if it detects a collision with another body. If a collision is detected, a **KinematicCollision2D** object is returned. -This object contains information about the collision, including the colliding object, the remaining motion, and the collision position. This information can be used to calculate a collision response. +The collision data includes the colliding object, the remaining motion, and the collision position. This data can be used to determine a custom response to the collision. .. rst-class:: classref-reftable-group diff --git a/classes/class_kinematiccollision3d.rst b/classes/class_kinematiccollision3d.rst index 9faace40d05..1ddd6c170a5 100644 --- a/classes/class_kinematiccollision3d.rst +++ b/classes/class_kinematiccollision3d.rst @@ -12,16 +12,16 @@ KinematicCollision3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Collision data for :ref:`PhysicsBody3D.move_and_collide` collisions. +Holds collision data from the movement of a :ref:`PhysicsBody3D`. .. rst-class:: classref-introduction-group Description ----------- -Contains collision data for :ref:`PhysicsBody3D.move_and_collide` collisions. When a :ref:`PhysicsBody3D` is moved using :ref:`PhysicsBody3D.move_and_collide`, it stops if it detects a collision with another body. If a collision is detected, a **KinematicCollision3D** object is returned. +Holds collision data from the movement of a :ref:`PhysicsBody3D`, usually from :ref:`PhysicsBody3D.move_and_collide`. When a :ref:`PhysicsBody3D` is moved, it stops if it detects a collision with another body. If a collision is detected, a **KinematicCollision3D** object is returned. -This object contains information about the collision, including the colliding object, the remaining motion, and the collision position. This information can be used to calculate a collision response. +The collision data includes the colliding object, the remaining motion, and the collision position. This data can be used to determine a custom response to the collision. .. rst-class:: classref-reftable-group diff --git a/classes/class_label.rst b/classes/class_label.rst index 4f5b011e868..ca23a6d6c2a 100644 --- a/classes/class_label.rst +++ b/classes/class_label.rst @@ -12,16 +12,14 @@ Label **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Displays plain text in a line or wrapped inside a rectangle. For formatted text, use :ref:`RichTextLabel`. +A control for displaying plain text. .. rst-class:: classref-introduction-group Description ----------- -Label displays plain text on the screen. It gives you control over the horizontal and vertical alignment and can wrap the text inside the node's bounding rectangle. It doesn't support bold, italics, or other formatting. For that, use :ref:`RichTextLabel` instead. - -\ **Note:** Contrarily to most other :ref:`Control`\ s, Label's :ref:`Control.mouse_filter` defaults to :ref:`Control.MOUSE_FILTER_IGNORE` (i.e. it doesn't react to mouse input events). This implies that a label won't display any configured :ref:`Control.tooltip_text`, unless you change its mouse filter. +A control for displaying plain text. It gives you control over the horizontal and vertical alignment and can wrap the text inside the node's bounding rectangle. It doesn't support bold, italics, or other rich text formatting. For that, use :ref:`RichTextLabel` instead. .. rst-class:: classref-introduction-group diff --git a/classes/class_label3d.rst b/classes/class_label3d.rst index 134872eb155..9e3e0635a96 100644 --- a/classes/class_label3d.rst +++ b/classes/class_label3d.rst @@ -12,14 +12,14 @@ Label3D **Inherits:** :ref:`GeometryInstance3D` **<** :ref:`VisualInstance3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Displays plain text in a 3D world. +A node for displaying plain text in 3D space. .. rst-class:: classref-introduction-group Description ----------- -Label3D displays plain text in a 3D world. It gives you control over the horizontal and vertical alignment. +A node for displaying plain text in 3D space. By adjusting various properties of this node, you can configure things such as the text's appearance and whether it always faces the camera. .. rst-class:: classref-reftable-group diff --git a/classes/class_labelsettings.rst b/classes/class_labelsettings.rst index 69544c2b94f..c7e784e8bf9 100644 --- a/classes/class_labelsettings.rst +++ b/classes/class_labelsettings.rst @@ -12,14 +12,14 @@ LabelSettings **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Collection of common settings to customize label text. +Provides common settings to customize the text in a :ref:`Label`. .. rst-class:: classref-introduction-group Description ----------- -**LabelSettings** is a resource that can be assigned to a :ref:`Label` node to customize it. It will take priority over the properties defined in theme. The resource can be shared between multiple labels and swapped on the fly, so it's convenient and flexible way to setup text style. +**LabelSettings** is a resource that provides common settings to customize the text in a :ref:`Label`. It will take priority over the properties defined in :ref:`Control.theme`. The resource can be shared between multiple labels and changed on the fly, so it's convenient and flexible way to setup text style. .. rst-class:: classref-reftable-group diff --git a/classes/class_lineedit.rst b/classes/class_lineedit.rst index 3974d0e48b7..77f59193054 100644 --- a/classes/class_lineedit.rst +++ b/classes/class_lineedit.rst @@ -12,16 +12,14 @@ LineEdit **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Control that provides single-line string editing. +An input field for single-line text. .. rst-class:: classref-introduction-group Description ----------- -LineEdit provides a single-line string editor, used for text fields. - -It features many built-in shortcuts which will always be available (:kbd:`Ctrl` here maps to :kbd:`Cmd` on macOS): +**LineEdit** provides an input field for editing a single line of text. It features many built-in shortcuts that are always available (:kbd:`Ctrl` here maps to :kbd:`Cmd` on macOS): - :kbd:`Ctrl + C`: Copy @@ -45,21 +43,21 @@ It features many built-in shortcuts which will always be available (:kbd:`Ctrl` On macOS, some extra keyboard shortcuts are available: -- :kbd:`Ctrl + F`: Same as :kbd:`Right Arrow`, move the caret one character right +- :kbd:`Cmd + F`: Same as :kbd:`Right Arrow`, move the caret one character right -- :kbd:`Ctrl + B`: Same as :kbd:`Left Arrow`, move the caret one character left +- :kbd:`Cmd + B`: Same as :kbd:`Left Arrow`, move the caret one character left -- :kbd:`Ctrl + P`: Same as :kbd:`Up Arrow`, move the caret to the previous line +- :kbd:`Cmd + P`: Same as :kbd:`Up Arrow`, move the caret to the previous line -- :kbd:`Ctrl + N`: Same as :kbd:`Down Arrow`, move the caret to the next line +- :kbd:`Cmd + N`: Same as :kbd:`Down Arrow`, move the caret to the next line -- :kbd:`Ctrl + D`: Same as :kbd:`Delete`, delete the character on the right side of caret +- :kbd:`Cmd + D`: Same as :kbd:`Delete`, delete the character on the right side of caret -- :kbd:`Ctrl + H`: Same as :kbd:`Backspace`, delete the character on the left side of the caret +- :kbd:`Cmd + H`: Same as :kbd:`Backspace`, delete the character on the left side of the caret -- :kbd:`Ctrl + A`: Same as :kbd:`Home`, move the caret to the beginning of the line +- :kbd:`Cmd + A`: Same as :kbd:`Home`, move the caret to the beginning of the line -- :kbd:`Ctrl + E`: Same as :kbd:`End`, move the caret to the end of the line +- :kbd:`Cmd + E`: Same as :kbd:`End`, move the caret to the end of the line - :kbd:`Cmd + Left Arrow`: Same as :kbd:`Home`, move the caret to the beginning of the line diff --git a/classes/class_linkbutton.rst b/classes/class_linkbutton.rst index 7457312514d..aad5d7b8a0d 100644 --- a/classes/class_linkbutton.rst +++ b/classes/class_linkbutton.rst @@ -12,14 +12,14 @@ LinkButton **Inherits:** :ref:`BaseButton` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Simple button used to represent a link to some resource. +A button that represents a link. .. rst-class:: classref-introduction-group Description ----------- -This kind of button is primarily used when the interaction with the button causes a context change (like linking to a web page). +A button that represents a link. This type of button is primarily used for interactions that cause a context change (like linking to a web page). See also :ref:`BaseButton` which contains common properties and methods associated with this node. diff --git a/classes/class_margincontainer.rst b/classes/class_margincontainer.rst index 6aa202fefce..4678c955817 100644 --- a/classes/class_margincontainer.rst +++ b/classes/class_margincontainer.rst @@ -12,16 +12,16 @@ MarginContainer **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Simple margin container. +A container that keeps a margin around its child controls. .. rst-class:: classref-introduction-group Description ----------- -Adds a top, left, bottom, and right margin to all :ref:`Control` nodes that are direct children of the container. To control the **MarginContainer**'s margin, use the ``margin_*`` theme properties listed below. +**MarginContainer** adds an adjustable margin on each side of its child controls. The margins are added around all children, not around each individual one. To control the **MarginContainer**'s margins, use the ``margin_*`` theme properties listed below. -\ **Note:** Be careful, :ref:`Control` margin values are different from the constant margin values. If you want to change the custom margin values of the **MarginContainer** by code, you should use the following examples: +\ **Note:** The margin sizes are theme overrides, not normal properties. This is an example of how to change them in code: .. tabs:: @@ -51,7 +51,7 @@ Adds a top, left, bottom, and right margin to all :ref:`Control` Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_menubar.rst b/classes/class_menubar.rst index cbf890b18bf..984facc726f 100644 --- a/classes/class_menubar.rst +++ b/classes/class_menubar.rst @@ -12,14 +12,14 @@ MenuBar **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -A horizontal menu bar, which displays :ref:`PopupMenu`\ s or system global menu. +A horizontal menu bar that creates a :ref:`MenuButton` for each :ref:`PopupMenu` child. .. rst-class:: classref-introduction-group Description ----------- -New items can be created by adding :ref:`PopupMenu` nodes to this node. +A horizontal menu bar that creates a :ref:`MenuButton` for each :ref:`PopupMenu` child. New items are created by adding :ref:`PopupMenu`\ s to this node. .. rst-class:: classref-reftable-group diff --git a/classes/class_menubutton.rst b/classes/class_menubutton.rst index 3421950e124..8d09a3f1687 100644 --- a/classes/class_menubutton.rst +++ b/classes/class_menubutton.rst @@ -12,16 +12,14 @@ MenuButton **Inherits:** :ref:`Button` **<** :ref:`BaseButton` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Special button that brings up a :ref:`PopupMenu` when clicked. +A button that brings up a :ref:`PopupMenu` when clicked. .. rst-class:: classref-introduction-group Description ----------- -Special button that brings up a :ref:`PopupMenu` when clicked. - -New items can be created inside this :ref:`PopupMenu` using ``get_popup().add_item("My Item Name")``. You can also create them directly from the editor. To do so, select the **MenuButton** node, then in the toolbar at the top of the 2D editor, click **Items** then click **Add** in the popup. You will be able to give each item new properties. +A button that brings up a :ref:`PopupMenu` when clicked. To create new items inside this :ref:`PopupMenu`, use ``get_popup().add_item("My Item Name")``. You can also create them directly from Godot editor's inspector. See also :ref:`BaseButton` which contains common properties and methods associated with this node. diff --git a/classes/class_mesh.rst b/classes/class_mesh.rst index 0385cf53c03..f99358c3b04 100644 --- a/classes/class_mesh.rst +++ b/classes/class_mesh.rst @@ -229,7 +229,7 @@ enum **ArrayType**: :ref:`ArrayType` **ARRAY_CUSTOM0** = ``6`` -Contains custom color channel 0. :ref:`PackedByteArray` if ``(format >> [constant ARRAY_FORMAT_CUSTOM0_SHIFT]) & [constant ARRAY_FORMAT_CUSTOM_MASK])`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. +Contains custom color channel 0. :ref:`PackedByteArray` if ``(format >> Mesh.ARRAY_FORMAT_CUSTOM0_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASK`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. .. _class_Mesh_constant_ARRAY_CUSTOM1: @@ -237,7 +237,7 @@ Contains custom color channel 0. :ref:`PackedByteArray` i :ref:`ArrayType` **ARRAY_CUSTOM1** = ``7`` -Contains custom color channel 1. :ref:`PackedByteArray` if ``(format >> [constant ARRAY_FORMAT_CUSTOM1_SHIFT]) & [constant ARRAY_FORMAT_CUSTOM_MASK])`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. +Contains custom color channel 1. :ref:`PackedByteArray` if ``(format >> Mesh.ARRAY_FORMAT_CUSTOM1_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASK`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. .. _class_Mesh_constant_ARRAY_CUSTOM2: @@ -245,7 +245,7 @@ Contains custom color channel 1. :ref:`PackedByteArray` i :ref:`ArrayType` **ARRAY_CUSTOM2** = ``8`` -Contains custom color channel 2. :ref:`PackedByteArray` if ``(format >> [constant ARRAY_FORMAT_CUSTOM2_SHIFT]) & [constant ARRAY_FORMAT_CUSTOM_MASK])`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. +Contains custom color channel 2. :ref:`PackedByteArray` if ``(format >> Mesh.ARRAY_FORMAT_CUSTOM2_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASK`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. .. _class_Mesh_constant_ARRAY_CUSTOM3: @@ -253,7 +253,7 @@ Contains custom color channel 2. :ref:`PackedByteArray` i :ref:`ArrayType` **ARRAY_CUSTOM3** = ``9`` -Contains custom color channel 3. :ref:`PackedByteArray` if ``(format >> [constant ARRAY_FORMAT_CUSTOM3_SHIFT]) & [constant ARRAY_FORMAT_CUSTOM_MASK])`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. +Contains custom color channel 3. :ref:`PackedByteArray` if ``(format >> Mesh.ARRAY_FORMAT_CUSTOM3_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASK`` is :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RGBA8_UNORM`, :ref:`ARRAY_CUSTOM_RG_HALF` or :ref:`ARRAY_CUSTOM_RGBA_HALF`. :ref:`PackedFloat32Array` otherwise. .. _class_Mesh_constant_ARRAY_BONES: diff --git a/classes/class_missingnode.rst b/classes/class_missingnode.rst index 0e9f519842c..d9562674516 100644 --- a/classes/class_missingnode.rst +++ b/classes/class_missingnode.rst @@ -12,7 +12,7 @@ MissingNode **Inherits:** :ref:`Node` **<** :ref:`Object` -This is an internal editor class intended for keeping data of nodes of unknown type. +An internal editor class intended for keeping the data of unrecognized nodes. .. rst-class:: classref-introduction-group @@ -55,9 +55,7 @@ Property Descriptions - void **set_original_class** **(** :ref:`String` value **)** - :ref:`String` **get_original_class** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Returns the name of the type this node was originally. .. rst-class:: classref-item-separator diff --git a/classes/class_missingresource.rst b/classes/class_missingresource.rst index d912a25b42e..d458b706331 100644 --- a/classes/class_missingresource.rst +++ b/classes/class_missingresource.rst @@ -12,7 +12,7 @@ MissingResource **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -This is an internal editor class intended for keeping data of resources of unknown type. +An internal editor class intended for keeping the data of unrecognized resources. .. rst-class:: classref-introduction-group @@ -55,9 +55,7 @@ Property Descriptions - void **set_original_class** **(** :ref:`String` value **)** - :ref:`String` **get_original_class** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Returns the name of the class this resource was originally. .. rst-class:: classref-item-separator diff --git a/classes/class_mutex.rst b/classes/class_mutex.rst index 11492e01119..b72ae9b2e8c 100644 --- a/classes/class_mutex.rst +++ b/classes/class_mutex.rst @@ -12,24 +12,24 @@ Mutex **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -A synchronization mutex (mutual exclusion). +A binary :ref:`Semaphore` for synchronization of multiple :ref:`Thread`\ s. .. rst-class:: classref-introduction-group Description ----------- -A synchronization mutex (mutual exclusion). This is used to synchronize multiple :ref:`Thread`\ s, and is equivalent to a binary :ref:`Semaphore`. It guarantees that only one thread can ever acquire the lock at a time. A mutex can be used to protect a critical section; however, be careful to avoid deadlocks. +A synchronization mutex (mutual exclusion). This is used to synchronize multiple :ref:`Thread`\ s, and is equivalent to a binary :ref:`Semaphore`. It guarantees that only one thread can access a critical section at a time. -It's of the recursive kind, so it can be locked multiple times by one thread, provided it also unlocks it as many times. +This is a reentrant mutex, meaning that it can be locked multiple times by one thread, provided it also unlocks it as many times. -\ **Warning:**\ +\ **Warning:** Mutexes must be used carefully to avoid deadlocks. -To guarantee that the operating system is able to perform proper cleanup (no crashes, no deadlocks), these conditions must be met: +\ **Warning:** To ensure proper cleanup without crashes or deadlocks, the following conditions must be met: -- By the time a **Mutex**'s reference count reaches zero and therefore it is destroyed, no threads (including the one on which the destruction will happen) must have it locked. +- When a **Mutex**'s reference count reaches zero and it is therefore destroyed, no threads (including the one on which the destruction will happen) must have it locked. -- By the time a :ref:`Thread`'s reference count reaches zero and therefore it is destroyed, it must not have any mutex locked. +- When a :ref:`Thread`'s reference count reaches zero and it is therefore destroyed, it must not have any mutex locked. .. rst-class:: classref-introduction-group @@ -38,6 +38,8 @@ Tutorials - :doc:`Using multiple threads <../tutorials/performance/using_multiple_threads>` +- :doc:`Thread-safe APIs <../tutorials/performance/thread_safe_apis>` + .. rst-class:: classref-reftable-group Methods diff --git a/classes/class_navigationagent2d.rst b/classes/class_navigationagent2d.rst index b94c579c517..2e1a4fe646f 100644 --- a/classes/class_navigationagent2d.rst +++ b/classes/class_navigationagent2d.rst @@ -12,16 +12,18 @@ NavigationAgent2D **Inherits:** :ref:`Node` **<** :ref:`Object` -2D Agent used in navigation for collision avoidance. +A 2D agent used to pathfind to a position while avoiding obstacles. .. rst-class:: classref-introduction-group Description ----------- -2D Agent that is used in navigation to reach a position while avoiding static and dynamic obstacles. The dynamic obstacles are avoided using RVO collision avoidance. The agent needs navigation data to work correctly. **NavigationAgent2D** is physics safe. +A 2D agent used to pathfind to a position while avoiding static and dynamic obstacles. The calculation can be used by the parent node to dynamically move it along the path. Requires navigation data to work correctly. -\ **Note:** After :ref:`target_position` is set, the :ref:`get_next_path_position` function must be used once every physics frame to update the internal path logic of the NavigationAgent. The returned position from this function should be used as the next movement position for the agent's parent node. +Dynamic obstacles are avoided using RVO collision avoidance. Avoidance is computed before physics, so the pathfinding information can be used safely in the physics step. + +\ **Note:** After setting the :ref:`target_position` property, the :ref:`get_next_path_position` method must be used once every physics frame to update the internal path logic of the navigation agent. The vector position it returns should be used as the next movement position for the agent's parent node. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationagent3d.rst b/classes/class_navigationagent3d.rst index c98317be1f8..a5bbda67413 100644 --- a/classes/class_navigationagent3d.rst +++ b/classes/class_navigationagent3d.rst @@ -12,16 +12,18 @@ NavigationAgent3D **Inherits:** :ref:`Node` **<** :ref:`Object` -3D Agent used in navigation for collision avoidance. +A 3D agent used to pathfind to a position while avoiding obstacles. .. rst-class:: classref-introduction-group Description ----------- -3D Agent that is used in navigation to reach a position while avoiding static and dynamic obstacles. The dynamic obstacles are avoided using RVO collision avoidance. The agent needs navigation data to work correctly. **NavigationAgent3D** is physics safe. +A 3D agent used to pathfind to a position while avoiding static and dynamic obstacles. The calculation can be used by the parent node to dynamically move it along the path. Requires navigation data to work correctly. -\ **Note:** After :ref:`target_position` is set, the :ref:`get_next_path_position` function must be used once every physics frame to update the internal path logic of the NavigationAgent. The returned position from this function should be used as the next movement position for the agent's parent node. +Dynamic obstacles are avoided using RVO collision avoidance. Avoidance is computed before physics, so the pathfinding information can be used safely in the physics step. + +\ **Note:** After setting the :ref:`target_position` property, the :ref:`get_next_path_position` method must be used once every physics frame to update the internal path logic of the navigation agent. The vector position it returns should be used as the next movement position for the agent's parent node. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationlink2d.rst b/classes/class_navigationlink2d.rst index 914ac5c3dda..229399a65aa 100644 --- a/classes/class_navigationlink2d.rst +++ b/classes/class_navigationlink2d.rst @@ -12,14 +12,14 @@ NavigationLink2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Creates a link between two positions that :ref:`NavigationServer2D` can route agents through. +A link between two positions on :ref:`NavigationRegion2D`\ s that agents can be routed through. .. rst-class:: classref-introduction-group Description ----------- -Creates a link between two positions that :ref:`NavigationServer2D` can route agents through. Links can be used to express navigation methods that aren't just traveling along the surface of the navigation mesh, like zip-lines, teleporters, or jumping across gaps. +A link between two positions on :ref:`NavigationRegion2D`\ s that agents can be routed through. These positions can be on the same :ref:`NavigationRegion2D` or on two different ones. Links are useful to express navigation methods other than traveling along the surface of the navigation polygon, such as ziplines, teleporters, or gaps that can be jumped across. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationlink3d.rst b/classes/class_navigationlink3d.rst index 4cb049409a7..73a74804652 100644 --- a/classes/class_navigationlink3d.rst +++ b/classes/class_navigationlink3d.rst @@ -12,14 +12,14 @@ NavigationLink3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Creates a link between two positions that :ref:`NavigationServer3D` can route agents through. +A link between two positions on :ref:`NavigationRegion3D`\ s that agents can be routed through. .. rst-class:: classref-introduction-group Description ----------- -Creates a link between two positions that :ref:`NavigationServer3D` can route agents through. Links can be used to express navigation methods that aren't just traveling along the surface of the navigation mesh, like zip-lines, teleporters, or jumping across gaps. +A link between two positions on :ref:`NavigationRegion3D`\ s that agents can be routed through. These positions can be on the same :ref:`NavigationRegion3D` or on two different ones. Links are useful to express navigation methods other than traveling along the surface of the navigation mesh, such as ziplines, teleporters, or gaps that can be jumped across. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationmesh.rst b/classes/class_navigationmesh.rst index ad344ef28c6..9d9b6ead509 100644 --- a/classes/class_navigationmesh.rst +++ b/classes/class_navigationmesh.rst @@ -12,7 +12,7 @@ NavigationMesh **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A mesh to approximate the walkable areas and obstacles. +A navigation mesh that defines traversable areas and obstacles. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationpathqueryparameters2d.rst b/classes/class_navigationpathqueryparameters2d.rst index 7b9afc06da4..30b73f6c414 100644 --- a/classes/class_navigationpathqueryparameters2d.rst +++ b/classes/class_navigationpathqueryparameters2d.rst @@ -12,14 +12,14 @@ NavigationPathQueryParameters2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 2D navigation path query. +Provides parameters for 2D navigation path queries. .. rst-class:: classref-introduction-group Description ----------- -This class contains the start and target position and other parameters to be used with :ref:`NavigationServer2D.query_path`. +By changing various properties of this object, such as the start and target position, you can configure path queries to the :ref:`NavigationServer2D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationpathqueryparameters3d.rst b/classes/class_navigationpathqueryparameters3d.rst index 9e82b79e093..50ddf2c85fb 100644 --- a/classes/class_navigationpathqueryparameters3d.rst +++ b/classes/class_navigationpathqueryparameters3d.rst @@ -12,14 +12,14 @@ NavigationPathQueryParameters3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 3D navigation path query. +Provides parameters for 3D navigation path queries. .. rst-class:: classref-introduction-group Description ----------- -This class contains the start and target position and other parameters to be used with :ref:`NavigationServer3D.query_path`. +By changing various properties of this object, such as the start and target position, you can configure path queries to the :ref:`NavigationServer3D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationpathqueryresult2d.rst b/classes/class_navigationpathqueryresult2d.rst index e43afa25a40..f9f1e14da97 100644 --- a/classes/class_navigationpathqueryresult2d.rst +++ b/classes/class_navigationpathqueryresult2d.rst @@ -12,14 +12,14 @@ NavigationPathQueryResult2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Result from a :ref:`NavigationPathQueryParameters2D` navigation path query. +Represents the result of a 2D pathfinding query. .. rst-class:: classref-introduction-group Description ----------- -This class contains the result of a navigation path query from :ref:`NavigationServer2D.query_path`. +This class stores the result of a 2D navigation path query from the :ref:`NavigationServer2D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationpathqueryresult3d.rst b/classes/class_navigationpathqueryresult3d.rst index a1c7fe2484b..be5da0aee5a 100644 --- a/classes/class_navigationpathqueryresult3d.rst +++ b/classes/class_navigationpathqueryresult3d.rst @@ -12,14 +12,14 @@ NavigationPathQueryResult3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Result from a :ref:`NavigationPathQueryParameters3D` navigation path query. +Represents the result of a 3D pathfinding query. .. rst-class:: classref-introduction-group Description ----------- -This class contains the result of a navigation path query from :ref:`NavigationServer3D.query_path`. +This class stores the result of a 3D navigation path query from the :ref:`NavigationServer3D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationpolygon.rst b/classes/class_navigationpolygon.rst index 2303b61510a..79d5e909765 100644 --- a/classes/class_navigationpolygon.rst +++ b/classes/class_navigationpolygon.rst @@ -12,7 +12,7 @@ NavigationPolygon **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A node that has methods to draw outlines or use indices of vertices to create navigation polygons. +A navigation polygon that defines traversable areas and obstacles. .. rst-class:: classref-introduction-group diff --git a/classes/class_navigationregion2d.rst b/classes/class_navigationregion2d.rst index 3d066fbd14d..2a156c76fda 100644 --- a/classes/class_navigationregion2d.rst +++ b/classes/class_navigationregion2d.rst @@ -12,20 +12,20 @@ NavigationRegion2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -A region of the 2D navigation map. +A traversable 2D region that :ref:`NavigationAgent2D`\ s can use for pathfinding. .. rst-class:: classref-introduction-group Description ----------- -A region of the navigation map. It tells the :ref:`NavigationServer2D` what can be navigated and what cannot, based on its :ref:`NavigationPolygon` resource. +A traversable 2D region based on a :ref:`NavigationPolygon` that :ref:`NavigationAgent2D`\ s can use for pathfinding. Two regions can be connected to each other if they share a similar edge. You can set the minimum distance between two vertices required to connect two edges by using :ref:`NavigationServer2D.map_set_edge_connection_margin`. \ **Note:** Overlapping two regions' navigation polygons is not enough for connecting two regions. They must share a similar edge. -The pathfinding cost of entering this region from another region can be controlled with the :ref:`enter_cost` value. +The pathfinding cost of entering a region from another region can be controlled with the :ref:`enter_cost` value. \ **Note:** This value is not added to the path cost when the start position is already inside this region. diff --git a/classes/class_navigationregion3d.rst b/classes/class_navigationregion3d.rst index 347981d53df..f5c5a6f0df6 100644 --- a/classes/class_navigationregion3d.rst +++ b/classes/class_navigationregion3d.rst @@ -12,14 +12,14 @@ NavigationRegion3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -A region of the navigation map. +A traversable 3D region that :ref:`NavigationAgent3D`\ s can use for pathfinding. .. rst-class:: classref-introduction-group Description ----------- -A region of the navigation map. It tells the :ref:`NavigationServer3D` what can be navigated and what cannot, based on its :ref:`NavigationMesh` resource. +A traversable 3D region based on a :ref:`NavigationMesh` that :ref:`NavigationAgent3D`\ s can use for pathfinding. Two regions can be connected to each other if they share a similar edge. You can set the minimum distance between two vertices required to connect two edges by using :ref:`NavigationServer3D.map_set_edge_connection_margin`. diff --git a/classes/class_navigationserver2d.rst b/classes/class_navigationserver2d.rst index 59003bcc106..f111b9071d5 100644 --- a/classes/class_navigationserver2d.rst +++ b/classes/class_navigationserver2d.rst @@ -12,26 +12,26 @@ NavigationServer2D **Inherits:** :ref:`Object` -Server interface for low-level 2D navigation access. +A server interface for low-level 2D navigation access. .. rst-class:: classref-introduction-group Description ----------- -NavigationServer2D is the server responsible for all 2D navigation. It handles several objects, namely maps, regions and agents. +NavigationServer2D is the server that handles navigation maps, regions and agents. It does not handle A\* navigation from :ref:`AStar2D` or :ref:`AStarGrid2D`. -Maps are made up of regions, which are made of navigation polygons. Together, they define the navigable areas in the 2D world. +Maps are made up of regions, which are made of navigation polygons. Together, they define the traversable areas in the 2D world. -\ **Note:** Most NavigationServer changes take effect after the next physics frame and not immediately. This includes all changes made to maps, regions or agents by navigation related Nodes in the SceneTree or made through scripts. +\ **Note:** Most **NavigationServer2D** changes take effect after the next physics frame and not immediately. This includes all changes made to maps, regions or agents by navigation-related nodes in the scene tree or made through scripts. For two regions to be connected to each other, they must share a similar edge. An edge is considered connected to another if both of its two vertices are at a distance less than ``edge_connection_margin`` to the respective other edge's vertex. -You may assign navigation layers to regions with :ref:`region_set_navigation_layers`, which then can be checked upon when requesting a path with :ref:`map_get_path`. This allows allowing or forbidding some areas to 2D objects. +You may assign navigation layers to regions with :ref:`region_set_navigation_layers`, which then can be checked upon when requesting a path with :ref:`map_get_path`. This can be used to allow or deny certain areas for some objects. To use the collision avoidance system, you may use agents. You can set an agent's target velocity, then the servers will emit a callback with a modified velocity. -\ **Note:** The collision avoidance system ignores regions. Using the modified velocity as-is might lead to pushing an agent outside of a navigable area. This is a limitation of the collision avoidance system, any more complex situation may require the use of the physics engine. +\ **Note:** The collision avoidance system ignores regions. Using the modified velocity directly may move an agent outside of the traversable area. This is a limitation of the collision avoidance system, any more complex situation may require the use of the physics engine. This server keeps tracks of any call and executes them during the sync phase. This means that you can request any change to the map, using any thread, without worrying. diff --git a/classes/class_navigationserver3d.rst b/classes/class_navigationserver3d.rst index 8d7210ccc99..da06c78b050 100644 --- a/classes/class_navigationserver3d.rst +++ b/classes/class_navigationserver3d.rst @@ -12,26 +12,26 @@ NavigationServer3D **Inherits:** :ref:`Object` -Server interface for low-level 3D navigation access. +A server interface for low-level 3D navigation access. .. rst-class:: classref-introduction-group Description ----------- -NavigationServer3D is the server responsible for all 3D navigation. It handles several objects, namely maps, regions and agents. +NavigationServer2D is the server that handles navigation maps, regions and agents. It does not handle A\* navigation from :ref:`AStar3D`. Maps are made up of regions, which are made of navigation meshes. Together, they define the navigable areas in the 3D world. -\ **Note:** Most NavigationServer changes take effect after the next physics frame and not immediately. This includes all changes made to maps, regions or agents by navigation related Nodes in the SceneTree or made through scripts. +\ **Note:** Most **NavigationServer3D** changes take effect after the next physics frame and not immediately. This includes all changes made to maps, regions or agents by navigation-related nodes in the scene tree or made through scripts. For two regions to be connected to each other, they must share a similar edge. An edge is considered connected to another if both of its two vertices are at a distance less than ``edge_connection_margin`` to the respective other edge's vertex. -You may assign navigation layers to regions with :ref:`region_set_navigation_layers`, which then can be checked upon when requesting a path with :ref:`map_get_path`. This allows allowing or forbidding some areas to 3D objects. +You may assign navigation layers to regions with :ref:`region_set_navigation_layers`, which then can be checked upon when requesting a path with :ref:`map_get_path`. This can be used to allow or deny certain areas for some objects. To use the collision avoidance system, you may use agents. You can set an agent's target velocity, then the servers will emit a callback with a modified velocity. -\ **Note:** The collision avoidance system ignores regions. Using the modified velocity as-is might lead to pushing and agent outside of a navigable area. This is a limitation of the collision avoidance system, any more complex situation may require the use of the physics engine. +\ **Note:** The collision avoidance system ignores regions. Using the modified velocity directly may move an agent outside of the traversable area. This is a limitation of the collision avoidance system, any more complex situation may require the use of the physics engine. This server keeps tracks of any call and executes them during the sync phase. This means that you can request any change to the map, using any thread, without worrying. diff --git a/classes/class_ninepatchrect.rst b/classes/class_ninepatchrect.rst index bf51022abf8..db396e1edab 100644 --- a/classes/class_ninepatchrect.rst +++ b/classes/class_ninepatchrect.rst @@ -12,14 +12,14 @@ NinePatchRect **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Scalable texture-based frame that tiles the texture's centers and sides, but keeps the corners' original size. Perfect for panels and dialog boxes. +A control that displays a texture by keeping its corners intact, but tiling its edges and center. .. rst-class:: classref-introduction-group Description ----------- -Also known as 9-slice panels, NinePatchRect produces clean panels of any size, based on a small texture. To do so, it splits the texture in a 3×3 grid. When you scale the node, it tiles the texture's sides horizontally or vertically, the center on both axes but it doesn't scale or tile the corners. +Also known as 9-slice panels, **NinePatchRect** produces clean panels of any size based on a small texture. To do so, it splits the texture in a 3×3 grid. When you scale the node, it tiles the texture's edges horizontally or vertically, tiles the center on both axes, and leaves the corners unchanged. .. rst-class:: classref-reftable-group diff --git a/classes/class_node.rst b/classes/class_node.rst index 968fa4ce328..c57837b9b16 100644 --- a/classes/class_node.rst +++ b/classes/class_node.rst @@ -14,7 +14,7 @@ Node **Inherited By:** :ref:`AnimationPlayer`, :ref:`AnimationTree`, :ref:`AudioStreamPlayer`, :ref:`CanvasItem`, :ref:`CanvasLayer`, :ref:`EditorFileSystem`, :ref:`EditorPlugin`, :ref:`EditorResourcePreview`, :ref:`HTTPRequest`, :ref:`InstancePlaceholder`, :ref:`MissingNode`, :ref:`MultiplayerSpawner`, :ref:`MultiplayerSynchronizer`, :ref:`NavigationAgent2D`, :ref:`NavigationAgent3D`, :ref:`Node3D`, :ref:`ResourcePreloader`, :ref:`ShaderGlobalsOverride`, :ref:`SkeletonIK3D`, :ref:`Timer`, :ref:`Viewport`, :ref:`WorldEnvironment` -Base class for all *scene* objects. +Base class for all scene objects. .. rst-class:: classref-introduction-group diff --git a/classes/class_nodepath.rst b/classes/class_nodepath.rst index 65d9e7fee7b..178935cd346 100644 --- a/classes/class_nodepath.rst +++ b/classes/class_nodepath.rst @@ -10,7 +10,7 @@ NodePath ======== -Pre-parsed scene tree path. +A pre-parsed scene tree path. .. rst-class:: classref-introduction-group @@ -42,6 +42,8 @@ See also :ref:`StringName`, which is a similar concept for gen \ **Note:** In the editor, **NodePath** properties are automatically updated when moving, renaming or deleting a node in the scene tree, but they are never updated at runtime. +\ **Note:** In a boolean context, a **NodePath** will evaluate to ``false`` if it is empty (``NodePath("")``). Otherwise, a **NodePath** will always evaluate to ``true``. + .. rst-class:: classref-introduction-group Tutorials diff --git a/classes/class_noisetexture2d.rst b/classes/class_noisetexture2d.rst index 46d072fd6fa..96b822d39a4 100644 --- a/classes/class_noisetexture2d.rst +++ b/classes/class_noisetexture2d.rst @@ -19,9 +19,7 @@ A texture filled with noise generated by a :ref:`Noise` object. Description ----------- -Uses :ref:`FastNoiseLite` or other libraries to fill the texture data of your desired size. - -NoiseTexture2D can also generate normalmap textures. +Uses :ref:`FastNoiseLite` or other libraries to fill the texture data of your desired size. **NoiseTexture2D** can also generate normal map textures. The class uses :ref:`Thread`\ s to generate the texture data internally, so :ref:`Texture2D.get_image` may return ``null`` if the generation process has not completed yet. In that case, you need to wait for the texture to be generated before accessing the image and the generated byte data: @@ -140,11 +138,9 @@ A :ref:`Gradient` which is used to map the luminance of each pix - void **set_generate_mipmaps** **(** :ref:`bool` value **)** - :ref:`bool` **is_generating_mipmaps** **(** **)** -Determines whether mipmaps are generated for this texture. - -Enabling this results in less texture aliasing, but the noise texture generation may take longer. +Determines whether mipmaps are generated for this texture. Enabling this results in less texture aliasing in the distance, at the cost of increasing memory usage by roughly 33% and making the noise texture generation take longer. -Requires (anisotropic) mipmap filtering to be enabled for a material to have an effect. +\ **Note:** :ref:`generate_mipmaps` requires mipmap filtering to be enabled on the material using the **NoiseTexture2D** to have an effect. .. rst-class:: classref-item-separator @@ -161,7 +157,7 @@ Requires (anisotropic) mipmap filtering to be enabled for a material to have an - void **set_height** **(** :ref:`int` value **)** - :ref:`int` **get_height** **(** **)** -Height of the generated texture. +Height of the generated texture (in pixels). .. rst-class:: classref-item-separator @@ -252,6 +248,8 @@ If ``true``, a seamless texture is requested from the :ref:`Noise` \ **Note:** Seamless noise textures may take longer to generate and/or can have a lower contrast compared to non-seamless noise depending on the used :ref:`Noise` resource. This is because some implementations use higher dimensions for generating seamless noise. +\ **Note:** The default :ref:`FastNoiseLite` implementation uses the fallback path for seamless generation. If using a :ref:`width` or :ref:`height` lower than the default, you may need to increase :ref:`seamless_blend_skirt` to make seamless blending more effective. + .. rst-class:: classref-item-separator ---- @@ -269,6 +267,8 @@ If ``true``, a seamless texture is requested from the :ref:`Noise` Used for the default/fallback implementation of the seamless texture generation. It determines the distance over which the seams are blended. High values may result in less details and contrast. See :ref:`Noise` for further details. +\ **Note:** If using a :ref:`width` or :ref:`height` lower than the default, you may need to increase :ref:`seamless_blend_skirt` to make seamless blending more effective. + .. rst-class:: classref-item-separator ---- @@ -284,7 +284,7 @@ Used for the default/fallback implementation of the seamless texture generation. - void **set_width** **(** :ref:`int` value **)** - :ref:`int` **get_width** **(** **)** -Width of the generated texture. +Width of the generated texture (in pixels). .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_noisetexture3d.rst b/classes/class_noisetexture3d.rst index 568a03919f1..ee6dd16257b 100644 --- a/classes/class_noisetexture3d.rst +++ b/classes/class_noisetexture3d.rst @@ -95,7 +95,7 @@ A :ref:`Gradient` which is used to map the luminance of each pix - void **set_depth** **(** :ref:`int` value **)** - :ref:`int` **get_depth** **(** **)** -Depth of the generated texture. +Depth of the generated texture (in pixels). .. rst-class:: classref-item-separator @@ -112,7 +112,7 @@ Depth of the generated texture. - void **set_height** **(** :ref:`int` value **)** - :ref:`int` **get_height** **(** **)** -Height of the generated texture. +Height of the generated texture (in pixels). .. rst-class:: classref-item-separator @@ -186,6 +186,8 @@ If ``true``, a seamless texture is requested from the :ref:`Noise` \ **Note:** Seamless noise textures may take longer to generate and/or can have a lower contrast compared to non-seamless noise depending on the used :ref:`Noise` resource. This is because some implementations use higher dimensions for generating seamless noise. +\ **Note:** The default :ref:`FastNoiseLite` implementation uses the fallback path for seamless generation. If using a :ref:`width`, :ref:`height` or :ref:`depth` lower than the default, you may need to increase :ref:`seamless_blend_skirt` to make seamless blending more effective. + .. rst-class:: classref-item-separator ---- @@ -203,6 +205,8 @@ If ``true``, a seamless texture is requested from the :ref:`Noise` Used for the default/fallback implementation of the seamless texture generation. It determines the distance over which the seams are blended. High values may result in less details and contrast. See :ref:`Noise` for further details. +\ **Note:** If using a :ref:`width`, :ref:`height` or :ref:`depth` lower than the default, you may need to increase :ref:`seamless_blend_skirt` to make seamless blending more effective. + .. rst-class:: classref-item-separator ---- @@ -218,7 +222,7 @@ Used for the default/fallback implementation of the seamless texture generation. - void **set_width** **(** :ref:`int` value **)** - :ref:`int` **get_width** **(** **)** -Width of the generated texture. +Width of the generated texture (in pixels). .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_object.rst b/classes/class_object.rst index af9abbf4e82..da02dd9bb48 100644 --- a/classes/class_object.rst +++ b/classes/class_object.rst @@ -1082,7 +1082,9 @@ Returns the object's unique instance ID. This ID can be saved in :ref:`EncodedOb Returns the object's metadata value for the given entry ``name``. If the entry does not exist, returns ``default``. If ``default`` is ``null``, an error is also generated. -\ **Note:** Metadata that has a ``name`` starting with an underscore (``_``) is considered editor-only. Editor-only metadata is not displayed in the Inspector dock and should not be edited. +\ **Note:** A metadata's ``name`` must be a valid identifier as per :ref:`StringName.is_valid_identifier` method. + +\ **Note:** Metadata that has a ``name`` starting with an underscore (``_``) is considered editor-only. Editor-only metadata is not displayed in the Inspector and should not be edited, although it can still be found by this method. .. rst-class:: classref-item-separator @@ -1202,6 +1204,8 @@ Returns the list of existing signals as an :ref:`Array` of dictiona Returns ``true`` if a metadata entry is found with the given ``name``. See also :ref:`get_meta`, :ref:`set_meta` and :ref:`remove_meta`. +\ **Note:** A metadata's ``name`` must be a valid identifier as per :ref:`StringName.is_valid_identifier` method. + \ **Note:** Metadata that has a ``name`` starting with an underscore (``_``) is considered editor-only. Editor-only metadata is not displayed in the Inspector and should not be edited, although it can still be found by this method. .. rst-class:: classref-item-separator @@ -1408,7 +1412,9 @@ void **remove_meta** **(** :ref:`StringName` name **)** Removes the given entry ``name`` from the object's metadata. See also :ref:`has_meta`, :ref:`get_meta` and :ref:`set_meta`. -\ **Note:** Metadata that has a ``name`` starting with an underscore (``_``) is considered editor-only. Editor-only metadata is not displayed in the Inspector and should not be edited. +\ **Note:** A metadata's ``name`` must be a valid identifier as per :ref:`StringName.is_valid_identifier` method. + +\ **Note:** Metadata that has a ``name`` starting with an underscore (``_``) is considered editor-only. Editor-only metadata is not displayed in the Inspector and should not be edited, although it can still be found by this method. .. rst-class:: classref-item-separator @@ -1553,7 +1559,9 @@ Adds or changes the entry ``name`` inside the object's metadata. The metadata `` If ``value`` is ``null``, the entry is removed. This is the equivalent of using :ref:`remove_meta`. See also :ref:`has_meta` and :ref:`get_meta`. -\ **Note:** Metadata that has a ``name`` starting with an underscore (``_``) is considered editor-only. Editor-only metadata is not displayed in the Inspector dock and should not be edited. +\ **Note:** A metadata's ``name`` must be a valid identifier as per :ref:`StringName.is_valid_identifier` method. + +\ **Note:** Metadata that has a ``name`` starting with an underscore (``_``) is considered editor-only. Editor-only metadata is not displayed in the Inspector and should not be edited, although it can still be found by this method. .. rst-class:: classref-item-separator diff --git a/classes/class_optimizedtranslation.rst b/classes/class_optimizedtranslation.rst index 9d7b87ad5a9..2de54cabe47 100644 --- a/classes/class_optimizedtranslation.rst +++ b/classes/class_optimizedtranslation.rst @@ -12,14 +12,14 @@ OptimizedTranslation **Inherits:** :ref:`Translation` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Optimized translation. +An optimized translation, used by default for CSV Translations. .. rst-class:: classref-introduction-group Description ----------- -Optimized translation. Uses real-time compressed translations, which results in very small dictionaries. +An optimized translation, used by default for CSV Translations. Uses real-time compressed translations, which results in very small dictionaries. .. rst-class:: classref-reftable-group diff --git a/classes/class_optionbutton.rst b/classes/class_optionbutton.rst index ee64e5cfa20..8dd644c647f 100644 --- a/classes/class_optionbutton.rst +++ b/classes/class_optionbutton.rst @@ -12,14 +12,14 @@ OptionButton **Inherits:** :ref:`Button` **<** :ref:`BaseButton` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Button control that provides selectable options when pressed. +A button that brings up a dropdown with selectable options when pressed. .. rst-class:: classref-introduction-group Description ----------- -OptionButton is a type button that provides a selectable list of items when pressed. The item selected becomes the "current" item and is displayed as the button text. +**OptionButton** is a type of button that brings up a dropdown with selectable items when pressed. The item selected becomes the "current" item and is displayed as the button text. See also :ref:`BaseButton` which contains common properties and methods associated with this node. @@ -27,6 +27,10 @@ See also :ref:`BaseButton` which contains common properties an \ **Note:** The ID values used for items are limited to 32 bits, not full 64 bits of :ref:`int`. This has a range of ``-2^32`` to ``2^32 - 1``, i.e. ``-2147483648`` to ``2147483647``. +\ **Note:** The ID values used for items are 32-bit, unlike :ref:`int` which is always 64-bit. They go from ``-2147483648`` to ``2147483647``. + +\ **Note:** The :ref:`Button.text` and :ref:`Button.icon` properties are set automatically based on the selected item. They shouldn't be changed manually. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_os.rst b/classes/class_os.rst index fed61bc5267..b65d96a6aee 100644 --- a/classes/class_os.rst +++ b/classes/class_os.rst @@ -12,14 +12,14 @@ OS **Inherits:** :ref:`Object` -Operating System functions. +Provides access to common operating system functionalities. .. rst-class:: classref-introduction-group Description ----------- -Operating System functions. **OS** wraps the most common functionality to communicate with the host operating system, such as the video driver, delays, environment variables, execution of binaries, command line, etc. +This class wraps the most common functionalities for communicating with the host operating system, such as the video driver, delays, environment variables, execution of binaries, command line, etc. \ **Note:** In Godot 4, **OS** functions related to window management were moved to the :ref:`DisplayServer` singleton. @@ -736,7 +736,7 @@ Returns the path to the current engine executable. With this function, you can get the list of dangerous permissions that have been granted to the Android application. -\ **Note:** This method is implemented on Android. +\ **Note:** This method is implemented only on Android. .. rst-class:: classref-item-separator @@ -1365,7 +1365,7 @@ At the moment this function is only used by ``AudioDriverOpenSL`` to request per With this function, you can request dangerous permissions since normal permissions are automatically granted at install time in Android applications. -\ **Note:** This method is implemented on Android. +\ **Note:** This method is implemented only on Android. .. rst-class:: classref-item-separator diff --git a/classes/class_packeddatacontainerref.rst b/classes/class_packeddatacontainerref.rst index 9775322329a..98006a26a6d 100644 --- a/classes/class_packeddatacontainerref.rst +++ b/classes/class_packeddatacontainerref.rst @@ -12,7 +12,7 @@ PackedDataContainerRef **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Internal class used by :ref:`PackedDataContainer`. +An internal class used by :ref:`PackedDataContainer` to pack nested arrays and dictionaries. .. rst-class:: classref-introduction-group diff --git a/classes/class_packedfloat32array.rst b/classes/class_packedfloat32array.rst index 94a276d8091..8a8a0632920 100644 --- a/classes/class_packedfloat32array.rst +++ b/classes/class_packedfloat32array.rst @@ -187,6 +187,8 @@ Finds the index of an existing value (or the insertion index that maintains sort \ **Note:** Calling :ref:`bsearch` on an unsorted array results in unexpected behavior. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -211,6 +213,8 @@ Clears the array. This is equivalent to using :ref:`resize` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -247,6 +251,8 @@ Assigns the given value to all elements in the array. This can typically be used Searches the array for a value and returns its index or ``-1`` if not found. Optionally, the initial search index can be passed. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -259,6 +265,8 @@ Searches the array for a value and returns its index or ``-1`` if not found. Opt Returns ``true`` if the array contains ``value``. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -343,6 +351,8 @@ Reverses the order of the elements in the array. Searches the array in reverse order. Optionally, a start search index can be passed. If negative, the start index is considered relative to the end of the array. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -395,6 +405,8 @@ void **sort** **(** **)** Sorts the elements of the array in ascending order. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_packedfloat64array.rst b/classes/class_packedfloat64array.rst index 36ee060d75b..c664b6326e8 100644 --- a/classes/class_packedfloat64array.rst +++ b/classes/class_packedfloat64array.rst @@ -187,6 +187,8 @@ Finds the index of an existing value (or the insertion index that maintains sort \ **Note:** Calling :ref:`bsearch` on an unsorted array results in unexpected behavior. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -211,6 +213,8 @@ Clears the array. This is equivalent to using :ref:`resize` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -247,6 +251,8 @@ Assigns the given value to all elements in the array. This can typically be used Searches the array for a value and returns its index or ``-1`` if not found. Optionally, the initial search index can be passed. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -259,6 +265,8 @@ Searches the array for a value and returns its index or ``-1`` if not found. Opt Returns ``true`` if the array contains ``value``. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -343,6 +351,8 @@ Reverses the order of the elements in the array. Searches the array in reverse order. Optionally, a start search index can be passed. If negative, the start index is considered relative to the end of the array. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -395,6 +405,8 @@ void **sort** **(** **)** Sorts the elements of the array in ascending order. +\ **Note:** :ref:`@GDScript.NAN` doesn't behave the same as other numbers. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_packedvector2array.rst b/classes/class_packedvector2array.rst index 6ce6d0908a7..6e1a97932af 100644 --- a/classes/class_packedvector2array.rst +++ b/classes/class_packedvector2array.rst @@ -194,6 +194,8 @@ Finds the index of an existing value (or the insertion index that maintains sort \ **Note:** Calling :ref:`bsearch` on an unsorted array results in unexpected behavior. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -218,6 +220,8 @@ Clears the array. This is equivalent to using :ref:`resize` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -254,6 +258,8 @@ Assigns the given value to all elements in the array. This can typically be used Searches the array for a value and returns its index or ``-1`` if not found. Optionally, the initial search index can be passed. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -266,6 +272,8 @@ Searches the array for a value and returns its index or ``-1`` if not found. Opt Returns ``true`` if the array contains ``value``. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -350,6 +358,8 @@ Reverses the order of the elements in the array. Searches the array in reverse order. Optionally, a start search index can be passed. If negative, the start index is considered relative to the end of the array. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -402,6 +412,8 @@ void **sort** **(** **)** Sorts the elements of the array in ascending order. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_packedvector3array.rst b/classes/class_packedvector3array.rst index d51d69160da..e3831baade7 100644 --- a/classes/class_packedvector3array.rst +++ b/classes/class_packedvector3array.rst @@ -187,6 +187,8 @@ Finds the index of an existing value (or the insertion index that maintains sort \ **Note:** Calling :ref:`bsearch` on an unsorted array results in unexpected behavior. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -211,6 +213,8 @@ Clears the array. This is equivalent to using :ref:`resize` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -247,6 +251,8 @@ Assigns the given value to all elements in the array. This can typically be used Searches the array for a value and returns its index or ``-1`` if not found. Optionally, the initial search index can be passed. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -259,6 +265,8 @@ Searches the array for a value and returns its index or ``-1`` if not found. Opt Returns ``true`` if the array contains ``value``. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -343,6 +351,8 @@ Reverses the order of the elements in the array. Searches the array in reverse order. Optionally, a start search index can be passed. If negative, the start index is considered relative to the end of the array. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -395,6 +405,8 @@ void **sort** **(** **)** Sorts the elements of the array in ascending order. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this method may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_panel.rst b/classes/class_panel.rst index 9525e0497bf..6e3a4eed7e2 100644 --- a/classes/class_panel.rst +++ b/classes/class_panel.rst @@ -12,14 +12,14 @@ Panel **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Provides an opaque background for :ref:`Control` children. +A GUI control that displays a :ref:`StyleBox`. .. rst-class:: classref-introduction-group Description ----------- -Panel is a :ref:`Control` that displays an opaque background. It's commonly used as a parent and container for other types of :ref:`Control` nodes. +**Panel** is a GUI control that displays a :ref:`StyleBox`. See also :ref:`PanelContainer`. .. rst-class:: classref-introduction-group @@ -59,7 +59,7 @@ Theme Property Descriptions :ref:`StyleBox` **panel** -The style of this **Panel**. +The :ref:`StyleBox` of this control. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_panelcontainer.rst b/classes/class_panelcontainer.rst index 68f7f41062a..7580d849784 100644 --- a/classes/class_panelcontainer.rst +++ b/classes/class_panelcontainer.rst @@ -14,21 +14,21 @@ PanelContainer **Inherited By:** :ref:`ScriptEditor` -Panel container type. +A container that keeps its child controls within the area of a :ref:`StyleBox`. .. rst-class:: classref-introduction-group Description ----------- -Panel container type. This container fits controls inside of the delimited area of a stylebox. It's useful for giving controls an outline. +A container that keeps its child controls within the area of a :ref:`StyleBox`. Useful for giving controls an outline. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` - `2D Role Playing Game Demo `__ diff --git a/classes/class_parallaxbackground.rst b/classes/class_parallaxbackground.rst index 8094a7fbeef..c248ae9fb32 100644 --- a/classes/class_parallaxbackground.rst +++ b/classes/class_parallaxbackground.rst @@ -21,6 +21,8 @@ Description A ParallaxBackground uses one or more :ref:`ParallaxLayer` child nodes to create a parallax effect. Each :ref:`ParallaxLayer` can move at a different speed using :ref:`ParallaxLayer.motion_offset`. This creates an illusion of depth in a 2D game. If not used with a :ref:`Camera2D`, you must manually calculate the :ref:`scroll_offset`. +\ **Note:** Each **ParallaxBackground** is drawn on one specific :ref:`Viewport` and cannot be shared between multiple :ref:`Viewport`\ s, see :ref:`CanvasLayer.custom_viewport`. When using multiple :ref:`Viewport`\ s, for example in a split-screen game, you need create an individual **ParallaxBackground** for each :ref:`Viewport` you want it to be drawn on. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_physicsbody2d.rst b/classes/class_physicsbody2d.rst index b6e4ebd058a..672ab638a84 100644 --- a/classes/class_physicsbody2d.rst +++ b/classes/class_physicsbody2d.rst @@ -14,14 +14,14 @@ PhysicsBody2D **Inherited By:** :ref:`CharacterBody2D`, :ref:`RigidBody2D`, :ref:`StaticBody2D` -Base class for all objects affected by physics in 2D space. +Abstract base class for 2D game objects affected by physics. .. rst-class:: classref-introduction-group Description ----------- -PhysicsBody2D is an abstract base class for implementing a physics body. All \*Body2D types inherit from it. +**PhysicsBody2D** is an abstract base class for 2D game objects affected by physics. All 2D physics bodies inherit from it. .. rst-class:: classref-introduction-group diff --git a/classes/class_physicsbody3d.rst b/classes/class_physicsbody3d.rst index 4329ecfdd00..ddabb7c157c 100644 --- a/classes/class_physicsbody3d.rst +++ b/classes/class_physicsbody3d.rst @@ -14,16 +14,16 @@ PhysicsBody3D **Inherited By:** :ref:`CharacterBody3D`, :ref:`PhysicalBone3D`, :ref:`RigidBody3D`, :ref:`StaticBody3D` -Base class for all objects affected by physics in 3D space. +Abstract base class for 3D game objects affected by physics. .. rst-class:: classref-introduction-group Description ----------- -PhysicsBody3D is an abstract base class for implementing a physics body. All \*Body3D types inherit from it. +**PhysicsBody3D** is an abstract base class for 3D game objects affected by physics. All 3D physics bodies inherit from it. -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +\ **Warning:** With a non-uniform scale, this node will likely not behave as expected. It is advised to keep its scale the same on all axes and adjust its collision shape(s) instead. .. rst-class:: classref-introduction-group diff --git a/classes/class_physicsdirectbodystate2d.rst b/classes/class_physicsdirectbodystate2d.rst index 61709111e90..fe8d243c35a 100644 --- a/classes/class_physicsdirectbodystate2d.rst +++ b/classes/class_physicsdirectbodystate2d.rst @@ -14,14 +14,14 @@ PhysicsDirectBodyState2D **Inherited By:** :ref:`PhysicsDirectBodyState2DExtension` -Direct access object to a physics body in the :ref:`PhysicsServer2D`. +Provides direct access to a physics body in the :ref:`PhysicsServer2D`. .. rst-class:: classref-introduction-group Description ----------- -Provides direct access to a physics body in the :ref:`PhysicsServer2D`, allowing safe changes to physics properties. This object is passed via the direct state callback of rigid bodies, and is intended for changing the direct state of that body. See :ref:`RigidBody2D._integrate_forces`. +Provides direct access to a physics body in the :ref:`PhysicsServer2D`, allowing safe changes to physics properties. This object is passed via the direct state callback of :ref:`RigidBody2D`, and is intended for changing the direct state of that body. See :ref:`RigidBody2D._integrate_forces`. .. rst-class:: classref-introduction-group diff --git a/classes/class_physicsdirectbodystate2dextension.rst b/classes/class_physicsdirectbodystate2dextension.rst index 40f8571a580..ed9bc5a27e4 100644 --- a/classes/class_physicsdirectbodystate2dextension.rst +++ b/classes/class_physicsdirectbodystate2dextension.rst @@ -12,9 +12,16 @@ PhysicsDirectBodyState2DExtension **Inherits:** :ref:`PhysicsDirectBodyState2D` **<** :ref:`Object` -.. container:: contribute +Provides virtual methods that can be overridden to create custom :ref:`PhysicsDirectBodyState2D` implementations. + +.. rst-class:: classref-introduction-group + +Description +----------- + +This class extends :ref:`PhysicsDirectBodyState2D` by providing additional virtual methods that can be overridden. When these methods are overridden, they will be called instead of the internal methods of the physics server. - There is currently no description for this class. Please help us by :ref:`contributing one `! +Intended for use with GDExtension to create custom implementations of :ref:`PhysicsDirectBodyState2D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsdirectbodystate3d.rst b/classes/class_physicsdirectbodystate3d.rst index bb75af98175..6b5461634df 100644 --- a/classes/class_physicsdirectbodystate3d.rst +++ b/classes/class_physicsdirectbodystate3d.rst @@ -14,14 +14,14 @@ PhysicsDirectBodyState3D **Inherited By:** :ref:`PhysicsDirectBodyState3DExtension` -Direct access object to a physics body in the :ref:`PhysicsServer3D`. +Provides direct access to a physics body in the :ref:`PhysicsServer3D`. .. rst-class:: classref-introduction-group Description ----------- -Provides direct access to a physics body in the :ref:`PhysicsServer3D`, allowing safe changes to physics properties. This object is passed via the direct state callback of rigid bodies, and is intended for changing the direct state of that body. See :ref:`RigidBody3D._integrate_forces`. +Provides direct access to a physics body in the :ref:`PhysicsServer3D`, allowing safe changes to physics properties. This object is passed via the direct state callback of :ref:`RigidBody3D`, and is intended for changing the direct state of that body. See :ref:`RigidBody3D._integrate_forces`. .. rst-class:: classref-introduction-group diff --git a/classes/class_physicsdirectbodystate3dextension.rst b/classes/class_physicsdirectbodystate3dextension.rst index 3f79037ea7c..6ae9124514a 100644 --- a/classes/class_physicsdirectbodystate3dextension.rst +++ b/classes/class_physicsdirectbodystate3dextension.rst @@ -12,9 +12,16 @@ PhysicsDirectBodyState3DExtension **Inherits:** :ref:`PhysicsDirectBodyState3D` **<** :ref:`Object` -.. container:: contribute +Provides virtual methods that can be overridden to create custom :ref:`PhysicsDirectBodyState3D` implementations. + +.. rst-class:: classref-introduction-group + +Description +----------- + +This class extends :ref:`PhysicsDirectBodyState3D` by providing additional virtual methods that can be overridden. When these methods are overridden, they will be called instead of the internal methods of the physics server. - There is currently no description for this class. Please help us by :ref:`contributing one `! +Intended for use with GDExtension to create custom implementations of :ref:`PhysicsDirectBodyState3D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsdirectspacestate2d.rst b/classes/class_physicsdirectspacestate2d.rst index 06900c82ab7..103369bf73c 100644 --- a/classes/class_physicsdirectspacestate2d.rst +++ b/classes/class_physicsdirectspacestate2d.rst @@ -14,14 +14,14 @@ PhysicsDirectSpaceState2D **Inherited By:** :ref:`PhysicsDirectSpaceState2DExtension` -Direct access object to a space in the :ref:`PhysicsServer2D`. +Provides direct access to a physics space in the :ref:`PhysicsServer2D`. .. rst-class:: classref-introduction-group Description ----------- -Direct access object to a space in the :ref:`PhysicsServer2D`. It's used mainly to do queries against objects and areas residing in a given space. +Provides direct access to a physics space in the :ref:`PhysicsServer2D`. It's used mainly to do queries against objects and areas residing in a given space. .. rst-class:: classref-introduction-group diff --git a/classes/class_physicsdirectspacestate2dextension.rst b/classes/class_physicsdirectspacestate2dextension.rst index 5c9cdbce89d..475dd506069 100644 --- a/classes/class_physicsdirectspacestate2dextension.rst +++ b/classes/class_physicsdirectspacestate2dextension.rst @@ -12,9 +12,16 @@ PhysicsDirectSpaceState2DExtension **Inherits:** :ref:`PhysicsDirectSpaceState2D` **<** :ref:`Object` -.. container:: contribute +Provides virtual methods that can be overridden to create custom :ref:`PhysicsDirectSpaceState2D` implementations. + +.. rst-class:: classref-introduction-group + +Description +----------- + +This class extends :ref:`PhysicsDirectSpaceState2D` by providing additional virtual methods that can be overridden. When these methods are overridden, they will be called instead of the internal methods of the physics server. - There is currently no description for this class. Please help us by :ref:`contributing one `! +Intended for use with GDExtension to create custom implementations of :ref:`PhysicsDirectSpaceState2D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsdirectspacestate3d.rst b/classes/class_physicsdirectspacestate3d.rst index 4b52ab791e4..93441440485 100644 --- a/classes/class_physicsdirectspacestate3d.rst +++ b/classes/class_physicsdirectspacestate3d.rst @@ -14,14 +14,14 @@ PhysicsDirectSpaceState3D **Inherited By:** :ref:`PhysicsDirectSpaceState3DExtension` -Direct access object to a space in the :ref:`PhysicsServer3D`. +Provides direct access to a physics space in the :ref:`PhysicsServer3D`. .. rst-class:: classref-introduction-group Description ----------- -Direct access object to a space in the :ref:`PhysicsServer3D`. It's used mainly to do queries against objects and areas residing in a given space. +Provides direct access to a physics space in the :ref:`PhysicsServer3D`. It's used mainly to do queries against objects and areas residing in a given space. .. rst-class:: classref-introduction-group diff --git a/classes/class_physicsdirectspacestate3dextension.rst b/classes/class_physicsdirectspacestate3dextension.rst index edb1614d425..798809f1c62 100644 --- a/classes/class_physicsdirectspacestate3dextension.rst +++ b/classes/class_physicsdirectspacestate3dextension.rst @@ -12,9 +12,16 @@ PhysicsDirectSpaceState3DExtension **Inherits:** :ref:`PhysicsDirectSpaceState3D` **<** :ref:`Object` -.. container:: contribute +Provides virtual methods that can be overridden to create custom :ref:`PhysicsDirectSpaceState3D` implementations. + +.. rst-class:: classref-introduction-group + +Description +----------- + +This class extends :ref:`PhysicsDirectSpaceState3D` by providing additional virtual methods that can be overridden. When these methods are overridden, they will be called instead of the internal methods of the physics server. - There is currently no description for this class. Please help us by :ref:`contributing one `! +Intended for use with GDExtension to create custom implementations of :ref:`PhysicsDirectSpaceState3D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsmaterial.rst b/classes/class_physicsmaterial.rst index 969224b307f..6aa9551634e 100644 --- a/classes/class_physicsmaterial.rst +++ b/classes/class_physicsmaterial.rst @@ -12,14 +12,14 @@ PhysicsMaterial **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A material for physics properties. +Holds physics-related properties of a surface, namely its roughness and bounciness. .. rst-class:: classref-introduction-group Description ----------- -Provides a means of modifying the collision properties of a :ref:`PhysicsBody3D`. +Holds physics-related properties of a surface, namely its roughness and bounciness. This class is used to apply these properties to a physics body. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicspointqueryparameters2d.rst b/classes/class_physicspointqueryparameters2d.rst index 20e1608997e..bfacaeb13e5 100644 --- a/classes/class_physicspointqueryparameters2d.rst +++ b/classes/class_physicspointqueryparameters2d.rst @@ -12,14 +12,14 @@ PhysicsPointQueryParameters2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 2D point physics query. +Provides parameters for :ref:`PhysicsDirectSpaceState2D.intersect_point`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the position and other parameters to be used for :ref:`PhysicsDirectSpaceState2D.intersect_point`. +By changing various properties of this object, such as the point position, you can configure the parameters for :ref:`PhysicsDirectSpaceState2D.intersect_point`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicspointqueryparameters3d.rst b/classes/class_physicspointqueryparameters3d.rst index d895d3424f1..9f13435133b 100644 --- a/classes/class_physicspointqueryparameters3d.rst +++ b/classes/class_physicspointqueryparameters3d.rst @@ -12,14 +12,14 @@ PhysicsPointQueryParameters3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 3D point physics query. +Provides parameters for :ref:`PhysicsDirectSpaceState3D.intersect_point`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the position and other parameters to be used for :ref:`PhysicsDirectSpaceState3D.intersect_point`. +By changing various properties of this object, such as the point position, you can configure the parameters for :ref:`PhysicsDirectSpaceState3D.intersect_point`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsrayqueryparameters2d.rst b/classes/class_physicsrayqueryparameters2d.rst index 9e3c2402bc0..d4e51be2481 100644 --- a/classes/class_physicsrayqueryparameters2d.rst +++ b/classes/class_physicsrayqueryparameters2d.rst @@ -12,14 +12,14 @@ PhysicsRayQueryParameters2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 2D ray physics query. +Provides parameters for :ref:`PhysicsDirectSpaceState2D.intersect_ray`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the ray position and other parameters to be used for :ref:`PhysicsDirectSpaceState2D.intersect_ray`. +By changing various properties of this object, such as the ray position, you can configure the parameters for :ref:`PhysicsDirectSpaceState2D.intersect_ray`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsrayqueryparameters3d.rst b/classes/class_physicsrayqueryparameters3d.rst index d7ce447427f..eeb39440ecd 100644 --- a/classes/class_physicsrayqueryparameters3d.rst +++ b/classes/class_physicsrayqueryparameters3d.rst @@ -12,14 +12,14 @@ PhysicsRayQueryParameters3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 3D ray physics query. +Provides parameters for :ref:`PhysicsDirectSpaceState3D.intersect_ray`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the ray position and other parameters to be used for :ref:`PhysicsDirectSpaceState3D.intersect_ray`. +By changing various properties of this object, such as the ray position, you can configure the parameters for :ref:`PhysicsDirectSpaceState3D.intersect_ray`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsserver2d.rst b/classes/class_physicsserver2d.rst index 34804ead399..0f06b386a97 100644 --- a/classes/class_physicsserver2d.rst +++ b/classes/class_physicsserver2d.rst @@ -14,7 +14,7 @@ PhysicsServer2D **Inherited By:** :ref:`PhysicsServer2DExtension` -Server interface for low-level 2D physics access. +A server interface for low-level 2D physics access. .. rst-class:: classref-introduction-group @@ -25,7 +25,7 @@ PhysicsServer2D is the server responsible for all 2D physics. It can directly cr - A *space* is a self-contained world for a physics simulation. It contains bodies, areas, and joints. Its state can be queried for collision and intersection information, and several parameters of the simulation can be modified. -- A *shape* is a geometric figure such as a circle, a rectangle, a capsule, or a polygon. It can be used for collision detection by adding it to a body/area, possibly with an extra transformation relative to the body/area's origin. Bodies/areas can have multiple (transformed) shapes added to them, and a single shape can be added to bodies/areas multiple times with different local transformations. +- A *shape* is a geometric shape such as a circle, a rectangle, a capsule, or a polygon. It can be used for collision detection by adding it to a body/area, possibly with an extra transformation relative to the body/area's origin. Bodies/areas can have multiple (transformed) shapes added to them, and a single shape can be added to bodies/areas multiple times with different local transformations. - A *body* is a physical object which can be in static, kinematic, or rigid mode. Its state (such as position and velocity) can be queried and updated. A force integration callback can be set to customize the body's physics. @@ -33,9 +33,9 @@ PhysicsServer2D is the server responsible for all 2D physics. It can directly cr - A *joint* is a constraint, either between two bodies or on one body relative to a point. Parameters such as the joint bias and the rest length of a spring joint can be adjusted. -Physics objects in the physics server may be created and manipulated independently; they do not have to be tied to nodes in the scene tree. +Physics objects in **PhysicsServer2D** may be created and manipulated independently; they do not have to be tied to nodes in the scene tree. -\ **Note:** All the physics nodes use the physics server internally. Adding a physics node to the scene tree will cause a corresponding physics object to be created in the physics server. A rigid body node registers a callback that updates the node's transform with the transform of the respective body object in the physics server (every physics update). An area node registers a callback to inform the area node about overlaps with the respective area object in the physics server. The raycast node queries the direct state of the relevant space in the physics server. +\ **Note:** All the 2D physics nodes use the physics server internally. Adding a physics node to the scene tree will cause a corresponding physics object to be created in the physics server. A rigid body node registers a callback that updates the node's transform with the transform of the respective body object in the physics server (every physics update). An area node registers a callback to inform the area node about overlaps with the respective area object in the physics server. The raycast node queries the direct state of the relevant space in the physics server. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsserver2dextension.rst b/classes/class_physicsserver2dextension.rst index 2aecdc86b83..75b4395386f 100644 --- a/classes/class_physicsserver2dextension.rst +++ b/classes/class_physicsserver2dextension.rst @@ -12,9 +12,16 @@ PhysicsServer2DExtension **Inherits:** :ref:`PhysicsServer2D` **<** :ref:`Object` -.. container:: contribute +Provides virtual methods that can be overridden to create custom :ref:`PhysicsServer2D` implementations. + +.. rst-class:: classref-introduction-group + +Description +----------- + +This class extends :ref:`PhysicsServer2D` by providing additional virtual methods that can be overridden. When these methods are overridden, they will be called instead of the internal methods of the physics server. - There is currently no description for this class. Please help us by :ref:`contributing one `! +Intended for use with GDExtension to create custom implementations of :ref:`PhysicsServer2D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsserver2dmanager.rst b/classes/class_physicsserver2dmanager.rst index 7586385fc29..1db96542584 100644 --- a/classes/class_physicsserver2dmanager.rst +++ b/classes/class_physicsserver2dmanager.rst @@ -12,14 +12,14 @@ PhysicsServer2DManager **Inherits:** :ref:`Object` -Manager for 2D physics server implementations. +A singleton for managing :ref:`PhysicsServer2D` implementations. .. rst-class:: classref-introduction-group Description ----------- -**PhysicsServer2DManager** is the API for registering :ref:`PhysicsServer2D` implementations, and for setting the default implementation. +**PhysicsServer2DManager** is the API for registering :ref:`PhysicsServer2D` implementations and for setting the default implementation. \ **Note:** It is not possible to switch physics servers at runtime. This class is only used on startup at the server initialization level, by Godot itself and possibly by GDExtensions. diff --git a/classes/class_physicsserver3d.rst b/classes/class_physicsserver3d.rst index 9e0f5141c87..a485a09f0b6 100644 --- a/classes/class_physicsserver3d.rst +++ b/classes/class_physicsserver3d.rst @@ -14,14 +14,28 @@ PhysicsServer3D **Inherited By:** :ref:`PhysicsServer3DExtension` -Server interface for low-level physics access. +A server interface for low-level 3D physics access. .. rst-class:: classref-introduction-group Description ----------- -PhysicsServer3D is the server responsible for all 3D physics. It can create many kinds of physics objects, but does not insert them on the node tree. +PhysicsServer2D is the server responsible for all 2D physics. It can directly create and manipulate all physics objects: + +- A *space* is a self-contained world for a physics simulation. It contains bodies, areas, and joints. Its state can be queried for collision and intersection information, and several parameters of the simulation can be modified. + +- A *shape* is a geometric shape such as a sphere, a box, a cylinder, or a polygon. It can be used for collision detection by adding it to a body/area, possibly with an extra transformation relative to the body/area's origin. Bodies/areas can have multiple (transformed) shapes added to them, and a single shape can be added to bodies/areas multiple times with different local transformations. + +- A *body* is a physical object which can be in static, kinematic, or rigid mode. Its state (such as position and velocity) can be queried and updated. A force integration callback can be set to customize the body's physics. + +- An *area* is a region in space which can be used to detect bodies and areas entering and exiting it. A body monitoring callback can be set to report entering/exiting body shapes, and similarly an area monitoring callback can be set. Gravity and damping can be overridden within the area by setting area parameters. + +- A *joint* is a constraint, either between two bodies or on one body relative to a point. Parameters such as the joint bias and the rest length of a spring joint can be adjusted. + +Physics objects in **PhysicsServer3D** may be created and manipulated independently; they do not have to be tied to nodes in the scene tree. + +\ **Note:** All the 3D physics nodes use the physics server internally. Adding a physics node to the scene tree will cause a corresponding physics object to be created in the physics server. A rigid body node registers a callback that updates the node's transform with the transform of the respective body object in the physics server (every physics update). An area node registers a callback to inform the area node about overlaps with the respective area object in the physics server. The raycast node queries the direct state of the relevant space in the physics server. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsserver3dextension.rst b/classes/class_physicsserver3dextension.rst index c0fb05fa286..0b4858d87a2 100644 --- a/classes/class_physicsserver3dextension.rst +++ b/classes/class_physicsserver3dextension.rst @@ -12,9 +12,16 @@ PhysicsServer3DExtension **Inherits:** :ref:`PhysicsServer3D` **<** :ref:`Object` -.. container:: contribute +Provides virtual methods that can be overridden to create custom :ref:`PhysicsServer3D` implementations. + +.. rst-class:: classref-introduction-group + +Description +----------- + +This class extends :ref:`PhysicsServer3D` by providing additional virtual methods that can be overridden. When these methods are overridden, they will be called instead of the internal methods of the physics server. - There is currently no description for this class. Please help us by :ref:`contributing one `! +Intended for use with GDExtension to create custom implementations of :ref:`PhysicsServer3D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsserver3dmanager.rst b/classes/class_physicsserver3dmanager.rst index 93b20cf7fb6..545377364c2 100644 --- a/classes/class_physicsserver3dmanager.rst +++ b/classes/class_physicsserver3dmanager.rst @@ -12,14 +12,14 @@ PhysicsServer3DManager **Inherits:** :ref:`Object` -Manager for 3D physics server implementations. +A singleton for managing :ref:`PhysicsServer3D` implementations. .. rst-class:: classref-introduction-group Description ----------- -**PhysicsServer3DManager** is the API for registering :ref:`PhysicsServer3D` implementations, and for setting the default implementation. +**PhysicsServer3DManager** is the API for registering :ref:`PhysicsServer3D` implementations and for setting the default implementation. \ **Note:** It is not possible to switch physics servers at runtime. This class is only used on startup at the server initialization level, by Godot itself and possibly by GDExtensions. diff --git a/classes/class_physicsserver3drenderingserverhandler.rst b/classes/class_physicsserver3drenderingserverhandler.rst index fd2b278b32c..c054d1dccff 100644 --- a/classes/class_physicsserver3drenderingserverhandler.rst +++ b/classes/class_physicsserver3drenderingserverhandler.rst @@ -12,9 +12,7 @@ PhysicsServer3DRenderingServerHandler **Inherits:** :ref:`Object` -.. container:: contribute - - There is currently no description for this class. Please help us by :ref:`contributing one `! +A class used to provide :ref:`PhysicsServer3DExtension._soft_body_update_rendering_server` with a rendering handler for soft bodies. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsshapequeryparameters2d.rst b/classes/class_physicsshapequeryparameters2d.rst index 3d7646466f1..49f820aa96a 100644 --- a/classes/class_physicsshapequeryparameters2d.rst +++ b/classes/class_physicsshapequeryparameters2d.rst @@ -12,14 +12,14 @@ PhysicsShapeQueryParameters2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 2D shape physics query. +Provides parameters for :ref:`PhysicsDirectSpaceState2D.intersect_shape`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the shape and other parameters for :ref:`PhysicsDirectSpaceState2D` intersection/collision queries. +By changing various properties of this object, such as the shape, you can configure the parameters for :ref:`PhysicsDirectSpaceState2D.intersect_shape`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicsshapequeryparameters3d.rst b/classes/class_physicsshapequeryparameters3d.rst index 630338ecd67..d940f8ac551 100644 --- a/classes/class_physicsshapequeryparameters3d.rst +++ b/classes/class_physicsshapequeryparameters3d.rst @@ -12,14 +12,14 @@ PhysicsShapeQueryParameters3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 3D shape physics query. +Provides parameters for :ref:`PhysicsDirectSpaceState3D.intersect_shape`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the shape and other parameters for :ref:`PhysicsDirectSpaceState3D` intersection/collision queries. +By changing various properties of this object, such as the shape, you can configure the parameters for :ref:`PhysicsDirectSpaceState3D.intersect_shape`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicstestmotionparameters2d.rst b/classes/class_physicstestmotionparameters2d.rst index 055c9844446..c1470dcff43 100644 --- a/classes/class_physicstestmotionparameters2d.rst +++ b/classes/class_physicstestmotionparameters2d.rst @@ -12,14 +12,14 @@ PhysicsTestMotionParameters2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 2D body motion test. +Provides parameters for :ref:`PhysicsServer2D.body_test_motion`. .. rst-class:: classref-introduction-group Description ----------- -This class contains parameters used in :ref:`PhysicsServer2D.body_test_motion`. +By changing various properties of this object, such as the motion, you can configure the parameters for :ref:`PhysicsServer2D.body_test_motion`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicstestmotionparameters3d.rst b/classes/class_physicstestmotionparameters3d.rst index 571d898b123..b19e7c64c5a 100644 --- a/classes/class_physicstestmotionparameters3d.rst +++ b/classes/class_physicstestmotionparameters3d.rst @@ -12,14 +12,14 @@ PhysicsTestMotionParameters3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Parameters to be sent to a 3D body motion test. +Provides parameters for :ref:`PhysicsServer3D.body_test_motion`. .. rst-class:: classref-introduction-group Description ----------- -This class contains parameters used in :ref:`PhysicsServer3D.body_test_motion`. +By changing various properties of this object, such as the motion, you can configure the parameters for :ref:`PhysicsServer3D.body_test_motion`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicstestmotionresult2d.rst b/classes/class_physicstestmotionresult2d.rst index 9571f339f3a..ac70482497c 100644 --- a/classes/class_physicstestmotionresult2d.rst +++ b/classes/class_physicstestmotionresult2d.rst @@ -12,14 +12,14 @@ PhysicsTestMotionResult2D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Result from a 2D body motion test. +Describes the motion and collision result from :ref:`PhysicsServer2D.body_test_motion`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the motion and collision result from :ref:`PhysicsServer2D.body_test_motion`. +Describes the motion and collision result from :ref:`PhysicsServer2D.body_test_motion`. .. rst-class:: classref-reftable-group diff --git a/classes/class_physicstestmotionresult3d.rst b/classes/class_physicstestmotionresult3d.rst index 6e30efd1816..37d1d069a7f 100644 --- a/classes/class_physicstestmotionresult3d.rst +++ b/classes/class_physicstestmotionresult3d.rst @@ -12,14 +12,14 @@ PhysicsTestMotionResult3D **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Result from a 3D body motion test. +Describes the motion and collision result from :ref:`PhysicsServer3D.body_test_motion`. .. rst-class:: classref-introduction-group Description ----------- -This class contains the motion and collision result from :ref:`PhysicsServer3D.body_test_motion`. +Describes the motion and collision result from :ref:`PhysicsServer3D.body_test_motion`. .. rst-class:: classref-reftable-group diff --git a/classes/class_pinjoint2d.rst b/classes/class_pinjoint2d.rst index 8166dda49d6..bcb84da9c25 100644 --- a/classes/class_pinjoint2d.rst +++ b/classes/class_pinjoint2d.rst @@ -12,14 +12,14 @@ PinJoint2D **Inherits:** :ref:`Joint2D` **<** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Pin joint for 2D shapes. +A physics joint that attaches two 2D physics bodies at a single point, allowing them to freely rotate. .. rst-class:: classref-introduction-group Description ----------- -Pin joint for 2D rigid bodies. It pins two bodies (dynamic or static) together. +A physics joint that attaches two 2D physics bodies at a single point, allowing them to freely rotate. For example, a :ref:`RigidBody2D` can be attached to a :ref:`StaticBody2D` to create a pendulum or a seesaw. .. rst-class:: classref-reftable-group diff --git a/classes/class_pinjoint3d.rst b/classes/class_pinjoint3d.rst index b831402d806..cf8fee45471 100644 --- a/classes/class_pinjoint3d.rst +++ b/classes/class_pinjoint3d.rst @@ -12,14 +12,14 @@ PinJoint3D **Inherits:** :ref:`Joint3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Pin joint for 3D PhysicsBodies. +A physics joint that attaches two 3D physics bodies at a single point, allowing them to freely rotate. .. rst-class:: classref-introduction-group Description ----------- -Pin joint for 3D rigid bodies. It pins 2 bodies (dynamic or static) together. See also :ref:`Generic6DOFJoint3D`. +A physics joint that attaches two 2D physics bodies at a single point, allowing them to freely rotate. For example, a :ref:`RigidBody3D` can be attached to a :ref:`StaticBody3D` to create a pendulum or a seesaw. .. rst-class:: classref-reftable-group diff --git a/classes/class_plane.rst b/classes/class_plane.rst index e5130f70531..c06c8896432 100644 --- a/classes/class_plane.rst +++ b/classes/class_plane.rst @@ -10,14 +10,14 @@ Plane ===== -Plane in hessian form. +A plane in Hessian normal form. .. rst-class:: classref-introduction-group Description ----------- -Plane represents a normalized plane equation. Basically, "normal" is the normal of the plane (a,b,c normalized), and "d" is the distance from the origin to the plane (in the direction of "normal"). "Over" or "Above" the plane is considered the side of the plane towards where the normal is pointing. +Represents a normalized plane equation. :ref:`normal` is the normal of the plane (a, b, c normalized), and :ref:`d` is the distance from the origin to the plane (in the direction of "normal"). "Over" or "Above" the plane is considered the side of the plane towards where the normal is pointing. .. rst-class:: classref-introduction-group diff --git a/classes/class_popup.rst b/classes/class_popup.rst index f8c9f3f7b8a..a02a1f19740 100644 --- a/classes/class_popup.rst +++ b/classes/class_popup.rst @@ -14,14 +14,14 @@ Popup **Inherited By:** :ref:`PopupMenu`, :ref:`PopupPanel` -Popup is a base window container for popup-like subwindows. +Base class for contextual windows and panels with fixed position. .. rst-class:: classref-introduction-group Description ----------- -Popup is a base window container for popup-like subwindows. It's a modal by default (see :ref:`Window.popup_window`) and has helpers for custom popup behavior. +**Popup** is a base class for contextual windows and panels with fixed position. It's a modal by default (see :ref:`Window.popup_window`) and provides methods for implementing custom popup behavior. .. rst-class:: classref-reftable-group diff --git a/classes/class_popupmenu.rst b/classes/class_popupmenu.rst index c6e0d44242a..2c7f2674a0c 100644 --- a/classes/class_popupmenu.rst +++ b/classes/class_popupmenu.rst @@ -12,20 +12,18 @@ PopupMenu **Inherits:** :ref:`Popup` **<** :ref:`Window` **<** :ref:`Viewport` **<** :ref:`Node` **<** :ref:`Object` -PopupMenu displays a list of options. +A modal window used to display a list of options. .. rst-class:: classref-introduction-group Description ----------- -**PopupMenu** is a modal window used to display a list of options. They are popular in toolbars or context menus. +**PopupMenu** is a modal window used to display a list of options. Useful for toolbars and context menus. -The size of a **PopupMenu** can be limited by using :ref:`Window.max_size`. If the height of the list of items is larger than the maximum height of the **PopupMenu**, a :ref:`ScrollContainer` within the popup will allow the user to scroll the contents. +The size of a **PopupMenu** can be limited by using :ref:`Window.max_size`. If the height of the list of items is larger than the maximum height of the **PopupMenu**, a :ref:`ScrollContainer` within the popup will allow the user to scroll the contents. If no maximum size is set, or if it is set to ``0``, the **PopupMenu** height will be limited by its parent rect. -If no maximum size is set, or if it is set to 0, the **PopupMenu** height will be limited by its parent rect. - -All ``set_*`` methods allow negative item index, which makes the item accessed from the last one. +All ``set_*`` methods allow negative item indices, i.e. ``-1`` to access the last item, ``-2`` to select the second-to-last item, and so on. \ **Incremental search:** Like :ref:`ItemList` and :ref:`Tree`, **PopupMenu** supports searching within the list while the control is focused. Press a key that matches the first letter of an item's name to select the first item starting with the given letter. After that point, there are two ways to perform incremental search: 1) Press the same key again before the timeout duration to select the next item starting with the same letter. 2) Press letter keys that match the rest of the word before the timeout duration to match to select the item in question directly. Both of these actions will be reset to the beginning of the list if the timeout duration has passed since the last keystroke was registered. You can adjust the timeout duration by changing :ref:`ProjectSettings.gui/timers/incremental_search_max_interval_msec`. diff --git a/classes/class_popuppanel.rst b/classes/class_popuppanel.rst index 5f43de45d0e..f642f954380 100644 --- a/classes/class_popuppanel.rst +++ b/classes/class_popuppanel.rst @@ -12,16 +12,14 @@ PopupPanel **Inherits:** :ref:`Popup` **<** :ref:`Window` **<** :ref:`Viewport` **<** :ref:`Node` **<** :ref:`Object` -Class for displaying popups with a panel background. +A popup with a panel background. .. rst-class:: classref-introduction-group Description ----------- -Class for displaying popups with a panel background. In some cases it might be simpler to use than :ref:`Popup`, since it provides a configurable background. If you are making windows, better check :ref:`Window`. - -If any :ref:`Control` node is added as a child of this **PopupPanel**, it will be stretched to fit the panel's size (similar to how :ref:`PanelContainer` works). +A popup with a configurable panel background. Any child controls added to this node will be stretched to fit the panel's size (similar to how :ref:`PanelContainer` works). If you are making windows, see :ref:`Window`. .. rst-class:: classref-reftable-group diff --git a/classes/class_progressbar.rst b/classes/class_progressbar.rst index 5d151668824..21d7e9c190d 100644 --- a/classes/class_progressbar.rst +++ b/classes/class_progressbar.rst @@ -12,14 +12,14 @@ ProgressBar **Inherits:** :ref:`Range` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -General-purpose progress bar. +A control used for visual representation of a percentage. .. rst-class:: classref-introduction-group Description ----------- -General-purpose progress bar. Shows fill percentage from right to left. +A control used for visual representation of a percentage. Shows fill percentage from right to left. .. rst-class:: classref-reftable-group diff --git a/classes/class_projection.rst b/classes/class_projection.rst index 863cb03d480..40b30c4b18c 100644 --- a/classes/class_projection.rst +++ b/classes/class_projection.rst @@ -10,7 +10,7 @@ Projection ========== -3D projection (4x4 matrix). +A 4×4 matrix for 3D projective transformations. .. rst-class:: classref-introduction-group @@ -19,7 +19,7 @@ Description A 4x4 matrix used for 3D projective transformations. It can represent transformations such as translation, rotation, scaling, shearing, and perspective division. It consists of four :ref:`Vector4` columns. -For purely linear transformations (translation, rotation, and scale), it is recommended to use :ref:`Transform3D`, as it is more performant and has a lower memory footprint. +For purely linear transformations (translation, rotation, and scale), it is recommended to use :ref:`Transform3D`, as it is more performant and requires less memory. Used internally as :ref:`Camera3D`'s projection matrix. diff --git a/classes/class_projectsettings.rst b/classes/class_projectsettings.rst index da1edfb1c87..69ece349f93 100644 --- a/classes/class_projectsettings.rst +++ b/classes/class_projectsettings.rst @@ -12,14 +12,14 @@ ProjectSettings **Inherits:** :ref:`Object` -Contains global variables accessible from everywhere. +Stores globally-accessible variables. .. rst-class:: classref-introduction-group Description ----------- -Contains global variables accessible from everywhere. Use :ref:`get_setting`, :ref:`set_setting` or :ref:`has_setting` to access them. Variables stored in ``project.godot`` are also loaded into ProjectSettings, making this object very useful for reading custom game configuration options. +Stores variables that can be accessed from everywhere. Use :ref:`get_setting`, :ref:`set_setting` or :ref:`has_setting` to access them. Variables stored in ``project.godot`` are also loaded into **ProjectSettings**, making this object very useful for reading custom game configuration options. When naming a Project Settings property, use the full path to the setting including the category. For example, ``"application/config/name"`` for the project name. Category and property names can be viewed in the Project Settings dialog. @@ -1415,6 +1415,8 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`String` | :ref:`rendering/rendering_device/driver.windows` | ``"vulkan"`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`rendering/rendering_device/pipeline_cache/save_chunk_size_mb` | ``3.0`` | + +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`rendering/rendering_device/staging_buffer/block_size_kb` | ``256`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`rendering/rendering_device/staging_buffer/max_size_mb` | ``128`` | @@ -1535,6 +1537,8 @@ Methods +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_as_basic` **(** :ref:`String` name, :ref:`bool` basic **)** | +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_as_internal` **(** :ref:`String` name, :ref:`bool` internal **)** | + +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_initial_value` **(** :ref:`String` name, :ref:`Variant` value **)** | +---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_order` **(** :ref:`String` name, :ref:`int` position **)** | @@ -3551,7 +3555,7 @@ Main window content is expanded to the full size of the window. Unlike a borderl :ref:`Vector2i` **display/window/size/initial_position** = ``Vector2i(0, 0)`` -Main window initial position (in virtual desktop coordinates), this settings is used only if :ref:`display/window/size/initial_position_type` is set to "Absolute" (``0``). +Main window initial position (in virtual desktop coordinates), this setting is used only if :ref:`display/window/size/initial_position_type` is set to "Absolute" (``0``). .. rst-class:: classref-item-separator @@ -3581,7 +3585,7 @@ Main window initial position. :ref:`int` **display/window/size/initial_screen** = ``0`` -Main window initial screen, this settings is used only if :ref:`display/window/size/initial_position_type` is set to "Other Screen Center" (``2``). +Main window initial screen, this setting is used only if :ref:`display/window/size/initial_position_type` is set to "Other Screen Center" (``2``). .. rst-class:: classref-item-separator @@ -3713,9 +3717,13 @@ On desktop platforms, overrides the game's initial window width. See also :ref:` :ref:`String` **display/window/stretch/mode** = ``"disabled"`` -.. container:: contribute +Defines how the base size is stretched to fit the resolution of the window or screen. - There is currently no description for this property. Please help us by :ref:`contributing one `! +\ **"disabled"**: No stretching happens. One unit in the scene corresponds to one pixel on the screen. In this mode, :ref:`display/window/stretch/aspect` has no effect. Recommended for non-game applications. + +\ **"canvas_items"**: The base size specified in width and height in the project settings is stretched to cover the whole screen (taking :ref:`display/window/stretch/aspect` into account). This means that everything is rendered directly at the target resolution. 3D is unaffected, while in 2D, there is no longer a 1:1 correspondence between sprite pixels and screen pixels, which may result in scaling artifacts. Recommended for most games that don't use a pixel art aesthetic, although it is possible to use this stretch mode for pixel art games too (especially in 3D). + +\ **"viewport"**: The size of the root :ref:`Viewport` is set precisely to the base size specified in the Project Settings' Display section. The scene is rendered to this viewport first. Finally, this viewport is scaled to fit the screen (taking :ref:`display/window/stretch/aspect` into account). Recommended for games that use a pixel art aesthetic. .. rst-class:: classref-item-separator @@ -10257,6 +10265,18 @@ Windows override for :ref:`rendering/rendering_device/driver` **rendering/rendering_device/pipeline_cache/save_chunk_size_mb** = ``3.0`` + +Determines at which interval pipeline cache is saved to disk. The lower the value, the more often it is saved. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_property_rendering/rendering_device/staging_buffer/block_size_kb: .. rst-class:: classref-property @@ -10587,7 +10607,7 @@ If ``true``, the texture importer will import lossless textures using the PNG fo :ref:`bool` **rendering/textures/vram_compression/import_etc2_astc** -If ``true``, the texture importer will import VRAM-compressed textures using the Ericsson Texture Compression 2 algorithm for lower quality textures and normalmaps and Adaptable Scalable Texture Compression algorithm for high quality textures (in 4x4 block size). +If ``true``, the texture importer will import VRAM-compressed textures using the Ericsson Texture Compression 2 algorithm for lower quality textures and normal maps and Adaptable Scalable Texture Compression algorithm for high quality textures (in 4x4 block size). \ **Note:** Changing this setting does *not* impact textures that were already imported before. To make this setting apply to textures that were already imported, exit the editor, remove the ``.godot/imported/`` folder located inside the project folder then restart the editor (see :ref:`application/config/use_hidden_project_data_directory`). @@ -11093,6 +11113,18 @@ Defines if the specified setting is considered basic or advanced. Basic settings ---- +.. _class_ProjectSettings_method_set_as_internal: + +.. rst-class:: classref-method + +void **set_as_internal** **(** :ref:`String` name, :ref:`bool` internal **)** + +Defines if the specified setting is considered internal. An internal setting won't show up in the Project Settings dialog. This is mostly useful for addons that need to store their own internal settings without exposing them directly to the user. + +.. rst-class:: classref-item-separator + +---- + .. _class_ProjectSettings_method_set_initial_value: .. rst-class:: classref-method diff --git a/classes/class_randomnumbergenerator.rst b/classes/class_randomnumbergenerator.rst index da4decd0ae7..9035c6d1822 100644 --- a/classes/class_randomnumbergenerator.rst +++ b/classes/class_randomnumbergenerator.rst @@ -12,7 +12,7 @@ RandomNumberGenerator **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -A class for generating pseudo-random numbers. +Provides methods for generating pseudo-random numbers. .. rst-class:: classref-introduction-group @@ -21,7 +21,7 @@ Description RandomNumberGenerator is a class for generating pseudo-random numbers. It currently uses `PCG32 `__. -\ **Note:** The underlying algorithm is an implementation detail. As a result, it should not be depended upon for reproducible random streams across Godot versions. +\ **Note:** The underlying algorithm is an implementation detail and should not be depended upon. To generate a random float number (within a given range) based on a time-dependant seed: @@ -31,8 +31,6 @@ To generate a random float number (within a given range) based on a time-dependa func _ready(): var my_random_number = rng.randf_range(-10.0, 10.0) -\ **Note:** The default values of :ref:`seed` and :ref:`state` properties are pseudo-random, and change when calling :ref:`randomize`. The ``0`` value documented here is a placeholder, and not the actual default seed. - .. rst-class:: classref-introduction-group Tutorials @@ -102,6 +100,8 @@ Initializes the random number generator state based on the given seed value. A g \ **Note:** Setting this property produces a side effect of changing the internal :ref:`state`, so make sure to initialize the seed *before* modifying the :ref:`state`: +\ **Note:** The default value of this property is pseudo-random, and changes when calling :ref:`randomize`. The ``0`` value documented here is a placeholder, and not the actual default seed. + :: var rng = RandomNumberGenerator.new() @@ -136,6 +136,8 @@ The current state of the random number generator. Save and restore this property \ **Note:** Do not set state to arbitrary values, since the random number generator requires the state to have certain qualities to behave properly. It should only be set to values that came from the state property itself. To initialize the random number generator with arbitrary input, use :ref:`seed` instead. +\ **Note:** The default value of this property is pseudo-random, and changes when calling :ref:`randomize`. The ``0`` value documented here is a placeholder, and not the actual default seed. + .. rst-class:: classref-section-separator ---- diff --git a/classes/class_range.rst b/classes/class_range.rst index 268e3c04fbb..b5e929edcda 100644 --- a/classes/class_range.rst +++ b/classes/class_range.rst @@ -14,14 +14,14 @@ Range **Inherited By:** :ref:`EditorSpinSlider`, :ref:`ProgressBar`, :ref:`ScrollBar`, :ref:`Slider`, :ref:`SpinBox`, :ref:`TextureProgressBar` -Abstract base class for range-based controls. +Abstract base class for controls that represent a number within a range. .. rst-class:: classref-introduction-group Description ----------- -Range is a base class for :ref:`Control` nodes that change a floating-point :ref:`value` between a :ref:`min_value` and :ref:`max_value`, using a configured :ref:`step` and :ref:`page` size. See e.g. :ref:`ScrollBar` and :ref:`Slider` for examples of higher level nodes using Range. +Range is an abstract base class for controls that represent a number within a range, using a configured :ref:`step` and :ref:`page` size. See e.g. :ref:`ScrollBar` and :ref:`Slider` for examples of higher-level nodes using Range. .. rst-class:: classref-reftable-group @@ -158,7 +158,7 @@ If ``true``, :ref:`value` may be less than :ref:`min - void **set_exp_ratio** **(** :ref:`bool` value **)** - :ref:`bool` **is_ratio_exp** **(** **)** -If ``true``, and ``min_value`` is greater than 0, ``value`` will be represented exponentially rather than linearly. +If ``true``, and :ref:`min_value` is greater than 0, :ref:`value` will be represented exponentially rather than linearly. .. rst-class:: classref-item-separator @@ -175,7 +175,7 @@ If ``true``, and ``min_value`` is greater than 0, ``value`` will be represented - void **set_max** **(** :ref:`float` value **)** - :ref:`float` **get_max** **(** **)** -Maximum value. Range is clamped if ``value`` is greater than ``max_value``. +Maximum value. Range is clamped if :ref:`value` is greater than :ref:`max_value`. .. rst-class:: classref-item-separator @@ -192,7 +192,7 @@ Maximum value. Range is clamped if ``value`` is greater than ``max_value``. - void **set_min** **(** :ref:`float` value **)** - :ref:`float` **get_min** **(** **)** -Minimum value. Range is clamped if ``value`` is less than ``min_value``. +Minimum value. Range is clamped if :ref:`value` is less than :ref:`min_value`. .. rst-class:: classref-item-separator @@ -209,7 +209,7 @@ Minimum value. Range is clamped if ``value`` is less than ``min_value``. - void **set_page** **(** :ref:`float` value **)** - :ref:`float` **get_page** **(** **)** -Page size. Used mainly for :ref:`ScrollBar`. ScrollBar's length is its size multiplied by ``page`` over the difference between ``min_value`` and ``max_value``. +Page size. Used mainly for :ref:`ScrollBar`. ScrollBar's length is its size multiplied by :ref:`page` over the difference between :ref:`min_value` and :ref:`max_value`. .. rst-class:: classref-item-separator @@ -243,7 +243,7 @@ The value mapped between 0 and 1. - void **set_use_rounded_values** **(** :ref:`bool` value **)** - :ref:`bool` **is_using_rounded_values** **(** **)** -If ``true``, ``value`` will always be rounded to the nearest integer. +If ``true``, :ref:`value` will always be rounded to the nearest integer. .. rst-class:: classref-item-separator @@ -260,7 +260,7 @@ If ``true``, ``value`` will always be rounded to the nearest integer. - void **set_step** **(** :ref:`float` value **)** - :ref:`float` **get_step** **(** **)** -If greater than 0, ``value`` will always be rounded to a multiple of ``step``. If ``rounded`` is also ``true``, ``value`` will first be rounded to a multiple of ``step`` then rounded to the nearest integer. +If greater than 0, :ref:`value` will always be rounded to a multiple of this property's value. If :ref:`rounded` is also ``true``, :ref:`value` will first be rounded to a multiple of this property's value, then rounded to the nearest integer. .. rst-class:: classref-item-separator diff --git a/classes/class_raycast2d.rst b/classes/class_raycast2d.rst index 67b34838c23..44803310bfd 100644 --- a/classes/class_raycast2d.rst +++ b/classes/class_raycast2d.rst @@ -12,22 +12,20 @@ RayCast2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Query the closest object intersecting a ray. +A ray in 2D space, used to find the first :ref:`CollisionObject2D` it intersects. .. rst-class:: classref-introduction-group Description ----------- -A RayCast represents a line from its origin to its destination position, :ref:`target_position`. It is used to query the 2D space in order to find the closest object along the path of the ray. +A raycast represents a ray from its origin to its :ref:`target_position` that finds the closest :ref:`CollisionObject2D` along its path, if it intersects any. This is useful for a lot of things, such as -RayCast2D can ignore some objects by adding them to the exception list via :ref:`add_exception`, by setting proper filtering with collision layers, or by filtering object types with type masks. +\ **RayCast2D** can ignore some objects by adding them to an exception list, by making its detection reporting ignore :ref:`Area2D`\ s (:ref:`collide_with_areas`) or :ref:`PhysicsBody2D`\ s (:ref:`collide_with_bodies`), or by configuring physics layers. -RayCast2D can be configured to report collisions with :ref:`Area2D`\ s (:ref:`collide_with_areas`) and/or :ref:`PhysicsBody2D`\ s (:ref:`collide_with_bodies`). +\ **RayCast2D** calculates intersection every physics frame, and it holds the result until the next physics frame. For an immediate raycast, or if you want to configure a **RayCast2D** multiple times within the same physics frame, use :ref:`force_raycast_update`. -Only enabled raycasts will be able to query the space and report collisions. - -RayCast2D calculates intersection every physics frame (see :ref:`Node`), and the result is cached so it can be used later until the next frame. If multiple queries are required between physics frames (or during the same frame) use :ref:`force_raycast_update` after adjusting the raycast. +To sweep over a region of 2D space, you can approximate the region with multiple **RayCast2D**\ s or use :ref:`ShapeCast2D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_raycast3d.rst b/classes/class_raycast3d.rst index 8b0ce193dd7..e297c936356 100644 --- a/classes/class_raycast3d.rst +++ b/classes/class_raycast3d.rst @@ -12,22 +12,20 @@ RayCast3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Query the closest object intersecting a ray. +A ray in 3D space, used to find the first :ref:`CollisionObject3D` it intersects. .. rst-class:: classref-introduction-group Description ----------- -A RayCast represents a line from its origin to its destination position, :ref:`target_position`. It is used to query the 3D space in order to find the closest object along the path of the ray. +A raycast represents a ray from its origin to its :ref:`target_position` that finds the closest :ref:`CollisionObject3D` along its path, if it intersects any. This is useful for a lot of things, such as -RayCast3D can ignore some objects by adding them to the exception list via :ref:`add_exception` or by setting proper filtering with collision layers and masks. +\ **RayCast3D** can ignore some objects by adding them to an exception list, by making its detection reporting ignore :ref:`Area3D`\ s (:ref:`collide_with_areas`) or :ref:`PhysicsBody3D`\ s (:ref:`collide_with_bodies`), or by configuring physics layers. -RayCast3D can be configured to report collisions with :ref:`Area3D`\ s (:ref:`collide_with_areas`) and/or :ref:`PhysicsBody3D`\ s (:ref:`collide_with_bodies`). +\ **RayCast3D** calculates intersection every physics frame, and it holds the result until the next physics frame. For an immediate raycast, or if you want to configure a **RayCast3D** multiple times within the same physics frame, use :ref:`force_raycast_update`. -Only enabled raycasts will be able to query the space and report collisions. - -RayCast3D calculates intersection every physics frame (see :ref:`Node`), and the result is cached so it can be used later until the next frame. If multiple queries are required between physics frames (or during the same frame), use :ref:`force_raycast_update` after adjusting the raycast. +To sweep over a region of 3D space, you can approximate the region with multiple **RayCast3D**\ s or use :ref:`ShapeCast3D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_rect2.rst b/classes/class_rect2.rst index 0cdd2825f15..56cac772d4f 100644 --- a/classes/class_rect2.rst +++ b/classes/class_rect2.rst @@ -10,7 +10,7 @@ Rect2 ===== -2D axis-aligned bounding box using floating point coordinates. +A 2D axis-aligned bounding box using floating-point coordinates. .. rst-class:: classref-introduction-group diff --git a/classes/class_rect2i.rst b/classes/class_rect2i.rst index dd95f4806e0..93f84148bc7 100644 --- a/classes/class_rect2i.rst +++ b/classes/class_rect2i.rst @@ -10,7 +10,7 @@ Rect2i ====== -2D axis-aligned bounding box using integer coordinates. +A 2D axis-aligned bounding box using integer coordinates. .. rst-class:: classref-introduction-group diff --git a/classes/class_rectangleshape2d.rst b/classes/class_rectangleshape2d.rst index ef5a7c90ccc..e6b3d16daf3 100644 --- a/classes/class_rectangleshape2d.rst +++ b/classes/class_rectangleshape2d.rst @@ -12,16 +12,16 @@ RectangleShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Rectangle shape resource for 2D physics. +A 2D rectangle shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -2D rectangle shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. This shape is useful for modeling box-like 2D objects. +A 2D rectangle shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape2D`. -\ **Performance:** Being a primitive collision shape, **RectangleShape2D** is fast to check collisions against (though not as fast as :ref:`CircleShape2D`). +\ **Performance:** **RectangleShape2D** is fast to check collisions against. It is faster than :ref:`CapsuleShape2D`, but slower than :ref:`CircleShape2D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_referencerect.rst b/classes/class_referencerect.rst index 07ba31e158d..46ec484f645 100644 --- a/classes/class_referencerect.rst +++ b/classes/class_referencerect.rst @@ -12,14 +12,14 @@ ReferenceRect **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Reference frame for GUI. +A rectangle hint for designing UIs. .. rst-class:: classref-introduction-group Description ----------- -A rectangle box that displays only a :ref:`border_color` border color around its rectangle. **ReferenceRect** has no fill :ref:`Color`. If you need to display a rectangle filled with a solid color, consider using :ref:`ColorRect` instead. +A rectangle box that displays only a colored border around its rectangle. It is used to visualize the extents of a :ref:`Control`. .. rst-class:: classref-reftable-group @@ -57,7 +57,7 @@ Property Descriptions - void **set_border_color** **(** :ref:`Color` value **)** - :ref:`Color` **get_border_color** **(** **)** -Sets the border :ref:`Color` of the **ReferenceRect**. +Sets the border color of the **ReferenceRect**. .. rst-class:: classref-item-separator diff --git a/classes/class_renderingdevice.rst b/classes/class_renderingdevice.rst index 3de4deade10..e129ca8b76d 100644 --- a/classes/class_renderingdevice.rst +++ b/classes/class_renderingdevice.rst @@ -4391,7 +4391,7 @@ void **compute_list_add_barrier** **(** :ref:`int` compute_list **)** Starts a list of compute commands created with the ``compute_*`` methods. The returned value should be passed to other ``compute_list_*`` functions. -If ``allow_draw_overlap`` is true, you may have one draw list running at the same time as one compute list. Multiple compute lists cannot be created at the same time; you must finish the previous compute list first using :ref:`compute_list_end`. +If ``allow_draw_overlap`` is ``true``, you may have one draw list running at the same time as one compute list. Multiple compute lists cannot be created at the same time; you must finish the previous compute list first using :ref:`compute_list_end`. A simple compute operation might look like this (code is not a complete example): diff --git a/classes/class_renderingserver.rst b/classes/class_renderingserver.rst index 7706ea4b734..ffeb745efb3 100644 --- a/classes/class_renderingserver.rst +++ b/classes/class_renderingserver.rst @@ -1216,7 +1216,7 @@ Array is a vertex color array. :ref:`ArrayType` **ARRAY_TEX_UV** = ``4`` -Array is an UV coordinates array. +Array is a UV coordinates array. .. _class_RenderingServer_constant_ARRAY_TEX_UV2: @@ -1224,7 +1224,7 @@ Array is an UV coordinates array. :ref:`ArrayType` **ARRAY_TEX_UV2** = ``5`` -Array is an UV coordinates array for the second set of UV coordinates. +Array is a UV coordinates array for the second set of UV coordinates. .. _class_RenderingServer_constant_ARRAY_CUSTOM0: @@ -1420,7 +1420,7 @@ Flag used to mark a vertex color array. :ref:`ArrayFormat` **ARRAY_FORMAT_TEX_UV** = ``16`` -Flag used to mark an UV coordinates array. +Flag used to mark a UV coordinates array. .. _class_RenderingServer_constant_ARRAY_FORMAT_TEX_UV2: @@ -1428,7 +1428,7 @@ Flag used to mark an UV coordinates array. :ref:`ArrayFormat` **ARRAY_FORMAT_TEX_UV2** = ``32`` -Flag used to mark an UV coordinates array for the second UV coordinates. +Flag used to mark a UV coordinates array for the second UV coordinates. .. _class_RenderingServer_constant_ARRAY_FORMAT_CUSTOM0: diff --git a/classes/class_resource.rst b/classes/class_resource.rst index 90e8c5ac906..f1f9c02b1dc 100644 --- a/classes/class_resource.rst +++ b/classes/class_resource.rst @@ -14,7 +14,7 @@ Resource **Inherited By:** :ref:`Animation`, :ref:`AnimationLibrary`, :ref:`AnimationNode`, :ref:`AnimationNodeStateMachinePlayback`, :ref:`AnimationNodeStateMachineTransition`, :ref:`AudioBusLayout`, :ref:`AudioEffect`, :ref:`AudioStream`, :ref:`BitMap`, :ref:`BoneMap`, :ref:`ButtonGroup`, :ref:`CameraAttributes`, :ref:`CryptoKey`, :ref:`Curve`, :ref:`Curve2D`, :ref:`Curve3D`, :ref:`EditorNode3DGizmoPlugin`, :ref:`EditorSettings`, :ref:`Environment`, :ref:`Font`, :ref:`GDExtension`, :ref:`GLTFAccessor`, :ref:`GLTFAnimation`, :ref:`GLTFBufferView`, :ref:`GLTFCamera`, :ref:`GLTFCollider`, :ref:`GLTFDocument`, :ref:`GLTFDocumentExtension`, :ref:`GLTFLight`, :ref:`GLTFMesh`, :ref:`GLTFNode`, :ref:`GLTFPhysicsBody`, :ref:`GLTFSkeleton`, :ref:`GLTFSkin`, :ref:`GLTFSpecGloss`, :ref:`GLTFState`, :ref:`GLTFTexture`, :ref:`GLTFTextureSampler`, :ref:`Gradient`, :ref:`Image`, :ref:`ImporterMesh`, :ref:`InputEvent`, :ref:`JSON`, :ref:`LabelSettings`, :ref:`LightmapGIData`, :ref:`Material`, :ref:`Mesh`, :ref:`MeshLibrary`, :ref:`MissingResource`, :ref:`MultiMesh`, :ref:`NavigationMesh`, :ref:`NavigationPolygon`, :ref:`Noise`, :ref:`Occluder3D`, :ref:`OccluderPolygon2D`, :ref:`OggPacketSequence`, :ref:`OpenXRAction`, :ref:`OpenXRActionMap`, :ref:`OpenXRActionSet`, :ref:`OpenXRInteractionProfile`, :ref:`OpenXRIPBinding`, :ref:`PackedDataContainer`, :ref:`PackedScene`, :ref:`PhysicsMaterial`, :ref:`PolygonPathFinder`, :ref:`RDShaderFile`, :ref:`RDShaderSPIRV`, :ref:`RichTextEffect`, :ref:`SceneReplicationConfig`, :ref:`Script`, :ref:`Shader`, :ref:`ShaderInclude`, :ref:`Shape2D`, :ref:`Shape3D`, :ref:`Shortcut`, :ref:`SkeletonModification2D`, :ref:`SkeletonModificationStack2D`, :ref:`SkeletonProfile`, :ref:`Skin`, :ref:`Sky`, :ref:`SpriteFrames`, :ref:`StyleBox`, :ref:`SyntaxHighlighter`, :ref:`Texture`, :ref:`Theme`, :ref:`TileMapPattern`, :ref:`TileSet`, :ref:`TileSetSource`, :ref:`Translation`, :ref:`VideoStream`, :ref:`VideoStreamPlayback`, :ref:`VisualShaderNode`, :ref:`VoxelGIData`, :ref:`World2D`, :ref:`World3D`, :ref:`X509Certificate` -Base class for all resources. +Base class for serializable objects. .. rst-class:: classref-introduction-group @@ -163,7 +163,7 @@ An optional name for this resource. When defined, its value is displayed to repr - void **set_path** **(** :ref:`String` value **)** - :ref:`String` **get_path** **(** **)** -The unique path to this resource. If it has been saved to disk, the value will be its filepath. If the resource is exclusively contained within a scene, the value will be the :ref:`PackedScene`'s filepath, followed by an unique identifier. +The unique path to this resource. If it has been saved to disk, the value will be its filepath. If the resource is exclusively contained within a scene, the value will be the :ref:`PackedScene`'s filepath, followed by a unique identifier. \ **Note:** Setting this property manually may fail if a resource with the same path has already been previously loaded. If necessary, use :ref:`take_over_path`. diff --git a/classes/class_resourceimporter.rst b/classes/class_resourceimporter.rst index 7345044b4d1..ff97a6b7b59 100644 --- a/classes/class_resourceimporter.rst +++ b/classes/class_resourceimporter.rst @@ -14,14 +14,14 @@ ResourceImporter **Inherited By:** :ref:`EditorImportPlugin` -Base class for the implementation of core resource importers. +Base class for resource importers. .. rst-class:: classref-introduction-group Description ----------- -This is the base class for the resource importers implemented in core. To implement your own resource importers using editor plugins, see :ref:`EditorImportPlugin`. +This is the base class for Godot's resource importers. To implement your own resource importers using editor plugins, see :ref:`EditorImportPlugin`. .. rst-class:: classref-introduction-group diff --git a/classes/class_resourceloader.rst b/classes/class_resourceloader.rst index bd0674322b2..98461fa14d3 100644 --- a/classes/class_resourceloader.rst +++ b/classes/class_resourceloader.rst @@ -12,14 +12,14 @@ ResourceLoader **Inherits:** :ref:`Object` -Singleton used to load resource files. +A singleton for loading resource files. .. rst-class:: classref-introduction-group Description ----------- -Singleton used to load resource files from the filesystem. +A singleton used to load resource files from the filesystem. It uses the many :ref:`ResourceFormatLoader` classes registered in the engine (either built-in or from a plugin) to load files into memory and convert them to a format that can be used by the engine. diff --git a/classes/class_resourcepreloader.rst b/classes/class_resourcepreloader.rst index 6bb60162c60..6f410f39d3a 100644 --- a/classes/class_resourcepreloader.rst +++ b/classes/class_resourcepreloader.rst @@ -12,7 +12,7 @@ ResourcePreloader **Inherits:** :ref:`Node` **<** :ref:`Object` -Preloads a list of resources inside a scene. +A node used to preload sub-resources inside a scene. .. rst-class:: classref-introduction-group diff --git a/classes/class_resourcesaver.rst b/classes/class_resourcesaver.rst index 3b8b19627db..50656783a9d 100644 --- a/classes/class_resourcesaver.rst +++ b/classes/class_resourcesaver.rst @@ -12,16 +12,16 @@ ResourceSaver **Inherits:** :ref:`Object` -Singleton for saving Godot-specific resource types. +A singleton for saving :ref:`Resource`\ s to the filesystem. .. rst-class:: classref-introduction-group Description ----------- -Singleton for saving Godot-specific resource types to the filesystem. +A singleton for saving resource types to the filesystem. -It uses the many :ref:`ResourceFormatSaver` classes registered in the engine (either built-in or from a plugin) to save engine-specific resource data to text-based (e.g. ``.tres`` or ``.tscn``) or binary files (e.g. ``.res`` or ``.scn``). +It uses the many :ref:`ResourceFormatSaver` classes registered in the engine (either built-in or from a plugin) to save resource data to text-based (e.g. ``.tres`` or ``.tscn``) or binary files (e.g. ``.res`` or ``.scn``). .. rst-class:: classref-reftable-group diff --git a/classes/class_resourceuid.rst b/classes/class_resourceuid.rst index 7eb32998ab7..017cb0889a1 100644 --- a/classes/class_resourceuid.rst +++ b/classes/class_resourceuid.rst @@ -12,18 +12,16 @@ ResourceUID **Inherits:** :ref:`Object` -Singleton for managing a cache of resource UIDs within a project. +A singleton that manages the unique identifiers of all resources within a project. .. rst-class:: classref-introduction-group Description ----------- -Resources can not only be referenced using their resource paths ``res://``, but alternatively through a unique identifier specified via ``uid://``. +Resource UIDs (Unique IDentifiers) allow the engine to keep references between resources intact, even if files can renamed or moved. They can be accessed with ``uid://``. -Using UIDs allows for the engine to keep references between resources intact, even if the files get renamed or moved. - -This singleton is responsible for keeping track of all registered resource UIDs of a project, generating new UIDs and converting between the string and integer representation. +\ **ResourceUID** keeps track of all registered resource UIDs in a project, generates new UIDs, and converts between their string and integer representations. .. rst-class:: classref-reftable-group diff --git a/classes/class_richtexteffect.rst b/classes/class_richtexteffect.rst index 0f492faec7c..6a24aa8e717 100644 --- a/classes/class_richtexteffect.rst +++ b/classes/class_richtexteffect.rst @@ -12,14 +12,14 @@ RichTextEffect **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -A custom effect for use with :ref:`RichTextLabel`. +A custom effect for a :ref:`RichTextLabel`. .. rst-class:: classref-introduction-group Description ----------- -A custom effect for use with :ref:`RichTextLabel`. +A custom effect for a :ref:`RichTextLabel`. \ **Note:** For a **RichTextEffect** to be usable, a BBCode tag must be defined as a member variable called ``bbcode`` in the script. diff --git a/classes/class_richtextlabel.rst b/classes/class_richtextlabel.rst index 52cf82de64f..3f45c60168c 100644 --- a/classes/class_richtextlabel.rst +++ b/classes/class_richtextlabel.rst @@ -12,22 +12,22 @@ RichTextLabel **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Label that displays rich text. +A control for displaying text that can contain different font styles, images, and basic formatting. .. rst-class:: classref-introduction-group Description ----------- -Rich text can contain custom text, fonts, images and some basic formatting. The label manages these as an internal tag stack. It also adapts itself to given width/heights. +A control for displaying text that can contain custom fonts, images, and basic formatting. **RichTextLabel** manages these as an internal tag stack. It also adapts itself to given width/heights. \ **Note:** Assignments to :ref:`text` clear the tag stack and reconstruct it from the property's contents. Any edits made to :ref:`text` will erase previous edits made from other manual sources such as :ref:`append_text` and the ``push_*`` / :ref:`pop` methods. \ **Note:** RichTextLabel doesn't support entangled BBCode tags. For example, instead of using ``[b]bold[i]bold italic[/b]italic[/i]``, use ``[b]bold[i]bold italic[/i][/b][i]italic[/i]``. -\ **Note:** ``push_*/pop`` functions won't affect BBCode. +\ **Note:** ``push_*/pop_*`` functions won't affect BBCode. -\ **Note:** Unlike :ref:`Label`, RichTextLabel doesn't have a *property* to horizontally align text to the center. Instead, enable :ref:`bbcode_enabled` and surround the text in a ``[center]`` tag as follows: ``[center]Example[/center]``. There is currently no built-in way to vertically align text either, but this can be emulated by relying on anchors/containers and the :ref:`fit_content` property. +\ **Note:** Unlike :ref:`Label`, **RichTextLabel** doesn't have a *property* to horizontally align text to the center. Instead, enable :ref:`bbcode_enabled` and surround the text in a ``[center]`` tag as follows: ``[center]Example[/center]``. There is currently no built-in way to vertically align text either, but this can be emulated by relying on anchors/containers and the :ref:`fit_content` property. .. rst-class:: classref-introduction-group diff --git a/classes/class_rid.rst b/classes/class_rid.rst index 337316d481f..607c40960e7 100644 --- a/classes/class_rid.rst +++ b/classes/class_rid.rst @@ -10,7 +10,7 @@ RID === -Handle for a :ref:`Resource`'s unique ID. +A handle for a :ref:`Resource`'s unique identifier. .. rst-class:: classref-introduction-group diff --git a/classes/class_rigidbody2d.rst b/classes/class_rigidbody2d.rst index 374abe301dd..c4461121784 100644 --- a/classes/class_rigidbody2d.rst +++ b/classes/class_rigidbody2d.rst @@ -14,22 +14,22 @@ RigidBody2D **Inherited By:** :ref:`PhysicalBone2D` -Physics Body which is moved by 2D physics simulation. Useful for objects that have gravity and can be pushed by other objects. +A 2D physics body that is moved by a physics simulation. .. rst-class:: classref-introduction-group Description ----------- -This node implements simulated 2D physics. You do not control a RigidBody2D directly. Instead, you apply forces to it (gravity, impulses, etc.) and the physics simulation calculates the resulting movement based on its mass, friction, and other physical properties. +**RigidBody2D** implements full 2D physics. It cannot be controlled directly, instead, you must apply forces to it (gravity, impulses, etc.), and the physics simulation will calculate the resulting movement, rotation, react to collisions, and affect other physics bodies in its path. -You can switch the body's behavior using :ref:`lock_rotation`, :ref:`freeze`, and :ref:`freeze_mode`. +The body's behavior can be adjusted via :ref:`lock_rotation`, :ref:`freeze`, and :ref:`freeze_mode`. By changing various properties of the object, such as :ref:`mass`, you can control how the physics simulation acts on it. -\ **Note:** You should not change a RigidBody2D's ``position`` or ``linear_velocity`` every frame or even very often. If you need to directly affect the body's state, use :ref:`_integrate_forces`, which allows you to directly access the physics state. +A rigid body will always maintain its shape and size, even when forces are applied to it. It is useful for objects that can be interacted with in an environment, such as a tree that can be knocked over or a stack of crates that can be pushed around. -Please also keep in mind that physics bodies manage their own transform which overwrites the ones you set. So any direct or indirect transformation (including scaling of the node or its parent) will be visible in the editor only, and immediately reset at runtime. +If you need to override the default physics behavior, you can write a custom force integration function. See :ref:`custom_integrator`. -If you need to override the default physics behavior or add a transformation at runtime, you can write a custom force integration. See :ref:`custom_integrator`. +\ **Note:** Changing the 2D transform or :ref:`linear_velocity` of a **RigidBody2D** very often may lead to some unpredictable behaviors. If you need to directly affect the body, prefer :ref:`_integrate_forces` as it allows you to directly access the physics state. .. rst-class:: classref-introduction-group diff --git a/classes/class_rigidbody3d.rst b/classes/class_rigidbody3d.rst index 40b9a7cd5be..917578da3d7 100644 --- a/classes/class_rigidbody3d.rst +++ b/classes/class_rigidbody3d.rst @@ -14,22 +14,22 @@ RigidBody3D **Inherited By:** :ref:`VehicleBody3D` -Physics Body which is moved by 3D physics simulation. Useful for objects that have gravity and can be pushed by other objects. +A 3D physics body that is moved by a physics simulation. .. rst-class:: classref-introduction-group Description ----------- -This is the node that implements full 3D physics. This means that you do not control a RigidBody3D directly. Instead, you can apply forces to it (gravity, impulses, etc.), and the physics simulation will calculate the resulting movement, collision, bouncing, rotating, etc. +**RigidBody3D** implements full 3D physics. It cannot be controlled directly, instead, you must apply forces to it (gravity, impulses, etc.), and the physics simulation will calculate the resulting movement, rotation, react to collisions, and affect other physics bodies in its path. -You can switch the body's behavior using :ref:`lock_rotation`, :ref:`freeze`, and :ref:`freeze_mode`. +The body's behavior can be adjusted via :ref:`lock_rotation`, :ref:`freeze`, and :ref:`freeze_mode`. By changing various properties of the object, such as :ref:`mass`, you can control how the physics simulation acts on it. -\ **Note:** Don't change a RigidBody3D's position every frame or very often. Sporadic changes work fine, but physics runs at a different granularity (fixed Hz) than usual rendering (process callback) and maybe even in a separate thread, so changing this from a process loop may result in strange behavior. If you need to directly affect the body's state, use :ref:`_integrate_forces`, which allows you to directly access the physics state. +A rigid body will always maintain its shape and size, even when forces are applied to it. It is useful for objects that can be interacted with in an environment, such as a tree that can be knocked over or a stack of crates that can be pushed around. If you need to override the default physics behavior, you can write a custom force integration function. See :ref:`custom_integrator`. -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +\ **Note:** Changing the 3D transform or :ref:`linear_velocity` of a **RigidBody3D** very often may lead to some unpredictable behaviors. If you need to directly affect the body, prefer :ref:`_integrate_forces` as it allows you to directly access the physics state. .. rst-class:: classref-introduction-group diff --git a/classes/class_scenestate.rst b/classes/class_scenestate.rst index efbccb858dc..f93881442da 100644 --- a/classes/class_scenestate.rst +++ b/classes/class_scenestate.rst @@ -12,14 +12,14 @@ SceneState **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -A script interface to a scene file's data. +Provides access to a scene file's information. .. rst-class:: classref-introduction-group Description ----------- -Maintains a list of resources, nodes, exported, and overridden properties, and built-in scripts associated with a scene. +Maintains a list of resources, nodes, exported and overridden properties, and built-in scripts associated with a scene. They cannot be modified from a **SceneState**, only accessed. Useful for peeking into what a :ref:`PackedScene` contains without instantiating it. This class cannot be instantiated directly, it is retrieved for a given scene as the result of :ref:`PackedScene.get_state`. diff --git a/classes/class_scriptcreatedialog.rst b/classes/class_scriptcreatedialog.rst index 309943f5713..84f396767ee 100644 --- a/classes/class_scriptcreatedialog.rst +++ b/classes/class_scriptcreatedialog.rst @@ -12,7 +12,7 @@ ScriptCreateDialog **Inherits:** :ref:`ConfirmationDialog` **<** :ref:`AcceptDialog` **<** :ref:`Window` **<** :ref:`Viewport` **<** :ref:`Node` **<** :ref:`Object` -The Editor's popup dialog for creating new :ref:`Script` files. +Godot editor's popup dialog for creating new :ref:`Script` files. .. rst-class:: classref-introduction-group diff --git a/classes/class_scripteditor.rst b/classes/class_scripteditor.rst index c529f12818c..14a36a4e8be 100644 --- a/classes/class_scripteditor.rst +++ b/classes/class_scripteditor.rst @@ -19,7 +19,9 @@ Godot editor's script editor. Description ----------- -**Note:** This class shouldn't be instantiated directly. Instead, access the singleton using :ref:`EditorInterface.get_script_editor`. +Godot editor's script editor. + +\ **Note:** This class shouldn't be instantiated directly. Instead, access the singleton using :ref:`EditorInterface.get_script_editor`. .. rst-class:: classref-reftable-group diff --git a/classes/class_scripteditorbase.rst b/classes/class_scripteditorbase.rst index b8afb1d4a2d..a6d32bce577 100644 --- a/classes/class_scripteditorbase.rst +++ b/classes/class_scripteditorbase.rst @@ -19,7 +19,7 @@ Base editor for editing scripts in the :ref:`ScriptEditor`. Description ----------- -Base editor for editing scripts in the :ref:`ScriptEditor`, this does not include documentation items. +Base editor for editing scripts in the :ref:`ScriptEditor`. This does not include documentation items. .. rst-class:: classref-reftable-group diff --git a/classes/class_scrollbar.rst b/classes/class_scrollbar.rst index f457a8be0c2..67a23780953 100644 --- a/classes/class_scrollbar.rst +++ b/classes/class_scrollbar.rst @@ -14,14 +14,14 @@ ScrollBar **Inherited By:** :ref:`HScrollBar`, :ref:`VScrollBar` -Base class for scroll bars. +Abstract base class for scrollbars. .. rst-class:: classref-introduction-group Description ----------- -Scrollbars are a :ref:`Range`-based :ref:`Control`, that display a draggable area (the size of the page). Horizontal (:ref:`HScrollBar`) and Vertical (:ref:`VScrollBar`) versions are available. +Abstract base class for scrollbars, typically used to navigate through content that extends beyond the visible area of a control. Scrollbars are :ref:`Range`-based controls. .. rst-class:: classref-reftable-group diff --git a/classes/class_scrollcontainer.rst b/classes/class_scrollcontainer.rst index 896d1a5cb51..3d6eaf5656c 100644 --- a/classes/class_scrollcontainer.rst +++ b/classes/class_scrollcontainer.rst @@ -14,25 +14,21 @@ ScrollContainer **Inherited By:** :ref:`EditorInspector` -A helper node for displaying scrollable elements such as lists. +A container used to provide scrollbars to a child control when needed. .. rst-class:: classref-introduction-group Description ----------- -A ScrollContainer node meant to contain a :ref:`Control` child. - -ScrollContainers will automatically create a scrollbar child (:ref:`HScrollBar`, :ref:`VScrollBar`, or both) when needed and will only draw the Control within the ScrollContainer area. Scrollbars will automatically be drawn at the right (for vertical) or bottom (for horizontal) and will enable dragging to move the viewable Control (and its children) within the ScrollContainer. Scrollbars will also automatically resize the grabber based on the :ref:`Control.custom_minimum_size` of the Control relative to the ScrollContainer. - -Works great with a :ref:`Panel` control. You can set :ref:`Control.SIZE_EXPAND` on the children's size flags, so they will upscale to the ScrollContainer's size if it's larger (scroll is invisible for the chosen dimension). +A container used to provide a child control with scrollbars when needed. Scrollbars will automatically be drawn at the right (for vertical) or bottom (for horizontal) and will enable dragging to move the viewable Control (and its children) within the ScrollContainer. Scrollbars will also automatically resize the grabber based on the :ref:`Control.custom_minimum_size` of the Control relative to the ScrollContainer. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_segmentshape2d.rst b/classes/class_segmentshape2d.rst index 984b4fd75c1..2111fe1edb3 100644 --- a/classes/class_segmentshape2d.rst +++ b/classes/class_segmentshape2d.rst @@ -12,16 +12,14 @@ SegmentShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Segment shape resource for 2D physics. +A 2D line segment shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -2D segment shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. Consists of two points, ``a`` and ``b``. - -\ **Performance:** Being a primitive collision shape, **SegmentShape2D** is fast to check collisions against (though not as fast as :ref:`CircleShape2D`). +A 2D line segment shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape2D`. .. rst-class:: classref-reftable-group diff --git a/classes/class_semaphore.rst b/classes/class_semaphore.rst index aa951296f86..a91daee5d96 100644 --- a/classes/class_semaphore.rst +++ b/classes/class_semaphore.rst @@ -12,22 +12,22 @@ Semaphore **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -A synchronization semaphore. +A synchronization mechanism used to control access to a shared resource by :ref:`Thread`\ s. .. rst-class:: classref-introduction-group Description ----------- -A synchronization semaphore which can be used to synchronize multiple :ref:`Thread`\ s. Initialized to zero on creation. Be careful to avoid deadlocks. For a binary version, see :ref:`Mutex`. +A synchronization semaphore that can be used to synchronize multiple :ref:`Thread`\ s. Initialized to zero on creation. For a binary version, see :ref:`Mutex`. -\ **Warning:**\ +\ **Warning:** Semaphores must be used carefully to avoid deadlocks. -To guarantee that the operating system is able to perform proper cleanup (no crashes, no deadlocks), these conditions must be met: +\ **Warning:** To guarantee that the operating system is able to perform proper cleanup (no crashes, no deadlocks), these conditions must be met: -- By the time a **Semaphore**'s reference count reaches zero and therefore it is destroyed, no threads must be waiting on it. +- When a **Semaphore**'s reference count reaches zero and it is therefore destroyed, no threads must be waiting on it. -- By the time a :ref:`Thread`'s reference count reaches zero and therefore it is destroyed, it must not be waiting on any semaphore. +- When a :ref:`Thread`'s reference count reaches zero and it is therefore destroyed, it must not be waiting on any semaphore. .. rst-class:: classref-introduction-group @@ -36,6 +36,8 @@ Tutorials - :doc:`Using multiple threads <../tutorials/performance/using_multiple_threads>` +- :doc:`Thread-safe APIs <../tutorials/performance/thread_safe_apis>` + .. rst-class:: classref-reftable-group Methods diff --git a/classes/class_separationrayshape2d.rst b/classes/class_separationrayshape2d.rst index 1874487eef9..a066de816a1 100644 --- a/classes/class_separationrayshape2d.rst +++ b/classes/class_separationrayshape2d.rst @@ -12,16 +12,14 @@ SeparationRayShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Separation ray shape resource for 2D physics. +A 2D ray shape used for physics collision that tries to separate itself from any collider. .. rst-class:: classref-introduction-group Description ----------- -2D separation ray shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. A ray is not really a collision body; instead, it tries to separate itself from whatever is touching its far endpoint. It's often useful for characters. - -\ **Performance:** Being a primitive collision shape, **SeparationRayShape2D** is fast to check collisions against. +A 2D ray shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape2D`. When a **SeparationRayShape2D** collides with an object, it tries to separate itself from it by moving its endpoint to the collision point. It can for example be used for spears falling from the sky. .. rst-class:: classref-reftable-group diff --git a/classes/class_separationrayshape3d.rst b/classes/class_separationrayshape3d.rst index b31ecff06d5..5071c20dc8c 100644 --- a/classes/class_separationrayshape3d.rst +++ b/classes/class_separationrayshape3d.rst @@ -12,16 +12,14 @@ SeparationRayShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Separation ray shape resource for 3D physics. +A 3D ray shape used for physics collision that tries to separate itself from any collider. .. rst-class:: classref-introduction-group Description ----------- -3D separation ray shape to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. A ray is not really a collision body; instead, it tries to separate itself from whatever is touching its far endpoint. It's often useful for characters. - -\ **Performance:** Being a primitive collision shape, **SeparationRayShape3D** is fast to check collisions against. +A 3D ray shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape2D`. When a **SeparationRayShape3D** collides with an object, it tries to separate itself from it by moving its endpoint to the collision point. It can for example be used for spears falling from the sky. .. rst-class:: classref-reftable-group diff --git a/classes/class_separator.rst b/classes/class_separator.rst index 4031a84cd64..19265910c03 100644 --- a/classes/class_separator.rst +++ b/classes/class_separator.rst @@ -14,14 +14,14 @@ Separator **Inherited By:** :ref:`HSeparator`, :ref:`VSeparator` -Base class for separators. +Abstract base class for separators. .. rst-class:: classref-introduction-group Description ----------- -Separator is a :ref:`Control` used for separating other controls. It's purely a visual decoration. Horizontal (:ref:`HSeparator`) and Vertical (:ref:`VSeparator`) versions are available. +Abstract base class for separators, used for separating other controls. **Separator**\ s are purely visual and normally drawn as a :ref:`StyleBoxLine`. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_shape2d.rst b/classes/class_shape2d.rst index 44d87f9bdc8..ab2b622ba8a 100644 --- a/classes/class_shape2d.rst +++ b/classes/class_shape2d.rst @@ -14,14 +14,16 @@ Shape2D **Inherited By:** :ref:`CapsuleShape2D`, :ref:`CircleShape2D`, :ref:`ConcavePolygonShape2D`, :ref:`ConvexPolygonShape2D`, :ref:`RectangleShape2D`, :ref:`SegmentShape2D`, :ref:`SeparationRayShape2D`, :ref:`WorldBoundaryShape2D` -Base class for all 2D shapes. +Abstract base class for 2D shapes used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -Base class for all 2D shapes. All 2D shape types inherit from this. +Abstract base class for all 2D shapes, intended for use in physics. + +\ **Performance:** Primitive shapes, especially :ref:`CircleShape2D`, are fast to check collisions against. :ref:`ConvexPolygonShape2D` is slower, and :ref:`ConcavePolygonShape2D` is the slowest. .. rst-class:: classref-introduction-group diff --git a/classes/class_shape3d.rst b/classes/class_shape3d.rst index 3caa0b82ed3..a952f717f1f 100644 --- a/classes/class_shape3d.rst +++ b/classes/class_shape3d.rst @@ -14,14 +14,16 @@ Shape3D **Inherited By:** :ref:`BoxShape3D`, :ref:`CapsuleShape3D`, :ref:`ConcavePolygonShape3D`, :ref:`ConvexPolygonShape3D`, :ref:`CylinderShape3D`, :ref:`HeightMapShape3D`, :ref:`SeparationRayShape3D`, :ref:`SphereShape3D`, :ref:`WorldBoundaryShape3D` -Base class for all 3D shape resources. +Abstract base class for 3D shapes used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -Base class for all 3D shape resources. Nodes that inherit from this can be used as shapes for a :ref:`PhysicsBody3D` or :ref:`Area3D` objects. +Abstract base class for all 3D shapes, intended for use in physics. + +\ **Performance:** Primitive shapes, especially :ref:`SphereShape3D`, are fast to check collisions against. :ref:`ConvexPolygonShape3D` and :ref:`HeightMapShape3D` are slower, and :ref:`ConcavePolygonShape3D` is the slowest. .. rst-class:: classref-introduction-group diff --git a/classes/class_shapecast2d.rst b/classes/class_shapecast2d.rst index fb89a2f2fba..1c7dcc7cb16 100644 --- a/classes/class_shapecast2d.rst +++ b/classes/class_shapecast2d.rst @@ -12,20 +12,18 @@ ShapeCast2D **Inherits:** :ref:`Node2D` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Node for physics collision sweep and immediate overlap queries. Similar to the :ref:`RayCast2D` node. +A 2D shape that sweeps a region of space to detect :ref:`CollisionObject2D`\ s. .. rst-class:: classref-introduction-group Description ----------- -Shape casting allows to detect collision objects by sweeping the :ref:`shape` along the cast direction determined by :ref:`target_position` (useful for things like beam weapons). +Shape casting allows to detect collision objects by sweeping its :ref:`shape` along the cast direction determined by :ref:`target_position`. This is similar to :ref:`RayCast2D`, but it allows for sweeping a region of space, rather than just a straight line. **ShapeCast2D** can detect multiple collision objects. It is useful for things like wide laser beams or snapping a simple shape to a floor. -Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector2(0, 0)`` and by calling :ref:`force_shapecast_update` within the same **physics frame**. This also helps to overcome some limitations of :ref:`Area2D` when used as a continuous detection area, often requiring waiting a couple of frames before collision information is available to :ref:`Area2D` nodes, and when using the signals creates unnecessary complexity. +Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector2(0, 0)`` and by calling :ref:`force_shapecast_update` within the same physics frame. This helps to overcome some limitations of :ref:`Area2D` when used as an instantaneous detection area, as collision information isn't immediately available to it. -The node can detect multiple collision objects, but it's usually used to detect the first collision. - -\ **Note:** shape casting is more computationally expensive compared to ray casting. +\ **Note:** Shape casting is more computationally expensive than ray casting. .. rst-class:: classref-reftable-group diff --git a/classes/class_shapecast3d.rst b/classes/class_shapecast3d.rst index f1627d9f108..147b53d86ac 100644 --- a/classes/class_shapecast3d.rst +++ b/classes/class_shapecast3d.rst @@ -12,20 +12,18 @@ ShapeCast3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Node for physics collision sweep and immediate overlap queries. Similar to the :ref:`RayCast3D` node. +A 3D shape that sweeps a region of space to detect :ref:`CollisionObject3D`\ s. .. rst-class:: classref-introduction-group Description ----------- -Shape casting allows to detect collision objects by sweeping the :ref:`shape` along the cast direction determined by :ref:`target_position` (useful for things like beam weapons). +Shape casting allows to detect collision objects by sweeping its :ref:`shape` along the cast direction determined by :ref:`target_position`. This is similar to :ref:`RayCast3D`, but it allows for sweeping a region of space, rather than just a straight line. **ShapeCast3D** can detect multiple collision objects. It is useful for things like wide laser beams or snapping a simple shape to a floor. -Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector3(0, 0, 0)`` and by calling :ref:`force_shapecast_update` within the same **physics frame**. This also helps to overcome some limitations of :ref:`Area3D` when used as a continuous detection area, often requiring waiting a couple of frames before collision information is available to :ref:`Area3D` nodes, and when using the signals creates unnecessary complexity. +Immediate collision overlaps can be done with the :ref:`target_position` set to ``Vector3(0, 0, 0)`` and by calling :ref:`force_shapecast_update` within the same physics frame. This helps to overcome some limitations of :ref:`Area3D` when used as an instantaneous detection area, as collision information isn't immediately available to it. -The node can detect multiple collision objects, but it's usually used to detect the first collision. - -\ **Note:** Shape casting is more computationally expensive compared to ray casting. +\ **Note:** Shape casting is more computationally expensive than ray casting. .. rst-class:: classref-reftable-group diff --git a/classes/class_signal.rst b/classes/class_signal.rst index 6553948b39e..b31edc6f54c 100644 --- a/classes/class_signal.rst +++ b/classes/class_signal.rst @@ -10,7 +10,7 @@ Signal ====== -Built-in type representing a signal defined in an object. +A built-in type representing a signal of an :ref:`Object`. .. rst-class:: classref-introduction-group diff --git a/classes/class_skeleton3d.rst b/classes/class_skeleton3d.rst index b06260a56d8..7537eb924d5 100644 --- a/classes/class_skeleton3d.rst +++ b/classes/class_skeleton3d.rst @@ -21,9 +21,9 @@ Description **Skeleton3D** provides an interface for managing a hierarchy of bones, including pose, rest and animation (see :ref:`Animation`). It can also use ragdoll physics. -The overall transform of a bone with respect to the skeleton is determined by the following hierarchical order: rest pose, custom pose and pose. +The overall transform of a bone with respect to the skeleton is determined by bone pose. Bone rest defines the initial transform of the bone pose. -Note that "global pose" below refers to the overall transform of the bone with respect to skeleton, so it not the actual global/world transform of the bone. +Note that "global pose" below refers to the overall transform of the bone with respect to skeleton, so it is not the actual global/world transform of the bone. To setup different types of inverse kinematics, consider using :ref:`SkeletonIK3D`, or add a custom IK implementation in :ref:`Node._process` as a child node. @@ -479,7 +479,7 @@ Returns the bone index which is the parent of the bone at ``bone_idx``. If -1, t :ref:`Transform3D` **get_bone_pose** **(** :ref:`int` bone_idx **)** |const| -Returns the pose transform of the specified bone. Pose is applied on top of the custom pose, which is applied on top the rest pose. +Returns the pose transform of the specified bone. .. rst-class:: classref-item-separator diff --git a/classes/class_slider.rst b/classes/class_slider.rst index 1c6e3aa5d64..789da27bf5f 100644 --- a/classes/class_slider.rst +++ b/classes/class_slider.rst @@ -14,16 +14,14 @@ Slider **Inherited By:** :ref:`HSlider`, :ref:`VSlider` -Base class for GUI sliders. +Abstract base class for sliders. .. rst-class:: classref-introduction-group Description ----------- -Base class for GUI sliders. - -\ **Note:** The :ref:`Range.changed` and :ref:`Range.value_changed` signals are part of the :ref:`Range` class which this class inherits from. +Abstract base class for sliders, used to adjust a value by moving a grabber along a horizontal or vertical axis. Sliders are :ref:`Range`-based controls. .. rst-class:: classref-reftable-group diff --git a/classes/class_sliderjoint3d.rst b/classes/class_sliderjoint3d.rst index 17273b4b4f2..db4b179811c 100644 --- a/classes/class_sliderjoint3d.rst +++ b/classes/class_sliderjoint3d.rst @@ -12,14 +12,14 @@ SliderJoint3D **Inherits:** :ref:`Joint3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Slider between two PhysicsBodies in 3D. +A physics joint that restricts the movement of a 3D physics body along an axis relative to another physics body. .. rst-class:: classref-introduction-group Description ----------- -Slides across the X axis of the pivot object. See also :ref:`Generic6DOFJoint3D`. +A physics joint that restricts the movement of a 3D physics body along an axis relative to another physics body. For example, Body A could be a :ref:`StaticBody3D` representing a piston base, while Body B could be a :ref:`RigidBody3D` representing the piston head, moving up and down. .. rst-class:: classref-reftable-group diff --git a/classes/class_softbody3d.rst b/classes/class_softbody3d.rst index dd2a95e179f..59f3d990542 100644 --- a/classes/class_softbody3d.rst +++ b/classes/class_softbody3d.rst @@ -12,16 +12,16 @@ SoftBody3D **Inherits:** :ref:`MeshInstance3D` **<** :ref:`GeometryInstance3D` **<** :ref:`VisualInstance3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -A soft mesh physics body. +A deformable 3D physics mesh. .. rst-class:: classref-introduction-group Description ----------- -A deformable physics body. Used to create elastic or deformable objects such as cloth, rubber, or other flexible materials. +A deformable 3D physics mesh. Used to create elastic or deformable objects such as cloth, rubber, or other flexible materials. -\ **Note:** There are many known bugs in **SoftBody3D**. Therefore, it's not recommended to use them for things that can affect gameplay (such as a player character made entirely out of soft bodies). +\ **Note:** There are many known bugs in **SoftBody3D**. Therefore, it's not recommended to use them for things that can affect gameplay (such as trampolines). .. rst-class:: classref-introduction-group diff --git a/classes/class_sphereshape3d.rst b/classes/class_sphereshape3d.rst index 4ea53c86d7b..ecd9f9b89e3 100644 --- a/classes/class_sphereshape3d.rst +++ b/classes/class_sphereshape3d.rst @@ -12,16 +12,16 @@ SphereShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Sphere shape resource for 3D collisions. +A 3D sphere shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -3D sphere shape to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. This shape is useful for modeling sphere-like 3D objects. +A 3D sphere shape, intended for use in physics. Usually used to provide a shape for a :ref:`CollisionShape3D`. -\ **Performance:** Being a primitive collision shape, **SphereShape3D** is the fastest collision shape to check collisions against, as it only requires a distance check with the shape's origin. +\ **Performance:** **SphereShape3D** is fast to check collisions against. It is faster than :ref:`BoxShape3D`, :ref:`CapsuleShape3D`, and :ref:`CylinderShape3D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_spinbox.rst b/classes/class_spinbox.rst index ef3458bbb87..0b062341451 100644 --- a/classes/class_spinbox.rst +++ b/classes/class_spinbox.rst @@ -12,14 +12,14 @@ SpinBox **Inherits:** :ref:`Range` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Numerical input text field. +An input field for numbers. .. rst-class:: classref-introduction-group Description ----------- -SpinBox is a numerical input text field. It allows entering integers and floats. +**SpinBox** is a numerical input text field. It allows entering integers and floating point numbers. \ **Example:**\ diff --git a/classes/class_splitcontainer.rst b/classes/class_splitcontainer.rst index a669ac7076c..8d445357483 100644 --- a/classes/class_splitcontainer.rst +++ b/classes/class_splitcontainer.rst @@ -14,21 +14,21 @@ SplitContainer **Inherited By:** :ref:`HSplitContainer`, :ref:`VSplitContainer` -Container for splitting and adjusting. +A container that splits two child controls horizontally or vertically and provides a grabber for adjusting the split ratio. .. rst-class:: classref-introduction-group Description ----------- -Container for splitting two :ref:`Control`\ s vertically or horizontally, with a grabber that allows adjusting the split offset or ratio. +A container that accepts only two child controls, then arranges them horizontally or vertically and creates a divisor between them. The divisor can be dragged around to change the size relation between the child controls. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_springarm3d.rst b/classes/class_springarm3d.rst index 8eadd2d0650..98337e2dd4d 100644 --- a/classes/class_springarm3d.rst +++ b/classes/class_springarm3d.rst @@ -12,20 +12,14 @@ SpringArm3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -A helper node, mostly used in 3rd person cameras. +A 3D raycast that dynamically moves its children near the collision point. .. rst-class:: classref-introduction-group Description ----------- -The SpringArm3D node is a node that casts a ray (or collision shape) along its z axis and moves all its direct children to the collision point, minus a margin. - -The most common use case for this is to make a 3rd person camera that reacts to collisions in the environment. - -The SpringArm3D will either cast a ray, or if a shape is given, it will cast the shape in the direction of its z axis. - -If you use the SpringArm3D as a camera controller for your player, you might need to exclude the player's collider from the SpringArm3D's collision check. +**SpringArm3D** casts a ray or a shape along its Z axis and moves all its direct children to the collision point, with an optional margin. This is useful for 3rd person cameras that move closer to the player when inside a tight space (you may need to exclude the player's collider from the **SpringArm3D**'s collision check. .. rst-class:: classref-reftable-group diff --git a/classes/class_staticbody2d.rst b/classes/class_staticbody2d.rst index 9aff498a475..e1a7a9339e6 100644 --- a/classes/class_staticbody2d.rst +++ b/classes/class_staticbody2d.rst @@ -14,22 +14,18 @@ StaticBody2D **Inherited By:** :ref:`AnimatableBody2D` -Physics body for 2D physics which is static or moves only by script (without affecting other bodies on its path). Useful for floors and walls. +A 2D physics body that can't be moved by external forces. When moved manually, it doesn't affect other bodies in its path. .. rst-class:: classref-introduction-group Description ----------- -Static body for 2D physics. +A static 2D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, :ref:`AnimationPlayer`\ s (with :ref:`AnimationPlayer.playback_process_mode` set to ``ANIMATION_PROCESS_PHYSICS``), and :ref:`RemoteTransform2D`. -A static body is a simple body that doesn't move under physics simulation, i.e. it can't be moved by external forces or contacts but its transformation can still be updated manually by the user. It is ideal for implementing objects in the environment, such as walls or platforms. In contrast to :ref:`RigidBody2D`, it doesn't consume any CPU resources as long as they don't move. +When **StaticBody2D** is moved, it is teleported to its new position without affecting other physics bodies in its path. If this is not desired, use :ref:`AnimatableBody2D` instead. -They have extra functionalities to move and affect other bodies: - -\ **Static transform change:** Static bodies *can* be moved by animation or script. In this case, they are just teleported and don't affect other bodies on their path. Use :ref:`AnimatableBody2D` instead of **StaticBody2D** if you need a moving static body that affects other bodies on its path. - -\ **Constant velocity:** When :ref:`constant_linear_velocity` or :ref:`constant_angular_velocity` is set, static bodies don't move themselves but affect touching bodies as if they were moving. This is useful for simulating conveyor belts or conveyor wheels. +\ **StaticBody2D** is useful for completely static objects like floors and walls, as well as moving surfaces like conveyor belts and circular revolving platforms (by using :ref:`constant_linear_velocity` and :ref:`constant_angular_velocity`). .. rst-class:: classref-reftable-group diff --git a/classes/class_staticbody3d.rst b/classes/class_staticbody3d.rst index 1ab6d2d11ce..3e6ddc1734e 100644 --- a/classes/class_staticbody3d.rst +++ b/classes/class_staticbody3d.rst @@ -14,24 +14,18 @@ StaticBody3D **Inherited By:** :ref:`AnimatableBody3D` -Physics body for 3D physics which is static or moves only by script (without affecting other bodies on its path). Useful for floors and walls. +A 3D physics body that can't be moved by external forces. When moved manually, it doesn't affect other bodies in its path. .. rst-class:: classref-introduction-group Description ----------- -Static body for 3D physics. +A static 3D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, :ref:`AnimationPlayer`\ s (with :ref:`AnimationPlayer.playback_process_mode` set to ``ANIMATION_PROCESS_PHYSICS``), and :ref:`RemoteTransform3D`. -A static body is a simple body that doesn't move under physics simulation, i.e. it can't be moved by external forces or contacts but its transformation can still be updated manually by the user. It is ideal for implementing objects in the environment, such as walls or platforms. In contrast to :ref:`RigidBody3D`, it doesn't consume any CPU resources as long as they don't move. +When **StaticBody3D** is moved, it is teleported to its new position without affecting other physics bodies in its path. If this is not desired, use :ref:`AnimatableBody3D` instead. -They have extra functionalities to move and affect other bodies: - -\ **Static transform change:** Static bodies *can* be moved by animation or script. In this case, they are just teleported and don't affect other bodies on their path. Use :ref:`AnimatableBody3D` instead of **StaticBody3D** if you need a moving static body that affects other bodies on its path. - -\ **Constant velocity:** When :ref:`constant_linear_velocity` or :ref:`constant_angular_velocity` is set, static bodies don't move themselves but affect touching bodies as if they were moving. This is useful for simulating conveyor belts or conveyor wheels. - -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +\ **StaticBody3D** is useful for completely static objects like floors and walls, as well as moving surfaces like conveyor belts and circular revolving platforms (by using :ref:`constant_linear_velocity` and :ref:`constant_angular_velocity`). .. rst-class:: classref-introduction-group diff --git a/classes/class_streampeer.rst b/classes/class_streampeer.rst index b99b7a942dd..ff13e035b5f 100644 --- a/classes/class_streampeer.rst +++ b/classes/class_streampeer.rst @@ -14,14 +14,14 @@ StreamPeer **Inherited By:** :ref:`StreamPeerBuffer`, :ref:`StreamPeerExtension`, :ref:`StreamPeerGZIP`, :ref:`StreamPeerTCP`, :ref:`StreamPeerTLS` -Abstraction and base class for stream-based protocols. +Abstract base class for interacting with streams. .. rst-class:: classref-introduction-group Description ----------- -StreamPeer is an abstraction and base class for stream-based protocols (such as TCP). It provides an API for sending and receiving data through streams as raw data or strings. +StreamPeer is an abstract base class mostly used for stream-based protocols (such as TCP). It provides an API for sending and receiving data through streams as raw data or strings. \ **Note:** When exporting to Android, make sure to enable the ``INTERNET`` permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. @@ -314,7 +314,7 @@ Gets an unsigned 64-bit value from the stream. :ref:`String` **get_utf8_string** **(** :ref:`int` bytes=-1 **)** -Gets an UTF-8 string with byte-length ``bytes`` from the stream (this decodes the string sent as UTF-8). If ``bytes`` is negative (default) the length will be read from the stream using the reverse process of :ref:`put_utf8_string`. +Gets a UTF-8 string with byte-length ``bytes`` from the stream (this decodes the string sent as UTF-8). If ``bytes`` is negative (default) the length will be read from the stream using the reverse process of :ref:`put_utf8_string`. .. rst-class:: classref-item-separator @@ -515,7 +515,7 @@ void **put_utf8_string** **(** :ref:`String` value **)** Puts a zero-terminated UTF-8 string into the stream prepended by a 32 bits unsigned integer representing its size. -\ **Note:** To put an UTF-8 string without prepending its size, you can use :ref:`put_data`: +\ **Note:** To put a UTF-8 string without prepending its size, you can use :ref:`put_data`: .. tabs:: diff --git a/classes/class_streampeerbuffer.rst b/classes/class_streampeerbuffer.rst index e0749731cc3..f2e8d74e4fd 100644 --- a/classes/class_streampeerbuffer.rst +++ b/classes/class_streampeerbuffer.rst @@ -12,14 +12,14 @@ StreamPeerBuffer **Inherits:** :ref:`StreamPeer` **<** :ref:`RefCounted` **<** :ref:`Object` -Data buffer stream peer. +A stream peer used to handle binary data streams. .. rst-class:: classref-introduction-group Description ----------- -Data buffer stream peer that uses a byte array as the stream. This object can be used to handle binary data from network sessions. To handle binary data stored in files, :ref:`FileAccess` can be used directly. +A data buffer stream peer that uses a byte array as the stream. This object can be used to handle binary data from network sessions. To handle binary data stored in files, :ref:`FileAccess` can be used directly. A **StreamPeerBuffer** object keeps an internal cursor which is the offset in bytes to the start of the buffer. Get and put operations are performed at the cursor position and will move the cursor accordingly. diff --git a/classes/class_streampeergzip.rst b/classes/class_streampeergzip.rst index 87ac4dbdeb6..39954a0b24d 100644 --- a/classes/class_streampeergzip.rst +++ b/classes/class_streampeergzip.rst @@ -12,14 +12,14 @@ StreamPeerGZIP **Inherits:** :ref:`StreamPeer` **<** :ref:`RefCounted` **<** :ref:`Object` -Stream peer handling GZIP and deflate compression/decompresison. +A stream peer that handles GZIP and deflate compression/decompression. .. rst-class:: classref-introduction-group Description ----------- -This class allows to compress or decompress data using GZIP/deflate in a streaming fashion. This is particularly useful when compressing or decompressing files that has to be sent through the network without having to allocate them all in memory. +This class allows to compress or decompress data using GZIP/deflate in a streaming fashion. This is particularly useful when compressing or decompressing files that have to be sent through the network without needing to allocate them all in memory. After starting the stream via :ref:`start_compression` (or :ref:`start_decompression`), calling :ref:`StreamPeer.put_partial_data` on this stream will compress (or decompress) the data, writing it to the internal buffer. Calling :ref:`StreamPeer.get_available_bytes` will return the pending bytes in the internal buffer, and :ref:`StreamPeer.get_partial_data` will retrieve the compressed (or decompressed) bytes from it. When the stream is over, you must call :ref:`finish` to ensure the internal buffer is properly flushed (make sure to call :ref:`StreamPeer.get_available_bytes` on last time to check if more data needs to be read after that). diff --git a/classes/class_streampeertcp.rst b/classes/class_streampeertcp.rst index a7c502b171d..48d316aa891 100644 --- a/classes/class_streampeertcp.rst +++ b/classes/class_streampeertcp.rst @@ -12,14 +12,14 @@ StreamPeerTCP **Inherits:** :ref:`StreamPeer` **<** :ref:`RefCounted` **<** :ref:`Object` -TCP stream peer. +A stream peer that handles TCP connections. .. rst-class:: classref-introduction-group Description ----------- -TCP stream peer. This object can be used to connect to TCP servers, or also is returned by a TCP server. +A stream peer that handles TCP connections. This object can be used to connect to TCP servers, or also is returned by a TCP server. \ **Note:** When exporting to Android, make sure to enable the ``INTERNET`` permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. diff --git a/classes/class_streampeertls.rst b/classes/class_streampeertls.rst index ba9f6738b26..d4203174517 100644 --- a/classes/class_streampeertls.rst +++ b/classes/class_streampeertls.rst @@ -12,14 +12,14 @@ StreamPeerTLS **Inherits:** :ref:`StreamPeer` **<** :ref:`RefCounted` **<** :ref:`Object` -TLS stream peer. +A stream peer that handles TLS connections. .. rst-class:: classref-introduction-group Description ----------- -TLS stream peer. This object can be used to connect to a TLS server or accept a single TLS client connection. +A stream peer that handles TLS connections. This object can be used to connect to a TLS server or accept a single TLS client connection. \ **Note:** When exporting to Android, make sure to enable the ``INTERNET`` permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. diff --git a/classes/class_string.rst b/classes/class_string.rst index 8ecc1efa4a8..4f4491b58fa 100644 --- a/classes/class_string.rst +++ b/classes/class_string.rst @@ -10,7 +10,7 @@ String ====== -Built-in string Variant type. +A built-in type for strings. .. rst-class:: classref-introduction-group @@ -21,7 +21,7 @@ This is the built-in string Variant type (and the one used by GDScript). Strings Some string methods have corresponding variations. Variations suffixed with ``n`` (:ref:`countn`, :ref:`findn`, :ref:`replacen`, etc.) are **case-insensitive** (they make no distinction between uppercase and lowercase letters). Method variations prefixed with ``r`` (:ref:`rfind`, :ref:`rsplit`, etc.) are reversed, and start from the end of the string, instead of the beginning. -\ **Note:** In a boolean context, a string will evaluate to ``false`` if it is empty (``""``). Otherwise, a string will always evaluate to ``true``. +\ **Note:** In a boolean context, a string will evaluate to ``false`` if it is empty (``""``). Otherwise, a string will always evaluate to ``true``. The ``not`` operator cannot be used. Instead, :ref:`is_empty` should be used to check for empty strings. .. rst-class:: classref-introduction-group diff --git a/classes/class_stringname.rst b/classes/class_stringname.rst index e1630dfe864..1024e40f3bd 100644 --- a/classes/class_stringname.rst +++ b/classes/class_stringname.rst @@ -10,22 +10,22 @@ StringName ========== -An optimized string type for unique names. +A built-in type for unique strings. .. rst-class:: classref-introduction-group Description ----------- -**StringName**\ s are immutable strings designed for general-purpose representation of unique names (also called "string interning"). **StringName** ensures that only one instance of a given name exists (so two **StringName**\ s with the same value are the same object). Comparing them is much faster than with regular :ref:`String`\ s, because only the pointers are compared, not the whole strings. +**StringName**\ s are immutable strings designed for general-purpose representation of unique names (also called "string interning"). Two **StringName**\ s with the same value are the same object. Comparing them is extremely fast compared to regular :ref:`String`\ s. You will usually just pass a :ref:`String` to methods expecting a **StringName** and it will be automatically converted, but you may occasionally want to construct a **StringName** ahead of time with the **StringName** constructor or, in GDScript, the literal syntax ``&"example"``. -See also :ref:`NodePath`, which is a similar concept specifically designed to store pre-parsed node paths. +See also :ref:`NodePath`, which is a similar concept specifically designed to store pre-parsed scene tree paths. -Some string methods have corresponding variations. Variations suffixed with ``n`` (:ref:`countn`, :ref:`findn`, :ref:`replacen`, etc.) are **case-insensitive** (they make no distinction between uppercase and lowercase letters). Method variations prefixed with ``r`` (:ref:`rfind`, :ref:`rsplit`, etc.) are reversed, and start from the end of the string, instead of the beginning. +All of :ref:`String`'s methods are available in this class too. They convert the **StringName** into a string, and they also return a string. This is highly inefficient and should only be used if the string is desired. -\ **Note:** In a boolean context, a **StringName** will evaluate to ``false`` if it is empty (``StringName("")``). Otherwise, a **StringName** will always evaluate to ``true``. +\ **Note:** In a boolean context, a **StringName** will evaluate to ``false`` if it is empty (``StringName("")``). Otherwise, a **StringName** will always evaluate to ``true``. The ``not`` operator cannot be used. Instead, :ref:`is_empty` should be used to check for empty **StringName**\ s. .. rst-class:: classref-reftable-group diff --git a/classes/class_stylebox.rst b/classes/class_stylebox.rst index d18e7e5e98f..db4e43a39e6 100644 --- a/classes/class_stylebox.rst +++ b/classes/class_stylebox.rst @@ -14,16 +14,16 @@ StyleBox **Inherited By:** :ref:`StyleBoxEmpty`, :ref:`StyleBoxFlat`, :ref:`StyleBoxLine`, :ref:`StyleBoxTexture` -Base class for drawing stylized boxes for the UI. +Abstract base class for defining stylized boxes for UI elements. .. rst-class:: classref-introduction-group Description ----------- -StyleBox is :ref:`Resource` that provides an abstract base class for drawing stylized boxes for the UI. StyleBoxes are used for drawing the styles of buttons, line edit backgrounds, tree backgrounds, etc. and also for testing a transparency mask for pointer signals. If mask test fails on a StyleBox assigned as mask to a control, clicks and motion signals will go through it to the one below. +**StyleBox** is an abstract base class for drawing stylized boxes for UI elements. It is used for panels, buttons, :ref:`LineEdit` backgrounds, :ref:`Tree` backgrounds, etc. and also for testing a transparency mask for pointer signals. If mask test fails on a **StyleBox** assigned as mask to a control, clicks and motion signals will go through it to the one below. -\ **Note:** For children of :ref:`Control` that have *Theme Properties*, the ``focus`` **StyleBox** is displayed over the ``normal``, ``hover`` or ``pressed`` **StyleBox**. This makes the ``focus`` **StyleBox** more reusable across different nodes. +\ **Note:** For control nodes that have *Theme Properties*, the ``focus`` **StyleBox** is displayed over the ``normal``, ``hover`` or ``pressed`` **StyleBox**. This makes the ``focus`` **StyleBox** more reusable across different nodes. .. rst-class:: classref-reftable-group diff --git a/classes/class_styleboxempty.rst b/classes/class_styleboxempty.rst index e9eb75427b2..4ffdb57530d 100644 --- a/classes/class_styleboxempty.rst +++ b/classes/class_styleboxempty.rst @@ -12,14 +12,14 @@ StyleBoxEmpty **Inherits:** :ref:`StyleBox` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Empty stylebox (does not display anything). +An empty :ref:`StyleBox` (does not display anything). .. rst-class:: classref-introduction-group Description ----------- -Empty stylebox (really does not display anything). +An empty :ref:`StyleBox` that can be used to display nothing instead of the default style (e.g. it can "disable" ``focus`` styles). .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_styleboxflat.rst b/classes/class_styleboxflat.rst index 3e673688d8e..2bf8decb108 100644 --- a/classes/class_styleboxflat.rst +++ b/classes/class_styleboxflat.rst @@ -12,22 +12,14 @@ StyleBoxFlat **Inherits:** :ref:`StyleBox` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Customizable :ref:`StyleBox` with a given set of parameters (no texture required). +A customizable :ref:`StyleBox` that doesn't use a texture. .. rst-class:: classref-introduction-group Description ----------- -This :ref:`StyleBox` can be used to achieve all kinds of looks without the need of a texture. The following properties are customizable: - -- Color - -- Border width (individual width for each border) - -- Rounded corners (individual radius for each corner) - -- Shadow (with blur and offset) +By configuring various properties of this style box, you can achieve many common looks without the need of a texture. This includes optionally rounded borders, antialiasing, shadows, and skew. Setting corner radius to high values is allowed. As soon as corners overlap, the stylebox will switch to a relative system. diff --git a/classes/class_styleboxline.rst b/classes/class_styleboxline.rst index 3d942771a96..eeb3aef1487 100644 --- a/classes/class_styleboxline.rst +++ b/classes/class_styleboxline.rst @@ -12,14 +12,14 @@ StyleBoxLine **Inherits:** :ref:`StyleBox` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -:ref:`StyleBox` that displays a single line. +A :ref:`StyleBox` that displays a single line of a given color and thickness. .. rst-class:: classref-introduction-group Description ----------- -:ref:`StyleBox` that displays a single line of a given color and thickness. It can be used to draw things like separators. +A :ref:`StyleBox` that displays a single line of a given color and thickness. The line can be either horizontal or vertical. Useful for separators. .. rst-class:: classref-reftable-group diff --git a/classes/class_styleboxtexture.rst b/classes/class_styleboxtexture.rst index daf6929c373..e8697dbd364 100644 --- a/classes/class_styleboxtexture.rst +++ b/classes/class_styleboxtexture.rst @@ -12,14 +12,14 @@ StyleBoxTexture **Inherits:** :ref:`StyleBox` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Texture-based nine-patch :ref:`StyleBox`. +A texture-based nine-patch :ref:`StyleBox`. .. rst-class:: classref-introduction-group Description ----------- -Texture-based nine-patch :ref:`StyleBox`, in a way similar to :ref:`NinePatchRect`. This stylebox performs a 3×3 scaling of a texture, where only the center cell is fully stretched. This makes it possible to design bordered styles regardless of the stylebox's size. +A texture-based nine-patch :ref:`StyleBox`, in a way similar to :ref:`NinePatchRect`. This stylebox performs a 3×3 scaling of a texture, where only the center cell is fully stretched. This makes it possible to design bordered styles regardless of the stylebox's size. .. rst-class:: classref-reftable-group diff --git a/classes/class_subviewport.rst b/classes/class_subviewport.rst index c5a7b22169d..0977be29c90 100644 --- a/classes/class_subviewport.rst +++ b/classes/class_subviewport.rst @@ -12,14 +12,16 @@ SubViewport **Inherits:** :ref:`Viewport` **<** :ref:`Node` **<** :ref:`Object` -Creates a sub-view into the screen. +An interface to a game world that doesn't create a window or draw to the screen directly. .. rst-class:: classref-introduction-group Description ----------- -**SubViewport** is a :ref:`Viewport` that isn't a :ref:`Window`, i.e. it doesn't draw anything by itself. To display something, **SubViewport**'s :ref:`size` must be non-zero and it should be either put inside a :ref:`SubViewportContainer` or assigned to a :ref:`ViewportTexture`. +**SubViewport** Isolates a rectangular region of a scene to be displayed independently. This can be used, for example, to display UI in 3D space. + +\ **Note:** **SubViewport** is a :ref:`Viewport` that isn't a :ref:`Window`, i.e. it doesn't draw anything by itself. To display anything, **SubViewport** must have a non-zero size and be either put inside a :ref:`SubViewportContainer` or assigned to a :ref:`ViewportTexture`. .. rst-class:: classref-introduction-group diff --git a/classes/class_subviewportcontainer.rst b/classes/class_subviewportcontainer.rst index 1f0d03f1d5a..664f4b2bcf0 100644 --- a/classes/class_subviewportcontainer.rst +++ b/classes/class_subviewportcontainer.rst @@ -12,18 +12,18 @@ SubViewportContainer **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Control for holding :ref:`SubViewport`\ s. +A container used for displaying the contents of a :ref:`SubViewport`. .. rst-class:: classref-introduction-group Description ----------- -A :ref:`Container` node that holds a :ref:`SubViewport`. It uses the :ref:`SubViewport`'s size as minimum size, unless :ref:`stretch` is enabled. +A container that displays the contents of underlying :ref:`SubViewport` child nodes. It uses the combined size of the :ref:`SubViewport`\ s as minimum size, unless :ref:`stretch` is enabled. -\ **Note:** Changing a SubViewportContainer's :ref:`Control.scale` will cause its contents to appear distorted. To change its visual size without causing distortion, adjust the node's margins instead (if it's not already in a container). +\ **Note:** Changing a **SubViewportContainer**'s :ref:`Control.scale` will cause its contents to appear distorted. To change its visual size without causing distortion, adjust the node's margins instead (if it's not already in a container). -\ **Note:** The SubViewportContainer forwards mouse-enter and mouse-exit notifications to its sub-viewports. +\ **Note:** The **SubViewportContainer** forwards mouse-enter and mouse-exit notifications to its sub-viewports. .. rst-class:: classref-reftable-group diff --git a/classes/class_surfacetool.rst b/classes/class_surfacetool.rst index 4d09625b6d6..421542d7bef 100644 --- a/classes/class_surfacetool.rst +++ b/classes/class_surfacetool.rst @@ -37,7 +37,7 @@ The **SurfaceTool** is used to construct a :ref:`Mesh` by specifying var st = new SurfaceTool(); st.Begin(Mesh.PrimitiveType.Triangles); st.SetColor(new Color(1, 0, 0)); - st.SetUv(new Vector2(0, 0)); + st.SetUV(new Vector2(0, 0)); st.AddVertex(new Vector3(0, 0, 0)); @@ -611,7 +611,7 @@ void **set_smooth_group** **(** :ref:`int` index **)** Specifies the smooth group to use for the *next* vertex. If this is never called, all vertices will have the default smooth group of ``0`` and will be smoothed with adjacent vertices of the same group. To produce a mesh with flat normals, set the smooth group to ``-1``. -\ **Note:** This function actually takes an ``uint32_t``, so C# users should use ``uint32.MaxValue`` instead of ``-1`` to produce a mesh with flat normals. +\ **Note:** This function actually takes a ``uint32_t``, so C# users should use ``uint32.MaxValue`` instead of ``-1`` to produce a mesh with flat normals. .. rst-class:: classref-item-separator diff --git a/classes/class_syntaxhighlighter.rst b/classes/class_syntaxhighlighter.rst index bf034614887..d225988e073 100644 --- a/classes/class_syntaxhighlighter.rst +++ b/classes/class_syntaxhighlighter.rst @@ -14,18 +14,16 @@ SyntaxHighlighter **Inherited By:** :ref:`CodeHighlighter`, :ref:`EditorSyntaxHighlighter` -Base Syntax highlighter resource for :ref:`TextEdit`. +Base class for syntax highlighters. Provides syntax highlighting data to a :ref:`TextEdit`. .. rst-class:: classref-introduction-group Description ----------- -Base syntax highlighter resource all syntax highlighters extend from, provides syntax highlighting data to :ref:`TextEdit`. +Base class for syntax highlighters. Provides syntax highlighting data to a :ref:`TextEdit`. The associated :ref:`TextEdit` will call into the **SyntaxHighlighter** on an as-needed basis. -The associated :ref:`TextEdit` node will call into the **SyntaxHighlighter** on an as-needed basis. - -\ **Note:** Each Syntax highlighter instance should not be shared across multiple :ref:`TextEdit` nodes. +\ **Note:** A **SyntaxHighlighter** instance should not be used across multiple :ref:`TextEdit` nodes. .. rst-class:: classref-reftable-group diff --git a/classes/class_systemfont.rst b/classes/class_systemfont.rst index a39924a8e1d..84fe61aac85 100644 --- a/classes/class_systemfont.rst +++ b/classes/class_systemfont.rst @@ -12,9 +12,7 @@ SystemFont **Inherits:** :ref:`Font` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Font loaded from a system font. - -\ **Note:** This class is implemented on iOS, Linux, macOS and Windows, on other platforms it will fallback to default theme font. +A font loaded from a system font. Falls back to a default theme font if not implemented on the host OS. .. rst-class:: classref-introduction-group @@ -29,6 +27,8 @@ The returned font might be part of a font collection or be a variable font with You can create :ref:`FontVariation` of the system font for fine control over its features. +\ **Note:** This class is implemented on iOS, Linux, macOS and Windows, on other platforms it will fallback to default theme font. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_tabbar.rst b/classes/class_tabbar.rst index 999e57553a8..96f02937d23 100644 --- a/classes/class_tabbar.rst +++ b/classes/class_tabbar.rst @@ -12,14 +12,14 @@ TabBar **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Tab bar control. +A control that provides a horizontal bar with tabs. .. rst-class:: classref-introduction-group Description ----------- -Simple tabs control, similar to :ref:`TabContainer` but is only in charge of drawing tabs, not interacting with children. +A control that provides a horizontal bar with tabs. Similar to :ref:`TabContainer` but is only in charge of drawing tabs, not interacting with children. .. rst-class:: classref-reftable-group diff --git a/classes/class_tabcontainer.rst b/classes/class_tabcontainer.rst index 93ef6a925ff..0ffe1c76992 100644 --- a/classes/class_tabcontainer.rst +++ b/classes/class_tabcontainer.rst @@ -12,25 +12,23 @@ TabContainer **Inherits:** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Tabbed container. +A container that creates a tab for each child control, displaying only the active tab's control. .. rst-class:: classref-introduction-group Description ----------- -Arranges :ref:`Control` children into a tabbed view, creating a tab for each one. The active tab's corresponding :ref:`Control` has its ``visible`` property set to ``true``, and all other children's to ``false``. +Arranges child controls into a tabbed view, creating a tab for each one. The active tab's corresponding control is made visible, while all other child controls are hidden. Ignores non-control children. -Ignores non-:ref:`Control` children. - -\ **Note:** The drawing of the clickable tabs themselves is handled by this node. Adding :ref:`TabBar`\ s as children is not needed. +\ **Note:** The drawing of the clickable tabs is handled by this node; :ref:`TabBar` is not needed. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_textedit.rst b/classes/class_textedit.rst index 30d745d0f6b..9697448ecee 100644 --- a/classes/class_textedit.rst +++ b/classes/class_textedit.rst @@ -14,14 +14,14 @@ TextEdit **Inherited By:** :ref:`CodeEdit` -Multiline text editing control. +A multiline text editor. .. rst-class:: classref-introduction-group Description ----------- -TextEdit is meant for editing large, multiline text. It also has facilities for editing code, such as syntax highlighting support and multiple levels of undo/redo. +A multiline text editor. It also has limited facilities for editing code, such as syntax highlighting support. For more advanced facilities for editing code, see :ref:`CodeEdit`. \ **Note:** Most viewport, caret and edit methods contain a ``caret_index`` argument for :ref:`caret_multiple` support. The argument should be one of the following: ``-1`` for all carets, ``0`` for the main caret, or greater than ``0`` for secondary carets. diff --git a/classes/class_textline.rst b/classes/class_textline.rst index 0a6acca8214..5876466ca6c 100644 --- a/classes/class_textline.rst +++ b/classes/class_textline.rst @@ -19,7 +19,7 @@ Holds a line of text. Description ----------- -Abstraction over :ref:`TextServer` for handling single line of text. +Abstraction over :ref:`TextServer` for handling a single line of text. .. rst-class:: classref-reftable-group diff --git a/classes/class_textparagraph.rst b/classes/class_textparagraph.rst index 744fba7717a..4e70e9f294e 100644 --- a/classes/class_textparagraph.rst +++ b/classes/class_textparagraph.rst @@ -19,7 +19,7 @@ Holds a paragraph of text. Description ----------- -Abstraction over :ref:`TextServer` for handling paragraph of text. +Abstraction over :ref:`TextServer` for handling a single paragraph of text. .. rst-class:: classref-reftable-group diff --git a/classes/class_textserver.rst b/classes/class_textserver.rst index 8329e941fd7..ba217d3747f 100644 --- a/classes/class_textserver.rst +++ b/classes/class_textserver.rst @@ -14,14 +14,14 @@ TextServer **Inherited By:** :ref:`TextServerExtension` -Interface for the fonts and complex text layouts. +A server interface for font management and text rendering. .. rst-class:: classref-introduction-group Description ----------- -**TextServer** is the API backend for managing fonts, and rendering complex text. +**TextServer** is the API backend for managing fonts and rendering text. .. rst-class:: classref-reftable-group @@ -1475,7 +1475,7 @@ Method Descriptions :ref:`RID` **create_font** **(** **)** -Creates new, empty font cache entry resource. To free the resulting resource, use :ref:`free_rid` method. +Creates a new, empty font cache entry resource. To free the resulting resource, use the :ref:`free_rid` method. .. rst-class:: classref-item-separator diff --git a/classes/class_textserveradvanced.rst b/classes/class_textserveradvanced.rst index 3615e4bbdf4..476af3eabfc 100644 --- a/classes/class_textserveradvanced.rst +++ b/classes/class_textserveradvanced.rst @@ -12,7 +12,14 @@ TextServerAdvanced **Inherits:** :ref:`TextServerExtension` **<** :ref:`TextServer` **<** :ref:`RefCounted` **<** :ref:`Object` -Text Server using HarfBuzz, ICU and SIL Graphite to support BiDi, complex text layouts and contextual OpenType features. +An advanced text server with support for BiDi, complex text layout, and contextual OpenType features. Used in Godot by default. + +.. rst-class:: classref-introduction-group + +Description +----------- + +An implementation of :ref:`TextServer` that uses HarfBuzz, ICU and SIL Graphite to support BiDi, complex text layouts and contextual OpenType features. This is Godot's default primary :ref:`TextServer` interface. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_textserverextension.rst b/classes/class_textserverextension.rst index 88c2b8c4dcd..1d68dc01d38 100644 --- a/classes/class_textserverextension.rst +++ b/classes/class_textserverextension.rst @@ -14,14 +14,14 @@ TextServerExtension **Inherited By:** :ref:`TextServerAdvanced`, :ref:`TextServerDummy`, :ref:`TextServerFallback` -Base class for TextServer custom implementations (plugins). +Base class for custom :ref:`TextServer` implementations (plugins). .. rst-class:: classref-introduction-group Description ----------- -External TextServer implementations should inherit from this class. +External :ref:`TextServer` implementations should inherit from this class. .. rst-class:: classref-reftable-group diff --git a/classes/class_textserverfallback.rst b/classes/class_textserverfallback.rst index 4d6dc1cbea2..2e1c914b97c 100644 --- a/classes/class_textserverfallback.rst +++ b/classes/class_textserverfallback.rst @@ -12,7 +12,16 @@ TextServerFallback **Inherits:** :ref:`TextServerExtension` **<** :ref:`TextServer` **<** :ref:`RefCounted` **<** :ref:`Object` -Fallback implementation of the Text Server, without BiDi and complex text layout support. +A fallback implementation of Godot's text server, without support for BiDi and complex text layout. + +.. rst-class:: classref-introduction-group + +Description +----------- + +A fallback implementation of Godot's text server. This fallback is faster than :ref:`TextServerAdvanced` for processing a lot of text, but it does not support BiDi and complex text layout. + +\ **Note:** This text server is not part of official Godot binaries. If you want to use it, compile the engine with the option ``module_text_server_fb_enabled=yes``. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_textservermanager.rst b/classes/class_textservermanager.rst index 378e1fd8638..65dcdc0c514 100644 --- a/classes/class_textservermanager.rst +++ b/classes/class_textservermanager.rst @@ -12,14 +12,14 @@ TextServerManager **Inherits:** :ref:`Object` -Manager for the font and complex text layout servers. +A singleton for managing :ref:`TextServer` implementations. .. rst-class:: classref-introduction-group Description ----------- -**TextServerManager** is the API backend for loading, enumeration and switching :ref:`TextServer`\ s. +**TextServerManager** is the API backend for loading, enumerating, and switching :ref:`TextServer`\ s. \ **Note:** Switching text server at runtime is possible, but will invalidate all fonts and text buffers. Make sure to unload all controls, fonts, and themes before doing so. @@ -93,7 +93,7 @@ Method Descriptions void **add_interface** **(** :ref:`TextServer` interface **)** -Registers an :ref:`TextServer` interface. +Registers a :ref:`TextServer` interface. .. rst-class:: classref-item-separator @@ -105,7 +105,7 @@ Registers an :ref:`TextServer` interface. :ref:`TextServer` **find_interface** **(** :ref:`String` name **)** |const| -Finds an interface by its name. +Finds an interface by its ``name``. .. rst-class:: classref-item-separator @@ -141,7 +141,7 @@ Returns the number of interfaces currently registered. :ref:`Dictionary[]` **get_interfaces** **(** **)** |const| -Returns a list of available interfaces the index and name of each interface. +Returns a list of available interfaces, with the index and name of each interface. .. rst-class:: classref-item-separator @@ -165,7 +165,7 @@ Returns the primary :ref:`TextServer` interface currently in u void **remove_interface** **(** :ref:`TextServer` interface **)** -Removes interface. All fonts and shaped text caches should be freed before removing interface. +Removes an interface. All fonts and shaped text caches should be freed before removing an interface. .. rst-class:: classref-item-separator diff --git a/classes/class_texturebutton.rst b/classes/class_texturebutton.rst index 465845e925f..2c07f18d937 100644 --- a/classes/class_texturebutton.rst +++ b/classes/class_texturebutton.rst @@ -289,7 +289,7 @@ Texture to display when the mouse hovers the node. - void **set_texture_normal** **(** :ref:`Texture2D` value **)** - :ref:`Texture2D` **get_texture_normal** **(** **)** -Texture to display by default, when the node is **not** in the disabled, focused, hover or pressed state. +Texture to display by default, when the node is **not** in the disabled, hover or pressed state. This texture is still displayed in the focused state, with :ref:`texture_focused` drawn on top. .. rst-class:: classref-item-separator diff --git a/classes/class_texturerect.rst b/classes/class_texturerect.rst index ae93fb0ed06..cd450e2b32e 100644 --- a/classes/class_texturerect.rst +++ b/classes/class_texturerect.rst @@ -12,14 +12,14 @@ TextureRect **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Control for drawing textures. +A control that displays a texture. .. rst-class:: classref-introduction-group Description ----------- -Used to draw icons and sprites in a user interface. The texture's placement can be controlled with the :ref:`stretch_mode` property. It can scale, tile, or stay centered inside its bounding rectangle. +A control that displays a texture, for example an icon inside a GUI. The texture's placement can be controlled with the :ref:`stretch_mode` property. It can scale, tile, or stay centered inside its bounding rectangle. .. rst-class:: classref-introduction-group diff --git a/classes/class_theme.rst b/classes/class_theme.rst index 0e6182e14d8..d142d12b41d 100644 --- a/classes/class_theme.rst +++ b/classes/class_theme.rst @@ -12,14 +12,14 @@ Theme **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Theme resource for styling/skinning :ref:`Control`\ s and :ref:`Window`\ s. +A resource used for styling/skinning :ref:`Control`\ s and :ref:`Window`\ s. .. rst-class:: classref-introduction-group Description ----------- -A theme resource is used for styling/skinning :ref:`Control` and :ref:`Window` nodes. While individual controls can be styled using their local theme overrides (see :ref:`Control.add_theme_color_override`), theme resources allow you to store and apply the same settings between all controls sharing the same type (e.g. style all :ref:`Button`\ s the same). One theme resource can be used for the entire project, but you can also set a separate theme resource to a branch of control nodes. A theme resources assigned to a control node applies to the control itself, as well as all of its direct and indirect children (as long as a chain of controls is uninterrupted). +A resource used for styling/skinning :ref:`Control` and :ref:`Window` nodes. While individual controls can be styled using their local theme overrides (see :ref:`Control.add_theme_color_override`), theme resources allow you to store and apply the same settings across all controls sharing the same type (e.g. style all :ref:`Button`\ s the same). One theme resource can be used for the entire project, but you can also set a separate theme resource to a branch of control nodes. A theme resource assigned to a control applies to the control itself, as well as all of its direct and indirect children (as long as a chain of controls is uninterrupted). Use :ref:`ProjectSettings.gui/theme/custom` to set up a project-scope theme that will be available to every control in your project. diff --git a/classes/class_themedb.rst b/classes/class_themedb.rst index 7bc3472eae1..552dfe02f69 100644 --- a/classes/class_themedb.rst +++ b/classes/class_themedb.rst @@ -12,14 +12,14 @@ ThemeDB **Inherits:** :ref:`Object` -An engine singleton providing access to static :ref:`Theme` information, such as default and project theme, and fallback values. +A singleton that provides access to static information about :ref:`Theme` resources used by the engine and by your project. .. rst-class:: classref-introduction-group Description ----------- -This engine singleton provides access to static information about :ref:`Theme` resources used by the engine and by your projects. You can fetch the default engine theme, as well as your project configured theme. +This singleton provides access to static information about :ref:`Theme` resources used by the engine and by your projects. You can fetch the default engine theme, as well as your project configured theme. \ **ThemeDB** also contains fallback values for theme properties. diff --git a/classes/class_thread.rst b/classes/class_thread.rst index 175c80e7565..263ce3a284c 100644 --- a/classes/class_thread.rst +++ b/classes/class_thread.rst @@ -25,7 +25,7 @@ A unit of execution in a process. Can run methods on :ref:`Object` \ **Warning:**\ -To guarantee that the operating system is able to perform proper cleanup (no crashes, no deadlocks), these conditions must be met by the time a **Thread**'s reference count reaches zero and therefore it is destroyed: +To ensure proper cleanup without crashes or deadlocks, when a **Thread**'s reference count reaches zero and it is therefore destroyed, the following conditions must be met: - It must not have any :ref:`Mutex` objects locked. diff --git a/classes/class_time.rst b/classes/class_time.rst index 2119273df8e..9fc14a24988 100644 --- a/classes/class_time.rst +++ b/classes/class_time.rst @@ -12,7 +12,7 @@ Time **Inherits:** :ref:`Object` -Time singleton for working with time. +A singleton for working with time data. .. rst-class:: classref-introduction-group diff --git a/classes/class_transform2d.rst b/classes/class_transform2d.rst index 0c5a8145f4d..7fb58542d2e 100644 --- a/classes/class_transform2d.rst +++ b/classes/class_transform2d.rst @@ -10,14 +10,14 @@ Transform2D =========== -2D transformation (2×3 matrix). +A 2×3 matrix representing a 2D transformation. .. rst-class:: classref-introduction-group Description ----------- -2×3 matrix (2 rows, 3 columns) used for 2D linear transformations. It can represent transformations such as translation, rotation, or scaling. It consists of three :ref:`Vector2` values: :ref:`x`, :ref:`y`, and the :ref:`origin`. +A 2×3 matrix (2 rows, 3 columns) used for 2D linear transformations. It can represent transformations such as translation, rotation, and scaling. It consists of three :ref:`Vector2` values: :ref:`x`, :ref:`y`, and the :ref:`origin`. For more information, read the "Matrices and transforms" documentation article. diff --git a/classes/class_transform3d.rst b/classes/class_transform3d.rst index 2965cc7b00b..053b61d7b26 100644 --- a/classes/class_transform3d.rst +++ b/classes/class_transform3d.rst @@ -10,14 +10,14 @@ Transform3D =========== -3D transformation (3×4 matrix). +A 3×4 matrix representing a 3D transformation. .. rst-class:: classref-introduction-group Description ----------- -3×4 matrix (3 rows, 4 columns) used for 3D linear transformations. It can represent transformations such as translation, rotation, or scaling. It consists of a :ref:`basis` (first 3 columns) and a :ref:`Vector3` for the :ref:`origin` (last column). +A 3×4 matrix (3 rows, 4 columns) used for 3D linear transformations. It can represent transformations such as translation, rotation, and scaling. It consists of a :ref:`basis` (first 3 columns) and a :ref:`Vector3` for the :ref:`origin` (last column). For more information, read the "Matrices and transforms" documentation article. diff --git a/classes/class_translation.rst b/classes/class_translation.rst index 88574cfee27..51ebb500bd8 100644 --- a/classes/class_translation.rst +++ b/classes/class_translation.rst @@ -14,14 +14,14 @@ Translation **Inherited By:** :ref:`OptimizedTranslation` -Language Translation. +A language translation that maps a collection of strings to their individual translations. .. rst-class:: classref-introduction-group Description ----------- -Translations are resources that can be loaded and unloaded on demand. They map a string to another string. +**Translation**\ s are resources that can be loaded and unloaded on demand. They map a collection of strings to their individual translations, and they also provide convenience methods for pluralization. .. rst-class:: classref-introduction-group diff --git a/classes/class_translationserver.rst b/classes/class_translationserver.rst index dda17a771d4..e8532a9c7b0 100644 --- a/classes/class_translationserver.rst +++ b/classes/class_translationserver.rst @@ -12,14 +12,14 @@ TranslationServer **Inherits:** :ref:`Object` -Server that manages all translations. +The server responsible for language translations. .. rst-class:: classref-introduction-group Description ----------- -Server that manages all translations. Translations can be set to it and removed from it. +The server that manages all language translations. Translations can be added to or removed from it. .. rst-class:: classref-introduction-group @@ -155,7 +155,7 @@ Clears the server from all translations. :ref:`int` **compare_locales** **(** :ref:`String` locale_a, :ref:`String` locale_b **)** |const| -Compares two locales and return similarity score between ``0``\ (no match) and ``10``\ (full match). +Compares two locales and returns a similarity score between ``0`` (no match) and ``10`` (full match). .. rst-class:: classref-item-separator @@ -167,7 +167,7 @@ Compares two locales and return similarity score between ``0``\ (no match) and ` :ref:`PackedStringArray` **get_all_countries** **(** **)** |const| -Returns array of known country codes. +Returns an array of known country codes. .. rst-class:: classref-item-separator @@ -191,7 +191,7 @@ Returns array of known language codes. :ref:`PackedStringArray` **get_all_scripts** **(** **)** |const| -Returns array of known script codes. +Returns an array of known script codes. .. rst-class:: classref-item-separator @@ -203,7 +203,7 @@ Returns array of known script codes. :ref:`String` **get_country_name** **(** :ref:`String` country **)** |const| -Returns readable country name for the ``country`` code. +Returns a readable country name for the ``country`` code. .. rst-class:: classref-item-separator @@ -215,7 +215,7 @@ Returns readable country name for the ``country`` code. :ref:`String` **get_language_name** **(** :ref:`String` language **)** |const| -Returns readable language name for the ``language`` code. +Returns a readable language name for the ``language`` code. .. rst-class:: classref-item-separator @@ -265,7 +265,7 @@ Returns a locale's language and its variant (e.g. ``"en_US"`` would return ``"En :ref:`String` **get_script_name** **(** :ref:`String` script **)** |const| -Returns readable script name for the ``script`` code. +Returns a readable script name for the ``script`` code. .. rst-class:: classref-item-separator @@ -355,7 +355,7 @@ If translations have been loaded beforehand for the new locale, they will be app :ref:`String` **standardize_locale** **(** :ref:`String` locale **)** |const| -Returns ``locale`` string standardized to match known locales (e.g. ``en-US`` would be matched to ``en_US``). +Returns a ``locale`` string standardized to match known locales (e.g. ``en-US`` would be matched to ``en_US``). .. rst-class:: classref-item-separator diff --git a/classes/class_tree.rst b/classes/class_tree.rst index f61310d9fc5..1f79ac935e7 100644 --- a/classes/class_tree.rst +++ b/classes/class_tree.rst @@ -12,16 +12,16 @@ Tree **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Control to show a tree of items. +A control used to show a set of internal :ref:`TreeItem`\ s in a hierarchical structure. .. rst-class:: classref-introduction-group Description ----------- -This shows a tree of items that can be selected, expanded and collapsed. The tree can have multiple columns with custom controls like text editing, buttons and popups. It can be useful for structured displays and interactions. +A control used to show a set of internal :ref:`TreeItem`\ s in a hierarchical structure. The tree items can be selected, expanded and collapsed. The tree can have multiple columns with custom controls like :ref:`LineEdit`\ s, buttons and popups. It can be useful for structured displays and interactions. -Trees are built via code, using :ref:`TreeItem` objects to create the structure. They have a single root but multiple roots can be simulated if a dummy hidden root is added. +Trees are built via code, using :ref:`TreeItem` objects to create the structure. They have a single root, but multiple roots can be simulated with :ref:`hide_root`: .. tabs:: diff --git a/classes/class_treeitem.rst b/classes/class_treeitem.rst index 70ea745be9e..dcd799bb5ca 100644 --- a/classes/class_treeitem.rst +++ b/classes/class_treeitem.rst @@ -12,18 +12,18 @@ TreeItem **Inherits:** :ref:`Object` -Control for a single item inside a :ref:`Tree`. +An internal control for a single item inside :ref:`Tree`. .. rst-class:: classref-introduction-group Description ----------- -Control for a single item inside a :ref:`Tree`. May have child **TreeItem**\ s and be styled as well as contain buttons. +A single item of a :ref:`Tree` control. It can contain other **TreeItem**\ s as children, which allows it to create a hierarchy. It can also contain text and buttons. **TreeItem** is not a :ref:`Node`, it is internal to the :ref:`Tree`. -You can remove a **TreeItem** by using :ref:`Object.free`. +To create a **TreeItem**, use :ref:`Tree.create_item` or :ref:`create_child`. To remove a **TreeItem**, use :ref:`Object.free`. -\ **Note:** The ID values used for buttons are limited to 32 bits, not full 64 bits of :ref:`int`. This has a range of ``-2^32`` to ``2^32 - 1``, i.e. ``-2147483648`` to ``2147483647``. +\ **Note:** The ID values used for buttons are 32-bit, unlike :ref:`int` which is always 64-bit. They go from ``-2147483648`` to ``2147483647``. .. rst-class:: classref-reftable-group @@ -54,6 +54,8 @@ Methods +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`add_button` **(** :ref:`int` column, :ref:`Texture2D` button, :ref:`int` id=-1, :ref:`bool` disabled=false, :ref:`String` tooltip_text="" **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_child` **(** :ref:`TreeItem` child **)** | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`call_recursive` **(** :ref:`StringName` method, ... **)** |vararg| | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`clear_custom_bg_color` **(** :ref:`int` column **)** | @@ -390,6 +392,18 @@ Adds a button with :ref:`Texture2D` ``button`` at column ``colu ---- +.. _class_TreeItem_method_add_child: + +.. rst-class:: classref-method + +void **add_child** **(** :ref:`TreeItem` child **)** + +Adds a previously unparented **TreeItem** as a direct child of this one. The ``child`` item must not be a part of any :ref:`Tree` or parented to any **TreeItem**. See also :ref:`remove_child`. + +.. rst-class:: classref-item-separator + +---- + .. _class_TreeItem_method_call_recursive: .. rst-class:: classref-method @@ -1104,7 +1118,9 @@ Propagates this item's checked status to its children and parents for the given void **remove_child** **(** :ref:`TreeItem` child **)** -Removes the given child **TreeItem** and all its children from the :ref:`Tree`. Note that it doesn't free the item from memory, so it can be reused later. To completely remove a **TreeItem** use :ref:`Object.free`. +Removes the given child **TreeItem** and all its children from the :ref:`Tree`. Note that it doesn't free the item from memory, so it can be reused later (see :ref:`add_child`). To completely remove a **TreeItem** use :ref:`Object.free`. + +\ **Note:** If you want to move a child from one :ref:`Tree` to another, then instead of removing and adding it manually you can use :ref:`move_before` or :ref:`move_after`. .. rst-class:: classref-item-separator diff --git a/classes/class_undoredo.rst b/classes/class_undoredo.rst index 36dd14b8e0d..183fb2c6d47 100644 --- a/classes/class_undoredo.rst +++ b/classes/class_undoredo.rst @@ -12,18 +12,18 @@ UndoRedo **Inherits:** :ref:`Object` -General-purpose helper to manage undo/redo operations. +Provides a high-level interface for implementing undo and redo operations. .. rst-class:: classref-introduction-group Description ----------- -UndoRedo works by registering methods and property changes inside "actions". +UndoRedo works by registering methods and property changes inside "actions". You can create an action, then provide ways to do and undo this action using function calls and property changes, then commit the action. -Common behavior is to create an action, then add do/undo calls to functions or property changes, then committing the action. +When an action is committed, all of the ``do_*`` methods will run. If the :ref:`undo` method is used, the ``undo_*`` methods will run. If the :ref:`redo` method is used, once again, all of the ``do_*`` methods will run. -Here's an example on how to add an UndoRedo action: +Here's an example on how to add an action: .. tabs:: @@ -81,7 +81,7 @@ Here's an example on how to add an UndoRedo action: \ :ref:`create_action`, :ref:`add_do_method`, :ref:`add_undo_method`, :ref:`add_do_property`, :ref:`add_undo_property`, and :ref:`commit_action` should be called one after the other, like in the example. Not doing so could lead to crashes. -If you don't need to register a method, you can leave :ref:`add_do_method` and :ref:`add_undo_method` out; the same goes for properties. You can also register more than one method/property. +If you don't need to register a method, you can leave :ref:`add_do_method` and :ref:`add_undo_method` out; the same goes for properties. You can also register more than one method/property in the order they should run. If you are making an :ref:`EditorPlugin` and want to integrate into the editor's undo history, use :ref:`EditorUndoRedoManager` instead. diff --git a/classes/class_variant.rst b/classes/class_variant.rst index c0ee3f24ec2..368331eb9c8 100644 --- a/classes/class_variant.rst +++ b/classes/class_variant.rst @@ -38,7 +38,7 @@ In computer programming, a Variant class is a class that is designed to store a var boo = "Boo is a string!"; var ref = new RefCounted(); // var is especially useful when used together with a constructor. - // Godot also provides a Variant type that works like an union of all the Variant-compatible types. + // Godot also provides a Variant type that works like a union of all the Variant-compatible types. Variant fooVar = 2; // fooVar is dynamically an integer (stored as a `long` in the Variant type). fooVar = "Now fooVar is a string!"; fooVar = new RefCounted(); // fooVar is a GodotObject. @@ -69,8 +69,7 @@ The global :ref:`@GlobalScope.typeof` function # To get the name of the underlying Object type, you need the `get_class()` method. print("foo is a(n) %s" % foo.get_class()) # inject the class name into a formatted string. # Note also that there is not yet any way to get a script's `class_name` string easily. - # To fetch that value, you can use [member ProjectSettings.get_global_class_list]. - # Open your project.godot file to see it up close. + # To fetch that value, you can use ProjectSettings.get_global_class_list(). .. code-tab:: csharp diff --git a/classes/class_vboxcontainer.rst b/classes/class_vboxcontainer.rst index 0a351ea10ca..5d10f047feb 100644 --- a/classes/class_vboxcontainer.rst +++ b/classes/class_vboxcontainer.rst @@ -14,21 +14,21 @@ VBoxContainer **Inherited By:** :ref:`ColorPicker`, :ref:`FileSystemDock`, :ref:`ScriptEditorBase` -Vertical box container. +A container that arranges its child controls vertically. .. rst-class:: classref-introduction-group Description ----------- -Vertical box container. See :ref:`BoxContainer`. +A variant of :ref:`BoxContainer` that can only arrange its child controls vertically. Child controls are rearranged automatically when their minimum size changes. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` - `3D Voxel Demo `__ diff --git a/classes/class_vector2.rst b/classes/class_vector2.rst index b501d9c4b35..efc95f6843c 100644 --- a/classes/class_vector2.rst +++ b/classes/class_vector2.rst @@ -10,14 +10,14 @@ Vector2 ======= -Vector used for 2D math using floating point coordinates. +A 2D vector using floating point coordinates. .. rst-class:: classref-introduction-group Description ----------- -2-element structure that can be used to represent positions in 2D space or any other pair of numeric values. +A 2-element structure that can be used to represent 2D coordinates or any other pair of numeric values. It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike :ref:`float` which is always 64-bit. If double precision is needed, compile the engine with the option ``precision=double``. @@ -939,6 +939,8 @@ Returns ``true`` if the vectors are not equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`is_equal_approx` instead, which is more reliable. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1075,6 +1077,8 @@ Divides each component of the **Vector2** by the given :ref:`int`. Compares two **Vector2** vectors by first checking if the X value of the left vector is less than the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1087,6 +1091,8 @@ Compares two **Vector2** vectors by first checking if the X value of the left ve Compares two **Vector2** vectors by first checking if the X value of the left vector is less than or equal to the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1101,6 +1107,8 @@ Returns ``true`` if the vectors are exactly equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`is_equal_approx` instead, which is more reliable. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1113,6 +1121,8 @@ Returns ``true`` if the vectors are exactly equal. Compares two **Vector2** vectors by first checking if the X value of the left vector is greater than the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1125,6 +1135,8 @@ Compares two **Vector2** vectors by first checking if the X value of the left ve Compares two **Vector2** vectors by first checking if the X value of the left vector is greater than or equal to the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_vector2i.rst b/classes/class_vector2i.rst index 8808d0408a6..0016fa338bb 100644 --- a/classes/class_vector2i.rst +++ b/classes/class_vector2i.rst @@ -10,14 +10,14 @@ Vector2i ======== -Vector used for 2D math using integer coordinates. +A 2D vector using integer coordinates. .. rst-class:: classref-introduction-group Description ----------- -2-element structure that can be used to represent positions in 2D space or any other pair of numeric values. +A 2-element structure that can be used to represent 2D grid coordinates or any other pair of integers. It uses integer coordinates and is therefore preferable to :ref:`Vector2` when exact precision is required. Note that the values are limited to 32 bits, and unlike :ref:`Vector2` this cannot be configured with an engine build option. Use :ref:`int` or :ref:`PackedInt64Array` if 64-bit values are needed. diff --git a/classes/class_vector3.rst b/classes/class_vector3.rst index 2f46417f0e7..dea2d5ef2eb 100644 --- a/classes/class_vector3.rst +++ b/classes/class_vector3.rst @@ -10,14 +10,14 @@ Vector3 ======= -Vector used for 3D math using floating point coordinates. +A 3D vector using floating point coordinates. .. rst-class:: classref-introduction-group Description ----------- -3-element structure that can be used to represent positions in 3D space or any other triplet of numeric values. +A 3-element structure that can be used to represent 3D coordinates or any other triplet of numeric values. It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike :ref:`float` which is always 64-bit. If double precision is needed, compile the engine with the option ``precision=double``. @@ -1011,6 +1011,8 @@ Returns ``true`` if the vectors are not equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`is_equal_approx` instead, which is more reliable. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1171,6 +1173,8 @@ Divides each component of the **Vector3** by the given :ref:`int`. Compares two **Vector3** vectors by first checking if the X value of the left vector is less than the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, and then with the Z values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1183,6 +1187,8 @@ Compares two **Vector3** vectors by first checking if the X value of the left ve Compares two **Vector3** vectors by first checking if the X value of the left vector is less than or equal to the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, and then with the Z values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1197,6 +1203,8 @@ Returns ``true`` if the vectors are exactly equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`is_equal_approx` instead, which is more reliable. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1209,6 +1217,8 @@ Returns ``true`` if the vectors are exactly equal. Compares two **Vector3** vectors by first checking if the X value of the left vector is greater than the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, and then with the Z values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -1221,6 +1231,8 @@ Compares two **Vector3** vectors by first checking if the X value of the left ve Compares two **Vector3** vectors by first checking if the X value of the left vector is greater than or equal to the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, and then with the Z values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_vector3i.rst b/classes/class_vector3i.rst index 8b346677ba1..d4c6a586442 100644 --- a/classes/class_vector3i.rst +++ b/classes/class_vector3i.rst @@ -10,14 +10,14 @@ Vector3i ======== -Vector used for 3D math using integer coordinates. +A 3D vector using integer coordinates. .. rst-class:: classref-introduction-group Description ----------- -3-element structure that can be used to represent positions in 3D space or any other triplet of numeric values. +A 3-element structure that can be used to represent 3D grid coordinates or any other triplet of integers. It uses integer coordinates and is therefore preferable to :ref:`Vector3` when exact precision is required. Note that the values are limited to 32 bits, and unlike :ref:`Vector3` this cannot be configured with an engine build option. Use :ref:`int` or :ref:`PackedInt64Array` if 64-bit values are needed. diff --git a/classes/class_vector4.rst b/classes/class_vector4.rst index e3d2ba106c0..818cfdec675 100644 --- a/classes/class_vector4.rst +++ b/classes/class_vector4.rst @@ -10,14 +10,14 @@ Vector4 ======= -Vector used for 4D math using floating point coordinates. +A 4D vector using floating point coordinates. .. rst-class:: classref-introduction-group Description ----------- -4-element structure that can be used to represent any quadruplet of numeric values. +A 4-element structure that can be used to represent 4D coordinates or any other quadruplet of numeric values. It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike :ref:`float` which is always 64-bit. If double precision is needed, compile the engine with the option ``precision=double``. @@ -680,6 +680,8 @@ Returns ``true`` if the vectors are not equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`is_equal_approx` instead, which is more reliable. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -824,6 +826,8 @@ Divides each component of the **Vector4** by the given :ref:`int`. Compares two **Vector4** vectors by first checking if the X value of the left vector is less than the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, Z values of the two vectors, and then with the W values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -836,6 +840,8 @@ Compares two **Vector4** vectors by first checking if the X value of the left ve Compares two **Vector4** vectors by first checking if the X value of the left vector is less than or equal to the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, Z values of the two vectors, and then with the W values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -850,6 +856,8 @@ Returns ``true`` if the vectors are exactly equal. \ **Note:** Due to floating-point precision errors, consider using :ref:`is_equal_approx` instead, which is more reliable. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -862,6 +870,8 @@ Returns ``true`` if the vectors are exactly equal. Compares two **Vector4** vectors by first checking if the X value of the left vector is greater than the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, Z values of the two vectors, and then with the W values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- @@ -874,6 +884,8 @@ Compares two **Vector4** vectors by first checking if the X value of the left ve Compares two **Vector4** vectors by first checking if the X value of the left vector is greater than or equal to the X value of the ``right`` vector. If the X values are exactly equal, then it repeats this check with the Y values of the two vectors, Z values of the two vectors, and then with the W values. This operator is useful for sorting vectors. +\ **Note:** Vectors with :ref:`@GDScript.NAN` elements don't behave the same as other vectors. Therefore, the results from this operator may not be accurate if NaNs are included. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_vector4i.rst b/classes/class_vector4i.rst index 0ee3718498c..7670f6a9e17 100644 --- a/classes/class_vector4i.rst +++ b/classes/class_vector4i.rst @@ -10,17 +10,19 @@ Vector4i ======== -Vector used for 4D math using integer coordinates. +A 4D vector using integer coordinates. .. rst-class:: classref-introduction-group Description ----------- -4-element structure that can be used to represent 4D grid coordinates or sets of integers. +A 4-element structure that can be used to represent 4D grid coordinates or any other quadruplet of integers. It uses integer coordinates and is therefore preferable to :ref:`Vector4` when exact precision is required. Note that the values are limited to 32 bits, and unlike :ref:`Vector4` this cannot be configured with an engine build option. Use :ref:`int` or :ref:`PackedInt64Array` if 64-bit values are needed. +\ **Note:** In a boolean context, a Vector4i will evaluate to ``false`` if it's equal to ``Vector4i(0, 0, 0, 0)``. Otherwise, a Vector3i will always evaluate to ``true``. + .. rst-class:: classref-reftable-group Properties diff --git a/classes/class_vehiclebody3d.rst b/classes/class_vehiclebody3d.rst index 54b51cad3c7..d99baf67d2b 100644 --- a/classes/class_vehiclebody3d.rst +++ b/classes/class_vehiclebody3d.rst @@ -12,20 +12,18 @@ VehicleBody3D **Inherits:** :ref:`RigidBody3D` **<** :ref:`PhysicsBody3D` **<** :ref:`CollisionObject3D` **<** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Physics body that simulates the behavior of a car. +A 3D physics body that simulates the behavior of a car. .. rst-class:: classref-introduction-group Description ----------- -This node implements all the physics logic needed to simulate a car. It is based on the raycast vehicle system commonly found in physics engines. You will need to add a :ref:`CollisionShape3D` for the main body of your vehicle and add :ref:`VehicleWheel3D` nodes for the wheels. You should also add a :ref:`MeshInstance3D` to this node for the 3D model of your car but this model should not include meshes for the wheels. You should control the vehicle by using the :ref:`brake`, :ref:`engine_force`, and :ref:`steering` properties and not change the position or orientation of this node directly. +This physics body implements all the physics logic needed to simulate a car. It is based on the raycast vehicle system commonly found in physics engines. Aside from a :ref:`CollisionShape3D` for the main body of the vehicle, you must also add a :ref:`VehicleWheel3D` node for each wheel. You should also add a :ref:`MeshInstance3D` to this node for the 3D model of the vehicle, but this model should generally not include meshes for the wheels. You can control the vehicle by using the :ref:`brake`, :ref:`engine_force`, and :ref:`steering` properties. The position or orientation of this node shouldn't be changed directly. -\ **Note:** The origin point of your VehicleBody3D will determine the center of gravity of your vehicle so it is better to keep this low and move the :ref:`CollisionShape3D` and :ref:`MeshInstance3D` upwards. +\ **Note:** The origin point of your VehicleBody3D will determine the center of gravity of your vehicle. To make the vehicle more grounded, the origin point is usually kept low, moving the :ref:`CollisionShape3D` and :ref:`MeshInstance3D` upwards. -\ **Note:** This class has known issues and isn't designed to provide realistic 3D vehicle physics. If you want advanced vehicle physics, you will probably have to write your own physics integration using another :ref:`PhysicsBody3D` class. - -\ **Warning:** With a non-uniform scale this node will probably not function as expected. Please make sure to keep its scale uniform (i.e. the same on all axes), and change the size(s) of its collision shape(s) instead. +\ **Note:** This class has known issues and isn't designed to provide realistic 3D vehicle physics. If you want advanced vehicle physics, you may have to write your own physics integration using :ref:`CharacterBody3D` or :ref:`RigidBody3D`. .. rst-class:: classref-introduction-group diff --git a/classes/class_vehiclewheel3d.rst b/classes/class_vehiclewheel3d.rst index 149963048b0..858571efb51 100644 --- a/classes/class_vehiclewheel3d.rst +++ b/classes/class_vehiclewheel3d.rst @@ -12,16 +12,16 @@ VehicleWheel3D **Inherits:** :ref:`Node3D` **<** :ref:`Node` **<** :ref:`Object` -Physics object that simulates the behavior of a wheel. +A 3D physics body for a :ref:`VehicleBody3D` that simulates the behavior of a wheel. .. rst-class:: classref-introduction-group Description ----------- -This node needs to be used as a child node of :ref:`VehicleBody3D` and simulates the behavior of one of its wheels. This node also acts as a collider to detect if the wheel is touching a surface. +A node used as a child of a :ref:`VehicleBody3D` parent to simulate the behavior of one of its wheels. This node also acts as a collider to detect if the wheel is touching a surface. -\ **Note:** This class has known issues and isn't designed to provide realistic 3D vehicle physics. If you want advanced vehicle physics, you will probably have to write your own physics integration using another :ref:`PhysicsBody3D` class. +\ **Note:** This class has known issues and isn't designed to provide realistic 3D vehicle physics. If you want advanced vehicle physics, you may need to write your own physics integration using another :ref:`PhysicsBody3D` class. .. rst-class:: classref-introduction-group diff --git a/classes/class_vflowcontainer.rst b/classes/class_vflowcontainer.rst index 1b785aae70a..341cdc46b88 100644 --- a/classes/class_vflowcontainer.rst +++ b/classes/class_vflowcontainer.rst @@ -12,14 +12,21 @@ VFlowContainer **Inherits:** :ref:`FlowContainer` **<** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Vertical flow container. +A container that arranges its child controls vertically and wraps them around at the borders. .. rst-class:: classref-introduction-group Description ----------- -Vertical version of :ref:`FlowContainer`. +A variant of :ref:`FlowContainer` that can only arrange its child controls vertically, wrapping them around at the borders. This is similar to how text in a book wraps around when no more words can fit on a line, except vertically. + +.. rst-class:: classref-introduction-group + +Tutorials +--------- + +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_videostreamplayer.rst b/classes/class_videostreamplayer.rst index 0070e1df9ab..fde17051c82 100644 --- a/classes/class_videostreamplayer.rst +++ b/classes/class_videostreamplayer.rst @@ -12,14 +12,14 @@ VideoStreamPlayer **Inherits:** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Control for playing video streams. +A control used for video playback. .. rst-class:: classref-introduction-group Description ----------- -Control node for playing video streams using :ref:`VideoStream` resources. +A control used for playback of :ref:`VideoStream` resources. Supported video formats are `Ogg Theora `__ (``.ogv``, :ref:`VideoStreamTheora`) and any format exposed via a GDExtension plugin. diff --git a/classes/class_viewport.rst b/classes/class_viewport.rst index c82b113608f..451cf9f4891 100644 --- a/classes/class_viewport.rst +++ b/classes/class_viewport.rst @@ -14,7 +14,7 @@ Viewport **Inherited By:** :ref:`SubViewport`, :ref:`Window` -Base class for viewports. +Abstract base class for viewports. Encapsulates drawing and interaction with a game world. .. rst-class:: classref-introduction-group @@ -23,7 +23,7 @@ Description A Viewport creates a different view into the screen, or a sub-view inside another viewport. Children 2D Nodes will display on it, and children Camera3D 3D nodes will render on it too. -Optionally, a viewport can have its own 2D or 3D world, so they don't share what they draw with other viewports. +Optionally, a viewport can have its own 2D or 3D world, so it doesn't share what it draws with other viewports. Viewports can also choose to be audio listeners, so they generate positional audio depending on a 2D or 3D camera child of it. @@ -207,6 +207,8 @@ Methods +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_positional_shadow_atlas_quadrant_subdiv` **(** :ref:`int` quadrant, :ref:`PositionalShadowAtlasQuadrantSubdiv` subdiv **)** | +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`update_mouse_cursor_state` **(** **)** | + +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`warp_mouse` **(** :ref:`Vector2` position **)** | +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -2066,6 +2068,10 @@ If an earlier method marks the input as handled via :ref:`set_input_as_handled` is ``true``, the event is used for physics object picking. +\ **Note:** This method doesn't propagate input events to embedded :ref:`Window`\ s or :ref:`SubViewport`\ s. + +\ **Note:** This method is deprecated, use :ref:`push_input` instead. + .. rst-class:: classref-item-separator ---- @@ -2108,6 +2114,18 @@ Sets the number of subdivisions to use in the specified quadrant. A higher numbe ---- +.. _class_Viewport_method_update_mouse_cursor_state: + +.. rst-class:: classref-method + +void **update_mouse_cursor_state** **(** **)** + +Force instantly updating the display based on the current mouse cursor position. This includes updating the mouse cursor shape and sending necessary :ref:`Control.mouse_entered`, :ref:`CollisionObject2D.mouse_entered`, :ref:`CollisionObject3D.mouse_entered` and :ref:`Window.mouse_entered` signals and their respective ``mouse_exited`` counterparts. + +.. rst-class:: classref-item-separator + +---- + .. _class_Viewport_method_warp_mouse: .. rst-class:: classref-method diff --git a/classes/class_viewporttexture.rst b/classes/class_viewporttexture.rst index cdacc5f0684..6b25e61219e 100644 --- a/classes/class_viewporttexture.rst +++ b/classes/class_viewporttexture.rst @@ -12,18 +12,18 @@ ViewportTexture **Inherits:** :ref:`Texture2D` **<** :ref:`Texture` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Texture which displays the content of a :ref:`Viewport`. +Provides the content of a :ref:`Viewport` as a dynamic texture. .. rst-class:: classref-introduction-group Description ----------- -Displays the content of a :ref:`Viewport` node as a dynamic :ref:`Texture2D`. This can be used to mix controls, 2D, and 3D elements in the same scene. +Provides the content of a :ref:`Viewport` as a dynamic :ref:`Texture2D`. This can be used to mix controls, 2D game objects, and 3D game objects in the same scene. -To create a ViewportTexture in code, use the :ref:`Viewport.get_texture` method on the target viewport. +To create a **ViewportTexture** in code, use the :ref:`Viewport.get_texture` method on the target viewport. -\ **Note:** When local to scene, this texture uses :ref:`Resource.setup_local_to_scene` to set the proxy texture and flags in the local viewport. Local to scene viewport textures will return incorrect data until the scene root is ready (see :ref:`Node.ready`). +\ **Note:** When local to scene, this texture uses :ref:`Resource.setup_local_to_scene` to set the proxy texture and flags in the local viewport. Local to scene **ViewportTexture**\ s will return incorrect data until the scene root is ready (see :ref:`Node.ready`). .. rst-class:: classref-introduction-group @@ -70,9 +70,9 @@ Property Descriptions - void **set_viewport_path_in_scene** **(** :ref:`NodePath` value **)** - :ref:`NodePath` **get_viewport_path_in_scene** **(** **)** -The path to the :ref:`Viewport` node to display. This is relative to the scene root, not to the node which uses the texture. +The path to the :ref:`Viewport` node to display. This is relative to the scene root, not to the node that uses the texture. -\ **Note:** In the editor, it is automatically updated when the target viewport's node path changes due to renaming or moving the viewport or its ancestors. At runtime, it may not be able to automatically update due to the inability to determine the scene root. +\ **Note:** In the editor, this path is automatically updated when the target viewport or one of its ancestors is renamed or moved. At runtime, the path may not be able to automatically update due to the inability to determine the scene root. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/classes/class_visualinstance3d.rst b/classes/class_visualinstance3d.rst index ef104aa9312..df8325d75d0 100644 --- a/classes/class_visualinstance3d.rst +++ b/classes/class_visualinstance3d.rst @@ -89,6 +89,10 @@ This object will only be visible for :ref:`Camera3D`\ s whose cu For :ref:`Light3D`\ s, this can be used to control which **VisualInstance3D**\ s are affected by a specific light. For :ref:`GPUParticles3D`, this can be used to control which particles are effected by a specific attractor. For :ref:`Decal`\ s, this can be used to control which **VisualInstance3D**\ s are affected by a specific decal. +To adjust :ref:`layers` more easily using a script, use :ref:`get_layer_mask_value` and :ref:`set_layer_mask_value`. + +\ **Note:** :ref:`VoxelGI`, SDFGI and :ref:`LightmapGI` will always take all layers into account to determine what contributes to global illumination. If this is an issue, set :ref:`GeometryInstance3D.gi_mode` to :ref:`GeometryInstance3D.GI_MODE_DISABLED` for meshes and :ref:`Light3D.light_bake_mode` to :ref:`Light3D.BAKE_DISABLED` for lights to exclude them from global illumination. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_vscrollbar.rst b/classes/class_vscrollbar.rst index 97ea17a34c6..2340e763844 100644 --- a/classes/class_vscrollbar.rst +++ b/classes/class_vscrollbar.rst @@ -12,14 +12,14 @@ VScrollBar **Inherits:** :ref:`ScrollBar` **<** :ref:`Range` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Vertical scroll bar. +A vertical scrollbar that goes from top (min) to bottom (max). .. rst-class:: classref-introduction-group Description ----------- -Vertical version of :ref:`ScrollBar`, which goes from top (min) to bottom (max). +A vertical scrollbar, typically used to navigate through content that extends beyond the visible height of a control. It is a :ref:`Range`-based control and goes from top (min) to bottom (max). Note that this direction is the opposite of :ref:`VSlider`'s. .. rst-class:: classref-reftable-group diff --git a/classes/class_vseparator.rst b/classes/class_vseparator.rst index 692f6f663db..a6be372cee9 100644 --- a/classes/class_vseparator.rst +++ b/classes/class_vseparator.rst @@ -12,14 +12,14 @@ VSeparator **Inherits:** :ref:`Separator` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Vertical version of :ref:`Separator`. +A vertical line used for separating other controls. .. rst-class:: classref-introduction-group Description ----------- -Vertical version of :ref:`Separator`. Even though it looks vertical, it is used to separate objects horizontally. +A vertical separator used for separating other controls that are arranged **horizontally**. **VSeparator** is purely visual and normally drawn as a :ref:`StyleBoxLine`. .. rst-class:: classref-reftable-group diff --git a/classes/class_vslider.rst b/classes/class_vslider.rst index ed682e60acf..a5653748b2c 100644 --- a/classes/class_vslider.rst +++ b/classes/class_vslider.rst @@ -12,16 +12,14 @@ VSlider **Inherits:** :ref:`Slider` **<** :ref:`Range` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Vertical slider. +A vertical slider that goes from bottom (min) to top (max). .. rst-class:: classref-introduction-group Description ----------- -Vertical slider. See :ref:`Slider`. This one goes from bottom (min) to top (max). - -\ **Note:** The :ref:`Range.changed` and :ref:`Range.value_changed` signals are part of the :ref:`Range` class which this class inherits from. +A vertical slider, used to adjust a value by moving a grabber along a vertical axis. It is a :ref:`Range`-based control and goes from bottom (min) to top (max). Note that this direction is the opposite of :ref:`VScrollBar`'s. .. rst-class:: classref-reftable-group diff --git a/classes/class_vsplitcontainer.rst b/classes/class_vsplitcontainer.rst index 489ec3927e5..ffd4a8390b2 100644 --- a/classes/class_vsplitcontainer.rst +++ b/classes/class_vsplitcontainer.rst @@ -12,21 +12,21 @@ VSplitContainer **Inherits:** :ref:`SplitContainer` **<** :ref:`Container` **<** :ref:`Control` **<** :ref:`CanvasItem` **<** :ref:`Node` **<** :ref:`Object` -Vertical split container. +A container that splits two child controls vertically and provides a grabber for adjusting the split ratio. .. rst-class:: classref-introduction-group Description ----------- -Vertical split container. See :ref:`SplitContainer`. This goes from top to bottom. +A container that accepts only two child controls, then arranges them vertically and creates a divisor between them. The divisor can be dragged around to change the size relation between the child controls. .. rst-class:: classref-introduction-group Tutorials --------- -- :doc:`GUI containers <../tutorials/ui/gui_containers>` +- :doc:`Using Containers <../tutorials/ui/gui_containers>` .. rst-class:: classref-reftable-group diff --git a/classes/class_weakref.rst b/classes/class_weakref.rst index 517a77b7dfa..08bf9a5edc8 100644 --- a/classes/class_weakref.rst +++ b/classes/class_weakref.rst @@ -12,14 +12,14 @@ WeakRef **Inherits:** :ref:`RefCounted` **<** :ref:`Object` -Holds an :ref:`Object`, but does not contribute to the reference count if the object is a reference. +Holds an :ref:`Object`. If the object is :ref:`RefCounted`, it doesn't update the reference count. .. rst-class:: classref-introduction-group Description ----------- -A weakref can hold a :ref:`RefCounted`, without contributing to the reference counter. A weakref can be created from an :ref:`Object` using :ref:`@GlobalScope.weakref`. If this object is not a reference, weakref still works, however, it does not have any effect on the object. Weakrefs are useful in cases where multiple classes have variables that refer to each other. Without weakrefs, using these classes could lead to memory leaks, since both references keep each other from being released. Making part of the variables a weakref can prevent this cyclic dependency, and allows the references to be released. +A weakref can hold a :ref:`RefCounted` without contributing to the reference counter. A weakref can be created from an :ref:`Object` using :ref:`@GlobalScope.weakref`. If this object is not a reference, weakref still works, however, it does not have any effect on the object. Weakrefs are useful in cases where multiple classes have variables that refer to each other. Without weakrefs, using these classes could lead to memory leaks, since both references keep each other from being released. Making part of the variables a weakref can prevent this cyclic dependency, and allows the references to be released. .. rst-class:: classref-reftable-group diff --git a/classes/class_window.rst b/classes/class_window.rst index 706a2e1c604..0ec909cd8c6 100644 --- a/classes/class_window.rst +++ b/classes/class_window.rst @@ -14,7 +14,7 @@ Window **Inherited By:** :ref:`AcceptDialog`, :ref:`Popup` -Base class for all windows. +Base class for all windows, dialogs, and popups. .. rst-class:: classref-introduction-group @@ -23,7 +23,7 @@ Description A node that creates a window. The window can either be a native system window or embedded inside another **Window** (see :ref:`Viewport.gui_embed_subwindows`). -At runtime, **Window**\ s will not close automatically when requested. You need to handle it manually using :ref:`close_requested` (this applies both to clicking close button and clicking outside popup). +At runtime, **Window**\ s will not close automatically when requested. You need to handle it manually using the :ref:`close_requested` signal (this applies both to pressing the close button and clicking outside of a popup). .. rst-class:: classref-reftable-group @@ -332,7 +332,7 @@ Emitted when the **Window**'s DPI changes as a result of OS-level changes (e.g. Emitted when files are dragged from the OS file manager and dropped in the game window. The argument is a list of file paths. -Note that this method only works with non-embedded windows, i.e. the main window and **Window**-derived nodes when :ref:`Viewport.gui_embed_subwindows` is disabled in the main viewport. +Note that this method only works with native windows, i.e. the main window and **Window**-derived nodes when :ref:`Viewport.gui_embed_subwindows` is disabled in the main viewport. Example usage: @@ -553,9 +553,9 @@ The window is floating on top of all other windows. This flag is ignored for ful :ref:`Flags` **FLAG_TRANSPARENT** = ``3`` -The window background can be transparent. +The window background can be transparent. Set with :ref:`transparent`. -\ **Note:** This flag has no effect if :ref:`ProjectSettings.display/window/per_pixel_transparency/allowed` is set to ``false``. Set with :ref:`transparent`. +\ **Note:** This flag has no effect if either :ref:`ProjectSettings.display/window/per_pixel_transparency/allowed`, or the window's :ref:`Viewport.transparent_bg` is set to ``false``. .. _class_Window_constant_FLAG_NO_FOCUS: @@ -573,6 +573,8 @@ The window can't be focused. No-focus window will ignore all input, except mouse Window is part of menu or :ref:`OptionButton` dropdown. This flag can't be changed when the window is visible. An active popup window will exclusively receive all input, without stealing focus from its parent. Popup windows are automatically closed when uses click outside it, or when an application is switched. Popup window must have transient parent set (see :ref:`transient`). +\ **Note:** This flag has no effect in embedded windows (unless said window is a :ref:`Popup`). + .. _class_Window_constant_FLAG_EXTEND_TO_TITLE: .. rst-class:: classref-enumeration-constant @@ -581,7 +583,9 @@ Window is part of menu or :ref:`OptionButton` dropdown. This Window content is expanded to the full size of the window. Unlike borderless window, the frame is left intact and can be used to resize the window, title bar is transparent, but have minimize/maximize/close buttons. Set with :ref:`extend_to_title`. -\ **Note:** This flag is implemented on macOS. +\ **Note:** This flag is implemented only on macOS. + +\ **Note:** This flag has no effect in embedded windows. .. _class_Window_constant_FLAG_MOUSE_PASSTHROUGH: @@ -591,6 +595,8 @@ Window content is expanded to the full size of the window. Unlike borderless win All mouse events are passed to the underlying window of the same application. +\ **Note:** This flag has no effect in embedded windows. + .. _class_Window_constant_FLAG_MAX: .. rst-class:: classref-enumeration-constant @@ -993,6 +999,10 @@ Needs :ref:`transient` enabled to work. If ``true``, the **Window** contents is expanded to the full size of the window, window title bar is transparent. +\ **Note:** This property is implemented only on macOS. + +\ **Note:** This property only works with native windows. + .. rst-class:: classref-item-separator ---- @@ -1008,9 +1018,7 @@ If ``true``, the **Window** contents is expanded to the full size of the window, - void **set_initial_position** **(** :ref:`WindowInitialPosition` value **)** - :ref:`WindowInitialPosition` **get_initial_position** **(** **)** -.. container:: contribute - - There is currently no description for this property. Please help us by :ref:`contributing one `! +Specifies the initial type of position for the **Window**. See :ref:`WindowInitialPosition` constants. .. rst-class:: classref-item-separator @@ -1069,6 +1077,8 @@ Set's the window's current mode. \ **Note:** Fullscreen mode is not exclusive full screen on Windows and Linux. +\ **Note:** This method only works with native windows, i.e. the main window and **Window**-derived nodes when :ref:`Viewport.gui_embed_subwindows` is disabled in the main viewport. + .. rst-class:: classref-item-separator ---- @@ -1088,6 +1098,8 @@ If ``true``, all mouse events will be passed to the underlying window of the sam \ **Note:** This property is implemented on Linux (X11), macOS and Windows. +\ **Note:** This property only works with native windows. + .. rst-class:: classref-item-separator ---- @@ -1157,6 +1169,8 @@ Passing an empty array will disable passthrough support (all mouse events will b If ``true``, the **Window** will be considered a popup. Popups are sub-windows that don't show as separate windows in system's window manager's window list and will send close request when anything is clicked outside of them (unless :ref:`exclusive` is enabled). +\ **Note:** This property only works with native windows. + .. rst-class:: classref-item-separator ---- @@ -1174,7 +1188,9 @@ If ``true``, the **Window** will be considered a popup. Popups are sub-windows t The window's position in pixels. -If :ref:`ProjectSettings.display/window/subwindows/embed_subwindows` is ``false``, the position is in absolute screen coordinates. This typically applies to editor plugins. If the setting is ``false``, the window's position is in the coordinates of its parent :ref:`Viewport`. +If :ref:`ProjectSettings.display/window/subwindows/embed_subwindows` is ``false``, the position is in absolute screen coordinates. This typically applies to editor plugins. If the setting is ``true``, the window's position is in the coordinates of its parent :ref:`Viewport`. + +\ **Note:** This property only works if :ref:`initial_position` is set to :ref:`WINDOW_INITIAL_POSITION_ABSOLUTE`. .. rst-class:: classref-item-separator @@ -1244,7 +1260,7 @@ The name of a theme type variation used by this **Window** to look up its own th - void **set_title** **(** :ref:`String` value **)** - :ref:`String` **get_title** **(** **)** -The window's title. If the **Window** is non-embedded, title styles set in :ref:`Theme` will have no effect. +The window's title. If the **Window** is native, title styles set in :ref:`Theme` will have no effect. .. rst-class:: classref-item-separator @@ -1282,10 +1298,10 @@ Note that behavior might be different depending on the platform. If ``true``, the **Window**'s background can be transparent. This is best used with embedded windows. -\ **Note:** For native windows, this flag has no effect if :ref:`ProjectSettings.display/window/per_pixel_transparency/allowed` is set to ``false``. - \ **Note:** Transparency support is implemented on Linux, macOS and Windows, but availability might vary depending on GPU driver, display manager, and compositor capabilities. +\ **Note:** This property has no effect if either :ref:`ProjectSettings.display/window/per_pixel_transparency/allowed`, or the window's :ref:`Viewport.transparent_bg` is set to ``false``. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_world2d.rst b/classes/class_world2d.rst index 071d970bb9d..40c9377cd81 100644 --- a/classes/class_world2d.rst +++ b/classes/class_world2d.rst @@ -12,14 +12,14 @@ World2D **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Class that has everything pertaining to a 2D world. +A resource that holds all components of a 2D world, such as a canvas and a physics space. .. rst-class:: classref-introduction-group Description ----------- -Class that has everything pertaining to a 2D world. A physics space, a visual scenario and a sound space. 2D nodes register their resources into the current 2D world. +Class that has everything pertaining to a 2D world: A physics space, a canvas, and a sound space. 2D nodes register their resources into the current 2D world. .. rst-class:: classref-introduction-group diff --git a/classes/class_world3d.rst b/classes/class_world3d.rst index 78fb5151fab..236382b22d9 100644 --- a/classes/class_world3d.rst +++ b/classes/class_world3d.rst @@ -12,14 +12,14 @@ World3D **Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -Class that has everything pertaining to a world. +A resource that holds all components of a 3D world, such as a visual scenario and a physics space. .. rst-class:: classref-introduction-group Description ----------- -Class that has everything pertaining to a world. A physics space, a visual scenario and a sound space. Node3D nodes register their resources into the current world. +Class that has everything pertaining to a world: A physics space, a visual scenario, and a sound space. 3D nodes register their resources into the current 3D world. .. rst-class:: classref-introduction-group diff --git a/classes/class_worldboundaryshape2d.rst b/classes/class_worldboundaryshape2d.rst index 6abcb039738..d9b9794ef3b 100644 --- a/classes/class_worldboundaryshape2d.rst +++ b/classes/class_worldboundaryshape2d.rst @@ -12,16 +12,14 @@ WorldBoundaryShape2D **Inherits:** :ref:`Shape2D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -World boundary (infinite plane) shape resource for 2D physics. +A 2D world boundary (half-plane) shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -2D world boundary shape to be added as a *direct* child of a :ref:`PhysicsBody2D` or :ref:`Area2D` using a :ref:`CollisionShape2D` node. **WorldBoundaryShape2D** works like an infinite plane and will not allow any physics body to go to the negative side. Note that the :ref:`normal` matters; anything "below" the plane will collide with it. If the **WorldBoundaryShape2D** is used in a :ref:`PhysicsBody2D`, it will cause colliding objects placed "below" it to teleport "above" the plane. - -\ **Performance:** Being a primitive collision shape, **WorldBoundaryShape2D** is fast to check collisions against. +A 2D world boundary shape, intended for use in physics. **WorldBoundaryShape2D** works like an infinite straight line that forces all physics bodies to stay above it. The line's normal determines which direction is considered as "above" and in the editor, the smaller line over it represents this direction. It can for example be used for endless flat floors. .. rst-class:: classref-reftable-group diff --git a/classes/class_worldboundaryshape3d.rst b/classes/class_worldboundaryshape3d.rst index 592abcdb6e4..56ff177fbd7 100644 --- a/classes/class_worldboundaryshape3d.rst +++ b/classes/class_worldboundaryshape3d.rst @@ -12,16 +12,14 @@ WorldBoundaryShape3D **Inherits:** :ref:`Shape3D` **<** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` -World boundary (infinite plane) shape resource for 3D physics. +A 3D world boundary (half-space) shape used for physics collision. .. rst-class:: classref-introduction-group Description ----------- -3D world boundary shape to be added as a *direct* child of a :ref:`PhysicsBody3D` or :ref:`Area3D` using a :ref:`CollisionShape3D` node. **WorldBoundaryShape3D** works like an infinite plane and will not allow any physics body to go to the negative side. Note that the :ref:`Plane`'s normal matters; anything "below" the plane will collide with it. If the **WorldBoundaryShape3D** is used in a :ref:`PhysicsBody3D`, it will cause colliding objects placed "below" it to teleport "above" the plane. - -\ **Performance:** Being a primitive collision shape, **WorldBoundaryShape3D** is fast to check collisions against. +A 3D world boundary shape, intended for use in physics. **WorldBoundaryShape3D** works like an infinite plane that forces all physics bodies to stay above it. The :ref:`plane`'s normal determines which direction is considered as "above" and in the editor, the line over the plane represents this direction. It can for example be used for endless flat floors. .. rst-class:: classref-reftable-group diff --git a/classes/class_xmlparser.rst b/classes/class_xmlparser.rst index 492c4196f3f..70d611c3e5e 100644 --- a/classes/class_xmlparser.rst +++ b/classes/class_xmlparser.rst @@ -12,6 +12,8 @@ XMLParser **Inherits:** :ref:`RefCounted` **<** :ref:`Object` +Provides a low-level interface for creating parsers for XML files. + Low-level class for creating parsers for `XML `__ files. .. rst-class:: classref-introduction-group @@ -19,7 +21,7 @@ Low-level class for creating parsers for `XML `__ files. This class can serve as base to make custom XML parsers. .. rst-class:: classref-reftable-group diff --git a/classes/class_zippacker.rst b/classes/class_zippacker.rst index 314fdbac849..7ad5e75b287 100644 --- a/classes/class_zippacker.rst +++ b/classes/class_zippacker.rst @@ -76,7 +76,7 @@ enum **ZipAppend**: :ref:`ZipAppend` **APPEND_CREATE** = ``0`` - +Create a new zip archive at the given path. .. _class_ZIPPacker_constant_APPEND_CREATEAFTER: @@ -84,7 +84,7 @@ enum **ZipAppend**: :ref:`ZipAppend` **APPEND_CREATEAFTER** = ``1`` - +Append a new zip archive to the end of the already existing file at the given path. .. _class_ZIPPacker_constant_APPEND_ADDINZIP: @@ -92,7 +92,7 @@ enum **ZipAppend**: :ref:`ZipAppend` **APPEND_ADDINZIP** = ``2`` - +Add new files to the existing zip archive at the given path. .. rst-class:: classref-section-separator diff --git a/classes/index.rst b/classes/index.rst index 8062af4dcd4..b09a656fec0 100644 --- a/classes/index.rst +++ b/classes/index.rst @@ -287,6 +287,7 @@ Resources class_animationnodestatemachine class_animationnodestatemachineplayback class_animationnodestatemachinetransition + class_animationnodesub2 class_animationnodesync class_animationnodetimescale class_animationnodetimeseek From a6dbd57f96ed780cccea4e9a6aa7ee0931f0a667 Mon Sep 17 00:00:00 2001 From: Joseph K <108496936+DeathFuel@users.noreply.github.com> Date: Sun, 4 Jun 2023 02:16:42 +0200 Subject: [PATCH 50/76] Typo fix --- tutorials/rendering/jitter_stutter.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/rendering/jitter_stutter.rst b/tutorials/rendering/jitter_stutter.rst index 57386520198..fe85800e56c 100644 --- a/tutorials/rendering/jitter_stutter.rst +++ b/tutorials/rendering/jitter_stutter.rst @@ -70,7 +70,7 @@ The second is more complicated, because it is often not associated to the engine or game but the underlying operating system. Here is some information regarding stutter on different OSs. -On platforms that support disabling V-Sync, suttering can be made less +On platforms that support disabling V-Sync, stuttering can be made less noticeable by disabling V-Sync in the project settings. This will however cause tearing to appear, especially on monitors with low refresh rates. If your monitor supports it, consider enabling variable refresh rate (G-Sync/FreeSync) From 7d4f53ef287da6e9c3c1d88014353cc99b4ee468 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 3 Jun 2023 20:14:23 -0700 Subject: [PATCH 51/76] Replace references to interpolate_baked with sample_baked. It looks like this method was renamed in v4, but not fully updated in beziers_and_curves.rst. --- tutorials/math/beziers_and_curves.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/math/beziers_and_curves.rst b/tutorials/math/beziers_and_curves.rst index 7d2cf87d0eb..3811a0c4475 100644 --- a/tutorials/math/beziers_and_curves.rst +++ b/tutorials/math/beziers_and_curves.rst @@ -262,7 +262,7 @@ Traversal at constant speed, then, can be done with the following pseudo-code: func _process(delta): t += delta - position = curve.interpolate_baked(t * curve.get_baked_length(), true) + position = curve.sample_baked(t * curve.get_baked_length(), true) .. code-tab:: csharp @@ -271,7 +271,7 @@ Traversal at constant speed, then, can be done with the following pseudo-code: public override void _Process(double delta) { _t += (float)delta; - Position = curve.InterpolateBaked(_t * curve.GetBakedLength(), true); + Position = curve.SampleBaked(_t * curve.GetBakedLength(), true); } And the output will, then, move at constant speed: From d906c0b7f4a5092ba7234c2ec8daec9d40733812 Mon Sep 17 00:00:00 2001 From: Graeme Date: Mon, 5 Jun 2023 21:16:03 +0200 Subject: [PATCH 52/76] Mark cutout_animation as outdated This tutorial no longer works in Godot 4.x after the Skeletons section. https://github.com/godotengine/godot-docs/issues/7279 https://github.com/godotengine/godot-docs/issues/6388 --- tutorials/animation/cutout_animation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tutorials/animation/cutout_animation.rst b/tutorials/animation/cutout_animation.rst index 6d1d35e3e25..62587b03f61 100644 --- a/tutorials/animation/cutout_animation.rst +++ b/tutorials/animation/cutout_animation.rst @@ -1,3 +1,5 @@ +:article_outdated: True + .. _doc_cutout_animation: Cutout animation From d782a51bcae5693824f5cac6ba823ce2c7c4e4ae Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Mon, 5 Jun 2023 22:35:37 +0200 Subject: [PATCH 53/76] Document disabling ligatures and/or kerning in Using fonts This also mentions the `connected` parameter available in the `tornado`, `wave`, `shake` built-in RichTextEffects. --- tutorials/ui/bbcode_in_richtextlabel.rst | 26 +++++++++++++----- tutorials/ui/gui_using_fonts.rst | 8 ++++++ ...onts_font_variation_disable_ligatures.webp | Bin 0 -> 16916 bytes 3 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 tutorials/ui/img/using_fonts_font_variation_disable_ligatures.webp diff --git a/tutorials/ui/bbcode_in_richtextlabel.rst b/tutorials/ui/bbcode_in_richtextlabel.rst index 1b54aefaa7c..9eb1f0ed195 100644 --- a/tutorials/ui/bbcode_in_richtextlabel.rst +++ b/tutorials/ui/bbcode_in_richtextlabel.rst @@ -711,11 +711,15 @@ Wave .. image:: img/bbcode_in_richtextlabel_effect_wave.webp Wave makes the text go up and down. Its tag format is -``[wave amp=50.0 freq=5.0]{text}[/wave]``. +``[wave amp=50.0 freq=5.0 connected=1]{text}[/wave]``. ``amp`` controls how high and low the effect goes, and ``freq`` controls how fast the text goes up and down. A ``freq`` value of ``0`` will result in no -visible waves, and negative ``freq`` values won't display any waves either. +visible waves, and negative ``freq`` values won't display any waves either. If +``connected`` is ``1`` (default), glyphs with ligatures will be moved together. +If ``connected`` is ``0``, each glyph is moved individually even if they are +joined by ligatures. This can work around certain rendering issues with font +ligatures. Tornado ~~~~~~~ @@ -723,21 +727,29 @@ Tornado .. image:: img/bbcode_in_richtextlabel_effect_tornado.webp Tornao makes the text move around in a circle. Its tag format is -``[tornado radius=10.0 freq=1.0]{text}[/tornado]``. +``[tornado radius=10.0 freq=1.0 connected=1]{text}[/tornado]``. ``radius`` is the radius of the circle that controls the offset, ``freq`` is how fast the text moves in a circle. A ``freq`` value of ``0`` will pause the -animation, while negative ``freq`` will play the animation backwards. +animation, while negative ``freq`` will play the animation backwards. If +``connected`` is ``1`` (default), glyphs with ligatures will be moved together. +If ``connected`` is ``0``, each glyph is moved individually even if they are +joined by ligatures. This can work around certain rendering issues with font +ligatures. Shake ~~~~~ .. image:: img/bbcode_in_richtextlabel_effect_shake.webp -Shake makes the text shake. Its tag format is ``[shake rate=20.0 level=5]{text}[/shake]``. +Shake makes the text shake. Its tag format is +``[shake rate=20.0 level=5 connected=1]{text}[/shake]``. -``rate`` controls how fast the text shakes, ``level`` controls how far the text is -offset from the origin. +``rate`` controls how fast the text shakes, ``level`` controls how far the text +is offset from the origin. If ``connected`` is ``1`` (default), glyphs with +ligatures will be moved together. If ``connected`` is ``0``, each glyph is moved +individually even if they are joined by ligatures. This can work around certain +rendering issues with font ligatures. Fade ~~~~ diff --git a/tutorials/ui/gui_using_fonts.rst b/tutorials/ui/gui_using_fonts.rst index 7ee0f6511a9..f98a18a8f27 100644 --- a/tutorials/ui/gui_using_fonts.rst +++ b/tutorials/ui/gui_using_fonts.rst @@ -629,6 +629,14 @@ For example, here's the `Inter `__ font without the OpenType feature comparison (Inter) +You can disable ligatures and/or kerning for a specific font by adding OpenType +features, then unchecking them in the inspector: + +.. figure:: img/using_fonts_font_variation_disable_ligatures.webp + :align: center + + Disabling ligatures and kerning for a font + .. _doc_using_fonts_system_fonts: System fonts diff --git a/tutorials/ui/img/using_fonts_font_variation_disable_ligatures.webp b/tutorials/ui/img/using_fonts_font_variation_disable_ligatures.webp new file mode 100644 index 0000000000000000000000000000000000000000..cd4fe1e8c48ebf0f69f1a53a330cb66d4998139e GIT binary patch literal 16916 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 literal 0 HcmV?d00001 diff --git a/tutorials/scripting/c_sharp/img/globalclasses_exportedproperty2.webp b/tutorials/scripting/c_sharp/img/globalclasses_exportedproperty2.webp new file mode 100644 index 0000000000000000000000000000000000000000..7fcab655197d9eab9dea7cf668d292941873fa0f GIT binary patch literal 14414 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 Date: Tue, 6 Jun 2023 22:01:26 +0000 Subject: [PATCH 56/76] Remove note for looping videostreamplayer As no workarounds are necessary to seamlessly loop videos since godotengine/godot#77856 got merged. --- tutorials/animation/playing_videos.rst | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tutorials/animation/playing_videos.rst b/tutorials/animation/playing_videos.rst index e40396814bf..4f5879972e4 100644 --- a/tutorials/animation/playing_videos.rst +++ b/tutorials/animation/playing_videos.rst @@ -145,11 +145,7 @@ There are several limitations with the current implementation of video playback :ref:`Engine.time_scale`. - Looping is not supported, but you can connect a VideoStreamPlayer's :ref:`finished ` signal to a function - that plays the video again. However, this will cause a black frame to be - visible when the video restarts. This can be worked around by adding a fade to - black in the video file before the video ends, or by hiding the video for one - frame and displaying a TextureRect with a screenshot of the first frame of the - video until the video is restarted. + that plays the video again. - Streaming a video from a URL is not supported. .. _doc_playing_videos_recommended_theora_encoding_settings: @@ -205,7 +201,9 @@ The **audio quality** level (``-q:a``) must be between ``-1`` and ``10``. Qualit video quality, increasing audio quality doesn't increase the output file size nearly as much. Therefore, if you want the cleanest audio possible, you can increase this to ``9`` to get *perceptually lossless* audio. This is especially -valuable if your input file already uses lossy audio compression. See +valuable if your input file already uses lossy audio compression. Higher quality +audio does increase the CPU usage of the decoder, so it might lead to audio +dropouts in case of high system load. See `this page `__ for a table listing Ogg Vorbis audio quality presets and their respective variable bitrates. From 20bfc52fd12102becb7b6dbe9849817e1cda281b Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 7 Jun 2023 12:55:04 +0200 Subject: [PATCH 57/76] Document EMJC bitmap compression not being supported in Using fonts - Document which system fonts are used on Android when using aliases. - Mention font metrics varying across platforms when using system fonts. - Fix notice about which platforms support system fonts. --- tutorials/ui/gui_using_fonts.rst | 50 ++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/tutorials/ui/gui_using_fonts.rst b/tutorials/ui/gui_using_fonts.rst index f98a18a8f27..58c276ee798 100644 --- a/tutorials/ui/gui_using_fonts.rst +++ b/tutorials/ui/gui_using_fonts.rst @@ -297,6 +297,8 @@ The downsides of MSDF font rendering are: `Google Fonts `__, try downloading the font from the font author's official website instead. +.. _doc_using_fonts_emoji: + Using emoji ^^^^^^^^^^^ @@ -304,6 +306,9 @@ Godot has limited support for emoji fonts: - CBDT/CBLC (embedded PNGs) and SVG emoji fonts are supported. - COLR/CPAL emoji fonts (custom vector format) are **not** supported. +- EMJC bitmap image compression (used by iOS' system emoji font) is **not** supported. + This means that to support emoji on iOS, you must use a custom font that + uses SVG or PNG bitmap compression instead. For Godot to be able to display emoji, the font used (or one of its :ref:`fallbacks `) needs to include them. @@ -326,7 +331,6 @@ you get the expected result: Correct appearance after adding an emoji font to the label - To use a regular font alongside emoji, it's recommended to specify a :ref:`fallback font ` that points to the emoji font in the regular font's advanced import options. If you wish to use @@ -644,7 +648,7 @@ System fonts .. warning:: - Loading system fonts is only supported on Windows, macOS and Linux. + Loading system fonts is only supported on Windows, macOS, Linux, Android and iOS. System fonts are a different type of resource compared to imported fonts. They are never actually imported into the project, but are loaded at run-time. This @@ -656,6 +660,11 @@ has 2 benefits: issues that would occur if proprietary system fonts were distributed alongside the project. +The engine automatically uses system fonts as fallback fonts, which makes it +possible to display CJK characters and emoji without having to load a custom +font. There are some restrictions that apply though, as mentioned in the +:ref:`Using emoji ` section. + Create a SystemFont resource in the location where you desire to use the system font: .. figure:: img/using_fonts_system_font_create.webp @@ -672,19 +681,25 @@ You can either specify one or more font names explicitly (such as ``Arial``), or specify the name of a font *alias* that maps to a "standard" default font for the system: -+----------------+-----------------+----------------+-------------------------+ -| Font alias | Windows | macOS/iOS | Linux | -+================+=================+================+=========================+ -| ``sans-serif`` | Arial | Helvetica | *Handled by fontconfig* | -+----------------+-----------------+----------------+-------------------------+ -| ``serif`` | Times New Roman | Times | *Handled by fontconfig* | -+----------------+-----------------+----------------+-------------------------+ -| ``monospace`` | Courier New | Courier | *Handled by fontconfig* | -+----------------+-----------------+----------------+-------------------------+ -| ``cursive`` | Comic Sans MS | Apple Chancery | *Handled by fontconfig* | -+----------------+-----------------+----------------+-------------------------+ -| ``fantasy`` | Gabriola | Papyrus | *Handled by fontconfig* | -+----------------+-----------------+----------------+-------------------------+ +.. Android font information sourced from + ++----------------+-----------------+----------------+-------------------------+-------------------------+ +| Font alias | Windows | macOS/iOS | Linux | Android | ++================+=================+================+=========================+=========================+ +| ``sans-serif`` | Arial | Helvetica | *Handled by fontconfig* | Roboto / Noto Sans | ++----------------+-----------------+----------------+-------------------------+-------------------------+ +| ``serif`` | Times New Roman | Times | *Handled by fontconfig* | Noto Serif | ++----------------+-----------------+----------------+-------------------------+-------------------------+ +| ``monospace`` | Courier New | Courier | *Handled by fontconfig* | Droid Sans Mono | ++----------------+-----------------+----------------+-------------------------+-------------------------+ +| ``cursive`` | Comic Sans MS | Apple Chancery | *Handled by fontconfig* | Dancing Script | ++----------------+-----------------+----------------+-------------------------+-------------------------+ +| ``fantasy`` | Gabriola | Papyrus | *Handled by fontconfig* | Droid Sans Mono | ++----------------+-----------------+----------------+-------------------------+-------------------------+ + +On Android, Roboto is used for Latin/Cyrillic text and Noto Sans is used for +other languages' glyphs such as CJK. On third-party Android distributions, the +exact font selection may differ. If specifying more than one font, the first font that is found on the system will be used (from top to bottom). Font names and aliases are case-insensitive @@ -693,6 +708,11 @@ on all platforms. Like for font variations, you can save the SystemFont arrangement to a resource file to reuse it in other places. +Remember that different system fonts have different metrics, which means that +text that can fit within a rectangle on one platform may not be doing so on +another platform. Always reserve some additional space during development so +that labels can extend further if needed. + .. note:: Unlike Windows and macOS/iOS, the set of default fonts shipped on Linux From 43f94066b82e403046433e408ac3a6178b21c784 Mon Sep 17 00:00:00 2001 From: bitsawer Date: Wed, 7 Jun 2023 13:35:26 +0300 Subject: [PATCH 58/76] Update threading code examples to use new syntax --- .../performance/using_multiple_threads.rst | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/tutorials/performance/using_multiple_threads.rst b/tutorials/performance/using_multiple_threads.rst index 17fa79bf03e..8ee122ce03e 100644 --- a/tutorials/performance/using_multiple_threads.rst +++ b/tutorials/performance/using_multiple_threads.rst @@ -1,5 +1,3 @@ -:article_outdated: True - .. _doc_using_multiple_threads: Using multiple threads @@ -29,23 +27,22 @@ To create a thread, use the following code: .. tabs:: .. code-tab:: gdscript GDScript - var thread + var thread: Thread # The thread will start here. func _ready(): thread = Thread.new() - # Third argument is optional userdata, it can be any variable. - thread.start(self, "_thread_function", "Wafflecopter") + # You can bind multiple arguments to a function Callable. + thread.start(_thread_function.bind("Wafflecopter")) # Run here and exit. - # The argument is the userdata passed from start(). - # If no argument was passed, this one still needs to - # be here and it will be null. + # The argument is the bound data passed from start(). func _thread_function(userdata): # Print the userdata ("Wafflecopter") print("I'm a thread! Userdata is: ", userdata) + # Thread must be disposed (or "joined"), for portability. func _exit_tree(): thread.wait_to_finish() @@ -86,16 +83,16 @@ Here is an example of using a Mutex: .. tabs:: .. code-tab:: gdscript GDScript - var counter = 0 - var mutex - var thread + var counter := 0 + var mutex: Mutex + var thread: Thread # The thread will start here. func _ready(): mutex = Mutex.new() thread = Thread.new() - thread.start(self, "_thread_function") + thread.start(_thread_function) # Increase value, protect it with Mutex. mutex.lock() @@ -104,7 +101,7 @@ Here is an example of using a Mutex: # Increment the value from the thread, too. - func _thread_function(userdata): + func _thread_function(): mutex.lock() counter += 1 mutex.unlock() @@ -131,11 +128,11 @@ ready to be processed: .. tabs:: .. code-tab:: gdscript GDScript - var counter = 0 - var mutex - var semaphore - var thread - var exit_thread = false + var counter := 0 + var mutex: Mutex + var semaphore: Semaphore + var thread: Thread + var exit_thread := false # The thread will start here. @@ -145,10 +142,10 @@ ready to be processed: exit_thread = false thread = Thread.new() - thread.start(self, "_thread_function") + thread.start(_thread_function) - func _thread_function(userdata): + func _thread_function(): while true: semaphore.wait() # Wait until posted. From a2fd3fd38eb842d001c87339d75831d938f2fdb9 Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Tue, 6 Jun 2023 18:41:41 +0100 Subject: [PATCH 59/76] SCU (single compilation unit) build docs Add info to the buildsystem docs. --- .../introduction_to_the_buildsystem.rst | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/contributing/development/compiling/introduction_to_the_buildsystem.rst b/contributing/development/compiling/introduction_to_the_buildsystem.rst index a56a58eed59..4f7775bd446 100644 --- a/contributing/development/compiling/introduction_to_the_buildsystem.rst +++ b/contributing/development/compiling/introduction_to_the_buildsystem.rst @@ -365,6 +365,27 @@ aforementioned ``-j`` option for all future builds: $env:SCONSFLAGS="-j4" +SCU (single compilation unit) build +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Regular builds tend to be bottlenecked by including large numbers of headers +in each compilation translation unit. Primarily to speed up development (rather +than for production builds), Godot offers a "single compilation unit" build +(aka "Unity / Jumbo" build). + +For the folders accelerated by this option, multiple ``.cpp`` files are +compiled in each translation unit, so headers can be shared between multiple +files, which can dramatically decrease build times. + +To make a SCU build, use the ``scu_build=yes`` SCons option. + +.. note:: When developing a Pull Request using SCU builds, be sure to make a + regular build prior to submitting the PR. This is because SCU builds + by nature include headers from earlier ``.cpp`` files in the + translation unit, therefore won't catch all the includes you will + need in a regular build. The CI will catch these errors but it will + usually be faster to catch them on a local build on your machine. + Export templates ---------------- From fc62754ffd9d7305b8cc6a3cff66c2a93f3b0d49 Mon Sep 17 00:00:00 2001 From: Matt Chalabian <70189609+mattchala@users.noreply.github.com> Date: Fri, 9 Jun 2023 09:12:50 -0700 Subject: [PATCH 60/76] Added note near top of license compliance section regarding contribution. (#7484) Co-authored-by: Yuri Sizov <11782833+YuriSizov@users.noreply.github.com> Co-authored-by: Max Hilbrunner --- about/complying_with_licenses.rst | 6 ++++++ .../best_practices_for_engine_contributors.rst | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/about/complying_with_licenses.rst b/about/complying_with_licenses.rst index af180d82d89..0a013277f66 100644 --- a/about/complying_with_licenses.rst +++ b/about/complying_with_licenses.rst @@ -16,6 +16,12 @@ distribute the software (and derivative projects, including games made with it). Your game or project can have a different license, but it still needs to comply with the original one. +.. note:: + + This section covers compliance with licenses from a user perspective. + If you are interested in licence compliance as a contributor, you can find + guidelines :ref:`here `. + .. warning:: In your project's credits screen, remember to also list third-party notices diff --git a/contributing/development/best_practices_for_engine_contributors.rst b/contributing/development/best_practices_for_engine_contributors.rst index 48f730dad48..87fdf14a000 100644 --- a/contributing/development/best_practices_for_engine_contributors.rst +++ b/contributing/development/best_practices_for_engine_contributors.rst @@ -227,14 +227,16 @@ link libraries dynamically. Instead, we bundle them in our source tree. .. image:: img/best_practices8.png As a result, we are very picky with what goes in, and we tend to prefer smaller -libraries (in fact, single header ones are our favorite). Only in cases where -there is no other choice we end up bundling something larger. +libraries (single header ones are our favorite). We will only bundle something +larger if there is no other choice. -Also, libraries must use a permissive enough license to be included into Godot. +.. _doc_best_practices_for_engine_contributors_license_compliance: + +Libraries must use a permissive enough license to be included into Godot. Some examples of acceptable licenses are Apache 2.0, BSD, MIT, ISC, and MPL 2.0. In particular, we cannot accept libraries licensed under the GPL or LGPL since these licenses effectively disallow static linking in proprietary software (which Godot is distributed as in most exported projects). This requirement also applies to the editor, since we may want to run it on iOS in the long term. -Since iOS doesn't support dynamic linking, static linking the only option on +Since iOS doesn't support dynamic linking, static linking is the only option on that platform. From 7961a180872d094a622b4668cc9f619e38115b95 Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 9 Jun 2023 20:30:04 +0200 Subject: [PATCH 61/76] Fixes typos in GDExtension tutorial --- tutorials/scripting/gdextension/gdextension_cpp_example.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/scripting/gdextension/gdextension_cpp_example.rst b/tutorials/scripting/gdextension/gdextension_cpp_example.rst index 54ef0f55b9c..5ea4aa4980a 100644 --- a/tutorials/scripting/gdextension/gdextension_cpp_example.rst +++ b/tutorials/scripting/gdextension/gdextension_cpp_example.rst @@ -499,7 +499,7 @@ code: double speed; ... void _process(double delta) override; - void set_speed(double p_speed); + void set_speed(const double p_speed); double get_speed() const; ... @@ -515,7 +515,7 @@ showing the methods that have changed so don't remove anything we're omitting: ClassDB::add_property("GDExample", PropertyInfo(Variant::FLOAT, "speed", PROPERTY_HINT_RANGE, "0,20,0.01"), "set_speed", "get_speed"); } - void GDExample::GDExample() { + GDExample::GDExample() { time_passed = 0.0; amplitude = 10.0; speed = 1.0; @@ -534,7 +534,7 @@ showing the methods that have changed so don't remove anything we're omitting: ... - void GDExample::set_speed(double p_speed) { + void GDExample::set_speed(const double p_speed) { speed = p_speed; } From 9704d2928eea7e0131e47430f9c017daacf7d2af Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 9 Jun 2023 20:44:49 +0200 Subject: [PATCH 62/76] Set godot-cpp branch to 4.0 in GDExtension tutorial --- tutorials/scripting/gdextension/gdextension_cpp_example.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/scripting/gdextension/gdextension_cpp_example.rst b/tutorials/scripting/gdextension/gdextension_cpp_example.rst index 54ef0f55b9c..517a9ec06c0 100644 --- a/tutorials/scripting/gdextension/gdextension_cpp_example.rst +++ b/tutorials/scripting/gdextension/gdextension_cpp_example.rst @@ -58,7 +58,7 @@ Alternatively, you can also clone it to the project folder: mkdir gdextension_cpp_example cd gdextension_cpp_example - git clone -b master https://github.com/godotengine/godot-cpp + git clone -b 4.0 https://github.com/godotengine/godot-cpp .. note:: From 82b2845f66b6f8d66212ec11ca8bffc5ca7f0248 Mon Sep 17 00:00:00 2001 From: Godot Organization Date: Sat, 10 Jun 2023 03:19:18 +0000 Subject: [PATCH 63/76] classref: Sync with current master branch (9723077) --- classes/class_animatedtexture.rst | 4 +- classes/class_astargrid2d.rst | 2 +- classes/class_codeedit.rst | 284 ++++++++++-------- classes/class_control.rst | 4 +- classes/class_editorexportplatformandroid.rst | 8 +- classes/class_editorexportplatformios.rst | 50 +-- classes/class_editorexportplatformmacos.rst | 2 +- classes/class_editorexportplatformwindows.rst | 4 +- classes/class_editorsettings.rst | 16 + classes/class_gdextension.rst | 24 +- classes/class_gltfphysicsbody.rst | 34 +-- classes/class_gltfskeleton.rst | 8 +- classes/class_httpclient.rst | 4 +- classes/class_label.rst | 19 ++ classes/class_navigationagent2d.rst | 12 +- classes/class_navigationagent3d.rst | 16 +- classes/class_node.rst | 6 +- classes/class_physicsserver2d.rst | 2 +- classes/class_projectsettings.rst | 10 +- classes/class_renderingdevice.rst | 12 +- classes/class_renderingserver.rst | 4 +- classes/class_scriptlanguageextension.rst | 2 +- classes/class_skeleton3d.rst | 2 + classes/class_skeletonik3d.rst | 2 + classes/class_surfacetool.rst | 2 +- classes/class_thread.rst | 2 - classes/class_tlsoptions.rst | 2 +- classes/class_treeitem.rst | 28 ++ classes/class_viewport.rst | 6 +- 29 files changed, 343 insertions(+), 228 deletions(-) diff --git a/classes/class_animatedtexture.rst b/classes/class_animatedtexture.rst index 2aa6bdcfa5d..8e2f91c84b7 100644 --- a/classes/class_animatedtexture.rst +++ b/classes/class_animatedtexture.rst @@ -27,7 +27,9 @@ The playback of the animation is controlled by the :ref:`speed_scale`\ s. Each frame needs to be a separate :ref:`Texture2D`. -\ **Warning:** AnimatedTexture is deprecated, and might be removed in a future release. Its current implementation is not efficient for the modern renderers. +\ **Warning:** The current implementation is not efficient for the modern renderers. + +\ *Deprecated.* This class is deprecated, and might be removed in a future release. .. rst-class:: classref-reftable-group diff --git a/classes/class_astargrid2d.rst b/classes/class_astargrid2d.rst index 571856c3726..d65cc0f751a 100644 --- a/classes/class_astargrid2d.rst +++ b/classes/class_astargrid2d.rst @@ -389,7 +389,7 @@ The region of grid cells available for pathfinding. If changed, :ref:`update` on each axis). If changed, :ref:`update` needs to be called before finding the next path. -\ **Note:** This property is deprecated, use :ref:`region` instead. +\ *Deprecated.* Use :ref:`region` instead. .. rst-class:: classref-section-separator diff --git a/classes/class_codeedit.rst b/classes/class_codeedit.rst index 3965e178e28..6fcc1cdcd9b 100644 --- a/classes/class_codeedit.rst +++ b/classes/class_codeedit.rst @@ -85,125 +85,125 @@ Methods .. table:: :widths: auto - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_confirm_code_completion` **(** :ref:`bool` replace **)** |virtual| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`_filter_code_completion_candidates` **(** :ref:`Dictionary[]` candidates **)** |virtual| |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`_request_code_completion` **(** :ref:`bool` force **)** |virtual| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_auto_brace_completion_pair` **(** :ref:`String` start_key, :ref:`String` end_key **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_code_completion_option` **(** :ref:`CodeCompletionKind` type, :ref:`String` display_text, :ref:`String` insert_text, :ref:`Color` text_color=Color(1, 1, 1, 1), :ref:`Resource` icon=null, :ref:`Variant` value=0 **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_comment_delimiter` **(** :ref:`String` start_key, :ref:`String` end_key, :ref:`bool` line_only=false **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`add_string_delimiter` **(** :ref:`String` start_key, :ref:`String` end_key, :ref:`bool` line_only=false **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`can_fold_line` **(** :ref:`int` line **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`cancel_code_completion` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear_bookmarked_lines` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear_breakpointed_lines` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear_comment_delimiters` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear_executing_lines` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`clear_string_delimiters` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`confirm_code_completion` **(** :ref:`bool` replace=false **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`convert_indent` **(** :ref:`int` from_line=-1, :ref:`int` to_line=-1 **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`do_indent` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`fold_all_lines` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`fold_line` **(** :ref:`int` line **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_auto_brace_completion_close_key` **(** :ref:`String` open_key **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedInt32Array` | :ref:`get_bookmarked_lines` **(** **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedInt32Array` | :ref:`get_breakpointed_lines` **(** **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`get_code_completion_option` **(** :ref:`int` index **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary[]` | :ref:`get_code_completion_options` **(** **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_code_completion_selected_index` **(** **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_delimiter_end_key` **(** :ref:`int` delimiter_index **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_delimiter_end_position` **(** :ref:`int` line, :ref:`int` column **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_delimiter_start_key` **(** :ref:`int` delimiter_index **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_delimiter_start_position` **(** :ref:`int` line, :ref:`int` column **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`PackedInt32Array` | :ref:`get_executing_lines` **(** **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int[]` | :ref:`get_folded_lines` **(** **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_text_for_code_completion` **(** **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`String` | :ref:`get_text_for_symbol_lookup` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_auto_brace_completion_close_key` **(** :ref:`String` close_key **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_auto_brace_completion_open_key` **(** :ref:`String` open_key **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_comment_delimiter` **(** :ref:`String` start_key **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_string_delimiter` **(** :ref:`String` start_key **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`indent_lines` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`is_in_comment` **(** :ref:`int` line, :ref:`int` column=-1 **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`is_in_string` **(** :ref:`int` line, :ref:`int` column=-1 **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_line_bookmarked` **(** :ref:`int` line **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_line_breakpointed` **(** :ref:`int` line **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_line_executing` **(** :ref:`int` line **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_line_folded` **(** :ref:`int` line **)** |const| | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_comment_delimiter` **(** :ref:`String` start_key **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`remove_string_delimiter` **(** :ref:`String` start_key **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`request_code_completion` **(** :ref:`bool` force=false **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_code_completion_selected_index` **(** :ref:`int` index **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_code_hint` **(** :ref:`String` code_hint **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_code_hint_draw_below` **(** :ref:`bool` draw_below **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_line_as_bookmarked` **(** :ref:`int` line, :ref:`bool` bookmarked **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_line_as_breakpoint` **(** :ref:`int` line, :ref:`bool` breakpointed **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_line_as_executing` **(** :ref:`int` line, :ref:`bool` executing **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`set_symbol_lookup_word_as_valid` **(** :ref:`bool` valid **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`toggle_foldable_line` **(** :ref:`int` line **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`unfold_all_lines` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`unfold_line` **(** :ref:`int` line **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`unindent_lines` **(** **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`update_code_completion_options` **(** :ref:`bool` force **)** | - +-------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_confirm_code_completion` **(** :ref:`bool` replace **)** |virtual| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`_filter_code_completion_candidates` **(** :ref:`Dictionary[]` candidates **)** |virtual| |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`_request_code_completion` **(** :ref:`bool` force **)** |virtual| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_auto_brace_completion_pair` **(** :ref:`String` start_key, :ref:`String` end_key **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_code_completion_option` **(** :ref:`CodeCompletionKind` type, :ref:`String` display_text, :ref:`String` insert_text, :ref:`Color` text_color=Color(1, 1, 1, 1), :ref:`Resource` icon=null, :ref:`Variant` value=0, :ref:`int` location=1024 **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_comment_delimiter` **(** :ref:`String` start_key, :ref:`String` end_key, :ref:`bool` line_only=false **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`add_string_delimiter` **(** :ref:`String` start_key, :ref:`String` end_key, :ref:`bool` line_only=false **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`can_fold_line` **(** :ref:`int` line **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`cancel_code_completion` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear_bookmarked_lines` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear_breakpointed_lines` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear_comment_delimiters` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear_executing_lines` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`clear_string_delimiters` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`confirm_code_completion` **(** :ref:`bool` replace=false **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`convert_indent` **(** :ref:`int` from_line=-1, :ref:`int` to_line=-1 **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`do_indent` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`fold_all_lines` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`fold_line` **(** :ref:`int` line **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_auto_brace_completion_close_key` **(** :ref:`String` open_key **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedInt32Array` | :ref:`get_bookmarked_lines` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedInt32Array` | :ref:`get_breakpointed_lines` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_code_completion_option` **(** :ref:`int` index **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary[]` | :ref:`get_code_completion_options` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_code_completion_selected_index` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_delimiter_end_key` **(** :ref:`int` delimiter_index **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_delimiter_end_position` **(** :ref:`int` line, :ref:`int` column **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_delimiter_start_key` **(** :ref:`int` delimiter_index **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_delimiter_start_position` **(** :ref:`int` line, :ref:`int` column **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedInt32Array` | :ref:`get_executing_lines` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int[]` | :ref:`get_folded_lines` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_text_for_code_completion` **(** **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`get_text_for_symbol_lookup` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_auto_brace_completion_close_key` **(** :ref:`String` close_key **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_auto_brace_completion_open_key` **(** :ref:`String` open_key **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_comment_delimiter` **(** :ref:`String` start_key **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_string_delimiter` **(** :ref:`String` start_key **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`indent_lines` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`is_in_comment` **(** :ref:`int` line, :ref:`int` column=-1 **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`is_in_string` **(** :ref:`int` line, :ref:`int` column=-1 **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_line_bookmarked` **(** :ref:`int` line **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_line_breakpointed` **(** :ref:`int` line **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_line_executing` **(** :ref:`int` line **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_line_folded` **(** :ref:`int` line **)** |const| | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_comment_delimiter` **(** :ref:`String` start_key **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`remove_string_delimiter` **(** :ref:`String` start_key **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`request_code_completion` **(** :ref:`bool` force=false **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_code_completion_selected_index` **(** :ref:`int` index **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_code_hint` **(** :ref:`String` code_hint **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_code_hint_draw_below` **(** :ref:`bool` draw_below **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_line_as_bookmarked` **(** :ref:`int` line, :ref:`bool` bookmarked **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_line_as_breakpoint` **(** :ref:`int` line, :ref:`bool` breakpointed **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_line_as_executing` **(** :ref:`int` line, :ref:`bool` executing **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_symbol_lookup_word_as_valid` **(** :ref:`bool` valid **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`toggle_foldable_line` **(** :ref:`int` line **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`unfold_all_lines` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`unfold_line` **(** :ref:`int` line **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`unindent_lines` **(** **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`update_code_completion_options` **(** :ref:`bool` force **)** | + +-------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-reftable-group @@ -453,6 +453,48 @@ Marks the option as a file path. Marks the option as unclassified or plain text. +.. rst-class:: classref-item-separator + +---- + +.. _enum_CodeEdit_CodeCompletionLocation: + +.. rst-class:: classref-enumeration + +enum **CodeCompletionLocation**: + +.. _class_CodeEdit_constant_LOCATION_LOCAL: + +.. rst-class:: classref-enumeration-constant + +:ref:`CodeCompletionLocation` **LOCATION_LOCAL** = ``0`` + +The option is local to the location of the code completion query - e.g. a local variable. Subsequent value of location represent options from the outer class, the exact value represent how far they are (in terms of inner classes). + +.. _class_CodeEdit_constant_LOCATION_PARENT_MASK: + +.. rst-class:: classref-enumeration-constant + +:ref:`CodeCompletionLocation` **LOCATION_PARENT_MASK** = ``256`` + +The option is from the containing class or a parent class, relative to the location of the code completion query. Perform a bitwise OR with the class depth (e.g. 0 for the local class, 1 for the parent, 2 for the grandparent, etc) to store the depth of an option in the class or a parent class. + +.. _class_CodeEdit_constant_LOCATION_OTHER_USER_CODE: + +.. rst-class:: classref-enumeration-constant + +:ref:`CodeCompletionLocation` **LOCATION_OTHER_USER_CODE** = ``512`` + +The option is from user code which is not local and not in a derived class (e.g. Autoload Singletons). + +.. _class_CodeEdit_constant_LOCATION_OTHER: + +.. rst-class:: classref-enumeration-constant + +:ref:`CodeCompletionLocation` **LOCATION_OTHER** = ``1024`` + +The option is from other engine code, not covered by the other enum constants - e.g. built-in classes. + .. rst-class:: classref-section-separator ---- @@ -863,10 +905,12 @@ Both the start and end keys must be symbols. Only the start key has to be unique .. rst-class:: classref-method -void **add_code_completion_option** **(** :ref:`CodeCompletionKind` type, :ref:`String` display_text, :ref:`String` insert_text, :ref:`Color` text_color=Color(1, 1, 1, 1), :ref:`Resource` icon=null, :ref:`Variant` value=0 **)** +void **add_code_completion_option** **(** :ref:`CodeCompletionKind` type, :ref:`String` display_text, :ref:`String` insert_text, :ref:`Color` text_color=Color(1, 1, 1, 1), :ref:`Resource` icon=null, :ref:`Variant` value=0, :ref:`int` location=1024 **)** Submits an item to the queue of potential candidates for the autocomplete menu. Call :ref:`update_code_completion_options` to update the list. +\ ``location`` indicates location of the option relative to the location of the code completion query. See :ref:`CodeCompletionLocation` for how to set this value. + \ **Note:** This list will replace all current candidates. .. rst-class:: classref-item-separator diff --git a/classes/class_control.rst b/classes/class_control.rst index b68e9086afc..88d4ded3a89 100644 --- a/classes/class_control.rst +++ b/classes/class_control.rst @@ -1743,7 +1743,7 @@ The size of the node's bounding rectangle, in the node's coordinate system. :ref - void **set_h_size_flags** **(** :ref:`SizeFlags` value **)** - :ref:`SizeFlags` **get_h_size_flags** **(** **)** -Tells the parent :ref:`Container` nodes how they should resize and place the node on the X axis. Use one of the :ref:`SizeFlags` constants to change the flags. See the constants to learn what each does. +Tells the parent :ref:`Container` nodes how they should resize and place the node on the X axis. Use a combination of the :ref:`SizeFlags` constants to change the flags. See the constants to learn what each does. .. rst-class:: classref-item-separator @@ -1777,7 +1777,7 @@ If the node and at least one of its neighbors uses the :ref:`SIZE_EXPAND` value **)** - :ref:`SizeFlags` **get_v_size_flags** **(** **)** -Tells the parent :ref:`Container` nodes how they should resize and place the node on the Y axis. Use one of the :ref:`SizeFlags` constants to change the flags. See the constants to learn what each does. +Tells the parent :ref:`Container` nodes how they should resize and place the node on the Y axis. Use a combination of the :ref:`SizeFlags` constants to change the flags. See the constants to learn what each does. .. rst-class:: classref-item-separator diff --git a/classes/class_editorexportplatformandroid.rst b/classes/class_editorexportplatformandroid.rst index 54d2a76907c..15b3a9d478d 100644 --- a/classes/class_editorexportplatformandroid.rst +++ b/classes/class_editorexportplatformandroid.rst @@ -612,6 +612,8 @@ Path of the debug keystore file. Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_DEBUG_PATH``. +Fallbacks to ``EditorSettings.export/android/debug_keystore`` if empty. + .. rst-class:: classref-item-separator ---- @@ -626,6 +628,8 @@ Password for the debug keystore file. Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_DEBUG_PASSWORD``. +Fallbacks to ``EditorSettings.export/android/debug_keystore_pass`` if both it and :ref:`keystore/debug` are empty. + .. rst-class:: classref-item-separator ---- @@ -640,6 +644,8 @@ User name for the debug keystore file. Can be overridden with the environment variable ``GODOT_ANDROID_KEYSTORE_DEBUG_USER``. +Fallbacks to ``EditorSettings.export/android/debug_keystore_user`` if both it and :ref:`keystore/debug` are empty. + .. rst-class:: classref-item-separator ---- @@ -716,7 +722,7 @@ Foreground layer of the application adaptive icon file. :ref:`String` **launcher_icons/main_192x192** -Application icon file. If left empty, project icon is used instead. +Application icon file. If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. .. rst-class:: classref-item-separator diff --git a/classes/class_editorexportplatformios.rst b/classes/class_editorexportplatformios.rst index 6837168aa93..a018301797e 100644 --- a/classes/class_editorexportplatformios.rst +++ b/classes/class_editorexportplatformios.rst @@ -390,7 +390,7 @@ Path to the custom export template. If left empty, default template is used. :ref:`String` **icons/app_store_1024x1024** -App Store application icon file. If left empty, project icon is used instead. See `App icons `__. +App Store application icon file. If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -402,7 +402,7 @@ App Store application icon file. If left empty, project icon is used instead. Se :ref:`String` **icons/ipad_76x76** -Home screen application icon file on iPad (1x DPI). If left empty, project icon is used instead. See `App icons `__. +Home screen application icon file on iPad (1x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -414,7 +414,7 @@ Home screen application icon file on iPad (1x DPI). If left empty, project icon :ref:`String` **icons/ipad_152x152** -Home screen application icon file on iPad (2x DPI). If left empty, project icon is used instead. See `App icons `__. +Home screen application icon file on iPad (2x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -426,7 +426,7 @@ Home screen application icon file on iPad (2x DPI). If left empty, project icon :ref:`String` **icons/ipad_167x167** -Home screen application icon file on iPad (3x DPI). If left empty, project icon is used instead. See `App icons `__. +Home screen application icon file on iPad (3x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -438,7 +438,7 @@ Home screen application icon file on iPad (3x DPI). If left empty, project icon :ref:`String` **icons/iphone_120x120** -Home screen application icon file on iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. +Home screen application icon file on iPhone (2x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -450,7 +450,7 @@ Home screen application icon file on iPhone (2x DPI). If left empty, project ico :ref:`String` **icons/iphone_180x180** -Home screen application icon file on iPhone (3x DPI). If left empty, project icon is used instead. See `App icons `__. +Home screen application icon file on iPhone (3x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -462,7 +462,7 @@ Home screen application icon file on iPhone (3x DPI). If left empty, project ico :ref:`String` **icons/notification_40x40** -Notification icon file on iPad and iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. +Notification icon file on iPad and iPhone (2x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -474,7 +474,7 @@ Notification icon file on iPad and iPhone (2x DPI). If left empty, project icon :ref:`String` **icons/notification_60x60** -Notification icon file on iPhone (3x DPI). If left empty, project icon is used instead. See `App icons `__. +Notification icon file on iPhone (3x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -486,7 +486,7 @@ Notification icon file on iPhone (3x DPI). If left empty, project icon is used i :ref:`String` **icons/settings_58x58** -Application settings icon file on iPad and iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. +Application settings icon file on iPad and iPhone (2x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -498,7 +498,7 @@ Application settings icon file on iPad and iPhone (2x DPI). If left empty, proje :ref:`String` **icons/settings_87x87** -Application settings icon file on iPhone (3x DPI). If left empty, project icon is used instead. See `App icons `__. +Application settings icon file on iPhone (3x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -510,7 +510,7 @@ Application settings icon file on iPhone (3x DPI). If left empty, project icon i :ref:`String` **icons/spotlight_40x40** -Spotlight icon file on iPad (1x DPI). If left empty, project icon is used instead. See `App icons `__. +Spotlight icon file on iPad (1x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -522,7 +522,7 @@ Spotlight icon file on iPad (1x DPI). If left empty, project icon is used instea :ref:`String` **icons/spotlight_80x80** -Spotlight icon file on iPad and iPhone (2x DPI). If left empty, project icon is used instead. See `App icons `__. +Spotlight icon file on iPad and iPhone (2x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/config/icon`. See `App icons `__. .. rst-class:: classref-item-separator @@ -534,7 +534,7 @@ Spotlight icon file on iPad and iPhone (2x DPI). If left empty, project icon is :ref:`String` **landscape_launch_screens/ipad_1024x768** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -546,7 +546,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **landscape_launch_screens/ipad_2048x1536** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -558,7 +558,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **landscape_launch_screens/iphone_2208x1242** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -570,7 +570,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **landscape_launch_screens/iphone_2436x1125** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -582,7 +582,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **portrait_launch_screens/ipad_768x1024** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -594,7 +594,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **portrait_launch_screens/ipad_1536x2048** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -606,7 +606,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **portrait_launch_screens/iphone_640x960** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -618,7 +618,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **portrait_launch_screens/iphone_640x1136** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -630,7 +630,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **portrait_launch_screens/iphone_750x1334** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -642,7 +642,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **portrait_launch_screens/iphone_1125x2436** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -654,7 +654,7 @@ Application launch screen image file, if left empty project splash screen is use :ref:`String` **portrait_launch_screens/iphone_1242x2208** -Application launch screen image file, if left empty project splash screen is used instead. +Application launch screen image file. If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -750,7 +750,7 @@ A custom background color of the storyboard launch screen. :ref:`String` **storyboard/custom_image@2x** -Application launch screen image file (2x DPI), if left empty project splash screen is used instead. +Application launch screen image file (2x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator @@ -762,7 +762,7 @@ Application launch screen image file (2x DPI), if left empty project splash scre :ref:`String` **storyboard/custom_image@3x** -Application launch screen image file (3x DPI), if left empty project splash screen is used instead. +Application launch screen image file (3x DPI). If left empty, it will fallback to :ref:`ProjectSettings.application/boot_splash/image`. .. rst-class:: classref-item-separator diff --git a/classes/class_editorexportplatformmacos.rst b/classes/class_editorexportplatformmacos.rst index d41515b74c3..05399fb5958 100644 --- a/classes/class_editorexportplatformmacos.rst +++ b/classes/class_editorexportplatformmacos.rst @@ -272,7 +272,7 @@ Copyright notice for the bundle visible to the user (localized). :ref:`String` **application/icon** -Application icon file. If left empty, project icon is used instead. +Application icon file. If left empty, it will fallback to :ref:`ProjectSettings.application/config/macos_native_icon`, and then to :ref:`ProjectSettings.application/config/icon`. .. rst-class:: classref-item-separator diff --git a/classes/class_editorexportplatformwindows.rst b/classes/class_editorexportplatformwindows.rst index 0d4570bda9f..85972493f45 100644 --- a/classes/class_editorexportplatformwindows.rst +++ b/classes/class_editorexportplatformwindows.rst @@ -130,7 +130,7 @@ Company that produced the application. Required. See `StringFileInfo ` **application/console_wrapper_icon** -Console wrapper icon file. If left empty, application icon is used instead. +Console wrapper icon file. If left empty, it will fallback to :ref:`application/icon`, then to :ref:`ProjectSettings.application/config/windows_native_icon`, and lastly, :ref:`ProjectSettings.application/config/icon`. .. rst-class:: classref-item-separator @@ -178,7 +178,7 @@ Version number of the file. Required. See `StringFileInfo ` **application/icon** -Application icon file. If left empty, project icon is used instead. +Application icon file. If left empty, it will fallback to :ref:`ProjectSettings.application/config/windows_native_icon`, and then to :ref:`ProjectSettings.application/config/icon`. .. rst-class:: classref-item-separator diff --git a/classes/class_editorsettings.rst b/classes/class_editorsettings.rst index 7a40b941d16..7b7e8cc0d02 100644 --- a/classes/class_editorsettings.rst +++ b/classes/class_editorsettings.rst @@ -367,6 +367,8 @@ Properties +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`run/output/font_size` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`run/window_placement/android_window` | + +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`run/window_placement/rect` | +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Vector2` | :ref:`run/window_placement/rect_custom_position` | @@ -2581,6 +2583,20 @@ The size of the font in the **Output** panel at the bottom of the editor. This s ---- +.. _class_EditorSettings_property_run/window_placement/android_window: + +.. rst-class:: classref-property + +:ref:`int` **run/window_placement/android_window** + +The Android window to display the project on when starting the project from the editor. + +\ **Note:** Only available in the Android editor. + +.. rst-class:: classref-item-separator + +---- + .. _class_EditorSettings_property_run/window_placement/rect: .. rst-class:: classref-property diff --git a/classes/class_gdextension.rst b/classes/class_gdextension.rst index 2a5c8ba20fe..fbac307a26a 100644 --- a/classes/class_gdextension.rst +++ b/classes/class_gdextension.rst @@ -24,17 +24,17 @@ Methods .. table:: :widths: auto - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`close_library` **(** **)** | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`InitializationLevel` | :ref:`get_minimum_library_initialization_level` **(** **)** |const| | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | void | :ref:`initialize_library` **(** :ref:`InitializationLevel` level **)** | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_library_open` **(** **)** |const| | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`open_library` **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface=false **)** | - +------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`close_library` **(** **)** | + +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`InitializationLevel` | :ref:`get_minimum_library_initialization_level` **(** **)** |const| | + +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`initialize_library` **(** :ref:`InitializationLevel` level **)** | + +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_library_open` **(** **)** |const| | + +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`open_library` **(** :ref:`String` path, :ref:`String` entry_symbol **)** | + +------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -152,7 +152,7 @@ void **initialize_library** **(** :ref:`InitializationLevel` **open_library** **(** :ref:`String` path, :ref:`String` entry_symbol, :ref:`bool` use_legacy_interface=false **)** +:ref:`Error` **open_library** **(** :ref:`String` path, :ref:`String` entry_symbol **)** .. container:: contribute diff --git a/classes/class_gltfphysicsbody.rst b/classes/class_gltfphysicsbody.rst index 619b7031a7f..c5c26c52531 100644 --- a/classes/class_gltfphysicsbody.rst +++ b/classes/class_gltfphysicsbody.rst @@ -36,17 +36,17 @@ Properties .. table:: :widths: auto - +-------------------------------+--------------------------------------------------------------------------+----------------------+ - | :ref:`Vector3` | :ref:`angular_velocity` | ``Vector3(0, 0, 0)`` | - +-------------------------------+--------------------------------------------------------------------------+----------------------+ - | :ref:`String` | :ref:`body_type` | ``"static"`` | - +-------------------------------+--------------------------------------------------------------------------+----------------------+ - | :ref:`Vector3` | :ref:`inertia` | ``Vector3(0, 0, 0)`` | - +-------------------------------+--------------------------------------------------------------------------+----------------------+ - | :ref:`Vector3` | :ref:`linear_velocity` | ``Vector3(0, 0, 0)`` | - +-------------------------------+--------------------------------------------------------------------------+----------------------+ - | :ref:`float` | :ref:`mass` | ``1.0`` | - +-------------------------------+--------------------------------------------------------------------------+----------------------+ + +-------------------------------+--------------------------------------------------------------------------+--------------------------------------+ + | :ref:`Vector3` | :ref:`angular_velocity` | ``Vector3(0, 0, 0)`` | + +-------------------------------+--------------------------------------------------------------------------+--------------------------------------+ + | :ref:`String` | :ref:`body_type` | ``"static"`` | + +-------------------------------+--------------------------------------------------------------------------+--------------------------------------+ + | :ref:`Basis` | :ref:`inertia_tensor` | ``Basis(0, 0, 0, 0, 0, 0, 0, 0, 0)`` | + +-------------------------------+--------------------------------------------------------------------------+--------------------------------------+ + | :ref:`Vector3` | :ref:`linear_velocity` | ``Vector3(0, 0, 0)`` | + +-------------------------------+--------------------------------------------------------------------------+--------------------------------------+ + | :ref:`float` | :ref:`mass` | ``1.0`` | + +-------------------------------+--------------------------------------------------------------------------+--------------------------------------+ .. rst-class:: classref-reftable-group @@ -109,20 +109,20 @@ The type of the body. Valid values are "static", "kinematic", "character", "rigi ---- -.. _class_GLTFPhysicsBody_property_inertia: +.. _class_GLTFPhysicsBody_property_inertia_tensor: .. rst-class:: classref-property -:ref:`Vector3` **inertia** = ``Vector3(0, 0, 0)`` +:ref:`Basis` **inertia_tensor** = ``Basis(0, 0, 0, 0, 0, 0, 0, 0, 0)`` .. rst-class:: classref-property-setget -- void **set_inertia** **(** :ref:`Vector3` value **)** -- :ref:`Vector3` **get_inertia** **(** **)** +- void **set_inertia_tensor** **(** :ref:`Basis` value **)** +- :ref:`Basis` **get_inertia_tensor** **(** **)** -The principle axes of the inertia tensor of the physics body, in kilogram meter squared (kg⋅m²). This is only used when the body type is "rigid" or "vehicle". +The inertia tensor of the physics body, in kilogram meter squared (kg⋅m²). This is only used when the body type is "rigid" or "vehicle". -This is written to and read from the GLTF file as a 3x3 matrix, but is exposed as a Vector3 since Godot only supports principal axis inertia values. When converted to a Godot :ref:`RigidBody3D` node, if this value is zero, then the inertia will be calculated automatically. +When converted to a Godot :ref:`RigidBody3D` node, if this value is zero, then the inertia will be calculated automatically. .. rst-class:: classref-item-separator diff --git a/classes/class_gltfskeleton.rst b/classes/class_gltfskeleton.rst index 7bd01c24232..51359d52df5 100644 --- a/classes/class_gltfskeleton.rst +++ b/classes/class_gltfskeleton.rst @@ -140,9 +140,7 @@ Method Descriptions :ref:`Dictionary` **get_godot_bone_node** **(** **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Returns a :ref:`Dictionary` that maps skeleton bone indices to the indices of GLTF nodes. This property is unused during import, and only set during export. In a GLTF file, a bone is a node, so Godot converts skeleton bones to GLTF nodes. .. rst-class:: classref-item-separator @@ -182,9 +180,7 @@ Method Descriptions void **set_godot_bone_node** **(** :ref:`Dictionary` godot_bone_node **)** -.. container:: contribute - - There is currently no description for this method. Please help us by :ref:`contributing one `! +Sets a :ref:`Dictionary` that maps skeleton bone indices to the indices of GLTF nodes. This property is unused during import, and only set during export. In a GLTF file, a bone is a node, so Godot converts skeleton bones to GLTF nodes. .. rst-class:: classref-item-separator diff --git a/classes/class_httpclient.rst b/classes/class_httpclient.rst index 3ad584fed49..1fb191ebbc3 100644 --- a/classes/class_httpclient.rst +++ b/classes/class_httpclient.rst @@ -451,7 +451,7 @@ HTTP status code ``304 Not Modified``. A conditional GET or HEAD request has bee :ref:`ResponseCode` **RESPONSE_USE_PROXY** = ``305`` -HTTP status code ``305 Use Proxy``. *Deprecated. Do not use.* +*Deprecated.* HTTP status code ``305 Use Proxy``. .. _class_HTTPClient_constant_RESPONSE_SWITCH_PROXY: @@ -459,7 +459,7 @@ HTTP status code ``305 Use Proxy``. *Deprecated. Do not use.* :ref:`ResponseCode` **RESPONSE_SWITCH_PROXY** = ``306`` -HTTP status code ``306 Switch Proxy``. *Deprecated. Do not use.* +*Deprecated.* HTTP status code ``306 Switch Proxy``. .. _class_HTTPClient_constant_RESPONSE_TEMPORARY_REDIRECT: diff --git a/classes/class_label.rst b/classes/class_label.rst index ca23a6d6c2a..fd6eb7d68dd 100644 --- a/classes/class_label.rst +++ b/classes/class_label.rst @@ -61,6 +61,8 @@ Properties +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ | :ref:`Array` | :ref:`structured_text_bidi_override_options` | ``[]`` | +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ + | :ref:`PackedFloat32Array` | :ref:`tab_stops` | ``PackedFloat32Array()`` | + +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ | :ref:`String` | :ref:`text` | ``""`` | +-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------+ | :ref:`TextDirection` | :ref:`text_direction` | ``0`` | @@ -307,6 +309,23 @@ Set additional options for BiDi override. ---- +.. _class_Label_property_tab_stops: + +.. rst-class:: classref-property + +:ref:`PackedFloat32Array` **tab_stops** = ``PackedFloat32Array()`` + +.. rst-class:: classref-property-setget + +- void **set_tab_stops** **(** :ref:`PackedFloat32Array` value **)** +- :ref:`PackedFloat32Array` **get_tab_stops** **(** **)** + +Aligns text to the given tab-stops. + +.. rst-class:: classref-item-separator + +---- + .. _class_Label_property_text: .. rst-class:: classref-property diff --git a/classes/class_navigationagent2d.rst b/classes/class_navigationagent2d.rst index 2e1a4fe646f..07ea6c4f3a7 100644 --- a/classes/class_navigationagent2d.rst +++ b/classes/class_navigationagent2d.rst @@ -276,7 +276,7 @@ If ``true`` the agent is registered for an RVO avoidance callback on the :ref:`N - void **set_avoidance_layers** **(** :ref:`int` value **)** - :ref:`int` **get_avoidance_layers** **(** **)** -A bitfield determining the avoidance layers for this NavigationAgent. Other agent's with a matching bit on the :ref:`avoidance_mask` will avoid this agent. +A bitfield determining the avoidance layers for this NavigationAgent. Other agents with a matching bit on the :ref:`avoidance_mask` will avoid this agent. .. rst-class:: classref-item-separator @@ -293,7 +293,7 @@ A bitfield determining the avoidance layers for this NavigationAgent. Other agen - void **set_avoidance_mask** **(** :ref:`int` value **)** - :ref:`int` **get_avoidance_mask** **(** **)** -A bitfield determining what other avoidance agent's and obstacles this NavigationAgent will avoid when a bit matches at least one of their :ref:`avoidance_layers`. +A bitfield determining what other avoidance agents and obstacles this NavigationAgent will avoid when a bit matches at least one of their :ref:`avoidance_layers`. .. rst-class:: classref-item-separator @@ -446,7 +446,7 @@ The maximum speed that an agent can move. - void **set_navigation_layers** **(** :ref:`int` value **)** - :ref:`int` **get_navigation_layers** **(** **)** -A bitfield determining what navigation layers of navigation regions this agent will use to calculate path. Changing it runtime will clear current navigation path and generate new one, according to new navigation layers. +A bitfield determining which navigation layers of navigation regions this agent will use to calculate a path. Changing it during runtime will clear the current navigation path and generate a new one, according to the new navigation layers. .. rst-class:: classref-item-separator @@ -480,7 +480,7 @@ The distance to search for other agents. - void **set_path_desired_distance** **(** :ref:`float` value **)** - :ref:`float` **get_path_desired_distance** **(** **)** -The distance threshold before a path point is considered to be reached. This will allow an agent to not have to hit a path point on the path exactly, but in the area. If this value is set to high the NavigationAgent will skip points on the path which can lead to leaving the navigation mesh. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the next point on each physics frame update. +The distance threshold before a path point is considered to be reached. This allows agents to not have to hit a path point on the path exactly, but only to reach its general area. If this value is set too high, the NavigationAgent will skip points on the path, which can lead too leaving the navigation mesh. If this value is set too low, the NavigationAgent will be stuck in a repath loop because it will constantly overshoot or undershoot the distance to the next point on each physics frame update. .. rst-class:: classref-item-separator @@ -584,7 +584,7 @@ Does not affect normal pathfinding. To change an actor's pathfinding radius bake - void **set_target_desired_distance** **(** :ref:`float` value **)** - :ref:`float` **get_target_desired_distance** **(** **)** -The distance threshold before the final target point is considered to be reached. This will allow an agent to not have to hit the point of the final target exactly, but only the area. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the final target point on each physics frame update. +The distance threshold before the final target point is considered to be reached. This allows agents to not have to hit the point of the final target exactly, but only to reach its general area. If this value is set too low, the NavigationAgent will be stuck in a repath loop because it will constantly overshoot or undershoot the distance to the final target point on each physics frame update. .. rst-class:: classref-item-separator @@ -652,7 +652,7 @@ The minimal amount of time for which this agent's velocities, that are computed - void **set_velocity** **(** :ref:`Vector2` value **)** - :ref:`Vector2` **get_velocity** **(** **)** -Sets the new wanted velocity for the agent. The avoidance simulation will try to fulfil this velocity if possible but will modify it to avoid collision with other agent's and obstacles. When an agent is teleported to a new position use :ref:`set_velocity_forced` as well to reset the internal simulation velocity. +Sets the new wanted velocity for the agent. The avoidance simulation will try to fulfill this velocity if possible but will modify it to avoid collision with other agents and obstacles. When an agent is teleported to a new position, use :ref:`set_velocity_forced` as well to reset the internal simulation velocity. .. rst-class:: classref-section-separator diff --git a/classes/class_navigationagent3d.rst b/classes/class_navigationagent3d.rst index a5bbda67413..53d74f81579 100644 --- a/classes/class_navigationagent3d.rst +++ b/classes/class_navigationagent3d.rst @@ -297,7 +297,7 @@ A bitfield determining the avoidance layers for this NavigationAgent. Other agen - void **set_avoidance_mask** **(** :ref:`int` value **)** - :ref:`int` **get_avoidance_mask** **(** **)** -A bitfield determining what other avoidance agent's and obstacles this NavigationAgent will avoid when a bit matches at least one of their :ref:`avoidance_layers`. +A bitfield determining what other avoidance agents and obstacles this NavigationAgent will avoid when a bit matches at least one of their :ref:`avoidance_layers`. .. rst-class:: classref-item-separator @@ -399,7 +399,7 @@ If ``true`` uses the defined :ref:`debug_path_custom_color` value **)** - :ref:`float` **get_height** **(** **)** -The height of the avoidance agent. Agent's will ignore other agents or obstacles that are above or below their current position + height in 2D avoidance. Does nothing in 3D avoidance which uses radius spheres alone. +The height of the avoidance agent. Agents will ignore other agents or obstacles that are above or below their current position + height in 2D avoidance. Does nothing in 3D avoidance which uses radius spheres alone. .. rst-class:: classref-item-separator @@ -450,7 +450,7 @@ The maximum speed that an agent can move. - void **set_navigation_layers** **(** :ref:`int` value **)** - :ref:`int` **get_navigation_layers** **(** **)** -A bitfield determining what navigation layers of navigation regions this agent will use to calculate path. Changing it runtime will clear current navigation path and generate new one, according to new navigation layers. +A bitfield determining which navigation layers of navigation regions this agent will use to calculate a path. Changing it during runtime will clear the current navigation path and generate a new one, according to the new navigation layers. .. rst-class:: classref-item-separator @@ -484,7 +484,7 @@ The distance to search for other agents. - void **set_path_desired_distance** **(** :ref:`float` value **)** - :ref:`float` **get_path_desired_distance** **(** **)** -The distance threshold before a path point is considered to be reached. This will allow an agent to not have to hit a path point on the path exactly, but in the area. If this value is set to high the NavigationAgent will skip points on the path which can lead to leaving the navigation mesh. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the next point on each physics frame update. +The distance threshold before a path point is considered to be reached. This allows agents to not have to hit a path point on the path exactly, but only to reach its general area. If this value is set too high, the NavigationAgent will skip points on the path, which can lead to leaving the navigation mesh. If this value is set too low, the NavigationAgent will be stuck in a repath loop because it will constantly overshoot or undershoot the distance to the next point on each physics frame update. .. rst-class:: classref-item-separator @@ -605,7 +605,7 @@ Does not affect normal pathfinding. To change an actor's pathfinding radius bake - void **set_target_desired_distance** **(** :ref:`float` value **)** - :ref:`float` **get_target_desired_distance** **(** **)** -The distance threshold before the final target point is considered to be reached. This will allow an agent to not have to hit the point of the final target exactly, but only the area. If this value is set to low the NavigationAgent will be stuck in a repath loop cause it will constantly overshoot or undershoot the distance to the final target point on each physics frame update. +The distance threshold before the final target point is considered to be reached. This allows agents to not have to hit the point of the final target exactly, but only to reach its general. If this value is set too low, the NavigationAgent will be stuck in a repath loop because it will constantly overshoot or undershoot the distance to the final target point on each physics frame update. .. rst-class:: classref-item-separator @@ -673,9 +673,9 @@ The minimal amount of time for which this agent's velocities, that are computed - void **set_use_3d_avoidance** **(** :ref:`bool` value **)** - :ref:`bool` **get_use_3d_avoidance** **(** **)** -If ``true`` the agent calculates avoidance velocities in 3D for the xyz-axis, e.g. for games that take place in air, unterwater or space. The 3D using agent only avoids other 3D avoidance using agent's. The 3D using agent only reacts to radius based avoidance obstacles. The 3D using agent ignores any vertices based obstacles. The 3D using agent only avoids other 3D using agent's. +If ``true``, the agent calculates avoidance velocities in 3D omnidirectionally, e.g. for games that take place in air, underwater or space. Agents using 3D avoidance only avoid other agents using 3D avoidance, and react to radius-based avoidance obstacles. They ignore any vertex-based obstacles. -If ``false`` the agent calculates avoidance velocities in 2D along the xz-axis ignoring the y-axis. The 2D using agent only avoids other 2D avoidance using agent's. The 2D using agent reacts to radius avoidance obstacles. The 2D using agent reacts to vertices based avoidance obstacles. The 2D using agent only avoids other 2D using agent's. 2D using agents will ignore other 2D using agents or obstacles that are below their current position or above their current position including :ref:`height` in 2D avoidance. +If ``false``, the agent calculates avoidance velocities in 2D along the x and z-axes, ignoring the y-axis. Agents using 2D avoidance only avoid other agents using 2D avoidance, and react to radius-based avoidance obstacles or vertex-based avoidance obstacles. Other agents using 2D avoidance that are below or above their current position including :ref:`height` are ignored. .. rst-class:: classref-item-separator @@ -692,7 +692,7 @@ If ``false`` the agent calculates avoidance velocities in 2D along the xz-axis i - void **set_velocity** **(** :ref:`Vector3` value **)** - :ref:`Vector3` **get_velocity** **(** **)** -Sets the new wanted velocity for the agent. The avoidance simulation will try to fulfil this velocity if possible but will modify it to avoid collision with other agent's and obstacles. When an agent is teleported to a new position use :ref:`set_velocity_forced` as well to reset the internal simulation velocity. +Sets the new wanted velocity for the agent. The avoidance simulation will try to fulfill this velocity if possible but will modify it to avoid collision with other agents and obstacles. When an agent is teleported to a new position, use :ref:`set_velocity_forced` as well to reset the internal simulation velocity. .. rst-class:: classref-section-separator diff --git a/classes/class_node.rst b/classes/class_node.rst index c57837b9b16..0f65d8d41ae 100644 --- a/classes/class_node.rst +++ b/classes/class_node.rst @@ -623,7 +623,7 @@ This notification is emitted *after* the related :ref:`tree_exiting` instead. +*Deprecated.* This notification is no longer emitted. Use :ref:`NOTIFICATION_CHILD_ORDER_CHANGED` instead. .. _class_Node_constant_NOTIFICATION_READY: @@ -2297,7 +2297,9 @@ Notifies the current node and all its children recursively by calling :ref:`Obje void **queue_free** **(** **)** -Queues a node for deletion at the end of the current frame. When deleted, all of its child nodes will be deleted as well. This method ensures it's safe to delete the node, contrary to :ref:`Object.free`. Use :ref:`Object.is_queued_for_deletion` to check whether a node will be deleted at the end of the frame. +Queues a node for deletion at the end of the current frame. When deleted, all of its child nodes will be deleted as well, and all references to the node and its children will become invalid, see :ref:`Object.free`. + +It is safe to call :ref:`queue_free` multiple times per frame on a node, and to :ref:`Object.free` a node that is currently queued for deletion. Use :ref:`Object.is_queued_for_deletion` to check whether a node will be deleted at the end of the frame. .. rst-class:: classref-item-separator diff --git a/classes/class_physicsserver2d.rst b/classes/class_physicsserver2d.rst index 0f06b386a97..52a8a43e9b9 100644 --- a/classes/class_physicsserver2d.rst +++ b/classes/class_physicsserver2d.rst @@ -2437,7 +2437,7 @@ Sets the shape data that defines the configuration of the shape. The ``data`` to - :ref:`SHAPE_CONCAVE_POLYGON`: a :ref:`PackedVector2Array` of length divisible by two (each pair of points forms one segment). -\ **Warning**: In the case of :ref:`SHAPE_CONVEX_POLYGON`, this method does not check if the points supplied actually form a convex polygon (unlike the :ref:`CollisionPolygon2D.polygon` property). +\ **Warning:** In the case of :ref:`SHAPE_CONVEX_POLYGON`, this method does not check if the points supplied actually form a convex polygon (unlike the :ref:`CollisionPolygon2D.polygon` property). .. rst-class:: classref-item-separator diff --git a/classes/class_projectsettings.rst b/classes/class_projectsettings.rst index 69ece349f93..efbf4dd7264 100644 --- a/classes/class_projectsettings.rst +++ b/classes/class_projectsettings.rst @@ -1465,9 +1465,9 @@ Properties +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`rendering/textures/lossless_compression/force_png` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`rendering/textures/vram_compression/import_etc2_astc` | | + | :ref:`bool` | :ref:`rendering/textures/vram_compression/import_etc2_astc` | ``false`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`rendering/textures/vram_compression/import_s3tc_bptc` | | + | :ref:`bool` | :ref:`rendering/textures/vram_compression/import_s3tc_bptc` | ``true`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`rendering/textures/webp_compression/compression_method` | ``2`` | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ @@ -1675,7 +1675,7 @@ The project's description, displayed as a tooltip in the Project Manager when ho :ref:`String` **application/config/icon** = ``""`` -Icon used for the project, set when project loads. Exporters will also use this icon when possible. +Icon used for the project, set when project loads. Exporters will also use this icon as a fallback if necessary. .. rst-class:: classref-item-separator @@ -10605,7 +10605,7 @@ If ``true``, the texture importer will import lossless textures using the PNG fo .. rst-class:: classref-property -:ref:`bool` **rendering/textures/vram_compression/import_etc2_astc** +:ref:`bool` **rendering/textures/vram_compression/import_etc2_astc** = ``false`` If ``true``, the texture importer will import VRAM-compressed textures using the Ericsson Texture Compression 2 algorithm for lower quality textures and normal maps and Adaptable Scalable Texture Compression algorithm for high quality textures (in 4x4 block size). @@ -10619,7 +10619,7 @@ If ``true``, the texture importer will import VRAM-compressed textures using the .. rst-class:: classref-property -:ref:`bool` **rendering/textures/vram_compression/import_s3tc_bptc** +:ref:`bool` **rendering/textures/vram_compression/import_s3tc_bptc** = ``true`` If ``true``, the texture importer will import VRAM-compressed textures using the S3 Texture Compression algorithm (DXT1-5) for lower quality textures and the BPTC algorithm (BC6H and BC7) for high quality textures. This algorithm is only supported on PC desktop platforms and consoles. diff --git a/classes/class_renderingdevice.rst b/classes/class_renderingdevice.rst index e129ca8b76d..fa003118014 100644 --- a/classes/class_renderingdevice.rst +++ b/classes/class_renderingdevice.rst @@ -3681,7 +3681,7 @@ enum **InitialAction**: :ref:`InitialAction` **INITIAL_ACTION_CLEAR** = ``0`` - +Start rendering and clear the whole framebuffer. .. _class_RenderingDevice_constant_INITIAL_ACTION_CLEAR_REGION: @@ -3689,7 +3689,7 @@ enum **InitialAction**: :ref:`InitialAction` **INITIAL_ACTION_CLEAR_REGION** = ``1`` - +Start rendering and clear the framebuffer in the specified region. .. _class_RenderingDevice_constant_INITIAL_ACTION_CLEAR_REGION_CONTINUE: @@ -3697,7 +3697,7 @@ enum **InitialAction**: :ref:`InitialAction` **INITIAL_ACTION_CLEAR_REGION_CONTINUE** = ``2`` - +Continue rendering and clear the framebuffer in the specified region. Framebuffer must have been left in :ref:`FINAL_ACTION_CONTINUE` state as the final action previously. .. _class_RenderingDevice_constant_INITIAL_ACTION_KEEP: @@ -3705,7 +3705,7 @@ enum **InitialAction**: :ref:`InitialAction` **INITIAL_ACTION_KEEP** = ``3`` - +Start rendering, but keep attached color texture contents. If the framebuffer was previously used to read in a shader, this will automatically insert a layout transition. .. _class_RenderingDevice_constant_INITIAL_ACTION_DROP: @@ -3713,7 +3713,7 @@ enum **InitialAction**: :ref:`InitialAction` **INITIAL_ACTION_DROP** = ``4`` - +Start rendering, ignore what is there; write above it. In general, this is the fastest option when you will be writing every single pixel and you don't need a clear color. .. _class_RenderingDevice_constant_INITIAL_ACTION_CONTINUE: @@ -3721,7 +3721,7 @@ enum **InitialAction**: :ref:`InitialAction` **INITIAL_ACTION_CONTINUE** = ``5`` - +Continue rendering. Framebuffer must have been left in :ref:`FINAL_ACTION_CONTINUE` state as the final action previously. .. _class_RenderingDevice_constant_INITIAL_ACTION_MAX: diff --git a/classes/class_renderingserver.rst b/classes/class_renderingserver.rst index ffeb745efb3..b93dd266af7 100644 --- a/classes/class_renderingserver.rst +++ b/classes/class_renderingserver.rst @@ -5189,7 +5189,7 @@ The maximum number of glow levels that can be used with the glow post-processing **MAX_CURSORS** = ``8`` -*Deprecated.* This constant is unused. +*Deprecated.* This constant is unused internally. .. _class_RenderingServer_constant_MAX_2D_DIRECTIONAL_LIGHTS: @@ -10243,7 +10243,7 @@ Returns a texture :ref:`RID` that can be used with :ref:`RenderingDev :ref:`RID` **texture_proxy_create** **(** :ref:`RID` base **)** -*Deprecated.* As ProxyTexture was removed in Godot 4, this method does nothing when called and always returns a null :ref:`RID`. +*Deprecated.* ProxyTexture was removed in Godot 4, so this method does nothing when called and always returns a null :ref:`RID`. .. rst-class:: classref-item-separator diff --git a/classes/class_scriptlanguageextension.rst b/classes/class_scriptlanguageextension.rst index 95626832068..b76b8301419 100644 --- a/classes/class_scriptlanguageextension.rst +++ b/classes/class_scriptlanguageextension.rst @@ -245,7 +245,7 @@ enum **CodeCompletionLocation**: :ref:`CodeCompletionLocation` **LOCATION_LOCAL** = ``0`` -The option is local to the location of the code completion query - e.g. a local variable. +The option is local to the location of the code completion query - e.g. a local variable. Subsequent value of location represent options from the outer class, the exact value represent how far they are (in terms of inner classes). .. _class_ScriptLanguageExtension_constant_LOCATION_PARENT_MASK: diff --git a/classes/class_skeleton3d.rst b/classes/class_skeleton3d.rst index 7537eb924d5..27ff7f69e47 100644 --- a/classes/class_skeleton3d.rst +++ b/classes/class_skeleton3d.rst @@ -359,6 +359,8 @@ void **force_update_all_bone_transforms** **(** **)** Force updates the bone transforms/poses for all bones in the skeleton. +\ *Deprecated.* Do not use. + .. rst-class:: classref-item-separator ---- diff --git a/classes/class_skeletonik3d.rst b/classes/class_skeletonik3d.rst index 74f0b4a4221..7d2b460ab73 100644 --- a/classes/class_skeletonik3d.rst +++ b/classes/class_skeletonik3d.rst @@ -41,6 +41,8 @@ SkeletonIK3D is used to rotate all bones of a :ref:`Skeleton3D # Apply zero IK effect (a value at or below 0.01 also removes bones_global_pose_override on Skeleton) skeleton_ik_node.set_interpolation(0.0) +\ *Deprecated.* This class is deprecated, and might be removed in a future release. + .. rst-class:: classref-introduction-group Tutorials diff --git a/classes/class_surfacetool.rst b/classes/class_surfacetool.rst index 421542d7bef..56f2a47cf8f 100644 --- a/classes/class_surfacetool.rst +++ b/classes/class_surfacetool.rst @@ -399,7 +399,7 @@ Removes the index array by expanding the vertex array. Generates a LOD for a given ``nd_threshold`` in linear units (square root of quadric error metric), using at most ``target_index_count`` indices. -Deprecated. Unused internally and neglects to preserve normals or UVs. Consider using :ref:`ImporterMesh.generate_lods` instead. +\ *Deprecated.* Unused internally and neglects to preserve normals or UVs. Consider using :ref:`ImporterMesh.generate_lods` instead. .. rst-class:: classref-item-separator diff --git a/classes/class_thread.rst b/classes/class_thread.rst index 263ce3a284c..81ef3e7451d 100644 --- a/classes/class_thread.rst +++ b/classes/class_thread.rst @@ -180,8 +180,6 @@ Should either be used when you want to retrieve the value returned from the meth To determine if this can be called without blocking the calling thread, check if :ref:`is_alive` is ``false``. -\ **Note:** After the **Thread** finishes joining it will be disposed. If you want to use it again you will have to create a new instance of it. - .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/classes/class_tlsoptions.rst b/classes/class_tlsoptions.rst index 7a48d4645df..383550bd518 100644 --- a/classes/class_tlsoptions.rst +++ b/classes/class_tlsoptions.rst @@ -35,7 +35,7 @@ Objects of this class cannot be instantiated directly, and one of the static met # Create a TLS server configuration. var server_certs = load("res://my_server_cas.crt") var server_key = load("res://my_server_key.key") - var server_tls_options = TLSOptions.server(server_certs, server_key) + var server_tls_options = TLSOptions.server(server_key, server_certs) diff --git a/classes/class_treeitem.rst b/classes/class_treeitem.rst index dcd799bb5ca..7238c305413 100644 --- a/classes/class_treeitem.rst +++ b/classes/class_treeitem.rst @@ -68,6 +68,8 @@ Methods +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`erase_button` **(** :ref:`int` column, :ref:`int` button_index **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`AutowrapMode` | :ref:`get_autowrap_mode` **(** :ref:`int` column **)** |const| | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Texture2D` | :ref:`get_button` **(** :ref:`int` column, :ref:`int` button_index **)** |const| | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_button_by_id` **(** :ref:`int` column, :ref:`int` id **)** |const| | @@ -174,6 +176,8 @@ Methods +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`select` **(** :ref:`int` column **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | void | :ref:`set_autowrap_mode` **(** :ref:`int` column, :ref:`AutowrapMode` autowrap_mode **)** | + +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_button` **(** :ref:`int` column, :ref:`int` button_index, :ref:`Texture2D` button **)** | +-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | void | :ref:`set_button_color` **(** :ref:`int` column, :ref:`int` button_index, :ref:`Color` color **)** | @@ -478,6 +482,18 @@ Removes the button at index ``button_index`` in column ``column``. ---- +.. _class_TreeItem_method_get_autowrap_mode: + +.. rst-class:: classref-method + +:ref:`AutowrapMode` **get_autowrap_mode** **(** :ref:`int` column **)** |const| + +Returns the text autowrap mode in the given ``column``. By default it is :ref:`TextServer.AUTOWRAP_OFF`. + +.. rst-class:: classref-item-separator + +---- + .. _class_TreeItem_method_get_button: .. rst-class:: classref-method @@ -1138,6 +1154,18 @@ Selects the given ``column``. ---- +.. _class_TreeItem_method_set_autowrap_mode: + +.. rst-class:: classref-method + +void **set_autowrap_mode** **(** :ref:`int` column, :ref:`AutowrapMode` autowrap_mode **)** + +Sets the autowrap mode in the given ``column``. If set to something other than :ref:`TextServer.AUTOWRAP_OFF`, the text gets wrapped inside the cell's bounding rectangle. + +.. rst-class:: classref-item-separator + +---- + .. _class_TreeItem_method_set_button: .. rst-class:: classref-method diff --git a/classes/class_viewport.rst b/classes/class_viewport.rst index 451cf9f4891..98af743edcf 100644 --- a/classes/class_viewport.rst +++ b/classes/class_viewport.rst @@ -185,7 +185,7 @@ Methods +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Variant` | :ref:`gui_get_drag_data` **(** **)** |const| | +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Control` | :ref:`gui_get_focus_owner` **(** **)** | + | :ref:`Control` | :ref:`gui_get_focus_owner` **(** **)** |const| | +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`gui_is_drag_successful` **(** **)** |const| | +-----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -1938,7 +1938,7 @@ Returns the drag data from the GUI, that was previously returned by :ref:`Contro .. rst-class:: classref-method -:ref:`Control` **gui_get_focus_owner** **(** **)** +:ref:`Control` **gui_get_focus_owner** **(** **)** |const| Returns the :ref:`Control` having the focus within this viewport. If no :ref:`Control` has the focus, returns null. @@ -2070,7 +2070,7 @@ If none of the methods handle the event and :ref:`physics_object_picking`\ s or :ref:`SubViewport`\ s. -\ **Note:** This method is deprecated, use :ref:`push_input` instead. +\ *Deprecated.* Use :ref:`push_input` instead. .. rst-class:: classref-item-separator From bf16102cc3f36c49429f0b0c7d40124ea2d94c3c Mon Sep 17 00:00:00 2001 From: Arpit Srivastava <52847458+Skyvastern@users.noreply.github.com> Date: Sat, 10 Jun 2023 23:21:19 +0530 Subject: [PATCH 64/76] Add missing full stop --- tutorials/shaders/your_first_shader/your_first_2d_shader.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/shaders/your_first_shader/your_first_2d_shader.rst b/tutorials/shaders/your_first_shader/your_first_2d_shader.rst index 93c6b0eedd5..63a536f5dc8 100644 --- a/tutorials/shaders/your_first_shader/your_first_2d_shader.rst +++ b/tutorials/shaders/your_first_shader/your_first_2d_shader.rst @@ -93,7 +93,7 @@ every pixel. We do so by writing a ``vec4`` to the built-in variable ``COLOR``. ``vec4`` is shorthand for constructing a vector with 4 numbers. For more information about -vectors see the :ref:`Vector math tutorial ` ``COLOR`` is both +vectors see the :ref:`Vector math tutorial `. ``COLOR`` is both an input variable to the fragment function and the final output from it. .. code-block:: glsl From ac79471242bc6ac860cda93a62690b0dcc18b553 Mon Sep 17 00:00:00 2001 From: Andrew Jakubowicz Date: Sun, 11 Jun 2023 21:46:54 -0700 Subject: [PATCH 65/76] Fix typo in resolution_scaling.rst Fixes typo by removing erroneous letter `y`. `cany` -> `can`. Typo is located here: https://docs.godotengine.org/en/latest/tutorials/3d/resolution_scaling.html#:~:text=3D%20section%2C%20you-,cany,-find%20several%20options Thank you for such a great game engine! --- tutorials/3d/resolution_scaling.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/3d/resolution_scaling.rst b/tutorials/3d/resolution_scaling.rst index 2772870d69c..38f6d16b5a6 100644 --- a/tutorials/3d/resolution_scaling.rst +++ b/tutorials/3d/resolution_scaling.rst @@ -34,7 +34,7 @@ settings in your in-game menus. Resolution scaling options -------------------------- -In the advanced Project Settings' **Rendering > Scaling 3D** section, you cany +In the advanced Project Settings' **Rendering > Scaling 3D** section, you can find several options for 3D resolution scaling: Scaling mode From c0761647f48d7748ed13debb425408520feaff36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Thu, 18 May 2023 16:43:35 +0200 Subject: [PATCH 66/76] Tweak Vector math page (style, links, more notes) Also cleanup style issues in the docs image guidelines. --- .../documentation/docs_image_guidelines.rst | 37 ++++--- tutorials/math/img/vector_subtract2.png | Bin 25924 -> 0 bytes tutorials/math/img/vector_subtract2.webp | Bin 0 -> 13028 bytes tutorials/math/vector_math.rst | 94 ++++++++++-------- 4 files changed, 76 insertions(+), 55 deletions(-) delete mode 100644 tutorials/math/img/vector_subtract2.png create mode 100644 tutorials/math/img/vector_subtract2.webp diff --git a/contributing/documentation/docs_image_guidelines.rst b/contributing/documentation/docs_image_guidelines.rst index 4476a220184..35099531657 100644 --- a/contributing/documentation/docs_image_guidelines.rst +++ b/contributing/documentation/docs_image_guidelines.rst @@ -1,6 +1,6 @@ .. _docs_image_guidelines: -Creating Documentation Images +Creating documentation images ============================= Throughout documentation images are often needed to make the explanation @@ -36,10 +36,10 @@ on how to do this later on this page. Format conversion ----------------- -The current format for images in Godot's documentation is WebP (.webp). While some -Linux programs will support saving screenshots in this format, macOS and the -Snip & Sketch program on Windows do not. For images that don't need editing, -such as precise cropping or adding outlines, Squoosh can be used. +The current format for images in Godot's documentation is WebP (``.webp``). +While some Linux programs will support saving screenshots in this format, macOS +and the Snip & Sketch program on Windows do not. For images that don't need +editing, such as precise cropping or adding outlines, Squoosh can be used. `Squoosh `_ is a converter developed by Google, is open source, and doesn't give Google any image rights by using it. @@ -87,9 +87,9 @@ Scaling down an image As explained earlier on this page, all images taken on a screen that is a higher resolution than 1080p should be scaled down. To do this in Krita click on **Image** on the top bar, and from the dropdown menu select **Scale Image To New Size**. This menu can also be opened by -pressing :kbd: `ctrl + alt + I`. On this menu you want to adjust the pixel dimensions. For +pressing :kbd:`Ctrl + Alt + I`. On this menu you want to adjust the pixel dimensions. For anything taken on a 4K monitor change the value of the width and height to half of its current -value, for anything taken on a 1440p monitor multiply the width and height by .75. Make +value, for anything taken on a 1440p monitor multiply the width and height by 0.75. Make sure the **Constrain Proportions** box at the bottom of the menu is checked so you only have to change 1 value. @@ -107,14 +107,14 @@ Outlines arrows and text Sometimes an image needs something extra to properly direct the readers attention, or make something clear. Outlines and arrows can be used for this purpose. For these types of edits Inkscape is the recommended open -source program, it can be downloaded from the `official Inkscape website `_. -Like Krita, if you're on linux you can also check your distributions repository +source program, it can be downloaded from the `official Inkscape website `_. +Like Krita, if you're on Linux you can also check your distributions repository or get it from Flathub. A full tutorial on creating outlines is not provided here, we recommend searching for various tutorials on how to use it online. However there are two standards for doc image outlines and arrows. First, the color should be yellow, specifically -this hex color: fffb44 (fffb44ff if there is a transparency value like in inkscape). +this hex color: ``fffb44`` (``fffb44ff`` if there is a transparency value like in Inkscape). This color was chosen specifically to make sure color blind people do not have issues reading the documentation, other colors can be used in addition to this yellow if multiple outlines on an image are needed, red should be avoided. The second standard @@ -129,8 +129,15 @@ multiple outlines in multiple colors. Adding an image to a documentation page --------------------------------------- -Once you've finished working on your image it can be added to the documentation. -All images are stored in folders named `img`. To add your image add it to the img -folder that's in the same folder as the rst file for the page. To add it in the -text yourself you would type this `.. image:: img/documentation_image.webp` and -`documentation_image.webp` would be whatever your image is named. +Once you've finished working on your image, it can be added to the documentation. +All images are stored in folders named ``img`` next to the page they are used in. + +To add your image, add it to the ``img`` folder that's in the same folder as the +``.rst`` file for the page (create it if it doesn't exist). In the ``.rst`` page, +images should be included with the following code snippet:: + + .. image:: img/documentation_image.webp + +Where ``documentation_image.webp`` would be changed to the name of the image you +created. Name your images in a way that makes their meaning clear, possibly with +a prefix that makes their relationship to a documentation page explicit. diff --git a/tutorials/math/img/vector_subtract2.png b/tutorials/math/img/vector_subtract2.png deleted file mode 100644 index 55893b5ac7a7482dd17e54e02dd7146eff9631ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25924 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 S|LgA*#2N7`$P4jj>3;!B)HEaj literal 0 HcmV?d00001 diff --git a/tutorials/math/vector_math.rst b/tutorials/math/vector_math.rst index 525d956dbf1..f65639c3a6f 100644 --- a/tutorials/math/vector_math.rst +++ b/tutorials/math/vector_math.rst @@ -40,8 +40,9 @@ point: This is a **vector**. A vector represents a lot of useful information. As well as telling us that the point is at ``(4, 3)``, we can also think of it as an -angle ``θ`` and a length (or magnitude) ``m``. In this case, the arrow is a -**position vector** - it denotes a position in space, relative to the origin. +angle ``θ`` (theta) and a length (or magnitude) ``m``. In this case, the arrow +is a **position vector** - it denotes a position in space, relative to the +origin. A very important point to consider about vectors is that they only represent **relative** direction and magnitude. There is no concept of a vector's @@ -74,7 +75,9 @@ pixels down, use the following code: Godot supports both :ref:`Vector2 ` and :ref:`Vector3 ` for 2D and 3D usage, respectively. The same mathematical rules -discussed in this article apply to both types. +discussed in this article apply to both types, and wherever we link to +``Vector2`` methods in the class reference, you can also check out their +``Vector3`` counterparts. Member access ------------- @@ -84,18 +87,18 @@ The individual components of the vector can be accessed directly by name. .. tabs:: .. code-tab:: gdscript GDScript - # create a vector with coordinates (2, 5) + # Create a vector with coordinates (2, 5). var a = Vector2(2, 5) - # create a vector and assign x and y manually + # Create a vector and assign x and y manually. var b = Vector2() b.x = 3 b.y = 1 .. code-tab:: csharp - // create a vector with coordinates (2, 5) + // Create a vector with coordinates (2, 5). var a = new Vector2(2, 5); - // create a vector and assign x and y manually + // Create a vector and assign x and y manually. var b = new Vector2(); b.X = 3; b.Y = 1; @@ -125,7 +128,8 @@ Scalar multiplication --------------------- .. note:: Vectors represent both direction and magnitude. A value representing - only magnitude is called a **scalar**. + only magnitude is called a **scalar**. Scalars use the + :ref:`class_float` type in Godot. A vector can be multiplied by a **scalar**: @@ -155,14 +159,21 @@ Movement A vector can represent **any** quantity with a magnitude and direction. Typical examples are: position, velocity, acceleration, and force. In this image, the -spaceship at step 1 has a position vector of ``(1,3)`` and a velocity vector of -``(2,1)``. The velocity vector represents how far the ship moves each step. We +spaceship at step 1 has a position vector of ``(1, 3)`` and a velocity vector of +``(2, 1)``. The velocity vector represents how far the ship moves each step. We can find the position for step 2 by adding the velocity to the current position. .. image:: img/vector_movement1.png .. tip:: Velocity measures the **change** in position per unit of time. The new - position is found by adding velocity to the previous position. + position is found by adding the velocity multiplied by the elapsed time + (here assumed to be one unit, e.g. 1 s) to the previous position. + + In a typical 2D game scenario, you would have a velocity in pixels per + second, and multiply it by the ``delta`` parameter (time elapsed since + the previous frame) from the :ref:`_process() ` + or :ref:`_physics_process() ` + callbacks. Pointing toward a target ------------------------ @@ -171,9 +182,9 @@ In this scenario, you have a tank that wishes to point its turret at a robot. Subtracting the tank's position from the robot's position gives the vector pointing from the tank to the robot. -.. image:: img/vector_subtract2.png +.. image:: img/vector_subtract2.webp -.. tip:: To find a vector pointing from ``A`` to ``B`` use ``B - A``. +.. tip:: To find a vector pointing from ``A`` to ``B``, use ``B - A``. Unit vectors ~~~~~~~~~~~~ @@ -187,8 +198,8 @@ Normalization **Normalizing** a vector means reducing its length to ``1`` while preserving its direction. This is done by dividing each of its components by its magnitude. -Because this is such a common operation, ``Vector2`` and ``Vector3`` provide a -method for normalizing: +Because this is such a common operation, Godot provides a dedicated +:ref:`normalized() ` method for this: .. tabs:: .. code-tab:: gdscript GDScript @@ -199,12 +210,11 @@ method for normalizing: a = a.Normalized(); - .. warning:: Because normalization involves dividing by the vector's length, you cannot normalize a vector of length ``0``. Attempting to do so would normally result in an error. In GDScript though, trying to - call the ``normalized()`` method on a ``Vector2`` or ``Vector3`` of - length 0 leaves the value untouched and avoids the error for you. + call the ``normalized()`` method on a vector of length 0 leaves the + value untouched and avoids the error for you. Reflection ---------- @@ -220,17 +230,15 @@ other object: The surface normal has a value of ``(0, -1)`` because this is a horizontal surface. When the ball collides, we take its remaining motion (the amount left -over when it hits the surface) and reflect it using the normal. In Godot, the -:ref:`Vector2 ` class has a ``bounce()`` method to handle this. -Here is a GDScript example of the diagram above using a :ref:`CharacterBody2D +over when it hits the surface) and reflect it using the normal. In Godot, there +is a :ref:`bounce() ` method to handle this. +Here is a code example of the above diagram using a :ref:`CharacterBody2D `: - .. tabs:: .. code-tab:: gdscript GDScript - # object "collision" contains information about the collision - var collision = move_and_collide(velocity * delta) + var collision: KinematicCollision2D = move_and_collide(velocity * delta) if collision: var reflect = collision.get_remainder().bounce(collision.get_normal()) velocity = velocity.bounce(collision.get_normal()) @@ -238,7 +246,6 @@ Here is a GDScript example of the diagram above using a :ref:`CharacterBody2D .. code-tab:: csharp - // KinematicCollision2D contains information about the collision KinematicCollision2D collision = MoveAndCollide(_velocity * (float)delta); if (collision != null) { @@ -263,22 +270,25 @@ and .. image:: img/vector_dot2.png -However, in most cases it is easiest to use the built-in method. Note that the -order of the two vectors does not matter: +The mathematical notation *||A||* represents the magnitude of vector ``A``, and +*A*\ :sub:`x` means the ``x`` component of vector ``A``. + +However, in most cases it is easiest to use the built-in :ref:`dot() +` method. Note that the order of the two vectors does not matter: .. tabs:: .. code-tab:: gdscript GDScript var c = a.dot(b) - var d = b.dot(a) # These are equivalent. + var d = b.dot(a) # These are equivalent. .. code-tab:: csharp float c = a.Dot(b); - float d = b.Dot(a); // These are equivalent. + float d = b.Dot(a); // These are equivalent. The dot product is most useful when used with unit vectors, making the first -formula reduce to just ``cosθ``. This means we can use the dot product to tell +formula reduce to just ``cos(θ)``. This means we can use the dot product to tell us something about the angle between two vectors: .. image:: img/vector_dot3.png @@ -297,11 +307,12 @@ player? .. image:: img/vector_facing2.png The green arrows ``fA`` and ``fB`` are **unit vectors** representing the -zombies' facing directions and the blue semicircle represents its field of view. +zombie's facing direction and the blue semicircle represents its field of view. For zombie ``A``, we find the direction vector ``AP`` pointing to the player using ``P - A`` and normalize it, however, Godot has a helper method to do this -called ``direction_to``. If the angle between this vector and the facing vector -is less than 90°, then the zombie can see the player. +called :ref:`direction_to() `. If the angle +between this vector and the facing vector is less than 90°, then the zombie can +see the player. In code it would look like this: @@ -349,9 +360,8 @@ The cross product is calculated like this: c.Y = (a.Z * b.X) - (a.X * b.Z); c.Z = (a.X * b.Y) - (a.Y * b.X); - - -With Godot, you can use the built-in method: +With Godot, you can use the built-in :ref:`Vector3.cross() ` +method: .. tabs:: .. code-tab:: gdscript GDScript @@ -362,6 +372,10 @@ With Godot, you can use the built-in method: var c = a.Cross(b); +The cross product is not mathematically defined in 2D. The :ref:`Vector2.cross() +` method is a commonly used analog of the 3D cross +product for 2D vectors. + .. note:: In the cross product, order matters. ``a.cross(b)`` does not give the same result as ``b.cross(a)``. The resulting vectors point in **opposite** directions. @@ -371,8 +385,8 @@ Calculating normals One common use of cross products is to find the surface normal of a plane or surface in 3D space. If we have the triangle ``ABC`` we can use vector -subtraction to find two edges ``AB`` and ``AC``. Using the cross product, ``AB x -AC`` produces a vector perpendicular to both: the surface normal. +subtraction to find two edges ``AB`` and ``AC``. Using the cross product, +``AB × AC`` produces a vector perpendicular to both: the surface normal. Here is a function to calculate a triangle's normal: @@ -380,7 +394,7 @@ Here is a function to calculate a triangle's normal: .. code-tab:: gdscript GDScript func get_triangle_normal(a, b, c): - # find the surface normal given 3 vertices + # Find the surface normal given 3 vertices. var side1 = b - a var side2 = c - a var normal = side1.cross(side2) @@ -390,7 +404,7 @@ Here is a function to calculate a triangle's normal: Vector3 GetTriangleNormal(Vector3 a, Vector3 b, Vector3 c) { - // find the surface normal given 3 vertices + // Find the surface normal given 3 vertices. var side1 = b - a; var side2 = c - a; var normal = side1.Cross(side2); From a86f24f098192e3e40bdd569937b2eeadfcc059d Mon Sep 17 00:00:00 2001 From: Curry <72790869+CURR-E@users.noreply.github.com> Date: Wed, 14 Jun 2023 04:25:16 +1000 Subject: [PATCH 67/76] Update spatial_shader.rst Changes WORLD_NORMAL_MATRIX to MODEL_NORMAL_MATRIX --- tutorials/shaders/shader_reference/spatial_shader.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/shaders/shader_reference/spatial_shader.rst b/tutorials/shaders/shader_reference/spatial_shader.rst index 007764162dc..995196cb01c 100644 --- a/tutorials/shaders/shader_reference/spatial_shader.rst +++ b/tutorials/shaders/shader_reference/spatial_shader.rst @@ -217,7 +217,7 @@ shader, this value can be used as desired. +----------------------------------------+--------------------------------------------------------+ | inout mat4 **MODEL_MATRIX** | Model space to world space transform. | +----------------------------------------+--------------------------------------------------------+ -| inout mat3 **WORLD_NORMAL_MATRIX** | | +| inout mat3 **MODEL_NORMAL_MATRIX** | | +----------------------------------------+--------------------------------------------------------+ | inout mat4 **PROJECTION_MATRIX** | View space to clip space transform. | +----------------------------------------+--------------------------------------------------------+ From c0da76caf22e1dc1d8db8b4d164c7d5ad339e5f4 Mon Sep 17 00:00:00 2001 From: atomikf <31524861+atomikf@users.noreply.github.com> Date: Wed, 14 Jun 2023 10:41:53 +0200 Subject: [PATCH 68/76] Update multiple_resolutions.rst Small typo correction. There is a line "Set the base window width to 720 and window height to 1080." It seems the 1080 should be changed to 1280. --- tutorials/rendering/multiple_resolutions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/rendering/multiple_resolutions.rst b/tutorials/rendering/multiple_resolutions.rst index 7bf8b783c89..563f2a37a24 100644 --- a/tutorials/rendering/multiple_resolutions.rst +++ b/tutorials/rendering/multiple_resolutions.rst @@ -363,7 +363,7 @@ to change the display orientation project setting. Mobile game in portrait mode ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- Set the base window width to ``720`` and window height to ``1080``. +- Set the base window width to ``720`` and window height to ``1280``. - Alternatively, if you're targeting high-end devices primarily, set the base window width to ``1080`` and window height to ``1920``. This allows you to provide higher resolution 2D assets, resulting in crisper From 468b12c5f893f80a38964beae68e4b0c4621b79d Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Thu, 15 Jun 2023 08:00:24 +0200 Subject: [PATCH 69/76] Fix references to XR_ENV_BLEND_MODE_ALPHA_BLEND in openxr_passthrough.rst The code example at the end of the openXR passthrough tutorial refers to the `XR_ENV_BLEND_MODE_ALPHA_BLEND` constant. That constant, however, is not accessible in the scope. Instead, it is a member of the `xr_interface` object. --- tutorials/xr/openxr_passthrough.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/xr/openxr_passthrough.rst b/tutorials/xr/openxr_passthrough.rst index 48ca11196bb..d8a1510ba5a 100644 --- a/tutorials/xr/openxr_passthrough.rst +++ b/tutorials/xr/openxr_passthrough.rst @@ -57,7 +57,7 @@ This will return a list of supported blend modes for submitting the main render We need to check if ``XR_ENV_BLEND_MODE_ALPHA_BLEND`` is present in this list. If so we can tell OpenXR to expect an image that can be alpha blended with a background. -To do this, we simply call ``set_environment_blend_mode(XR_ENV_BLEND_MODE_ALPHA_BLEND)``. +To do this, we simply call ``set_environment_blend_mode(xr_interface.XR_ENV_BLEND_MODE_ALPHA_BLEND)``. We must also set ``transparent_bg`` to true to ensure we submit the right image. @@ -74,8 +74,8 @@ Putting the above together we can use the following code as a base: return xr_interface.start_passthrough() else: var modes = xr_interface.get_supported_environment_blend_modes() - if XR_ENV_BLEND_MODE_ALPHA_BLEND in modes: - xr_interface.set_environment_blend_mode(XR_ENV_BLEND_MODE_ALPHA_BLEND) + if xr_interface.XR_ENV_BLEND_MODE_ALPHA_BLEND in modes: + xr_interface.set_environment_blend_mode(xr_interface.XR_ENV_BLEND_MODE_ALPHA_BLEND) return true else: return false From c9a72d06e856903ea399dcbc1766792c463bcb3d Mon Sep 17 00:00:00 2001 From: Bruno <88297220+br1trs@users.noreply.github.com> Date: Thu, 15 Jun 2023 07:58:31 -0600 Subject: [PATCH 70/76] Update Tween cheatsheet to add TRANS_SPRING (#7464) --- img/tween_cheatsheet.png | Bin 151346 -> 0 bytes img/tween_cheatsheet.webp | Bin 0 -> 322238 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img/tween_cheatsheet.png create mode 100644 img/tween_cheatsheet.webp diff --git a/img/tween_cheatsheet.png b/img/tween_cheatsheet.png deleted file mode 100644 index 36028573aedd5a5697b9537592eda4395681617c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151346 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óG6q0y9oP~bM8nXG%GS*;1_)< zMsj0v>o)P(1A4Y(!f(y5=kOmC|ICL$SxaK9aU7zCdFXlpN zOS@k?ukEw06366q^p}9OAn^rtht06=Uu>=yw!eK7$DW;jJ0T=MdGA`@RQRbqCQF6y z2>%@$zKn!oPbq_`bfW~$$Y7ESbGuruLz=U)22CPo?^R0L9OdMc!{G=0!gRXtidmSw z$25&%JczH?$WJwb6QHRK^*;s=4GB5g!IL?>EXWF3f4Z{rY+{aj>-me=Y5PMatHhpR{a~GZKv*?rut^mSc$#X?k$r&nv zO1@=Y==INoS`n3k7dxcCYZ!nv(D2X89lbBB*KB_%wkI(rBe`m%x@dbcL%xT|M#kqD zi2hosao=|RvhrIg;jA>76IQvggGRmSX-6{2FeenNA~gqMo{s*Q61U0;M)b2&NTy`% ziYfDK5kriD4$Eiz?8Uba!+*T@+qN9c`lwpeDApq>D9JwLNRfwv`ki*raw7G)aXm~x zE(>BVcC6*zijiLl9`t%Bpne}G5d5tDvK~o|*-J=Bh<+0H6A7(JH`{nkLc^W2b}}3c z_BkM(sZ$HPQc{+jRyVI5AV#12(=d3mAnWyfS2*X%%jPJ3g2NOsn-8drNPJ*fW!g8k zAGSNC9Gv`1urkYu!7k3YQ6yx^1|i?GqFcFRu#5kp(Mk65w1ql{H=$D~CDzo8^~S&Z zS>q#@KunR>el~LIy&qG#XqxlJ;sBBo4rqVAuhZDZE$}II7=eM2=!kN>2jG zaNz%1Z-DuR>ohA(T5hfihOT;y@mdH##>-@C7T>~Cqh6#;!suMvRPCQd z&fW;avwgo*t?KF-7`Ch1Lmy)-?}}n`KM?Y1Y|nx&MH@f9D_EpX0|+PAv}xB&kcOVv5-SBoaR_6A8^lo)dv)>AP9qUhK3kpOD;D6J`Z2 zw4aR~4_D=FdV^p=ZJp5L*K&XH=qkS@@0H=oQ41a>GluT-Xo7HKRNlh9t49a2YTN<4=@LB`e^ZHmXxw>Lxlyo&teJ6W&?s<@_#ASNlAz37X$3#06 z8sDTfEt4y=_s#yp&e1F#{at_W$icnN1`EOTfmGN%wQ|e9h*oa;&q2(ZI#F~el^G%Y zk9h58%cZK3Fu+UR(2W7q6*nzZrFdKF)@&5UEheXY)(ee`2Z|O9r5KXkT#1%?vsy8& zgvNaL*8)r@5z;Uwc5Wla8iF$_jpull0_4gF|1g6R7G^E6*Z+jHT(AeKJWFr||Tiw~myzAR+19 z?cZG^J`96u3;#w35AJ1R=GLYDP%EHi6v*hPnFUVKVef)i`xFscnbn|`b^K^gha-hJ ztB}fwbhl(RUyF{XFWNIFXsW2hzlPbPbn~8KBlvVn?Y|j<{~W!h z5^r#1^MoQ|2bR$#ati9FG5p-gWKg#E-)2xYr?y}(P&ZDeC;@*er4J|2nU9xO${{^E zlZPqThxR3wW!N!~V!yYF0Kc!>QtcNQ%cwly>_{y*$deN}e>5sQR(5;& zgIoT@u?!C<`kGG~zA54UF!Kxd<>~(JttOS@MpvNC$9`kRPoGAJ*HRM*)GQxte#v1L zGSrlTd$Jjf3ZNAHEy7>}S05|G1?cMD7Ky|Ic>l-b&eJMfxH_G|7fcb-0q6#;7A(%l z193TG=n0bP47%2(R?bqU_*Jgo5+SxXnR-TwL}LWU-WawqtjRUlPV zaF86F1BSwL@s-i3e|3FbZE`{YyvsKF`K_cQsooOZ^xMf4xf?6niCYG%Z`FP=Rniv% zZPo^_)J)IkK|Z{x%H~YxN!|SWZy4m5C)tXm_4m#>&vCFfn`AJ*&!r(HaN;>qghgcv zG79CNNV1M66AG1B!4z^3Fe!q$k8?TRaF~UxnY45ARzm4*_R=tz+l4HcWiS8IkLvIP zWSA2cz23sXM2b?^SwDv&&5wA!PgGd`koqdzoix-98yOtY_Owz5`XKhWk`3OHwCUtQ zs^O41`mpeNScp?uEipZnr-JVn$z^7)uvrvu+F9I}mEijydD$nQ&p%_?Pcz}TR_fEV zGg!Ipisr(pc;+q~5-eM3Eb)JWqMAFewH#CNaicy;vxlm$jwMlMexWAY86_jVnd`6j zrYdO2gn@{^k*1h>xsElu(0|6As{h9d;2H{Tm!D^)G_l<+-%$h+4jd^y>zkPsI+5y? z1vh)5fj+rGG(RPfe64k`MC||59w5I~vY#{yB4Ib*oulsGtnHTSL@njc8PbEtcb=f8 zpo_Hmi58r7WOc;EP-@Y}eA;~V%3JICj~`AzFygDl?VA%6YnT-wZxJI^3`c)Ok?o zJ8MUxcsl+9?G~tGRL*&rre4YG`Qc_&uYg|V@H-^`j(4MTHpmNkrP{&(#^nsvBc&fr zy#qQ=9WGyl*3HQmOF&X4tUtB+;8yB@{;0)Esu{NtR=K%HV^wqv{&PgU7eK#}l||Ci z@;w@xBI8Di{Y8HN?&^1Vvstc|SPP4{sa5nPy%GcdG>GP}nvQEBhEw7=m|+pcd$&y< z4yXaI^peszkw{XKG|Br2kffNE<0qQ??Sdvu(TmptQBV+%7GQ`!;+iGs+mnVe{40U6>-6{&UDxCV;r0M{e$u8qZb}M8yY_AwA-63wr}op)H@U&$){p zS2oyhs&F#bl?dC_9|dmZ_V-ifM-GTdi=V5&hy0#WwLF8L+s<`YfvyapR2Lq57V89q z10jWIc(cb3+mV*=Da9|!c32J)TTBIK!)2(p?;20ZSmYb!)n553(e<8yQCOD#PJDnb z;vU+nA|xI-ngj&3VGsj=OygbsDxIS(JFEM5cp-x}?@)ZF^6NiBD_|5-49_fJx$!>Z zEbet1>?Sg)kkmxQ+flp}={dO#-J#BaHYsFW9+e!525zewe$(h$-zgyJ{V26h0i^fY zqEt^j-rt0kk=7VUu#xRsc8EH=a;B_V_&bE;6;(X<5&57^KW61gC#N_hpA~hBhybY3 zfpES&ym>GuyL1OIWiW)Fa$QjIy=!M&S2S_3^A15Lg-B5*9%*elsU{08|4S+*Jhx4-T5GiYQQHGbpJx({v7}vMZkltc7lZG%&E#h zg?cs8d{%!tUcD5xLArhO0d9gFQNxeOTZMirbaGarm2So?w26~jc)?|5%G4iMz@<`W z^4lQi3#tP>-$lnY^Ojj35hwCHdnbziRl7D0oZWaOZV)@kCrKxh+A{RuWy!x^F_?$s zVA`&cFog|67tN0|d##Qp@81*q^0gv)6APsC&=D-7N5vuW=B^3;j=1;r_;CCul{hpc z_;%_qR09qUMBV%IaT-_Jo8>0VMm~Z6fZNFSw|_5xGOb055b>r`yoMpj^7;fB2ney< z4$I~NIPqlvOSQ{Qi_DljmKuyH1l4*mK#i$6A%HYZ5;C@}z)&+UI}PoHA`Ogy5^a@K zQl?%kSCTGvT=Sq*)msA&3DCP3Xx!;+xfGVj6^+ISfGe(gWThqly%N~`F+TpM0Q#Eh z#)f!+Eo+lgLdI2Za(&)tK4R|z@1~6wn3-&>{R@x84SkbBNuH$fz`zs27Mxb@lXjH?RXzT0Fe+tVd!8V4JMIrTgJpp{PZ#ODd3_;jjvin#)?nsoFr<19Gg@#S@{ zLq!qio_5acM}w(v`DGfKtfVe;pwM}cZM;B8dl8F;0CMR{LVMD~cRXU36qAA09x$nO z@DPrqk+KqW1puL0Cvj%l>iH9zblATH7I@UwVk1WsTLh+n3JDgM=ggY&c)+_DaY zDa{nTTsX5eX^s+0RL=bAGs%quwQ&CSm*J+!H~zWMk`31Wg(Iu=POrDOT9EKj9p(pl zGL#YPnEV%??%-k!S|E#gLHz&PgRe`{04?ct9`-h>t<+ITIID7h1M@=sx)K=~t9^_q z|H}!(=yEil+=HAha?f*MX50HzYUQTTv3v|%HSWAvMS_EoUx#~N*K;8x;J>(FM7gRz zf8vTu0=~`wt&ywTA>=anZOK>$ujR5=9Uv3%`CdA{s{*I_SBZ&~Bv(u?cg1SqWBxc8 zTwB$B*xnAFpyYs!=q-Ps4j4lkA0d$&XQw0B7bTowzUF3v6*-(b>t&?Q96)pcdrFEG>O zJpgP6f62u2IV%XfZXjm`d5fY{A!;aY1mM>$fQ8t+=y^}CaVYwsFk#jpX*e1d!Lh?e zN@^UiRcphSbO)E9=ZCQ2aXrEBd1%I0E4FsaIZ&lIp{%=S^w0j2H^7v8X*5Cl=F*Mo z%4K{n<`m2_c9FPhoA}NLQ{*_$fi(@m_sNs020bxI4>W6~oSf9ir|hs1sk?H~DkJk)a^L#(&l8_}DlX zJ=TMPQBZ6$zR0;Di4p{@Ys9}?S=fe`nhPOO(6fduSxmsNmW!IMP|36fshhc_q@$O2 zf9RJx)!&~@HvK`nMx`dU&xEI~k%3R@JQRyxC_+KuTozx%;r3jWEl~oFEb;V?uTB{q z*gI&`bTY9Y5YRJL-%hRYd7;yi?6!^-7oRXtJ#uB4zx}}xliA8 znU#;e(38C8ELag*^j>}2UrsWua}&8-mxG}Fyd--yAA*R534k4^ux9&XSiu+_)H!&GgR>X z9VT!VzRIiq^i~Yw*}E{l20mt&KS*m`+H|+HA*~DS+t6A!$UX#Wz%O3^AsA}i-`qw> z3pwJf2c+4KtdAbh4TzXc>AN4Lt&S8Q^4p0~kWyQYbLvqb^ljLP+CqcUX1-!CN?Xiq z4I7cJ#K-!dwQ-h-)3FA$3Ok|!H;4kUS-#;%+X*F{3xI()>#pr;)EeJyi@`{!GPAz4 zYCzL zzgJ=1=AGEXAo85wB8aA^-P)}3b{+&(7;-32@73Zbs1`y-Yx^c>S;R)W4N`xOd~-83Z7^Oc*@9`zKfcc9;Sgzp&$4&4H}zMSrB$NZAnBGZ*}d zz>(2On^pcMK|p31$dWkh2IheA{Cr*vGYetZkC2u)e6`(d)MkH_C5AQd8P>JkEI)^U zISqw=%Yk20fe{atdc>(NsK7ro@)Gpx&K}y`FENM}q&oh6e|xt(8F<(x9b;1Z^NcN0 zO0pu5EII4g#{2EeS#o`R@c@Kb9V#mGhJ@8c^$eTpW47RupHZ) z=nhyZ*b?yP<)sw!vv}L~eVC+~l;&U%Ch(>zR=Q0!gB9zP7i#5|D#z~Gd3Iwmqne${ zZN1`Bq$hN)-)Cb;JgU10dwa)d&qbIw=tGmgKqmL=_2^nD6Nz1EiU;FmS(6h5Zg1#I z$THf?EC{B=hUeA}o_PAQ(k=Bx9#*F3_`2r%Xr%)Ve=d4|d0MVJe{`dp2UX0rusB(W&qPiJb0@Pki&sCRgON%x@{Z-I` z&?B|N1h0VU+z7h^8TS#&b+zler}v#V^;qLt72r=~jb<=4o>R%7D2C;MLtE#P>8sP9 z{C(10B>{NKlo(3vF?UJO*Ar&#NlJmQ-n{Pc{xy9Bl$$y0jd(TvQhFhgow4d;)CGzr z4Kh%xfJITls9sMbsR<|&`;0`w6O`hrxo+5UdUX5augdVIRw^&_D%I|v5J|Qhc|-Wy zZ?n-(asQMASS_6>q#~38Jw!GHfni9m%GIdBfGL}_V#3CQbAvLBCNl1j zy6aavcE6JyvocE6`?Q#&{fqW48@Jx)y)HK|lc6Ll|^ig%+$6tOzfqqeNOezBIp9 zH>w#xxV-4p2x7n72D+4$jPphbuevL=$$DBt9W)qE)Blg2r1QQho#82w4JGW^E zuLOQZNF8eViBf9kr2F=CQirL0Ze!nm1B<@jiT17Ry>-FoDj?CH&H-AnvBjH!2vX!m#uPro2s_@AZPZmz-vhKiC@sg6dzU_ z>``)8j!dqJk{>&jIZDw}6UI4YQEU3E$#O98UNQn1C_d{&jF{9r8=I`pY5K0N^ z^vJ_o&P;Z62TNppHd^mS0;yr>q$7lPWN5ZKUvdreKw>b%pRs}9L1f5I~Bkb)-6w6N_ zBTge`b@!egh%;ei5)B-7`99dXyD$d~SQOoHtz@sugHCE*dyq=mqowY`9xX@Spw2oF z2#FM-bTkfpFBphJ%kQ074aZWOG)a$admTCpdi5ov(E{+qc8;rRx!%=$spXM155oC& zHk?Rt*p^Zb<_N8CAOfF^pL31X_w(r%_A@Bjlo_5YYHb6aHM)lVqm$($tfr{-&@9Gq5q6()*9A zta1L$0KQr60Lm4O^iZ!$Z%c7Kqn;CmUL;y`QIa3-A9^i!EJ4wG+TsYF!AE8IP}ShX zC(ThoFk*S52d+|5oFby1a%`zsRNIyBkuq1|pxUQ${z9j5POC5gg|$?c=-Al`aJ*JH zb#5y-3lxUuU1mD9IAIvJPbvOZez)#OFHG>l!^_o$9Ew1iFe$kaJ>(Z@+!)>*e8EQ9 zZ$+61fr(7xk(DqJ*~`E|i|7u2-+~8M85#Q>IF(E9nYeKsVAoy;Q_)>Nj@`N9&_rNN zMVQwlgHvIrK1Fv2j`?!UzK7^m3@14jg7_6)F9my0UnqB@}adh`& zV^q>0Jrh7>6|P8;o4b08Z=wY&6*$}nmGfjcQiMz8WCzI%mj%JuS7Tl26ai7t*NFy0t8dylx$WNn=cA|q>z==~|90B= zH_UQ}7wsc$YZnZG&qe2;5=p~;$}(}#*TRU8&i{^=zAEKhx4NMMO)iY;(H)sar+i1{I?cvBNwK zXnTJO`~7`NpoBiWLiSlPA~sx&blHbc)WM9j)BN<~9oG}*cyKCyA?j(+w*=)HT>cxh zg5lc(g>52ix38FBlO*dOsz!t*u51Nbd3v*(K|SDWL8wavv_=bcLE)gJ%OlTyI@IfJ zE_!m{0{L5?AV!g&-R#^<%Sc>Sw);Cu>2i!Wuj!bajIENRuh_gg+&DU8XQknKO0tVd zR9EjH?em^_md|>;re5!(KNY&XgV3LP{zVYy!K-p zJ*#nE(*#@WeF>$~Xu=7aM#U5a)MVag$NQsl*_>WFO@`3YqUAyLPuosc0V#8Sc;b22 zyhni^9Y&15F3Y_{&(M>)B82oqu7S=ofrDy#0AP~%M{@D~?@Pq&ZVRA+#=m^&Y1?)? znYe#`vvw1o%V}h5gkl8kZ*?6d)m7t-%FWG%3#jJ_6bL8}F7B}M-}o2ho?kxiicOt3 zTV^PhDuP+v&pe>F@V!ewnDX>&`Y|Xg1=KO zwwXFpL}a__SiEfmcGZ7^oUu+dGRS=VI4l_1*bhn4t^dZ$9!Dcdt|8{*9CnEoriXrR z;jswvpJqyPU8S&iS=)Z<+?RFMRwvMHZ#b5cHM&JlRmfxT5)T3aUD`?f_{fG zGckD-B&og;My)!s5k6H|L0YWJ^p$4gnoUHSf!I}pm$EJ;Z_J-QoX)%j->Y&#l01(D zvjcw$IV`De&?itQx~QV|3OJ?7d*@BTMl#eYNd^D>mYT@4kj{doyi03TWCNC(6>zpZ zr-yZot!Nb|ymFz??T%$AHQUp)*&0}bE`wWZIR(y|p>d_LD=%ML6UCnVC_dQ>3#fA> z-WE|p7-jU6;^PyF!4%FWv(Wdf#>yH)u1hTLp(cKThs)RZ`Ks-krnW__f{ru3!zoNb zRm}cc=YenW7g&NB0?7+nZUVT>z+&e3b#`EOQy!9+N85N_Py9aC8Le0a2Am(o$z#XW zXL<`EM*-#96;-UOskCb zkB)&>cgRSTGFFfLiuQWba3tBf{PcI(UnO2QVm)z?KYZ)xv|5QUeP?qOsSwz8)v!=Y zu-c}fnn)Nc|49qHYdL!ecNx?y4aGfAzBDl>L7ZOVx2K; z`CMVhYV6U=>6FiMs02EVZFp{eSq{H&O`lMDNouRZuxqq7z$FG2WxjVbc;ED?+3HN= zbe8>JhGa9eX32T-PX_sUF=4VmAHuHmOp$oPwHuFU&6DGG4%M~knR>C@RKumt+zv1I z0OF@&aF?;Rj2D6sgM0gzZlS-frIkexPKR6dZ-i&s<>)JQN+f9S8yAlH-{?Y;AZHtb z2Ke7#9V5UK(|y=Ap@NK^ujRIochw9y7eC5Yc+j|!Lc?6fat&wmkm9Ej7@LoKsypemZr70D{%OsT_FZ2w!Neab%lV z9F;c93w&?&y&z{vBg>#=XgK{bPmjpm6!L+-6F=UVszV)@NCHZlJs5F34%kP@3J6d2UsjcBV&5ODy7+V z$jj804@ip-Pkx%Q^?)18CuAJn|uhf9+9{4R#Fc7b`GgDU0>JoS7Mw#-=Fq z_ej*q%CTd$s)m17M76zqZ;0u+b{*@lq{mt;>M+s@`UMGG-+Icnc6D+)z($4&?VaF? zQjM??*oTncHMLJ|hHwnDAP4^*2+EH597%(34vU30yD9PX%C_r=;5XyZ*n+AT<=Eo` zE?|V2S?HxY)euiqoVpFzQ;56P@ZxMNTiCYDwI8OBbcJN*m=(1HlPF7$Pi_873d-Qx zMH@%&b{1P|KOett*{_z^vjqQG(}oxM>_;^krjIIIO3^TyCzbw_)M%5JR=s4h|6EY$ zc^mMM-*)dHiM}!H4?V!!7grmw3jxosC3h_C-HCK+5G%+JCd#E@pU@>pP=Af^f`VFS z8(Zd^ct*QZZDi}gYCG2NO$_w72Zxm=7bOZrrLbJ!?(;a8^CapI8yP|h(N+RM`o}T zT3>Je{4hPz45e~yRA_)@VeDpnipTHjt!li&Y0NlWde65An(W}!@6w(*o}Mn@7(`MN zl|$c>77fB#29fEw)QK*A{S0Z4D#We=->TmwNmI!$TUXpDfjDX?UwkgOxRh0>UcQup z?OcrGtT3?KCfeCrt>@Qz-x>COE^k6=1jCM-jrwiqKFi4Lu<%vgdm*f;C4X=E zB@KEO*R+t46JBQwB`u z5kCRQ+4N+`!xI&>l5el^e)iQqJ63=^b#_1sQEXdDSozjBX(m|Zdq*ajr?j>+P1m89 zM>8-chYMXaYx!}_x?b1o>Fd7TEt_JH_}gd*cAK1bixyyKh|4IDO>H}ZDQip?KFavh zbjHOR!o3hts2k%l&5o0Cv$~And*he2B4ZoNFk-nOSk^B~oaealJJ+0f67H0{czrX> z)@XYMi66#n&Q~fMhHD(Md?#!yTJ(weN!tC6b$tZZ5c;c~v5>{?`puh}Phf9tvHTE*)dZGcQNMFT zXR)w13!tq>B4RYGHs+SURW0s2uKCU@E=1)2e?eoVee>y3bC(ppdfjpx20N~Y&+hXK zO4MK5KcK-a0-CtcWsXkW| z_IgexWfO-TIGy<`Y25l#!#S*A_LYmtrjGOMPp4PTZ@Ka#F^?1X2WQ)POj8;^Hd253sn@(OkEgZG{pO zI;M8_xGg=jxpCE!GSX?+`TSGR`Iw#Ue#F4!GTC%(MgNt9oCe4+ita*hmE49t5OOM` zHAD9qzm7j@SP*FUtf#Yl4HMEB+_s&SKwrDj;Vsp5oV&TTD^zz{j_#P|AOhQvCeA>elYq zWkptKth`3DRYabPOa@?G(nUc>1p@XSO+I^fYecUb?U%F8{RlaR+RWeIjhCU_1Ety< z1sp-QwsCjyNEljhwt~?b(m9sJUArf=IfsZFiwn1Mxw}dnBu-x!C*{x#Ql`)T4LcWI zh37&1mv{3M!=8bYl`ZoL{msy$3=Bv3*)!4fdUbWp-*uTney5)dxEJN%*3%6WQ{E9+ z7Qdy-D(2=}S3|r%sgtv{6M$pxCDRt`LqSYhKE5~>tWw!DSa8g2Fd|bJm4*qIr#1sO znmk39s8{CEoHeC&NZ7m{R!NZg)i@C;nD!EvcBo4itaV{<|1Ffes+pVRbNcfFmfaZO2gT^qsq_T*Z+pgLqv2_40%Yq}#Jp#K z=d?jvpz4wL$OMM)OYAmd*35Stk4#$4Fp>|HOawJw4fS}#!(d9YVS7y4ct>_pLlO6TqRZaq%+Pv{c;Yp*v&jm zLj668FmGt>eN>OlaI%|qD~jl|jhJx9L|s}1MH`f=aVtLGESCBkD;@w>m?=g7H9Qj$ z+BH_U zv+|M=&%5I%35M|2i8OLaQOe1>Yn3hOy=V>M_`oeyzn60TugY25u@3;R+qG+(?Fu^n zmA3b9c<0Q_QC(vJb$8i?rxbgE2(#xdYeBf+>WThTxRj_tkH|HVOCJ7yu^vEA(*~gftx7LT{(ED zoNspK-I-+L2h!Maocy%?u|=usNL%!QsMz5iT)Pw3c_Znns<_H+>PFcsnG=}fz2zg* zMrUpdyEuByN~kow`Wjc;d1lnEP z=oI9~=9hm%Yx)K=9X&FtJ!5my<&*pby5xcxLOfXH@@|QZfOAmb`fT}|`qikVA)Kd1 zf!s*;lIG|^?3j{zQ%f5dBD941)S-o7vW_i)9H{Dly1riTOwm?Wf{<%Wj=c(T2FPX@ zS=_BDg2Th`F9JmqVF2R`I8zWp$uE)!*1A`zn%c>L*!qRJn|l!PQt+>F&-Fu6W`CVi zz93b3cNnls0)C$-=m7%05~K3H4NpDzu+q1>GY`@*wyNK8IjHPlqAy~#VCaZZVT0~8 z0qvdCPy<04*tZ#Szr&)jtFQQ&cVg#5cMH?yuGns_kHSILUK*KGe%%cy-`|Px>)Qxv z@7S!|EM{)j_!Q38Okmz)?k+eBmX&Xo_*eMcW(zF$b&(qB8u?_r zVec(`=D~8IaJwr@+&FF046LsQ%MWe<-W0amlRBm}Xl8>`#c6+Hq_`ibtrT=P@1m6D zm>I^l;&esd;+VgG;5wfUWz4kEhujH4IKP(WRw7o8+sL*IVvifg#Kj{t*)cjB^+R(p z(l`Dq?gKpe85C9PJHzOfDJHZ>RgwL+n|P7&8DlJ_2Lb1n3qR=2@iY@9ezcF2u@ z@Jv|)h^&QiUfmoaMqgbZ(bSbe2l;C?eHTZ}>?aTnfn6NCe@h;8M(aaDtMnSo@wXoJ zE=R1l22e89HL=pUf4SE6Q9kckpRD!7nE~~<2ZLB2@j83uA&n{obvz>D#b!|iQW_bb z0ZEOTzj?;+UUSzMbfv7r#m;elmw}uUmh#}GSpZRwhB0j<4gE^nqAYM$M=o`rEFuBh z)PhGMrk4DcvV4pjjjg~7tPo%rm1~2^-TsB_o}KcrAxez?Qek04ELq)#zy|PBoy5Xz zTy|XBBsYq_j{>kCe%DA!j9d?9ulp4Y^3%-oi};*9GY?vSt~%|fbcv(UJ$&Z=N0NJpQkGIf*NeA|Tj|=-{W0#YU;9 z`+!^CNU)WkTy|&4dq*mxm)~jq@%EW!nhO|%#joQQ4`1qlZAzcPw9$~WCC}qU7i+tf z`?RMLASPuLSy?VX+doQTs$)rm|K`)HO!2z!9ctmUCqX#RplRNk7%eH z#!=DzZ4m5G0)DFL=#x}G_y`PSRxGl&tZX$nfQlohKqNQ8^5@52eBR(O>Hq%uoMeE! z%I7uck{wIY|KYR@Z(v6WRmfd=>n|qZEQ(%9`fQzJ4foQPg&X>}_MjDF-!@R-34F1`-e(VqKqZq74b7$*h+dlyT~u2@9dsmy1&?odK;Mq^ZW?wK@c~RWI(u!^g4(^ILwI|5^mZ0iRm|}UNc9ac2EJC7cEy_6U`n7tVm)uVwnM=Xnm3dC!Os?hn#uAUnYNrms>{krQ&En+K z&z0tWhZ?wIhdnNU?9JXq^3bJmc6x!9L1+~7o&pec0$>RuR|%-ZfWeMfx|tye`^G@; z?WsYYfPgyBvhY^ih&74_^15l? zVXY&UAI;Frd<4%x?B(&1V5QN)-tD(=@SP4$=nL0P9YfmBd#alh=k#{Ijp&Tv1LvXTw8-4wP* zH%;tbq>|h)V*X2!hGrb+M7RIKV!LIcHW0nuP+RnQJ$N>haLV||4h`(6c)vdAn-NUf zVNUP+c+T#v4YC5W^WUc=)PdcVMqNICaOH-j&)O>kn0cU`KOp-On4xgJkANGgS&51SXJQ-&7Oy*g|XP79(ZX| zwy^P^C~vM_6)G8(?@Yx;WF?_UoX$T??5?KbJO#5_QB}Oh9O) zDix;d`ToC;f|caTmNukBA{pOfX+tm+ZgDXVGkZ|q`p%8;G;({2n5=7 zVDS-}%tx9|WsD5~nRxtjQMY}q-0gY~{kXDaczRk}$}wmtPz%%&pf2SW)=$Bh(qiS5 zFq=dxOdmUcVR(hTKd-JRDEmN8<9ak&_w&sGIvX;t+VuC0v2(?~@U|)38NnL0jQ`;L zI>q;c%V*2MN?Va}6v#l-vL62UNtUF;&h&xakvwux%({Ck5 z+~d!!iaUaM$YWHHY#L;$dY<0Xka<3^D1=e^a8@YonPmrTru3z*DY_M_%z!N!BB!;@ z_pdw&qE5?FE?2w}n}JsUpRA{4iJWMj$0aBI){DmIkX9LsUwt~-8)_;{F$jY~B-HLO zT=I?eoQTQmZEDVRavy^ZUqe6p8Osv*SAr*#jFg9J7mF)oA|UD$dF_pmFDV2!Yun-s zI4<4wUl=aU;iQvo(pcx%Ab|jYqRB4}RmCZ-x|GWWi9Z^uAZ1D5nx8xNkQ`NW`Ums! zs=0}51YHLGfJ-I@^HY-pDy+lY8juZ)>=-}CESMbsFaoGk7?P8jTkw-p#iR2r{xbV? zPZ+eMy9FRu0KLM_Yj4I54oJLMnu&9{5t!G-kcN|5>AS%w zAfSz+0a!f+ZWouOGl;~wT#qlX2h64&#fU-oq&<5h3D8V)NC_R`AdJZ!jF}%1ySf;a zbhM!E+|Zz+QXrL!t_o1Ha&91v7dR$JkZX(<*h@1_+r!gvf{q{@%sR8|5g+q43I7bw zMpVT~IgE|VS+cUa&t|XjR&$0p^%fJwS$Rcil!z5cpjZv&nMeQ-fwc|*vV&GapzIu3 zl?7}Ulepj^$4mNeZr5usKws8{ZpF+S#3O5 zxdV7eAwDvdx{$XFVqYvN$+u=YYu#*Jm+YU>jKOcmY37^d3@jpVvW@oT0e zc~ak@!9EmMXXa(kzWwPJu(D{nt$(o~N2%r(l808Pqv{`BGN1Xaho~hSia)rAu^#yj z=Aq;TdS|bj;5@+wASlbR;JQBZXjr9o7E@4Y!%b+hjxb9MMnrM8Ve(FhTZ^dqOB&wV{QumQwkQ)*Lb~JRM`F70b!1#};x}b#lMTUDE==Hpx&qYAnHWmHJvbFVMPbPzc@g`i+q7SFC~6KqMeY2e`KW zB1&6mhHLlc^MUs=AY7HY?zskwJv6rnmlf z^t#Nb#5D4J+0WTEA77hQPHV*-%s4ddA{5*HKPM7x4F|%0eU`$FU^M)&!<+u??nka{S(`E^#`Z>R_gAe|;6w#l>%Q2i zPH+Z0&=FBu<6cg>PUmKq3H*7&_q-L9{}H(rMATdGCzKzQr{}2mmR#!IRoyN_ko4#v z)VoH#0j~y+lsjKgu=B>g=xNIDC&BJt!a0L$(N@qx->yg~F4v|mzE!Q~N+DU3xFFE? zWO?98G%;vp@1>f)UOJswUan_~2AYo?@weLW3ue3IgS7hvb=2kyClBYI?^ebWMmGgf zm^T^h7tIYL!K_CQUCQY+x%k1}L|qCqN@~DzQr%`4wA{-SBd`7U$HIrH;LR_AO*E$5 zz3&3v*yYu@!*c+3Opnpt)Pm8Iir-Jr6MdPpwDkAO!A(z*s;j8D0W_>L(fm9g=zA=24vD5xT5B@s zDa)!PZUa&MGyVLPn|x7_AutGY0T8Nt{_3#RCFgJy;~|Z&i9X?|KT|=@;v0g=cL01G zn76g@$5+?J#0h5(vmbWgh*?%3ubKSQpMqB{%kyL%Zes%63darY=KYrJg${s=9q)pp zdib0czQF%F`>Loox~NMMf&_PW8V?Q)f#B}$?$(VYSn%NP8Z5XwG!DT7!5umwxC9Ns zbt>QdYt6jQ@W4Z@E?ISNoxArw`<#1tkPwWFjFOyP@9dSAG&Th=|F$}Yn$)6rK$QSL z7rH-oDs_E0)cN7eCY(912qB%hqwXA5zN~{&nz5BY9Ek@3<)S220X=1enbVC_F0rM4 z3zb`%e}wj;id{jB+d!N>I{WZ@QcrCVZ=g_8ximvRTa6m>iD=we$G5_=TbXBU9|e85 zvWD7()4+^?>{$p2IO@*(u1P7R-D^X~r*89FBVb@vS175vw;ePEpjS-#HfyK_%tZX z(wmR{Q_j02Z9zBA)8DIR&o=CDn}mtUg9BN$4EumaHp2mZ_$VVs4ZeuHDEZx)?%rkG z+$O-MjfzIXsdnx^S5`u0eMooHv7fq6JGA4jm;?Z|om~K_{EIr9qU4o`!Y?u7VU1+` zS?la|fD@~zDHDAacmfEXP(nheNTB(z$c>qO&H6n%ivfSuZFHyK#U6{W{*tR2?pKMN z?ly=aiVa<01gO+qsmw|xyG1DRq5PvROD}V(X24z=wuUO|$~C={^PDlOr!s%u?~q5q zPJp*YSu`StH|ZF%UV%I}x#5)#kc%lGp_8EyKH%(Qq3)Zm9jh=`c+Ci|uFhjJ8Q~O+ z{cJc7>zM6)wOt0i;}Paw>8sG9*Y!fyyhu(Z^+#Rm8AJ|6PnpBvcmuiFM>2<6L9M3w z@Mb#2mV@r;U+$y|8S(eu%lfohJCWG3?+}YTvY-R^n+#`0(rd*Tu*S?D_G#Xjwk~>B zEBo*TJg^GL7;E-1J#DbpAmz|IG0HBcIFD5v6V1X8ni74hyT9Ys!>#T8eS0Wd8en0{ zPa&fdvw7H$v~FKihJsB^3^v~B?zJCtT_kn6x$82n8R++vXaVKSvHf3c4j&w;3nSd1 zsZw}XpW6%iv{dek&(;p!g=`9v>=#1%S9i1XgPRH%8fzM2Nf?DmbcUDaEs;|Bms?Y*tW&`Znn z7mKj9FEM%ORBA=s+&z?v`FIJ%Fw#^XR#)x92`2-MQ{P`MCUT8^qDAijrmWi%_lK-y zmcORuPb2Yruoh01WFruhBic8_vrX{;YX%ruCFrbu`%2tV2D+GA(?=?$(zO^MSs8WO zoGbnwE)tiDuMfw`2mA<$^ru}umYGLEP0_7(T}XEKy?>~8!}g{xfY+sCh*{UN_)rTw zNb5*4=VZnIoKVy*mM&XR+CNgQQc!R4#5s!ciR`3KyrODVK*?sJ*1HL2a;h|o9u$-G zE%gEqxoid0x2jvLk0*MOSS>2}#VtE()LlmEWYTMh`8$YmrjvK-=?%n%rdOr*)ehPs z*uP!MXI9tCwtr1i6(fa`qdD*KKNcP}ohklOg%iMOdBchX?X5zNDGWqD$jBvFMhXOF zQ^==9f*KlMS4&~!k)w!EbTa=sfg|Z2Do-;KEO&f!D4S#Q5)o~XP;VR$S_pD-2(3W; z>f(@8D*xuy=VspcX2pKbN(Zqg>M{0eD3DCa7lgy{0WSo%vS-`84^{-k6*kkjq9~!D zocHx#tbeF&DnL=_6DD`crXis}2}fabG$q&l+ybc6agva~Z(XI{>vbgO#r#@-o3s}9 z_HxfC9;;jO`sKfYDP6Qk?vd2=1lqz6K^E+HIJ+&RY}qE})-kG~hIL4C(1s5ms^cUq zGppaipJM}2?6N5-W+NRxdjh1a)$~I%!#M?X;HSLbQ%26Qw+}HPF+aE!ccHp;v{CT^Rk=P8WB;IzkD$7f5zbGzli45Ld#p1eEVjQWFcy#-_(Ad~G!s zY|}vdTFB6E$k$4zzL9V8qcX{_3ximo028&e+hcZTwJgN3wToALH2Q5(C-sm-XMQw+Uu}>gmd5*RSV@!w(2-7V9+$Je&O@t9m4KNlJL+#Fs zBAsAGkgZ`0rf@GHlRQ{0#_4(?jv_9Czce1s4DxTS4wuU`%$*LlZ0BMUrqZSc&z7_( z0l?~vJ}260V*x>hx*7`jVItK4)!2zu93usZW7Bzi*$ePbJd6qhVj3Gm8}02I=;5_j zp{~E^1;PYgIjT7nANBa@!xw0*B+l9J?uP4~wQp(wy7FY(tS7~-&ODw@MW7mr*4?ptb2ML5vKyMfgE@c- zGKPrU1D1!qqJP<`5hJJKcFhB`pNRxWe@2y$HzGzfh0E=6p?8z+>s7y#c|nNts)$!H zZM0DdkHMNi8hL(MMSd}BQs|CdyYRQ{h{6FyX9;L%l~D?+W!RkhmPF%=Xa3fVD;Xth zKMhww`u>xwp7DDaJolppjXwNUS|PB^HA{dOe3<9BVhy$Pfh`g1qNq0@1ATq({HFke z4uc8N9pUWdw}DHe3h#!)PW6RKvp zKT+>|07}G-HpBW>)`qWrL)mu9@fAQT>n+vxsD4!SP$GGS##bsqiJ}xW@V3&vsBYEP&dIjQoi;a+t+QQ8}wTwher2YQ|*8#Hsa>tC3Vs%sDey zq;U>7^hstz>sI{SP3x#L2ndonnRRihAfX*L8#FIvuEgV_PjLDDgHlBAAVnml_APa( zb>0j&ZJha`ZAfXkoH}YMEy-}r2WmBH07DDh?ReXV0(7No$K8(7Go8J}GmUwgAYE@l zVrDgC*<6>j!rmPE*FfWM@)9v_iVYq|4By#OrN&I)hwjJi3@PlC_;O9#NkBoJxdQa| zrUIz4Sr&Sf?~nns&FVbhS!KQl5MCIB%4DFWlBKgAcy1p^d@81KO9hQEb5x2k`nXK} z51cUN)*)sSPY~zZSKPPQ|J*KxEaPm{cXGcj0c;J93yUVpuBG32{NOPPcMOY(rp*0C z*2#sf<;>^IyYp%hh7Z;F94!8F_iy0{_ElJb6w4^aA~;Pa!ru-^&7;!4PG!l=3fL3w z9@U!%SDdNzpf6i4>9gbmvjRIgR+xO?2D7IKGXi)9jKHohmQ=tOa64Y>KGfY8Ze|Y; zK0E5YGLbqkBsP#9il5^Ot<>Fkr^+L4b|SqJWA<5X{K5gw6yk+j%czH!3j!QKl~6W$ z0_G1~^cD#hl@ldebJUgr-ukS5_xR){hA2Cj)zCsiQW5UpBCu9!Zro^f(=GPGX+)F1 z&_y30kpc;$owvjtTg)Ea5*YzwRzXk?HjR!eMzFU#$0Dpyg1A}c7e$;|j$OGcUWyH! zCw;BllO%k;5G|!;ChFDklTKmswp^6MyAyv->tAIWKJo$Okh{-I5i<#cByL)}=0Xox z73noG5&Js^hHvA|pW3e-lL$rmo+_>%o94TeSqv-8HAv=Xt)XuoN`c{dQS@y7C@Kga z2|4AgF;-SC05nkx{^_al*O)y^9~{*Da`jG2>4IA(w6|nes)R*Um9HEwmWv~xX<)=h zjJp|yiNTWVLLQJkJi4tQ3p9#ntSXCq=)ztS+dp1&PUq}9n--9AvXcwl?BNPz*XE)TDSs;$<)gtQYbkyCBRq7pt;wJ7X39oKDbfN>0}kMA(UYFg zm*IzWAjCJTrR94*#oL7vlqH3-X0{0wq_MgAP5|*U?pyV=mJJO+KGshVIC}88acgar zVPOUa3mMr(`#3*M1VFMz8sxPk0bE=}NL8e$kV2sVP3e$BjuTCO!BF~Io4;9}BS1psM*RUu+cDY- zHDiuAX|}maX_6r@2K8m2S( z2eKJMwK`+dI(+-~z{qDTAUC!euDU5tRCx@4!3k?J zU*ubAaH_HwonE^f`fNf@-?)3~YKEJWwAOCx4_H*VfO_q$(3Ih>0(b(T3|U0RmgGp= zTOk194v27M36h^>5*Jjat$1l_6rnEzyz-yZZIz9gi3=)R)i4TCbPcCi$3u^k3~TP@gibO@h_;p+96CyO9uRJKZKYF z=^2I_LQgrv%Atn&{9QJT{mE^OUl+7gNP{hM3`c-OOg^Unjp=E~P+FL7I1p#yk1X1q zW%SOIU}{Oy!wWtQHy}Mv&dB`Fk2dZOw4h#eiRF-Jds_3#wSMiCy=sA4`#Gr#_Dw`v zNtvh_+SQn98XGnJRSvN=NzPr#)8SaV7|7XYbv*~F7hPy<1d(0pf~;`jJ{Lv2{92ykB3LhJb{T5{!2v9bXei1GWg;!;%M5?EWpctR3Uf!J)~ zGb6OBIkaAGP}NQ6(l42z8d|!lc_i(m7N;R=;Yj(&9QZ}vuGbH8h<7Da z&oH4VnZGj`MBbI2R_^GLXN2X?Nyu5dhFVF(p`cl7u86tn@uxB7=btC_*YT^mx>HhZ zTzVnfaSADsZJdj3oLMan?UXII8GM`NHSTl@q+u(Gs0GoOX`Khx>S$>0h?3Mxqu20k zc1L_dPH*XG@?;X(N)4Z#BM3%_LB-N4=l`ZvT+?b8T9K=zIH3_z4%(dnYV%$We^G?p zG1>dmue_fkH5-Ohon7udlWr(^2+z~*dt%-}D`nc3Y=f2cOB1v%nP=ZvJl9Oj*nnL6 z;|Jt(z6&by3}~K?*f#IBSd1|%14at~jnl1`66u6|%95vBY?${1e1bA6Kki8k=Bn5# z#Ha59ddNT0T1^gfy?otjYZ}q?=(IT^YKG0NT;P;#(?~j6Gdag>`&uqF8hsIbtxkz% zVQ+=PJy!|!5}HbUV*&kVtNh5q$9>JNs3mIwE9pliV}$VoSQ^5I#!u#~K##9he7zp1 zsbRGU2Kfha(g5uuhMooCL${<4{olB}Y%$=1Z?}mf+=>IwIkoD}XYlxjEm`n6@0p*U=jQF=ljiIYF2D zh>1~nb&=eCrm2sxLexw+=QySyqU`fk6iB^+{w+B&oIsivFK*<`Wn8S;=ls48;P7_1 z$6p|K5!B?74r4=N0QT^6%w|>}boS%R5na=@QfC1;nz%xYKAXHMkg8T+_Df&TE?$4D zva+f>-@iUankq$7CEHRy9N5kIws$q+a0GR!1%?muZB`8Q7|qf@K&-0GwGNrBW~Wq} z@9hNDS4RO1kGR#(4@sa)7y<4gD?`^lamtVfiEg-!Jh3*94gJvDz4Ox z19KO*(~ol#@7=(;tlB_14HUG1ruGzQRK2|LcW`CRAacl5urkR<4O&S&4~+d%LCBE$Ykh)AHcIgq zQLc#&5Ljdh2ARC*nF7r1tfHmiujukM?!5*5O9VFf1-YK}!dHo!kHsz6_&E#c80x!7 zcep%!9RRy(ro#dZ;7mC5O3(o*pkATNgVBZz88gvM>KtemxR}JNWJePOc--k$fSiiv zliKv1S&6GARS}6n zr$SZ4tqCHds%AD?lFbT#%R?WW`jb+=#rybzjUc$t2{7$b_;@$$@UIjrhjfIO5U{6? zM3UKTf1}A^_wZ^5a#LAB7Sjkvj`s|x+1rqZyf_vxR4Yc2uT9G0@4hjJbCBmA;7&>j zA8`rkHJR|HRPzOII5g^^YJp!7C|}=NoxcW~Ip%=8^y%AH@MGw=&0B zmfwB$^@HEh-%qa8wvJWSB$t3%V?Vc4^g(br*fxI_<~{z1H3@D9)3XG0V0sulC6UeB z&jb%Brz7K-Wjhx77l4O=Z;kwS%ADS!oIp#tJJ}fj`2ECArtsZTbB(}qw5T|$NJz3N z%zgn}Ac==G3ev6gQsEo7$(hKDPBfGe!wioyq(3cLTbpbC8OV$=9?c_3Ou z!o=+}@Fp+5UO1A%p5%F?8t}|q?EFKpmXzXsLR)qNEe>y*ty_k>2#-4HzO0>SB^>Fqqz|w zYl0hv(V}70ZTGUu!dXhfqk!e;;Q&|#8DKZ@!!@oj6e%ypm=T3^AW;nTrJ-DCl@;#I zecK1r!`Lb1nuR3D*nQyUjv0)O#_0iiOV-}LznHHbZVk2-W5HO2?T6cj(r#*;HmXyZ z=cx^IU@ctBblV<3;|FcXU(0omxYl+jc}Ek3NRU@@yob7GWqwQ|s_Q#~pT2ku2}K)6v8vw{)A8Y1%_hk~~H- zitwY>tV$lf9vxRpr0R5_?LRm5K#<*9*&iMC6|CeZI+ClKezuS~$}8_vltxbs2&N_4 zH7y{2m<T%%m* z6d@ybAJB)2I8SPtkVF&B4IEk!*cP4{wg66*Gd&QEY}}@EiX;fpAg?&1tVLgY!v#`M zUSBPIc%&VC>GOB_P;zi=csuxZ^_wrEfSsil$oC(jwffncy;h|RMPFTFkZQH5fbLI+ zA@T^O^dm8`vsOd%RjY3=xBqmjoTkFJib4ADO-?U6l$I7!G-xVy=H)`t-;fHi8CZeq z(oQX+;8I?>zC?6iaZK7h7EPPu%M5AjWLmk0l9R?(6dd$6Wwvi~))N00q9vb=0)`cm0sEf#x~ot=^K zbiALM+-2DoX94PM+GmwPoUkLcVoB^qn^BHr{+@!$!6cg-?aM12^)+*>YtTBR$ws16 z0*Krdwum{Hx$;aFnJnMp@B zz+TTI*V663xns=|hMVhb+7GWp=O1&0QKZ`G!!12|MUV$tro3zwl!f3KL5 zx9#$IB@1#9w=4cSk|O}ck2luu;4ng70|iVu#~afoClZB#%%)Cz`@I62JKDX_K8PTE zO2~k?OJm#T=NHVek(E-dOX5Z?|D`v$Qh>GM*bbj9fZI*o0m$0v{^`>UwK!_W+6o3l zY~F(&Ln9BCpc%>+JoostA@oI zl{F9xRbU?mE2wBP!-EWalvvFxE79=-m`Fp^BHZffLr4WCzea?FoPiKpM$W-1#+%J2Iqz@!z))Ij-2LZIM|YgvqOev!a=OE^f3> zEfdh$t@2J`@cG0%JCbAe2v4Y~QR6I_@HV1qE@MeX0A^o2$~sBfm$O6@X3pp8e{-L>AfIsi<%ywqb-2*Km_(h5)T`Hwye;^H3dSTO zfvoOn7DgS!-0nMVtkkLCOaQ=!)Tl6jQpRK87E$QKD}N%jj&$_oct38e-^T5Hm$#UI z#j*JpSBJqq;|+?a8s-vsy?*}f#9$=CMT>85I|c1kXH@nW&?p=BxjO|_s+f$Z z=Us9OG)mxOhyUJF>9u3-PP7|rGxPrEksB`lnaV2UvHCF-aBxmM0yT;FIn- z4@1kulwr_8W}HP>#8%2P*!TMVwS*>#s#e6=tv&zzSl@~}nTyL?RmJM%zqw>hc_g@J z)`k0hH#Zqpos*tNCs=$bn{HX1S{o5JZK-Zyph~(K?z)ROQLC@A=vYqh+F^ktM{-mT z=Fye4@9A=;e+`)I|J0}7j{PDZLxrD2ZQ8A_tYlIY>K%&x?u_pL_Dl7laHTaA$UduR zd=cZBY=3_$`muQREEY4uX5cc8c}(+=A4H}P4-k2zicVb0n83kBw3GVrdH`%4)h(L* zt{bh-KAt@|qY=hnoMyM`wL$67uOl(`Wg3RZou&`5YfAN=36XOJ?XT322NcTfM}=Gp2Dj6-$Tp>jErnGJq!5~Q?|-m=wtGa zPXAPVb_)T6KHBlxo78aUWLy$2;s8D^)A@sMd#*6FXWVwxmD=7+(k_j58|l-A+2F6n z6qRz76Hc@ExWkS`WTZ;872ptXBoj1h-J{MUmgx0|hEAU)L72$eheAob60&YI<+Rg-J!Mo7+KRx8rFnEmqFvRB07LT) zXE`e|S z;(Zr_`w-aR((?d|d4O>DZ9+<`?%+p~ax~1bxg^f%9-S&!%D8&PxJ+$$d)!Uvg8oG_ zNj(f{yytJOFJU2ce;@za4;27jCpTz}4t?B2tJ7Xg^pFUNv%rNz#8v);+9*htisT1gVB5ix)N0?AM>6fOzLg z?eIUhZ8C-t;UL329m=2VUHWb2Ur%~goq{@&6RT$`DH-yhk)_)EPyHEkg$VkmEolB; z=FX*&DI|P9A{jIgWAZG(`R(+&Lo`eOk+aDw9_CETP@p3`x1si@UZu<}B~`;= zVV`%hC8-*!DIO+Q+&B;JTM1>X9o1r6@L7a~NtNkN#PQKA*iJn)qOUUg+Rc^Ml&qPc zmfW4uC)jwu2oapC(?5lw7D=R(=~)iY@5y4MICaUMhSl=oz<#McRj#FIR?QDGQ!K(3 zzw9+dT`JCjTgGVogdG>a70=4k7VR5k!rA2?xpl5O51_qN`Pm#)bVwm15Y&$FZ%daO z3H+>0u@LRB0F2JukzF_yzp z-@_gk3~MIjKL%L@?|#jS$9IL9#Rawu!o`DtnHWxg{M^0yBsTTq?T_<<yDVvrmvP4z5B|A>vZD{w-AKu73H@O!)BhtfE#mox-77k zT9Qd}Lr5|aM%Z6hL@5L2DUax0gahM^-f@yp` ze4o9>Fcj1;50DlQMv%cf6PtcWIRJg;W!bqcciOFw^t9k-_0UFd@s(8~@#&KOgwR90 zkLv0Mk=#*$u{wm8EG3?Za1nMNBG*HfmC_0W)F%#6o=Mx^`k9B=z9!5bo|j(t57QWi z#g5}XW7rs4mNC?j6<-$|rd{vA@{C=eeg;&|1B>423((J~LAX); zy(&dviOYpUbz!>NZj1ZqsjcV33m|E43>~l^wBGmBg;OOP*DoNa*zrIwDz8ktL6G~*aK)<-5XIy0Jhic(#|1LkMJ*(7bx6f28rnWw9_1KMv{&1(HE%>JGT zBMRI-8881cAQiS9|4KIz`PIGxb!Xk~5yQ>-4qLkm1;x00(Y(=r^RXmi?>0I=q-N@Q zFb5#Zhgy=qwI9*H3am zBq&>B_;$9P?-7JmWQWwtsOxIo{paX7W8LyQ$Qk^+b&9lf)gTN+jz;ftX-184J(oWK zFp;?i(|7G}7q4LNYahby1N@{F7goY6r=g^K_76iG-QOi+_a*#j$8ek!J;4|)a{IJ1 zDve)fa8xKv!nvw{2w9#HPH*<OBu>|_2xOaY#kyfo%xx$}{ zDlJ2QXiy6D$lDZWQRoF6v6az}jgrD>k^tj}{dsciSM9s^zXC$1wx~ctW7wZYI~u)^ zku2~l-x8SzgMsP6hHd>9BCrmb0WvVv&_K*)dO5sx&Fd>PU*i`QF#E7mbCa|134JxZ zR~cU*9uEh_kwl$MCO3+WAKg9WHu-Ae8*#EM3s#C9 z6r-!xA7Ld)fCr-&-HDu0k!8I{>|cBvsAF_ZDwZ{;!}aaqb%PkploIJFVa%yUC1FLZ zEM3&I;5-6{XsT-?&yWX{U&kbC6( z5OCa)|GrgvXVf@V@6ySRn5v~s#(%}Ddv`7*vD{xp#-(9PD}2wZoW$?b_(+m-{Ip*4 zRZk{~h~vMa{i01KuotJBuO$#!VQg1Y2TGSHgIrC58?9+g zXk^~~w26X@$kR^Q;+k22tY#~hw8M4^pn^4$S1NATD3WlU1e?tF5yQm;pW85hb}q~+RExeO_wFv$m>h^ZAG}p`!{)S zIXrX2n*4bl>UpOnfRVWJXZFy)YOTF*UFke6%cH&BY>7uL`{D{^d7+)n@Fh0VnUd zLQHQK5bckB8)0;DrQ5A{*jLC#3ZeCc15iA}Iz%?tr5m!m||;*+WvV0)0ejgqLyfH>*Hebo$=of?MueyQsgKA3LckGi)!7X z2uar?Jj%>c9WW1L0hfItYm&4MiCX8+_Xw7b9kz4@6Wt>7Os4mA&^}2LSNyy4iN|X) zR{3%;o&Y1NxSAcyOLhH{x@(6T8NUCX!*yR~TI+?H0t3)`W5itP)eM{F%{Vj@9z-%2 z{0;YCP(3?unhnHYN=>xBk80vp)*yzttr$J_gJrk0EXa%M2)ScX&mm?B{#X_RzOXj- z+B@8(*?%FUq2sD`&PdF_$EVRgaXUD|2Yv9H`nVj_y&oc-7M;31&CKlvNRCzsU4XB(mwJm?-H?8rE?a&##!hrTL?5R-ekae*mFq>4w!0rOAt- zHD{M&W-X28qCR*|;oqy0MHn{wUFrvzI}6^EpqC||Et2UZ?Mq9Fp|+qI>FHN|sM?F6 zZTQrHR*4AWAz?J<==%AL8;U6+zX{Vnu}lF_N^yej@nEY}mKW#bkoJBLoUX%?DNZKg z_N^qRt@Se30CAu)UIb9YT#=jhRJ78W+-ct+zA0tJPjgX7{u$S&f1g#F8d$|YKF;t| zLmhJz<)zE$&1l3!$#8DS{av^WF^!1P+gok}-g=CrqmwU_yvG@cOpfG#x8zGY8E*Ql z6R&v30#v7GD_GrdJzj`S{O~SyOfOE5wW+wE9x2eLei9_@V5%fzzW{$_BYT4}NyOU7 zCC1d;l?S|-s3Hxc7DpqU4F}o_ic%sxe8)Mjf(SRVUn1t;WzD>G5P=W-RwiybsNgk> z(U@@)!efu#TUPVhh}fZdWa2&8@(>MOAZU<_4*4=Mqhrbj#qqg%^6`2~bQl6g36ZGL zRYH%MJ7|UX<J-^;2SSaP%KeTxV%^ww}|Tmo9b?A$BVq1-?6=GST~92GI6EtUg!{F6GQH0n2p;2?j@@YBzD)o z(k5|hMJN~nJ^&tSiKKYHCvO5c()N$Uq|#o6KXb=_jRgEX1|AmKKep&CcQCKeM1AF2 zn5@J!<(t9OMX84Y)+3RVeud8Oo@n!%0D^VZ9?_~o_IQAYV?~?_+Q|Mn&=Ix`pMR*CX zv>AnVLs>2-BaD6@IS#Hq@Py?)53Ct*w#M^mJjf8d&s5ns4bOVpK0c1|ef)p^y6%a7 zRfu$!HS4bE3G8?;Ddhhavv!*Q?52`&sfA6mX-{g<;rjiO6 zX4{k+JY;eGW%qBo4yt`8No;==fPf?idpU-OxJ7DcsI@7CzWqhBYude>xDXa`KYOpV z$bx>!jJl?(I`ly_stH;N$__eb<|3{??&=Boc z;>+c)m#|=@G!ZXIS$l*n;k@1}Ry2#Nc|jEG|hl`4r3eeu^{5a5RJ zowS?gW^QIlM2)pMVdz*b0(L9&-C0}JYr?Ir}tXpkR5u=Wl+T8 z2e{|s<&{{QUiRVEDmzs5nLl$MM>uD<9W*dtvsW7KQxsspgG_J2Kh|U_I0vy!qG@enDQ|ken#X0t zg>S!bc8g*~2#+G|DTk1|pisP&_34XRMizTtbwr9pCatt(L7r2u+eW|FbwJ=(h*cR& z_FZWkzrHLDjBl0AF@udd6%MV?ax)E-+omFUVrhxxF?}A;{M$&4E@r9OhVggtVhR57 zSoWwy>U$lhm$C!L08D+xaF9%;d6CpV2sc8HN%ehN(oDduAyNhgrv!lwU-f#Oe#nlj z()NILB^%mf{bP?y>$?^0*>#W+dw~-nLFU5fmvRn~uU}|t(y#^Egt-JKe)>k_z0+SN z03_-0ACM7i#X!tg_otsbFcImgO&-2*!^i6}Ns3-RFjLUEeTsagDpaCuf}oi<76O$f zZbi|++{uIQPIgti`@J;;hJ9BtYfJRfAlE=JOCGzy^^h7c=&tUSc{lJPckqX*IJ$O9 z;PZ0$5rxH6J#%g6+@#T5u|F}pr#Nxw-XMAm${oa#e&g=Mh^DNB1B;r5Vj!WPvmOAzoir%8@Zr=UzkV*D2)uwOsnSSPVw#`17pq z?w*tKT~96ZX0hV3Lojl>f>A3@?2lBO8M(=oxx+C#` zuh38CNxbw~%G5Q12x=)cC8N}BgzRfcf?v!hlGs+WUA}lU{|L2HuZyGjuy+=gG1f8p zHdD~=%sZOvj|=-AhaApOOP>%z$!IDW1f3YF?cO|ZTC>0J;5$u8utiVJOCej==6Eqy z6;3S%F4bE)A&oy6{p*<6H9BuHQ>RX$XDhLANr5$Ul zcS4H+M5ime89gt$1d?#CX}v zo7R3L3A-yB9>~4b2wOhXhskXo!@cXvekR3@>x6E z%nPh|CJsM=^g>qh4DXiR`@^18$jU}qjwGDEWxs|afKP0w7#J5(eaC9rmEQkR2*OwW z)VDsu1e+nmL47yy(akVfI&t8L=+#qSSQ{v6dHBvXm+;3+5AmWxg6v+;6#2-MI9 zb~{s$k-PuQOF)@ay0cbGW&8t=lMuo~3KMBMiW=Pqss?Dqkyb(^WzpLKCn zx83w8;vN4GjpB}KP%$pvxqlsDNoCu*P2>e)W&~n@7^)LnAG^rNcbv^km9KqWU%}($?2R2Cz(>7Zpo~!htlI3jpy>DnYA_!wBU$b(Z3+u7@AH`kFHgyS=AR$D zDWmS1dw+^Ha7VU{jHQ!ep!-TSUSd{#wD``GxM&&mqNeuNInOK@ou2lH2pBIl z+zBw!fn7xhi)u%G(fQKEe%z)F)P*#%QzIZu|MX3!i-RB{AlTY^B{(EP5fH?6j?M8_ zkP#4q{vG~z1mPPP_-9T2KZnF&FaEDX2#uJ)IsXpPz=2==_xpc`5dK}_{~Y@7693;< k{de#GZuI|f)vp3nUylmw)Pxc@fs+vwWK^YVCC!8X7sVk!7XSbN diff --git a/img/tween_cheatsheet.webp b/img/tween_cheatsheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..e86dfaeec21255a6f5a6df070dfd42a82cb0c48c GIT binary patch literal 322238 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%0DdItkH@csw=7lOvAMS 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 JMBsnN{{fBsP$mEX literal 0 HcmV?d00001 From 45c425079f2f87e7bbd114cd8b04d59d9d9b16a8 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 16 Jun 2023 02:48:46 -0400 Subject: [PATCH 71/76] Tell codespell to ignore the locale code page (#7519) --- .github/workflows/ci.yml | 2 +- _tools/codespell-ignore-lines.txt | 19 ------------------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7dbec5c5c2d..87ae495bf06 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - name: Linter checks run: | bash _tools/format.sh - codespell -I _tools/codespell-ignore.txt -x _tools/codespell-ignore-lines.txt {about,community,development,getting_started,tutorials}/**/*.rst + codespell -I _tools/codespell-ignore.txt -x _tools/codespell-ignore-lines.txt -S tutorials/i18n/locales.rst {about,community,development,getting_started,tutorials}/**/*.rst # Use dummy builder to improve performance as we don't need the generated HTML in this workflow. - name: Sphinx build diff --git a/_tools/codespell-ignore-lines.txt b/_tools/codespell-ignore-lines.txt index e8b1816ef75..dc72b48eec3 100644 --- a/_tools/codespell-ignore-lines.txt +++ b/_tools/codespell-ignore-lines.txt @@ -1,20 +1 @@ -| ba | Bashkir | -| dum | Middle Dutch | -| fo | Faroese | -| fro | Old French | -| inh | Ingush | -| mye | Myene | -| nd | North Ndebele | -| ro | Romanian | -| seh | Sena | -| shs | Shuswap | -| te | Telugu | -| tem | Timne | -| Beng | Bengali | -| Maka | Makasar | -| BA | Bosnia and Herzegovina | -| FO | Faroe Islands | -| MM, BU | Myanmar | -| RO | Romania | -| VN | Viet Nam | .. image:: img/expres.png From f050e6b715094c847e03c2708e1724fa5a2c489f Mon Sep 17 00:00:00 2001 From: Arpit Srivastava <52847458+Skyvastern@users.noreply.github.com> Date: Sat, 17 Jun 2023 17:47:14 +0530 Subject: [PATCH 72/76] Minor grammar correction in your_first_3d_shader.rst --- tutorials/shaders/your_first_shader/your_first_3d_shader.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/shaders/your_first_shader/your_first_3d_shader.rst b/tutorials/shaders/your_first_shader/your_first_3d_shader.rst index 9d149691327..c0817a5c136 100644 --- a/tutorials/shaders/your_first_shader/your_first_3d_shader.rst +++ b/tutorials/shaders/your_first_shader/your_first_3d_shader.rst @@ -197,7 +197,7 @@ texture as the second argument. We use the ``x`` and ``z`` channels of ``VERTEX`` to determine where on the texture to look up. Note that the PlaneMesh coordinates are within the [-1,1] range (for a size of 2), while the texture coordinates are within [0,1], so to normalize we divide by the size of the -PlaneMesh 2.0 and add 0.5. ``texture()`` returns a ``vec4`` of the ``r, g, b, +PlaneMesh by 2.0 and add 0.5. ``texture()`` returns a ``vec4`` of the ``r, g, b, a`` channels at the position. Since the noise texture is grayscale, all of the values are the same, so we can use any one of the channels as the height. In this case we'll use the ``r``, or ``x`` channel. @@ -325,7 +325,7 @@ explained in more detail in the next part of this tutorial. When we have normals that correspond to a specific vertex we set ``NORMAL``, but if you have a normalmap that comes from a texture, set the normal using -``NORMAL_MAP``. This way Godot will handle the wrapping the texture around the +``NORMAL_MAP``. This way Godot will handle the wrapping of texture around the mesh automatically. Lastly, in order to ensure that we are reading from the same places on the noise From e4acd3ccf6e9cd5cb7f8d67ed9cab1df5c2ea126 Mon Sep 17 00:00:00 2001 From: Piper Thunstrom Date: Sun, 18 Jun 2023 19:06:02 -0700 Subject: [PATCH 73/76] Update instancing.rst (#7493) Update physics material info on instancing page --- .../img/instancing_physics_material_expand.png | Bin 6672 -> 0 bytes .../img/instancing_physics_material_expand.webp | Bin 0 -> 15954 bytes .../img/instancing_property_bounce_updated.png | Bin 587 -> 0 bytes .../img/instancing_property_bounce_updated.webp | Bin 0 -> 1672 bytes getting_started/step_by_step/instancing.rst | 6 +++--- 5 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 getting_started/step_by_step/img/instancing_physics_material_expand.png create mode 100644 getting_started/step_by_step/img/instancing_physics_material_expand.webp delete mode 100644 getting_started/step_by_step/img/instancing_property_bounce_updated.png create mode 100644 getting_started/step_by_step/img/instancing_property_bounce_updated.webp diff --git a/getting_started/step_by_step/img/instancing_physics_material_expand.png b/getting_started/step_by_step/img/instancing_physics_material_expand.png deleted file mode 100644 index 67f452186ab9b52beb76ff438196a6cde654dfbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6672 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 literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/img/instancing_property_bounce_updated.png b/getting_started/step_by_step/img/instancing_property_bounce_updated.png deleted file mode 100644 index 2b7c3117bfff60b38032942297b8e16bddf5c151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmV-R0<`^!P)JD4fL-vPy;nk12s?st#A)1cUdbA-UogOnuFhPUlTNyk_kvw zss*Qo_8b&_%)I%!Bxn(lo?w@S3eM-&vUlM*=-%!hH;>DLN`@*TEg?kiBEoQf3M7#n zTSBBNIuIeI-^n7AV&`==n|J)?85+X6pbSlA`N&9oaK{O2xU&*HPM>$uR+VA&rnS_B1Snwx`3)8 zrZJ$C)bH_}2XA!u@FQs3;+m&C*IF2~-MpY)%H|MrKe)8cJXy3x^ zXWeIL1^xhv|AQh`t;>w6cU3+dN;maf7qkOC`N_A-hK>RKGPA6V*K5<#`*{V`Qz?%_ zDgT~2<+7pUP#Tl7dvmdu;koQTr3CnRZQ6nAp7FAw4UtQxa}rX?iDYK4|9ajwPwA|! zddf#uw9au{?4=SS?ew^z}`|1zFQg8Kn>JD4b(sl)Ibf?Kn>J7 Zj(@Wu+}b|OzOeuR002ovPDHLkV1k|Y4J`lw diff --git a/getting_started/step_by_step/img/instancing_property_bounce_updated.webp b/getting_started/step_by_step/img/instancing_property_bounce_updated.webp new file mode 100644 index 0000000000000000000000000000000000000000..a6405bb647ca4ff75e1d703d3a53b183a4779e9b GIT binary patch literal 1672 zcmaKqc~nzJ6vi(*BCA2b9+lKapa@nA0*WOVAc{qS0J4J+WHSkvfT%1%L{th$UCI)W zT?#1Hl{FPvtYxv(P+W?HB8qGkWQh>S>jZm>e`x2NdGmYUz2D5-`yR!XOpccYaJ3;h z>~k=4Qvd)wngal90c@?T9P%a6D@f+ksC1U}CIC7kf=Ss)!n?V9;N=EE78C&oTS3c@ z$_n4(M0OTue|*ezgM>K3GZgRj@tjYpN&yF0Q~(J)%CMw{Gb0f1M{E)m5iaIT#Ol;w zzW~Hn5F0Sj1ra|H>;CU~RLnt(yjYYv)0tw0YEwr#KIjAX|A48%OghRjMmdB4Is@%5 z>Gqxj#2h1LIxQ02ZE=VzR6M|NaY8Er&DF3IY+(;Lptkx$B!mDBBES%>45YAtg5so4 z_&;0pJ0O=oa)kgDIjkWJ=-{{L2k|#RIcO~PmKA99^`a!9NCJ@Q#jwfs0CML67Sb_H zSb$**g#c1L01b>Ke^@?%*)-DAmo!2ifJ!33o#rLYKLeoZ6oA&#a6hKs;yF_2DH#|D z@U|2{$sGXK383KlzHcZdjziI70B6)IyAFV?Yyh1gw71tM>Xt`_|N8d7Isf(#{kiyB zbWW!xmDsBLaAhs_}l#Fj54V0xkq5$|}XMY`$_ z)0~3i6IsS%Bc9ZZ#6w0JW$x?sDjws#d~1)IW;UwraK2EfAZmEV>8ZQ-Za-&1Wq$IQ z?SCdRd6`H=1J7+0A;JyR_p3k|4gxzWBFIb;A4c77{cH?-V5 zH}+r=tyy=jRzp@n>Lt^=WKB!TwOIxEA;leo)d@!Z6@+oSwu^7PLa#M#FPW^`xa^z` ziT(ZK;Ga^1R{l0zUEu6`7*CX z`Bg&^I8NT%t|`&p=x9uPe7DbCEpE*=E-YjTb#h`ex0B1IJx%MI6{{F!$-(n7?RLSg zC4G*`OkQ&QqvxwxlMVTif()V{N)vO-{R{7MyM70$`qp*ay6?;ftxBYE1@-~_+l7VJ zy}Va053#kxZBsEFf`=JpyaVH=GlvE=&lpj*jKb;rC!W!tww3-&F^N7#)7zJAX`&~Y zHKIQ;LZBb+Q&t-EYWd1Fl+~j-aW%o1YUx|!ljpeEgLOp3(Bf!e;t> zxXVOZ9!(}r>=$FRXD&_=m_$2@Jt=S0HU8Gq7d;HVy%w3x|CRT}!BxY?!KahhDInp@ z^(Nj-tLT!>;bX+ij=NHoQ9Y$sH)aiRRy1k&(LK!w>-uzA)y>83R*4pJ;~w(Gtw$X( z|GBf?^M1zM7|u;vjQY1{^`#8IG!VA>hT9Kbu`}U?P1zA<+>&F5(jKJAWLan@nvS>W z)~3ITk$rc~wZMs4->NVou(^8D;#`E}hL%S6DCM=fHRo1Ol<%5MQ&UT+Tvbuf&NuAc zM8L;3Fm1-ILk_cB7D9B!x;me~lW_VYTtwgdXM9O_)bQU1%ev1zQ?X7uVNAba{A2DE zpMO$x<49dxLth!@#h;~UADbPG=1$u;sUCT!}0d?HEl3&Z+tb$pMB8G)u=p_ zrktJ9SXkerotpaM`poIeSS;1jqImz_(4BlY_g{R+le|1CSiU$OJ*?rjPH$Fg-llPF3yAoNC;icXvACo)?{+@cD)|d|AsDZ!^XVj4C%@VIco7mb@X8 Y)<5P|bD~$Rq}45 Date: Thu, 22 Jun 2023 18:44:30 -0400 Subject: [PATCH 74/76] changed collisionInfo.Normal to collisionInfo.GetNormal() --- tutorials/physics/physics_introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/physics/physics_introduction.rst b/tutorials/physics/physics_introduction.rst index c3346085d9f..d7bac887cf7 100644 --- a/tutorials/physics/physics_introduction.rst +++ b/tutorials/physics/physics_introduction.rst @@ -414,7 +414,7 @@ Or to bounce off of the colliding object: { var collisionInfo = MoveAndCollide(_velocity * (float)delta); if (collisionInfo != null) - _velocity = _velocity.Bounce(collisionInfo.Normal); + _velocity = _velocity.Bounce(collisionInfo.GetNormal()); } } From 4415f9895cdb3f9461434ed6e69cad3368880749 Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 23 Jun 2023 09:43:41 -0400 Subject: [PATCH 75/76] Updates to visual_shaders.rst to show new way to create visual shaders --- tutorials/shaders/img/visual_shader_create.png | Bin 9799 -> 0 bytes tutorials/shaders/img/visual_shader_create.webp | Bin 0 -> 48352 bytes .../shaders/img/visual_shader_create2.webp | Bin 0 -> 38938 bytes tutorials/shaders/visual_shaders.rst | 10 +++++++--- 4 files changed, 7 insertions(+), 3 deletions(-) delete mode 100644 tutorials/shaders/img/visual_shader_create.png create mode 100644 tutorials/shaders/img/visual_shader_create.webp create mode 100644 tutorials/shaders/img/visual_shader_create2.webp diff --git a/tutorials/shaders/img/visual_shader_create.png b/tutorials/shaders/img/visual_shader_create.png deleted file mode 100644 index e36820d1291f5d66bf55d7f7004081d54e5da7a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9799 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 diff --git a/tutorials/shaders/img/visual_shader_create.webp b/tutorials/shaders/img/visual_shader_create.webp new file mode 100644 index 0000000000000000000000000000000000000000..64ed1a69c5822fef58b7e94b45e708b66a6b533f GIT binary patch literal 48352 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


J6FT`lQ)i`|hNUmuCyaS?;$LN3@Z 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 literal 0 HcmV?d00001 diff --git a/tutorials/shaders/visual_shaders.rst b/tutorials/shaders/visual_shaders.rst index 798c5cc4b5f..9ee39ced79a 100644 --- a/tutorials/shaders/visual_shaders.rst +++ b/tutorials/shaders/visual_shaders.rst @@ -26,10 +26,14 @@ VisualShaders, create a new ``ShaderMaterial`` in an object of your choice. Then assign a :ref:`class_VisualShader` resource to the ``Shader`` property. -.. image:: img/visual_shader_create.png +.. image:: img/visual_shader_create.webp -Click on the new ``VisualShader`` resource and the Visual Shader Editor will -open automatically. The layout of the Visual Shader Editor comprises two parts: +Click on the new ``Shader`` resource and the Create Shader dialog will +open automatically. Change the Type option to VisualShader in the dropdown. + +.. image:: img/visual_shader_create2.webp + +The layout of the Visual Shader Editor comprises two parts: the upper toolbar and the graph itself. .. image:: img/visual_shader_editor2.png From 3e999926ef59a85ca58529b3cb01becd0387ff4e Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Sun, 25 Jun 2023 19:34:55 +0200 Subject: [PATCH 76/76] Update navigation different actor types Updates navigation different actor types. --- .../navigation_different_actor_types.rst | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/tutorials/navigation/navigation_different_actor_types.rst b/tutorials/navigation/navigation_different_actor_types.rst index 19707a510f9..2336f686ed9 100644 --- a/tutorials/navigation/navigation_different_actor_types.rst +++ b/tutorials/navigation/navigation_different_actor_types.rst @@ -16,12 +16,12 @@ The same approach can be used to distinguish between e.g. landwalking, swimming .. tabs:: .. code-tab:: gdscript GDScript - # create navigation mesh resources for each actor size + # Create a navigation mesh resource for each actor size. var navigation_mesh_standard_size: NavigationMesh = NavigationMesh.new() var navigation_mesh_small_size: NavigationMesh = NavigationMesh.new() var navigation_mesh_huge_size: NavigationMesh = NavigationMesh.new() - # set appropriated agent parameters + # Set appropriated agent parameters. navigation_mesh_standard_size.agent_radius = 0.5 navigation_mesh_standard_size.agent_height = 1.8 navigation_mesh_small_size.agent_radius = 0.25 @@ -29,38 +29,45 @@ The same approach can be used to distinguish between e.g. landwalking, swimming navigation_mesh_huge_size.agent_radius = 1.5 navigation_mesh_huge_size.agent_height = 2.5 - # get the root node for the baking to parse geometry + # Get the root node to parse geometry for the baking. var root_node: Node3D = get_node("NavigationMeshBakingRootNode") - # bake the navigation geometry for each agent size + # Bake the navigation geometry for each agent size. NavigationMeshGenerator.bake(navigation_mesh_standard_size, root_node) NavigationMeshGenerator.bake(navigation_mesh_small_size, root_node) NavigationMeshGenerator.bake(navigation_mesh_huge_size, root_node) - # create different navigation maps on the NavigationServer + # Create different navigation maps on the NavigationServer. var navigation_map_standard: RID = NavigationServer3D.map_create() var navigation_map_small: RID = NavigationServer3D.map_create() var navigation_map_huge: RID = NavigationServer3D.map_create() - # create a region for each map - var navigation_map_standard_region: RID = NavigationServer3D.region_create() - var navigation_map_small_region: RID = NavigationServer3D.region_create() - var navigation_map_huge_region: RID = NavigationServer3D.region_create() - - # set navigation mesh for each region - NavigationServer3D.region_set_navigation_mesh(navigation_map_standard_region, navigation_mesh_standard_size) - NavigationServer3D.region_set_navigation_mesh(navigation_map_small_region, navigation_mesh_small_size) - NavigationServer3D.region_set_navigation_mesh(navigation_map_huge_region, navigation_mesh_huge_size) - - # add regions to maps - navigation_map_standard_region.region_set_map(navigation_map_standard_region, navigation_map_standard) - navigation_map_small_region.region_set_map(navigation_map_small_region, navigation_map_small) - navigation_map_huge_region.region_set_map(navigation_map_huge_region, navigation_map_huge) - - # wait a physics frame for sync - await get_tree().physics_frame - - # query paths for each size - var path_standard_agent = NavigationServer3D.map_get_path(navigation_map_standard, start_pos, end_pos, true) - var path_small_agent = NavigationServer3D.map_get_path(navigation_mesh_small_size, start_pos, end_pos, true) - var path_huge_agent = NavigationServer3D.map_get_path(navigation_map_huge, start_pos, end_pos, true) + # Set the new navigation maps as active. + NavigationServer3D.map_set_active(navigation_map_standard, true) + NavigationServer3D.map_set_active(navigation_map_small, true) + NavigationServer3D.map_set_active(navigation_map_huge, true) + + # Create a region for each map. + var navigation_region_standard: RID = NavigationServer3D.region_create() + var navigation_region_small: RID = NavigationServer3D.region_create() + var navigation_region_huge: RID = NavigationServer3D.region_create() + + # Add the regions to the maps. + NavigationServer3D.region_set_map(navigation_region_standard, navigation_map_standard) + NavigationServer3D.region_set_map(navigation_region_small, navigation_map_small) + NavigationServer3D.region_set_map(navigation_region_huge, navigation_map_huge) + + # Set navigation mesh for each region. + NavigationServer3D.region_set_navigation_mesh(navigation_region_standard, navigation_mesh_standard_size) + NavigationServer3D.region_set_navigation_mesh(navigation_region_small, navigation_mesh_small_size) + NavigationServer3D.region_set_navigation_mesh(navigation_region_huge, navigation_mesh_huge_size) + + # Create start and end position for the navigation path query. + var start_pos: Vector3 = Vector3(0.0, 0.0, 0.0) + var end_pos: Vector3 = Vector3(2.0, 0.0, 0.0) + var use_corridorfunnel: bool = true + + # Query paths for each agent size. + var path_standard_agent = NavigationServer3D.map_get_path(navigation_map_standard, start_pos, end_pos, use_corridorfunnel) + var path_small_agent = NavigationServer3D.map_get_path(navigation_map_small, start_pos, end_pos, use_corridorfunnel) + var path_huge_agent = NavigationServer3D.map_get_path(navigation_map_huge, start_pos, end_pos, use_corridorfunnel)

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 ftP3JCVe=I0FCZuN#6*E6eT1)3P literal 0 HcmV?d00001 From 0a1bd872a251c6d47d33df3d553c26e9d396f20c Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Tue, 6 Jun 2023 00:15:34 +0200 Subject: [PATCH 54/76] Document `-j auto` in Building the manual --- contributing/documentation/building_the_manual.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contributing/documentation/building_the_manual.rst b/contributing/documentation/building_the_manual.rst index 732d17f2d5b..4ac1d5059b4 100644 --- a/contributing/documentation/building_the_manual.rst +++ b/contributing/documentation/building_the_manual.rst @@ -154,6 +154,11 @@ If you have at least 16 GB of RAM, you can speed up compilation by running: make html SPHINXOPTS=-j2 +You can use ``-j auto`` to use all available CPU threads, but this can use a lot +of RAM if you have a lot of CPU threads. For instance, on a system with 32 CPU +threads, ``-j auto`` (which corresponds to ``-j 32`` here) can require 20+ GB of +RAM for Sphinx alone. + Specifying a list of files ^^^^^^^^^^^^^^^^^^^^^^^^^^ From 27e7f8433c850dfac89f9b48de1797cbfc1fced5 Mon Sep 17 00:00:00 2001 From: Raul Santos Date: Tue, 6 Jun 2023 11:13:49 +0200 Subject: [PATCH 55/76] Add page about using global classes in C# (#6740) Co-authored-by: Max Hilbrunner --- .../scripting/c_sharp/c_sharp_exports.rst | 5 +- .../c_sharp/c_sharp_global_classes.rst | 52 ++++++++++++++++++ .../c_sharp/img/globalclasses_addnode.webp | Bin 0 -> 18112 bytes .../img/globalclasses_createresource.webp | Bin 0 -> 20416 bytes .../img/globalclasses_exportedproperty1.webp | Bin 0 -> 17134 bytes .../img/globalclasses_exportedproperty2.webp | Bin 0 -> 14414 bytes tutorials/scripting/c_sharp/index.rst | 1 + 7 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 tutorials/scripting/c_sharp/c_sharp_global_classes.rst create mode 100644 tutorials/scripting/c_sharp/img/globalclasses_addnode.webp create mode 100644 tutorials/scripting/c_sharp/img/globalclasses_createresource.webp create mode 100644 tutorials/scripting/c_sharp/img/globalclasses_exportedproperty1.webp create mode 100644 tutorials/scripting/c_sharp/img/globalclasses_exportedproperty2.webp diff --git a/tutorials/scripting/c_sharp/c_sharp_exports.rst b/tutorials/scripting/c_sharp/c_sharp_exports.rst index dbf79e12dbd..0e699d55b2d 100644 --- a/tutorials/scripting/c_sharp/c_sharp_exports.rst +++ b/tutorials/scripting/c_sharp/c_sharp_exports.rst @@ -263,6 +263,8 @@ Since Godot 4.0, nodes can be directly exported without having to use NodePaths. [Export] public Node Node { get; set; } +Custom node classes can also be used, see :ref:`doc_c_sharp_global_classes`. + Exporting NodePaths like in Godot 3.x is still possible, in case you need it: .. code-block:: csharp @@ -296,7 +298,8 @@ Therefore, if you specify a type derived from Resource such as: private AnimationNode Resource; The drop-down menu will be limited to AnimationNode and all -its inherited classes. +its inherited classes. Custom resource classes can also be used, +see :ref:`doc_c_sharp_global_classes`. It must be noted that even if the script is not being run while in the editor, the exported properties are still editable. This can be used diff --git a/tutorials/scripting/c_sharp/c_sharp_global_classes.rst b/tutorials/scripting/c_sharp/c_sharp_global_classes.rst new file mode 100644 index 00000000000..d595fd94784 --- /dev/null +++ b/tutorials/scripting/c_sharp/c_sharp_global_classes.rst @@ -0,0 +1,52 @@ +.. _doc_c_sharp_global_classes: + +C# global classes +================= + +Global classes (also known as named scripts) are types registered in Godot's editor so they can be used +more conveniently. These classes show up in the *Add Node* and *Create Resource* dialogs, +and :ref:`exported properties ` are restricted to instances of the global class or derived classes. +Global classes are registered with the ``[GlobalClass]`` attribute. + +.. code-block:: csharp + + using Godot; + + [GlobalClass] + public partial class MyNode : Node + { + } + +The ``MyNode`` type will be registered as a global class with the same name as the type's name. + +.. image:: img/globalclasses_addnode.webp + +The ``[Icon]`` attribute also allows to provide the path to an icon so it can +be used as the class' icon in the editor. + +.. code-block:: csharp + + using Godot; + + [GlobalClass, Icon("res://Stats/StatsIcon.svg")] + public partial class Stats : Resource + { + [Export] + public int Strength { get; set; } + + [Export] + public int Defense { get; set; } + + [Export] + public int Speed { get; set; } + } + +.. image:: img/globalclasses_createresource.webp + +The ``Stats`` class is a custom resource registered as a global class. :ref:`Exporting properties ` of the +type ``Stats`` will only allow instances of this resource type to be assigned, and the inspector +will let you create and load instances of this type easily. + +.. image:: img/globalclasses_exportedproperty1.webp + +.. image:: img/globalclasses_exportedproperty2.webp diff --git a/tutorials/scripting/c_sharp/img/globalclasses_addnode.webp b/tutorials/scripting/c_sharp/img/globalclasses_addnode.webp new file mode 100644 index 0000000000000000000000000000000000000000..8e8378dc2711a979045f402a13c4c3cd159aa920 GIT binary patch literal 18112 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 literal 0 HcmV?d00001 diff --git a/tutorials/scripting/c_sharp/img/globalclasses_createresource.webp b/tutorials/scripting/c_sharp/img/globalclasses_createresource.webp new file mode 100644 index 0000000000000000000000000000000000000000..80de8c1111d7b0d757c505f9e1d447bf79d65d00 GIT binary patch literal 20416 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