From dc7e8771e68bae6fe3f146d21d4b288e50b4c143 Mon Sep 17 00:00:00 2001 From: korboduo Date: Sat, 6 Dec 2025 15:43:53 +0900 Subject: [PATCH] init --- .editorconfig | 4 + .gitattributes | 2 + .gitignore | 3 + assets/planar.gdshader | 36 ++ assets/planar.gdshader.uid | 1 + assets/prototype/texture_01.png | Bin 0 -> 1333 bytes assets/prototype/texture_01.png.import | 34 ++ .../prototype/texture_01.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_02.png | Bin 0 -> 1954 bytes assets/prototype/texture_02.png.import | 34 ++ .../prototype/texture_02.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_03.png | Bin 0 -> 7015 bytes assets/prototype/texture_03.png.import | 34 ++ .../prototype/texture_03.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_04.png | Bin 0 -> 7498 bytes assets/prototype/texture_04.png.import | 34 ++ .../prototype/texture_04.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_05.png | Bin 0 -> 2092 bytes assets/prototype/texture_05.png.import | 34 ++ .../prototype/texture_05.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_06.png | Bin 0 -> 1912 bytes assets/prototype/texture_06.png.import | 34 ++ .../prototype/texture_06.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_07.png | Bin 0 -> 635 bytes assets/prototype/texture_07.png.import | 34 ++ .../prototype/texture_07.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_08.png | Bin 0 -> 2007 bytes assets/prototype/texture_08.png.import | 35 ++ .../prototype/texture_08.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_09.png | Bin 0 -> 6072 bytes assets/prototype/texture_09.png.import | 34 ++ .../prototype/texture_09.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_10.png | Bin 0 -> 6068 bytes assets/prototype/texture_10.png.import | 34 ++ .../prototype/texture_10.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_11.png | Bin 0 -> 6415 bytes assets/prototype/texture_11.png.import | 34 ++ .../prototype/texture_11.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_12.png | Bin 0 -> 6194 bytes assets/prototype/texture_12.png.import | 34 ++ .../prototype/texture_12.png:Zone.Identifier | Bin 0 -> 25 bytes assets/prototype/texture_13.png | Bin 0 -> 2004 bytes assets/prototype/texture_13.png.import | 34 ++ .../prototype/texture_13.png:Zone.Identifier | Bin 0 -> 25 bytes icon.svg | 1 + icon.svg.import | 37 ++ project.godot | 95 ++++ scenes/level0.tscn | 65 +++ scenes/load/console/console.gd | 144 ++++++ scenes/load/console/console.gd.uid | 1 + scenes/load/console/console.tscn | 80 +++ scenes/load/console/debug_menu/debug_menu.gd | 469 ++++++++++++++++++ .../load/console/debug_menu/debug_menu.gd.uid | 1 + .../load/console/debug_menu/debug_menu.tscn | 398 +++++++++++++++ scenes/load/game.gd | 13 + scenes/load/game.gd.uid | 1 + scenes/load/game_settings.gd | 19 + scenes/load/game_settings.gd.uid | 1 + scenes/load/world.tscn | 13 + scenes/player/head.gd | 19 + scenes/player/head.gd.uid | 1 + scenes/player/player.gd | 97 ++++ scenes/player/player.gd.uid | 1 + scenes/player/player.tscn | 31 ++ 64 files changed, 1976 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 assets/planar.gdshader create mode 100644 assets/planar.gdshader.uid create mode 100644 assets/prototype/texture_01.png create mode 100644 assets/prototype/texture_01.png.import create mode 100644 assets/prototype/texture_01.png:Zone.Identifier create mode 100644 assets/prototype/texture_02.png create mode 100644 assets/prototype/texture_02.png.import create mode 100644 assets/prototype/texture_02.png:Zone.Identifier create mode 100644 assets/prototype/texture_03.png create mode 100644 assets/prototype/texture_03.png.import create mode 100644 assets/prototype/texture_03.png:Zone.Identifier create mode 100644 assets/prototype/texture_04.png create mode 100644 assets/prototype/texture_04.png.import create mode 100644 assets/prototype/texture_04.png:Zone.Identifier create mode 100644 assets/prototype/texture_05.png create mode 100644 assets/prototype/texture_05.png.import create mode 100644 assets/prototype/texture_05.png:Zone.Identifier create mode 100644 assets/prototype/texture_06.png create mode 100644 assets/prototype/texture_06.png.import create mode 100644 assets/prototype/texture_06.png:Zone.Identifier create mode 100644 assets/prototype/texture_07.png create mode 100644 assets/prototype/texture_07.png.import create mode 100644 assets/prototype/texture_07.png:Zone.Identifier create mode 100644 assets/prototype/texture_08.png create mode 100644 assets/prototype/texture_08.png.import create mode 100644 assets/prototype/texture_08.png:Zone.Identifier create mode 100644 assets/prototype/texture_09.png create mode 100644 assets/prototype/texture_09.png.import create mode 100644 assets/prototype/texture_09.png:Zone.Identifier create mode 100644 assets/prototype/texture_10.png create mode 100644 assets/prototype/texture_10.png.import create mode 100644 assets/prototype/texture_10.png:Zone.Identifier create mode 100644 assets/prototype/texture_11.png create mode 100644 assets/prototype/texture_11.png.import create mode 100644 assets/prototype/texture_11.png:Zone.Identifier create mode 100644 assets/prototype/texture_12.png create mode 100644 assets/prototype/texture_12.png.import create mode 100644 assets/prototype/texture_12.png:Zone.Identifier create mode 100644 assets/prototype/texture_13.png create mode 100644 assets/prototype/texture_13.png.import create mode 100644 assets/prototype/texture_13.png:Zone.Identifier create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 scenes/level0.tscn create mode 100644 scenes/load/console/console.gd create mode 100644 scenes/load/console/console.gd.uid create mode 100644 scenes/load/console/console.tscn create mode 100644 scenes/load/console/debug_menu/debug_menu.gd create mode 100644 scenes/load/console/debug_menu/debug_menu.gd.uid create mode 100644 scenes/load/console/debug_menu/debug_menu.tscn create mode 100644 scenes/load/game.gd create mode 100644 scenes/load/game.gd.uid create mode 100644 scenes/load/game_settings.gd create mode 100644 scenes/load/game_settings.gd.uid create mode 100644 scenes/load/world.tscn create mode 100644 scenes/player/head.gd create mode 100644 scenes/player/head.gd.uid create mode 100644 scenes/player/player.gd create mode 100644 scenes/player/player.gd.uid create mode 100644 scenes/player/player.tscn diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/assets/planar.gdshader b/assets/planar.gdshader new file mode 100644 index 0000000..46bbf0c --- /dev/null +++ b/assets/planar.gdshader @@ -0,0 +1,36 @@ +shader_type spatial; +uniform sampler2D texture_albedo: filter_nearest_mipmap_anisotropic; +uniform vec3 color_albedo:source_color = vec3(1,1,1); +group_uniforms planar; +uniform bool tiling = true; +uniform float tile_scale = 1.0; +uniform float blend_sharpness = 4.0; +varying vec3 world_pos; +varying vec3 world_normal; + +void vertex() { + world_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; + world_normal = normalize(mat3(MODEL_MATRIX) * NORMAL); +} + +void fragment() { + vec2 uv = UV; + if (tiling){ + vec3 n = normalize(world_normal); + vec3 abs_normal = abs(n); + float top_weight = pow(abs_normal.y, blend_sharpness); + float side_x_weight = pow(abs_normal.x, blend_sharpness); + float side_z_weight = pow(abs_normal.z, blend_sharpness); + float total_weight = top_weight + side_x_weight + side_z_weight; + top_weight /= total_weight; + side_x_weight /= total_weight; + side_z_weight /= total_weight; + vec2 uv_top = world_pos.xz / -tile_scale; + vec2 uv_side_x = world_pos.zy / -tile_scale; + vec2 uv_side_z = world_pos.xy / -tile_scale; + uv = (top_weight > side_x_weight && top_weight > side_z_weight) ? uv_top : + (side_x_weight > side_z_weight) ? uv_side_x : uv_side_z; + } + ALBEDO = texture(texture_albedo, uv).rgb*color_albedo; +} + diff --git a/assets/planar.gdshader.uid b/assets/planar.gdshader.uid new file mode 100644 index 0000000..c632ae1 --- /dev/null +++ b/assets/planar.gdshader.uid @@ -0,0 +1 @@ +uid://cygvk4t4itjpv diff --git a/assets/prototype/texture_01.png b/assets/prototype/texture_01.png new file mode 100644 index 0000000000000000000000000000000000000000..9e93d3e955cdfa045fb387d509de08cd784459d2 GIT binary patch literal 1333 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7?_xW6jSkG0T3_U(btiIVPik{pF~z5pEJNG z#P#{hSJ!XdxqR*BLscGopqlHRE{-7;x87bd6g*p!wUBL)wc!7$-;w*G^gf12<9RvtXg0=mSZ>)usu*WK@<4}hX%@PG-Y zSBn??_{}kRTm*EnkbHX*>;zLr+&fmvv4FO#lrGQzrlb literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_01.png.import b/assets/prototype/texture_01.png.import new file mode 100644 index 0000000..ba755d6 --- /dev/null +++ b/assets/prototype/texture_01.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d32vex3n66fvc" +path="res://.godot/imported/texture_01.png-7a561ae919880fae6fcd6324ffc9d178.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_01.png" +dest_files=["res://.godot/imported/texture_01.png-7a561ae919880fae6fcd6324ffc9d178.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_01.png:Zone.Identifier b/assets/prototype/texture_01.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2xr?U%OfUDYJxuf!)s2#WAGf*4t~2y%%XphTtRwOP zFQqZDPl#c#q*a4p%c7tAX5F7Z6BMUa`^(<{&SuGHV4=*5AEr{dOeDWhZz>% literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_02.png.import b/assets/prototype/texture_02.png.import new file mode 100644 index 0000000..b3b80c0 --- /dev/null +++ b/assets/prototype/texture_02.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg6lbwfts577w" +path="res://.godot/imported/texture_02.png-1ea527bfa716785196d479c6b81909de.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_02.png" +dest_files=["res://.godot/imported/texture_02.png-1ea527bfa716785196d479c6b81909de.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_02.png:Zone.Identifier b/assets/prototype/texture_02.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2x5m6xm+$9AIW60L*eL8KaZY0Pt%e3q1VXE za~SNb#jFZ`t)%E$f0_G zA#w6jiC6`o)i7YziBySCEgQh*oXTthYOl+yK|IKIMT0EpW;IBou3m$n`q8`w*}N+B z??C=$W5f|q*jNNfYa9D#XPL5)|Aypg{}pclH59_sYUqY#12D__y|d#fyVoB|ZE33{ z4tTI_yR~bSy~ovLNK^dq3}=*>jIsTeivjdfVZ~}Q_V*otbK1UwcsZ(uqVjE%3eV+l zj7u`@{dXf|q9VyxN%xnL&k9u`sTWfcvj{|xuutuT_AcIT46KKuK-|Pyzf#dXPGK#W zeyzk;V#sK|Xp0O?D+Xd`RbsueuscQlTADIg^}Z-;^ZL;~nm^5W=;L{wY@ZpoeGD6f z{p&g2X$)X)^Cn|lX+bw*DzSuw-aucP0BT6W$yi4{rX~nbv_%G{0|T*!RkR0+eTGw6 zhO~&g4ezRI4$cGW1w_sTyePD6BL{=uPRxf6V*qDnkx*cB0x34e;0l~qVta+dZ2&KK z!b{9iQdVh#7f#>eOl{ersi+?YKBTO&!dgZc0*jk-2A63 z1-lMu@68f#-l3BdnpB!B5rg`H-v!oHRn(MK9yhu0Djxr@{eVA3a<8k2qjvq)A4qAP z0a95`G?lhF+*O>l+7J!0$v?{0Fe3B*r5zrjN)deA7CVPaT0z71?|+L+B}t@#g^6!) zcj^sYMLwhVqje}ux=*rU$tpw-l==3z*4@%DXBUAs#aZ}mrP*unVoJuH-f5) zEoyMWoG99RIELgvnA$5Gs$yU^ukic_?a)L8m90vS98A2n=C5t9L=|VI2Lspk`;=I19fl@O>tpw-g20+sXp#WczFnpyXJtUOnhWzJ2+vdm zzwOR=URhoZgA#STGR@NLh$n-2hv1<5$u|8mj>6V!Z literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_03.png.import b/assets/prototype/texture_03.png.import new file mode 100644 index 0000000..9eb9bbd --- /dev/null +++ b/assets/prototype/texture_03.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byt0c25uubxf3" +path="res://.godot/imported/texture_03.png-75695628e71bab205f2b71558f8188fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_03.png" +dest_files=["res://.godot/imported/texture_03.png-75695628e71bab205f2b71558f8188fe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_03.png:Zone.Identifier b/assets/prototype/texture_03.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2xeYy8|&ShqPFh&D zwCTS+=l`5@e$VsV+MKNPh_IM248tNaUP*f$!#Hrr!8mOA^3k4`E}(ZsGPw-HF6tf& z6>f&_pUufUxZl3un47oHFF0VjhM$K005?uvEkp%MW?vuG3@D~ zj5OIn<%r`Z>jP0(S-E=@x3UMXRr3drw7qZJR~C6VU0-zlEn}U4BamMbZ`yGZ`$qBU z(4_6=;off97gEeLVC@PHUuy5ls~oQEAiz{#{)F(hoxnqiTcDi)Adv)M!ElC@NRk`W zlq0#y8#1|O1OAuybhjA$%SkuqHBG%MFwHxM#aX<@=rmTo!LAe6Z0b^(gxQgsmHt*~ zqbO`~DGyJQJuzwRq?Fp-*Y648?;zoT*Mo$O_E{uMG7Zqe)+Sn*E2V{3)U@zjGKBu| z{}b|e_Oa1a57cqdR8NceXsWwq+tE~Wv`J{H&72Cf##G)CT4Qz83|iv`6hc?g8eurl z8eurl8c{fqIWQc^92gE{4h#n}2ZjTg!w4V5oL3`hS3eVNL$1clVvwr^+63h45T_8i z`W275fer-TG5bt#^|?-|8Mr;i0M7SK^%+7xI$hRl^MG<51E4FllBE3h<}2#t@JX9{ zY7~yB0!?|-n_3t-!DMXapx2Ym{+f4HO%-brWH74Xk>a_4{{-s}Cr^q$pVIgxJb&D+ z(Z9Swy0Jp7|6A#HQD(ftYh<6~-TjVIYT~<9w}kx2T@CucH0uV(a|lmLX(%wvGa|-_ zb-yFZlTuDk9yQo3A9HJ>LO*!HN_{&CBx9cD?x2piN=ZZhwR1NJ0cozcqA=6;Y*)Znx@Y?7! zEcytYYVO)f=Wp`Gr=CP9TaQF&HY&{IPn52yBnT=y_~|Rw#4z=^$pIeqWQdq% zo#QAxaxg*K6nqES{|ULOlg@ldNhM=k!Q-94{eorLHAPw1KndO>35vkg!vOf4_F9;v zn!O6O!2wEq@@1FJy~DCx;>*Zf^akPK{WWvZ=KkACk-5Jg())YkR>N@1t-p%j7}ZNt zac2!p#mu@bsH@Q+ia=eB1epLKvRF%8Km-*!{e8*Q&(7=>Jfs>0mY%A;ZE?iKU}c3q zKoFIqKZ>&fWL*K9r`KfL&-=0Rx?SvC|tYGU0yzWk8H44iPQJYSl0?E`G7w zd4Y`wAZp{Oj&( zZGX$X?kgP8-PZz|a+9(0`_*KzW-r4=CP`otpTF?lLfR&lMx1gzDeNy=ICa#wd;mTS O#WMD1rM2!W(Eb6qti>1r literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_04.png.import b/assets/prototype/texture_04.png.import new file mode 100644 index 0000000..451dd63 --- /dev/null +++ b/assets/prototype/texture_04.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xq6ha0kitoht" +path="res://.godot/imported/texture_04.png-ca328b3944d1e6cbfd7d4e09efb582b9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_04.png" +dest_files=["res://.godot/imported/texture_04.png-ca328b3944d1e6cbfd7d4e09efb582b9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_04.png:Zone.Identifier b/assets/prototype/texture_04.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2x+vR#e&J0Wr3>*xM3Jfd_3<3;H#Bsu15qe0_Mx^QFDr?xZ&M~eyz76I%kGDsN z_Y%<3-M&k<-B#gWu=@-5k{$Qe85mIlh2%gY*BfZ|qBsJ~dGUBpTzKK4?-pmT2hR!q z_WO6GbZ*`I{O!5FAOEvk`1Nn`ef#gJ9cszF^X=Z<{&u|9PUfb$js5+>bjtHx`oC#K-|js0-1?iJI1M!LD40e>VD7e&{d z5M>93fm2F*_ssZh98`P&(vtLt~?-j@IVo%8Mc`9J^d)OR+K%>MJG z@cuUYcb^~r*!TBm5L$(#b$Q^hIA%x^we VeDUcnj`a*c;OXk;vd$@?2>?S#d_n*K literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_05.png.import b/assets/prototype/texture_05.png.import new file mode 100644 index 0000000..02a70f5 --- /dev/null +++ b/assets/prototype/texture_05.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://da07ahmuh45cd" +path="res://.godot/imported/texture_05.png-13097e9615e0bac3f4c3e8026ce28bd1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_05.png" +dest_files=["res://.godot/imported/texture_05.png-13097e9615e0bac3f4c3e8026ce28bd1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_05.png:Zone.Identifier b/assets/prototype/texture_05.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2xmhrRxJ=)>P%WEC4pZm^#;N1PI@fY5I`dj@pi-Syq;h{~g%P2G)e6PYCmEI1AbvQXj}m@%Yy0Jolm_|e2o?YU literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_06.png.import b/assets/prototype/texture_06.png.import new file mode 100644 index 0000000..8d12ba2 --- /dev/null +++ b/assets/prototype/texture_06.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbbswwmt5holv" +path="res://.godot/imported/texture_06.png-fe0b461ca07979aaa1bc9ddf6c7c870e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_06.png" +dest_files=["res://.godot/imported/texture_06.png-fe0b461ca07979aaa1bc9ddf6c7c870e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_06.png:Zone.Identifier b/assets/prototype/texture_06.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2xlE)e-c@Ne6|3e z5ZAp24qd)>bK-$7n;00F6g*uVLn>~)yyuB{zde1e9;k;> x&|pb{2@XjVXr_kNR%#eRff*`n6lkV`R*vKU`97)CCuxDq@^tlcS?83{1OW4#DFXli literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_07.png.import b/assets/prototype/texture_07.png.import new file mode 100644 index 0000000..9115b85 --- /dev/null +++ b/assets/prototype/texture_07.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hqqkc51jh2fy" +path="res://.godot/imported/texture_07.png-d893d636bab2e79a76733fbe709a2381.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_07.png" +dest_files=["res://.godot/imported/texture_07.png-d893d636bab2e79a76733fbe709a2381.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_07.png:Zone.Identifier b/assets/prototype/texture_07.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2xEaktaqI1M z#xxa2iMEINUfm2&*mOH&l#kz(UbFY?9F=EW+y^8kav$L`@VaemGF9_&{XFiF`aOSs zeX!nIyL8*qwJURehu73|FXeP#;9y`>U|?xr5MW>$5Y7%~GVG;}b6-54a_#(4<_z7< zqBq{NpoIb>8lQzac9Ids-p8uqH(yr$U9&HB$*bSd$8PPc|Hpmxdq3ZU8S~3d)fn%8 zH)A1R{k1b&YHiNf{?GsTSN8`u8P<>y4Ge_!Fro%ygY=GXQ?9K)%3M+7naRK2j|dZ3 z2nIZ1R}eOXO4$I_w+wjfJ@7Yjo442Mef2-Ra{V>s9HN77ev2I>c@mL&@OXe=w2&U8 zz_I|IC$IVpkvzF)7bs8e1?I`A-~0I=OqpMH29zhKEack{%agl*{1f}bN_^U&LC_+i zQ~=%d1H50dy>@?l#Avf;*_Pwt>I{rja49v+pi<%^zGi#yPv^GkQd`mc|K&HDdSo3w R8tTUY1fH&bF6*2UngHyzI#K`t literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_08.png.import b/assets/prototype/texture_08.png.import new file mode 100644 index 0000000..f4e37a3 --- /dev/null +++ b/assets/prototype/texture_08.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://by53qb0l1o51m" +path.s3tc="res://.godot/imported/texture_08.png-e0f6ea5343244945ba2de33bfe0bf210.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/prototype/texture_08.png" +dest_files=["res://.godot/imported/texture_08.png-e0f6ea5343244945ba2de33bfe0bf210.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/prototype/texture_08.png:Zone.Identifier b/assets/prototype/texture_08.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 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 TC+_2Ze?HT5=4W$^VXyuP`PKH2 literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_10.png.import b/assets/prototype/texture_10.png.import new file mode 100644 index 0000000..30b6dab --- /dev/null +++ b/assets/prototype/texture_10.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co8oehpme6nba" +path="res://.godot/imported/texture_10.png-ff4960421611582062994f1f35b0c955.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_10.png" +dest_files=["res://.godot/imported/texture_10.png-ff4960421611582062994f1f35b0c955.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_10.png:Zone.Identifier b/assets/prototype/texture_10.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 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 literal 0 HcmV?d00001 diff --git a/assets/prototype/texture_12.png.import b/assets/prototype/texture_12.png.import new file mode 100644 index 0000000..5d5e73b --- /dev/null +++ b/assets/prototype/texture_12.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cq4vb2bg2msfr" +path="res://.godot/imported/texture_12.png-9e7ce31566681fb48eb15062e9aa4f48.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/prototype/texture_12.png" +dest_files=["res://.godot/imported/texture_12.png-9e7ce31566681fb48eb15062e9aa4f48.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/prototype/texture_12.png:Zone.Identifier b/assets/prototype/texture_12.png:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2xuT|Nnpa+RYc`9~BrF*mFHy978H@y}fp^^ROwI2afe7+6T=kg1Ivs|e_kIBp$uO*zP}`2F_ikAD~2D=pQZ_-StS|2y69 z-#3~wFyZjx4lYIl219}ehjvQBjwpK>Fr4S``=-*<_i~=W@4wd{{l5MFlZM>RDPJwW z{@W>j|2}g*0}IKKNTx#w*h6v9?C2`oqnv81^wju!-EPtQ_P>;aehF#b-}(Lg-XH(u zDwt{GY|ri0GB3F)|y8aoeyu!#;Y+pS#MLum1j9|Ks1c*)kh+CvLJ^ ze$W2$IG=PcHFb_BED_^q4eM!x;d->ZR{dTW+@rqY^YW;nf6+;JF dw}c1Wtj{>v{z^Qk?hgYHc)I$ztaD0e0ss@|Kdl#JyUFr831@K2x \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..f44362e --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btjgjjgdnhijb" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..6fa3779 --- /dev/null +++ b/project.godot @@ -0,0 +1,95 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="first-person" +run/main_scene="uid://dk7oodthk2rt2" +config/features=PackedStringArray("4.4", "Forward Plus") +config/icon="res://icon.svg" + +[autoload] + +GameSettings="*res://scenes/load/game_settings.gd" +Game="*res://scenes/load/game.gd" + +[display] + +window/size/viewport_width=1280 +window/size/viewport_height=720 +window/stretch/mode="canvas_items" +window/stretch/aspect="expand" + +[global_group] + +player="" + +[input] + +up={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null) +] +} +down={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) +] +} +left={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) +] +} +right={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) +] +} +jump={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +] +} +look_up={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null) +] +} +look_down={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null) +] +} +look_left={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null) +] +} +look_right={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null) +] +} + +[layer_names] + +3d_physics/layer_1="environment" +3d_physics/layer_2="physics" +3d_physics/layer_3="player" + +[physics] + +common/physics_interpolation=true diff --git a/scenes/level0.tscn b/scenes/level0.tscn new file mode 100644 index 0000000..0462c02 --- /dev/null +++ b/scenes/level0.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=7 format=3 uid="uid://c5nhw4y7f37ll"] + +[ext_resource type="Texture2D" uid="uid://by53qb0l1o51m" path="res://assets/prototype/texture_08.png" id="1_4exd7"] +[ext_resource type="Shader" uid="uid://cygvk4t4itjpv" path="res://assets/planar.gdshader" id="1_ic6my"] + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_ic6my"] +sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) +ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) + +[sub_resource type="Sky" id="Sky_qsrgx"] +sky_material = SubResource("ProceduralSkyMaterial_ic6my") + +[sub_resource type="Environment" id="Environment_2h6oo"] +background_mode = 2 +sky = SubResource("Sky_qsrgx") +tonemap_mode = 2 +glow_enabled = true + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_qsrgx"] +render_priority = 0 +shader = ExtResource("1_ic6my") +shader_parameter/texture_albedo = ExtResource("1_4exd7") +shader_parameter/color_albedo = Color(0.303233, 0.303233, 0.303233, 1) +shader_parameter/tiling = true +shader_parameter/tile_scale = 1.0 +shader_parameter/blend_sharpness = 4.0 + +[node name="level0" type="Node3D"] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_2h6oo") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0) +shadow_enabled = true + +[node name="CSGCombiner3D" type="CSGCombiner3D" parent="."] +material_override = SubResource("ShaderMaterial_qsrgx") +use_collision = true + +[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.5, 0) +size = Vector3(50, 10, 50) + +[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0) +operation = 2 +size = Vector3(49, 10, 49) + +[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 2.5, 10) +size = Vector3(5, 5, 5) + +[node name="CSGBox3D7" type="CSGBox3D" parent="CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 4.5, 0) +size = Vector3(5, 1, 25) + +[node name="CSGBox3D4" type="CSGPolygon3D" parent="CSGCombiner3D"] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 10, 0, 12.5) +polygon = PackedVector2Array(0, 0, 0, 9, 5, 9, 10, 4, 18, 0, 1, 0) +depth = 5.0 + +[node name="CSGBox3D5" type="CSGBox3D" parent="CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 2.5, -10) +size = Vector3(5, 5, 5) diff --git a/scenes/load/console/console.gd b/scenes/load/console/console.gd new file mode 100644 index 0000000..49b5688 --- /dev/null +++ b/scenes/load/console/console.gd @@ -0,0 +1,144 @@ +extends CanvasLayer + +var player_sensor:Node = null +var active:bool = false +var words:Array = [] +var PrevCMD:String = "" +var light_reading := Color.BLACK +@onready var panel = $control/panel +@onready var menu = $control/panel/menu +@onready var edit = $control/panel/edit +@onready var states = $control/m +@onready var stats = $control/m/stats + +func read_message(message:String): + display_message(message) + words = message.split(" ") + PrevCMD = words[0] + var player = get_tree().get_first_node_in_group("player") + match words[0].to_lower(): + "overdraw": + if words.size() > 1 and is_int(1): + player.camera.get_viewport().debug_draw = words[1].to_int() + "max_fps": + if words.size() > 1 and is_float(1): + Engine.max_fps = words[1].to_float() + "vs": + if DisplayServer.window_get_vsync_mode(0) == DisplayServer.VSYNC_DISABLED: + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED) + display_event("VSYNC ON") + else: + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) + display_event("VSYNC OFF") + "time": + if words.size() > 1: + if is_float(1): + var number = words[1].to_float() + if number >= 0.0 and number < 2.0: + Engine.time_scale = number + else: display_warning("WRONG NUMBER") + else: + display_warning("WRONG NUMBER") + else: + Engine.time_scale = 1 + display_event("TIMESCALE RESTARTED") + "fsr": + if get_viewport().scaling_3d_mode == Viewport.SCALING_3D_MODE_FSR2: + display_event("FSR 2.0 OFF") + get_viewport().scaling_3d_mode = Viewport.SCALING_3D_MODE_BILINEAR + else: + display_event("FSR 2.0 ON") + get_viewport().scaling_3d_mode = Viewport.SCALING_3D_MODE_FSR2 + "render_scale": + if words.size() > 1: + if is_float(1): + get_viewport().scaling_3d_scale = words[1].to_float() + else: + display_warning("WRONG NUMBER") + else: + get_viewport().scaling_3d_scale = 1 + display_event("SCALING RESTARTED") + "fs": + if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + else: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + "q": + get_tree().quit() + panel.hide() + +#region Other + +func _input(event): + if event is InputEventKey and event.pressed: + match event.physical_keycode: + KEY_QUOTELEFT: + if panel.visible: panel.hide() + else: panel.show() + KEY_F11: + if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + else: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + KEY_F3: + if states.visible: states.hide() + else: states.show() + KEY_F4: + $control/monitor.cycle_debug_menu() + KEY_RIGHT: + if PrevCMD and panel.visible: + edit.set_text(PrevCMD) + edit.set_caret_column(PrevCMD.length()) + +func _process(_delta): + var player = get_tree().get_first_node_in_group("player") + if states.visible and player: + stats.text ="SPEDOMETER: "+str(snappedf(player.spedometer, 0.01)) + +func _ready() -> void: + read_message("vs") + read_message("max_fps 144") + +func _on_edit_text_submitted(new_text): + read_message(new_text) + edit.clear() +func display_event(message:String): + menu.push_color(Color.AQUAMARINE) + menu.add_text(message+"\n") +func display_message(message:String): + menu.push_color(Color.WHITE) + menu.add_text(message+"\n") +func display_warning(message:String): + menu.push_color(Color.YELLOW) + menu.add_text(message+"\n") + +func is_bool(num:int)->bool: + var valid = false + if words.size() > num and words[num].is_valid_int() and \ + words[num].to_int() <= 1 and words[num].to_int() >= 0: + valid = true + return valid + display_warning("WRONG NUMBER") + return valid +func is_float(num:int)->bool: + var valid = false + if words.size() > num and words[num].is_valid_float(): + valid = true + return valid + return valid +func is_int(num:int)->bool: + var valid = false + if words.size() > num and words[num].is_valid_int(): + valid = true + return valid + return valid +func _on_panel_draw(): + active = true + edit.grab_focus() + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) +func _on_panel_hidden(): + active = false + edit.release_focus() + edit.clear() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) +#endregion diff --git a/scenes/load/console/console.gd.uid b/scenes/load/console/console.gd.uid new file mode 100644 index 0000000..467e423 --- /dev/null +++ b/scenes/load/console/console.gd.uid @@ -0,0 +1 @@ +uid://dy8h0w873m1ck diff --git a/scenes/load/console/console.tscn b/scenes/load/console/console.tscn new file mode 100644 index 0000000..ead981a --- /dev/null +++ b/scenes/load/console/console.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=6 format=3 uid="uid://dp0qvvwtqxt5r"] + +[ext_resource type="Script" uid="uid://dy8h0w873m1ck" path="res://scenes/load/console/console.gd" id="1_1e7mo"] +[ext_resource type="PackedScene" uid="uid://cggqb75a8w8r" path="res://scenes/load/console/debug_menu/debug_menu.tscn" id="2_mnr6t"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_2p7dp"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_60mpv"] +bg_color = Color(0, 0, 0, 0.5) +border_width_top = 1 +border_width_bottom = 1 +border_color = Color(1, 1, 1, 0.101961) + +[sub_resource type="Theme" id="Theme_qg4fp"] +LineEdit/styles/focus = SubResource("StyleBoxEmpty_2p7dp") +LineEdit/styles/normal = SubResource("StyleBoxFlat_60mpv") +LineEdit/styles/read_only = SubResource("StyleBoxFlat_60mpv") +RichTextLabel/styles/focus = SubResource("StyleBoxFlat_60mpv") +RichTextLabel/styles/normal = SubResource("StyleBoxFlat_60mpv") + +[node name="console" type="CanvasLayer"] +layer = 2 +script = ExtResource("1_1e7mo") + +[node name="control" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +mouse_filter = 2 +theme = SubResource("Theme_qg4fp") + +[node name="monitor" parent="control" instance=ExtResource("2_mnr6t")] +visible = false +layout_mode = 1 + +[node name="m" type="MarginContainer" parent="control"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 25 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 25 + +[node name="stats" type="Label" parent="control/m"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 + +[node name="panel" type="VBoxContainer" parent="control"] +visible = false +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 127.0 +grow_horizontal = 2 +mouse_filter = 2 + +[node name="menu" type="RichTextLabel" parent="control/panel"] +layout_mode = 2 +size_flags_vertical = 3 +scroll_active = false +scroll_following = true + +[node name="edit" type="LineEdit" parent="control/panel"] +layout_mode = 2 + +[connection signal="draw" from="control/panel" to="." method="_on_panel_draw"] +[connection signal="hidden" from="control/panel" to="." method="_on_panel_hidden"] +[connection signal="text_submitted" from="control/panel/edit" to="." method="_on_edit_text_submitted"] diff --git a/scenes/load/console/debug_menu/debug_menu.gd b/scenes/load/console/debug_menu/debug_menu.gd new file mode 100644 index 0000000..4f3fefd --- /dev/null +++ b/scenes/load/console/debug_menu/debug_menu.gd @@ -0,0 +1,469 @@ +extends Control + +@export var fps: Label +@export var frame_time: Label +@export var frame_number: Label +@export var frame_history_total_avg: Label +@export var frame_history_total_min: Label +@export var frame_history_total_max: Label +@export var frame_history_total_last: Label +@export var frame_history_cpu_avg: Label +@export var frame_history_cpu_min: Label +@export var frame_history_cpu_max: Label +@export var frame_history_cpu_last: Label +@export var frame_history_gpu_avg: Label +@export var frame_history_gpu_min: Label +@export var frame_history_gpu_max: Label +@export var frame_history_gpu_last: Label +@export var fps_graph: Panel +@export var total_graph: Panel +@export var cpu_graph: Panel +@export var gpu_graph: Panel +@export var information: Label +@export var settings: Label + +## The number of frames to keep in history for graph drawing and best/worst calculations. +## Currently, this also affects how FPS is measured. +const HISTORY_NUM_FRAMES = 150 + +const GRAPH_SIZE = Vector2(150, 25) +const GRAPH_MIN_FPS = 10 +const GRAPH_MAX_FPS = 160 +const GRAPH_MIN_FRAMETIME = 1.0 / GRAPH_MIN_FPS +const GRAPH_MAX_FRAMETIME = 1.0 / GRAPH_MAX_FPS + +## Debug menu display style. +enum Style { + HIDDEN, ## Debug menu is hidden. + VISIBLE_COMPACT, ## Debug menu is visible, with only the FPS, FPS cap (if any) and time taken to render the last frame. + VISIBLE_DETAILED, ## Debug menu is visible with full information, including graphs. + MAX, ## Represents the size of the Style enum. +} + +## The style to use when drawing the debug menu. +var style := Style.HIDDEN: + set(value): + style = value + match style: + Style.HIDDEN: + visible = false + Style.VISIBLE_COMPACT, Style.VISIBLE_DETAILED: + visible = true + frame_number.visible = style == Style.VISIBLE_DETAILED + $VBoxContainer/FrameTimeHistory.visible = style == Style.VISIBLE_DETAILED + $VBoxContainer/FPSGraph.visible = style == Style.VISIBLE_DETAILED + $VBoxContainer/TotalGraph.visible = style == Style.VISIBLE_DETAILED + $VBoxContainer/CPUGraph.visible = style == Style.VISIBLE_DETAILED + $VBoxContainer/GPUGraph.visible = style == Style.VISIBLE_DETAILED + information.visible = style == Style.VISIBLE_DETAILED + settings.visible = style == Style.VISIBLE_DETAILED + +# Value of `Time.get_ticks_usec()` on the previous frame. +var last_tick := 0 + +var thread := Thread.new() + +## Returns the sum of all values of an array (use as a parameter to `Array.reduce()`). +var sum_func := func avg(accum: float, number: float) -> float: return accum + number + +# History of the last `HISTORY_NUM_FRAMES` rendered frames. +var frame_history_total: Array[float] = [] +var frame_history_cpu: Array[float] = [] +var frame_history_gpu: Array[float] = [] +var fps_history: Array[float] = [] # Only used for graphs. + +var frametime_avg := GRAPH_MIN_FRAMETIME +var frametime_cpu_avg := GRAPH_MAX_FRAMETIME +var frametime_gpu_avg := GRAPH_MIN_FRAMETIME +var frames_per_second := float(GRAPH_MIN_FPS) +var frame_time_gradient := Gradient.new() + +func _init() -> void: + # This must be done here instead of `_ready()` to avoid having `visibility_changed` be emitted immediately. + visible = false + +func _ready() -> void: + fps_graph.draw.connect(_fps_graph_draw) + total_graph.draw.connect(_total_graph_draw) + cpu_graph.draw.connect(_cpu_graph_draw) + gpu_graph.draw.connect(_gpu_graph_draw) + + fps_history.resize(HISTORY_NUM_FRAMES) + frame_history_total.resize(HISTORY_NUM_FRAMES) + frame_history_cpu.resize(HISTORY_NUM_FRAMES) + frame_history_gpu.resize(HISTORY_NUM_FRAMES) + + # NOTE: Both FPS and frametimes are colored following FPS logic + # (red = 10 FPS, yellow = 60 FPS, green = 110 FPS, cyan = 160 FPS). + # This makes the color gradient non-linear. + # Colors are taken from . + frame_time_gradient.set_color(0, Color8(239, 68, 68)) # red-500 + frame_time_gradient.set_color(1, Color8(56, 189, 248)) # light-blue-400 + frame_time_gradient.add_point(0.3333, Color8(250, 204, 21)) # yellow-400 + frame_time_gradient.add_point(0.6667, Color8(128, 226, 95)) # 50-50 mix of lime-400 and green-400 + + get_viewport().size_changed.connect(update_settings_label) + + # Display loading text while information is being queried, + # in case the user toggles the full debug menu just after starting the project. + information.text = "Loading hardware information...\n\n " + settings.text = "Loading project information..." + thread.start( + func(): + # Disable thread safety checks as they interfere with this add-on. + # This only affects this particular thread, not other thread instances in the project. + # See for details. + # Use a Callable so that this can be ignored on Godot 4.0 without causing a script error + # (thread safety checks were added in Godot 4.1). + if Engine.get_version_info()["hex"] >= 0x040100: + Callable(Thread, "set_thread_safety_checks_enabled").call(false) + + # Enable required time measurements to display CPU/GPU frame time information. + # These lines are time-consuming operations, so run them in a separate thread. + RenderingServer.viewport_set_measure_render_time(get_viewport().get_viewport_rid(), true) + update_information_label() + update_settings_label() + ) + + +func cycle_debug_menu() -> void: + style = wrapi(style + 1, 0, Style.MAX) as Style + + +func _exit_tree() -> void: + thread.wait_to_finish() + + +## Update hardware information label (this can change at runtime based on window +## size and graphics settings). This is only called when the window is resized. +## To update when graphics settings are changed, the function must be called manually +## using `DebugMenu.update_settings_label()`. +func update_settings_label() -> void: + settings.text = "" + if ProjectSettings.has_setting("application/config/version"): + settings.text += "Project Version: %s\n" % ProjectSettings.get_setting("application/config/version") + + var rendering_method := str(ProjectSettings.get_setting_with_override("rendering/renderer/rendering_method")) + var rendering_method_string := rendering_method + match rendering_method: + "forward_plus": + rendering_method_string = "Forward+" + "mobile": + rendering_method_string = "Forward Mobile" + "gl_compatibility": + rendering_method_string = "Compatibility" + settings.text += "Rendering Method: %s\n" % rendering_method_string + + var viewport := get_viewport() + + # The size of the viewport rendering, which determines which resolution 3D is rendered at. + var viewport_render_size := Vector2i() + + if viewport.content_scale_mode == Window.CONTENT_SCALE_MODE_VIEWPORT: + viewport_render_size = viewport.get_visible_rect().size + settings.text += "Viewport: %d×%d, Window: %d×%d\n" % [viewport.get_visible_rect().size.x, viewport.get_visible_rect().size.y, viewport.size.x, viewport.size.y] + else: + # Window size matches viewport size. + viewport_render_size = viewport.size + settings.text += "Viewport: %d×%d\n" % [viewport.size.x, viewport.size.y] + + # Display 3D settings only if relevant. + if viewport.get_camera_3d(): + var scaling_3d_mode_string := "(unknown)" + match viewport.scaling_3d_mode: + Viewport.SCALING_3D_MODE_BILINEAR: + scaling_3d_mode_string = "Bilinear" + Viewport.SCALING_3D_MODE_FSR: + scaling_3d_mode_string = "FSR 1.0" + Viewport.SCALING_3D_MODE_FSR2: + scaling_3d_mode_string = "FSR 2.2" + + var antialiasing_3d_string := "" + if viewport.scaling_3d_mode == Viewport.SCALING_3D_MODE_FSR2: + # The FSR2 scaling mode includes its own temporal antialiasing implementation. + antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "FSR 2.2" + if viewport.scaling_3d_mode != Viewport.SCALING_3D_MODE_FSR2 and viewport.use_taa: + # Godot's own TAA is ignored when using FSR2 scaling mode, as FSR2 provides its own TAA implementation. + antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "TAA" + if viewport.msaa_3d >= Viewport.MSAA_2X: + antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "%d× MSAA" % pow(2, viewport.msaa_3d) + if viewport.screen_space_aa == Viewport.SCREEN_SPACE_AA_FXAA: + antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "FXAA" + + settings.text += "3D scale (%s): %d%% = %d×%d" % [ + scaling_3d_mode_string, + viewport.scaling_3d_scale * 100, + viewport_render_size.x * viewport.scaling_3d_scale, + viewport_render_size.y * viewport.scaling_3d_scale, + ] + + if not antialiasing_3d_string.is_empty(): + settings.text += "\n3D Antialiasing: %s" % antialiasing_3d_string + + var environment := viewport.get_camera_3d().get_world_3d().environment + if environment: + if environment.ssr_enabled: + settings.text += "\nSSR: %d Steps" % environment.ssr_max_steps + + if environment.ssao_enabled: + settings.text += "\nSSAO: On" + if environment.ssil_enabled: + settings.text += "\nSSIL: On" + + if environment.sdfgi_enabled: + settings.text += "\nSDFGI: %d Cascades" % environment.sdfgi_cascades + + if environment.glow_enabled: + settings.text += "\nGlow: On" + + if environment.volumetric_fog_enabled: + settings.text += "\nVolumetric Fog: On" + var antialiasing_2d_string := "" + if viewport.msaa_2d >= Viewport.MSAA_2X: + antialiasing_2d_string = "%d× MSAA" % pow(2, viewport.msaa_2d) + + if not antialiasing_2d_string.is_empty(): + settings.text += "\n2D Antialiasing: %s" % antialiasing_2d_string + + +## Update hardware/software information label (this never changes at runtime). +func update_information_label() -> void: + var adapter_string := "" + # Make "NVIDIA Corporation" and "NVIDIA" be considered identical (required when using OpenGL to avoid redundancy). + if RenderingServer.get_video_adapter_vendor().trim_suffix(" Corporation") in RenderingServer.get_video_adapter_name(): + # Avoid repeating vendor name before adapter name. + # Trim redundant suffix sometimes reported by NVIDIA graphics cards when using OpenGL. + adapter_string = RenderingServer.get_video_adapter_name().trim_suffix("/PCIe/SSE2") + else: + adapter_string = RenderingServer.get_video_adapter_vendor() + " - " + RenderingServer.get_video_adapter_name().trim_suffix("/PCIe/SSE2") + + # Graphics driver version information isn't always availble. + var driver_info := OS.get_video_adapter_driver_info() + var driver_info_string := "" + if driver_info.size() >= 2: + driver_info_string = driver_info[1] + else: + driver_info_string = "(unknown)" + + var release_string := "" + if OS.has_feature("editor"): + # Editor build (implies `debug`). + release_string = "editor" + elif OS.has_feature("debug"): + # Debug export template build. + release_string = "debug" + else: + # Release export template build. + release_string = "release" + + var rendering_method := str(ProjectSettings.get_setting_with_override("rendering/renderer/rendering_method")) + var rendering_driver := str(ProjectSettings.get_setting_with_override("rendering/rendering_device/driver")) + var graphics_api_string := rendering_driver + if rendering_method != "gl_compatibility": + if rendering_driver == "d3d12": + graphics_api_string = "Direct3D 12" + elif rendering_driver == "metal": + graphics_api_string = "Metal" + elif rendering_driver == "vulkan": + if OS.has_feature("macos") or OS.has_feature("ios"): + graphics_api_string = "Vulkan via MoltenVK" + else: + graphics_api_string = "Vulkan" + else: + if rendering_driver == "opengl3_angle": + graphics_api_string = "OpenGL via ANGLE" + elif OS.has_feature("mobile") or rendering_driver == "opengl3_es": + graphics_api_string = "OpenGL ES" + elif OS.has_feature("web"): + graphics_api_string = "WebGL" + elif rendering_driver == "opengl3": + graphics_api_string = "OpenGL" + + information.text = ( + "%s, %d threads\n" % [OS.get_processor_name().replace("(R)", "").replace("(TM)", ""), OS.get_processor_count()] + + "%s %s (%s %s), %s %s\n" % [OS.get_name(), "64-bit" if OS.has_feature("64") else "32-bit", release_string, "double" if OS.has_feature("double") else "single", graphics_api_string, RenderingServer.get_video_adapter_api_version()] + + "%s, %s" % [adapter_string, driver_info_string] + ) + + +func _fps_graph_draw() -> void: + var fps_polyline := PackedVector2Array() + fps_polyline.resize(HISTORY_NUM_FRAMES) + for fps_index in fps_history.size(): + fps_polyline[fps_index] = Vector2( + remap(fps_index, 0, fps_history.size(), 0, GRAPH_SIZE.x), + remap(clampf(fps_history[fps_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0) + ) + # Don't use antialiasing to speed up line drawing, but use a width that scales with + # viewport scale to keep the line easily readable on hiDPI displays. + fps_graph.draw_polyline(fps_polyline, frame_time_gradient.sample(remap(frames_per_second, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0) + + +func _total_graph_draw() -> void: + var total_polyline := PackedVector2Array() + total_polyline.resize(HISTORY_NUM_FRAMES) + for total_index in frame_history_total.size(): + total_polyline[total_index] = Vector2( + remap(total_index, 0, frame_history_total.size(), 0, GRAPH_SIZE.x), + remap(clampf(frame_history_total[total_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0) + ) + # Don't use antialiasing to speed up line drawing, but use a width that scales with + # viewport scale to keep the line easily readable on hiDPI displays. + total_graph.draw_polyline(total_polyline, frame_time_gradient.sample(remap(1000.0 / frametime_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0) + + +func _cpu_graph_draw() -> void: + var cpu_polyline := PackedVector2Array() + cpu_polyline.resize(HISTORY_NUM_FRAMES) + for cpu_index in frame_history_cpu.size(): + cpu_polyline[cpu_index] = Vector2( + remap(cpu_index, 0, frame_history_cpu.size(), 0, GRAPH_SIZE.x), + remap(clampf(frame_history_cpu[cpu_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0) + ) + # Don't use antialiasing to speed up line drawing, but use a width that scales with + # viewport scale to keep the line easily readable on hiDPI displays. + cpu_graph.draw_polyline(cpu_polyline, frame_time_gradient.sample(remap(1000.0 / frametime_cpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0) + + +func _gpu_graph_draw() -> void: + var gpu_polyline := PackedVector2Array() + gpu_polyline.resize(HISTORY_NUM_FRAMES) + for gpu_index in frame_history_gpu.size(): + gpu_polyline[gpu_index] = Vector2( + remap(gpu_index, 0, frame_history_gpu.size(), 0, GRAPH_SIZE.x), + remap(clampf(frame_history_gpu[gpu_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0) + ) + # Don't use antialiasing to speed up line drawing, but use a width that scales with + # viewport scale to keep the line easily readable on hiDPI displays. + gpu_graph.draw_polyline(gpu_polyline, frame_time_gradient.sample(remap(1000.0 / frametime_gpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0) + + +func _process(_delta: float) -> void: + if visible: + fps_graph.queue_redraw() + total_graph.queue_redraw() + cpu_graph.queue_redraw() + gpu_graph.queue_redraw() + + # Difference between the last two rendered frames in milliseconds. + var frametime := (Time.get_ticks_usec() - last_tick) * 0.001 + + frame_history_total.push_back(frametime) + if frame_history_total.size() > HISTORY_NUM_FRAMES: + frame_history_total.pop_front() + + # Frametimes are colored following FPS logic (red = 10 FPS, yellow = 60 FPS, green = 110 FPS, cyan = 160 FPS). + # This makes the color gradient non-linear. + frametime_avg = frame_history_total.reduce(sum_func) / frame_history_total.size() + frame_history_total_avg.text = str(frametime_avg).pad_decimals(2) + frame_history_total_avg.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var frametime_min: float = frame_history_total.min() + frame_history_total_min.text = str(frametime_min).pad_decimals(2) + frame_history_total_min.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_min, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var frametime_max: float = frame_history_total.max() + frame_history_total_max.text = str(frametime_max).pad_decimals(2) + frame_history_total_max.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_max, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + frame_history_total_last.text = str(frametime).pad_decimals(2) + frame_history_total_last.modulate = frame_time_gradient.sample(remap(1000.0 / frametime, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var viewport_rid := get_viewport().get_viewport_rid() + var frametime_cpu := RenderingServer.viewport_get_measured_render_time_cpu(viewport_rid) + RenderingServer.get_frame_setup_time_cpu() + frame_history_cpu.push_back(frametime_cpu) + if frame_history_cpu.size() > HISTORY_NUM_FRAMES: + frame_history_cpu.pop_front() + + frametime_cpu_avg = frame_history_cpu.reduce(sum_func) / frame_history_cpu.size() + frame_history_cpu_avg.text = str(frametime_cpu_avg).pad_decimals(2) + frame_history_cpu_avg.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var frametime_cpu_min: float = frame_history_cpu.min() + frame_history_cpu_min.text = str(frametime_cpu_min).pad_decimals(2) + frame_history_cpu_min.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu_min, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var frametime_cpu_max: float = frame_history_cpu.max() + frame_history_cpu_max.text = str(frametime_cpu_max).pad_decimals(2) + frame_history_cpu_max.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu_max, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + frame_history_cpu_last.text = str(frametime_cpu).pad_decimals(2) + frame_history_cpu_last.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var frametime_gpu := RenderingServer.viewport_get_measured_render_time_gpu(viewport_rid) + frame_history_gpu.push_back(frametime_gpu) + if frame_history_gpu.size() > HISTORY_NUM_FRAMES: + frame_history_gpu.pop_front() + + frametime_gpu_avg = frame_history_gpu.reduce(sum_func) / frame_history_gpu.size() + frame_history_gpu_avg.text = str(frametime_gpu_avg).pad_decimals(2) + frame_history_gpu_avg.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var frametime_gpu_min: float = frame_history_gpu.min() + frame_history_gpu_min.text = str(frametime_gpu_min).pad_decimals(2) + frame_history_gpu_min.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu_min, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + var frametime_gpu_max: float = frame_history_gpu.max() + frame_history_gpu_max.text = str(frametime_gpu_max).pad_decimals(2) + frame_history_gpu_max.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu_max, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + frame_history_gpu_last.text = str(frametime_gpu).pad_decimals(2) + frame_history_gpu_last.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + + frames_per_second = 1000.0 / frametime_avg + fps_history.push_back(frames_per_second) + if fps_history.size() > HISTORY_NUM_FRAMES: + fps_history.pop_front() + + fps.text = str(floor(frames_per_second)) + " FPS" + var frame_time_color := frame_time_gradient.sample(remap(frames_per_second, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)) + fps.modulate = frame_time_color + + frame_time.text = str(frametime).pad_decimals(2) + " mspf" + frame_time.modulate = frame_time_color + + var vsync_string := "" + match DisplayServer.window_get_vsync_mode(): + DisplayServer.VSYNC_ENABLED: + vsync_string = "V-Sync" + DisplayServer.VSYNC_ADAPTIVE: + vsync_string = "Adaptive V-Sync" + DisplayServer.VSYNC_MAILBOX: + vsync_string = "Mailbox V-Sync" + + if Engine.max_fps > 0 or OS.low_processor_usage_mode: + # Display FPS cap determined by `Engine.max_fps` or low-processor usage mode sleep duration + # (the lowest FPS cap is used). + var low_processor_max_fps := roundi(1000000.0 / OS.low_processor_usage_mode_sleep_usec) + var fps_cap := low_processor_max_fps + if Engine.max_fps > 0: + fps_cap = mini(Engine.max_fps, low_processor_max_fps) + frame_time.text += " (cap: " + str(fps_cap) + " FPS" + + if not vsync_string.is_empty(): + frame_time.text += " + " + vsync_string + + frame_time.text += ")" + else: + if not vsync_string.is_empty(): + frame_time.text += " (" + vsync_string + ")" + + frame_number.text = "Frame: " + str(Engine.get_frames_drawn()) + + last_tick = Time.get_ticks_usec() + + +func _on_visibility_changed() -> void: + if visible: + # Reset graphs to prevent them from looking strange before `HISTORY_NUM_FRAMES` frames + # have been drawn. + var frametime_last := (Time.get_ticks_usec() - last_tick) * 0.001 + fps_history.resize(HISTORY_NUM_FRAMES) + fps_history.fill(1000.0 / frametime_last) + frame_history_total.resize(HISTORY_NUM_FRAMES) + frame_history_total.fill(frametime_last) + frame_history_cpu.resize(HISTORY_NUM_FRAMES) + var viewport_rid := get_viewport().get_viewport_rid() + frame_history_cpu.fill(RenderingServer.viewport_get_measured_render_time_cpu(viewport_rid) + RenderingServer.get_frame_setup_time_cpu()) + frame_history_gpu.resize(HISTORY_NUM_FRAMES) + frame_history_gpu.fill(RenderingServer.viewport_get_measured_render_time_gpu(viewport_rid)) diff --git a/scenes/load/console/debug_menu/debug_menu.gd.uid b/scenes/load/console/debug_menu/debug_menu.gd.uid new file mode 100644 index 0000000..472c086 --- /dev/null +++ b/scenes/load/console/debug_menu/debug_menu.gd.uid @@ -0,0 +1 @@ +uid://5w03cxb435ih diff --git a/scenes/load/console/debug_menu/debug_menu.tscn b/scenes/load/console/debug_menu/debug_menu.tscn new file mode 100644 index 0000000..0dbd9bc --- /dev/null +++ b/scenes/load/console/debug_menu/debug_menu.tscn @@ -0,0 +1,398 @@ +[gd_scene load_steps=3 format=3 uid="uid://cggqb75a8w8r"] + +[ext_resource type="Script" uid="uid://5w03cxb435ih" path="res://load/console/debug_menu/debug_menu.gd" id="1_p440y"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ki0n8"] +bg_color = Color(0, 0, 0, 0.25098) + +[node name="DebugMenu" type="Control" node_paths=PackedStringArray("fps", "frame_time", "frame_number", "frame_history_total_avg", "frame_history_total_min", "frame_history_total_max", "frame_history_total_last", "frame_history_cpu_avg", "frame_history_cpu_min", "frame_history_cpu_max", "frame_history_cpu_last", "frame_history_gpu_avg", "frame_history_gpu_min", "frame_history_gpu_max", "frame_history_gpu_last", "fps_graph", "total_graph", "cpu_graph", "gpu_graph", "information", "settings")] +custom_minimum_size = Vector2(400, 400) +layout_mode = 3 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -416.0 +offset_top = 8.0 +offset_right = -16.0 +offset_bottom = 408.0 +grow_horizontal = 0 +size_flags_horizontal = 8 +size_flags_vertical = 4 +mouse_filter = 2 +script = ExtResource("1_p440y") +fps = NodePath("VBoxContainer/FPS") +frame_time = NodePath("VBoxContainer/FrameTime") +frame_number = NodePath("VBoxContainer/FrameNumber") +frame_history_total_avg = NodePath("VBoxContainer/FrameTimeHistory/AvgHeader") +frame_history_total_min = NodePath("VBoxContainer/FrameTimeHistory/MinHeader") +frame_history_total_max = NodePath("VBoxContainer/FrameTimeHistory/MaxHeader") +frame_history_total_last = NodePath("VBoxContainer/FrameTimeHistory/LastHeader") +frame_history_cpu_avg = NodePath("VBoxContainer/FrameTimeHistory/TotalAvg") +frame_history_cpu_min = NodePath("VBoxContainer/FrameTimeHistory/TotalMin") +frame_history_cpu_max = NodePath("VBoxContainer/FrameTimeHistory/TotalMax") +frame_history_cpu_last = NodePath("VBoxContainer/FrameTimeHistory/TotalLast") +frame_history_gpu_avg = NodePath("VBoxContainer/FrameTimeHistory/GPUHeader") +frame_history_gpu_min = NodePath("VBoxContainer/FrameTimeHistory/GPUMin") +frame_history_gpu_max = NodePath("VBoxContainer/FrameTimeHistory/GPUMax") +frame_history_gpu_last = NodePath("VBoxContainer/FrameTimeHistory/GPULast") +fps_graph = NodePath("VBoxContainer/FPSGraph/Graph") +total_graph = NodePath("VBoxContainer/TotalGraph/Graph") +cpu_graph = NodePath("VBoxContainer/CPUGraph/Graph") +gpu_graph = NodePath("VBoxContainer/GPUGraph/Graph") +information = NodePath("VBoxContainer/Information") +settings = NodePath("VBoxContainer/Settings") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -300.0 +offset_bottom = 374.0 +grow_horizontal = 0 +mouse_filter = 2 +theme_override_constants/separation = 0 + +[node name="FPS" type="Label" parent="VBoxContainer"] +modulate = Color(0, 1, 0, 1) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/line_spacing = 0 +theme_override_constants/outline_size = 5 +theme_override_font_sizes/font_size = 18 +text = "60 FPS" +horizontal_alignment = 2 + +[node name="FrameTime" type="Label" parent="VBoxContainer"] +modulate = Color(0, 1, 0, 1) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "16.67 mspf (cap: 123 FPS + Adaptive V-Sync)" +horizontal_alignment = 2 + +[node name="FrameNumber" type="Label" parent="VBoxContainer"] +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Frame: 1234" +horizontal_alignment = 2 + +[node name="FrameTimeHistory" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +mouse_filter = 2 +theme_override_constants/h_separation = 0 +theme_override_constants/v_separation = 0 +columns = 5 + +[node name="Spacer" type="Control" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(60, 0) +layout_mode = 2 +mouse_filter = 2 + +[node name="AvgHeader" type="Label" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Average" +horizontal_alignment = 2 + +[node name="MinHeader" type="Label" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Best" +horizontal_alignment = 2 + +[node name="MaxHeader" type="Label" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Worst" +horizontal_alignment = 2 + +[node name="LastHeader" type="Label" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Last" +horizontal_alignment = 2 + +[node name="TotalHeader" type="Label" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Total:" +horizontal_alignment = 2 + +[node name="TotalAvg" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="TotalMin" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="TotalMax" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="TotalLast" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="CPUHeader" type="Label" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "CPU:" +horizontal_alignment = 2 + +[node name="CPUAvg" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="CPUMin" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "12.34" +horizontal_alignment = 2 + +[node name="CPUMax" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="CPULast" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="GPUHeader" type="Label" parent="VBoxContainer/FrameTimeHistory"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "GPU:" +horizontal_alignment = 2 + +[node name="GPUAvg" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="GPUMin" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "1.23" +horizontal_alignment = 2 + +[node name="GPUMax" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="GPULast" type="Label" parent="VBoxContainer/FrameTimeHistory"] +modulate = Color(0, 1, 0, 1) +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "123.45" +horizontal_alignment = 2 + +[node name="FPSGraph" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +mouse_filter = 2 +alignment = 2 + +[node name="Title" type="Label" parent="VBoxContainer/FPSGraph"] +custom_minimum_size = Vector2(0, 27) +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "FPS: ↑" +vertical_alignment = 1 + +[node name="Graph" type="Panel" parent="VBoxContainer/FPSGraph"] +custom_minimum_size = Vector2(150, 25) +layout_mode = 2 +size_flags_vertical = 0 +mouse_filter = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8") + +[node name="TotalGraph" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +mouse_filter = 2 +alignment = 2 + +[node name="Title" type="Label" parent="VBoxContainer/TotalGraph"] +custom_minimum_size = Vector2(0, 27) +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Total: ↓" +vertical_alignment = 1 + +[node name="Graph" type="Panel" parent="VBoxContainer/TotalGraph"] +custom_minimum_size = Vector2(150, 25) +layout_mode = 2 +size_flags_vertical = 0 +mouse_filter = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8") + +[node name="CPUGraph" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +mouse_filter = 2 +alignment = 2 + +[node name="Title" type="Label" parent="VBoxContainer/CPUGraph"] +custom_minimum_size = Vector2(0, 27) +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "CPU: ↓" +vertical_alignment = 1 + +[node name="Graph" type="Panel" parent="VBoxContainer/CPUGraph"] +custom_minimum_size = Vector2(150, 25) +layout_mode = 2 +size_flags_vertical = 0 +mouse_filter = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8") + +[node name="GPUGraph" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +mouse_filter = 2 +alignment = 2 + +[node name="Title" type="Label" parent="VBoxContainer/GPUGraph"] +custom_minimum_size = Vector2(0, 27) +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "GPU: ↓" +vertical_alignment = 1 + +[node name="Graph" type="Panel" parent="VBoxContainer/GPUGraph"] +custom_minimum_size = Vector2(150, 25) +layout_mode = 2 +size_flags_vertical = 0 +mouse_filter = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8") + +[node name="Information" type="Label" parent="VBoxContainer"] +modulate = Color(1, 1, 1, 0.752941) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "12th Gen Intel(R) Core(TM) i0-1234K +Windows 12 64-bit (double precision), Vulkan 1.2.34 +NVIDIA GeForce RTX 1234, 123.45.67" +horizontal_alignment = 2 + +[node name="Settings" type="Label" parent="VBoxContainer"] +modulate = Color(0.8, 0.84, 1, 0.752941) +layout_mode = 2 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 3 +theme_override_font_sizes/font_size = 12 +text = "Project Version: 1.2.3 +Rendering Method: Forward+ +Window: 1234×567, Viewport: 1234×567 +3D Scale (FSR 1.0): 100% = 1234×567 +3D Antialiasing: TAA + 2× MSAA + FXAA +SSR: 123 Steps +SSAO: On +SSIL: On +SDFGI: 1 Cascades +Glow: On +Volumetric Fog: On +2D Antialiasing: 2× MSAA" +horizontal_alignment = 2 + +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] diff --git a/scenes/load/game.gd b/scenes/load/game.gd new file mode 100644 index 0000000..f0d021b --- /dev/null +++ b/scenes/load/game.gd @@ -0,0 +1,13 @@ +extends Node + +func lerp_toward(current, target, speed: float, delta: float): + return current + (target - current) * (1.0 - exp(-speed * delta)) + +func lerp_toward_angle(current: float, target: float, speed: float, delta: float) -> float: + var difference = wrapf(target - current, -PI, PI) + return current + difference * (1.0 - exp(-speed * delta)) + +func move_toward_angle(from : float, to: float, delta : float): + var ans = fposmod(to - from, TAU) + if ans > PI: ans -= TAU + return from + ans * delta diff --git a/scenes/load/game.gd.uid b/scenes/load/game.gd.uid new file mode 100644 index 0000000..b7f6ffd --- /dev/null +++ b/scenes/load/game.gd.uid @@ -0,0 +1 @@ +uid://bvdc141jjl45c diff --git a/scenes/load/game_settings.gd b/scenes/load/game_settings.gd new file mode 100644 index 0000000..8059b48 --- /dev/null +++ b/scenes/load/game_settings.gd @@ -0,0 +1,19 @@ +extends Node + +var mouse_sens := 1.75 +var toggle_crouch:=false +var stick_sens := 0.15 +var stick_smoothing := 0.25 +var stick_deadzone := 0.25 +var using_gamedpad:=false: + set(is_true): + if using_gamedpad != is_true: + using_gamedpad = is_true + controller_changed.emit() +signal controller_changed + +func _input(event: InputEvent) -> void: + if event is InputEventMouseButton or event is InputEventMouseMotion or event is InputEventKey: + using_gamedpad = false + elif event is InputEventJoypadButton or event is InputEventJoypadMotion: + using_gamedpad = true diff --git a/scenes/load/game_settings.gd.uid b/scenes/load/game_settings.gd.uid new file mode 100644 index 0000000..e7a19f6 --- /dev/null +++ b/scenes/load/game_settings.gd.uid @@ -0,0 +1 @@ +uid://hhhyrxuvf73t diff --git a/scenes/load/world.tscn b/scenes/load/world.tscn new file mode 100644 index 0000000..7951ba0 --- /dev/null +++ b/scenes/load/world.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=4 format=3 uid="uid://dk7oodthk2rt2"] + +[ext_resource type="PackedScene" uid="uid://blm3k1grnn01j" path="res://scenes/player/player.tscn" id="1_g33ix"] +[ext_resource type="PackedScene" uid="uid://c5nhw4y7f37ll" path="res://scenes/level0.tscn" id="2_whu81"] +[ext_resource type="PackedScene" uid="uid://dp0qvvwtqxt5r" path="res://scenes/load/console/console.tscn" id="3_whu81"] + +[node name="world" type="Node"] + +[node name="player" parent="." instance=ExtResource("1_g33ix")] + +[node name="level0" parent="." instance=ExtResource("2_whu81")] + +[node name="console" parent="." instance=ExtResource("3_whu81")] diff --git a/scenes/player/head.gd b/scenes/player/head.gd new file mode 100644 index 0000000..8033e8a --- /dev/null +++ b/scenes/player/head.gd @@ -0,0 +1,19 @@ +extends Node3D + +@export var headbob_frequency = 3.5 +@export var headbob_amplitude = 0.01 +var _headbob_time:float + +func _physics_process(delta: float) -> void: + var headbob = _head_bob(delta) as Vector3 + %eyes.position = headbob + +func _head_bob(delta)->Vector3: + var headbob_vector:Vector3 + var time_multipliers = owner.spedometer * float(owner.is_on_floor()) + var speed_normal = owner.spedometer/owner.mult_speed + _headbob_time += delta * time_multipliers + headbob_vector.y = cos(_headbob_time*headbob_frequency)*headbob_amplitude + headbob_vector.x = sin(_headbob_time*headbob_frequency/2)*headbob_amplitude + var result = Vector3.ZERO.lerp(headbob_vector, speed_normal) + return result diff --git a/scenes/player/head.gd.uid b/scenes/player/head.gd.uid new file mode 100644 index 0000000..27a1a87 --- /dev/null +++ b/scenes/player/head.gd.uid @@ -0,0 +1 @@ +uid://da0nthck8novp diff --git a/scenes/player/player.gd b/scenes/player/player.gd new file mode 100644 index 0000000..447a0e6 --- /dev/null +++ b/scenes/player/player.gd @@ -0,0 +1,97 @@ +extends CharacterBody3D + +#region Variables +@export var desired_jump_height : float = 1.0 +@export var gravity_multiplier : float = 2.0 +@onready var collision: CollisionShape3D = $collision +@onready var neck: Node3D = $head/neck +signal fallen +signal camera_rotated(rotation_vector:Vector2) +var jump_vel: float +var _gamepad_look_vector:Vector2 +var _collison_height_origin := 0.0 +var input_dir:Vector2 +var mult_speed:=3.75 +var friction = 8 +var spedometer:float +#endregion + +#region Private Variables +func _ready(): + #------------------------------------------------Set gravity + var default_gravity = ProjectSettings.get_setting("physics/3d/default_gravity")*gravity_multiplier + jump_vel = sqrt(2 * default_gravity * desired_jump_height) + _collison_height_origin = collision.shape.height + #------------------------------------------------Set mouse + Input.set_use_accumulated_input(false) + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + +func _unhandled_input(event): + if event is InputEventMouseMotion and not GameSettings.using_gamedpad \ + and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: + _rotate_player(_gather_mouse_input(event)) + +func _rotate_player(motion:Vector2): + if motion == Vector2.ZERO: return + camera_rotated.emit(motion) + %head.rotate_y(motion.x) + collision.rotation.y = %head.rotation.y + neck.rotate_x(motion.y) + const mouseLimit = deg_to_rad(80) + neck.rotation.x = clamp(neck.rotation.x, -mouseLimit, mouseLimit) + +func _locomotion(delta): + input_dir = Input.get_vector("left", "right", "up", "down", GameSettings.stick_deadzone) + var direction = (%head.global_basis * Vector3(input_dir.x, 0, input_dir.y)) + if direction: + velocity.x = Game.lerp_toward(velocity.x, direction.x*mult_speed,friction,delta) + velocity.z = Game.lerp_toward(velocity.z, direction.z*mult_speed,friction,delta) + else: + velocity.x = Game.lerp_toward(velocity.x, 0.0, friction, delta) + velocity.z = Game.lerp_toward(velocity.z, 0.0, friction, delta) + +func _gather_mouse_input(event: InputEventMouseMotion) -> Vector2: + var viewport_size = get_viewport().get_visible_rect().size + var normalized_input = event.relative / viewport_size.length() + normalized_input *= GameSettings.mouse_sens + return -normalized_input + +func _gather_stick_input(delta): + var input_vector = Input.get_vector("look_right", "look_left", "look_down", "look_up", + GameSettings.stick_deadzone) + var sens_intepolated = lerpf(0.001, 0.1,GameSettings.stick_sens) + input_vector *= sens_intepolated + var smooting_interpolated = lerpf(20,2,GameSettings.stick_smoothing) + _gamepad_look_vector = Game.lerp_toward(_gamepad_look_vector, input_vector,smooting_interpolated, delta) + _rotate_player(input_vector if GameSettings.stick_smoothing == 0.0 else _gamepad_look_vector) + +func _recrouch(height:float): + collision.shape.height = height + collision.position.y = collision.shape.height/2 + +func _process(delta: float) -> void: + if GameSettings.using_gamedpad: _gather_stick_input(delta) +func _physics_process(delta): + #------------------------------------------------Jumping + if Input.is_action_just_pressed("jump") and is_on_floor(): + velocity.y += jump_vel + #------------------------------------------------Movement + _locomotion(delta) + _move_and_check(delta) + +func _move_and_check(delta): + #------------------------------------------------Gravity + if is_on_floor(): friction = 8 + else: + var gravity = get_gravity().y*gravity_multiplier + friction = 1 + velocity.y += gravity * delta + #------------------------------------------------Speed + var real_speed = get_real_velocity() + spedometer = Vector2(real_speed.x, real_speed.z).length() + #------------------------------------------------Move and Check + var prev_fall = velocity.y + move_and_slide() + if prev_fall < -10 and velocity.y >= 0: + fallen.emit() +#endregion diff --git a/scenes/player/player.gd.uid b/scenes/player/player.gd.uid new file mode 100644 index 0000000..4bdb6e2 --- /dev/null +++ b/scenes/player/player.gd.uid @@ -0,0 +1 @@ +uid://dmu4p3ty3a1bk diff --git a/scenes/player/player.tscn b/scenes/player/player.tscn new file mode 100644 index 0000000..73fa9a9 --- /dev/null +++ b/scenes/player/player.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=4 format=3 uid="uid://blm3k1grnn01j"] + +[ext_resource type="Script" uid="uid://dmu4p3ty3a1bk" path="res://scenes/player/player.gd" id="1_4flbx"] +[ext_resource type="Script" uid="uid://da0nthck8novp" path="res://scenes/player/head.gd" id="2_dovo2"] + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_75vfm"] +margin = 0.01 +height = 1.8 +radius = 0.3 + +[node name="player" type="CharacterBody3D" groups=["player"]] +collision_layer = 32772 +collision_mask = 3 +floor_block_on_wall = false +script = ExtResource("1_4flbx") + +[node name="collision" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0) +shape = SubResource("CylinderShape3D_75vfm") + +[node name="head" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.44, 0) +script = ExtResource("2_dovo2") + +[node name="neck" type="Node3D" parent="head"] + +[node name="eyes" type="Camera3D" parent="head/neck"] +unique_name_in_owner = true +cull_mask = 1048063 +current = true