From 08d0bdafa425002e2851c59706541ad9cd7d3047 Mon Sep 17 00:00:00 2001 From: Garry O'Donnell Date: Thu, 16 Mar 2023 19:02:15 +0000 Subject: [PATCH 01/59] Fix android SDK versions --- tutorials/export/exporting_for_android.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/export/exporting_for_android.rst b/tutorials/export/exporting_for_android.rst index 82b74c988..a54524ef5 100644 --- a/tutorials/export/exporting_for_android.rst +++ b/tutorials/export/exporting_for_android.rst @@ -29,8 +29,8 @@ Download and install the Android SDK. - Ensure that the `required packages `__ are installed as well. - Android SDK Platform-Tools version 30.0.5 or later - - Android SDK Build-Tools version 30.0.3 - - Android SDK Platform 31 + - Android SDK Build-Tools version 32.0.0 + - Android SDK Platform 32 - Android SDK Command-line Tools (latest) - CMake version 3.10.2.4988404 - NDK version r23c (23.2.8568313) @@ -41,7 +41,7 @@ Download and install the Android SDK. :: - sdkmanager --sdk_root= "platform-tools" "build-tools;30.0.3" "platforms;android-31" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;21.4.7075529" + sdkmanager --sdk_root= "platform-tools" "build-tools;32.0.0" "platforms;android-32" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;21.4.7075529" .. note:: From a6e3bdbfa65f790c785c3881bb46cfdb5c0b21ba Mon Sep 17 00:00:00 2001 From: Garry O'Donnell Date: Sun, 26 Mar 2023 18:29:14 +0100 Subject: [PATCH 02/59] Bump ndk to 23.2.8568313 --- tutorials/export/exporting_for_android.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/export/exporting_for_android.rst b/tutorials/export/exporting_for_android.rst index a54524ef5..891c4b856 100644 --- a/tutorials/export/exporting_for_android.rst +++ b/tutorials/export/exporting_for_android.rst @@ -41,7 +41,7 @@ Download and install the Android SDK. :: - sdkmanager --sdk_root= "platform-tools" "build-tools;32.0.0" "platforms;android-32" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;21.4.7075529" + sdkmanager --sdk_root= "platform-tools" "build-tools;32.0.0" "platforms;android-32" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;23.2.8568313" .. note:: From 1034e4cdbbe6dff815196486125b8341ef4b0309 Mon Sep 17 00:00:00 2001 From: Garry O'Donnell Date: Mon, 27 Mar 2023 13:00:06 +0100 Subject: [PATCH 03/59] Bump SDK build tools & platform to 33.0.2 & 33 --- tutorials/export/exporting_for_android.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/export/exporting_for_android.rst b/tutorials/export/exporting_for_android.rst index 891c4b856..89f7fd2dc 100644 --- a/tutorials/export/exporting_for_android.rst +++ b/tutorials/export/exporting_for_android.rst @@ -29,8 +29,8 @@ Download and install the Android SDK. - Ensure that the `required packages `__ are installed as well. - Android SDK Platform-Tools version 30.0.5 or later - - Android SDK Build-Tools version 32.0.0 - - Android SDK Platform 32 + - Android SDK Build-Tools version 33.0.2 + - Android SDK Platform 33 - Android SDK Command-line Tools (latest) - CMake version 3.10.2.4988404 - NDK version r23c (23.2.8568313) @@ -41,7 +41,7 @@ Download and install the Android SDK. :: - sdkmanager --sdk_root= "platform-tools" "build-tools;32.0.0" "platforms;android-32" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;23.2.8568313" + sdkmanager --sdk_root= "platform-tools" "build-tools;33.0.2" "platforms;android-33" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;23.2.8568313" .. note:: From 2100ca4bb6552f9b444a5670ab7357cd0b60d81c Mon Sep 17 00:00:00 2001 From: Dipal Zambare Date: Thu, 30 Mar 2023 11:21:48 +0200 Subject: [PATCH 04/59] Update signals.rst to correct signal names. 1. Update signal names as per the coding conventions 2. Update images to reflect correct signal names 3. Added note about signal callback names --- .../signals_13_signals_connection_icon.png | Bin 3704 -> 0 bytes .../signals_13_signals_connection_icon.webp | Bin 0 -> 14520 bytes .../signals_14_signals_connection_info.png | Bin 3656 -> 0 bytes .../signals_14_signals_connection_info.webp | Bin 0 -> 14576 bytes getting_started/step_by_step/signals.rst | 24 ++++++++++-------- 5 files changed, 13 insertions(+), 11 deletions(-) delete mode 100644 getting_started/step_by_step/img/signals_13_signals_connection_icon.png create mode 100644 getting_started/step_by_step/img/signals_13_signals_connection_icon.webp delete mode 100644 getting_started/step_by_step/img/signals_14_signals_connection_info.png create mode 100644 getting_started/step_by_step/img/signals_14_signals_connection_info.webp diff --git a/getting_started/step_by_step/img/signals_13_signals_connection_icon.png b/getting_started/step_by_step/img/signals_13_signals_connection_icon.png deleted file mode 100644 index a473b67a39d90243d5c3db1d4dd250ce622450f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3704 zcmV-;4u|oHP)djb6#p~l}}$?VQe~Weu7I{S6pRN zSYdZYRW)93Y(-Q}Qd>w;XJ$Z8M@&{gNn9^bUtK&)K}S$MLQO45R!liZH#vr-TV82&1*KN*JPq`rx^q@ z`fj>_LUuTzEyCeYH$Q=V$cTlF1}$}BUGFh(S5nqJuP*Dig{zlFzBa)vXb%R1@5@^l zhAu!%RZXC)nV*WcGwU5Kb!Q#!GjFXa5Crsa-@}|JLmGX|3^5h44Qb9mJgg1(z`)l!bW}VTRK3a!+!`lIC3x{=iMGK+F zW`}Nqg=VWt*9$HS)23IQW_wJfE(h&qyZ4@UEAQ68jxMN>ZPU;dwFDpItqaFR803YC zAT34~%5`I!nnVq|ws0rJ3L(#8TR6kQVBZzOS8wuUZrpBGHCot3C`6Pg-mqak(7GDd zEk7B>LwvTpo#LasJxKXLEbgZs(oW6B<8cs-=c@7+jGLX_{H0pt1)W~+sn(m>;KV+_ zgczhm_#r^@7;iodH+W0?{RsU2T&Nq<)FdDjQ6!+RcuQ??9S94kT(FBbT_$Wk97iq; zD@F@T0sN?DJCK$2tU;Pimh}!T%Q}CyydC_W^J5EdBYC7g9JT85=$@9kdW%H(_Uf^I zTIH>ML-amqBJrab!|`t3eCTo)6gfjt%ZO4CxQ#c=6R>lgx9$DZJT>!XXGEERtmLg0 z=S2C0Cy0?K_j#U#ODkm;q#Hd9?E-HMq0Dw>osg#URYPr9*2m||+re+ycHXY*byea| zrIg-?R{C&0MVy|0Fz4;R!gPWg{?FzKWlY1WaB;zK;G)7?sW>BJ-V9Tds%!})C2tNc zC#~_vly}8(0TN3$de{V99#g#iVV#ktY*p}X&)(5<$-MpEl*88c(8}~+Cm_SW4n_+!r>_^sbANBRyo}GtOaU(8x#=NP$ z!K_)~?bG)QCcNd$o6Ah(V#!-fEZvx;uI?8uR+G9&n*u=H=wT_iJokR@PgzyoPSIdYC#7iD1vq-?ojvm9kap1JP?Ky;gBwKO%G9__m?lYj=88-uS$C zU~=B;szcdbyzza#FF;(B)x(Ku&N9pax0@uW8ROI>z*pzJI&bPAHxA2J5jauoGvm6^ z!%~1Sc5D|iRmAT1@_u34_*5=5CAuFS@%NFg$e1_QWvAI5%*LC%@vEN6eO7j?E}eGs zR!F!>&NlUh9p}j+ERSsf$SWo{NlgOs)qR%68{yCw!ik1C5nXhBTR1Ueq!~SoQohfM zU+z!0kH1I&(l^t~_d|X-Z@AJ|2>YLXJG229hJh$rse74L>iz>2dVrH_koR!Ffe)R0 z!Dw&m_iuW;TcywP1+%^F-}maR+M7R%7X-cGKOlPJkltX_^}v7hhThN{=ncKW$F3Qu zHjV=U6aWkb2!@m_1eleGy(Y%U5tWzqo|jrg()|A)T{KSXj??pbOHx|sgS%v6Yepx( zlWe)y@vZs3N|M!gi_hFAiNg@mWZ-d@66|~V)+Q(0PR8AJct#~3*f%8tw$NVqmQ__LL3TJtFviF$`)0!oP+Euc`0ekoD1N)Yhh#K65Zwe8eg3ROpkYCleuCepJU8e_> zniu`7zIi0NBNuKI_ET|Ml(9 zpMZ$Jf8$@V-uV4yy?vnI@vx;o{6*rp->%o&{qZtj&{FD!det|QsTpo}N-3)rBQp0o zlVyA9n>A%Fa@FHNuVU08PcU)Sk5|Y=y#Wjo8lG^2Z%rX{6L3O5J#APYyBK8H6oT5Y z?(o!OQNrn5Wb~iF5-_Na&SlZ?Hbh@ZsVw=XphY4Fdvo7Tj>RIu-QD8?-+uoIZ}2VM zu6Mh2dWgX;-RySTG$s3vn{*qa!!%%2Fw(#3TSi0X3dod_pvgB;$rzXm-xTCZl>iMz z2B3`Rd7gklVh~>Bh~Aj$DQ{RWDyHoQALH7{C%4)LgT(*y+Xj+M|)+IadOG*rX5 zk##iB-Q2e>NoZ`FDH~4lKeLAyCf6-45q%q<&U5T=o@RpyEEfk z`#j64*`nDv2E2_1^Wp?Ar5~)jv2Sjb{J_Zf#30^qJ$2++xw|ml& z2b>x_cF~X5_TLJ~JAUgf$u}x$A)orz=P=N|I6O_jQQ)x5g~wcmIp3H_OMGJi@6L>G z2K4!GHCr?r$AGt~p&6e~W7yK9d{f^@x9>>YCHIl!^wD4ad4c(MT&IVlr^WO9xVl@D zdn{lGct*VXeA-LV)2JzPX3jS!g|Qw{bKiJ^i#n|rt>_%p`~1FX?pqHP{c~I2{5|P5 z`1VY9?fnqGo<5{|j5&6rR{ju0WC25K1*O(9(^|jc8-0}AftmI6dEHRc^^_-I^q^be zE8RVv(Y(<&)|Zm|HnX0xqHJws2^O!XhOMXMordZUJGnQx(hHcC;1m%bVHyikH=R(S~xzd`2-7(tX;VN)3BFGXmf{!8CV zO5^3kH{KnVniu8I3oOB+=LIrwe6FX=G7HZhH2w8`H@+Vdex_Sbw`%0u15JEC zX-eY(LkWKS#(ksl%EQwWKZf?aAL3r@hXg%N4rT0t0x&N&AR3Q60jCsMgBEh(DU4q| zf2>{X8}&s63^h!B>k z&7=W6Zm?$Hktg67h~;xAaojYnbsRZLSZHJXQs1aAxylPQ@r`wdrRGIRp`xxJN;B_U zMPs0G+NJ}j&ilQDCi4ay0CZRPtxle(Z|~c2e4ph`UpM>XF-~LQpFO?YdPL*_$AUpD za-8w4gUk=FqeQM6N4`0oiE^A2yHX6}=uIJV?HmjlyYYP%OTg%$psVuYg;EAk4N^Fj z3G#8FZ`7Bpc4q1u?+#1Ni-z&t)U0or*SRPf3RoNL=zUgwwk)uB3tFo1ng8B$oqBwC zB>d-?g_++z2x0jNS4pa%z192rFWosAIm_A|Gev>6fTtv%$no~P|Cs~8dJZI#O5 zVs|N*Eai720=+Hzve;Y8NvZT{{2sjl^agqZ=neD+dIRVU^ajuy=nbGZ&>QFti1Gow W5IevxvM-eY0000}%iax^v%qF^h$PrkYxVBmkJID%~-;BWXqm002MwOu_^_ z06g_$n!Cgpq+VIyY*xoYmWn~F0#g*txdHR=MBB$S z`vb!+aquPfaQ8*Wc6D54NbKNgY>2+zK%dtEbwCr)1?~W>fIZ*~xB%_|5)eRNJ<$>$ zzyLk2^l$VTuJrGqwd~PaE&vp*p#pfJpA6(mAGmx5Xb$@LyS6@#BH$|#2C)(V;LM>= zKR5vZFC75RQ&6b05)|sZ6acVh0N|zP-}+v~03dmYmZ$tJyHNxHWcLB!S>N9>`z!!x zeE=Vr?5^;f9jpdzYW_DbCM@O z)uI~C^N+DEtj{Y^MGbf;vOA2Tx(+XOMS@?c8A(W58d@hM?M}mX@--E3O3bueaf|-40-yQ?y(bGesTCd z<({gTBecfh!Ny?&4>f7=lWgQOIbW67o|b`U>Ad_Z3_l1{&%ZXD*b~;;b|@%L86qU$ zM4%OU%zh`%R%nUWk_CUJL3Hhh0tsOnqvhq8P`eWea%&N+&H%P@F~*IWQiov&BvSX+ zgSvNm0o={}<3n#>jjJjR@AS{>TOqn%%}t%wjahYjcLh^23i>floi7~=7sYMwPn#Ct zEqFqM)r1qEbbSy}o)V`P@DVS)0qpvO-Cj_|k;{vmx2)Ur*w6xhm>_x3m;8NPgA%aN z7M76cMUlyV!Rk9>njWVi5lO!5-ozY~ZwCW4z)RM&Oz-gxw`zaZ42twwoPOXKGl$kF z1PF`fa9bLn&OvwsF~g~4=XAVyIC%xRbXnfm1WS*KItz;lt_eHy-p$w+7%{Sb6tE9r z*iX+^*85fyTpTL40ZOM`?)P3#^MY7>-YaAYCaCa`XuK72_Zz%>;6#4@x|yY-T@ieg zhrt4*iaBx9I;ZTjxYGrfYx!%hXnbDL$rArZuRqk!$wEA$86fnLZ70L$lX_X!7~(yZ zIBdO$B=WKfOmlC5tw!g!P?`~Fzs<}mxtF%5lu&XZ+FvAinA zhoJ^_^3nSJ6h3dW`S@e+GtU+rM@?HD9O_5#M9WU8sdBYccvla*{6|XNxzF0n@=N{IwQVmmx9AHsJrab# zMaH(qBpj=_9*M)RR5{8ep`XXfNaxLU10EL}E5+64>=MT-1{RJui-sJYFt&CD>+IVU zNu2FI$P|4bYxQP9*;P$v<26|_d;z9)Ktg*ra4ghkp6Ju}TWg|~E%c4F;H z?iEysD$SoGpPsijw(qL zRQmyxy`mc7EB%{3cl`XN@1-~~CuJl&!>t^+iI__0p$;TE$UEqCI*m>fCU7I}_nrzW z#CeNZZeZ+jPq4(z84TZ+gJX5-#>ifzPbIE-(_=17+v>2sn?E{yGtBsn^@}}8eU-E* zepN(EMrI@hRm)=1liIK(6&N0T zM~GDzVHfVLo}=7!15|ETuXSM|QXZSUSx1>pRhMNc09gvLMV?ynQKSl-Vq9kqbHSGO z-sQ(>D8ULiuj7^*h1r-tc=e;OrqQ=MoP9B@lti!}!@{P@f2_BE;})J0XT`6+$uLg938TASq_Y!gsY6 z2`^pCYqQ>IZD)tvOy?=Sog#>XVEItbmfFocTNc&eUr?4v1gmOD$;ms(k#-*UX@w^^ z6eKl2Hgtj^=gzy!y!;l!11qj~iHgP5EkcClUS^BX^pdzy56&QJjq%L_oZqL~LaAvw z-Y-aQA53{akJ-R-&9kqDeihi)ke{K%ul*E4`e~4%P=Ov<+MD;To;h^a zBVXo>&d54fQuKr3v$Xpa-K>)@ExS5MJ{0RsCpQ~D(7=iDw|1|&m+h0GZD;dMOEaAz z0KdS~gpk==KjZ0{Lfm4ltV*yR6+vWMuuZ^Y60=srw>c(6@$dRa$NUi1MVl8)K`|4R zU4rl>e}UQ`XR;Lm9p%H*5)4xn`SMnFEzbE)1KGO_UNu$y1KUad{)clh6A~S`?lA zaGOuDB}O#Cj~!}lRCXAu*Y>&lyUNI<%Dg0;ghn4z0jKy}4pHSM_ddo*w@46GZsbz- zwuMy9w)-`QH(lruOXOghTiNYLZEYgByX)O{ZnpGtFNE}XKCELGM6JfOcG|kY_2IpE zu4#9y#}3M^2)AnNZ;0kN2Zrftb!=l-q_9fFhous}Q zk9?La$c1#l)7tr#dt^-4c8$ZaaL|3-fYtC)njF*Yz?mtmJxo1uu zK<3>h9{Mgyf_;%WBedz+&0Q%ZWkG#Ip&&7MtNe>((6?+GJC?D!PY4B`oFMTZ$IB1j ztr9JEW9OVYDkzT05hg7jmCi=`^LGyFwU$$LQ}W%HboP>K(kDn9D&#|*8=qlvlPLJb z3f@Cv$3;C$8GWYQdWs#jV4QAyG@@wdwX4&MsR^fcN6xYvbyT~ySQm-SMG>_mM_kJ( zZ+9C6aenqwsYj$^jEH=B?SDV5UU#&+;z=XhR}lOH?5=%;qVUsIDvXP+v_^RHM|=JZ zd$42ipz{C&sxWW1>P8b^ayQPUflY8!qxT$7=jes+lec`TzZ9i$k91bb1aI|zxHfsW za}-Nd!3S#|pTLLKkV)p4ebVrnii9oUNl;J=;wqx|2MtL6|xl3e1Xn$KlEn%*(ye2i-+oLy9e`Bss&r#c4M$Zz}8?u$*uE_x?9melDe9lL~q zs)zbjS=YN`ioObO$j2E+{;#%0} zk?a_`MT+ayPZ}E|iu_t42y=ozZsz_X!N8RxnG8}Zuz$)(6JTM^DJpaOEmMt1sfSeN zpr+8^XxMxGTB2wSO7>x!(_?M+ike|P|At%@?I()LGWi^O8p0j4Pd;y#<`U|sF%HKm zWL9>1KejPp3mhVeDGe@?iAvzM71~d{YcN11S&s{fo!AC-MsZoRs2i(y_ML1@W~1Cj zs+y(_CfDY_zQCDRti!RPVoN)Sjm>_zP`Qlx@r!jtun|Yk;AG-lwq^T^VWS1{mmatt zyeg`tI|6lYgru%hK~~0FuSxMzmAofF#JpTkz`PrD|6zha%A?(TNGKp?u4jAreex-z zzsT(!{Dqg~t$IARnIKAPUkvQ;(P05MaGF?j$Xn!63>IH;K;L$!Dw$OK$+nt|ewHdT zO?xX(dAwUba}edFs{CqNcZX2l;iJcnd0DmA24eLrdadEel2qmynNVLSl_O@(i!r z_~@TANa}&Nha_|0tqBv8)hjg93a{IOtqdbuFFI4C49PTYZj7Zy+%|Aw0^!;3QNDU8ye?IGf9=T^c*h} zD_~<*hOS*TtDU#C%u7mNLD0Iv)-+rv2 zjqoltS9>%4~yC4&u$UW!x`P)ne0z^N!h=AqODgG?P!W zbA@X4c@2tu(Sl0wSEzD7(wpVZRuU)6ZLb2}kCikb4;7rx!|U&ts%cgHyc=FI${eRV z2kBNb#GaL^P55YJl=dmwy79+P6NHAW0F0DYWU^1fwJd4tU3y8_gC!?Hg}nhO%org= z#io*tMqnexeG^Y@KX;Zz0W+SSC8j021X`)M&5^^huIn_P6FYvT8)@Jw$m{}R%y z+mT-kT#l=`h+zCFT2}%H@3OFjm&#|Y?K+A$?L z4IoU@7tJH!M3zipZF}O0llaF~I|h!}`$mSDdI@hn{m#seOa9GwlU$QHorg}3A=+od z!hU@>lf8@QLLlBCY>}+~H0DmzdCq6*7Y|ACp5?>q$!bY!{N63!CU;Q&*+#WFm@*^f z3ug`eE@tfgLT!z^?Bgr=r;p<73)LJLnPcAA(-v-ZCyN7%i^BeL;)^EN7>)sOA&$5- zec9ozmn~7z9m*HwH?|6I`m$$`+%w+%;hgN_o>J|v1(waNx_j-_H>JVHAu^T{i_8n0 zt{SYMFH3HI_6iD*}Ljqph>>_&dA+yRLcZz54)onU6qYtcH`DIOf3RfJ(Vm^nH;XR>U12 z-CZN>Na1R}55QW|ZE>#(viQfudu(=?_=x=tQZcQ3GO-wH0|l<8M$w$&?5B2w_^+#M zZ_A}~$FDr@HIC}C&bKx0Q1b8iCdT8as%F3_KiZN<$xt#jx*kPIZM|vKPr4F66dJ1X z^*hp3*}-F$QM3GMvhKZ7dxQI08_#5sE~RvYKNSx@$!$Hck|y9isc}EUYOheOjUCKx z2x;MXS*71F!_9qPgq1_x`Bi(?Ei!Y3?iynm#$+R)NLJ)<7v5RK9Qk#rV7wa;zS+Ng z@5x{ogMup^*j;)w^EjMLYr=Tvc*hZyL4$>!qLBF4@D!C?dDxbdWBq8dUylgA9&+!z zI6l%ig>-4#9Wi2iC4lLhV?IJ^@Y!wEnC|fE}aEzX*@AEr^?9hCJ zM-P-iFd=SR@(vR}AE#})uOR%faXkYV&50=GCT3FbF|@Qr_WjFgCF9NtI8CkxAicb9 zSQ-{46sG3p5w=9{gJFv-?L1>qFJwc^J;Iij>9Zp>I0CcWvULZImH0P6Q9>IARInA$ zE4y?!ux}5_8y)paFNGc)yjPmURMqXmhq^?fs1|I-rUFRaZV&|E_ofT9a_?;~h`RFY z5p*ik2o>7A((b5qftPmLD^OnmojejDj9!@8@A*_B-v0>j8K6)DaALFL19BJQw z1^<%TF`n)9!cyN>sOIJLszYu{S^6585XIogC z!brk-o?+M=TtB3GtTYr?fT!Q{a`w&}vlB<7p z;pSq6pimVg!(yn$Ht=13>h1VE>~qM?#V)Jj5=S^MJo;p>a!=?}WJ<`S49`m@e$`T9=xZ*`hpW>=lRY4WBHP_QDN)WM zY|T1RF;?9qEVc`VQWA<)D*Sk~o_>}{*00a$ZM?ZNvaIrx5Sbv4`?`9vl6rs`UX47^ z_{1qFM%Y;kCJ64)JD8l*Of}MNnj3pMXw(bY6cP03O0ChMPkD26nzLJ*p-g4mroJeW z)ReIG#dJhlrx&!DSQ}%3YIQr}?n!(rr+FYbjWnt0*Kdz`$FRazbr7^&-TQ9phSSdX zq@)RjQ;uv|1^TN@Op)KcJw?&hNCe5w0uh*~|?#+wR#X&5uS!}YT=u>hRu&HgyV3jx@ ze4wSuS6JcXd&t0-u=s|_1Rwr_F}-p$`gR5G@jlSuYIPS{Eh|PCLCZ)TpWJM+>-GF; zFU@_$g89Xda0MLMQQX(2{%}v0%=Jgz7gi(fJTqr}A>Rtu7MK0%UrsQ?kFtN!G6nH? z)HfCNK4_qDa`bd`;eOdyxsb=!#KD8X`^w;JQf!3nz;UH+u>=V!6)uH4GUdK8A#>j* zb3A5Xso)Uh#=-xrHBU`2{$Mx;P_s+WpUnzVPZjNiGoF^orkeT}zkW101cqNHve zx;z=We0YC;Z{Ph%HN+3kDNi>y)=0g`y^^9l}T`reC-Pc z#xYyCc>Zkh^Oe5fw|adIL62+i%Bc+>1@jd7OrGXF_@-5c@rGA-vPSETSI~-&cp|&) ztA&p4n9iARBbx=8p4Cbz?SnFL4=LIL%y_t=xcHNx)UH+)iYGr=hIo5Hf=0D>c0TSs zzw4VX#NIw@q4?Ap+B`7G?*cbG`aD>nY1N>k+y77l200F_vCXVvE69*?vPPa|Q6r}a z?9Hv`=psU}9ok3yl|nu31Sltx#}YC|JgcR0OJp+2-#p&o8Z)+pFXOzNBwX1n`mp<= z)q*cG;|zpMt$RB8U55~-vRC5QJT*%rS0eMdLA_9_lBY0hf)mcxQtR~UgrK8Yd&l(D z%b&-3(1vkEjEa~~*`69OIBtaB*3x=yxj7VkFJe9JkXe^b~xSk-lB-l-pJ?s ziph~GgDsHja5-=yg0nP3@U4al!&m#c_re4}=9B}YE*j0^$J$!y!yi-G?U8@Izjac= zQNYtp)v0Yv7&1B+CEZ~I1ig^nFegb5cfUz8HL$4e#;8{rv$!Yfuj zN@*uVnf3tl_8>_aQMbOqn?#j-rm}kHp4Wm5?h#{CZ*tux-x{!G`L0?v?#QNB7mqH* zXLle8`gv8OSs1ZDRnfi@CNXCDDn+b)Yq_7x)a~0AsZ9)F9(?kAX3%CWwl%V&W?}Q; zI)Sx(*S8md{ry>*0WuT_U`)I9asvXpZxzn_S`Hy~O{=>auChKF^UCySIviksF=y;V zr2Q}o7XW0N0br}e*hsiaDxYi4?N0A|j0;_cX%=XNRK)b!shL%GmeZ(%-0mq$8SiSNJTt5n zW#Jnk8$3MqF{Q}y_4{<@Ke14rA)c%o|1k-tZFNUuvvlvCxzpjC&Gm5gS4lyotP3{J z%@|O^rh5;hH}4F(v1&$W%eB!}X>GI$Y`%P%vhd%MIeqNvv4*LA_s;;SfhZQU+3=$MZ?>~bLoyd51_Nf!e9q5DKM}oFi?E}3p!35jH~01RM7XBSlBqY zc=!Z_L})?_`DLZBFtM?4aImq_qao;V0Gk4bl1=y)E|oq6kKLOZd@r>GpF^p!hsNOj z?hO%pL<9jL?KL`j22QS<+&sLZV&W2#QqsyQs%q*Qnp%cN#wModO>`*C!O_Xt#nlJt z>*pVEH!$*kRP=+G*toRxjE9+7**UqTWsk}$Dj!!pX?oh+@~pM3y`%S4U;n`1>!INf z;~zgwOiq3NvbeOo@^$sw+WN-c{*Qyhqo2nori*L%<K_3 zi}-)a?61WB&g%<6jD>-IcvuvG0`Mb*PpkR)`1X#MphL7I6BUKZ^+xxzWUZ-|-G_;@ z)mEHemsm~gIPX#96Mu6SN>5;ZsIHRv(dF8NzeL5bIcJ>4BVm#A85DpFid(ar@K7y| z{$Z1}_nwJ8Q{yI%1SSE;^}?V@PR)-7nf0Nw{GHEFaz1`*TG3c-2_uou@%LqzQ@#NQ zjUwoHB#9OAt{;ttR7>cOuZ(+|5Wo_rO1p;&F;=ir@Z~>sFOeWV>|cDh_DtrPDK1vLLO_p5a97Ew=xwr%b26Y2bod5V*l(o5TK~$~vY?I+j z_?&6RyS9DVXSW93@woEjAO9rp&~!-)UB=^ZnW8?}{P1waZAfjNwnEoD`F2+>buORG zgVZMs8d;!#0q||h`}RfKE#{F(b8zBXw#UbWdlJf;V>It+!{ z&x88ox1LQhmc*zOYKP-v=jTUmnzHoiaqvh7^t{WJef1-fB0gC!V_Zva2vJp@ns@%7 z>O66~t6wsa>CUQ1eu~C2ljON7|0!ve7t-TP@8YBB=LC$`lcd&nOau>|UL+lIJ*8_) zy`fv9o~f^uT#s9$x`f5_>J4&XKsEUdvkPMmKCk+9TNVM3ysOS~K=ar4k$F`JS%8 zC_XhF8%^ZCs4IZ&S$v+6E%eV}$zLY)qZt|ynXFJ?5MbOkEKuoU(niP(HY)K;JNd9Y5{ zK)KXb&pkcHoWoy5X(91z62^4|A1t70k;_q=z2xC7c7y8=rLY@-!pix%C&}bG&vsd# zVwxqW40ZmRv%M{2*enyP^>mK&+K0hY=ZLSILAR}yQrm9<4X0EmK1Q%;Grzly9bR`f z+r8WMl;l)h^VaO8Y61oBfBpnTBqsw&fvDLnwJ9y zcD|FJ1anvOcG3fbhX=8>)nrPh6|VP=!*d%e)(#=;=~ z8kUx4!pRf)t@}@!A{6Z~zSZ&IPn@ylcziNt5#i`a*4xxNMY^p*%I$#Zs1*mFbhF;A zmoMp9EaaztogIFw1zhI7a6TD)riOTxUx%j{ppYmp!~JD&i*veimbsmS<&^B3IoEm; zSQ@#S+|ovem0XJ{LGlQ5{rzGVvr-4|u1_=7p%~8FPCm~j^)`?Zzs&Wx5s4;Bf}0#A zGnaX^ZYsXjhDCn&2M?ufhIb1pj)rVFjhDvA$aIa}7EaD~02Ge*epOR#=_YubyM#`B zYjyW6R_n~ve?{R3ZZMJJ#RW0ao&Kz{8D(jiRi`%CGMlQn`|a03jY3O1-5^uohxpHU zO6p#n&h$;9YrSf3_K6=0yac{Vcpt1At;Ryz@gHT#XuPu`Cp&zi;1;Ggk-nvS{{Cc) zBjjKz@s-C9B(T5G|9txOPF?PLI5A%2QH1EhitT?}HA43YqxZ0!i^Y`js^nR)Ww^XU` z;J&CUadWF=SDPe4!b~#0W7C*m^QHwHt|45R>`xibVpd|Lc=K%3Rn>gj@>4qD_$*OQ z`dU49rExsr`l{5x|K*8+`fP^&IvPQWUQH+jz#&jK2PCV#gOiJ=9Q)4mZgy4|m>j#Q zm@Y^cuI%9Kq7jI2FbuqH1Pye9O2OC_%f2WCgxK)@WO4OG;ATR`8*u{$G?aA_eS ze}8{Le-S}1gp-i4l$4YZ2rL8!3!oVSK6gElkN^QsAC5mQsG$Fu6yX9#x_EiAURs3M zd-)>e*wOy40z;2LRRhq1-=;6`uMGPjVM3bd8&Py3Xo3(J1d1)*LZLIDuCkgy;~$iw3=whvO(?{7c
  • %37w#Zr;Nausi-0<)`Z;(a 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 diff --git a/getting_started/step_by_step/img/signals_14_signals_connection_info.webp b/getting_started/step_by_step/img/signals_14_signals_connection_info.webp new file mode 100644 index 0000000000000000000000000000000000000000..0eb336c5e9872ee7afee312814e3ff6424505169 GIT binary patch literal 14576 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 X{*{6M|1$9B=O!8h{>|nOeoX!^S80OJ literal 0 HcmV?d00001 diff --git a/getting_started/step_by_step/signals.rst b/getting_started/step_by_step/signals.rst index bed1df8a8..391d2b796 100644 --- a/getting_started/step_by_step/signals.rst +++ b/getting_started/step_by_step/signals.rst @@ -1,5 +1,3 @@ -:article_outdated: True - .. Intention: give the user a first taste of signals. We should write more documentation in the scripting/ section. .. Note: GDScript snippets use one line return instead of two because they're @@ -114,7 +112,7 @@ Double-click the "pressed" signal to open the node connection window. There, you can connect the signal to the Sprite2D node. The node needs a receiver method, a function that Godot will call when the Button emits the signal. The editor generates one for you. By convention, we name these callback -methods "_on_NodeName_signal_name". Here, it'll be "_on_Button_pressed". +methods "_on_node_name_signal_name". Here, it'll be "_on_button_pressed". .. note:: @@ -133,12 +131,12 @@ Click the Connect button to complete the signal connection and jump to the Script workspace. You should see the new method with a connection icon in the left margin. -.. image:: img/signals_13_signals_connection_icon.png +.. image:: img/signals_13_signals_connection_icon.webp If you click the icon, a window pops up and displays information about the connection. This feature is only available when connecting nodes in the editor. -.. image:: img/signals_14_signals_connection_info.png +.. image:: img/signals_14_signals_connection_info.webp Let's replace the line with the ``pass`` keyword with code that'll toggle the node's motion. @@ -152,7 +150,7 @@ the ``not`` keyword to invert the value. .. tabs:: .. code-tab:: gdscript GDScript - func _on_Button_pressed(): + func _on_button_pressed(): set_process(not is_processing()) .. code-tab:: csharp C# @@ -203,7 +201,7 @@ Your complete ``Sprite2D.gd`` code should look like the following. position += velocity * delta - func _on_Button_pressed(): + func _on_button_pressed(): set_process(not is_processing()) .. code-tab:: csharp C# @@ -300,7 +298,7 @@ We can now connect the Timer to the Sprite2D in the ``_ready()`` function. func _ready(): var timer = get_node("Timer") - timer.timeout.connect(_on_Timer_timeout) + timer.timeout.connect(_on_timer_timeout) .. code-tab:: csharp C# @@ -312,13 +310,17 @@ We can now connect the Timer to the Sprite2D in the ``_ready()`` function. The line reads like so: we connect the Timer's "timeout" signal to the node to which the script is attached. When the Timer emits ``timeout``, we want to call -the function ``_on_Timer_timeout()``, that we need to define. Let's add it at the +the function ``_on_timer_timeout()``, that we need to define. Let's add it at the bottom of our script and use it to toggle our sprite's visibility. +.. note:: By convention, we name these callback methods in GDScript as + "_on_node_name_signal_name" and in C# as "OnNodeNameSignalName". + Here, it'll be "_on_timer_timeout" for GDScript and OnTimerTimeout() for C#. + .. tabs:: .. code-tab:: gdscript GDScript - func _on_Timer_timeout(): + func _on_timer_timeout(): visible = not visible .. code-tab:: csharp C# @@ -361,7 +363,7 @@ Here is the complete ``Sprite2D.gd`` file for reference. position += velocity * delta - func _on_Button_pressed(): + func _on_button_pressed(): set_process(not is_processing()) From 4175447b2e6884faf29e9f325f7e75b46605db40 Mon Sep 17 00:00:00 2001 From: kleonc <9283098+kleonc@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:40:15 +0200 Subject: [PATCH 05/59] Fix code example in Using NavigationMeshes --- .../navigation/navigation_using_navigationmeshes.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tutorials/navigation/navigation_using_navigationmeshes.rst b/tutorials/navigation/navigation_using_navigationmeshes.rst index 0ed1e084b..7b8626b5c 100644 --- a/tutorials/navigation/navigation_using_navigationmeshes.rst +++ b/tutorials/navigation/navigation_using_navigationmeshes.rst @@ -158,12 +158,10 @@ navigationmesh from outline data the shapes cannot overlap. if node is CollisionPolygon2D: - var new_collision_outline: PackedVector2Array = PackedVector2Array() var collisionpolygon_transform: Transform2D = node.get_global_transform() - var collisionpolygon: CollisionPolygon2D = node.get_polygon() + var collisionpolygon: PackedVector2Array = node.polygon - for vertex in collisionpolygon: - new_collision_outline.append(collisionpolygon_transform.xform(vertex)) + var new_collision_outline: PackedVector2Array = collisionpolygon_transform * collisionpolygon new_navigation_polygon.add_outline(new_collision_outline) @@ -188,7 +186,7 @@ The following script creates a new 2D navigation region and fills it with proced Vector2(50.0, 0.0), Vector2(50.0, 50.0), Vector2(0.0, 50.0), - ]) + ]) new_navigation_polygon.add_outline(new_outline) new_navigation_polygon.make_polygons_from_outlines() From a6359685a630f9bf8b7e54a1c20f0cf866702687 Mon Sep 17 00:00:00 2001 From: Riteo Date: Fri, 31 Mar 2023 17:25:53 +0200 Subject: [PATCH 06/59] Change PNG image requirement to SVG in custom platform ports page It got changed to SVG in godotengine/godot@cebefc9. I'm not sure if PNGs are supported anymore but I guess that it's still good practice to use SVGs and this isn't supposed to be a full in-depth tutorial anyways :shrug: --- .../core_and_modules/custom_platform_ports.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contributing/development/core_and_modules/custom_platform_ports.rst b/contributing/development/core_and_modules/custom_platform_ports.rst index 737d21a4c..bd110afed 100644 --- a/contributing/development/core_and_modules/custom_platform_ports.rst +++ b/contributing/development/core_and_modules/custom_platform_ports.rst @@ -68,9 +68,9 @@ Required features of a platform port At the very least, a platform port must have methods from the :ref:`class_OS` singleton implemented to be buildable and usable for headless operation. -A ``logo.png`` (32×32) image must also be present within the platform folder. -This logo is displayed in the Export dialog for each export preset targeting -the platform in question. +A ``logo.svg`` (32×32) vector image must also be present within the platform +folder. This logo is displayed in the Export dialog for each export preset +targeting the platform in question. See `this implementation `__ for the Linux/\*BSD platform as an example. See also the @@ -153,7 +153,7 @@ games. export template binary directly by renaming it to match the PCK file. See the `EditorExportPlatform header `__ for reference. - ``run_icon.png`` (16×16) should be present within the platform folder if + ``run_icon.svg`` (16×16) should be present within the platform folder if :ref:`doc_one-click_deploy` is implemented for the target platform. This icon is displayed at the top of the editor when one-click deploy is set up for the target platform. From f4efa2fd8aa461fc2e3e36f955e69d9ef2f8c0bd Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 31 Mar 2023 19:29:08 +0200 Subject: [PATCH 07/59] Move rationale about Godot using SCons to Frequently asked questions This also removes an obsolete bit about the command prompt to use when compiling using Visual Studio (automatic detection has been implemented for years). --- about/faq.rst | 31 ++++++++++++- .../introduction_to_the_buildsystem.rst | 43 ++++--------------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/about/faq.rst b/about/faq.rst index cb80a4ab8..a37fbc913 100644 --- a/about/faq.rst +++ b/about/faq.rst @@ -478,6 +478,35 @@ This custom UI toolkit :ref:`can't be used as a library `. +.. _doc_faq_why_scons: + +Why does Godot use the SCons build system? +------------------------------------------ + +Godot uses the `SCons `__ build system. There are no +plans to switch to a different build system in the near future. There are many +reasons why we have chosen SCons over other alternatives. For example: + +- Godot can be compiled for a dozen different platforms: all PC + platforms, all mobile platforms, many consoles, and WebAssembly. +- Developers often need to compile for several of the platforms **at + the same time**, or even different targets of the same platform. They + can't afford reconfiguring and rebuilding the project each time. + SCons can do this with no sweat, without breaking the builds. +- SCons will *never* break a build no matter how many changes, + configurations, additions, removals etc. +- Godot's build process is not simple. Several files are generated by + code (binders), others are parsed (shaders), and others need to offer + customization (:ref:`modules `). This requires + complex logic which is easier to write in an actual programming language (like Python) + rather than using a mostly macro-based language only meant for building. +- Godot build process makes heavy use of cross-compiling tools. Each + platform has a specific detection process, and all these must be + handled as specific cases with special code written for each. + +Please try to keep an open mind and get at least a little familiar with SCons if +you are planning to build Godot yourself. + .. _doc_faq_why_not_stl: Why does Godot not use STL (Standard Template Library)? @@ -547,7 +576,7 @@ such a case, you should consider a different approach to optimization. The vast majority of games do not need this and Godot provides handy helpers to do the job for most cases when you do. -If a game needs to process such a large amount of objects, our recommendation +If a game needs to process such a large amount of objects, our recommendation is to use C++ and GDExtensions for performance-heavy tasks and GDScript (or C#) for the rest of the game. diff --git a/contributing/development/compiling/introduction_to_the_buildsystem.rst b/contributing/development/compiling/introduction_to_the_buildsystem.rst index 8e6a623e3..cdc8802d2 100644 --- a/contributing/development/compiling/introduction_to_the_buildsystem.rst +++ b/contributing/development/compiling/introduction_to_the_buildsystem.rst @@ -5,45 +5,20 @@ Introduction to the buildsystem .. highlight:: shell -SCons ------ - -Godot uses `SCons `__ to build. We love it, we are not -changing it for anything else. We constantly get requests to move the build -system to CMake, or Visual Studio, but this is not going to happen. There are -many reasons why we have chosen SCons over other alternatives, for example: - -- Godot can be compiled for a dozen different platforms: all PC - platforms, all mobile platforms, many consoles, and WebAssembly. -- Developers often need to compile for several of the platforms **at - the same time**, or even different targets of the same platform. They - can't afford reconfiguring and rebuilding the project each time. - SCons can do this with no sweat, without breaking the builds. -- SCons will *never* break a build no matter how many changes, - configurations, additions, removals etc. -- Godot's build process is not simple. Several files are generated by - code (binders), others are parsed (shaders), and others need to offer - customization (plugins). This requires complex logic which is easier - to write in an actual programming language (like Python) rather than - using a mostly macro-based language only meant for building. -- Godot build process makes heavy use of cross-compiling tools. Each - platform has a specific detection process, and all these must be - handled as specific cases with special code written for each. - -Please try to keep an open mind and get at least a little familiar with it if -you are planning to build Godot yourself. Setup ----- -Please refer to the documentation for :ref:`doc_compiling_for_android`, -:ref:`doc_compiling_for_ios`, :ref:`doc_compiling_for_linuxbsd`, -:ref:`doc_compiling_for_macos`, :ref:`doc_compiling_for_uwp`, -:ref:`doc_compiling_for_web`, and :ref:`doc_compiling_for_windows`. +:ref:`Godot uses the SCons build system. ` +Please refer to the documentation for: -Note that for **Windows/Visual Studio**, you need to use ``x86_x64 Cross Tools -Command Prompt for VS 2017`` or similar, depending on your install, instead of -the standard Windows command prompt to enter the commands below. +- :ref:`doc_compiling_for_android` +- :ref:`doc_compiling_for_ios` +- :ref:`doc_compiling_for_linuxbsd` +- :ref:`doc_compiling_for_macos` +- :ref:`doc_compiling_for_uwp` +- :ref:`doc_compiling_for_web` +- :ref:`doc_compiling_for_windows` Platform selection ------------------ From ca949703567c669adae1e084aa751a9a8c767464 Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Sat, 1 Apr 2023 00:40:18 +0200 Subject: [PATCH 08/59] Less intrusive 4.0 update state info (#7100) * Less intrusive 4.0 update state info --------- Co-authored-by: Yuri Sizov <11782833+YuriSizov@users.noreply.github.com> --- _templates/layout.html | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/_templates/layout.html b/_templates/layout.html index 65225fbf3..268c4ca38 100644 --- a/_templates/layout.html +++ b/_templates/layout.html @@ -28,14 +28,14 @@ {%- block document %}
    {% if godot_is_latest or godot_show_article_status %} -
    +
    {% if godot_is_latest %}
    -

    Attention

    +

    Attention: Here be dragons

    - You are reading the latest - (unstable) version of this documentation, which may document features not available - or compatible with Godot 3.x. + This is the latest + (unstable) version of this documentation, which may document features + not available in or compatible with released stable versions of Godot.

    {% endif %} - {% if godot_show_article_status %} + {% if godot_show_article_status and not godot_is_latest %}
    + {% if meta and meta.get('article_outdated') == 'True' %}

    Work in progress

    - Godot documentation is being updated to reflect the latest changes in version - {{ godot_version }}. Some documentation pages may - still state outdated information. This banner will tell you if you're reading one of such pages. + The content of this page was not yet updated for Godot + {{ godot_version }} + and may be outdated. If you know how to improve this page or you can confirm + that it's up to date, feel free to open a pull request.

    + {% else %} +

    Up to date

    - {% if meta and meta.get('article_outdated') == 'True' %} - The contents of this page can be outdated. If you know how to improve this page or you can confirm - that it's up to date, feel free to open a pull request. - {% else %} - The contents of this page are up to date. If you can still find outdated information, please - open an issue. - {% endif %} + This page is up to date for Godot {{ godot_version }}. + If you still find outdated information, please open an issue.

    + {% endif %}
    {% endif %}
    From 3ecaaf5f3067150dd1ef55de34d58ccf7015b166 Mon Sep 17 00:00:00 2001 From: LDouglas23 <129562917+LDouglas23@users.noreply.github.com> Date: Sat, 1 Apr 2023 01:03:08 +0100 Subject: [PATCH 09/59] Update 2d_lights_and_shadows.rst to fix ref link --- tutorials/2d/2d_lights_and_shadows.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/2d/2d_lights_and_shadows.rst b/tutorials/2d/2d_lights_and_shadows.rst index 663cd2a01..e8c534248 100644 --- a/tutorials/2d/2d_lights_and_shadows.rst +++ b/tutorials/2d/2d_lights_and_shadows.rst @@ -36,7 +36,7 @@ There are several nodes involved in a complete 2D lighting setup: - :ref:`CanvasModulate ` (to darken the rest of the scene) - :ref:`PointLight2D ` (for omnidirectional or spot lights) -- :ref:`DirectionalLight2D ` (for sunlight or moonlight) +- :ref:`DirectionalLight2D ` (for sunlight or moonlight) - :ref:`LightOccluder2D ` (for light shadow casters) - Other 2D nodes that receive lighting, such as Sprite2D or TileMap. From 1a6c89ee6546848f3dd1cca608ed8259906a5855 Mon Sep 17 00:00:00 2001 From: Samuel Date: Sat, 1 Apr 2023 06:10:10 +0000 Subject: [PATCH 10/59] fmt: type is Node2D in body_entered(body: Node2D) --- getting_started/first_2d_game/03.coding_the_player.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/first_2d_game/03.coding_the_player.rst b/getting_started/first_2d_game/03.coding_the_player.rst index 8c003d101..d6f63af82 100644 --- a/getting_started/first_2d_game/03.coding_the_player.rst +++ b/getting_started/first_2d_game/03.coding_the_player.rst @@ -475,7 +475,7 @@ Inspector tab to see the list of signals the player can emit: .. image:: img/player_signals.webp Notice our custom "hit" signal is there as well! Since our enemies are going to -be ``RigidBody2D`` nodes, we want the ``body_entered(body: Node)`` signal. This +be ``RigidBody2D`` nodes, we want the ``body_entered(body: Node2D)`` signal. This signal will be emitted when a body contacts the player. Click "Connect.." and the "Connect a Signal" window appears. We don't need to change any of these settings so click "Connect" again. Godot will automatically create a function in From 27918155b07f4ba594b811caa970bec2e5da1f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Tue, 4 Apr 2023 15:03:41 +0200 Subject: [PATCH 11/59] GDExtension example: _process delta is a double It's `Variant::FLOAT` in the bindings, which is always a double. Changed other member variables for consistency so there's no implicit conversions between float and double. Fixes https://github.com/godotengine/godot-cpp/issues/1073. --- .../gdextension/gdextension_cpp_example.rst | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/tutorials/scripting/gdextension/gdextension_cpp_example.rst b/tutorials/scripting/gdextension/gdextension_cpp_example.rst index 22746486a..c3bcbf142 100644 --- a/tutorials/scripting/gdextension/gdextension_cpp_example.rst +++ b/tutorials/scripting/gdextension/gdextension_cpp_example.rst @@ -37,7 +37,7 @@ of Godot. GDExtensions will not work in older versions of Godot (only Godot 4 an To use `GDExtension `__ you need to use the ``4.0`` branch of godot-cpp, which is only compatible with Godot 4.0 and being used here as an example. - The ``master`` branch is the development branch and is being updated + The ``master`` branch is the development branch and is being updated regularly to work with godot's ``master`` branch. If you are versioning your project using Git, it is recommended to add it as @@ -160,7 +160,7 @@ GDExtension node we'll be creating. We will name it ``gdexample.h``: GDCLASS(GDExample, Sprite2D) private: - float time_passed; + double time_passed; protected: static void _bind_methods(); @@ -169,7 +169,7 @@ GDExtension node we'll be creating. We will name it ``gdexample.h``: GDExample(); ~GDExample(); - void _process(float delta); + void _process(double delta); }; } @@ -194,8 +194,8 @@ and destructor defined, but there are two other functions that will likely look familiar to some, and one new method. The first is ``_bind_methods``, which is a static function that Godot will -call to find out which methods can be called and which properties it exposes. -The second is our ``_process`` function, which will work exactly the same +call to find out which methods can be called and which properties it exposes. +The second is our ``_process`` function, which will work exactly the same as the ``_process`` function you're used to in GDScript. Let's implement our functions by creating our ``gdexample.cpp`` file: @@ -211,15 +211,15 @@ Let's implement our functions by creating our ``gdexample.cpp`` file: } GDExample::GDExample() { - // initialize any variables here + // Initialize any variables here. time_passed = 0.0; } GDExample::~GDExample() { - // add your cleanup here + // Add your cleanup here. } - void GDExample::_process(float delta) { + void GDExample::_process(double delta) { time_passed += delta; Vector2 new_position = Vector2(10.0 + (10.0 * sin(time_passed * 2.0)), 10.0 + (10.0 * cos(time_passed * 1.5))); @@ -286,9 +286,9 @@ initialize them, but you might have to set up more things depending on your needs. We call the function ``register_class`` for each of our classes in our library. The important function is the third function called ``example_library_init``. -We first call a function in our bindings library that creates an initilization object. -This object registrates the initialization and termination functions of the GDExtension. -Furthermore, it sets the level of initilization (core, servers, scene, editor, level). +We first call a function in our bindings library that creates an initilization object. +This object registrates the initialization and termination functions of the GDExtension. +Furthermore, it sets the level of initilization (core, servers, scene, editor, level). At last, we need the header file for the ``register_types.cpp`` named ``register_types.h``. @@ -319,7 +319,7 @@ build files in a subsequent tutorial. master, you may need to make small changes using it with older versions or refer to the ``SConstruct`` file in the Godot 4.0 documentation. -Once you've downloaded the ``SConstruct`` file, place it in your GDExtension folder +Once you've downloaded the ``SConstruct`` file, place it in your GDExtension folder structure alongside ``godot-cpp``, ``src`` and ``demo``, then run: .. code-block:: bash @@ -423,12 +423,12 @@ functions: ... private: - float time_passed; - float amplitude; + double time_passed; + double amplitude; public: - void set_amplitude(const float amplitude); - float get_amplitude() const; + void set_amplitude(const double amplitude); + double get_amplitude() const; ... In our ``gdexample.cpp`` file we need to make a number of changes, we will only @@ -443,12 +443,12 @@ show the methods we end up changing, don't remove the lines we're omitting: } void GDExample::GDExample() { - // initialize any variables here + // Initialize any variables here. time_passed = 0.0; amplitude = 10.0; } - void GDExample::_process(float delta) { + void GDExample::_process(double delta) { time_passed += delta; Vector2 new_position = Vector2( @@ -459,11 +459,11 @@ show the methods we end up changing, don't remove the lines we're omitting: set_position(new_position); } - void GDExample::set_amplitude(const float p_amplitude) { + void GDExample::set_amplitude(const double p_amplitude) { amplitude = p_amplitude; } - float GDExample::get_amplitude() const { + double GDExample::get_amplitude() const { return amplitude; } @@ -479,12 +479,12 @@ code: .. code-block:: C++ ... - float amplitude; - float speed; + double amplitude; + double speed; ... - void _process(float delta) override; - void set_speed(float p_speed); - float get_speed(); + void _process(double delta) override; + void set_speed(double p_speed); + double get_speed(); ... This requires a few more changes to our ``gdexample.cpp`` file, again we're only @@ -505,7 +505,7 @@ showing the methods that have changed so don't remove anything we're omitting: speed = 1.0; } - void GDExample::_process(float delta) { + void GDExample::_process(double delta) { time_passed += speed * delta; Vector2 new_position = Vector2( @@ -518,11 +518,11 @@ showing the methods that have changed so don't remove anything we're omitting: ... - void GDExample::set_speed(float p_speed) { + void GDExample::set_speed(double p_speed) { speed = p_speed; } - float GDExample::get_speed() const { + double GDExample::get_speed() const { return speed; } @@ -533,7 +533,7 @@ The first two arguments are the minimum and maximum value and the third is the s .. note:: - For simplicity, we've only used the hint_range of the property method. + For simplicity, we've only used the hint_range of the property method. There are a lot more options to choose from. These can be used to further configure how properties are displayed and set on the Godot side. @@ -563,9 +563,9 @@ In our ``gdexample.h`` header file, we need to define a new member ``time_emit`` .. code-block:: C++ ... - float time_passed; - float time_emit; - float amplitude; + double time_passed; + double time_emit; + double amplitude; ... This time, the changes in ``gdexample.cpp`` are more elaborate. First, @@ -592,7 +592,7 @@ Next, we'll need to change our ``_process`` method: .. code-block:: C++ - void GDExample::_process(float delta) { + void GDExample::_process(double delta) { time_passed += speed * delta; Vector2 new_position = Vector2( From ca6657549890d4b7a567db1d5a0a394a3669553e Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Wed, 5 Apr 2023 01:50:19 +0200 Subject: [PATCH 12/59] Add NavigationLinks to navigation overviews Adds NavigationLinks to navigation overviews. --- .../navigation/navigation_introduction_2d.rst | 18 +++++++++++++++--- .../navigation/navigation_introduction_3d.rst | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/tutorials/navigation/navigation_introduction_2d.rst b/tutorials/navigation/navigation_introduction_2d.rst index 2b15dfb18..acf72812c 100644 --- a/tutorials/navigation/navigation_introduction_2d.rst +++ b/tutorials/navigation/navigation_introduction_2d.rst @@ -31,6 +31,8 @@ Godot provides the following objects and classes for 2D navigation: - NavRegion RID Reference to a specific navigation region that can hold navigation mesh data. The region can be enabled / disabled or the use restricted with a navigationlayer bitmask. + - NavLink RID + Reference to a specific navigation link that connects two navigation mesh positions over arbitrary distances. - NavAgent RID Reference to a specific avoidance agent with a radius value use solely in avoidance. @@ -38,9 +40,19 @@ The following SceneTree Nodes are available as helpers to work with the Navigati - :ref:`NavigationRegion2D` Node A Node that holds a NavigationPolygon resource that defines a navigation mesh for the NavigationServer2D. - The region can be enabled / disabled. - The use in pathfinding can be further restricted through the navigationlayers bitmask. - Regions can join their navigation meshes by proximity for a combined navigation mesh. + + - The region can be enabled / disabled. + - The use in pathfinding can be further restricted through the navigationlayers bitmask. + - Regions can join their navigation meshes by proximity for a combined navigation mesh. + +- :ref:`NavigationLink2D` Node + A Node that connects two positions on navigation mesh over arbitrary distances for pathfinding. + + - The link can be enabled / disabled. + - The link can be made one-way or bidirectional. + - The use in pathfinding can be further restricted through the navigationlayers bitmask. + + Links tell the pathfinding that a connection exists and at what cost. The actual agent handling and movement needs to happen in custom scripts. - :ref:`NavigationAgent2D` Node An optional helper Node to facilitate common NavigationServer2D API calls for pathfinding and avoidance diff --git a/tutorials/navigation/navigation_introduction_3d.rst b/tutorials/navigation/navigation_introduction_3d.rst index 2d7a9ebd3..45a9ecdcf 100644 --- a/tutorials/navigation/navigation_introduction_3d.rst +++ b/tutorials/navigation/navigation_introduction_3d.rst @@ -34,6 +34,8 @@ Godot provides the following objects and classes for 3D navigation: - NavRegion RID Reference to a specific navigation region that can hold navigation mesh data. The region can be enabled / disabled or the use restricted with a navigationlayer bitmask. + - NavLink RID + Reference to a specific navigation link that connects two navigation mesh positions over arbitrary distances. - NavAgent RID Reference to a specific avoidance agent with a radius value use solely in avoidance. @@ -41,9 +43,19 @@ The following SceneTree Nodes are available as helpers to work with the Navigati - :ref:`NavigationRegion3D` Node A Node that holds a Navigation Mesh resource that defines a navigation mesh for the NavigationServer3D. - The region can be enabled / disabled. - The use in pathfinding can be further restricted through the navigationlayers bitmask. - Regions can join their navigation meshes by proximity for a combined navigation mesh. + + - The region can be enabled / disabled. + - The use in pathfinding can be further restricted through the navigationlayers bitmask. + - Regions can join their navigation meshes by proximity for a combined navigation mesh. + +- :ref:`NavigationLink3D` Node + A Node that connects two positions on navigation mesh over arbitrary distances for pathfinding. + + - The link can be enabled / disabled. + - The link can be made one-way or bidirectional. + - The use in pathfinding can be further restricted through the navigationlayers bitmask. + + Links tell the pathfinding that a connection exists and at what cost. The actual agent handling and movement needs to happen in custom scripts. - :ref:`NavigationAgent3D` Node An optional helper Node to facilitate common NavigationServer3D API calls for pathfinding and avoidance for From 96137165b359a9dc675c8781ea5c856c3c1e30fe Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 5 Apr 2023 23:17:07 +0200 Subject: [PATCH 13/59] Add comparison images to 3D rendering limitations (#7120) This helps readers understand issues if they can notice them in their project, but don't know by name what issue it is. --- tutorials/3d/3d_rendering_limitations.rst | 18 ++++++++++++++++++ .../img/3d_rendering_limitations_banding.webp | Bin 0 -> 75404 bytes ...ring_limitations_transparency_sorting.webp | Bin 0 -> 41438 bytes .../3d_rendering_limitations_z_fighting.webp | Bin 0 -> 14618 bytes 4 files changed, 18 insertions(+) create mode 100644 tutorials/3d/img/3d_rendering_limitations_banding.webp create mode 100644 tutorials/3d/img/3d_rendering_limitations_transparency_sorting.webp create mode 100644 tutorials/3d/img/3d_rendering_limitations_z_fighting.webp diff --git a/tutorials/3d/3d_rendering_limitations.rst b/tutorials/3d/3d_rendering_limitations.rst index 838bb56fa..33d2f9d42 100644 --- a/tutorials/3d/3d_rendering_limitations.rst +++ b/tutorials/3d/3d_rendering_limitations.rst @@ -56,6 +56,12 @@ There are two main ways to alleviate banding: rendered with low color precision, which means it will work when using the Mobile and Compatibility rendering methods. +.. figure:: img/3d_rendering_limitations_banding.webp + :align: center + :alt: Color banding comparison (contrast increased for more visibility) + + Color banding comparison (contrast increased for more visibility) + .. seealso:: See `Banding in Games: A Noisy Rant `__ @@ -88,6 +94,12 @@ Depending on the scene and viewing conditions, you may also be able to move the Z-fighting objects further apart without the difference being visible to the player. +.. figure:: img/3d_rendering_limitations_z_fighting.webp + :align: center + :alt: Z-fighting comparison (before and after tweaking the scene by offsetting the Label3D away from the floor) + + Z-fighting comparison (before and after tweaking the scene by offsetting the Label3D away from the floor) + .. _doc_3d_rendering_limitations_transparency_sorting: Transparency sorting @@ -133,6 +145,12 @@ this feature. There are still several ways to avoid this problem: distance fade mode **Pixel Dither** or **Object Dither** instead of **PixelAlpha**. This will make the material opaque, which also speeds up rendering. +.. figure:: img/3d_rendering_limitations_transparency_sorting.webp + :align: center + :alt: Transparency sorting comparison (alpha-blended materials on the left, alpha scissor materials on the right) + + Transparency sorting comparison (alpha-blended materials on the left, alpha scissor materials on the right) + Multi-sample antialiasing ------------------------- diff --git a/tutorials/3d/img/3d_rendering_limitations_banding.webp b/tutorials/3d/img/3d_rendering_limitations_banding.webp new file mode 100644 index 0000000000000000000000000000000000000000..d8f04539c427544b44c39c7b5dd1d76ace917e5f GIT binary patch literal 75404 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

    f$Xq)oSMDyHjb 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

    o(D~O|Si2EJI2UJd89ZN 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 QE`59ThZ!3GueZMd06m>7bN~PV literal 0 HcmV?d00001 diff --git a/tutorials/3d/img/3d_rendering_limitations_transparency_sorting.webp b/tutorials/3d/img/3d_rendering_limitations_transparency_sorting.webp new file mode 100644 index 0000000000000000000000000000000000000000..da07ac2cc33e1e19a3fce247b650a8422c1cbe09 GIT binary patch literal 41438 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 Date: Thu, 6 Apr 2023 00:18:26 +0300 Subject: [PATCH 14/59] Remove duplicate C# comment from GDscript codeblock --- getting_started/first_3d_game/06.jump_and_squash.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/getting_started/first_3d_game/06.jump_and_squash.rst b/getting_started/first_3d_game/06.jump_and_squash.rst index 3840a4908..ee49036cd 100644 --- a/getting_started/first_3d_game/06.jump_and_squash.rst +++ b/getting_started/first_3d_game/06.jump_and_squash.rst @@ -237,7 +237,6 @@ With this code, if no collisions occurred on a given frame, the loop won't run. #... # Iterate through all collisions that occurred this frame - # in C this would be for(int i = 0; i < collisions.Count; i++) for index in range(get_slide_collision_count()): # We get one of the collisions with the player var collision = get_slide_collision(index) From 32efbe064f392f2b6bfc538f990e1f69b3f05740 Mon Sep 17 00:00:00 2001 From: devSomethingSomething <61376074+devSomethingSomething@users.noreply.github.com> Date: Thu, 6 Apr 2023 18:27:56 +0200 Subject: [PATCH 15/59] Fix typo in introduction_to_3d.rst (#7122) * Fix typo in introduction_to_3d.rst * Update number of hyphens in tutorials/3d/introduction_to_3d.rst Co-authored-by: Clay John --------- Co-authored-by: Clay John --- tutorials/3d/introduction_to_3d.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/3d/introduction_to_3d.rst b/tutorials/3d/introduction_to_3d.rst index ff53feb3b..c4a1b0606 100644 --- a/tutorials/3d/introduction_to_3d.rst +++ b/tutorials/3d/introduction_to_3d.rst @@ -44,8 +44,8 @@ little more difficult. The content needs to be created with special 3D tools exchange file format to be imported in Godot. This is required since 3D formats are not as standardized as images. -Maually authored models (using 3D modeling software) ----------------------------------------------------- +Manually authored models (using 3D modeling software) +----------------------------------------------------- .. FIXME: Needs update to properly description Godot 3.x workflow (used to reference a non existing doc_importing_3d_meshes importer). From 875df05d40131074f6e6fed7225691ae6de3bd0a Mon Sep 17 00:00:00 2001 From: Yu umo <68861777+YumooUmo@users.noreply.github.com> Date: Fri, 7 Apr 2023 05:44:54 +0800 Subject: [PATCH 16/59] Update inputevent.rst (#7126) A samll spelling mistake. --- tutorials/inputs/inputevent.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/inputs/inputevent.rst b/tutorials/inputs/inputevent.rst index edff63619..82fce4a65 100644 --- a/tutorials/inputs/inputevent.rst +++ b/tutorials/inputs/inputevent.rst @@ -117,7 +117,7 @@ received input, in order: not. This can be configured through :ref:`Area3D ` properties). In the case of a 2D scene, conceptually the same happens with :ref:`CollisionObject2D._input_event() `. -When sending events to its child and descencand nodes, the viewport will do so, as depicted in +When sending events to its child and descendant nodes, the viewport will do so, as depicted in the following graphic, in a reverse depth-first order, starting with the node at the bottom of the scene tree, and ending at the root node. Excluded from this process are embedded Windows and SubViewports. From 78b978c9bd9e3c7945e73ec049768b8aba94e9be Mon Sep 17 00:00:00 2001 From: Tom McLean Date: Sat, 8 Apr 2023 02:32:25 +1000 Subject: [PATCH 17/59] Fix references to DEPTH_TEXTURE and SCREEN_TEXTURE (#7119) * Fix references to DEPTH_TEXTURE --------- Co-authored-by: Clay John --- .../3d/environment_and_post_processing.rst | 3 ++- tutorials/shaders/advanced_postprocessing.rst | 18 ++++++++++++------ .../shader_reference/spatial_shader.rst | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/tutorials/3d/environment_and_post_processing.rst b/tutorials/3d/environment_and_post_processing.rst index 0a5fefa7b..39419819d 100644 --- a/tutorials/3d/environment_and_post_processing.rst +++ b/tutorials/3d/environment_and_post_processing.rst @@ -397,7 +397,8 @@ A few user-controlled parameters are available to better tweak the technique: Keep in mind that screen-space-reflections only work for reflecting opaque geometry. Transparent materials won't be reflected, as they don't write to the depth buffer. -This also applies to shaders that use ``SCREEN_TEXTURE`` or ``DEPTH_TEXTURE``. +This also applies to shaders that use ``hint_screen_texture`` or ``hint_depth_texture`` +uniforms. Screen-Space Ambient Occlusion (SSAO) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tutorials/shaders/advanced_postprocessing.rst b/tutorials/shaders/advanced_postprocessing.rst index c59db925e..b63b06fe8 100644 --- a/tutorials/shaders/advanced_postprocessing.rst +++ b/tutorials/shaders/advanced_postprocessing.rst @@ -76,19 +76,25 @@ You can also use both options. Depth texture ------------- -To read from the depth texture, perform a texture lookup using ``texture()`` and -the uniform variable ``DEPTH_TEXTURE``. +To read from the depth texture, we first need to create a texture uniform set to the depth buffer +by using ``hint_depth_texture``. .. code-block:: glsl - float depth = texture(DEPTH_TEXTURE, SCREEN_UV).x; + uniform sampler2D depth_texture : source_color, hint_depth_texture; + +Once defined, the depth texture can be read with the ``texture()`` function. + +.. code-block:: glsl + + float depth = texture(depth_texture, SCREEN_UV).x; .. note:: Similar to accessing the screen texture, accessing the depth texture is only possible when reading from the current viewport. The depth texture cannot be accessed from another viewport to which you have rendered. -The values returned by ``DEPTH_TEXTURE`` are between ``0.0`` and ``1.0`` and are nonlinear. -When displaying depth directly from the ``DEPTH_TEXTURE``, everything will look almost +The values returned by ``depth_texture`` are between ``0.0`` and ``1.0`` and are nonlinear. +When displaying depth directly from the ``depth_texture``, everything will look almost white unless it is very close. This is because the depth buffer stores objects closer to the camera using more bits than those further, so most of the detail in depth buffer is found close to the camera. In order to make the depth value align with world or @@ -111,7 +117,7 @@ the depth value for ``z``. .. code-block:: glsl void fragment() { - float depth = texture(DEPTH_TEXTURE, SCREEN_UV).x; + float depth = texture(depth_texture, SCREEN_UV).x; vec3 ndc = vec3(SCREEN_UV * 2.0 - 1.0, depth); } diff --git a/tutorials/shaders/shader_reference/spatial_shader.rst b/tutorials/shaders/shader_reference/spatial_shader.rst index a33890760..b2a74c9c4 100644 --- a/tutorials/shaders/shader_reference/spatial_shader.rst +++ b/tutorials/shaders/shader_reference/spatial_shader.rst @@ -464,7 +464,7 @@ If you want the lights to add together, add the light contribution to ``DIFFUSE_ for more information and ways to avoid issues. Transparent materials also cannot cast shadows or appear in - ``SCREEN_TEXTURE`` and ``DEPTH_TEXTURE``. This in turn prevents those + ``hint_screen_texture`` and ``hint_depth_texture`` uniforms. This in turn prevents those materials from appearing in screen-space reflections or refraction. :ref:`SDFGI ` sharp reflections are not visible on transparent materials (only rough reflections are visible on transparent materials). From 99aac88083a9fec88d043b36d42a231b37a1d684 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 7 Apr 2023 22:47:30 +0200 Subject: [PATCH 18/59] Fix incorrect `:abbr:` usage for abbreviation display Previously, some abbreviations would display their full form in the text and the abbreviation in the tooltip. It should be the other way around. --- .../3d/environment_and_post_processing.rst | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/tutorials/3d/environment_and_post_processing.rst b/tutorials/3d/environment_and_post_processing.rst index 39419819d..5d820faea 100644 --- a/tutorials/3d/environment_and_post_processing.rst +++ b/tutorials/3d/environment_and_post_processing.rst @@ -349,11 +349,13 @@ The tone mapping options are: Mid- and post-processing effects -------------------------------- -The Environment resource supports many widely-used mid- and post-processing effects. +The Environment resource supports many popular mid- and post-processing effects. .. note:: - Screen-space effects such as SSR, SSAO, SSIL and glow do not operate on + Screen-space effects such as :abbr:`SSR (Screen-Space Reflections)`, + :abbr:`SSAO (Screen-Space Ambient Occlusion)`, + :abbr:`SSIL (Screen-Space Indirect Lighting)` and glow do not operate on geometry that is located outside the camera view or is occluded by other opaque geometry. Consider this when tweaking their settings to avoid distracting changes during gameplay. @@ -424,21 +426,21 @@ a narrower path for the light to enter: .. image:: img/environment_ssao.webp It is a common mistake to enable this effect, turn on a light, and not be able to -appreciate it. This is because :abbr:`Screen-Space Ambient Occlusion (SSAO)` +appreciate it. This is because :abbr:`SSAO (Screen-Space Ambient Occlusion)` only acts on *ambient* light. It does not affect direct light. This is why, in the image above, the effect is less noticeable under the direct light (on the left). If you want to force -:abbr:`Screen-Space Ambient Occlusion (SSAO)` to work with direct light too, +:abbr:`SSAO (Screen-Space Ambient Occlusion)` to work with direct light too, use the **Light Affect** parameter. Even though this is not physically correct, some artists like how it looks. -:abbr:`Screen-Space Ambient Occlusion (SSAO)` looks best when combined with a +:abbr:`SSAO (Screen-Space Ambient Occlusion)` looks best when combined with a real source of indirect light, like VoxelGI: .. image:: img/environment_ssao2.webp -Tweaking :abbr:`Screen-Space Ambient Occlusion (SSAO)` is possible with several +Tweaking :abbr:`SSAO (Screen-Space Ambient Occlusion)` is possible with several parameters: .. image:: img/environment_ssao_parameters.webp @@ -449,9 +451,9 @@ parameters: - **Intensity:** The primary screen-space ambient occlusion intensity. Acts as a multiplier for the screen-space ambient occlusion effect. A higher value results in darker occlusion. - Since :abbr:`Screen-Space Ambient Occlusion (SSAO)` is a screen-space effect, + Since :abbr:`SSAO (Screen-Space Ambient Occlusion)` is a screen-space effect, it's recommended to remain conservative with this value. - :abbr:`Screen-Space Ambient Occlusion (SSAO)` that is too strong can be + :abbr:`SSAO (Screen-Space Ambient Occlusion)` that is too strong can be distracting during gameplay. - **Power:** The distribution of occlusion. A higher value results in darker occlusion, similar to **Intensity**, but with a sharper falloff. @@ -468,8 +470,9 @@ parameters: - **Light Affect:** The screen-space ambient occlusion intensity in direct light. In real life, ambient occlusion only applies to indirect light, which means its effects can't be seen in direct light. Values higher than 0 will - make the SSAO effect visible in direct light. Values above ``0.0`` are not - physically accurate, but some artists prefer this effect. + make the :abbr:`SSAO (Screen-Space Ambient Occlusion)` effect visible in + direct light. Values above ``0.0`` are not physically accurate, but some + artists prefer this effect. Screen-Space Indirect Lighting (SSIL) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -477,25 +480,25 @@ Screen-Space Indirect Lighting (SSIL) *This feature is only available when using the Forward+ backend, not Mobile or Compatibility.* -:abbr:`Screen-Space Indirect Lighting (SSIL)` provides indirect lighting for +:abbr:`SSIL (Screen-Space Indirect Lighting)` provides indirect lighting for small details or dynamic geometry that other global illumination techniques cannot cover. This applies to bounced diffuse lighting, but also emissive -materials. When :abbr:`Screen-Space Indirect Lighting (SSIL)` is enabled on its +materials. When :abbr:`SSIL (Screen-Space Indirect Lighting)` is enabled on its own, the effect may not be that noticeable, which is intended. -Instead, :abbr:`Screen-Space Indirect Lighting (SSIL)` is meant to be used as a +Instead, :abbr:`SSIL (Screen-Space Indirect Lighting)` is meant to be used as a *complement* to other global illumination techniques such as VoxelGI, SDFGI and -LightmapGI. :abbr:`Screen-Space Indirect Lighting (SSIL)` also provides +LightmapGI. :abbr:`SSIL (Screen-Space Indirect Lighting)` also provides a subtle ambient occlusion effect, similar to SSAO but with less detail. This feature only provides indirect lighting. It is not a full global illumination solution. This makes it different from screen-space global illumination (SSGI) -offered by other 3D engines. :abbr:`Screen-Space Indirect Lighting (SSIL)` -can be combined with :abbr:`Screen-Space Reflections (SSR)` and/or -:abbr:`Screen-Space Ambient Occlusion (SSAO)` for greater visual quality +offered by other 3D engines. :abbr:`SSIL (Screen-Space Indirect Lighting)` +can be combined with :abbr:`SSR (Screen-Space Reflections)` and/or +:abbr:`SSAO (Screen-Space Ambient Occlusion)` for greater visual quality (at the cost of performance). -Tweaking SSIL is possible with several parameters: +Tweaking :abbr:`SSIL (Screen-Space Indirect Lighting)` is possible with several parameters: - **Radius:** The distance that bounced lighting can travel when using the screen space indirect lighting effect. A larger value will result in light @@ -525,7 +528,7 @@ Mobile or Compatibility.* Signed distance field global illumination (SDFGI) is a form of real-time global illumination. It is not a screen-space effect, which means it can provide global -illumination for off-screen elements (unlike :abbr:`Screen-Space Indirect Lighting (SSIL)`). +illumination for off-screen elements (unlike :abbr:`SSIL (Screen-Space Indirect Lighting)`). .. seealso:: From 8e7ed802b0a1d2293ef526da2081f4f1ff3ab665 Mon Sep 17 00:00:00 2001 From: Mateus Elias Date: Sat, 8 Apr 2023 09:34:53 -0300 Subject: [PATCH 19/59] fix(tutorials/3d/procedural_geometry): ImmediateMesh tutorial adjusted --- .../3d/procedural_geometry/immediatemesh.rst | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/tutorials/3d/procedural_geometry/immediatemesh.rst b/tutorials/3d/procedural_geometry/immediatemesh.rst index c5f540279..afb303681 100644 --- a/tutorials/3d/procedural_geometry/immediatemesh.rst +++ b/tutorials/3d/procedural_geometry/immediatemesh.rst @@ -10,30 +10,30 @@ API like SurfaceTool, but it's actually designed to create meshes on the fly. Generating complex geometry (several thousand vertices) with this node is inefficient, even if it's done only once. Instead, it is designed to generate simple geometry that changes every frame. -Before starting, you should clear the geometry by calling ``clear()``. This ensures that +Before starting, you should clear the geometry by calling ``clear_surfaces()``. This ensures that you are not building upon the geometry from the previous frame. If you want to keep geometry between frames, do -not call ``clear()``. +not call ``clear_surfaces()``. -To begin generating geometry you must call ``begin()``. ``begin()`` takes a ``PrimitiveType`` as an argument. +To begin generating geometry you must call ``surface_begin()``. ``surface_begin()`` takes a ``PrimitiveType`` as an argument. ``PrimitiveType`` is an OpenGL concept that instructs the GPU how to arrange the primitive based on the vertices given whether it is triangles, lines, points, etc. A complete list can be found under the :ref:`Mesh ` class reference page. -Once you have called ``begin()`` you are ready to start adding vertices. You add vertices one at a time. -First you add vertex specific attributes such as normals or UVs using ``set_****()`` (e.g. ``set_normal()``). -Then you call ``add_vertex()`` to add a vertex with those attributes. For example: +Once you have called ``surface_begin()`` you are ready to start adding vertices. You add vertices one at a time. +First you add vertex specific attributes such as normals or UVs using ``surface_set_****()`` (e.g. ``surface_set_normal()``). +Then you call ``surface_add_vertex()`` to add a vertex with those attributes. For example: .. tabs:: .. code-tab:: gdscript GDScript # Add a vertex with normal and uv. - set_normal(Vector3(0, 1, 0)) - set_uv(Vector2(1, 1)) - add_vertex(Vector3(0, 0, 1)) + surface_set_normal(Vector3(0, 1, 0)) + surface_set_uv(Vector2(1, 1)) + surface_add_vertex(Vector3(0, 0, 1)) -Only attributes added before the call to ``add_vertex()`` will be included in that vertex. +Only attributes added before the call to ``surface_add_vertex()`` will be included in that vertex. -Finally, once you have added all your vertices call ``end()`` to signal that you have finished generating the mesh. +Finally, once you have added all your vertices call ``surface_end()`` to signal that you have finished generating the mesh. The example code below draws a single triangle. @@ -44,24 +44,24 @@ The example code below draws a single triangle. func _process(_delta): # Clean up before drawing. - clear() + clear_surfaces() # Begin draw. - begin(Mesh.PRIMITIVE_TRIANGLES) + surface_begin(Mesh.PRIMITIVE_TRIANGLES) - # Prepare attributes for add_vertex. - set_normal(Vector3(0, 0, 1)) - set_uv(Vector2(0, 0)) + # Prepare attributes for surface_add_vertex. + surface_set_normal(Vector3(0, 0, 1)) + surface_set_uv(Vector2(0, 0)) # Call last for each vertex, adds the above attributes. - add_vertex(Vector3(-1, -1, 0)) + surface_add_vertex(Vector3(-1, -1, 0)) - set_normal(Vector3(0, 0, 1)) - set_uv(Vector2(0, 1)) - add_vertex(Vector3(-1, 1, 0)) + surface_set_normal(Vector3(0, 0, 1)) + surface_set_uv(Vector2(0, 1)) + surface_add_vertex(Vector3(-1, 1, 0)) - set_normal(Vector3(0, 0, 1)) - set_uv(Vector2(1, 1)) - add_vertex(Vector3(1, 1, 0)) + surface_set_normal(Vector3(0, 0, 1)) + surface_set_uv(Vector2(1, 1)) + surface_add_vertex(Vector3(1, 1, 0)) # End drawing. - end() + surface_end() From 2aa7d478212034b93ffb1d5b55e087ebfc7acf83 Mon Sep 17 00:00:00 2001 From: Mateus Elias Date: Sat, 8 Apr 2023 10:07:33 -0300 Subject: [PATCH 20/59] fix(tutorials/performance/using_multimesh.rst): removed out of date code --- tutorials/performance/using_multimesh.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tutorials/performance/using_multimesh.rst b/tutorials/performance/using_multimesh.rst index dd0614ec6..9e9d355ad 100644 --- a/tutorials/performance/using_multimesh.rst +++ b/tutorials/performance/using_multimesh.rst @@ -63,8 +63,6 @@ efficient for millions of objects, but for a few thousands, GDScript should be f multimesh = MultiMesh.new() # Set the format first. multimesh.transform_format = MultiMesh.TRANSFORM_3D - multimesh.color_format = MultiMesh.COLOR_NONE - multimesh.custom_data_format = MultiMesh.CUSTOM_DATA_NONE # Then resize (otherwise, changing the format is not allowed). multimesh.instance_count = 10000 # Maybe not all of them should be visible at first. @@ -86,8 +84,6 @@ efficient for millions of objects, but for a few thousands, GDScript should be f Multimesh = new MultiMesh(); // Set the format first. Multimesh.TransformFormat = MultiMesh.TransformFormatEnum.Transform3D; - Multimesh.ColorFormat = MultiMesh.ColorFormatEnum.None; - Multimesh.CustomDataFormat = MultiMesh.CustomDataFormatEnum.None; // Then resize (otherwise, changing the format is not allowed) Multimesh.InstanceCount = 1000; // Maybe not all of them should be visible at first. From bc15bd0e1cd73819ae2e0f4c56e488478420186f Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sat, 8 Apr 2023 19:15:17 +0200 Subject: [PATCH 21/59] Document custom scale factor in Multiple resolutions - Mention how to change each stretch-related property at runtime from a script. - Link to the Multiple Resolutions and Aspect Ratios demo project. - Remove outdated Shrink section (this is no longer present in 4.0, as it was replaced by Scale). --- tutorials/rendering/multiple_resolutions.rst | 62 ++++++++++++++------ 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/tutorials/rendering/multiple_resolutions.rst b/tutorials/rendering/multiple_resolutions.rst index f552fbf56..b5c859096 100644 --- a/tutorials/rendering/multiple_resolutions.rst +++ b/tutorials/rendering/multiple_resolutions.rst @@ -50,6 +50,11 @@ handle scaling for different sizes and aspect ratios. Godot provides several useful tools to do this easily. +.. seealso:: + + You can see how Godot's support for multiple resolutions works in action using the + `Multiple Resolutions and Aspect Ratios demo project `__. + Base size --------- @@ -69,6 +74,14 @@ that are different from this base size. Godot offers many ways to control how the viewport will be resized and stretched to different screen sizes. +To configure the stretch base size at runtime from a script, use the +``get_tree().root.content_scale_size`` property (see +:ref:`Window.content_scale_size `). +Changing this value can indirectly change the size of 2D elements. However, to +provide an user-accessible scaling option, using +:ref:`doc_multiple_resolutions_stretch_scale` is recommended as it's easier to +adjust. + .. note:: Godot follows a modern approach to multiple resolutions. The engine will @@ -153,6 +166,11 @@ demonstrate the effect of different stretch modes. A single sprite, also .. image:: img/stretch_viewport_expand.gif +To configure the stretch mode at runtime from a script, use the +``get_tree().root.content_scale_mode`` property (see +:ref:`Window.content_scale_mode ` +and the :ref:`ContentScaleMode ` enum). + Stretch Aspect ^^^^^^^^^^^^^^ @@ -230,30 +248,36 @@ to the region outside the blue frame you see in the 2D editor. To allow the user to choose their preferred screen orientation at run-time, remember to set **Display > Window > Handheld > Orientation** to ``sensor``. -Stretch Shrink -^^^^^^^^^^^^^^ +To configure the stretch aspect at runtime from a script, use the +``get_tree().root.content_scale_aspect`` property (see +:ref:`Window.content_scale_aspect ` +and the :ref:`ContentScaleAspect ` enum). -The **Shrink** setting allows you to add an extra scaling factor on top of -what the **Stretch** options above already provide. The default value of 1 -means that no scaling occurs. +.. _doc_multiple_resolutions_stretch_scale: -If, for example, you set **Shrink** to 4 and leave **Stretch Mode** on -**Disabled**, each unit in your scene will correspond to 4×4 pixels on the -screen. +Stretch Scale +^^^^^^^^^^^^^ -If **Stretch Mode** is set to something other than **Disabled**, the size of -the root viewport is scaled down by the **Shrink** factor, and pixels -in the output are scaled up by the same amount. This is rarely useful for -2D games, but can be used to increase performance in 3D games -by rendering them at a lower resolution. +The **Scale** setting allows you to add an extra scaling factor on top of +what the **Stretch** options above already provide. The default value of ``1.0`` +means that no additional scaling occurs. -From scripts -^^^^^^^^^^^^ +For example, if you set **Scale** to ``2.0`` and leave **Stretch Mode** on +**Disabled**, each unit in your scene will correspond to 2×2 pixels on the +screen. This is a good way to provide scaling options for non-game applications. -To configure stretching at runtime from a script, use the -``get_tree().root.content_scale_mode`` (see -:ref:`Window.content_scale_mode ` -and the :ref:`ContentScaleMode ` enum). +If **Stretch Mode** is set to **canvas_items**, 2D elements will be scaled +relative to the base window size, then multiplied by the **Scale** setting. This +can be exposed to players to allow them to adjust the automatically determined +scale to their liking, for better accessibility. + +If **Stretch Mode** is set to **viewport**, the viewport's resolution is divided +by **Scale**. This makes pixels look larger and reduces rendering resolution +(with a given window size), which can improve performance. + +To configure the stretch scale at runtime from a script, use the +``get_tree().root.content_scale_factor`` property (see +:ref:`Window.content_scale_factor `). Common use case scenarios ------------------------- From 123fce7e073d7b8919d248c9d88b84019e6a936e Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Mon, 3 Apr 2023 20:54:13 +0200 Subject: [PATCH 22/59] Add a page on using GCC/Clang/MSVC sanitizers This also covers Web-specific Emscripten options to enable its own sanitizers. --- .../introduction_to_the_buildsystem.rst | 6 + contributing/development/debugging/index.rst | 1 + .../debugging/using_sanitizers.rst | 176 ++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 contributing/development/debugging/using_sanitizers.rst diff --git a/contributing/development/compiling/introduction_to_the_buildsystem.rst b/contributing/development/compiling/introduction_to_the_buildsystem.rst index cdc8802d2..a56a58eed 100644 --- a/contributing/development/compiling/introduction_to_the_buildsystem.rst +++ b/contributing/development/compiling/introduction_to_the_buildsystem.rst @@ -164,6 +164,12 @@ does not define ``NDEBUG`` (so ``assert()`` works in thirdparty libraries). This flag appends the ``.dev`` suffix (for development) to the generated binary name. +.. seealso:: + + There are additional SCons options to enable *sanitizers*, which are tools + you can enable at compile-time to better debug certain engine issues. + See :ref:`doc_using_sanitizers` for more information. + Debugging symbols ----------------- diff --git a/contributing/development/debugging/index.rst b/contributing/development/debugging/index.rst index ab2c374f1..78ababf5f 100644 --- a/contributing/development/debugging/index.rst +++ b/contributing/development/debugging/index.rst @@ -9,6 +9,7 @@ engine code trying to find an underlying issue or an optimization possibility. :name: toc-devel-cpp-debug-profiling using_cpp_profilers + using_sanitizers macos_debug vulkan/index diff --git a/contributing/development/debugging/using_sanitizers.rst b/contributing/development/debugging/using_sanitizers.rst new file mode 100644 index 000000000..3c8a8e920 --- /dev/null +++ b/contributing/development/debugging/using_sanitizers.rst @@ -0,0 +1,176 @@ +.. _doc_using_sanitizers: + +Using sanitizers +================ + +What are sanitizers? +-------------------- + +Sanitizers are static instrumentation tools that help find bugs that traditional +debuggers usually cannot catch. This is particularly useful when combined with +:ref:`doc_unit_testing` in continuous integration. + +Sanitizers can be used on Windows, macOS and Linux by using the Clang (LLVM), +GCC or Visual Studio compilers. +:ref:`Certain platforms ` +may also have their own sanitizers available. +In situations where a single sanitizer is provided by several different compilers, +remember that their output and behavior will differ slightly. + +Using sanitizers on Godot +------------------------- + +Sanitizers **require** recompiling the binary. This means you cannot use +official Godot binaries to run sanitizers. + +When :ref:`compiling ` with any of the sanitizers enabled, +the resulting binary will have the ``.san`` suffix added to its name to +distinguish it from a binary without sanitizers. + +There is a performance impact as many additional runtime checks need to be +performed. Memory utilization will also increase. It is possible to enable +certain combinations of multiple sanitizers in a single build. Beware of the +performance impact when using multiple sanitizers at once though, as the +resulting binary may be excessively slow. + +Certain options can be passed to sanitizers without having to recompile the +binary using environment variables. + +.. _doc_using_sanitizers_address_sanitizer: + +Address sanitizer (ASAN) +------------------------ + +- Available in Clang and GCC. +- **Supported platforms:** Linux, macOS, Windows (Visual Studio), Web +- `Clang ASAN documentation `__ + +The address sanitizer is generally the most frequently used sanitizer. It can +diagnose issues such as buffer overruns and out-of-bounds access. If the engine +crashes with a message such as ``free(): invalid pointer``, this is typically +the result of a buffer overrun. (This message is printed by the C runtime, not +Godot.) + +In certain situations (such as detecting uninitialized memory reads), +the address sanitizer doesn't suffice. The :ref:`doc_using_sanitizers_memory_sanitizer` +should be used instead. + +It is also possible to detect use-after-return situations by specifying the +``ASAN_OPTIONS=detect_stack_use_after_return=1`` environment variable before +*running* Godot (not when compiling it). This increases the address sanitizer's +runtime overhead, so only enable this feature when you actually need it. + +To enable the address sanitizer in a Godot build, pass the ``use_asan=yes`` +SCons option when compiling. Enabling ASAN generally makes the resulting binary +about 2× slower. + +.. warning:: + + Due to a `design decision + `__, + the address, memory and thread sanitizers are mutually exclusive. This means + you can only use one of those sanitizers in a given binary. + +Leak sanitizer (LSAN) +--------------------- + +- Available in Clang and GCC. +- **Supported platforms:** Linux, Web +- `Clang LSAN documentation `__ + +The leak sanitizer can detect memory leaks, which are situations where memory +that is no longer in use is never freed by the running program. This can +potentially lead to out-of-memory situations if the program runs for long +enough. Since Godot may run on +:ref:`dedicated servers ` for months or +even years without a restart, it's important to fix memory leaks when they occur. + +To enable the leak sanitizer in a Godot build, pass the ``use_lsan=yes`` SCons +option when compiling. Enabling LSAN only has a small performance overhead, but +the program will be much slower to exit as leak detection occurs when the +program exits. + +.. _doc_using_sanitizers_memory_sanitizer: + +Memory sanitizer (MSAN) +----------------------- + +- Available in Clang only, not GCC. +- **Supported platforms:** Linux +- `Clang MSAN documentation `__ + +The memory sanitizer complements the +:ref:`doc_using_sanitizers_address_sanitizer`. Unlike the address sanitizer, +the memory sanitizer can detect uninitialized memory reads. + +To enable the memory sanitizer in a Godot build, pass the ``use_msan=yes`` +SCons option when compiling. Enabling MSAN generally makes the resulting binary +about 3× slower. + +.. warning:: + + Due to a `design decision + `__, + the address, memory and thread sanitizers are mutually exclusive. This means + you can only use one of those sanitizers in a given binary. + +Thread sanitizer (TSAN) +----------------------- + +- Available in Clang and GCC. +- **Supported platforms:** Linux, macOS +- `Clang TSAN documentation `__ + +The thread sanitizer is used to track down race conditions related to +multithreading. A race condition is when multiple threads try to modify the same +data at the same time. Since thread scheduling can be ordered in any fashion by +the operating system, this leads to incorrect behavior that only occurs +occasionally (and can be difficult to track as a result). To prevent a race +condition, you need to add a lock to ensure only one thread can access the +shared data at a given time. + +To enable the thread sanitizer in a Godot build, pass the ``use_tsan=yes`` SCons +option when compiling. Enabling TSAN generally makes the resulting binary 10× +slower, while also multiplying memory usage by an approximately 8× factor. + +.. warning:: + + Due to a `design decision + `__, + the address, memory and thread sanitizers are mutually exclusive. This means + you can only use one of those sanitizers in a given binary. + +Undefined behavior sanitizer (UBSAN) +------------------------------------ + +- Available in Clang and GCC. +- **Supported platforms:** Linux, macOS, Web +- `Clang UBSAN documentation `__ + +The undefined behavior sanitizer is used to track down situations where the +program exhibits random and unpredictable behavior. This is due to C/C++ code +that is accepted by the compiler, but is not *correct*. Compiling with a +different set of optimizations can also change the observed results of undefined +behavior. + +To enable the undefined behavior sanitizer in a Godot build, pass the +``use_ubsan=yes`` SCons option when compiling. Enabling UBSAN only has a small +performance overhead. + +.. _doc_using_sanitizers_platform_specific_sanitizers: + +Platform-specific sanitizers +---------------------------- + +Web +^^^ + +When :ref:`compiling for the Web `, +there are 2 additional sanitizer SCons options available: + +- ``use_assertions=yes`` enables runtime Emscripten assertions, which can catch + various issues. +- ``use_safe_heap=yes`` enables `Emscripten's SAFE_HEAP sanitizer `__. + It provides similar functionality to ASAN, but it focuses on issues that + are specific to WebAssembly. ``SAFE_HEAP`` is not guaranteed to be compatible + with ASAN and UBSAN in the same binary, so you may have to build it separately. From a9076972a78b5cafd68c5b10e09aa6a927398678 Mon Sep 17 00:00:00 2001 From: Alfonso Arbona Gimeno Date: Sun, 9 Apr 2023 04:43:06 +0000 Subject: [PATCH 23/59] Fix small typos in the particle shader doc A word was missing a letter and a description had a wrongly capitalized word. Now it matches the rest of the document --- tutorials/shaders/shader_reference/particle_shader.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/shaders/shader_reference/particle_shader.rst b/tutorials/shaders/shader_reference/particle_shader.rst index 0e752af9f..37a01aa3a 100644 --- a/tutorials/shaders/shader_reference/particle_shader.rst +++ b/tutorials/shaders/shader_reference/particle_shader.rst @@ -14,7 +14,7 @@ CanvasItem of Spatial shader. They contain two processor functions: ``start()`` and ``process()``. Unlike other shader types, particle shaders keep the data that was output the -previous frame. Therefore, particle shaders ca be used for complex effects that +previous frame. Therefore, particle shaders can be used for complex effects that take place over multiple frames. .. note:: @@ -85,7 +85,7 @@ Start and Process built-ins +---------------------------------+--------------------------------------------------------------------------------+ | in uint **RANDOM_SEED** | Random seed used as base for random. | +---------------------------------+--------------------------------------------------------------------------------+ -| inout bool **ACTIVE** | ``true`` when Particle is active, can be set ``false``. | +| inout bool **ACTIVE** | ``true`` when the particle is active, can be set ``false``. | +---------------------------------+--------------------------------------------------------------------------------+ | inout vec4 **COLOR** | Particle color, can be written to and accessed in mesh's vertex function. | +---------------------------------+--------------------------------------------------------------------------------+ From db45a5378b97c24bd5ca68f3eb8718cdfa3d211e Mon Sep 17 00:00:00 2001 From: Daniel Delgado Date: Mon, 10 Apr 2023 12:13:12 +0200 Subject: [PATCH 24/59] Fixed 'Reporting node configuration warnings' code snippet - Switched .size for .length - initialized warnings as empty array - warning.append instead of += - deleted new line --- tutorials/plugins/running_code_in_the_editor.rst | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tutorials/plugins/running_code_in_the_editor.rst b/tutorials/plugins/running_code_in_the_editor.rst index 2378261d1..4285afb96 100644 --- a/tutorials/plugins/running_code_in_the_editor.rst +++ b/tutorials/plugins/running_code_in_the_editor.rst @@ -267,15 +267,12 @@ By default, the warning only updates when closing and reopening the scene. update_configuration_warnings() - func _get_configuration_warning(): - var warning = "" + func _get_configuration_warnings(): + var warning = [] if title == "": - warning += "Please set `title` to a non-empty value." - if description.size() >= 100: - # Add a blank line between each warning to distinguish them individually. - if warning != "": - warning += "\n" - warning += "`description` should be less than 100 characters long." + warning.append("Please set `title` to a non-empty value.") + if description.length() >= 100: + warning.append("`description` should be less than 100 characters long.") # Returning an empty string means "no warning". return warning From 7b4684b7a0d868900a8f90d4bc42e65e7d46271b Mon Sep 17 00:00:00 2001 From: iwVerve <53627487+iwVerve@users.noreply.github.com> Date: Tue, 11 Apr 2023 14:07:12 +0200 Subject: [PATCH 25/59] missing word typo on documentation comments page --- .../scripting/gdscript/gdscript_documentation_comments.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst index cab2e4775..abbc07f6c 100644 --- a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst +++ b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst @@ -53,7 +53,7 @@ Tags ## @tutorial(Tutorial2): http://the/tutorial2/url.com .. warning:: If there is any space in between the tag name and colon, for example - ``@tutorial :``, it won't treated as a valid tag and will be ignored. + ``@tutorial :``, it won't be treated as a valid tag and will be ignored. .. 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 From 03732737e12b9fb66725adc144a2f2f84637f24f Mon Sep 17 00:00:00 2001 From: Evan Overly Date: Wed, 12 Apr 2023 15:38:30 -0500 Subject: [PATCH 26/59] Added `mingw` to the scoop install instructions --- contributing/development/compiling/compiling_for_windows.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/compiling/compiling_for_windows.rst b/contributing/development/compiling/compiling_for_windows.rst index b98058d35..3538b3f2b 100644 --- a/contributing/development/compiling/compiling_for_windows.rst +++ b/contributing/development/compiling/compiling_for_windows.rst @@ -31,7 +31,7 @@ For compiling under Windows, the following is required: .. note:: If you have `Scoop `_ installed, you can easily install MinGW and other dependencies using the following command:: - scoop install gcc python scons make + scoop install gcc python scons make mingw .. note:: If you have `MSYS2 `_ installed, you can easily install MinGW and other dependencies using the following command:: From e36ef29eba0ce7175ef684f55809a7377428be21 Mon Sep 17 00:00:00 2001 From: Bastiaan Olij Date: Wed, 12 Apr 2023 12:35:57 +1000 Subject: [PATCH 27/59] Add descriptions of multiview build-ins and EYE_OFFSET to shader reference --- .../shader_reference/spatial_shader.rst | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tutorials/shaders/shader_reference/spatial_shader.rst b/tutorials/shaders/shader_reference/spatial_shader.rst index b2a74c9c4..a541fd93f 100644 --- a/tutorials/shaders/shader_reference/spatial_shader.rst +++ b/tutorials/shaders/shader_reference/spatial_shader.rst @@ -178,11 +178,16 @@ shader, this value can be used as desired. +----------------------------------------+--------------------------------------------------------+ | in vec4 **INSTANCE_CUSTOM** | Instance custom data (for particles, mostly). | +----------------------------------------+--------------------------------------------------------+ -| in int **VIEW_INDEX** | | +| in int **VIEW_INDEX** | The view that we are rendering. | +| | ``VIEW_MONO_LEFT`` (``0``) for Mono (not multiview) or | +| | left eye, ``VIEW_RIGHT`` (``1``) for right eye. | +----------------------------------------+--------------------------------------------------------+ -| in int **VIEW_MONO_LEFT** | | +| in int **VIEW_MONO_LEFT** | Constant for Mono or left eye, always ``0``. | +----------------------------------------+--------------------------------------------------------+ -| in int **VIEW_RIGHT** | | +| in int **VIEW_RIGHT** | Constant for right eye, always ``1``. | ++----------------------------------------+--------------------------------------------------------+ +| in vec3 **EYE_OFFSET** | Position offset for the eye being rendered. | +| | Only applicable for multiview rendering. | +----------------------------------------+--------------------------------------------------------+ | inout vec3 **VERTEX** | Vertex in local coordinates. | +----------------------------------------+--------------------------------------------------------+ @@ -285,11 +290,15 @@ these properties, and if you don't write to them, Godot will optimize away the c +----------------------------------------+--------------------------------------------------------------------------------------------------+ | in vec3 **VERTEX** | Vertex that comes from vertex function (default, in view space). | +----------------------------------------+--------------------------------------------------------------------------------------------------+ -| in int **VIEW_INDEX** | | +| in int **VIEW_INDEX** | The view that we are rendering. | +| | ``VIEW_MONO_LEFT`` (``0``) for Mono (not multiview) or | +| | left eye, ``VIEW_RIGHT`` (``1``) for right eye. | +----------------------------------------+--------------------------------------------------------------------------------------------------+ -| in int **VIEW_MONO_LEFT** | | +| in int **VIEW_MONO_LEFT** | Constant for Mono or left eye, always ``0``. | +----------------------------------------+--------------------------------------------------------------------------------------------------+ -| in int **VIEW_RIGHT** | | +| in int **VIEW_RIGHT** | Constant for right eye, always ``1``. | ++----------------------------------------+--------------------------------------------------------------------------------------------------+ +| in vec3 **EYE_OFFSET** | Position offset for the eye being rendered. Only applicable for multiview rendering. | +----------------------------------------+--------------------------------------------------------------------------------------------------+ | sampler2D **SCREEN_TEXTURE** | Removed in Godot 4. Use a ``sampler2D`` with ``hint_screen_texture`` instead. | +----------------------------------------+--------------------------------------------------------------------------------------------------+ From 628d4f94d2f80a385a30b61a1196767db3c9bb6f Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Fri, 14 Apr 2023 03:19:55 +0200 Subject: [PATCH 28/59] Complete render modes list in shaders docs --- .../shader_reference/spatial_shader.rst | 146 +++++++++--------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/tutorials/shaders/shader_reference/spatial_shader.rst b/tutorials/shaders/shader_reference/spatial_shader.rst index a541fd93f..16e7a10ce 100644 --- a/tutorials/shaders/shader_reference/spatial_shader.rst +++ b/tutorials/shaders/shader_reference/spatial_shader.rst @@ -11,79 +11,79 @@ write vertex, fragment, and light processor functions to affect how objects are Render modes ^^^^^^^^^^^^ -+-------------------------------+------------------------------------------------------------------------+ -| Render mode | Description | -+===============================+========================================================================+ -| **blend_mix** | Mix blend mode (alpha is transparency), default. | -+-------------------------------+------------------------------------------------------------------------+ -| **blend_add** | Additive blend mode. | -+-------------------------------+------------------------------------------------------------------------+ -| **blend_sub** | Subtractive blend mode. | -+-------------------------------+------------------------------------------------------------------------+ -| **blend_mul** | Multiplicative blend mode. | -+-------------------------------+------------------------------------------------------------------------+ -| **depth_draw_opaque** | Only draw depth for opaque geometry (not transparent). | -+-------------------------------+------------------------------------------------------------------------+ -| **depth_draw_always** | Always draw depth (opaque and transparent). | -+-------------------------------+------------------------------------------------------------------------+ -| **depth_draw_never** | Never draw depth. | -+-------------------------------+------------------------------------------------------------------------+ -| **depth_prepass_alpha** | Do opaque depth pre-pass for transparent geometry. | -+-------------------------------+------------------------------------------------------------------------+ -| **depth_test_disabled** | Disable depth testing. | -+-------------------------------+------------------------------------------------------------------------+ -| **sss_mode_skin** | | -+-------------------------------+------------------------------------------------------------------------+ -| **cull_back** | Cull back-faces (default). | -+-------------------------------+------------------------------------------------------------------------+ -| **cull_front** | Cull front-faces. | -+-------------------------------+------------------------------------------------------------------------+ -| **cull_disabled** | Culling disabled (double sided). | -+-------------------------------+------------------------------------------------------------------------+ -| **unshaded** | Result is just albedo. No lighting/shading happens in material. | -+-------------------------------+------------------------------------------------------------------------+ -| **wireframe** | Geometry draws using lines. | -+-------------------------------+------------------------------------------------------------------------+ -| **diffuse_lambert** | Lambert shading for diffuse (default). | -+-------------------------------+------------------------------------------------------------------------+ -| **diffuse_lambert_wrap** | Lambert wrapping (roughness dependent) for diffuse. | -+-------------------------------+------------------------------------------------------------------------+ -| **diffuse_burley** | Burley (Disney PBS) for diffuse. | -+-------------------------------+------------------------------------------------------------------------+ -| **diffuse_toon** | Toon shading for diffuse. | -+-------------------------------+------------------------------------------------------------------------+ -| **specular_schlick_ggx** | Schlick-GGX for specular (default). | -+-------------------------------+------------------------------------------------------------------------+ -| **specular_blinn** | Blinn for specular (compatibility). | -+-------------------------------+------------------------------------------------------------------------+ -| **specular_phong** | Phong for specular (compatibility). | -+-------------------------------+------------------------------------------------------------------------+ -| **specular_toon** | Toon for specular. | -+-------------------------------+------------------------------------------------------------------------+ -| **specular_disabled** | Disable specular. | -+-------------------------------+------------------------------------------------------------------------+ -| **skip_vertex_transform** | VERTEX/NORMAL/etc. need to be transformed manually in vertex function. | -+-------------------------------+------------------------------------------------------------------------+ -| **world_vertex_coords** | VERTEX/NORMAL/etc. are modified in world coordinates instead of local. | -+-------------------------------+------------------------------------------------------------------------+ -| **ensure_correct_normals** | Use when non-uniform scale is applied to mesh. | -+-------------------------------+------------------------------------------------------------------------+ -| **shadows_disabled** | Disable computing shadows in shader. | -+-------------------------------+------------------------------------------------------------------------+ -| **ambient_light_disabled** | Disable contribution from ambient light and radiance map. | -+-------------------------------+------------------------------------------------------------------------+ -| **shadow_to_opacity** | Lighting modifies the alpha so shadowed areas are opaque and | -| | non-shadowed areas are transparent. Useful for overlaying shadows onto | -| | a camera feed in AR. | -+-------------------------------+------------------------------------------------------------------------+ -| **vertex_lighting** | Use vertex-based lighting. | -+-------------------------------+------------------------------------------------------------------------+ -| **particle_trails** | Enables the trails when used on particles geometry. | -+-------------------------------+------------------------------------------------------------------------+ -| **alpha_to_coverage** | | -+-------------------------------+------------------------------------------------------------------------+ -| **alpha_to_coverage_and_one** | | -+-------------------------------+------------------------------------------------------------------------+ ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| Render mode | Description | ++===============================+======================================================================================================+ +| **blend_mix** | Mix blend mode (alpha is transparency), default. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **blend_add** | Additive blend mode. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **blend_sub** | Subtractive blend mode. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **blend_mul** | Multiplicative blend mode. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **depth_draw_opaque** | Only draw depth for opaque geometry (not transparent). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **depth_draw_always** | Always draw depth (opaque and transparent). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **depth_draw_never** | Never draw depth. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **depth_prepass_alpha** | Do opaque depth pre-pass for transparent geometry. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **depth_test_disabled** | Disable depth testing. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **sss_mode_skin** | Subsurface Scattering mode for skin. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **cull_back** | Cull back-faces (default). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **cull_front** | Cull front-faces. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **cull_disabled** | Culling disabled (double sided). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **unshaded** | Result is just albedo. No lighting/shading happens in material. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **wireframe** | Geometry draws using lines. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **diffuse_lambert** | Lambert shading for diffuse (default). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **diffuse_lambert_wrap** | Lambert wrapping (roughness dependent) for diffuse. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **diffuse_burley** | Burley (Disney PBS) for diffuse. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **diffuse_toon** | Toon shading for diffuse. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **specular_schlick_ggx** | Schlick-GGX for specular (default). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **specular_blinn** | Blinn for specular (compatibility). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **specular_phong** | Phong for specular (compatibility). | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **specular_toon** | Toon for specular. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **specular_disabled** | Disable specular. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **skip_vertex_transform** | VERTEX/NORMAL/etc. need to be transformed manually in vertex function. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **world_vertex_coords** | VERTEX/NORMAL/etc. are modified in world coordinates instead of local. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **ensure_correct_normals** | Use when non-uniform scale is applied to mesh. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **shadows_disabled** | Disable computing shadows in shader. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **ambient_light_disabled** | Disable contribution from ambient light and radiance map. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **shadow_to_opacity** | Lighting modifies the alpha so shadowed areas are opaque and | +| | non-shadowed areas are transparent. Useful for overlaying shadows onto | +| | a camera feed in AR. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **vertex_lighting** | Use vertex-based lighting. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **particle_trails** | Enables the trails when used on particles geometry. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **alpha_to_coverage** | Alpha antialiasing mode, see `here `_ for more. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ +| **alpha_to_coverage_and_one** | Alpha antialiasing mode, see `here `_ for more. | ++-------------------------------+------------------------------------------------------------------------------------------------------+ Built-ins ^^^^^^^^^ From bfd023fe77bbdda147fce395c21c742a53c96a96 Mon Sep 17 00:00:00 2001 From: Piyush Mulatkar <94689708+piyushmulatkar@users.noreply.github.com> Date: Sat, 7 Jan 2023 22:13:27 +0530 Subject: [PATCH 29/59] Added correct reference to Frames property Added more clear instruction for finding Frames properties. Earlier it was harder to find Frames properties as it is now hidden inside Animation tab. --- getting_started/first_2d_game/02.player_scene.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/first_2d_game/02.player_scene.rst b/getting_started/first_2d_game/02.player_scene.rst index e1c0d154a..4c217e940 100644 --- a/getting_started/first_2d_game/02.player_scene.rst +++ b/getting_started/first_2d_game/02.player_scene.rst @@ -58,7 +58,7 @@ Click on the ``Player`` node and add (:kbd:`Ctrl + A`) a child node :ref:`Animat appearance and animations for our player. Notice that there is a warning symbol next to the node. An ``AnimatedSprite2D`` requires a :ref:`SpriteFrames ` resource, which is a list of the animations it can -display. To create one, find the ``Sprite Frames`` property in the Inspector and click +display. To create one, find the ``Sprite Frames`` property under the ``Animation`` tab in the Inspector and click "[empty]" -> "New SpriteFrames". Click again to open the "SpriteFrames" panel: .. image:: img/spriteframes_panel.webp From 1af0c5cbe40517bcb111a98ea4fe9c49f7c56d24 Mon Sep 17 00:00:00 2001 From: Yuri Sizov Date: Fri, 14 Apr 2023 16:01:20 +0200 Subject: [PATCH 30/59] Add a CI action to sync up the class reference --- .github/workflows/sync_class_ref.yml | 68 ++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/workflows/sync_class_ref.yml diff --git a/.github/workflows/sync_class_ref.yml b/.github/workflows/sync_class_ref.yml new file mode 100644 index 000000000..ed8829d9c --- /dev/null +++ b/.github/workflows/sync_class_ref.yml @@ -0,0 +1,68 @@ +name: Sync Class Reference + +on: + workflow_dispatch: + # Scheduled updates are only enabled for in-dev branches. + schedule: + # Run it at night (European time) every Saturday. + # The offset is there to try and avoid the high load times. + - cron: '15 3 * * 6' + +# Make sure jobs cannot overlap. +concurrency: + group: classref-sync-ci + cancel-in-progress: true + +jobs: + build: + name: Update class reference files based on the engine revision + runs-on: ubuntu-latest + env: + engine_rev: 'master' + + steps: + - name: Checkout the documentation repository + uses: actions/checkout@v3 + + - name: Checkout the engine repository + uses: actions/checkout@v3 + with: + repository: 'godotengine/godot' + # Use the appropriate branch for the documentation version. + ref: ${{ env.engine_rev }} + path: './.engine-src' + + - name: Store the engine revision + id: 'engine' + run: | + cd ./.engine-src + hash=$(git rev-parse HEAD) + hash_short=$(git rev-parse --short HEAD) + echo "Checked out godotengine/godot at $hash" + echo "rev_hash=$hash" >> $GITHUB_OUTPUT + echo "rev_hash_short=$hash_short" >> $GITHUB_OUTPUT + + - name: Remove old documentation + run: | + rm ./classes/class_*.rst + + - name: Build new documentation + run: | + ./.engine-src/doc/tools/make_rst.py --color -o ./classes -l en ./.engine-src/doc/classes ./.engine-src/modules + + - name: Submit a pull-request + uses: peter-evans/create-pull-request@v5 + with: + commit-message: 'classref: Sync with current ${{ env.engine_rev }} branch (${{ steps.engine.outputs.rev_hash_short }})' + branch: 'classref/sync-${{ steps.engine.outputs.rev_hash_short }}' + add-paths: './classes' + delete-branch: true + + # Configure the commit author. + author: 'Godot Organization ' + committer: 'Godot Organization ' + + # Configure the pull-request. + title: 'classref: Sync with current ${{ env.engine_rev }} branch (${{ steps.engine.outputs.rev_hash_short }})' + body: 'Update Godot API online class reference to match the engine at https://github.com/godotengine/godot/commit/${{ steps.engine.outputs.rev_hash }} (`${{ env.engine_rev }}`).' + labels: 'area:class reference,bug,enhancement' From 4d525171fa677775b879012ab6390b039f915c41 Mon Sep 17 00:00:00 2001 From: Roy Zwambag Date: Sat, 15 Apr 2023 09:32:42 +0200 Subject: [PATCH 31/59] Add macOS shortcut for closing Scene window --- getting_started/step_by_step/nodes_and_scenes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getting_started/step_by_step/nodes_and_scenes.rst b/getting_started/step_by_step/nodes_and_scenes.rst index ebc10ba28..024a0b3d3 100644 --- a/getting_started/step_by_step/nodes_and_scenes.rst +++ b/getting_started/step_by_step/nodes_and_scenes.rst @@ -157,7 +157,7 @@ The application should open in a new window and display the text "Hello World". .. image:: img/nodes_and_scenes_11_final_result.webp -Close the window or press :kbd:`F8` to quit the running scene. +Close the window or press :kbd:`F8` (:kbd:`Cmd + .` on macOS) to quit the running scene. .. note:: From b20fa95ee37e329bf5c0e07d67a45f2848874ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20Petrovi=C4=87?= Date: Sat, 15 Apr 2023 16:39:38 +0100 Subject: [PATCH 32/59] Update link to set of predefined color mappings in `creating_icons.rst` --- contributing/development/editor/creating_icons.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/editor/creating_icons.rst b/contributing/development/editor/creating_icons.rst index 97e72c647..451616aca 100644 --- a/contributing/development/editor/creating_icons.rst +++ b/contributing/development/editor/creating_icons.rst @@ -38,7 +38,7 @@ Color conversion for light editor themes If the user has configured their editor to use a light theme, Godot will convert the icon's colors based on a -`set of predefined color mappings `__. +`set of predefined color mappings `__. This is to ensure the icon always displays with a sufficient contrast rate. Try to restrict your icon's color palette to colors found in the list above. Otherwise, your icon may become difficult to read on a light background. From c59fbbc81224bbe2ba32be323501ce8eb5c947e0 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sat, 15 Apr 2023 21:39:17 +0200 Subject: [PATCH 33/59] Update GitHub issue URL for encapsulation violations in Editor development The previously linked issue is now closed. --- .../development/editor/introduction_to_editor_development.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/editor/introduction_to_editor_development.rst b/contributing/development/editor/introduction_to_editor_development.rst index 87adc1ed1..9613bcb62 100644 --- a/contributing/development/editor/introduction_to_editor_development.rst +++ b/contributing/development/editor/introduction_to_editor_development.rst @@ -77,7 +77,7 @@ from ``servers/`` and ``core/``, it cannot depend on includes from ``editor/``. Currently, there are some dependencies to ``editor/`` includes in ``scene/`` files, but -`they are in the process of being removed `__. +`they are in the process of being removed `__. Development tips ---------------- From 5eb4a277c42208044e218b15a532db42a5adb12a Mon Sep 17 00:00:00 2001 From: belzecue <1931303+belzecue@users.noreply.github.com> Date: Sun, 16 Apr 2023 21:30:14 +0800 Subject: [PATCH 34/59] Fix typo 'adominitions' A Google search returns <300 hits for this spelling, with the top hit being a typo itself, so I'm pretty sure the use here is also a typo for 'admonitions.' --- contributing/development/code_style_guidelines.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/code_style_guidelines.rst b/contributing/development/code_style_guidelines.rst index da22a6d1e..379185d25 100644 --- a/contributing/development/code_style_guidelines.rst +++ b/contributing/development/code_style_guidelines.rst @@ -321,7 +321,7 @@ Godot's codebase. always end them with a period. - Reference variable/function names and values using backticks. - Wrap comments to ~100 characters. -- You can use ``TODO:``, ``FIXME:``, ``NOTE:``, or ``HACK:`` as adominitions +- You can use ``TODO:``, ``FIXME:``, ``NOTE:``, or ``HACK:`` as admonitions when needed. **Example:** From 4992f01016f7fcd65ac37951705e64ca3f2d479b Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 7 Apr 2023 22:47:02 +0200 Subject: [PATCH 35/59] Add a page on troubleshooting common physics issues This covers the most commonly encountered physics issues one may encounter while developing a project. --- tutorials/physics/index.rst | 1 + tutorials/physics/large_world_coordinates.rst | 2 + .../troubleshooting_physics_issues.rst | 166 ++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 tutorials/physics/troubleshooting_physics_issues.rst diff --git a/tutorials/physics/index.rst b/tutorials/physics/index.rst index 746082c32..4ba2acd29 100644 --- a/tutorials/physics/index.rst +++ b/tutorials/physics/index.rst @@ -16,3 +16,4 @@ Physics collision_shapes_2d collision_shapes_3d large_world_coordinates + troubleshooting_physics_issues diff --git a/tutorials/physics/large_world_coordinates.rst b/tutorials/physics/large_world_coordinates.rst index 9ebe17c95..2fa5cb2d7 100644 --- a/tutorials/physics/large_world_coordinates.rst +++ b/tutorials/physics/large_world_coordinates.rst @@ -1,3 +1,5 @@ +.. _doc_large_world_coordinates: + Large world coordinates ======================= diff --git a/tutorials/physics/troubleshooting_physics_issues.rst b/tutorials/physics/troubleshooting_physics_issues.rst new file mode 100644 index 000000000..4735814fe --- /dev/null +++ b/tutorials/physics/troubleshooting_physics_issues.rst @@ -0,0 +1,166 @@ +.. _doc_troubleshooting_physics_issues: + +Troubleshooting physics issues +============================== + +When working with a physics engine, you may encounter unexpected results. + +While many of these issues can be resolved through configuration, some of them +are the result of engine bugs. For known issues related to the physics engine, +see +`open physics-related issues on GitHub `__. +Looking through `closed issues +`__ +can also help answer questions related to physics engine behavior. + +Objects are passing through each other at high speeds +----------------------------------------------------- + +This is known as *tunneling*. Enabling **Continuous CD** in the RigidBody +properties can sometimes resolve this issue. If this does not help, there are +other solutions you can try: + +- Make your static collision shapes thicker. For example, if you have a thin + floor that the player can't get below in some way, you can make the collider + thicker than the floor's visual representation. +- Modify your fast-moving object's collision shape depending on its movement + speed. The faster the object moves, the larger the collision shape should + extend outside of the object to ensure it can collide with thin walls more + reliably. +- Increase **Physics Ticks Per Second** in the advanced Project Settings. While + this has other benefits (such as more stable simulation and reduced input + lag), this increases CPU utilization and may not be viable for mobile/web + platforms. Multipliers of the default value of ``60`` (such as ``120``, ``180`` + or ``240``) should be preferred for a smooth appearance on most displays. + +Stacked objects are unstable and wobbly +--------------------------------------- + +Despite seeming like a simple problem, stable RigidBody simulation with stacked +objects is difficult to implement in a physics engine. This is caused by +integrating forces going against each other. The more stacked objects are +present, the stronger the forces will be against each other. This eventually +causes the simulation to become wobbly, making the objects unable to rest on top +of each other without moving. + +Increasing the physics simulation rate can help alleviate this issue. To do so, +increase **Physics Ticks Per Second** in the advanced Project Settings. Note +that increases CPU utilization and may not be viable for mobile/web platforms. +Multipliers of the default value of ``60`` (such as ``120``, ``180`` or ``240``) +should be preferred for a smooth appearance on most displays. + +Scaled physics bodies or collision shapes do not collide correctly +------------------------------------------------------------------ + +Godot does not currently support scaling of physics bodies or collision shapes. +As a workaround, change the collision shape's extents instead of changing its +scale. If you want the visual representation's scale to change as well, change +the scale of the underlying visual representation (Sprite2D, MeshInstance3D, …) +and change the collision shape's extents separately. Make sure the collision +shape is not a child of the visual representation in this case. + +Since resources are shared by default, you'll have to make the collision shape +resource unique if you don't want the change to be applied to all nodes using +the same collision shape resource in the scene. This can be done by calling +``duplicate()`` in a script on the collision shape resource *before* changing +its size. + +Thin objects are wobbly when resting on the floor +------------------------------------------------- + +This can be due to one of two causes: + +- The floor's collision shape is too thin. +- The RigidBody's collision shape is too thin. + +In the first case, this can be alleviated by making the floor's collision shape +thicker. For example, if you have a thin floor that the player can't get below +in some way, you can make the collider thicker than the floor's visual +representation. + +In the second case, this can usually only be resolved by increasing the physics +simulation rate (as making the shape thicker would cause a disconnect between +the RigidBody's visual representation and its collision). + +In both cases, increasing the physics simulation rate can also help alleviate +this issue. To do so, increase **Physics Ticks Per Second** in the advanced +Project Settings. Note that this increases CPU utilization and may not be viable +for mobile/web platforms. Multipliers of the default value of ``60`` (such as +``120``, ``180`` or ``240``) should be preferred for a smooth appearance on most +displays. + +Cylinder collision shapes are unstable +-------------------------------------- + +During the transition from Bullet to GodotPhysics in Godot 4, cylinder collision +shapes had to be reimplemented from scratch. However, cylinder collision shapes +are one of the most difficult shapes to support, which is why many other physics +engines don't provide any support for them. There are several known bugs with +cylinder collision shapes currently. + +We recommend using box or capsule collision shapes for characters for now. Boxes +generally provide the best reliability, but have the downside of making the +character take more space diagonally. Capsule collision shapes do not have this +downside, but their shape can make precision platforming more difficult. + +VehicleBody simulation is unstable, especially at high speeds +------------------------------------------------------------- + +When a physics body moves at a high speed, it travels a large distance between +each physics step. For instance, when using the 1 unit = 1 meter convention in +3D, a vehicle moving at 360 km/h will travel 100 units per second. With the +default physics simulation rate of 60 Hz, the vehicle moves by ~1.67 units each +physics tick. This means that small objects may be ignored entirely by the +vehicle (due to tunneling), but also that the simulation has little data to work +with in general at such a high speed. + +Fast-moving vehicles can benefit a lot from an increased physics simulation +rate. To do so, increase **Physics Ticks Per Second** in the advanced Project +Settings. Note that this increases CPU utilization and may not be viable for +mobile/web platforms. Multipliers of the default value of ``60`` (such as +``120``, ``180`` or ``240``) should be preferred for a smooth appearance on most +displays. + +Collision results in bumps when an object moves across tiles +------------------------------------------------------------ + +This is a known issue in the physics engine caused by the object bumping on a +shape's edges, even though that edge is covered by another shape. This can occur +in both 2D and 3D. + +The best way to work around this issue is to create a "composite" collider. This +means that instead of individual tiles having their collision, you create a +single collision shape representing the collision for a group of tiles. +Typically, you should split composite colliders on a per-island basis (which +means each group of touching tiles gets its own collider). + +Using a composite collider can also improve physics simulation performance in +certain cases. However, since the composite collision shape is much more +complex, this may not be a net performance win in all cases. + +Framerate drops when an object touches another object +----------------------------------------------------- + +This is likely due to one of the objects using a collision shape that is too +complex. Convex collision shapes should use a number of shapes as low as +possible for performance reasons. When relying on Godot's automatic generation, +it's possible that you ended up with dozens if not hundreds of shapes created +for a single convex shape collision resource. + +In some cases, replacing a convex collider with a couple of primitive collision +shapes (box, sphere, or capsule) can deliver better performance. + +This issue can also occur with StaticBodies that use very detailed trimesh +(concave) collisions. In this case, use a simplified representation of the level +geometry as a collider. Not only this will improve physics simulation +performance significantly, but this can also improve stability by letting you +remove small fixtures and crevices from being considered by collision. + +Physics simulation is unreliable when far away from the world origin +-------------------------------------------------------------------- + +This is caused by floating-point precision errors, which become more pronounced +as the physics simulation occurs further away from the world origin. This issue +also affects rendering, which results in wobbly camera movement when far away +from the world origin. See :ref:`doc_large_world_coordinates` for more +information. From ea8b139db83ac1d4b757b6de7f3d6fa666498006 Mon Sep 17 00:00:00 2001 From: Peter Anderson Date: Mon, 17 Apr 2023 06:25:28 +0000 Subject: [PATCH 36/59] Update managing_editor_features.rst --- tutorials/editor/managing_editor_features.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/editor/managing_editor_features.rst b/tutorials/editor/managing_editor_features.rst index 10bd40e47..f9a8148f9 100644 --- a/tutorials/editor/managing_editor_features.rst +++ b/tutorials/editor/managing_editor_features.rst @@ -27,7 +27,7 @@ will open the **Manage Editor Feature Profiles** window. By default there will be no profile. Click on **Create Profile** and give it a name. You will then see a list of all the features in the Godot editor. -..img:: img/configure_profile.png +.. image:: img/configure_profile.png The first section allows major editor features to be removed, such as the 3D editor or scripting editor. Below the main features is every class and node in @@ -35,7 +35,7 @@ Godot, which can be disabled as well. Click on a node and all of its properties and options will be listed in the **Extra Items** box, these can all be individually disabled. -..img:: img/node_features.png +.. image:: img/node_features.png Sharing a profile ----------------- From 519534ad8d6c02bbb133a2161184b76157cf5d37 Mon Sep 17 00:00:00 2001 From: Peter Anderson Date: Mon, 17 Apr 2023 06:38:27 +0000 Subject: [PATCH 37/59] Update canvas_layers.rst --- tutorials/2d/canvas_layers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/2d/canvas_layers.rst b/tutorials/2d/canvas_layers.rst index d72f1881b..1c8797fb0 100644 --- a/tutorials/2d/canvas_layers.rst +++ b/tutorials/2d/canvas_layers.rst @@ -13,7 +13,7 @@ You can arrange canvas items in trees. Each item will inherit its parent's transform: when the parent moves, its children move too. CanvasItem nodes, and nodes inheriting from them, are direct or indirect children of a -:ref:`Viewport `, that display them. +:ref:`Viewport `, that displays them. The Viewport's property :ref:`Viewport.canvas_transform `, From 2f919ba970a6bb45b0de361cfd28336e497ace21 Mon Sep 17 00:00:00 2001 From: Justin McGettigan Date: Mon, 17 Apr 2023 12:32:15 -0400 Subject: [PATCH 38/59] Add the 'sphinx-copybutton' Sphinx extension. (#6918) * Added the 'sphinx-copybutton' Sphinx extension. --- _static/css/custom.css | 55 ++++++++++++++++++++++++++++++++++++++++++ conf.py | 1 + requirements.txt | 2 ++ 3 files changed, 58 insertions(+) diff --git a/_static/css/custom.css b/_static/css/custom.css index b7374e02f..b2134a155 100644 --- a/_static/css/custom.css +++ b/_static/css/custom.css @@ -103,6 +103,16 @@ --highlight-operator-color: #666666; --highlight-string-color: #4070a0; + --copybtn-background-color: #f6f8fa; + --copybtn-background-color-hover: #f3f4f6; + --copybtn-border-color: #d5d8da; + --copybtn-border-color-hover: #d5d8da; + --copybtn-icon-color: #57606a; + --copybtn-icon-color-success: #1a7f37; + --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; @@ -221,6 +231,16 @@ --highlight-operator-color: #abc8ff; --highlight-string-color: #ffeca1; + --copybtn-background-color: #2a303c; + --copybtn-background-color-hover: #3e4450; + --copybtn-border-color: #3e4450; + --copybtn-border-color-hover: #8b949e; + --copybtn-icon-color: #8b949e; + --copybtn-icon-color-success: #3fb950; + --copybtn-tooltip-background-color: #6e7681; + --copybtn-box-shadow: 0 0 transparent, 0 0 transparent; + --copybtn-border-color-success: #238636; + --contribute-background-color: #25282d; --contribute-text-color: #7f939b; @@ -1674,3 +1694,38 @@ p + .classref-constant { .wy-menu-vertical p.caption + ul.active { display: block; } + +.highlight button.copybtn { + background-color: var(--copybtn-background-color); + border-color: var(--copybtn-border-color); + box-shadow: var(--copybtn-box-shadow); + width: 32px; + height: 32px; + right: 0; + top: 0; + margin: 12.25px; +} +.highlight button.copybtn:hover { + background-color: var(--copybtn-background-color-hover); + border-color: var(--copybtn-border-color-hover); +} +.highlight button.copybtn svg { + position: absolute; + left: 3.5px; + top: 3.5px; + color: var(--copybtn-icon-color); + pointer-events: none; +} +.highlight button.copybtn.success { + border-color: var(--copybtn-border-color-success); + box-shadow: 0 0 0 0.2em rgb(52 208 88 / 40%); +} +.highlight button.copybtn.success svg { + color: var(--copybtn-icon-color-success); +} +.o-tooltip--left:after { + background-color: var(--copybtn-tooltip-background-color); + color: #ffffff; + border-radius: 6px; + padding: 0.5em 0.75em; +} diff --git a/conf.py b/conf.py index e7301576d..24cff328c 100644 --- a/conf.py +++ b/conf.py @@ -17,6 +17,7 @@ extensions = [ "sphinx_tabs.tabs", "notfound.extension", "sphinxext.opengraph", + "sphinx_copybutton", ] # Warning when the Sphinx Tabs extension is used with unknown diff --git a/requirements.txt b/requirements.txt index c19fdf1cd..dd4a325d8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,6 +13,8 @@ sphinx_rtd_theme==1.1.1 # Code tabs extension to display codeblocks in different languages as tabs. sphinx-tabs==3.4.0 +# Adds a 'copy' button to the right of codeblocks. +sphinx-copybutton==0.5.1 # Custom 404 error page (more useful than the default). sphinx-notfound-page==0.8.3 # Adds Open Graph tags in the HTML `` tag. From 64a3b465c201395af6f4d6551d0a8b848f11c8ab Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Mon, 17 Apr 2023 23:53:52 +0200 Subject: [PATCH 39/59] Update SFC to Godot Foundation, old URLs --- about/introduction.rst | 8 ++++---- community/tutorials.rst | 2 +- contributing/development/code_style_guidelines.rst | 10 +++++----- .../development/compiling/compiling_for_windows.rst | 2 +- .../compiling/cross-compiling_for_ios_on_linux.rst | 8 +++----- .../core_and_modules/binding_to_external_libraries.rst | 2 +- .../custom_resource_format_loaders.rst | 4 ++-- .../contributing_to_the_documentation.rst | 2 +- make.bat | 2 +- tutorials/3d/3d_rendering_limitations.rst | 2 +- .../vertex_animation/animating_thousands_of_fish.rst | 2 +- tutorials/platform/android/android_plugin.rst | 2 +- tutorials/platform/consoles.rst | 2 +- .../gdscript/gdscript_documentation_comments.rst | 10 +++++----- 14 files changed, 28 insertions(+), 30 deletions(-) diff --git a/about/introduction.rst b/about/introduction.rst index 3df5c1fa0..69f69a51f 100644 --- a/about/introduction.rst +++ b/about/introduction.rst @@ -46,8 +46,8 @@ if you need a quick write-up about Godot Engine. license. No strings attached, no royalties, nothing. Users' games are theirs, down to the last line of engine code. Godot's development is fully independent and community-driven, empowering users to help shape their - engine to match their expectations. It is supported by the `Software - Freedom Conservancy `_ not-for-profit. + engine to match their expectations. It is supported by the `Godot + Foundation `_ not-for-profit. For a more in-depth view of the engine, you are encouraged to read this documentation further, especially the :ref:`Getting Started ` series. @@ -57,9 +57,9 @@ About the documentation This documentation is continuously written, corrected, edited, and revamped by members of the Godot Engine community. It is edited via text files in the -`reStructuredText `_ markup +`reStructuredText `_ markup language and then compiled into a static website/offline document using the -open source `Sphinx `_ and `ReadTheDocs +open source `Sphinx `_ and `ReadTheDocs `_ tools. .. note:: You can contribute to Godot's documentation by opening issue tickets diff --git a/community/tutorials.rst b/community/tutorials.rst index 435c04dbd..a0dfab1b7 100644 --- a/community/tutorials.rst +++ b/community/tutorials.rst @@ -48,7 +48,7 @@ Video tutorials Text tutorials -------------- -- `FinepointCGI website by Mitch `__ +- `FinepointCGI website by Mitch `__ - `GDScript website by Andrew Wilkes `__ - `Godot Recipes by KidsCanCode `__ - `Steincodes `__ diff --git a/contributing/development/code_style_guidelines.rst b/contributing/development/code_style_guidelines.rst index 379185d25..344f67150 100644 --- a/contributing/development/code_style_guidelines.rst +++ b/contributing/development/code_style_guidelines.rst @@ -15,7 +15,7 @@ C++ and Objective-C ------------------- There are no written guidelines, but the code style agreed upon by the -developers is enforced via the `clang-format `__ +developers is enforced via the `clang-format `__ code beautifier, which takes care for you of all our conventions. To name a few: @@ -69,10 +69,10 @@ Here's how to install clang-format: - Linux: It will usually be available out-of-the-box with the clang toolchain packaged by your distribution. If your distro version is not the required one, you can download a pre-compiled version from the - `LLVM website `__, or if you are on - a Debian derivative, use the `upstream repos `__. + `LLVM website `__, or if you are on + a Debian derivative, use the `upstream repos `__. - macOS and Windows: You can download precompiled binaries from the - `LLVM website `__. You may need to add + `LLVM website `__. You may need to add the path to the binary's folder to your system's ``PATH`` environment variable to be able to call ``clang-format`` out of the box. @@ -118,7 +118,7 @@ clang-format automatically, for example each time you save a file. Here is a non-exhaustive list of beautifier plugins for some IDEs: -- Qt Creator: `Beautifier plugin `__ +- Qt Creator: `Beautifier plugin `__ - Visual Studio Code: `Clang-Format `__ - Visual Studio: `ClangFormat `__ - vim: `vim-clang-format `__ diff --git a/contributing/development/compiling/compiling_for_windows.rst b/contributing/development/compiling/compiling_for_windows.rst index 3538b3f2b..7c3ee4310 100644 --- a/contributing/development/compiling/compiling_for_windows.rst +++ b/contributing/development/compiling/compiling_for_windows.rst @@ -19,7 +19,7 @@ For compiling under Windows, the following is required: version 2017 or later. VS 2019 is recommended. **Make sure to read "Installing Visual Studio caveats" below or you will have to run/download the installer again.** -- `MinGW-w64 `_ with GCC can be used as an alternative to +- `MinGW-w64 `_ with GCC can be used as an alternative to Visual Studio. Be sure to install/configure it to use the ``posix`` thread model. **Important:** When using MinGW to compile the ``master`` branch, you need GCC 9 or later. - `Python 3.6+ `_. diff --git a/contributing/development/compiling/cross-compiling_for_ios_on_linux.rst b/contributing/development/compiling/cross-compiling_for_ios_on_linux.rst index c3880aeea..08be816bd 100644 --- a/contributing/development/compiling/cross-compiling_for_ios_on_linux.rst +++ b/contributing/development/compiling/cross-compiling_for_ios_on_linux.rst @@ -15,10 +15,8 @@ Disclaimer While it is possible to compile for iOS on a Linux environment, Apple is very restrictive about the tools to be used (especially hardware-wise), allowing pretty much only their products to be used for development. So -this is **not official**. However, a `statement from Apple in 2010 -`__ -says they relaxed some of the `App Store review guidelines -`__ +this is **not official**. However, in 2010 Apple said they relaxed some of the +`App Store review guidelines `__ to allow any tool to be used, as long as the resulting binary does not download any code, which means it should be OK to use the procedure described here and cross-compiling the binary. @@ -28,7 +26,7 @@ Requirements - `XCode with the iOS SDK `__ (a dmg image, for newer versions a **xip** file is going to be downloaded.) -- `Clang >= 3.5 `__ for your development +- `Clang >= 3.5 `__ for your development machine installed and in the ``PATH``. It has to be version >= 3.5 to target ``arm64`` architecture. - `Fuse `__ for mounting and unmounting diff --git a/contributing/development/core_and_modules/binding_to_external_libraries.rst b/contributing/development/core_and_modules/binding_to_external_libraries.rst index dba80931d..905701952 100644 --- a/contributing/development/core_and_modules/binding_to_external_libraries.rst +++ b/contributing/development/core_and_modules/binding_to_external_libraries.rst @@ -8,7 +8,7 @@ Modules The Summator example in :ref:`doc_custom_modules_in_cpp` is great for small, custom modules, but what if you want to use a larger, external library? -Let's look at an example using `Festival `_, +Let's look at an example using `Festival `_, a speech synthesis (text-to-speech) library written in C++. To bind to an external library, set up a module directory similar to the Summator example: diff --git a/contributing/development/core_and_modules/custom_resource_format_loaders.rst b/contributing/development/core_and_modules/custom_resource_format_loaders.rst index d5fd2f5ab..3259551dc 100644 --- a/contributing/development/core_and_modules/custom_resource_format_loaders.rst +++ b/contributing/development/core_and_modules/custom_resource_format_loaders.rst @@ -302,8 +302,8 @@ calls into ``std::istream``. References ~~~~~~~~~~ -- `istream `_ -- `streambuf `_ +- `istream `_ +- `streambuf `_ - `core/io/file_access.h `_ Registering the new file format diff --git a/contributing/documentation/contributing_to_the_documentation.rst b/contributing/documentation/contributing_to_the_documentation.rst index 91b886785..de02b18c8 100644 --- a/contributing/documentation/contributing_to_the_documentation.rst +++ b/contributing/documentation/contributing_to_the_documentation.rst @@ -146,7 +146,7 @@ Sphinx and reStructuredText syntax ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Check Sphinx’s `reST Primer `__ -and the `official reference `__ for +and the `official reference `__ for details on the syntax. Sphinx uses specific reST comments to do specific operations, like defining the diff --git a/make.bat b/make.bat index c1e71af15..90a24541c 100644 --- a/make.bat +++ b/make.bat @@ -22,7 +22,7 @@ if errorlevel 9009 ( echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ + echo.https://www.sphinx-doc.org/ exit /b 1 ) diff --git a/tutorials/3d/3d_rendering_limitations.rst b/tutorials/3d/3d_rendering_limitations.rst index 33d2f9d42..a63065932 100644 --- a/tutorials/3d/3d_rendering_limitations.rst +++ b/tutorials/3d/3d_rendering_limitations.rst @@ -64,7 +64,7 @@ There are two main ways to alleviate banding: .. seealso:: - See `Banding in Games: A Noisy Rant `__ + See `Banding in Games: A Noisy Rant (PDF) `__ for more details about banding and ways to combat it. Depth buffer precision diff --git a/tutorials/performance/vertex_animation/animating_thousands_of_fish.rst b/tutorials/performance/vertex_animation/animating_thousands_of_fish.rst index 432b4ef1e..c26dffc9d 100644 --- a/tutorials/performance/vertex_animation/animating_thousands_of_fish.rst +++ b/tutorials/performance/vertex_animation/animating_thousands_of_fish.rst @@ -26,7 +26,7 @@ Here is the fish we will be using for the example images, you can use any fish m .. image:: img/fish.png -.. note:: The fish model in this tutorial is made by `QuaterniusDev `_ and is +.. note:: The fish model in this tutorial is made by `QuaterniusDev `_ and is shared with a creative commons license. CC0 1.0 Universal (CC0 1.0) Public Domain Dedication https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/tutorials/platform/android/android_plugin.rst b/tutorials/platform/android/android_plugin.rst index de78cc75d..35da15f91 100644 --- a/tutorials/platform/android/android_plugin.rst +++ b/tutorials/platform/android/android_plugin.rst @@ -97,7 +97,7 @@ The instructions below assumes that you're using Android Studio. local=["local_dep1.aar", "local_dep2.aar"] remote=["example.plugin.android:remote-dep1:0.0.1", "example.plugin.android:remote-dep2:0.0.1"] - custom_maven_repos=["http://repo.mycompany.com/maven2"] + custom_maven_repos=["https://repo.mycompany.com/maven2"] The ``config`` section and fields are required and defined as follow: diff --git a/tutorials/platform/consoles.rst b/tutorials/platform/consoles.rst index 09095d287..d2299b24f 100644 --- a/tutorials/platform/consoles.rst +++ b/tutorials/platform/consoles.rst @@ -66,7 +66,7 @@ your games to various consoles. Following is the list of providers: -- `Lone Wolf Technology `_ offers +- `Lone Wolf Technology `_ offers Switch and PS4 porting and publishing of Godot games. - `Pineapple Works `_ offers Switch, Xbox One & Xbox Series X/S (GDK) porting and publishing of Godot games (GDScript/C#). diff --git a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst index abbc07f6c..b809fffae 100644 --- a/tutorials/scripting/gdscript/gdscript_documentation_comments.rst +++ b/tutorials/scripting/gdscript/gdscript_documentation_comments.rst @@ -49,8 +49,8 @@ Tags ## ## A more detailed description of the script. ## - ## @tutorial: http://the/tutorial1/url.com - ## @tutorial(Tutorial2): http://the/tutorial2/url.com + ## @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. @@ -94,8 +94,8 @@ Examples ## The description of the script, what it can do, ## and any further detail. ## - ## @tutorial: http://the/tutorial1/url.com - ## @tutorial(Tutorial2): http://the/tutorial2/url.com + ## @tutorial: https://the/tutorial1/url.com + ## @tutorial(Tutorial2): https://the/tutorial2/url.com ## The description of the variable v1. var v1 @@ -140,7 +140,7 @@ Examples ## The same rules apply apply here. The documentation must ## immediately precede the class definition. ## - ## @tutorial: http://the/tutorial/url.com + ## @tutorial: https://the/tutorial/url.com class Inner: ## Inner class variable v4. From 4ec75adb7660b5b08de09c2896048f8d878d9a27 Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Tue, 18 Apr 2023 00:37:54 +0200 Subject: [PATCH 40/59] Review, update Release Policy for Godot 4 --- about/release_policy.rst | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/about/release_policy.rst b/about/release_policy.rst index dd9cb1a75..b279364d6 100644 --- a/about/release_policy.rst +++ b/about/release_policy.rst @@ -1,13 +1,11 @@ -:article_outdated: True - .. _doc_release_policy: Godot release policy ==================== -Godot's release policy is in constant evolution. What is described below is -intended to give a general idea of what to expect, but what will actually -happen depends on the choices of core contributors, and the needs of the +Godot's release policy is in constant evolution. The description below +provides a general idea of what to expect, but what will actually +happen depends on the choices of core contributors and the needs of the community at a given time. Godot versioning @@ -30,15 +28,14 @@ term adapted to the complexity of a game engine: areas *may* happen in minor versions, but the vast majority of projects should not be affected or require significant porting work. - The reason for this is that as a game engine, Godot covers many areas such - as rendering, physics, scripting, etc., and fixing bugs or implementing new - features in a given area may sometimes require changing the behavior of a - feature, or modifying the interface of a given class, even if the rest of - the engine API remains backwards compatible. + This is because Godot, as a game engine, covers many areas like rendering, + physics, and scripting. Fixing bugs or implementing new features in one area + might sometimes require changing a feature's behavior or modifying a class's + interface, even if the rest of the engine API remains backwards compatible. .. tip:: - Upgrading to a new minor version is therefore recommended for all users, + Upgrading to a new minor version is recommended for all users, but some testing is necessary to ensure that your project still behaves as expected. @@ -64,7 +61,7 @@ further developed for maintenance releases in a Git branch of the same name Release support timeline ------------------------ -Stable branches are supported *at minimum* until the next stable branch is +Stable branches are supported *at least* until the next stable branch is released and has received its first patch update. In practice, we support stable branches on a *best effort* basis for as long as they have active users who need maintenance updates. From b5dd528faf618a488b234d104a52262831a714e1 Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Tue, 18 Apr 2023 00:48:33 +0200 Subject: [PATCH 41/59] Update About > Troubleshooting for Godot 4 --- about/troubleshooting.rst | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/about/troubleshooting.rst b/about/troubleshooting.rst index 22d1f8fa1..78328b3cc 100644 --- a/about/troubleshooting.rst +++ b/about/troubleshooting.rst @@ -1,5 +1,3 @@ -:article_outdated: True - .. _doc_troubleshooting: Troubleshooting @@ -98,15 +96,6 @@ default values in the NVIDIA Control Panel. To disable this overlay on Linux, open ``nvidia-settings``, go to **X Screen 0 > OpenGL Settings** then uncheck **Enable Graphics API Visual Indicator**. -The project window doesn't appear centered when I run the project ------------------------------------------------------------------ - -This is a `known bug `__. To -resolve this, open **Project > Project Settings**, make sure **Advanced -Settings** is active, and enable **Display > Window -> DPI > Allow hiDPI**. On top of that, make sure your project is configured to -support :ref:`multiple resolutions `. - The project works when run from the editor, but fails to load some files when running from an exported copy ----------------------------------------------------------------------------------------------------------- From 7cc873c2dd2613fccc10ebf796c5356a33ca8b95 Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Tue, 18 Apr 2023 03:02:23 +0200 Subject: [PATCH 42/59] Remove duplicate the-the --- about/troubleshooting.rst | 2 +- contributing/workflow/testing_pull_requests.rst | 2 +- tutorials/ui/bbcode_in_richtextlabel.rst | 2 +- tutorials/xr/xr_action_map.rst | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/about/troubleshooting.rst b/about/troubleshooting.rst index 78328b3cc..4a2fb81aa 100644 --- a/about/troubleshooting.rst +++ b/about/troubleshooting.rst @@ -60,7 +60,7 @@ There are several workarounds for this: The editor or project takes a very long time to start ----------------------------------------------------- -When using one of the the Vulkan-based renderers (Forward+ or Forward Mobile), +When using one of the Vulkan-based renderers (Forward+ or Forward Mobile), the first startup is expected to be relatively long. This is because shaders need to be compiled before they can be cached. Shaders also need to be cached again after updating Godot, after updating graphics drivers or after switching diff --git a/contributing/workflow/testing_pull_requests.rst b/contributing/workflow/testing_pull_requests.rst index b2ff55824..f17cdb0dd 100644 --- a/contributing/workflow/testing_pull_requests.rst +++ b/contributing/workflow/testing_pull_requests.rst @@ -69,7 +69,7 @@ to generate a universal download link. - Open the `nightly.link `__ website and paste the URL you just copied into the text field located below the heading **Paste a GitHub link, get a nightly.link!**. After pasting the URL, click **Get links** on the right. - If the the format of the URL you pasted is correct, you should be presented + If the format of the URL you pasted is correct, you should be presented with a page like this: .. image:: img/testing_pull_requests_nightly_link.png diff --git a/tutorials/ui/bbcode_in_richtextlabel.rst b/tutorials/ui/bbcode_in_richtextlabel.rst index c962864cd..1b54aefaa 100644 --- a/tutorials/ui/bbcode_in_richtextlabel.rst +++ b/tutorials/ui/bbcode_in_richtextlabel.rst @@ -277,7 +277,7 @@ Reference - ``[right]{text}[/right]`` * - | **fill** - | Makes ``{text}`` fill the the full width of ``RichTextLabel``. + | Makes ``{text}`` fill the full width of ``RichTextLabel``. | Same as ``[p align=fill]``. - ``[fill]{text}[/fill]`` diff --git a/tutorials/xr/xr_action_map.rst b/tutorials/xr/xr_action_map.rst index a72561b49..cbc61838f 100644 --- a/tutorials/xr/xr_action_map.rst +++ b/tutorials/xr/xr_action_map.rst @@ -330,11 +330,11 @@ Let's finish our configuration: .. image:: img/xr_touch_completed.webp -Each action is bound the the given input or output for both controllers to indicate that we support the action on either controller. +Each action is bound the given input or output for both controllers to indicate that we support the action on either controller. The exception is the movement action which is bound only to the right hand controller. It is likely that we would want to use the left hand thumbstick for a different purpose, say a teleport function. -In developing your game/application you have to account for the possibility that the user changes the binding and binds the movement to the left hand thumbstick. +In developing your game/application you have to account for the possibility that the user changes the binding and binds the movement to the left hand thumbstick. Also note that our shoot and grab boolean actions are linked to inputs of type ``Float``. As mentioned before OpenXR will do conversions between the two, but do read the warning given on that subject earlier in this document. From 5cbf147988d9ff58a17eab4ee400ff129e718f62 Mon Sep 17 00:00:00 2001 From: Peter Anderson Date: Tue, 18 Apr 2023 01:09:30 +0000 Subject: [PATCH 43/59] Fix grammer in logic_preferences.rst (#7173) * Update logic_preferences.rst --- tutorials/best_practices/logic_preferences.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/best_practices/logic_preferences.rst b/tutorials/best_practices/logic_preferences.rst index eae0651f7..0b98a5caf 100644 --- a/tutorials/best_practices/logic_preferences.rst +++ b/tutorials/best_practices/logic_preferences.rst @@ -16,7 +16,7 @@ properties such as the node's name or position. A common dilemma is, when should you change those values? It is the best practice to change values on a node before adding it to the -scene tree. Some properties setters have code to update other +scene tree. Some property's setters have code to update other corresponding values, and that code can be slow! For most cases, this code has no impact on your game's performance, but in heavy use cases such as procedural generation, it can bring your game to a crawl. From 922810af38c6c3659ba8569500aa27233c81f821 Mon Sep 17 00:00:00 2001 From: Bastiaan Olij Date: Wed, 5 Apr 2023 13:34:58 +1000 Subject: [PATCH 44/59] Change OpenXR loader documentation to refer to new asset library entry --- tutorials/xr/deploying_to_android.rst | 26 ++++++++++-------- tutorials/xr/img/android_meta_quest.webp | Bin 10982 -> 18496 bytes tutorials/xr/img/openxr_loader_asset_lib.webp | Bin 0 -> 14338 bytes 3 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 tutorials/xr/img/openxr_loader_asset_lib.webp diff --git a/tutorials/xr/deploying_to_android.rst b/tutorials/xr/deploying_to_android.rst index 5d6c63227..2a39bd210 100644 --- a/tutorials/xr/deploying_to_android.rst +++ b/tutorials/xr/deploying_to_android.rst @@ -9,8 +9,8 @@ Most mobile headsets run on Android and OpenXR support is making its way to thes For general requirements around exporting to Android, please first read :ref:`doc_exporting_for_android`. .. note:: - Official support for the Android platform wasn't added to the OpenXR specification initially resulting in various vendors creating custom loaders to make OpenXR available on their headsets. - While the long term expectation is that all vendors will adopt the official OpenXR loader, for now these loaders need to be added to your project. + Official support for the Android platform wasn't added to the OpenXR specification initially resulting in various vendors creating custom loaders to make OpenXR available on their headsets. + While the long term expectation is that all vendors will adopt the official OpenXR loader, for now these loaders need to be added to your project. Custom Android build -------------------- @@ -26,14 +26,14 @@ You can read more about custom builds here: :ref:`doc_android_custom_build`. Installing the loader plugins ----------------------------- -Inside the **android** folder you will find a subfolder called **plugins**, we will need to install our loader plugins into this folder. +The loaders can be downloaded from the asset library, search for OpenXR Loaders and install the plugin: -.. note:: - Once an official release becomes available you will be able to install this plugin through the asset library. For now this is a manual install. +.. image:: img/openxr_loader_asset_lib.webp -You can find the loader plugin `here `__. +You will find the installed files inside the **android** folder. +There is a subfolder called **plugins** containing the new files. -Download the **godotopenxrloaders.zip** file for the release marked as **Latest**. From this zip file copy the files found in **asset/android/plugins** into the **android/plugins** folder of your project. +You can find the main repository of the loader plugin `here `__. Creating the export templates ----------------------------- @@ -42,7 +42,7 @@ You will need to setup a separate export template for each device as each device Open **Project** and select **Export..**. Click on **Add..** and select **Android**. Next change the name of the export profile for the device you're setting this up for, say **Meta Quest**. -And enable **Use Custom Build**. +And enable **Use Gradle Build**. If the loader plugins were installed correctly you should find entries for the different headsets, select the entry for meta: @@ -59,10 +59,14 @@ The hand tracking and passthrough settings here currently only work for the Meta Now you can repeat the same process for the other devices. Note that if you wish to test your game with Godots one-click deploy, you have to mark the export profile for your device as **Runnable** so Godot knows which loader to deploy. .. note:: - Currently only Meta Quest and PICO are supported. Other loaders will be added as soon as possible. + There are separate loaders for the Meta Quest, Pico and Lynx R1 headsets. + + The fourth option is the official Khronos (KHR) loader, in due time all headsets should work with this loader. + At the moment this loader has been tested with the Magic Leap 2 and standalone HTC headsets. .. warning:: - While the Mobile Vulkan renderer has many optimizations targeted at mobile devices, we're still working out the kinks. It is highly advisable to use the OpenGL renderer for the time being when targeting Android based XR devices. + While the Mobile Vulkan renderer has many optimizations targeted at mobile devices, we're still working out the kinks. + It is highly advisable to use the OpenGL renderer for the time being when targeting Android based XR devices. - Note that we are awaiting a driver update on the PICO before Vulkan support will work on PICO devices. + Note that we are awaiting driver updates on various devices before Vulkan support will work on these. diff --git a/tutorials/xr/img/android_meta_quest.webp b/tutorials/xr/img/android_meta_quest.webp index 4cc314acf4a99b4222c390501c0bd145e3450892..eba440bf6da182f1ebfba0e7083fc2590e442502 100644 GIT binary patch literal 18496 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 UIwF&X%0!QUMsfShffj%O0Afu?NB{r; diff --git a/tutorials/xr/img/openxr_loader_asset_lib.webp b/tutorials/xr/img/openxr_loader_asset_lib.webp new file mode 100644 index 0000000000000000000000000000000000000000..11d1e904aada1cc16a2a85bbd620e9a3ac13ddcf GIT binary patch literal 14338 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 literal 0 HcmV?d00001 From f85fa7556141421953fca9e3fdc345dd33dee6e0 Mon Sep 17 00:00:00 2001 From: Unai Martinez-Corral <38422348+umarcor@users.noreply.github.com> Date: Tue, 18 Apr 2023 05:13:51 +0200 Subject: [PATCH 45/59] [contributing/documentation/building_the_manual] use tabs and admonitions (#7074) * [contributing/documentation/building_the_manual] use tabs and admonitions --------- Co-authored-by: Max Hilbrunner --- .../documentation/building_the_manual.rst | 142 ++++++++++++------ 1 file changed, 97 insertions(+), 45 deletions(-) diff --git a/contributing/documentation/building_the_manual.rst b/contributing/documentation/building_the_manual.rst index c2f15c6e1..68253eba0 100644 --- a/contributing/documentation/building_the_manual.rst +++ b/contributing/documentation/building_the_manual.rst @@ -24,18 +24,51 @@ Before you get started, make sure that you have: a. Create the virtual environment: - - On Windows, run ``py -m venv godot-docs-venv`` - - On other platforms, run ``python3 -m venv godot-docs-venv`` + .. tabs:: + + .. group-tab:: Windows + + .. code:: pwsh + + py -m venv godot-docs-venv + + .. group-tab:: Other platforms + + .. code:: sh + + python3 -m venv godot-docs-venv b. Activate the virtual environment: - - On Windows, run ``godot-docs-venv\Scripts\activate.bat`` - - On other platforms, run ``source godot-docs-venv/bin/activate`` + .. tabs:: + + .. group-tab:: Windows + + .. code:: pwsh + + godot-docs-venv\Scripts\activate.bat + + .. group-tab:: Other platforms + + .. code:: sh + + source godot-docs-venv/bin/activate c. *(Optional)* Update pre-installed packages: - - On Windows, run ``py -m pip install --upgrade pip setuptools`` - - On other platforms, run ``pip3 install --upgrade pip setuptools`` + .. tabs:: + + .. group-tab:: Windows + + .. code:: pwsh + + py -m pip install --upgrade pip setuptools + + .. group-tab:: Other platforms + + .. code:: sh + + pip3 install --upgrade pip setuptools 2. Clone the docs repo: @@ -61,8 +94,23 @@ Before you get started, make sure that you have: make html -.. note:: On Windows, that command will run ``make.bat`` instead of GNU Make (or - an alternative). + .. note:: + On Windows, that command will run ``make.bat`` instead of GNU Make (or an alternative). + + Alternatively, you can build the documentation by running the sphinx-build program manually: + + .. code:: sh + + sphinx-build -b html ./ _build/html + +The compilation will take some time as the ``classes/`` folder contains hundreds of files. +See :ref:`doc_building_the_manual:performance`. + +You can then browse the documentation by opening ``_build/html/index.html`` in +your web browser. + +Dealing with errors +=================== If you run into errors, you may try the following command: @@ -70,43 +118,47 @@ If you run into errors, you may try the following command: make SPHINXBUILD=~/.local/bin/sphinx-build html -Building the documentation requires at least 8 GB of RAM to run without disk -swapping, which slows it down. If you have at least 16 GB of RAM, you can speed -up compilation by running: +If you get a ``MemoryError`` or ``EOFError``, you can remove the ``classes/`` folder and +run ``make`` again. +This will drop the class references from the final HTML documentation but will keep the +rest intact. + +.. important:: + If you delete the ``classes/`` folder, do not use ``git add .`` when working on a pull + request or the whole ``classes/`` folder will be removed when you commit. + See `#3157 `__ for more detail. + +.. _doc_building_the_manual:performance: + +Hints for performance +===================== + +RAM usage +--------- + +Building the documentation requires at least 8 GB of RAM to run without disk swapping, +which slows it down. +If you have at least 16 GB of RAM, you can speed up compilation by running: + +.. tabs:: + + .. group-tab:: Windows + + .. code:: pwsh + + set SPHINXOPTS=-j2 && make html + + .. group-tab:: Other platforms + + .. code:: sh + + make html SPHINXOPTS=-j2 + +Specifying a list of files +-------------------------- + +You can specify a list of files to build, which can greatly speed up compilation: .. code:: sh - # On Linux/macOS - make html SPHINXOPTS=-j2 - - # On Windows - set SPHINXOPTS=-j2 && make html - -The compilation will take some time as the ``classes/`` folder contains hundreds -of files. - -You can then browse the documentation by opening ``_build/html/index.html`` in -your web browser. - -If you get a ``MemoryError`` or ``EOFError``, you can remove the -``classes/`` folder and run ``make`` again. This will drop the class references -from the final HTML documentation but will keep the rest intact. - -.. note:: If you delete the ``classes/`` folder, do not use ``git add .`` when - working on a pull request or the whole ``classes/`` folder will be - removed when you commit. See `#3157 - `__ for more - detail. - -Alternatively, you can build the documentation by running the sphinx-build -program manually: - -.. code:: sh - - sphinx-build -b html ./ _build/html - -You can also specify a list of files to build, which can greatly speed up compilation: - -.. code:: sh - - sphinx-build -b html ./ _build/html classes/class_node.rst classes/class_resource.rst + make FILELIST='classes/class_node.rst classes/class_resource.rst' html From deb969b97a4e6d7c2d86bb213e9fee45f395c3f5 Mon Sep 17 00:00:00 2001 From: Ross Rothenstine Date: Tue, 18 Apr 2023 06:33:03 -0700 Subject: [PATCH 46/59] Adds a @UsedByGodot mention in the Android Plugin docs. (#7151) --- tutorials/platform/android/android_plugin.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tutorials/platform/android/android_plugin.rst b/tutorials/platform/android/android_plugin.rst index 35da15f91..838433e7c 100644 --- a/tutorials/platform/android/android_plugin.rst +++ b/tutorials/platform/android/android_plugin.rst @@ -125,8 +125,9 @@ Move the plugin configuration file (e.g: ``MyPlugin.gdap``) and, if any, its loc The Godot editor will automatically parse all ``.gdap`` files in the ``res://android/plugins`` directory and show a list of detected and toggleable plugins in the Android export presets window under the **Plugins** section. -.. image:: img/android_export_preset_plugins_section.png +In order to allow GDScript to communicate with your Java Singleton, you must annotate your function with ``@UsedByGodot``. The name called from GDScript must match the function name exactly. There is **no** coercing ``snake_case`` to ``camelCase``. +.. image:: img/android_export_preset_plugins_section.png From your script:: From 9b35747ba5eae554eea56ad56bf270a8807479a6 Mon Sep 17 00:00:00 2001 From: Andrew Cocker Date: Tue, 18 Apr 2023 23:41:50 +1000 Subject: [PATCH 47/59] Update C# code samples in 07.killing_player.rst (#7177) Fixed two references in code summary --- getting_started/first_3d_game/07.killing_player.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/getting_started/first_3d_game/07.killing_player.rst b/getting_started/first_3d_game/07.killing_player.rst index 124063c5f..c362db846 100644 --- a/getting_started/first_3d_game/07.killing_player.rst +++ b/getting_started/first_3d_game/07.killing_player.rst @@ -208,7 +208,7 @@ Starting with ``Main.gd``. // Choose a random location on the SpawnPath. // We store the reference to the SpawnLocation node. - var mobSpawnLocation = GetNode("SpawnPath/SpawnLocation"); + var mobSpawnLocation = GetNode("SpawnPath/SpawnLocation"); // And give it a random offset. mobSpawnLocation.ProgressRatio = GD.Randf(); @@ -480,7 +480,7 @@ Finally, the longest script, ``Player.gd``: } // Iterate through all collisions that occurred this frame. - for (int index = 0; index < GetSlideCount(); index++) + for (int index = 0; index < GetSlideCollisionCount(); index++) { // We get one of the collisions with the player. KinematicCollision3D collision = GetSlideCollision(index); From 162d29bbe80db63f62a359a4341e0366d5630800 Mon Sep 17 00:00:00 2001 From: Roy Zwambag Date: Sat, 15 Apr 2023 22:47:48 +0200 Subject: [PATCH 48/59] Add macOS shortcuts in instancing.rst --- getting_started/step_by_step/instancing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/getting_started/step_by_step/instancing.rst b/getting_started/step_by_step/instancing.rst index 02820ed48..cc13849f3 100644 --- a/getting_started/step_by_step/instancing.rst +++ b/getting_started/step_by_step/instancing.rst @@ -45,7 +45,7 @@ you to download the ball's sample project we prepared for you: :download:`instancing.zip `. Extract the archive on your computer. To import it, you need the Project Manager. -The Project Manager is accessed by opening Godot, or if you already have Godot opened, click on *Project -> Quit to Project List* (:kbd:`Ctrl + Shift + Q`) +The Project Manager is accessed by opening Godot, or if you already have Godot opened, click on *Project -> Quit to Project List* (:kbd:`Ctrl + Shift + Q`, :kbd:`Ctrl + Option + Cmd + B` on macOS) In the Project Manager, click the *Import* button to import the project. @@ -88,7 +88,7 @@ Click on it and drag it towards the center of the view. .. image:: img/instancing_ball_moved.png -Play the game by pressing F5. You should see it fall. +Play the game by pressing :kbd:`F5` (:kbd:`Cmd + B` on macOS). You should see it fall. Now, we want to create more instances of the Ball node. With the ball still selected, press :kbd:`Ctrl-D` (:kbd:`Cmd-D` on macOS) to call the duplicate From 95f010f640e1907c18a7c6414d95a11b24310511 Mon Sep 17 00:00:00 2001 From: Andreas Raddau Date: Tue, 18 Apr 2023 16:25:45 +0200 Subject: [PATCH 49/59] Added note about key and keystore passwords to Exporting for Android page --- tutorials/export/exporting_for_android.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tutorials/export/exporting_for_android.rst b/tutorials/export/exporting_for_android.rst index 89f7fd2dc..fae254378 100644 --- a/tutorials/export/exporting_for_android.rst +++ b/tutorials/export/exporting_for_android.rst @@ -64,6 +64,12 @@ the JDK can be used for this purpose:: This will create a ``debug.keystore`` file in your current directory. You should move it to a memorable location such as ``%USERPROFILE%\.android\``, because you will need its location in a later step. For more information on ``keytool`` usage, see `this Q&A article `__. +.. note:: + + It is important that the password is the same for the keystore and the key. This is a `known Android + studio issue `__ that also + affects Godot projects. + Setting it up in Godot ---------------------- From e7cd5e5a92fed9170dfd0fd95a7aa4a105e3b077 Mon Sep 17 00:00:00 2001 From: Unai Martinez-Corral Date: Tue, 18 Apr 2023 16:40:00 +0200 Subject: [PATCH 50/59] [contributing/documentation/building_the_manual] fix headings --- contributing/documentation/building_the_manual.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contributing/documentation/building_the_manual.rst b/contributing/documentation/building_the_manual.rst index 68253eba0..7fe9cb35b 100644 --- a/contributing/documentation/building_the_manual.rst +++ b/contributing/documentation/building_the_manual.rst @@ -110,7 +110,7 @@ You can then browse the documentation by opening ``_build/html/index.html`` in your web browser. Dealing with errors -=================== +------------------- If you run into errors, you may try the following command: @@ -131,10 +131,10 @@ rest intact. .. _doc_building_the_manual:performance: Hints for performance -===================== +--------------------- RAM usage ---------- +^^^^^^^^^ Building the documentation requires at least 8 GB of RAM to run without disk swapping, which slows it down. @@ -155,7 +155,7 @@ If you have at least 16 GB of RAM, you can speed up compilation by running: make html SPHINXOPTS=-j2 Specifying a list of files --------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ You can specify a list of files to build, which can greatly speed up compilation: From cde5e82a658ef61f9846bd083f7da350f96dc238 Mon Sep 17 00:00:00 2001 From: Max Hilbrunner Date: Tue, 18 Apr 2023 20:25:47 +0200 Subject: [PATCH 51/59] Fix CI comment --- .github/workflows/sync_class_ref.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync_class_ref.yml b/.github/workflows/sync_class_ref.yml index ed8829d9c..6d6b6843a 100644 --- a/.github/workflows/sync_class_ref.yml +++ b/.github/workflows/sync_class_ref.yml @@ -2,7 +2,7 @@ name: Sync Class Reference on: workflow_dispatch: - # Scheduled updates are only enabled for in-dev branches. + # Scheduled updates only run on the default/master branch. schedule: # Run it at night (European time) every Saturday. # The offset is there to try and avoid the high load times. From 05153f071e756d392ab92994edbbe167d980d17a Mon Sep 17 00:00:00 2001 From: John Veness Date: Tue, 18 Apr 2023 20:05:59 +0100 Subject: [PATCH 52/59] Fix backquoted text in Controllers doc It seems the space is required before the backquotes --- tutorials/inputs/controllers_gamepads_joysticks.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/inputs/controllers_gamepads_joysticks.rst b/tutorials/inputs/controllers_gamepads_joysticks.rst index 6c8f052cf..b50f801a6 100644 --- a/tutorials/inputs/controllers_gamepads_joysticks.rst +++ b/tutorials/inputs/controllers_gamepads_joysticks.rst @@ -129,7 +129,7 @@ use ``Input.is_action_pressed()``: frame, use ``Input.is_action_just_pressed()`` instead of ``Input.is_action_pressed()``. Unlike ``Input.is_action_pressed()`` which returns ``true`` as long as the input is - held,``Input.is_action_just_pressed()`` will only return ``true`` for one + held, ``Input.is_action_just_pressed()`` will only return ``true`` for one frame after the button has been pressed. In Godot versions before 3.4, such as 3.3, ``Input.get_vector()`` and From 3a7e86f77e473fe259351b2b882c3971079e6d12 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz <41164873+AdamJStankiewicz@users.noreply.github.com> Date: Tue, 18 Apr 2023 21:20:27 -0400 Subject: [PATCH 53/59] Gwizz YT Channel Added Hello! I make high quality Godot 4 Tutorials, I have linked my channel, please consider making it part of the main branch --- community/tutorials.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/community/tutorials.rst b/community/tutorials.rst index a0dfab1b7..4f7a92376 100644 --- a/community/tutorials.rst +++ b/community/tutorials.rst @@ -44,6 +44,7 @@ Video tutorials - `Garbaj `_ (3D, GDScript). - `Kasper Frandsen `_ (3D, Shaders). - `bitbrain `_ (2D, GDScript). +- `Gwizz `_ (2D, GDScript). Text tutorials -------------- From de7687fa3f9897e04c5ba2887676dd93fc854340 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 19 Apr 2023 19:56:43 +0200 Subject: [PATCH 54/59] Document how to resolve issues with the editor looking too sharp or blurry --- ...leshooting_graphics_driver_sharpening.webp | Bin 0 -> 8676 bytes about/troubleshooting.rst | 47 ++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 about/img/troubleshooting_graphics_driver_sharpening.webp diff --git a/about/img/troubleshooting_graphics_driver_sharpening.webp b/about/img/troubleshooting_graphics_driver_sharpening.webp new file mode 100644 index 0000000000000000000000000000000000000000..e199d9c5451ff6e5ceda1d1219641555fced24e5 GIT binary patch literal 8676 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 OpenGL Settings** then uncheck **Enable Graphics API Visual Indicator**. +The editor or project appears overly sharp or blurry +---------------------------------------------------- + +.. figure:: img/troubleshooting_graphics_driver_sharpening.webp + :align: center + :alt: Correct appearance (left), oversharpened appearance due to graphics driver sharpening (right) + + Correct appearance (left), oversharpened appearance due to graphics driver sharpening (right) + +If the editor or project appears overly sharp, this is likely due to image +sharpening being forced on all Vulkan or OpenGL applications by your graphics +driver. You can disable this behavior in the graphics driver's control panel: + +- **NVIDIA (Windows):** Open the start menu and choose **NVIDIA Control Panel**. + Open the **Manage 3D settings** tab on the left. In the list in the middle, + scroll to **Image Sharpening** and set it to **Sharpening Off**. +- **AMD (Windows):** Open the start menu and choose **AMD Software**. Click the + settings "cog" icon in the top-right corner. Go to the **Graphics** tab then + disable **Radeon Image Sharpening**. + +If the editor or project appears overly blurry, this is likely due to +:abbr:`FXAA (Fast Approximate AntiAliasing)` being forced on all Vulkan or +OpenGL applications by your graphics driver. + +- **NVIDIA (Windows):** Open the start menu and choose **NVIDIA Control Panel**. + Open the **Manage 3D settings** tab on the left. In the list in the middle, + scroll to **Fast Approximate Antialiasing** and set it to **Application + Controlled**. +- **NVIDIA (Linux):** Open the applications menu and choose **NVIDIA X Server + Settings**. Select to **Antialiasing Settings** on the left, then uncheck + **Enable FXAA**. +- **AMD (Windows):** Open the start menu and choose **AMD Software**. Click the + settings "cog" icon in the top-right corner. Go to the **Graphics** tab, + scroll to the bottom and click **Advanced** to unfold its settings. Disable + **Morphological Anti-Aliasing**. + +Third-party vendor-independent utilities such as vkBasalt may also force +sharpening or FXAA on all Vulkan applications. You may want to check their +configuration as well. + +After changing options in the graphics driver or third-party utilities, restart +Godot to make the changes effective. + +If you still wish to force sharpening or FXAA on other applications, it's +recommended to do so on a per-application basis using the application profiles +system provided by graphics drivers' control panels. + The project works when run from the editor, but fails to load some files when running from an exported copy ----------------------------------------------------------------------------------------------------------- From 93922aaa8cb91912271b10488f7cd571799a1491 Mon Sep 17 00:00:00 2001 From: Mark Wilson <23439518+wlsnmrk@users.noreply.github.com> Date: Thu, 20 Apr 2023 00:42:08 -0400 Subject: [PATCH 55/59] Fixed C# file-path strings for example plugin resources The example (tutorial) plugin resides in an addons/my_custom_node subdirectory of its project. The C# example code uses the same relative path structure for a custom script and icon as the GDScript example. These paths cause errors when the user activates the plugin, as Godot looks for the resources in the root directory of the project. This change fixes the errors by using the fully qualified "res://" path to the resources in the C# example code. --- tutorials/plugins/editor/making_plugins.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/plugins/editor/making_plugins.rst b/tutorials/plugins/editor/making_plugins.rst index a3a0c9014..b140805af 100644 --- a/tutorials/plugins/editor/making_plugins.rst +++ b/tutorials/plugins/editor/making_plugins.rst @@ -246,8 +246,8 @@ dialog. For that, change the ``custom_node.gd`` script to the following: { // Initialization of the plugin goes here. // Add the new type with a name, a parent type, a script and an icon. - var script = GD.Load