From d7499a6d2ef42f984f3d5b4072fb6e4e2b35fc07 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 21:14:35 -0400 Subject: [PATCH 01/39] v1 --- CMakeLists.txt | 2 - README.md | 12 +-- shaders/bin/blur.comp.json | 1 - shaders/bin/blur.comp.msl | 44 --------- shaders/bin/blur.comp.spv | Bin 1944 -> 0 bytes shaders/bin/composite.comp.json | 2 +- shaders/bin/composite.comp.msl | 109 ++++++++++----------- shaders/bin/composite.comp.spv | Bin 6220 -> 5956 bytes shaders/bin/depth.frag.json | 2 +- shaders/bin/depth.vert.json | 2 +- shaders/bin/depth.vert.msl | 2 +- shaders/bin/depth.vert.spv | Bin 1804 -> 1804 bytes shaders/bin/opaque.frag.json | 2 +- shaders/bin/opaque.frag.msl | 52 +++++----- shaders/bin/opaque.frag.spv | Bin 3912 -> 4104 bytes shaders/bin/opaque.vert.json | 2 +- shaders/bin/opaque.vert.msl | 23 +++-- shaders/bin/opaque.vert.spv | Bin 2964 -> 3344 bytes shaders/bin/raycast.frag.json | 2 +- shaders/bin/raycast.vert.json | 2 +- shaders/bin/raycast.vert.spv | Bin 1988 -> 1988 bytes shaders/bin/shadow.frag.json | 2 +- shaders/bin/shadow.vert.json | 2 +- shaders/bin/shadow.vert.msl | 4 +- shaders/bin/shadow.vert.spv | Bin 2084 -> 2084 bytes shaders/bin/sky.frag.json | 2 +- shaders/bin/sky.vert.json | 2 +- shaders/bin/ssao.comp.json | 1 - shaders/bin/ssao.comp.msl | 156 ------------------------------ shaders/bin/ssao.comp.spv | Bin 4484 -> 0 bytes shaders/bin/transparent.frag.json | 2 +- shaders/bin/transparent.frag.msl | 116 +++++++++++----------- shaders/bin/transparent.frag.spv | Bin 7316 -> 7404 bytes shaders/bin/transparent.vert.json | 2 +- shaders/bin/transparent.vert.msl | 6 +- shaders/bin/transparent.vert.spv | Bin 3300 -> 3300 bytes shaders/bin/ui.comp.msl | 144 +++++++++++++-------------- shaders/bin/ui.comp.spv | Bin 4712 -> 4728 bytes shaders/blur.comp | 31 ------ shaders/composite.comp | 17 +--- shaders/opaque.frag | 4 +- shaders/opaque.vert | 2 + shaders/shader.hlsl | 27 +----- shaders/ssao.comp | 66 ------------- src/main.c | 96 +----------------- src/voxel.c | 44 +++++---- src/voxel.h | 3 +- src/voxel.inc | 16 +-- src/world.c | 103 ++++++++++++++++---- 49 files changed, 383 insertions(+), 724 deletions(-) delete mode 100644 shaders/bin/blur.comp.json delete mode 100644 shaders/bin/blur.comp.msl delete mode 100644 shaders/bin/blur.comp.spv delete mode 100644 shaders/bin/ssao.comp.json delete mode 100644 shaders/bin/ssao.comp.msl delete mode 100644 shaders/bin/ssao.comp.spv delete mode 100644 shaders/blur.comp delete mode 100644 shaders/ssao.comp diff --git a/CMakeLists.txt b/CMakeLists.txt index aa626307..4513cb82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,6 @@ function(add_shader FILE) endif() package(${JSON}) endfunction() -add_shader(blur.comp shaders/shader.hlsl src/voxel.inc) add_shader(composite.comp shaders/shader.hlsl src/voxel.inc) add_shader(depth.frag shaders/shader.hlsl src/voxel.inc) add_shader(depth.vert shaders/shader.hlsl src/voxel.inc) @@ -98,7 +97,6 @@ add_shader(shadow.frag shaders/shader.hlsl src/voxel.inc) add_shader(shadow.vert shaders/shader.hlsl src/voxel.inc) add_shader(sky.frag shaders/shader.hlsl src/voxel.inc) add_shader(sky.vert shaders/shader.hlsl src/voxel.inc) -add_shader(ssao.comp shaders/shader.hlsl src/voxel.inc) add_shader(transparent.frag shaders/shader.hlsl src/voxel.inc) add_shader(transparent.vert shaders/shader.hlsl src/voxel.inc) add_shader(ui.comp shaders/shader.hlsl src/voxel.inc) diff --git a/README.md b/README.md index 7e7baaf8..5f174c01 100644 --- a/README.md +++ b/README.md @@ -65,10 +65,8 @@ To build locally, add [SDL_shadercross](https://github.com/libsdl-org/SDL_shader 1. Render opaques to depth texture (for shadows) 2. Render sky to G-buffer 3. Render opaques to G-buffer -4. Calculate SSAO -5. Blur SSAO -6. Composite G-buffer -7. Render transparents to depth teture (for predepth) -8. Render transparents and composite -9. Render raycast -10. Render UI +4. Composite G-buffer with CPU-baked vertex AO +5. Render transparents to depth teture (for predepth) +6. Render transparents and composite +7. Render raycast +8. Render UI diff --git a/shaders/bin/blur.comp.json b/shaders/bin/blur.comp.json deleted file mode 100644 index 893a14df..00000000 --- a/shaders/bin/blur.comp.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 0, "readonly_storage_textures": 1, "readonly_storage_buffers": 0, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 0, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } diff --git a/shaders/bin/blur.comp.msl b/shaders/bin/blur.comp.msl deleted file mode 100644 index fc385b5b..00000000 --- a/shaders/bin/blur.comp.msl +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include - -using namespace metal; - -kernel void main0(texture2d inputTexture [[texture(0)]], texture2d outputTexture [[texture(1)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) -{ - do - { - uint2 _35 = uint2(outputTexture.get_width(), outputTexture.get_height()); - uint _36 = _35.x; - uint _37 = _35.y; - bool _46; - if (gl_GlobalInvocationID.x < _36) - { - _46 = gl_GlobalInvocationID.y >= _37; - } - else - { - _46 = true; - } - if (_46) - { - break; - } - float _50; - _50 = 0.0; - float _51; - for (int _53 = -2; _53 <= 2; _50 = _51, _53++) - { - uint _63 = clamp(gl_GlobalInvocationID.y + uint(_53), 0u, _37 - 1u); - _51 = _50; - for (int _67 = -2; _67 <= 2; ) - { - _51 += inputTexture.read(uint2(uint2(clamp(gl_GlobalInvocationID.x + uint(_67), 0u, _36 - 1u), _63)), 0u).x; - _67++; - continue; - } - } - outputTexture.write(float4(_50 * 0.039999999105930328369140625), uint2(gl_GlobalInvocationID.xy)); - break; - } while(false); -} - diff --git a/shaders/bin/blur.comp.spv b/shaders/bin/blur.comp.spv deleted file mode 100644 index 4d18b1bb9105ea79ab10827c78b6135987400433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcmZvcTT_iu9EX=(yL2v{6`0r^8gRev~-Oit(!n2L?KLJIuZ|!Ra+1?t!KA>!!KHy1mZ$->y^J=$u z?aImCiR^3{&^{RDI(X|QxgOrrf!5jsbRlg7$)^e499`I&p&8I7-vT_=YlUVC9PP^P z*puX4@aF0Xb$EDR71^HB(eBCcXs@ujuQBd;yBOo`#h8v5qi;8IC)8ftul6peHPp8= zcQ>>b>u#vLF+EUY%&WWyYF≫Jhe>OKa)9$?I`p^B7 z_Ow6xT62ud_K|jCU*C}qKqv9F?}Nbn-}s+FJ-^`HcQ4Ris=s^a1NQe6+1dJ|Zh>0X zJQQ`1kaUNm&Kaigv&SRAy1pB88+#O}|A>!o=UCL4)BXmao}c(@I}X&@qkPIe2ybrR zTgrU`Uj2ud`y{+Nd;39r$|L>4gw`(s->>uQZw>o61@+j6K0`pAeaM?Hi?VuUzd72a z=JyTw{qe2oa|Vn6ZT{Xyf%mL!3~2ildp`@Wy$*b(hjFNOk3DHW2h>|rKJDf_{QtX| zK&SpSvEIW4VE#AMQ=SC+sDBrA7vbHVzr#j4*6$MVj@_#-kS1hwi$S1(`+~3eRt~9Y&YS3b6aP- zg`8$H#@Y0nXCFP#+dv<8;G3(4&VnL%#GU%PzY}%(7JxbYjrbPs0_~o+Q8xwej^T6+e@Hl_^4lKae Wg2%+m>uU~=ePmE;NPiPK4*mi)xqyNI diff --git a/shaders/bin/composite.comp.json b/shaders/bin/composite.comp.json index 7dedc6ba..38e66b79 100644 --- a/shaders/bin/composite.comp.json +++ b/shaders/bin/composite.comp.json @@ -1 +1 @@ -{ "samplers": 1, "readonly_storage_textures": 5, "readonly_storage_buffers": 0, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 2, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } +{ "samplers": 1, "readonly_storage_textures": 4, "readonly_storage_buffers": 0, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 2, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } diff --git a/shaders/bin/composite.comp.msl b/shaders/bin/composite.comp.msl index c9c855e2..beb62931 100644 --- a/shaders/bin/composite.comp.msl +++ b/shaders/bin/composite.comp.msl @@ -56,21 +56,21 @@ struct type_UniformBuffer_1 constant spvUnsafeArray _79 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); -kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], texture2d shadowTexture [[texture(0)]], texture2d colorTexture [[texture(1)]], texture2d lightTexture [[texture(2)]], texture2d ssaoTexture [[texture(3)]], texture2d voxelTexture [[texture(4)]], texture2d positionTexture [[texture(5)]], texture2d compositeTexture [[texture(6)]], sampler shadowSampler [[sampler(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) +kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], texture2d shadowTexture [[texture(0)]], texture2d colorTexture [[texture(1)]], texture2d lightTexture [[texture(2)]], texture2d voxelTexture [[texture(3)]], texture2d positionTexture [[texture(4)]], texture2d compositeTexture [[texture(5)]], sampler shadowSampler [[sampler(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) { do { uint2 _93 = uint2(colorTexture.get_width(), colorTexture.get_height()); - bool _104; - if (gl_GlobalInvocationID.x < _93.x) + bool _105; + if (!(gl_GlobalInvocationID.x >= _93.x)) { - _104 = gl_GlobalInvocationID.y >= _93.y; + _105 = gl_GlobalInvocationID.y >= _93.y; } else { - _104 = true; + _105 = true; } - if (_104) + if (_105) { break; } @@ -78,8 +78,7 @@ kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], cons uint4 _112 = voxelTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); uint _113 = _112.x; float4 _115 = positionTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); - float3 _124 = lightTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz; - float _186; + float _188; do { float4 _135 = UniformBuffer.ShadowTransform * float4(_115.xyz, 1.0); @@ -89,104 +88,94 @@ kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], cons float2 _145 = _142; _145.y = _144; float _146 = _142.x; - bool _151; - if ((isunordered(_146, 0.0) || _146 >= 0.0)) + bool _152; + if (!(_146 < 0.0)) { - _151 = _146 > 1.0; + _152 = _146 > 1.0; } else { - _151 = true; + _152 = true; } - bool _156; - if (!_151) + bool _157; + if (!_152) { - _156 = _144 < 0.0; + _157 = _144 < 0.0; } else { - _156 = true; + _157 = true; } - bool _161; - if (!_156) + bool _162; + if (!_157) { - _161 = _144 > 1.0; + _162 = _144 > 1.0; } else { - _161 = true; + _162 = true; } - if (_161) + if (_162) { - _186 = 0.4000000059604644775390625; + _188 = 0.4000000059604644775390625; break; } - float _175; - if ((_113 & 1u) != 0u) + float _177; + if (((_113 >> 6u) & 1u) != 0u) { - float _171 = dot(_79[((_113 >> 1u) & 15u) - 1u], fast::normalize(float4(UniformBuffer.ShadowTransform[0][2], UniformBuffer.ShadowTransform[1][2], UniformBuffer.ShadowTransform[2][2], UniformBuffer.ShadowTransform[3][2]).xyz)); - if (_171 > 0.0) + float _173 = dot(_79[((_113 >> 2u) & 15u) - 1u], fast::normalize(float4(UniformBuffer.ShadowTransform[0][2], UniformBuffer.ShadowTransform[1][2], UniformBuffer.ShadowTransform[2][2], UniformBuffer.ShadowTransform[3][2]).xyz)); + if (_173 > 0.0) { - _186 = 0.0; + _188 = 0.0; break; } - _175 = _171; + _177 = _173; } else { - _175 = -0.7070000171661376953125; + _177 = -0.7070000171661376953125; } if (_139.z < (shadowTexture.sample(shadowSampler, _145, level(0.0)).x + 0.001000000047497451305389404296875)) { - _186 = _175 * (-0.4000000059604644775390625); + _188 = _177 * (-0.4000000059604644775390625); break; } else { - _186 = 0.0; + _188 = 0.0; break; } break; // unreachable workaround } while(false); - float3 _216; - if ((_113 & 1u) != 0u) + bool _197; + if (!(length(_110) > 0.999000012874603271484375)) { - _216 = _110 * (((_124 + float3(0.5)) + float3(_186)) - float3(ssaoTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).x * 2.0)); + _197 = _113 == 0u; } else { - float _196 = length(_110); - bool _201; - if ((isunordered(_196, 0.999000012874603271484375) || _196 <= 0.999000012874603271484375)) - { - _201 = _113 == 0u; - } - else - { - _201 = true; - } - float3 _209; - if (_201) - { - _209 = _110; - } - else - { - _209 = _110 * ((_124 + float3(0.5)) + float3(_186)); - } - _216 = _209; + _197 = true; + } + float3 _206; + if (_197) + { + _206 = _110; + } + else + { + _206 = _110 * ((lightTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz + (float3(0.5) * colorTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).w)) + float3(_188)); } - float3 _241; - if (_113 != 0u) + float3 _232; + if (!(_113 == 0u)) { - float3 _222 = _115.xyz - UniformBuffer_1.PlayerPosition; - _241 = mix(_216, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_222.y, length(float2(_222.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(_115.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))); + float3 _213 = _115.xyz - UniformBuffer_1.PlayerPosition; + _232 = mix(_206, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_213.y, length(float2(_213.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(_115.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))); } else { - _241 = _216; + _232 = _206; } - compositeTexture.write(float4(_241, 1.0), uint2(gl_GlobalInvocationID.xy)); + compositeTexture.write(float4(_232, 1.0), uint2(gl_GlobalInvocationID.xy)); break; } while(false); } diff --git a/shaders/bin/composite.comp.spv b/shaders/bin/composite.comp.spv index 4d619834c5c2613be4664e43d4f08a0b82cc3989..a0ab7fe7459a25d5d6b4a84df6f376770c0df73d 100644 GIT binary patch literal 5956 zcmaKud34p)5yu}1iwZ)O9hW8wDvJ>j6+sgc#Gs-C1BgqjuMi-b1oyD(a-0-JI|kyS|PulEb^ayx)+5?rm4ALAF}?8i@E^iz*6bhhW)x=>+C`MTGxY^j;Dw5GK^zq}>! z{gGWO@=FV=7qqPDUey^q8_5;pyYlTT+gds?i+NnP6yIESn15UNC55&^=O<~3@!P?- zwJu-L-HRUxzqNV>!Jk%G)6&)}etYCAU@8B*MfeeX4;m~Y3=$*0fJ)Rte{(%F=D zQ0nDS_|N9+`>Auc-eJUL&Z2yPjhwXi!d~tSv^~$=fFtbcl3BDpzpP(7>-QY9er^5U zGxK?#S--aaisbkFvVLv-*6DoDG3(dX@151}x#^GfwDmjmdj|R|GIrK)PqTh){pOp) zX?gaJ-Am$AoOfRT9M*}rQeBlr+cnJ*XBs&g*`1vJ5$MB_RbV1{)JK5Aj_ap~Jrdgy z_Nb!OQ#X?M(df>xUz0dZ?J>YP!q}L%6M8P!vpM3t0}-b$_+8MQ7rx+kg)^=<|HZ_` zoQSVVe9VbDQvd5B&i=~vwf6zl39;YF*zbHeb#vJJ zVqY-gxZ1F%U@v%ec3s%}72~_h{h5mG9OLvw-2Uhr8}sEn2Vhs8tdBy!ZVh`+*eTbp$sAA3`CAAnk zhA6)q`P#&5o6C2}^*=9HU7BO8b9~RYw!XFaExOK3q{CRxtsdzd{iFEZfRxkTl{?_K zEa%)=NOQ^Q^SgEb`VK|vlQZvZr1e(<{f8m@0QsRrHX^I>&Oxdhb2zfJ|5A=4u+3p! za~_%O*vs7Hi~5dAwl(cUZr^^-WCnBXyZ7IrZNGiL9pU%Ac7*LYJGAY!@3ABNzP}Fb znMm)6L)%{Y-del1{qa2w+kV&^d*a@YM!I+J)FfVdd}t@5!;N;_q!?V1=#D~ySCO?d$=$Yy9k|kc!sqei*DVX z%>i`S^K)Mg&-4FSi;?czeR*E)t(Ls%?&}aV@4|7wKKzg0$0HpdppQkK0L-N{-m^Rr zcuvc)ydPgmobT6sIBWWH;t^%;q{LZwJ#p^gWZ>G)HNSK7;AF6omsF7omZ4Vy-_TfVIl6qTwE|tvTHj-S#NC+D4%mDy5CpS(uFRUogcMy!|NB0sO73-q}+_r4a$YxhH*4z>eP>lumLTCHc|(=QxRYvei$ zu0PQBn>ic!PFc@f*Nhltta&ZEYg&i#*8tb}3DV&j#{3k>xrVy=)+JlsbE`*Q z2YP__JMQ51=<>qR2k0M^?(PkVn~gL!-k2NFePi|n@y6VQE!(96A0CMJ1&-OuHJJwR#XV2QDgegWAA)}H=*mV1l}KWZwB6}2G9ZGEFVDE*977_`VIO6z`Z|+bhvl< z-vT*nSHGFP`tCdgyoc6dKO#mM-_gV96M=g+-ubTaJEX%kjClk+3S2|!yE+>A7}yQC zKhIC@ad0Nk7w`NN==L%Yv0LDb*Y6oQ|4Cp!^jWvHxUMy1ZF%?MoTq^Etj)Q`Mjw8U z9({;@{sB(jz5WsDaIf-z0&=dYUQb;|A^!}9g7F~!{{JQM{;jZ%r$IN6kF$R!@t$>X z&n6C0=Kh+v3S<-cYLI^e#_EfE^BlUl8i4*m>05n1@z&v*#>F@F0=oYBAijkc(d8F_ zIH#A;82#3C?`4x2Y&H^t3W23%T z(e*C^5&utgX+?(ift`XdS5@#Rcf2seXJKuQy*6tk}jC>0W0ZX_O>b@_=JFN3~ Nq<2;MAuCM-9|KqNU(o;n literal 6220 zcmaKw37D2u7017s5his67j{esF_p#95Dg_~m@ynwl)(W)Tl5PCn3$Q5<{JcZ8zi?Z zv$C|^Y;ldq%FGhfG_$aMx5ctWTWnD@_3^3S@BQxie3{V8^Ph9h|D1d7x#!;Z&OFrB zPOdK$Y6^wIh{7}cbnH{8%^2kj>^%#^GrN6$=lrJf!1AV)jh(ZXfW91Xru$pYcm^4&&c$=&MgF_4gKg%BV1vd;=TSbT!Rb-qhV&T-lZQ z;mGo;;_}kEMP2I$*7gU_MhaPcx!Aj=r>h?`%j3G0_|B@s{JX<1EA^E6Urdw5?*ZS_ zy>ivSPW&+XK%R236tp=S;C5BxUhwCX)_3(pFt+g{kZVfi?t$)7U%2E)?lMn3{jM!<{4asWQ7kY=uC`rZ}$yFbwOj1K~iuqRc_%=S$4 ze(k*9v(5Xp^?Ucs=Naey+WKpg-&*p1ZT;5ie9t%U*VgYn*6%sz{o4Ay^ZGqk{WUpT zzeB%gq`x+2=l%9P@7LCEzIm+T_vV;f5j$~yC$2w_bt0}(cU@+?ra9uwBS$;Cm(xE6 zeGIY@Oe2r_SWwz`({W*s!)DA0dwj*N#!txX!IrVipNMV_`#YV}*Y++rM;IGA_fx~&) zhh)}^_MzCGoAHMs8FDN&+73s5X#4hNd)tI=Z#}o^ zoU8T`AnJ@cKI%`sFmqejug1P~%o)vL&%j>v=-igDkILc)s{5ab?HuFuMcmQoo7;=k zJjY;9+Hzafehv1Cw;xr_GYi`}#_5YZ$D-4nIokH|IN-Y(_H1;&<58_!Gc zcV`dmk$s4v?Pz4q@f9_Toj{b|iF|Y7waw+5@A@y7t0m1b);ZR>tM#qLZ_jn+ARWef zZmme?=pV<=Hl&>P0o(zEu$w+gUSNoJ?$6n?qU(|PMvYkJX-2N^Y24*wYzWd%gwC%U=xg-3( z-;S_7XGhq+&kk*S?|bYBzwfU@dk)g~&!KJad~e;0w*B%w4cq?MD|=)wPD9!Y@7Q!! zQZ4|#SH4BQJB?rxI4DW=K-}jJxOH1EtbR`mu^%4!U`rFLwW6O6BDNEq?|Ez3i?BC6 zdwsL9_H=PBb_qJ~@N8>+J$eoBtd61Mo~QeAc)tI^T8ebv?#uIYZ_VUYcVEY&c{k1g z_Td?Ro{4lkkM4W+24F6w@t*A)f#XEw(-Q2#Rk$VNY{N|KH8+|~(aG1v!b2T7K!0*Lery$oPE}tvT>ut%8sMgYt?)Me7l+oq# z^P`plc>Tf=wcMNT!&*4kI21gPxO33ueeW+y+&Xl5<2=Wckn4eWR-b!w?;C)8^zH5F zdw{6*Ty(iz)p{Phe&L8(BiH$G!+~}^@&e$yWj*te7XsgvDZrREX8M=HO=tzHq zU5+jvh;w`=oUy_Yy}6A1_WcTAjPt$EO~`ivdEYgMbFL&_-@AeS$zWsRu1x$9$f)r> z={f@NeN6_7uwYp}+ zC}Yi!qPwPb81MX8^JD1xUGw8ehil4z0?4_hdhGK$^ysl`MvOAn{3N<-TE}(3`L1z2 z(%~A$dqL(dlz=_KLOTq zCpa89 z{T`h0`t7OnzYpB2K5KMc*KobOEpN@v`2ldAbvQR-?Xz?3Z>;%4^r7|r2rg<{}Je42;w{YQ{opP;~f5sE+1$}f44pc z=bF|u3(N$@#@`cFwU6R*FVtp2V!6Ugo}N7XWXZ;-mAC+%D7kmLO1Rn;9T!Voaw*O^*e%l z5?#(Uf_o})_96a0+=1?Vw@e@Z*XS diff --git a/shaders/bin/depth.frag.json b/shaders/bin/depth.frag.json index 5da52262..ec4afe4f 100644 --- a/shaders/bin/depth.frag.json +++ b/shaders/bin/depth.frag.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0, "inputs": [], "outputs": [] } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0 } diff --git a/shaders/bin/depth.vert.json b/shaders/bin/depth.vert.json index e6fb9331..51723fc4 100644 --- a/shaders/bin/depth.vert.json +++ b/shaders/bin/depth.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 3, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "uint", "location": 0 }], "outputs": [] } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 3 } diff --git a/shaders/bin/depth.vert.msl b/shaders/bin/depth.vert.msl index f7e93d19..8471dce6 100644 --- a/shaders/bin/depth.vert.msl +++ b/shaders/bin/depth.vert.msl @@ -31,7 +31,7 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 6u) & 31u), float((in.in_var_TEXCOORD0 >> 11u) & 255u), float((in.in_var_TEXCOORD0 >> 19u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); return out; } diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index 2116b299985bc339d972d0aa3f9755dac21a140f..a04b2bc3459f6b4bdd46871796b4b5c6735a00e6 100644 GIT binary patch delta 26 icmeC->*3pQhl!DW@?9o>MxM#K%<_yPn|+!0GXnr@c?VSh delta 26 icmeC->*3pQhl!DG@?9o>M()YF%<_!Fn|+!0GXnr@RR>Z4 diff --git a/shaders/bin/opaque.frag.json b/shaders/bin/opaque.frag.json index 334605ca..6fb7c557 100644 --- a/shaders/bin/opaque.frag.json +++ b/shaders/bin/opaque.frag.json @@ -1 +1 @@ -{ "samplers": 1, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 1, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float4", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "float3", "location": 1 }, { "name": "in.var.TEXCOORD2", "type": "float3", "location": 2 }, { "name": "in.var.TEXCOORD3", "type": "uint", "location": 3 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }, { "name": "out.var.SV_Target1", "type": "float4", "location": 1 }, { "name": "out.var.SV_Target2", "type": "float4", "location": 2 }, { "name": "out.var.SV_Target3", "type": "uint", "location": 3 }] } +{ "samplers": 1, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 1 } diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 2cc09c33..4bf21515 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -35,53 +35,55 @@ struct main0_in float3 in_var_TEXCOORD1 [[user(locn1), flat]]; float3 in_var_TEXCOORD2 [[user(locn2)]]; uint in_var_TEXCOORD3 [[user(locn3)]]; + float in_var_TEXCOORD4 [[user(locn4)]]; }; fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(1)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) { main0_out out = {}; - float4 _71 = atlasTexture.sample(atlasSampler, in.in_var_TEXCOORD2.xy, uint(rint(in.in_var_TEXCOORD2.z))); - if (_71.w < 0.001000000047497451305389404296875) + float4 _75 = atlasTexture.sample(atlasSampler, in.in_var_TEXCOORD2.xy, uint(rint(in.in_var_TEXCOORD2.z))); + if (_75.w < 0.001000000047497451305389404296875) { discard_fragment(); } - uint _81 = uint(UniformBuffer.LightCount); - float3 _83; - _83 = float3(0.0); - float3 _84; - for (uint _86 = 0u; _86 < _81; _83 = _84, _86++) + _75.w = in.in_var_TEXCOORD4; + uint _87 = uint(UniformBuffer.LightCount); + float3 _89; + _89 = float3(0.0); + float3 _90; + for (uint _92 = 0u; _92 < _87; _89 = _90, _92++) { - float _99 = float((lightBuffer._m0[_86].Color & 4278190080u) >> 24u); - float3 _106 = (float3(float(lightBuffer._m0[_86].X), float(lightBuffer._m0[_86].Y), float(lightBuffer._m0[_86].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _107 = length(_106); - bool _112; - if ((isunordered(_107, _99) || _107 < _99)) + float _105 = float((lightBuffer._m0[_92].Color & 4278190080u) >> 24u); + float3 _112 = (float3(float(lightBuffer._m0[_92].X), float(lightBuffer._m0[_92].Y), float(lightBuffer._m0[_92].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _113 = length(_112); + bool _119; + if (!(_113 >= _105)) { - _112 = _99 <= 0.0; + _119 = _105 <= 0.0; } else { - _112 = true; + _119 = true; } - if (_112) + if (_119) { - _84 = _83; + _90 = _89; continue; } - float _118 = fast::clamp(dot(in.in_var_TEXCOORD1, _106 / float3(_107)), 0.0, 1.0); - if (_118 <= 0.0) + float _125 = fast::clamp(dot(in.in_var_TEXCOORD1, _112 / float3(_113)), 0.0, 1.0); + if (_125 <= 0.0) { - _84 = _83; + _90 = _89; continue; } - float _124 = fast::clamp(1.0 - (_107 / _99), 0.0, 1.0); - _84 = _83 + ((float3(float(lightBuffer._m0[_86].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_86].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_86].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _118) * (_124 * _124)); + float _131 = fast::clamp(1.0 - (_113 / _105), 0.0, 1.0); + _90 = _89 + ((float3(float((lightBuffer._m0[_92].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_92].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_92].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _125) * (_131 * _131)); } - float3 _141 = _83 * 2.0; - out.out_var_SV_Target0 = _71; + float3 _149 = _89 * 2.0; + out.out_var_SV_Target0 = _75; out.out_var_SV_Target1 = in.in_var_TEXCOORD0; - out.out_var_SV_Target2 = float4(_141.x, _141.y, _141.z, float4(0.0).w); - out.out_var_SV_Target3 = (in.in_var_TEXCOORD3 & 1u) | (in.in_var_TEXCOORD3 & 30u); + out.out_var_SV_Target2 = float4(_149.x, _149.y, _149.z, float4(0.0).w); + out.out_var_SV_Target3 = (0u | (in.in_var_TEXCOORD3 & 60u)) | (in.in_var_TEXCOORD3 & 64u); return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index cd6738c42293cb9de6e3233561b4a1cf8ea2c100..504e4540186384ccb9653fba1f0d803ca8324ea3 100644 GIT binary patch literal 4104 zcmZve*;kcS7>7Sb$Fv+%6AzeE;?YdaGzCP%ib4eyEz^?>Qoy0Z!KAD(vuv`->R;%x z%Pv}7v{tLX$fi}Rp65H?TW4XL_2V7)JMFzcsHylG+v{)x+0daddjKqDYQG8fDP^T7geFJA7^R>zON z{U{pHEQBvlPYmXF4&+D13d4i>La9`k#@3kJgRM{=EllG86F|Qyb<=9i7Fg@p7f# zW$0$Pr?Jd6GM>L&DCPT(^mq33oH(4GnRz^uS+<8!rTd)!EZfeod4{uWkA%(hn`PS- zHqX2`RZffPJ$1gXP#PXAQ;oHF7w)oAjW+MdT{f!G=H0o=Mm3&S^&QlAIlk#!D|aHh zOi9wkeRCGx8F~Aw@bySZ(ga*xc7iyJ@P5X{-bp38*r_!kR){OS7)E0 ztIc%w96ICb=bN_P6;Nm9`_o72`Y(R{zq=3G2CsViuX+S3mc zI(=8;<@;2hew5&qo9M~=8RwFN7i*b=_e@(8y!S`h{eHO2sZN`BCzql=@x!I9qN`7K z!`FZo;NCr%>>QOJ&E!h{`ebh=+ne^spx&j}zb}*ZUrMI^&}KY5Q~5RUezWY^{Rg1d zlgs3TnQUMCu{$Hb2QFo2F%m6P%qr zxt!&1NQa;Yh}i<|1m;lo><$C_4EYGWeJXo4PXPN=wx%v%pUR%iQQ+K_y@yW%=YEPP zp5IeIAN8k+WDQRP_2zON$Jf~1K%4b_htBu=3{da;`xVQxP}d*i)7Asj*{A%UoPfN# z6Is4v@YWr%e@NHPPF|6Hp^&-&b`I!G=rh}xq9CQHaR|E9RK?i}lS`fOS zOy}9gT!-O}>G$@>EXO5y^;^LNb$BmEfcj!4zXWgIkY9#3XUL=Q<~v4z&U6g8M?Y=X z$fbT9Xln;OyjFEZ(3t^}_GKT}vpo~=?$d7}@vZL_VE>1J_8;)w2rU6^*8dH)tD6Ms zy~|~&%kxn`1=M*y^5181F2fsR74Y7KkJP(i+*iRSZ~^G=esf%by3C=^G*D*_dEfQj(#BaFuFsLMLF z%>Z@QC0|{qdh0RIH4roQjMTji%%v^rxeg!oXpeesWP9F0r;mvHc?13;Xa#XU--TD- z1mb?a2Vc=w^4~;O*8w8d`|!rv1|rr6@app*Vtoj&KI-}iUR`ypkCBbF9Ym~K@alJf zi1i7)`iS)@ygFmWIe!Lkz2?z=i+T7CJ_p)7qtJbk>77-)q1*6hfVS#0@=o31FP^c^ z0)3`4Isw&g<&;S}i9XQDE bxzJ-7KM&fO@$;eX)n@^;5B$Xq*$e&w@1b99 literal 3912 zcmZve=~q={6o(HoIBU*R66BBr-pbTWQ$RGVNK_Ef2EEAzDd5uOV%mtAWs`mB59wpA z)u+~K^%vQ+YSr_cbM{(iVK3{)9^bv+z2ALaXk4&uVUjc?NwOmOmfx;b$%0g~G-*j` zZ{I*)X{J6>I&knQ?JJT-Nore}EKi!?7l6s~_>_9B>Y70dAVIPSECx%!BY5bqzL6jO zhEX)5SqfjjHC-v~A1RGbmd7fka;;Xrg{>u7hOJzmD9;R5Zq{dO6~t7(Joe0#C#NSW zwa~ACN&N?k`o+o0@E@qxX0I7(-GNS zts&!^kdmYoxO(x@PuY7^win9gQg*Mh`;@J@xZgU9`>n0G-+GGso#Dqp#8++yF5`R7 zqFuRYcZP~~W$kf(XG43OS2^~draI@^wJjq_=-jW)euU05s8CRX>_Ppz$_Q<&U z_-(oLah=8|bQ_Vq4`t)%@BF*MU%NVUuZLd`Z3BCWBfkMuSKm1jvN2sDZ%U=P&JFl) zhIfy-!oDT7C!OoCKMLQL$*Em=>pVH`R{zJawE=r&ypRz&S5w+&^V!1=CZ!$fU3kVK z+-ojtHvU?w-45N&Nu@hLoOdTYtE+=9Th9~V|6=XZD@p#1*t-$*3we*mg1i@AMc6wK zz2}hkX~!Yt5|VekiLci;+B)rn_at=%ZKJ*?Gga!l886>x^*j&hQf{RtW7-RQ8Q4l6 zoGWdu@Xm{}`+c;`sZN`-;y!IWA*oHBvJX`QXwT&XxojV`AI#-!4w{lf$j(amKbyavT=LMjT`itx|XD?81Y}Yw_t?x9@=6QZVw;lQ-Q19FGJC>KAuD{5q z?PZ|Oy5#?+d^bII_Fo0ga~m**XZKrp4QR9H=6^lcK~kOdy^-r03c4$~&RKG=ephpy_Z59D z!y9uK_&LwZMVs#{yNa+ zx6#iRrfwW`<$$E$q;=fM_q+w~KK+&v-}AiOEn*$AAI@R2$T#-0W{fcL1s`_1tV)MXBRYCxSism`hun=L7gSk9PCwb2s1fA-p~!=J6wV=W!2++4~q?ee9cqS9cu5zT5Eb zv-X(dPvF&efQWSmUVX&+6kc61)?H*{?E?|(GkEnS5V1ao&-7Uj?jfr)R@~_q@N>XC z+V4}lGyWye=6!_jt6Xni;`{g--uFmb@jjfN2mA#xmT#0k&X&}>bDwuMM?T*T->M=RIG7M*eT$-M _60 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _72 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _73 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); struct main0_out { @@ -69,6 +70,7 @@ struct main0_out float3 out_var_TEXCOORD1 [[user(locn1)]]; float3 out_var_TEXCOORD2 [[user(locn2)]]; uint out_var_TEXCOORD3 [[user(locn3)]]; + float out_var_TEXCOORD4 [[user(locn4)]]; float4 gl_Position [[position]]; }; @@ -80,15 +82,16 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _83 = float3(float((in.in_var_TEXCOORD0 >> 6u) & 31u), float((in.in_var_TEXCOORD0 >> 11u) & 255u), float((in.in_var_TEXCOORD0 >> 19u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _84 = float4(_83.x, _83.y, _83.z, _61.w); - float4 _96 = UniformBuffer_1.View * float4(_83, 1.0); - _84.w = _96.z; - out.gl_Position = UniformBuffer.Proj * _96; - out.out_var_TEXCOORD0 = _84; - out.out_var_TEXCOORD1 = _60[((in.in_var_TEXCOORD0 >> 1u) & 15u) - 1u]; - out.out_var_TEXCOORD2 = float3(float((in.in_var_TEXCOORD0 >> 24u) & 1u), float((in.in_var_TEXCOORD0 >> 25u) & 1u), float((in.in_var_TEXCOORD0 >> 26u) & 63u)); + float3 _96 = float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _97 = float4(_96.x, _96.y, _96.z, _74.w); + float4 _109 = UniformBuffer_1.View * float4(_96, 1.0); + _97.w = _109.z; + out.gl_Position = UniformBuffer.Proj * _109; + out.out_var_TEXCOORD0 = _97; + out.out_var_TEXCOORD1 = _72[((in.in_var_TEXCOORD0 >> 2u) & 15u) - 1u]; + out.out_var_TEXCOORD2 = float3(float((in.in_var_TEXCOORD0 >> 25u) & 1u), float((in.in_var_TEXCOORD0 >> 26u) & 1u), float((in.in_var_TEXCOORD0 >> 27u) & 31u)); out.out_var_TEXCOORD3 = in.in_var_TEXCOORD0; + out.out_var_TEXCOORD4 = _73[(in.in_var_TEXCOORD0 >> 0u) & 3u]; return out; } diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index d7dd1131c0ca7da6ddf369e774fec51bb5a47036..67e6ef36bea805b212044deba8ccf8d19405b030 100644 GIT binary patch literal 3344 zcmZ{m*>+S_5Qb0E9fA{6WKsxC5=BW2Q$!R=$Yg>d2@x>PiJC|g(j7B^I0m1b8z5P>9hCT^ZI(rC{CNz0=}LWddH(hqDwg)_apd~Fm4*K6wdx|S zk&VU0g;n#k{x`^6c0$PdnXde4{rv zYD?4gwd#7cZWF9)C-VR5vOm>Y|DE~O{%hm2qf=8eV<*kx+3i_%F6*U#{Q%Cpo#Z z=-1s4|FT(|J(^^nSl6hll=H|DvsTOzwqlO3MGkr7h&hWK_F0?$edxQ970^p9>U)4+ z@Q$2q4(-SPG`ef-X&)Vz?*+yP*GAkv^eo%_HP-Ei#X5aqKY(sr_`-e=o9mkG&m>#K z#QJBGJ!1A!?;&gz;AdU(!#Vqh#|(x42!4ALyn^m|gL}vJId~Vkcj12axB^;$et8e@ z3;rB>_^s!8;GU817`pct`~~zs3;acN`yT$|==LgjFShRmY0$C zS(`r39KN&3r_H>tAnm2=UF-a6GtaqX*Cu}zX@47cU(Q}b_x`Ly|M|qNTmE|DvHn8h zp2IT^BGr$A4k{SR^-^{bscwD4Nb7SSbB-XbRhxVi>5RmlW9a(hyyMC5KId6)Z+wqj zBex&EKfyh-cNE++tG58x$C<4sxOWiT9{7G1x$kFidt$x8?MdU`;Kq60NPh3%^Gzgf zullG|`y}vf@OSTT+!=K)oh4-vee7oJCE&a|qt2zj@fND^?%o7vsoI`}yYg>$=ge0DX11cQlo35jPEw zIDg*}cNJY<#Lb{LY>l_`9k{vn0DU#`4%0!EwF~^7Y&VkK_hTj1^)9;h zh?_+>?ih%;_t3Tbu0-7X=-MOh19anjYa;GLbnV6cK7wnXPX88sjBX9))91OJ`A>jn zx=-!$IpA9DQ{0O8I}g0$IpC~1pWA>l7zX) zyzBLMfS<^#ZyD%!zsONbc5}?o4cFCycKcNVQTqzIZ$`29FX7r_k5zQ{(H=crL${~L zLG*MTUAz5@8QDPB9&vZjjq3#wcNblIG43n4_K3TOZrn)_abKfrFV5CCaP2W$-=bTC z`SkgF-i5pbBKLRb<~|G}_xI@9E5KfjBYyzK>hqqx*G-_^y!O>zsh5%VT-}*;X4IWc UYf|@pabNZA$W8EwX*dV|0$OhC_5c6? literal 2964 zcmZ{l*>Y4>6oyY{Fp3C9WKa=136l~dI3S7)Az^!rYq-#WDBP%Hai{~Gq%Yp>l54or*`MWZN+J;erp{YHy{iWw|*t$T~d|HbRe z?T*R-qQ?+2j68yn3~sR07jYQo-=lDA*SnkR%lGaBVMdC_Shs%KSed%jX|H0svc0;x zvT2Ut(xzW)vwPQd7lLtGFm`w^x2lp4~g-d1A*rBZW4YeL*-rO&StqS?<~EUt?tTmh|SZ(L*@M*LH9Gxy6d{NsyiRrtxw&vtD8&R z{nWj~aU}lgV~C%2@1|~7*B*cCs@v7IyWbq0bEf;=xO5QvQ(%4U;Upba--j5Z=$p8w z!A0@lxA^Txi=Vde2f)U~7XBcde*OHRic3uVpQ-r7?5Eym;hKn_b*Vpxc!$vsgPj%q zpJ#0%v8!js^jCkOW>0>(vcO>WionkeYb8?8kldN*;N2=MAYr?$D>Wny#+B{QiQ0pX>(K7+gt~RBzh3G3?_-BISjX@<%PMyNH(A}^ zIAhMST8o_eTdcm9lzSAZ{S~=M3&2-JVA8{q{Yq zJ9DvnM(a!c=PTX&o1~kr?;y^N@5ndf`*3cY71z2n$Yeh+AZPh4vQO6PXW#y$`irdA z>R$ez=>8Xp6T8<1Z1&vQ@~qRm68m}?u@}AzML+vIja){$=+4*`L@seN;Kcb}5_c7> zEpgYta;@t3m?%Qun4wZQT@&ke9Om`|JMb}knX&-633tAC8>D?iUG z^geGQ-l;a{%m4E-N2%);oOSs-m%46)<&Pu3RK58GEU(`*oNr_i@&2`WKi2UnBCn6{ z<}<{%k-MJ+e_ru7@bT`yK&;U(+?QavMveQb;s#h-OrU4{8Zlmf?W4%AXm`Kl zT?Q{9=2)N``hA1Q+pj?+wSNoVh16^R4qZNbtbmsg`Sf%ZY)_9O>FM`idHa{Uz5|v| zTpMiMF(h$!!SeOEHFWvJ-2)qU0!iFDSpFoE{W@Uz%vKj{4d&D4d-nXEN$kwn8?m$F T-HM$dW5pw^?)?`xbq@Il)TPC^ diff --git a/shaders/bin/raycast.frag.json b/shaders/bin/raycast.frag.json index eaf0ba6b..ec4afe4f 100644 --- a/shaders/bin/raycast.frag.json +++ b/shaders/bin/raycast.frag.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0, "inputs": [], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }] } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0 } diff --git a/shaders/bin/raycast.vert.json b/shaders/bin/raycast.vert.json index cf07e95a..e362be20 100644 --- a/shaders/bin/raycast.vert.json +++ b/shaders/bin/raycast.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 2, "inputs": [], "outputs": [] } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 2 } diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index 43cafc9ebc3631599f84d445628b2a9566aa9405..8eb4b5ed9ef0ef347a2f0e35e96eab82a3aafa16 100644 GIT binary patch delta 730 zcmZ9JJx;?w5QW#V;DX{aNll;IE@ zf`S5x_ZhFWVx_k;@9mrQ&Un#Uv|d+gtHwO$nTbqd2eq_lnsUuYCN_!E4FS#JOwKj& zmY|h8-=+wf^Etg;>F&(wTb1{pUYOLoghN-bU0uWne7#d~G+*BlcV6_49-b-o1s09K zyCrkHFlJXm;2HLm*F3(jJoNa1^18wQr_@*PkCH%CfOH0mdh(1IIy#@7i9K5 zOq)!9D3lMipJ6KfE4OsdUb+dZ2b>w3#p~T<` zK+nK*Zmn{a$)(WrOwRb*+BbW~&vf>mU(1el2scebS0BU|*#558^lZNeZL;*c7_pC9 z0DL$Ib>1qYZ$cj)xhrzzMISGV@%90?v2tGWN|Bx)86hMaONCvuE>32+(?z)R<<39_26=M`BC zfY)P+W013Qk6p|anzQm0?z0w}vog> 6u) & 31u), float((in.in_var_TEXCOORD0 >> 11u) & 255u), float((in.in_var_TEXCOORD0 >> 19u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); - out.gl_ClipDistance[0u] = (((in.in_var_TEXCOORD0 >> 5u) & 1u) != 0u) ? 1.0 : (-1.0); + out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.gl_ClipDistance[0u] = (((in.in_var_TEXCOORD0 >> 6u) & 1u) != 0u) ? 1.0 : (-1.0); out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; } diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index 6cbc88c0ef57a6a15f7e9014664e381b3281cab6..1199569c798a39f21cf0ba477c73174c8d57cb06 100644 GIT binary patch delta 39 vcmZ1?utZ>k1T!Q1WJ%_DMxM!)%<_yPn`bhoGcgKnW@KB<$S6E{Eqgftze@?7 delta 39 ucmZ1?utZ>k1T!P+WJ%_DM()X#%<_!Fn`bhoGXW_^w$+S`LX+3BmjeL4=n0ts diff --git a/shaders/bin/sky.frag.json b/shaders/bin/sky.frag.json index 538fe1a6..ec4afe4f 100644 --- a/shaders/bin/sky.frag.json +++ b/shaders/bin/sky.frag.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float3", "location": 0 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }, { "name": "out.var.SV_Target3", "type": "uint", "location": 3 }] } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0 } diff --git a/shaders/bin/sky.vert.json b/shaders/bin/sky.vert.json index 58b61967..e362be20 100644 --- a/shaders/bin/sky.vert.json +++ b/shaders/bin/sky.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 2, "inputs": [], "outputs": [{ "name": "out.var.TEXCOORD0", "type": "float3", "location": 0 }] } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 2 } diff --git a/shaders/bin/ssao.comp.json b/shaders/bin/ssao.comp.json deleted file mode 100644 index 3831f975..00000000 --- a/shaders/bin/ssao.comp.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 0, "readonly_storage_textures": 2, "readonly_storage_buffers": 0, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 0, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } diff --git a/shaders/bin/ssao.comp.msl b/shaders/bin/ssao.comp.msl deleted file mode 100644 index 8c57461f..00000000 --- a/shaders/bin/ssao.comp.msl +++ /dev/null @@ -1,156 +0,0 @@ -#pragma clang diagnostic ignored "-Wmissing-prototypes" -#pragma clang diagnostic ignored "-Wmissing-braces" - -#include -#include - -using namespace metal; - -template -struct spvUnsafeArray -{ - T elements[Num ? Num : 1]; - - thread T& operator [] (size_t pos) thread - { - return elements[pos]; - } - constexpr const thread T& operator [] (size_t pos) const thread - { - return elements[pos]; - } - - device T& operator [] (size_t pos) device - { - return elements[pos]; - } - constexpr const device T& operator [] (size_t pos) const device - { - return elements[pos]; - } - - constexpr const constant T& operator [] (size_t pos) const constant - { - return elements[pos]; - } - - threadgroup T& operator [] (size_t pos) threadgroup - { - return elements[pos]; - } - constexpr const threadgroup T& operator [] (size_t pos) const threadgroup - { - return elements[pos]; - } -}; - -kernel void main0(texture2d voxelTexture [[texture(0)]], texture2d positionTexture [[texture(1)]], texture2d ssaoTexture [[texture(2)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) -{ - do - { - uint2 _62 = uint2(ssaoTexture.get_width(), ssaoTexture.get_height()); - uint _63 = _62.x; - uint _64 = _62.y; - bool _73; - if (gl_GlobalInvocationID.x < _63) - { - _73 = gl_GlobalInvocationID.y >= _64; - } - else - { - _73 = true; - } - if (_73) - { - break; - } - ssaoTexture.write(float4(0.0), uint2(gl_GlobalInvocationID.xy)); - uint4 _79 = voxelTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); - uint _80 = _79.x; - if ((_80 & 1u) == 0u) - { - break; - } - float2 _85 = float2(gl_GlobalInvocationID.xy); - float2 _88 = float2(float(_63), float(_64)); - float2 _89 = _85 / _88; - uint _92 = ((_80 >> 1u) & 15u) - 1u; - float4 _94 = positionTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); - float _97 = precise::max(abs(_94.w), 1.0); - float2 _100 = (float2(75.0) / _88) / float2(_97); - float _102; - _102 = 0.0; - spvUnsafeArray _57; - float _103; - for (int _105 = -2; _105 <= 2; _102 = _103, _105++) - { - _103 = _102; - float _111; - for (int _113 = -2; _113 <= 2; _103 = _111, _113++) - { - float2 _122 = _89 + (float2(float(_105), float(_113)) * _100); - uint2 _136 = uint2((_122 + (((fract(float2(sin(dot(_122, float2(127.09999847412109375, 311.70001220703125))) * 43758.546875, sin(dot(_122, float2(269.5, 183.3000030517578125))) * 43758.546875)) * 2.0) - float2(1.0)) * _100)) * _88); - bool _141; - if (_105 != 0) - { - _141 = _113 == 0; - } - else - { - _141 = true; - } - bool _149; - if (!_141) - { - _149 = _136.x >= _63; - } - else - { - _149 = true; - } - bool _155; - if (!_149) - { - _155 = _136.y >= _64; - } - else - { - _155 = true; - } - if (_155) - { - _111 = _103; - continue; - } - bool _193; - do - { - if ((voxelTexture.read(uint2(_136), 0u).x & 1u) == 0u) - { - _193 = false; - break; - } - float4 _171 = positionTexture.read(uint2(_136), 0u); - float _172 = _171.z; - float _173 = _94.z; - _57[0] = _172 - _173; - _57[1] = _173 - _172; - float _178 = _171.x; - float _179 = _94.x; - _57[2] = _178 - _179; - _57[3] = _179 - _178; - float _184 = _171.y; - float _185 = _94.y; - _57[4] = _184 - _185; - _57[5] = _185 - _184; - _193 = _57[_92] > 0.0500000007450580596923828125; - break; - } while(false); - _111 = _103 + (float(_193) / precise::max(distance(_85, float2(_136)), 1.0)); - } - } - ssaoTexture.write(float4(_102 / _97), uint2(gl_GlobalInvocationID.xy)); - break; - } while(false); -} - diff --git a/shaders/bin/ssao.comp.spv b/shaders/bin/ssao.comp.spv deleted file mode 100644 index c02ba6650b078124e0d0a94457d821312f8388f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4484 zcmaKu`J0br6o=pJ+t|n0s*!zYim@gPQ%%bhLaBs_!N{0lhG-o`Dru977VVaj(yC2b z{E|PQf1=;oujszNo}+1U^|(IH=d90p&ilOYcUra>*fz_~%d)IRYcJ$*&Y&y+5z`wUHSDnuaIOXP&==`B?Rg~A zRqqEpr-&NP|J3Qzr`7G_eBjyC&A$MYl$@F#`i1Dbf80|RH49UW_J|n(&yH;^3*F~( zvSR$%oPp@ZXpfjd@a;bpm4`kUomCq93_)?mqA1N`DBO6@J`8x@Lmv+JPW9ntX!mT+ z%6Y_6cNG#*bcW_)&GA`y{{PDvk#dYR$M@k}IqvC9-Df1yWvtKXVx+zK-1HYC-BWuH zy1fKB0IwehxjCbd?&G=4@q6O?piO@X(wgq8J|^kL_eUR#G}b$3{y3!h+9#nGA)TE| z-E-=9se1DHvykp=r_Yl!A$lwejYGJ`?h4e1#TUE$5YR@!lUOn$8FfO`~BRM;^xD( zdp76gcj9*7U3XrikPDKn`Mm6RVe)%#I+3ky5%3u~d;OiLqrDPnx35K@D~L1P0q+Mq zL!5On+#C^cOW?-pbEZ{DXRP%8xzAGI9dORez;d834_OWR1AQxiz9Y=SdwVC)@9*d@ zbiWd*-{o`FUjwwer`#S^C0!XkxUYQ}Qw!=q^spLk5Bk;sebGZbTz~Y?ko<^T5Bk>v z?e-wAr8m#L4%mO_cfqX{^IQ)%M*Eg@cQ(MaJJ*fLb~oHRrEe!TYu^L37lL@s_riUi zc|gB4jlB=(8w4W%ez^GqLF7LGk9_@+-w4-de)PT(Zrw&;eqZD!V7`0m-;w&?4A(ap zY)-ZZb3Dt2Ami*?;M$jfIQv$(ed>$2hv3@1n>Eb31i1}pKS+J=&cndj=L5e7k04#% z8-0%gZ9X%3d`Gs!eMaVamm)^#eX;gqpaA%+jW>TEb@lB4`a^%bnf^r5?deIl%bv79 z1+>|dJidWX!#$rXzWY1j+NT2hj67xZ`3&4X?cI25Mqj(&`t9Rcq{}|EKL@nghdlat z9&R5#Orc+O<09uU+<5aM=RLSNy@5IE#>L+6!|lfv zwj*%+aYgM9;Ku5U+8@HL?f2N)>c&ORM{wiKi=2<)=JWyPs2dl1e*(83?@8D`h1-v| zsC^V}tiGuI8Qj{#fVI_)i=5Bl#+w&8U%<^74$M(EF8p7@_0I=BZ=cOqK>JaiOE2Ux zpsgcldPlq~@!ow69}2uj$AI@|fBKu?I9$K)Ll@xhx%+$r^z8*3lkHphGN7;NJ6VVB zUgp&TV|;Iow~t2h^N?%6YT$h^e-+aE+>rF;NmoYB3V1b$oT?PF5*fXI2VV**fpcny b{2sIii`iRV0gQ9G_avlyEC1r@P5^%c5Y&_~ diff --git a/shaders/bin/transparent.frag.json b/shaders/bin/transparent.frag.json index 70f10ee9..491809cd 100644 --- a/shaders/bin/transparent.frag.json +++ b/shaders/bin/transparent.frag.json @@ -1 +1 @@ -{ "samplers": 3, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 3, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float4", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "float3", "location": 1 }, { "name": "in.var.TEXCOORD2", "type": "float3", "location": 2 }, { "name": "in.var.TEXCOORD3", "type": "uint", "location": 3 }, { "name": "in.var.TEXCOORD4", "type": "float2", "location": 4 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }] } +{ "samplers": 3, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 3 } diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index 773a2de2..8a7cb7c9 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -48,120 +48,120 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(3)]], texture2d_array atlasTexture [[texture(0)]], texture2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - float4 _108 = atlasTexture.sample(atlasSampler, in.in_var_TEXCOORD2.xy, uint(rint(in.in_var_TEXCOORD2.z))); - float _110 = _108.w; - uint _113 = uint(UniformBuffer.LightCount); - float3 _115; - _115 = float3(0.0); + float4 _109 = atlasTexture.sample(atlasSampler, in.in_var_TEXCOORD2.xy, uint(rint(in.in_var_TEXCOORD2.z))); + float _111 = _109.w; + uint _114 = uint(UniformBuffer.LightCount); float3 _116; - for (uint _118 = 0u; _118 < _113; _115 = _116, _118++) + _116 = float3(0.0); + float3 _117; + for (uint _119 = 0u; _119 < _114; _116 = _117, _119++) { - float _131 = float((lightBuffer._m0[_118].Color & 4278190080u) >> 24u); - float3 _138 = (float3(float(lightBuffer._m0[_118].X), float(lightBuffer._m0[_118].Y), float(lightBuffer._m0[_118].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _139 = length(_138); - bool _144; - if ((isunordered(_139, _131) || _139 < _131)) + float _132 = float((lightBuffer._m0[_119].Color & 4278190080u) >> 24u); + float3 _139 = (float3(float(lightBuffer._m0[_119].X), float(lightBuffer._m0[_119].Y), float(lightBuffer._m0[_119].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _140 = length(_139); + bool _146; + if (!(_140 >= _132)) { - _144 = _131 <= 0.0; + _146 = _132 <= 0.0; } else { - _144 = true; + _146 = true; } - if (_144) + if (_146) { - _116 = _115; + _117 = _116; continue; } - float _150 = fast::clamp(dot(in.in_var_TEXCOORD1, _138 / float3(_139)), 0.0, 1.0); - if (_150 <= 0.0) + float _152 = fast::clamp(dot(in.in_var_TEXCOORD1, _139 / float3(_140)), 0.0, 1.0); + if (_152 <= 0.0) { - _116 = _115; + _117 = _116; continue; } - float _156 = fast::clamp(1.0 - (_139 / _131), 0.0, 1.0); - _116 = _115 + ((float3(float(lightBuffer._m0[_118].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_118].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_118].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _150) * (_156 * _156)); + float _158 = fast::clamp(1.0 - (_140 / _132), 0.0, 1.0); + _117 = _116 + ((float3(float((lightBuffer._m0[_119].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_119].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_119].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _152) * (_158 * _158)); } - float _235; + float _240; do { - float4 _184 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _188 = _184.xyz / float3(_184.w); - float2 _191 = (_188.xy * 0.5) + float2(0.5); - float _193 = 1.0 - _191.y; - float2 _194 = _191; - _194.y = _193; - float _195 = _191.x; - bool _200; - if ((isunordered(_195, 0.0) || _195 >= 0.0)) + float4 _187 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _191 = _187.xyz / float3(_187.w); + float2 _194 = (_191.xy * 0.5) + float2(0.5); + float _196 = 1.0 - _194.y; + float2 _197 = _194; + _197.y = _196; + float _198 = _194.x; + bool _204; + if (!(_198 < 0.0)) { - _200 = _195 > 1.0; + _204 = _198 > 1.0; } else { - _200 = true; + _204 = true; } - bool _205; - if (!_200) + bool _209; + if (!_204) { - _205 = _193 < 0.0; + _209 = _196 < 0.0; } else { - _205 = true; + _209 = true; } - bool _210; - if (!_205) + bool _214; + if (!_209) { - _210 = _193 > 1.0; + _214 = _196 > 1.0; } else { - _210 = true; + _214 = true; } - if (_210) + if (_214) { - _235 = 0.4000000059604644775390625; + _240 = 0.4000000059604644775390625; break; } - float _224; - if ((in.in_var_TEXCOORD3 & 1u) != 0u) + float _229; + if (((in.in_var_TEXCOORD3 >> 6u) & 1u) != 0u) { - float _220 = dot(in.in_var_TEXCOORD1, fast::normalize(float4(UniformBuffer_1.ShadowTransform[0][2], UniformBuffer_1.ShadowTransform[1][2], UniformBuffer_1.ShadowTransform[2][2], UniformBuffer_1.ShadowTransform[3][2]).xyz)); - if (_220 > 0.0) + float _225 = dot(in.in_var_TEXCOORD1, fast::normalize(float4(UniformBuffer_1.ShadowTransform[0][2], UniformBuffer_1.ShadowTransform[1][2], UniformBuffer_1.ShadowTransform[2][2], UniformBuffer_1.ShadowTransform[3][2]).xyz)); + if (_225 > 0.0) { - _235 = 0.0; + _240 = 0.0; break; } - _224 = _220; + _229 = _225; } else { - _224 = -0.7070000171661376953125; + _229 = -0.7070000171661376953125; } - if (_188.z < (shadowTexture.sample(shadowSampler, _194, level(0.0)).x + 0.001000000047497451305389404296875)) + if (_191.z < (shadowTexture.sample(shadowSampler, _197, level(0.0)).x + 0.001000000047497451305389404296875)) { - _235 = _224 * (-0.4000000059604644775390625); + _240 = _229 * (-0.4000000059604644775390625); break; } else { - _235 = 0.0; + _240 = 0.0; break; } break; // unreachable workaround } while(false); - float3 _239 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _271; - if (((in.in_var_TEXCOORD3 >> 26u) & 63u) == 16u) + float3 _244 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _276; + if (((in.in_var_TEXCOORD3 >> 27u) & 31u) == 16u) { - _271 = _110 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD4).y) * 0.100000001490116119384765625); + _276 = _111 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD4).y) * 0.100000001490116119384765625); } else { - _271 = _110; + _276 = _111; } - out.out_var_SV_Target0 = float4(mix(_108.xyz * (((_115 * 2.0) + float3(0.5)) + float3(_235)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_239.y, length(float2(_239.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _271); + out.out_var_SV_Target0 = float4(mix(_109.xyz * (((_116 * 2.0) + float3(0.5)) + float3(_240)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_244.y, length(float2(_244.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _276); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 075d2f7f40c6b59bf145485f6cd4a476b024940f..c1fcfd081863f20435659cfd112ff0a819710bec 100644 GIT binary patch literal 7404 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 literal 7316 zcmZ{n37pkc703TG!wk!?@1WuvP?5zE*+hvQgpit%K{nT?GYnI+(3^)!Sq+hCn_1bu znQf-2WMyimMvGb4zT0BizAvJp5q-b!{m=6+AH4A6obx;9-h1x7=idLLrg}>MB&kZ0 zWN0!`K^u`&mzesbt|V8lYgyOWTWoEdJ8zc$p-GLRbVD`}QI^^h-t&Q?}f*+L8^G ztmx_Nabb07j7PLNW4oVQGPZla71Z))G_unf%Co`rPsYHNayhrVV_Q$5D|In`UCD>L zoX3iuo!!Oq{)~k?BD^%#xaS?Kf1=OUQr_1>zPs1y=vSAFhdpobYNBB;IDy_@9Ji<3SeAe?3 zzB%Euu8;7|4WISjv$I%Are)(r8}fzrwj$Yh_Sw5*ZpRQ?+J|yorx&7}+p*8%Tg`oP zP1dryd6xBlSV=Mo*j5u|oVK;3?RvG%L)*UE_S1G<+V<0SE!sA1@8@I?{k0o_O~3as z>(|cu%`@xQ)*tzK53_#ltl#^X^=s>|2F~xj%=)#ne(y=vudP4UZ~g1f+WKvdZ#`%I z+WM_GQ%k%Ut8AtpH@QzuN@t=rJTQZZK(|;0>3&cEA z;cQ`_j9vxIYZ@|_+WNJp16$ZL(2XC>N@pUck%jUUV2pV+0@~8Zf5 z!}bC5Jj3?UI-Idf4;4iCeVnYLu;-!ML)$#&gNOI;U+kWpjxOi<%;dba7l7>k=syEI zerWFfF~*tLSC8GYIP8Vk8y;J=B zeb$|GD&s7}wvTa3L5#B;ol{z>okLpzypLh8M7PfbzT5sLaZR3=>sH!A<``pDnJUFj zB+B0;@@J*IwqyC*BRf{=e$H5{Q?eXeS9%w6aMn@aIO@gw?VB+P-FvI;oNJKgDW}gn zYd?K2MCz0CJl7)4$GbV6f6qqBY1`NPEN9_>(@w4@Q%GuR5^ z?wp6tdvIUa=VR|Vcw^-bUVzOTy)gV2mg5(NeGzt&EUnzpi?Mt^|>n1-OMF_4bXQnh;x5EdTRPL$<;_T&=b`UfAm@3g-<$S(3%Y$K1M4JWl-7b{Uk6SBo}=;hcaFCrZO&oL z+kl*Ns5_o@p)DVK^mcS}4P2A1_j)+jr2l$2*ZU6OUDY?3`y%&F;2z8X`pta`h&8-u`|&CCUZ5{~9@ftR zUR=j20%NQ#rDtb9&#aI6a!B7Q-<6Yr;}npdvu{z%e=EBE8-ef75aexOXlmCZZwJGG z@9jq9UN9a^2lhD|`Dq|;jopE?J%c_K`5EB6%6P{=i{1)s!F>*0t}4UbnR3<0X71ox z{$8)N?_@;M#( zMIgTw*zDu}>bnov{9+yAQ}mZ1n$f$|3NT z-@&h-%TETL%U6*$@4mjT0Xfe`{hqYngXs2iZtEsul<^LJ9o=`(Gd14+H!-enHe zbAAJ9b58kh0y*bYzbl<{Kf3EOSLcivWz6|7x^tR`@%E27zlE;fIlqmxIj8)0fShxx z$2z}@9((MZ5u=PbzlZLe=3%`3o#XpRn{ycR10d%d>W=3<(3ba{)*^ohtW9ewYVJoV zug_Km^!uGV0r}&UTZJ?>-oKxqw*&9@E$Ke~6kXnXXP!Sp+RRhmBS6l))Z^RobM!Xg zT(LjDK$nmD`6ar|vGn~4$T^mJcFpqIF_+RkorHW8oB`Yy$2T_W_}A#(CD-ro$77Md z0lrDMgU#t1@L0<4LmE37#2CLt*KhOAIp^F~IZgXp3kUdhY%YHR^MQ3@-tL{!IULKeqc;AE-kJhYsSV%a zP1t_}6Tx)gTWr1j9mvOTr+=V3j(qIVKhfo_wc!4ha)=7|@04?oo0-!$=s&<%eeqlD zadgL84)hOB&-y^hPe3}Sad9S3pzGfPVlSUWmp>oGTm2Nee8ArtuJa&p&PK2dECR;H zyZkhIcJEw6_?|&`KZH$R=DSg zSN*Y#k&pkE4M3OQPMpm;y97B9t_C>+IG%Mp2u?ogrykw@{H=V$24fhfFZOT> 6u) & 31u), float((in.in_var_TEXCOORD0 >> 11u) & 255u), float((in.in_var_TEXCOORD0 >> 19u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float3 _88 = float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); float4 _89 = float4(_88.x, _88.y, _88.z, _66.w); float4 _101 = UniformBuffer_1.View * float4(_88, 1.0); _89.w = _101.z; @@ -90,8 +90,8 @@ vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& Un _122.y = 1.0 - _122.y; out.gl_Position = _106; out.out_var_TEXCOORD0 = _89; - out.out_var_TEXCOORD1 = _65[((in.in_var_TEXCOORD0 >> 1u) & 15u) - 1u]; - out.out_var_TEXCOORD2 = float3(float((in.in_var_TEXCOORD0 >> 24u) & 1u), float((in.in_var_TEXCOORD0 >> 25u) & 1u), float((in.in_var_TEXCOORD0 >> 26u) & 63u)); + out.out_var_TEXCOORD1 = _65[((in.in_var_TEXCOORD0 >> 2u) & 15u) - 1u]; + out.out_var_TEXCOORD2 = float3(float((in.in_var_TEXCOORD0 >> 25u) & 1u), float((in.in_var_TEXCOORD0 >> 26u) & 1u), float((in.in_var_TEXCOORD0 >> 27u) & 31u)); out.out_var_TEXCOORD3 = in.in_var_TEXCOORD0; out.out_var_TEXCOORD4 = _122; return out; diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index ed61eae9e0dd3fb032f11bbc74d91f60ee426fc8..2d8d30ca72b4a89e7e7ce8ceba3d34165e7aa6ef 100644 GIT binary patch delta 481 zcmYk2ze>YU6vpq7CMHdaLJU$XBr#2DO`&wk)F+S%QrAw74x&*1Eh1f<3UX#2z^%na za29<9LAN^k4EmjzU;@9K?>pz*d(XX#`l3F2s$4HAr4m(9n}{A*1}?mhC=igk=m5x9 z_$_FuucIC!t^(PwqqNL7p&L2H84sY2c#VMXE2s1qgZ1mM&NJ!7q|-Io$vN diff --git a/shaders/bin/ui.comp.msl b/shaders/bin/ui.comp.msl index 29daf19e..a7601676 100644 --- a/shaders/bin/ui.comp.msl +++ b/shaders/bin/ui.comp.msl @@ -23,142 +23,142 @@ kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], cons do { uint2 _59 = uint2(colorTexture.get_width(), colorTexture.get_height()); - bool _70; - if (gl_GlobalInvocationID.x < _59.x) + bool _71; + if (!(gl_GlobalInvocationID.x >= _59.x)) { - _70 = gl_GlobalInvocationID.y >= _59.y; + _71 = gl_GlobalInvocationID.y >= _59.y; } else { - _70 = true; + _71 = true; } - if (_70) + if (_71) { break; } - float2 _75 = float2(UniformBuffer.Viewport); - float2 _76 = _75 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); - float _79 = precise::max(_76.x, _76.y); - float _80 = 50.0 * _79; - float _81 = 10.0 * _79; - float2 _84 = float2(_81) + float2(_80); - float _85 = float(gl_GlobalInvocationID.x); - float _92 = float(uint(UniformBuffer.Viewport.y) - gl_GlobalInvocationID.y); - bool _98; - if (_85 > _81) + float2 _76 = float2(UniformBuffer.Viewport); + float2 _77 = _76 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); + float _80 = precise::max(_77.x, _77.y); + float _81 = 50.0 * _80; + float _82 = 10.0 * _80; + float2 _85 = float2(_82) + float2(_81); + float _86 = float(gl_GlobalInvocationID.x); + float _93 = float(uint(UniformBuffer.Viewport.y) - gl_GlobalInvocationID.y); + bool _99; + if (_86 > _82) { - _98 = _85 < _84.x; + _99 = _86 < _85.x; } else { - _98 = false; + _99 = false; } - bool _102; - if (_98) + bool _103; + if (_99) { - _102 = _92 > _81; + _103 = _93 > _82; } else { - _102 = false; + _103 = false; } - bool _107; - if (_102) + bool _108; + if (_103) { - _107 = _92 < _84.y; + _108 = _93 < _85.y; } else { - _107 = false; + _108 = false; } - if (_107) + if (_108) { - float3 _120 = float3((_85 - _81) / _80, 1.0 - ((_92 - _81) / _80), float(UniformBuffer_1.Index)); - float4 _122 = atlasTexture.sample(atlasSampler, _120.xy, uint(rint(_120.z)), level(0.0)); - float _123 = _122.w; - if (_123 > 0.001000000047497451305389404296875) + float3 _121 = float3((_86 - _82) / _81, 1.0 - ((_93 - _82) / _81), float(UniformBuffer_1.Index)); + float4 _123 = atlasTexture.sample(atlasSampler, _121.xy, uint(rint(_121.z)), level(0.0)); + float _124 = _123.w; + if (_124 > 0.001000000047497451305389404296875) { spvImageFence(colorTexture); - float4 _129 = colorTexture.read(uint2(gl_GlobalInvocationID.xy)); - float _130 = fast::clamp(_123, 0.0, 1.0); - float _135 = 1.0 - _130; - colorTexture.write(float4((_122.xyz * _130) + (_129.xyz * _135), _130 + (_129.w * _135)), uint2(gl_GlobalInvocationID.xy)); + float4 _130 = colorTexture.read(uint2(gl_GlobalInvocationID.xy)); + float _131 = fast::clamp(_124, 0.0, 1.0); + float _136 = 1.0 - _131; + colorTexture.write(float4((_123.xyz * _131) + (_130.xyz * _136), _131 + (_130.w * _136)), uint2(gl_GlobalInvocationID.xy)); break; } } - float _145 = 8.0 * _79; - float _146 = 2.0 * _79; - float2 _147 = _75 * 0.5; - float2 _148 = float2(_145, _146); - float2 _149 = _147 - _148; - float2 _150 = _147 + _148; - float2 _151 = float2(_146, _145); - float2 _152 = _147 - _151; - float2 _153 = _147 + _151; - bool _160; - if (_85 > _149.x) + float _146 = 8.0 * _80; + float _147 = 2.0 * _80; + float2 _148 = _76 * 0.5; + float2 _149 = float2(_146, _147); + float2 _150 = _148 - _149; + float2 _151 = _148 + _149; + float2 _152 = float2(_147, _146); + float2 _153 = _148 - _152; + float2 _154 = _148 + _152; + bool _161; + if (_86 > _150.x) { - _160 = _92 > _149.y; + _161 = _93 > _150.y; } else { - _160 = false; + _161 = false; } - bool _165; - if (_160) + bool _166; + if (_161) { - _165 = _85 < _150.x; + _166 = _86 < _151.x; } else { - _165 = false; + _166 = false; } - bool _170; - if (_165) + bool _171; + if (_166) { - _170 = _92 < _150.y; + _171 = _93 < _151.y; } else { - _170 = false; + _171 = false; } - bool _191; - if (!_170) + bool _192; + if (!_171) { - bool _180; - if (_85 > _152.x) + bool _181; + if (_86 > _153.x) { - _180 = _92 > _152.y; + _181 = _93 > _153.y; } else { - _180 = false; + _181 = false; } - bool _185; - if (_180) + bool _186; + if (_181) { - _185 = _85 < _153.x; + _186 = _86 < _154.x; } else { - _185 = false; + _186 = false; } - bool _190; - if (_185) + bool _191; + if (_186) { - _190 = _92 < _153.y; + _191 = _93 < _154.y; } else { - _190 = false; + _191 = false; } - _191 = _190; + _192 = _191; } else { - _191 = true; + _192 = true; } - if (_191) + if (_192) { colorTexture.write(float4(1.0), uint2(gl_GlobalInvocationID.xy)); break; diff --git a/shaders/bin/ui.comp.spv b/shaders/bin/ui.comp.spv index 2f331a871aea2252a738a34267421181eab598f9..fa4614ecfbac71ae8d2e608afa7247957e8b9fd5 100644 GIT binary patch literal 4728 zcmZ9OXLnUq5QYyS5Rl%bCt#xmM4CZ_U)KkH+dEsA?`UqeOJDxe=UU&=w6mkVvs>L-1CXbL z!&hVj;q%_7INhB-*UGlWrd>$u3__j~3SWNG`C4}{ae3Y18KlF@vN~ctf9IJ1v_0=B zz!i2?(adent<i3-Vdw=F@m-_9czbyH+Oa1Pt)UU1IdMlVN&U7latBxJWSxkB0|7c=|AS=NPW>X&u+K2C}8HMfps|5DauRR>NMp9t}avC+1BSFNBLN{j&Iir!* zwO{lYgU)oz!#+K?D{H5xT4S-pH!k<}EDd{nZvXH1o>;ZvpIEe)g*~ZgFLjp5=+5Hr zW+v}IyAs%=6l1w1V~lkl&aQNYtR$kUNaeBPi1N23KPBF{9zgE{T8|M>}+&v$XWNC?TJzRAlI-%c&>w?1+E$s!Av@reJpRf+S=2Qt5L z4M1CIjxpBNw;K4Z(-+)T=zj0y8dCo?=<*`Cwdm%HJt=M-y0Q8?*o!^Z1Mjnzug`4c z)gbmCcQXubL-O50p6}wC#KnDHi+$>SUI!j2oEY!(2H;HY#e2LF z>GB@+Z31%Mn|hpg0p0z%j-^_g(XFM=`;I(iyq_)TV}WnL_)WmRjYyY$jcEdM_EnF0 zo6+5a^V%a~l+j}=x;^Y`y!rOnhIHA(m=+*s5B1pFP3Z2;cM^NM8Qs46>>GK?=(`== zzRqI2HSODqblKOKHXvtT^?jV5Z=)T=T^vYUN8)`~5qArEoI%8O!pR%w@4Fn?1^Ohr zFR~j{fT*(r-G4{T^-WYjy+Yw4T28)EbPu4LE~+ zH_&-9@^&C^P8k>v;@s~**WVk&ecy>LKNNVDcOhM#rM|m?oM)-NiaxWDJz!x1BEL)b z(+_$C!54yR|yNVpoVn1*X!ezeuJjj{o zzZV!|?Z~+g-8#Y*IdM-1;OuKo)VUwsJbiv|to;D6zP|W=J&5j{5$C=h0@l(OdwCe$ zd{=M>(dC>cxJMG_o*L4fK8kL>@%pVFXZ;wuXT60P)q8;PuF`)KyhH6)q<5)|Jv@#+ z0W_3wPoPgsoM$o`{Yg*{CgpsQdkWor<2_H~o(9J1i*NNaC0u;dpM^8e{K$PS#p#RO z=S#Rarx)Pte2-p5 z_j}}79s<_1?`uexeT{h?$k|st`o4kgxwzsx_$Io0&}ZMsQ%2vn(CzCi##__AZzEmy zHRdpov#)yeeFxpX?l=0ri|&5)**Ef((f2)c`#Ov9){OsWdLLcCb9{hwIfwiaAm<$F zF~^7K-nT2x{Udbuug_W^BVE?g_X&`*mU`6s6x~{-cla5$d(!8gB2O86`W)RoIhXO) zwC_=*%f7~Z0p#qf9(|9Y`#xQ9mS3W~2YvR9JZ1Dfj&5IPG2WW?{R-)_uQ6W(Is2+d z-*3?ETY87zV!K~`_KiGc^!*OqzRqI2HI0q?QAX?u^pU_fV4iiH@q47p8BZX80CLW# o9{)!Ch`ulZk~bll9K+ zB`a31sO#$9Qa5wfbmOYC3PtYgPfRcLa?o06Zj;wL0A6k&I3vMo75p=PJeG4apH>6g{AVIJx3{!+o|eBVJ1gSXwlz1kceXCx-qd83-u%<&Sl8URqocjETislJ zkUhfTtFpfEdF>ufSEtXhtZhrorF0j2Isx0UgcZn{ zPk-!Fsb5b2Fk<^7YrtfBQy&1@2ko0T6x;h(1FWTAdk}C8A;VzgL~_Wyp*iBTW^F-3b(*kgc_H zA7kzH9Hjeg?Xl@h<%~Ty@t(8ibY9N$hhePeTjVOU^U=*AXWk2v&wFmJiO4b_KbXi# z$XaqtMyfk!3ex_aqdgUAe)F26F6q(Vv}70WPi5xAXRLEZk;U)Nb>zjo%pSflegIDVwdGy2_ih>RKE#^6gI6WKom`&h^2F_Dj`oVgdCu;qcl+wZBmU#ANn9DSFZ~<0 z5@sBXFL4)ZdW!lf-zQHvxNcEuQ1e zNQdXB?-n5Exv9r~Z$x)}juR=5 zc5h@Cr~;9v8{OYc=X$TEBe#QoAihWM(H)78JG3Kl4cuXWTXq8bG@rh8=W*B~6ucbx~> z6aD*vG3Jgr51^YzIATtm(}Qr?gQ`iE~X2=}aF-cfRrZ%^!RH1iE{@nI6^MW8)pAzX_h9b_>$8RK^;f zL>~=SmT*s@k4c<+;_t%KU^y5I;$40Q-TB75pT<24jMW!!^>Za$%zYltdCrfyFQhnq zG51gj7yI-goOK*=mtR8n`_|`Oei`ZTF6(;*$hm&?$n`3^xjcu+^&0vHpwE4adCGW? z4x{@XxtGS9)4H!C9o9XJd;`c?S3T;!iSE8Q;vIYo-8Ja5Zp>3g-M7)LYcIx|)4J~< z9o9AGT_9&&^{9IU-MVEU>b{5Wdi7a1<|(7@`{>rS7vs%&gj$1<9{~OK@gdS-AMzgo zIr~tLK8~V$-j3M!kI`MfK64#II?Sc-6Ch_U^~m)py186a9(BJ&KLi}HmnYC&gFfrVJZ04V3f;Q)V!S!6dlKoet}$N& zIqRxN-EYvXTY84yV!K{_){S|}sQVqdb?wD?a~d1xqm0<^(T4! inputTexture : register(t0, space0); -[[vk::image_format("r8")]] -RWTexture2D outputTexture : register(u0, space1); - -static const int kKernel = 2; - -[numthreads(8, 8, 1)] -void main(uint3 threadID : SV_DispatchThreadID) -{ - uint width; - uint height; - outputTexture.GetDimensions(width, height); - if (threadID.x >= width || threadID.y >= height) - { - return; - } - int kernel = kKernel; - float value = 0.0f; - for (int y = -kernel; y <= kernel; y++) - { - int yy = clamp(threadID.y + y, 0, height - 1); - for (int x = -kernel; x <= kernel; x++) - { - int xx = clamp(threadID.x + x, 0, width - 1); - value += inputTexture[uint2(xx, yy)]; - } - } - kernel = kKernel * 2 + 1; - kernel *= kernel; - outputTexture[threadID.xy] = value / kernel; -} diff --git a/shaders/composite.comp b/shaders/composite.comp index 5beba308..2c2cb257 100644 --- a/shaders/composite.comp +++ b/shaders/composite.comp @@ -4,9 +4,8 @@ Texture2D shadowTexture : register(t0, space0); SamplerState shadowSampler : register(s0, space0); Texture2D colorTexture : register(t1, space0); Texture2D lightTexture : register(t2, space0); -Texture2D ssaoTexture : register(t3, space0); -Texture2D voxelTexture : register(t4, space0); -Texture2D positionTexture : register(t5, space0); +Texture2D voxelTexture : register(t3, space0); +Texture2D positionTexture : register(t4, space0); [[vk::image_format("rgba8")]] RWTexture2D compositeTexture : register(u0, space1); @@ -20,8 +19,6 @@ cbuffer UniformBuffer : register(b1, space2) float3 PlayerPosition; }; -static const float kSSAO = 2.0f; - [numthreads(8, 8, 1)] void main(uint3 threadID : SV_DispatchThreadID) { @@ -39,19 +36,15 @@ void main(uint3 threadID : SV_DispatchThreadID) float3 diffuse = lightTexture[threadID.xy].rgb; float3 ambient = GetAmbientLight(); float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, position, normal, voxel); - float ssao = ssaoTexture[threadID.xy] * kSSAO; + float ao = colorTexture[threadID.xy].a; float3 color; - if (GetOcclusion(voxel)) - { - color = albedo * (diffuse + ambient + sun - ssao); - } - else if (IsCloud(albedo) || IsSky(voxel)) + if (IsCloud(albedo) || IsSky(voxel)) { color = albedo; } else { - color = albedo * (diffuse + ambient + sun); + color = albedo * (diffuse + ambient * ao + sun); } if (!IsSky(voxel)) { diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 6fb4c753..1f901acf 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -15,6 +15,7 @@ struct Input nointerpolation float3 Normal : TEXCOORD1; float3 Texcoord : TEXCOORD2; nointerpolation uint Voxel : TEXCOORD3; + float AO : TEXCOORD4; }; struct Output @@ -37,8 +38,9 @@ Output main(Input input) discard; return output; } - output.Voxel |= input.Voxel & (OCCLUSION_MASK << OCCLUSION_OFFSET); + output.Color.a = input.AO; output.Voxel |= input.Voxel & (DIRECTION_MASK << DIRECTION_OFFSET); + output.Voxel |= input.Voxel & (SHADOW_MASK << SHADOW_OFFSET); output.Light.rgb = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, input.Normal); return output; } diff --git a/shaders/opaque.vert b/shaders/opaque.vert index bc0f6243..5c8699eb 100644 --- a/shaders/opaque.vert +++ b/shaders/opaque.vert @@ -27,6 +27,7 @@ struct Output nointerpolation float3 Normal : TEXCOORD1; float3 Texcoord : TEXCOORD2; nointerpolation uint Voxel : TEXCOORD3; + float AO : TEXCOORD4; }; Output main(Input input) @@ -40,5 +41,6 @@ Output main(Input input) output.Position = mul(Proj, output.Position); output.Texcoord = GetTexcoord(input.Voxel); output.Voxel = input.Voxel; + output.AO = GetAO(input.Voxel); return output; } diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index d6af8862..1d8b1ca8 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -53,9 +53,10 @@ static const uint kCubeIndices[36] = 4, 5, 1, 4, 1, 0 }; -bool GetOcclusion(uint voxel) +float GetAO(uint voxel) { - return (voxel >> OCCLUSION_OFFSET) & OCCLUSION_MASK; + static const float kAO[4] = {0.4f, 0.6f, 0.8f, 1.0f}; + return kAO[(voxel >> AO_OFFSET) & AO_MASK]; } uint GetDirection(uint voxel) @@ -165,7 +166,7 @@ float GetSunLight(Texture2D texture, SamplerState state, float4x4 transfo } float3 direction = normalize(float3(transform[2].xyz)); float ratio = -0.707f; - if (GetOcclusion(voxel)) + if (GetShadow(voxel)) { ratio = dot(normal, direction); if (ratio > 0.0f) @@ -205,24 +206,4 @@ float3 GetSkyColor(float3 position) return lerp(kBottom, kTop, alpha); } -float2 GetRandom2(float2 position) -{ - float2 k1 = float2(127.1f, 311.7f); - float2 k2 = float2(269.5f, 183.3f); - float n = sin(dot(position, k1)) * 43758.5453f; - float m = sin(dot(position, k2)) * 43758.5453f; - float2 r = frac(float2(n, m)); - return r * 2.0f - 1.0f; -} - -float2 GetRandom2(float3 position) -{ - float3 k1 = float3(127.1, 311.7, 74.7); - float3 k2 = float3(269.5, 183.3, 246.1); - float n = sin(dot(position, k1)) * 43758.5453f; - float m = sin(dot(position, k2)) * 43758.5453f; - float2 r = frac(float2(n, m)); - return r * 2.0f - 1.0f; -} - #endif diff --git a/shaders/ssao.comp b/shaders/ssao.comp deleted file mode 100644 index f4fddfd0..00000000 --- a/shaders/ssao.comp +++ /dev/null @@ -1,66 +0,0 @@ -#include "shader.hlsl" - -Texture2D voxelTexture : register(t0, space0); -Texture2D positionTexture : register(t1, space0); -[[vk::image_format("r8")]] -RWTexture2D ssaoTexture : register(u0, space1); - -static const float kThreshold = 0.05f; -static const float kScale = 75.0f; -static const int kKernel = 2; - -bool IsOccluded(uint2 id, uint direction, float3 position) -{ - uint voxel = voxelTexture[id].x; - if (!GetOcclusion(voxel)) - { - return false; - } - float3 neighbor = positionTexture[id].xyz; - float offsets[6]; - offsets[0] = neighbor.z - position.z; - offsets[1] = position.z - neighbor.z; - offsets[2] = neighbor.x - position.x; - offsets[3] = position.x - neighbor.x; - offsets[4] = neighbor.y - position.y; - offsets[5] = position.y - neighbor.y; - return offsets[direction] > kThreshold; -} - -[numthreads(8, 8, 1)] -void main(uint3 threadID : SV_DispatchThreadID) -{ - uint width; - uint height; - ssaoTexture.GetDimensions(width, height); - if (threadID.x >= width || threadID.y >= height) - { - return; - } - ssaoTexture[threadID.xy] = 0.0f; - uint voxel = voxelTexture[threadID.xy]; - if (!GetOcclusion(voxel)) - { - return; - } - float2 uv = float2(threadID.xy) / float2(width, height); - uint direction = GetDirection(voxel); - float4 position = positionTexture[threadID.xy]; - float depth = max(abs(position.w), 1.0f); - float2 scale = kScale / float2(width, height) / depth; - float ssao = 0.0f; - for (int x = -kKernel; x <= kKernel; x++) - for (int y = -kKernel; y <= kKernel; y++) - { - float2 origin = uv + float2(x, y) * scale; - float2 offset = GetRandom2(origin) * scale; - uint2 id = (origin + offset) * float2(width, height); - if (x == 0 || y == 0 || id.x < 0 || id.y < 0 || id.x >= width || id.y >= height) - { - continue; - } - float value = max(distance(threadID.xy, id), 1.0f); - ssao += IsOccluded(id, direction, position.xyz) / value; - } - ssaoTexture[threadID.xy] = ssao / depth; -} diff --git a/src/main.c b/src/main.c index 784ebb8e..dffdf6b3 100644 --- a/src/main.c +++ b/src/main.c @@ -32,9 +32,7 @@ static SDL_GPUGraphicsPipeline* shadow_pipeline; static SDL_GPUGraphicsPipeline* sky_pipeline; static SDL_GPUGraphicsPipeline* raycast_pipeline; static SDL_GPUComputePipeline* ui_pipeline; -static SDL_GPUComputePipeline* ssao_pipeline; static SDL_GPUComputePipeline* composite_pipeline; -static SDL_GPUComputePipeline* blur_pipeline; static SDL_Surface* atlas_surface; static SDL_GPUTexture* atlas_texture; static SDL_GPUTexture* depth_texture; @@ -42,8 +40,6 @@ static SDL_GPUTexture* color_texture; static SDL_GPUTexture* position_texture; static SDL_GPUTexture* light_texture; static SDL_GPUTexture* voxel_texture; -static SDL_GPUTexture* ssao_texture; -static SDL_GPUTexture* blur_texture; static SDL_GPUTexture* composite_texture; static SDL_GPUTexture* shadow_texture; static SDL_GPUSampler* linear_sampler; @@ -505,24 +501,12 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to load ui pipeline"); return SDL_APP_FAILURE; } - ssao_pipeline = shader_load(device, "ssao.comp"); - if (!ssao_pipeline) - { - SDL_Log("Failed to load ssao pipeline"); - return SDL_APP_FAILURE; - } composite_pipeline = shader_load(device, "composite.comp"); if (!composite_pipeline) { SDL_Log("Failed to load composite pipeline"); return SDL_APP_FAILURE; } - blur_pipeline = shader_load(device, "blur.comp"); - if (!blur_pipeline) - { - SDL_Log("Failed to load blur pipeline"); - return SDL_APP_FAILURE; - } SDL_ShowWindow(window); SDL_SetWindowResizable(window, true); SDL_FlashWindow(window, SDL_FLASH_BRIEFLY); @@ -546,8 +530,6 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) SDL_ReleaseGPUSampler(device, nearest_sampler); SDL_ReleaseGPUTexture(device, shadow_texture); SDL_ReleaseGPUTexture(device, composite_texture); - SDL_ReleaseGPUTexture(device, blur_texture); - SDL_ReleaseGPUTexture(device, ssao_texture); SDL_ReleaseGPUTexture(device, color_texture); SDL_ReleaseGPUTexture(device, light_texture); SDL_ReleaseGPUTexture(device, position_texture); @@ -555,9 +537,7 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) SDL_ReleaseGPUTexture(device, depth_texture); SDL_ReleaseGPUTexture(device, atlas_texture); SDL_DestroySurface(atlas_surface); - SDL_ReleaseGPUComputePipeline(device, blur_pipeline); SDL_ReleaseGPUComputePipeline(device, composite_pipeline); - SDL_ReleaseGPUComputePipeline(device, ssao_pipeline); SDL_ReleaseGPUComputePipeline(device, ui_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, raycast_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, sky_pipeline); @@ -577,16 +557,12 @@ static bool resize(int width, int height) SDL_ReleaseGPUTexture(device, color_texture); SDL_ReleaseGPUTexture(device, voxel_texture); SDL_ReleaseGPUTexture(device, position_texture); - SDL_ReleaseGPUTexture(device, ssao_texture); - SDL_ReleaseGPUTexture(device, blur_texture); SDL_ReleaseGPUTexture(device, composite_texture); SDL_ReleaseGPUTexture(device, light_texture); depth_texture = NULL; color_texture = NULL; voxel_texture = NULL; position_texture = NULL; - ssao_texture = NULL; - blur_texture = NULL; composite_texture = NULL; light_texture = NULL; SDL_GPUTextureCreateInfo info = {0}; @@ -635,22 +611,6 @@ static bool resize(int width, int height) SDL_Log("Failed to create light texture: %s", SDL_GetError()); return false; } - info.format = SDL_GPU_TEXTUREFORMAT_R8_UNORM; - info.usage = SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ; - ssao_texture = SDL_CreateGPUTexture(device, &info); - if (!ssao_texture) - { - SDL_Log("Failed to create ssao texture: %s", SDL_GetError()); - return false; - } - info.format = SDL_GPU_TEXTUREFORMAT_R8_UNORM; - info.usage = SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ; - blur_texture = SDL_CreateGPUTexture(device, &info); - if (!blur_texture) - { - SDL_Log("Failed to create ssao blur texture: %s", SDL_GetError()); - return false; - } info.format = color_format; info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE | SDL_GPU_TEXTUREUSAGE_SAMPLER; composite_texture = SDL_CreateGPUTexture(device, &info); @@ -757,51 +717,6 @@ static void render_gbuffer(SDL_GPUCommandBuffer* cbuf) SDL_EndGPURenderPass(pass); } -static void render_ssao(SDL_GPUCommandBuffer* cbuf) -{ - SDL_GPUStorageTextureReadWriteBinding write_textures = {0}; - write_textures.texture = ssao_texture; - SDL_GPUComputePass* compute_pass = SDL_BeginGPUComputePass(cbuf, &write_textures, 1, NULL, 0); - if (!compute_pass) - { - SDL_Log("Failed to begin compute pass: %s", SDL_GetError()); - return; - } - SDL_GPUTexture* read_textures[2] = {0}; - read_textures[0] = voxel_texture; - read_textures[1] = position_texture; - int groups_x = (player.camera.width + 8 - 1) / 8; - int groups_y = (player.camera.height + 8 - 1) / 8; - SDL_PushGPUDebugGroup(cbuf, "ssao"); - SDL_BindGPUComputePipeline(compute_pass, ssao_pipeline); - SDL_BindGPUComputeStorageTextures(compute_pass, 0, read_textures, 2); - SDL_DispatchGPUCompute(compute_pass, groups_x, groups_y, 1); - SDL_EndGPUComputePass(compute_pass); - SDL_PopGPUDebugGroup(cbuf); -} - -static void render_blur(SDL_GPUCommandBuffer* cbuf) -{ - SDL_GPUStorageTextureReadWriteBinding write_textures = {0}; - write_textures.texture = blur_texture; - SDL_GPUComputePass* compute_pass = SDL_BeginGPUComputePass(cbuf, &write_textures, 1, NULL, 0); - if (!compute_pass) - { - SDL_Log("Failed to begin compute pass: %s", SDL_GetError()); - return; - } - SDL_GPUTexture* read_textures[1]; - read_textures[0] = ssao_texture; - int groups_x = (player.camera.width + 8 - 1) / 8; - int groups_y = (player.camera.height + 8 - 1) / 8; - SDL_PushGPUDebugGroup(cbuf, "blur"); - SDL_BindGPUComputePipeline(compute_pass, blur_pipeline); - SDL_BindGPUComputeStorageTextures(compute_pass, 0, read_textures, 1); - SDL_DispatchGPUCompute(compute_pass, groups_x, groups_y, 1); - SDL_EndGPUComputePass(compute_pass); - SDL_PopGPUDebugGroup(cbuf); -} - static void render_composite(SDL_GPUCommandBuffer* cbuf) { SDL_GPUStorageTextureReadWriteBinding write_textures = {0}; @@ -812,20 +727,19 @@ static void render_composite(SDL_GPUCommandBuffer* cbuf) SDL_Log("Failed to begin compute pass: %s", SDL_GetError()); return; } - SDL_GPUTexture* read_textures[5] = {0}; + SDL_GPUTexture* read_textures[4] = {0}; SDL_GPUTextureSamplerBinding read_samplers = {0}; read_textures[0] = color_texture; read_textures[1] = light_texture; - read_textures[2] = blur_texture; - read_textures[3] = voxel_texture; - read_textures[4] = position_texture; + read_textures[2] = voxel_texture; + read_textures[3] = position_texture; read_samplers.texture = shadow_texture; read_samplers.sampler = linear_sampler; int groups_x = (player.camera.width + 8 - 1) / 8; int groups_y = (player.camera.height + 8 - 1) / 8; SDL_PushGPUDebugGroup(cbuf, "composite"); SDL_BindGPUComputePipeline(compute_pass, composite_pipeline); - SDL_BindGPUComputeStorageTextures(compute_pass, 0, read_textures, 5); + SDL_BindGPUComputeStorageTextures(compute_pass, 0, read_textures, 4); SDL_BindGPUComputeSamplers(compute_pass, 0, &read_samplers, 1); SDL_PushGPUComputeUniformData(cbuf, 0, &shadow_camera.matrix, 64); SDL_PushGPUComputeUniformData(cbuf, 1, player.camera.position, 12); @@ -976,8 +890,6 @@ static void render() camera_update(&player.camera); render_shadow(cbuf); render_gbuffer(cbuf); - render_ssao(cbuf); - render_blur(cbuf); render_composite(cbuf); render_depth(cbuf); render_forward(cbuf); diff --git a/src/voxel.c b/src/voxel.c index 376f0495..b3f09b21 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -6,9 +6,20 @@ #include "voxel.h" #include "voxel.inc" -static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_t direction, int normal) +static const int CUBE_POSITIONS[][4][3] = +{ + {{0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}}, + {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 1, 0}}, + {{1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1}}, + {{0, 0, 0}, {0, 1, 0}, {0, 0, 1}, {0, 1, 1}}, + {{0, 1, 0}, {1, 1, 0}, {0, 1, 1}, {1, 1, 1}}, + {{0, 0, 0}, {0, 0, 1}, {1, 0, 0}, {1, 0, 1}}, +}; + +static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_t direction, int normal, int ao) { normal++; + SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", X_OFFSET + X_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", Y_OFFSET + Y_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", Z_OFFSET + Z_BITS <= 32); @@ -25,8 +36,9 @@ static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_ CHECK(v <= V_MASK); CHECK(index <= INDEX_MASK); CHECK(normal <= DIRECTION_MASK); + CHECK(ao <= AO_MASK); voxel_t voxel = 0; - voxel |= block_has_occlusion(block) << OCCLUSION_OFFSET; + voxel |= ao << AO_OFFSET; voxel |= normal << DIRECTION_OFFSET; voxel |= block_has_shadow(block) << SHADOW_OFFSET; voxel |= x << X_OFFSET; @@ -63,24 +75,15 @@ voxel_t voxel_pack_sprite(block_t block, int x, int y, int z, direction_t direct int c = POSITIONS[direction][i][2] + z; int d = TEXCOORDS[direction][i][0]; int e = TEXCOORDS[direction][i][1]; - return pack(block, a, b, c, d, e, DIRECTION_NORTH, DIRECTION_COUNT + direction); + return pack(block, a, b, c, d, e, DIRECTION_NORTH, DIRECTION_COUNT + direction, AO_MASK); } -voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t direction, int i) +voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t direction, int i, int ao) { CHECK(block > BLOCK_EMPTY); CHECK(block < BLOCK_COUNT); CHECK(direction < 6); CHECK(i < 4); - static const int POSITIONS[][4][3] = - { - {{0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}}, - {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 1, 0}}, - {{1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1}}, - {{0, 0, 0}, {0, 1, 0}, {0, 0, 1}, {0, 1, 1}}, - {{0, 1, 0}, {1, 1, 0}, {0, 1, 1}, {1, 1, 1}}, - {{0, 0, 0}, {0, 0, 1}, {1, 0, 0}, {1, 0, 1}}, - }; static const int TEXCOORDS[][4][2] = { {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, @@ -90,10 +93,17 @@ voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t directio {{0, 0}, {1, 0}, {0, 1}, {1, 1}}, {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, }; - int a = POSITIONS[direction][i][0] + x; - int b = POSITIONS[direction][i][1] + y; - int c = POSITIONS[direction][i][2] + z; + int a = CUBE_POSITIONS[direction][i][0] + x; + int b = CUBE_POSITIONS[direction][i][1] + y; + int c = CUBE_POSITIONS[direction][i][2] + z; int d = TEXCOORDS[direction][i][0]; int e = TEXCOORDS[direction][i][1]; - return pack(block, a, b, c, d, e, direction, direction); + return pack(block, a, b, c, d, e, direction, direction, ao); +} + +void voxel_get_cube_position(direction_t direction, int i, int position[3]) +{ + CHECK(direction < 6); + CHECK(i < 4); + SDL_memcpy(position, CUBE_POSITIONS[direction][i], sizeof(int) * 3); } diff --git a/src/voxel.h b/src/voxel.h index 9f916903..605d5e2b 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -8,4 +8,5 @@ typedef Uint32 voxel_t; voxel_t voxel_pack_sprite(block_t block, int x, int y, int z, direction_t direction, int i); -voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t direction, int i); \ No newline at end of file +voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t direction, int i, int ao); +void voxel_get_cube_position(direction_t direction, int i, int position[3]); diff --git a/src/voxel.inc b/src/voxel.inc index ca7e51b1..4d00b660 100644 --- a/src/voxel.inc +++ b/src/voxel.inc @@ -1,7 +1,7 @@ #ifndef INC #define INC -#define OCCLUSION_BITS 1 +#define AO_BITS 2 #define DIRECTION_BITS 4 #define SHADOW_BITS 1 #define X_BITS 5 @@ -9,17 +9,17 @@ #define Z_BITS 5 #define U_BITS 1 #define V_BITS 1 -#define INDEX_BITS 6 -#define OCCLUSION_OFFSET (0) -#define DIRECTION_OFFSET (OCCLUSION_OFFSET + OCCLUSION_BITS) +#define INDEX_BITS 5 +#define AO_OFFSET (0) +#define DIRECTION_OFFSET (AO_OFFSET + AO_BITS) #define SHADOW_OFFSET (DIRECTION_OFFSET + DIRECTION_BITS) -#define X_OFFSET (6) -#define Y_OFFSET (11) -#define Z_OFFSET (19) +#define X_OFFSET (SHADOW_OFFSET + SHADOW_BITS) +#define Y_OFFSET (X_OFFSET + X_BITS) +#define Z_OFFSET (Y_OFFSET + Y_BITS) #define U_OFFSET (Z_OFFSET + Z_BITS) #define V_OFFSET (U_OFFSET + U_BITS) #define INDEX_OFFSET (V_OFFSET + V_BITS) -#define OCCLUSION_MASK ((1 << OCCLUSION_BITS) - 1) +#define AO_MASK ((1 << AO_BITS) - 1) #define DIRECTION_MASK ((1 << DIRECTION_BITS) - 1) #define SHADOW_MASK ((1 << SHADOW_BITS) - 1) #define X_MASK ((1 << X_BITS) - 1) diff --git a/src/world.c b/src/world.c index 4c910b3a..0060a7bb 100644 --- a/src/world.c +++ b/src/world.c @@ -12,6 +12,8 @@ #define WORKERS 4 +static const int AO_LEVEL_CLEAR = 3; + typedef enum job_type { JOB_TYPE_NONE, @@ -267,7 +269,25 @@ static block_t get_neighborhood_block(chunk_t* chunks[3][3], int bx, int by, int return chunk->blocks[bx][by][bz]; } chunk_to_world(chunk, &bx, &by, &bz); - chunk_t* neighbor = chunks[dx + 1][dz + 1]; + int cx = 1; + int cz = 1; + if (bx < chunk->x) + { + cx--; + } + else if (bx >= chunk->x + CHUNK_WIDTH) + { + cx++; + } + if (bz < chunk->z) + { + cz--; + } + else if (bz >= chunk->z + CHUNK_WIDTH) + { + cz++; + } + chunk_t* neighbor = chunks[cx][cz]; CHECK(neighbor); return get_chunk_block(neighbor, bx, by, bz); } @@ -331,6 +351,42 @@ static bool is_visible(block_t block, block_t neighbor) return false; } +static int get_ao(chunk_t* chunks[3][3], int bx, int by, int bz, direction_t direction, int vertex) +{ + int position[3]; + voxel_get_cube_position(direction, vertex, position); + int side1[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; + int side2[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; + int corner[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; + int side = 0; + for (int i = 0; i < 3; i++) + { + if (DIRECTIONS[direction][i]) + { + continue; + } + int offset = position[i] ? 1 : -1; + if (side++ == 0) + { + side1[i] = offset; + } + else + { + side2[i] = offset; + } + corner[i] = offset; + } + CHECK(side == 2); + bool has_side1 = block_has_occlusion(get_neighborhood_block(chunks, bx, by, bz, side1[0], side1[1], side1[2])); + bool has_side2 = block_has_occlusion(get_neighborhood_block(chunks, bx, by, bz, side2[0], side2[1], side2[2])); + bool has_corner = block_has_occlusion(get_neighborhood_block(chunks, bx, by, bz, corner[0], corner[1], corner[2])); + if (has_side1 && has_side2) + { + return 0; + } + return AO_LEVEL_CLEAR - has_side1 - has_side2 - has_corner; +} + static void gen_chunk_blocks(chunk_t* chunk) { CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); @@ -382,9 +438,23 @@ static void gen_chunk_voxels(chunk_t* chunks[3][3], cpu_buffer_t voxels[MESH_TYP { continue; } + int ao[4]; + int order[] = {0, 1, 2, 3}; + for (int k = 0; k < 4; k++) + { + ao[k] = get_ao(chunks, bx, by, bz, j, k); + } + if (ao[0] + ao[3] > ao[1] + ao[2]) + { + order[0] = 1; + order[1] = 3; + order[2] = 0; + order[3] = 2; + } for (int k = 0; k < 4; k++) { - voxel_t voxel = voxel_pack_cube(block, bx, by, bz, j, k); + int vertex = order[k]; + voxel_t voxel = voxel_pack_cube(block, bx, by, bz, j, vertex, ao[vertex]); cpu_buffer_append(&voxels[get_mesh_for_block(block)], &voxel); } } @@ -1002,22 +1072,19 @@ void world_set_block(const int position[3], block_t block) int local_z = position[2]; world_to_chunk(chunk, &local_x, &local_y, &local_z); block_t old_block = set_chunk_block(chunk, position[0], position[1], position[2], block); - regen_chunk_voxels(chunk_x, chunk_z); - if (local_x == 0) - { - regen_chunk_voxels(chunk_x - 1, chunk_z); - } - else if (local_x == CHUNK_WIDTH - 1) - { - regen_chunk_voxels(chunk_x + 1, chunk_z); - } - if (local_z == 0) - { - regen_chunk_voxels(chunk_x, chunk_z - 1); - } - else if (local_z == CHUNK_WIDTH - 1) - { - regen_chunk_voxels(chunk_x, chunk_z + 1); + int min_x = local_x == 0 ? -1 : 0; + int max_x = local_x == CHUNK_WIDTH - 1 ? 1 : 0; + int min_z = local_z == 0 ? -1 : 0; + int max_z = local_z == CHUNK_WIDTH - 1 ? 1 : 0; + for (int x = min_x; x <= max_x; x++) + for (int z = min_z; z <= max_z; z++) + { + int cx = chunk_x + x; + int cz = chunk_z + z; + if (is_chunk_local(cx, cz) && !is_chunk_on_border(cx, cz)) + { + regen_chunk_voxels(cx, cz); + } } chunk_t* neighborhood[3][3] = {0}; get_neighborhood(chunk_x, chunk_z, neighborhood); From cb15ade86c156082cc9361a8520ae07e03827c45 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 21:33:37 -0400 Subject: [PATCH 02/39] v2 --- shaders/bin/composite.comp.json | 2 +- shaders/bin/composite.comp.msl | 131 +++++++++++--------- shaders/bin/composite.comp.spv | Bin 5956 -> 6664 bytes shaders/bin/depth.vert.msl | 2 +- shaders/bin/depth.vert.spv | Bin 1804 -> 1804 bytes shaders/bin/opaque.frag.json | 2 +- shaders/bin/opaque.frag.msl | 124 ++++++++++++++----- shaders/bin/opaque.frag.spv | Bin 4104 -> 5272 bytes shaders/bin/opaque.vert.msl | 31 +++-- shaders/bin/opaque.vert.spv | Bin 3344 -> 2744 bytes shaders/bin/shadow.vert.json | 2 +- shaders/bin/shadow.vert.msl | 20 +++- shaders/bin/shadow.vert.spv | Bin 2084 -> 2684 bytes shaders/bin/transparent.frag.json | 2 +- shaders/bin/transparent.frag.msl | 191 ++++++++++++++++++++---------- shaders/bin/transparent.frag.spv | Bin 7404 -> 8564 bytes shaders/bin/transparent.vert.msl | 77 +++--------- shaders/bin/transparent.vert.spv | Bin 3300 -> 2668 bytes shaders/composite.comp | 8 +- shaders/opaque.frag | 20 ++-- shaders/opaque.vert | 8 +- shaders/shader.hlsl | 39 +++--- shaders/shadow.vert | 5 +- shaders/transparent.frag | 21 ++-- shaders/transparent.vert | 8 +- src/block.c | 49 +++++++- src/block.h | 15 ++- src/main.c | 11 ++ src/voxel.c | 21 ++-- src/voxel.inc | 18 ++- src/world.c | 3 +- 31 files changed, 492 insertions(+), 318 deletions(-) diff --git a/shaders/bin/composite.comp.json b/shaders/bin/composite.comp.json index 38e66b79..fd628920 100644 --- a/shaders/bin/composite.comp.json +++ b/shaders/bin/composite.comp.json @@ -1 +1 @@ -{ "samplers": 1, "readonly_storage_textures": 4, "readonly_storage_buffers": 0, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 2, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } +{ "samplers": 1, "readonly_storage_textures": 4, "readonly_storage_buffers": 1, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 2, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } diff --git a/shaders/bin/composite.comp.msl b/shaders/bin/composite.comp.msl index beb62931..d064ce45 100644 --- a/shaders/bin/composite.comp.msl +++ b/shaders/bin/composite.comp.msl @@ -44,6 +44,20 @@ struct spvUnsafeArray } }; +struct Block +{ + uint IsSprite; + uint HasOcclusion; + uint HasShadow; + uint IsFullbright; + uint Indices[6]; +}; + +struct type_StructuredBuffer_Block +{ + Block _m0[1]; +}; + struct type_UniformBuffer { float4x4 ShadowTransform; @@ -54,128 +68,129 @@ struct type_UniformBuffer_1 float3 PlayerPosition; }; -constant spvUnsafeArray _79 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _86 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); -kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], texture2d shadowTexture [[texture(0)]], texture2d colorTexture [[texture(1)]], texture2d lightTexture [[texture(2)]], texture2d voxelTexture [[texture(3)]], texture2d positionTexture [[texture(4)]], texture2d compositeTexture [[texture(5)]], sampler shadowSampler [[sampler(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) +kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(2)]], texture2d shadowTexture [[texture(0)]], texture2d colorTexture [[texture(1)]], texture2d lightTexture [[texture(2)]], texture2d voxelTexture [[texture(3)]], texture2d positionTexture [[texture(4)]], texture2d compositeTexture [[texture(5)]], sampler shadowSampler [[sampler(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) { do { - uint2 _93 = uint2(colorTexture.get_width(), colorTexture.get_height()); - bool _105; - if (!(gl_GlobalInvocationID.x >= _93.x)) + uint2 _101 = uint2(colorTexture.get_width(), colorTexture.get_height()); + bool _113; + if (!(gl_GlobalInvocationID.x >= _101.x)) { - _105 = gl_GlobalInvocationID.y >= _93.y; + _113 = gl_GlobalInvocationID.y >= _101.y; } else { - _105 = true; + _113 = true; } - if (_105) + if (_113) { break; } - float3 _110 = colorTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz; - uint4 _112 = voxelTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); - uint _113 = _112.x; - float4 _115 = positionTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); - float _188; + float3 _118 = colorTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz; + uint4 _120 = voxelTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); + uint _121 = _120.x; + uint _123 = (_121 >> 3u) & 31u; + float4 _131 = positionTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); + float _205; do { - float4 _135 = UniformBuffer.ShadowTransform * float4(_115.xyz, 1.0); - float3 _139 = _135.xyz / float3(_135.w); - float2 _142 = (_139.xy * 0.5) + float2(0.5); - float _144 = 1.0 - _142.y; - float2 _145 = _142; - _145.y = _144; - float _146 = _142.x; - bool _152; - if (!(_146 < 0.0)) + float4 _154 = UniformBuffer.ShadowTransform * float4(_131.xyz, 1.0); + float3 _158 = _154.xyz / float3(_154.w); + float2 _161 = (_158.xy * 0.5) + float2(0.5); + float _163 = 1.0 - _161.y; + float2 _164 = _161; + _164.y = _163; + float _165 = _161.x; + bool _171; + if (!(_165 < 0.0)) { - _152 = _146 > 1.0; + _171 = _165 > 1.0; } else { - _152 = true; + _171 = true; } - bool _157; - if (!_152) + bool _176; + if (!_171) { - _157 = _144 < 0.0; + _176 = _163 < 0.0; } else { - _157 = true; + _176 = true; } - bool _162; - if (!_157) + bool _181; + if (!_176) { - _162 = _144 > 1.0; + _181 = _163 > 1.0; } else { - _162 = true; + _181 = true; } - if (_162) + if (_181) { - _188 = 0.4000000059604644775390625; + _205 = 0.4000000059604644775390625; break; } - float _177; - if (((_113 >> 6u) & 1u) != 0u) + float _194; + if (blockBuffer._m0[_123].HasOcclusion != 0u) { - float _173 = dot(_79[((_113 >> 2u) & 15u) - 1u], fast::normalize(float4(UniformBuffer.ShadowTransform[0][2], UniformBuffer.ShadowTransform[1][2], UniformBuffer.ShadowTransform[2][2], UniformBuffer.ShadowTransform[3][2]).xyz)); - if (_173 > 0.0) + float _190 = dot(_86[((_121 >> 0u) & 7u) + uint((blockBuffer._m0[_123].IsSprite != 0u) ? 6 : 0)], fast::normalize(float4(UniformBuffer.ShadowTransform[0][2], UniformBuffer.ShadowTransform[1][2], UniformBuffer.ShadowTransform[2][2], UniformBuffer.ShadowTransform[3][2]).xyz)); + if (_190 > 0.0) { - _188 = 0.0; + _205 = 0.0; break; } - _177 = _173; + _194 = _190; } else { - _177 = -0.7070000171661376953125; + _194 = -0.7070000171661376953125; } - if (_139.z < (shadowTexture.sample(shadowSampler, _145, level(0.0)).x + 0.001000000047497451305389404296875)) + if (_158.z < (shadowTexture.sample(shadowSampler, _164, level(0.0)).x + 0.001000000047497451305389404296875)) { - _188 = _177 * (-0.4000000059604644775390625); + _205 = _194 * (-0.4000000059604644775390625); break; } else { - _188 = 0.0; + _205 = 0.0; break; } break; // unreachable workaround } while(false); - bool _197; - if (!(length(_110) > 0.999000012874603271484375)) + bool _213; + if (!(blockBuffer._m0[_123].IsFullbright != 0u)) { - _197 = _113 == 0u; + _213 = _121 == 0u; } else { - _197 = true; + _213 = true; } - float3 _206; - if (_197) + float3 _222; + if (_213) { - _206 = _110; + _222 = _118; } else { - _206 = _110 * ((lightTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz + (float3(0.5) * colorTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).w)) + float3(_188)); + _222 = _118 * ((lightTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz + (float3(0.5) * colorTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).w)) + float3(_205)); } - float3 _232; - if (!(_113 == 0u)) + float3 _248; + if (!(_121 == 0u)) { - float3 _213 = _115.xyz - UniformBuffer_1.PlayerPosition; - _232 = mix(_206, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_213.y, length(float2(_213.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(_115.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))); + float3 _229 = _131.xyz - UniformBuffer_1.PlayerPosition; + _248 = mix(_222, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_229.y, length(float2(_229.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(_131.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))); } else { - _232 = _206; + _248 = _222; } - compositeTexture.write(float4(_232, 1.0), uint2(gl_GlobalInvocationID.xy)); + compositeTexture.write(float4(_248, 1.0), uint2(gl_GlobalInvocationID.xy)); break; } while(false); } diff --git a/shaders/bin/composite.comp.spv b/shaders/bin/composite.comp.spv index a0ab7fe7459a25d5d6b4a84df6f376770c0df73d..8cfba988985535efdbcf13e713595f5f62a49d50 100644 GIT binary patch literal 6664 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 Nq<2;MAuCM-9|KqNU(o;n diff --git a/shaders/bin/depth.vert.msl b/shaders/bin/depth.vert.msl index 8471dce6..c9562b8a 100644 --- a/shaders/bin/depth.vert.msl +++ b/shaders/bin/depth.vert.msl @@ -31,7 +31,7 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); return out; } diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index a04b2bc3459f6b4bdd46871796b4b5c6735a00e6..baebf7828a29e4573713d7f8dfa6f44cea12c04a 100644 GIT binary patch delta 157 zcmeC->*3pQfyq{sfrWvefq_8*h#7%c8_E{|vOxgG7X-3l@_azH5D;@s=4F;=*o_= delta 157 zcmeC->*3pQfyq{zfrWvOfq{V^h}nTy6v!6<(h5M#2*e)@V0CU0bp2apF diff --git a/shaders/bin/opaque.frag.json b/shaders/bin/opaque.frag.json index 6fb7c557..0bee8db1 100644 --- a/shaders/bin/opaque.frag.json +++ b/shaders/bin/opaque.frag.json @@ -1 +1 @@ -{ "samplers": 1, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 1 } +{ "samplers": 1, "storage_textures": 0, "storage_buffers": 2, "uniform_buffers": 1 } diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 4bf21515..747df9b3 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -1,8 +1,63 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + #include #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + +struct Block +{ + uint IsSprite; + uint HasOcclusion; + uint HasShadow; + uint IsFullbright; + uint Indices[6]; +}; + +struct type_StructuredBuffer_Block +{ + Block _m0[1]; +}; + struct Light { uint Color; @@ -21,6 +76,8 @@ struct type_UniformBuffer int LightCount; }; +constant spvUnsafeArray _84 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); + struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; @@ -32,58 +89,61 @@ struct main0_out struct main0_in { float4 in_var_TEXCOORD0 [[user(locn0)]]; - float3 in_var_TEXCOORD1 [[user(locn1), flat]]; - float3 in_var_TEXCOORD2 [[user(locn2)]]; - uint in_var_TEXCOORD3 [[user(locn3)]]; - float in_var_TEXCOORD4 [[user(locn4)]]; + float2 in_var_TEXCOORD1 [[user(locn1)]]; + uint in_var_TEXCOORD2 [[user(locn2)]]; + float in_var_TEXCOORD3 [[user(locn3)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(1)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(1)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(2)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) { main0_out out = {}; - float4 _75 = atlasTexture.sample(atlasSampler, in.in_var_TEXCOORD2.xy, uint(rint(in.in_var_TEXCOORD2.z))); - if (_75.w < 0.001000000047497451305389404296875) + uint _96 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _100 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _101 = blockBuffer._m0[_96].IsSprite != 0u; + uint _104 = _100 + uint(_101 ? 6 : 0); + float3 _113 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_96].Indices[_101 ? 0u : _100])); + float4 _117 = atlasTexture.sample(atlasSampler, _113.xy, uint(rint(_113.z))); + if (_117.w < 0.001000000047497451305389404296875) { discard_fragment(); } - _75.w = in.in_var_TEXCOORD4; - uint _87 = uint(UniformBuffer.LightCount); - float3 _89; - _89 = float3(0.0); - float3 _90; - for (uint _92 = 0u; _92 < _87; _89 = _90, _92++) + _117.w = in.in_var_TEXCOORD3; + uint _126 = uint(UniformBuffer.LightCount); + float3 _128; + _128 = float3(0.0); + float3 _129; + for (uint _131 = 0u; _131 < _126; _128 = _129, _131++) { - float _105 = float((lightBuffer._m0[_92].Color & 4278190080u) >> 24u); - float3 _112 = (float3(float(lightBuffer._m0[_92].X), float(lightBuffer._m0[_92].Y), float(lightBuffer._m0[_92].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _113 = length(_112); - bool _119; - if (!(_113 >= _105)) + float _144 = float((lightBuffer._m0[_131].Color & 4278190080u) >> 24u); + float3 _151 = (float3(float(lightBuffer._m0[_131].X), float(lightBuffer._m0[_131].Y), float(lightBuffer._m0[_131].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _152 = length(_151); + bool _158; + if (!(_152 >= _144)) { - _119 = _105 <= 0.0; + _158 = _144 <= 0.0; } else { - _119 = true; + _158 = true; } - if (_119) + if (_158) { - _90 = _89; + _129 = _128; continue; } - float _125 = fast::clamp(dot(in.in_var_TEXCOORD1, _112 / float3(_113)), 0.0, 1.0); - if (_125 <= 0.0) + float _164 = fast::clamp(dot(_84[_104], _151 / float3(_152)), 0.0, 1.0); + if (_164 <= 0.0) { - _90 = _89; + _129 = _128; continue; } - float _131 = fast::clamp(1.0 - (_113 / _105), 0.0, 1.0); - _90 = _89 + ((float3(float((lightBuffer._m0[_92].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_92].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_92].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _125) * (_131 * _131)); + float _170 = fast::clamp(1.0 - (_152 / _144), 0.0, 1.0); + _129 = _128 + ((float3(float((lightBuffer._m0[_131].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_131].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_131].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _164) * (_170 * _170)); } - float3 _149 = _89 * 2.0; - out.out_var_SV_Target0 = _75; + float3 _188 = _128 * 2.0; + out.out_var_SV_Target0 = _117; out.out_var_SV_Target1 = in.in_var_TEXCOORD0; - out.out_var_SV_Target2 = float4(_149.x, _149.y, _149.z, float4(0.0).w); - out.out_var_SV_Target3 = (0u | (in.in_var_TEXCOORD3 & 60u)) | (in.in_var_TEXCOORD3 & 64u); + out.out_var_SV_Target2 = float4(_188.x, _188.y, _188.z, float4(0.0).w); + out.out_var_SV_Target3 = in.in_var_TEXCOORD2 & 255u; return out; } - diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 504e4540186384ccb9653fba1f0d803ca8324ea3..ba8997d655345e8394b72ad9f6a009782a64f2d8 100644 GIT binary patch literal 5272 zcmZXW`*&2;6~}J^nHWW=3R)H7P<%o*J@Y$`P?}h?h1$XWk1i}`|PvNoh;~G)t_ZOS(Yu% zKIDJbd0B6+IVUUSbjR-T-IaD{vaO68hDFn#ErNEA&(tdGCM)%+>XBNd+G+UI0W7^ZMPR%rGtYY4yiF)<3qdTkZv5ASsY`fmf`x1LRJGSwo z)yd{V@Uh3f?P}jT+h`nW)sGzQAY$vwB@uER%PEU2e*%n?Y%jlLv8kDp6yy= zYjdvV+17>4xtwRaE^N+abGDNw9N&N6zG~}8twTm*I>%?&$f(WvKEp;vZO;7}HZpoA z_BP&*z8^==W@=D+`zHhB)S1#I};i6qxd(`h-746E}BcJo4J4xvpwW>=_>CC6D=w}Xf_9XV2N1flJ(78vQ-w)4x3Dlfd1AWxH^l|OPCv@JkcdBe` z{o_5J_V4QE*Qnq88r2!cz1C;W{0E;VE6zqmOa)_Z_>!-+I-V`$G8T z&@xyQsEn;X6e|1z9=%r!)n$}53;gub!QduHEX!q0lbPh03O zhj(AtLVpE1{pRbhOuE<;{#PY^?1?(OSJv<{>c0l2ti;l;ygHXo%WIH(3ics*&l~=q zg!dhWT!Ht#jQ=TU8N`0&wZLWn{LtAyXK;up%6{PDj6ox|AGrU4kk`XUkBxmjF!xe! zcLVeqDwW;<++(hdfVD09bR$CKkw)xIdXX;V%?Qp{$T#KI)AAN%-&)wWYNy(ehmoA& zkhj76Jz7p(BhWI~1}^3+?Ce{sed|pWlFQOEdq!ng`d)&U-&FP6RkDUvDDQ?kuf|ipJ<0lCK-4>+EAbeE z%Ik9{)R``WOR;(H_F3B=sI^4>dz0+BH)9`#`a9xM_CA*6QdhQ@{!SP}yS?#uA!PgE z??A}*!}@!G{+{3W60+y_cQRzp?;8l&^LrL!xL?^hEy@E0+5R|}+CA?$)cqr1h?7b8 zft6qtxE%Oxx)NNKsC>YA_b%=NS+;FB-ratrtAToH_#J>hF*mo_+y~+9gLf70=5Bb; zzkySGU)o*X-#?M=fqG8s_HS`(-^yv^t$PbLXW?Gp8I_%-&j8~poA0y0zA9V)=YW0v zD_ZUM0eyzR-;(Zrc=hYS2$`+F3cT;N;C`?gM2k2)W>OLb$iHdUz@<*yFxbuudWB&N&YhQ^FUv1#xVXOXbYU1 z814sSl` zN6cIqItOk9)^Gwm0knCKCxLgU?Ma~Ry>!;6;I$k7@8o_Os@>&zwSNhyH>dmvXWR>Y z1}p>CZ47H)3jH$BW{=JPY|=q;o#*>X(s|$dsrzcu^%itrOFHi-diWf?F*kvDM_-3m zzZt~beFI*7le(5ezX{A6^0(m48S=N`%@_0cJiL4K({_S7%g`5qw*6p?H&KSZ2>iYX zm*?^vC)1vn;N7R+BKl`NF9ZEXf%Xsa-2nX#&}RK_Q@grXfO_ZgRjAARQU4lH=l#fk zkm9@!Z;V0U+=P$R*)Z;R!41HB)!+T*_#V_{4t?GL>dYZ;Jm*ANee~>2cxw+llg|GZ zI?t&6d32ut```hfZ4rG`_XA*0)&T9+ei?`}{SaOs_15_#sLMLF{TQgTF8N}e>aE8- zZ-eNucckteU@mP@&rjf^9_>-jQ)$n;==2dWpFf3v7Wl?vK7R(Uel>{s{5ib(i1iD2 zbq7GidJo=MH-U)tOL+BLK*ahLy!wdsYj}0VSieCw)>aU)ehaUD7(}e!!K;s0zlT?6 zthnd*;jPy^+MlBzW#}J(Ht#5Oe@uFN6>sQI@N+<0@s6CSkNA7I3_Stnz#EBrpYHP> zKZA8Z+d|L>O2F@oe>?O;A4&XK(0da< S0ClfEXG0$a|7Aipg8u_|v)$|f literal 4104 zcmZve*;kcS7>7Sb$Fv+%6AzeE;?YdaGzCP%ib4eyEz^?>Qoy0Z!KAD(vuv`->R;%x z%Pv}7v{tLX$fi}Rp65H?TW4XL_2V7)JMFzcsHylG+v{)x+0daddjKqDYQG8fDP^T7geFJA7^R>zON z{U{pHEQBvlPYmXF4&+D13d4i>La9`k#@3kJgRM{=EllG86F|Qyb<=9i7Fg@p7f# zW$0$Pr?Jd6GM>L&DCPT(^mq33oH(4GnRz^uS+<8!rTd)!EZfeod4{uWkA%(hn`PS- zHqX2`RZffPJ$1gXP#PXAQ;oHF7w)oAjW+MdT{f!G=H0o=Mm3&S^&QlAIlk#!D|aHh zOi9wkeRCGx8F~Aw@bySZ(ga*xc7iyJ@P5X{-bp38*r_!kR){OS7)E0 ztIc%w96ICb=bN_P6;Nm9`_o72`Y(R{zq=3G2CsViuX+S3mc zI(=8;<@;2hew5&qo9M~=8RwFN7i*b=_e@(8y!S`h{eHO2sZN`BCzql=@x!I9qN`7K z!`FZo;NCr%>>QOJ&E!h{`ebh=+ne^spx&j}zb}*ZUrMI^&}KY5Q~5RUezWY^{Rg1d zlgs3TnQUMCu{$Hb2QFo2F%m6P%qr zxt!&1NQa;Yh}i<|1m;lo><$C_4EYGWeJXo4PXPN=wx%v%pUR%iQQ+K_y@yW%=YEPP zp5IeIAN8k+WDQRP_2zON$Jf~1K%4b_htBu=3{da;`xVQxP}d*i)7Asj*{A%UoPfN# z6Is4v@YWr%e@NHPPF|6Hp^&-&b`I!G=rh}xq9CQHaR|E9RK?i}lS`fOS zOy}9gT!-O}>G$@>EXO5y^;^LNb$BmEfcj!4zXWgIkY9#3XUL=Q<~v4z&U6g8M?Y=X z$fbT9Xln;OyjFEZ(3t^}_GKT}vpo~=?$d7}@vZL_VE>1J_8;)w2rU6^*8dH)tD6Ms zy~|~&%kxn`1=M*y^5181F2fsR74Y7KkJP(i+*iRSZ~^G=esf%by3C=^G*D*_dEfQj(#BaFuFsLMLF z%>Z@QC0|{qdh0RIH4roQjMTji%%v^rxeg!oXpeesWP9F0r;mvHc?13;Xa#XU--TD- z1mb?a2Vc=w^4~;O*8w8d`|!rv1|rr6@app*Vtoj&KI-}iUR`ypkCBbF9Ym~K@alJf zi1i7)`iS)@ygFmWIe!Lkz2?z=i+T7CJ_p)7qtJbk>77-)q1*6hfVS#0@=o31FP^c^ z0)3`4Isw&g<&;S}i9XQDE bxzJ-7KM&fO@$;eX)n@^;5B$Xq*$e&w@1b99 diff --git a/shaders/bin/opaque.vert.msl b/shaders/bin/opaque.vert.msl index 3b9da168..f9c1bd0e 100644 --- a/shaders/bin/opaque.vert.msl +++ b/shaders/bin/opaque.vert.msl @@ -59,18 +59,16 @@ struct type_UniformBuffer_2 int2 ChunkPosition; }; -constant float4 _74 = {}; +constant float4 _58 = {}; -constant spvUnsafeArray _72 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); -constant spvUnsafeArray _73 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); +constant spvUnsafeArray _57 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); struct main0_out { float4 out_var_TEXCOORD0 [[user(locn0)]]; - float3 out_var_TEXCOORD1 [[user(locn1)]]; - float3 out_var_TEXCOORD2 [[user(locn2)]]; - uint out_var_TEXCOORD3 [[user(locn3)]]; - float out_var_TEXCOORD4 [[user(locn4)]]; + float2 out_var_TEXCOORD1 [[user(locn1)]]; + uint out_var_TEXCOORD2 [[user(locn2)]]; + float out_var_TEXCOORD3 [[user(locn3)]]; float4 gl_Position [[position]]; }; @@ -82,16 +80,15 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _96 = float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _97 = float4(_96.x, _96.y, _96.z, _74.w); - float4 _109 = UniformBuffer_1.View * float4(_96, 1.0); - _97.w = _109.z; - out.gl_Position = UniformBuffer.Proj * _109; - out.out_var_TEXCOORD0 = _97; - out.out_var_TEXCOORD1 = _72[((in.in_var_TEXCOORD0 >> 2u) & 15u) - 1u]; - out.out_var_TEXCOORD2 = float3(float((in.in_var_TEXCOORD0 >> 25u) & 1u), float((in.in_var_TEXCOORD0 >> 26u) & 1u), float((in.in_var_TEXCOORD0 >> 27u) & 31u)); - out.out_var_TEXCOORD3 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD4 = _73[(in.in_var_TEXCOORD0 >> 0u) & 3u]; + float3 _80 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _81 = float4(_80.x, _80.y, _80.z, _58.w); + float4 _88 = UniformBuffer_1.View * float4(_80, 1.0); + _81.w = _88.z; + out.gl_Position = UniformBuffer.Proj * _88; + out.out_var_TEXCOORD0 = _81; + out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); + out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; + out.out_var_TEXCOORD3 = _57[(in.in_var_TEXCOORD0 >> 8u) & 3u]; return out; } diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index 67e6ef36bea805b212044deba8ccf8d19405b030..610f31f965f87401137220c72bb457b6d9e12cfa 100644 GIT binary patch literal 2744 zcmZ{k*>X%#6oyZR7V{kQ&`F3n=9xqiBnaJNidm4*lx`IX<&HOS%j39l6Yt|j@qMSy zQb)w8TD{i4roD!}yQ#6GB}p2RBw3tP`1M3ux!TXSk+$=A-{# z9&LU%D`W5E=CR`0@+?F@d!Cj=n_vI)sp`ve?M-E}QnOj}ErQRM&pA}8U2jJxx~`ua z=`WRr&+bE&*6eI*Q!`0?cwjN z^LDXz&l{vW@04Fho&BY=mZi`j=Y*gA*t0lt#GT3K2wgr$=pu(Wa>RX!9G;<0`zqum z@FKK}T9mEJFYvMyedt+@eL1o|&af4{0$zmt^cSy$oKfIbWc>rLLbguhSHp`?_>0#- ze)@~oLSZ-mI>`Pa-+JWDIlKYc8pFO3`Bx5m2h1CGV~q)1L^eijo;K+F^mKRNcJP@jTHGn+c|?nrsv zUtjmB&OAHe=20i!1#f`ryJ}8$BfAglFxMWqH5#LT7hJn~@!kwaynh_pjoE z9@gaNe11^nNw_tc)BifpISqE+ry%?2r5a~;8nRE{h@_u0>`rC=bHUE6C(}jT8F0k; zo+7RnSzE;QA*(BMo^QP$GME1e+N$JtmuDeuU+Kv@&q3De+x(X4&S!ex=j*Jl0c7F#0?><&!2Z0tUmg=f@}@u(`MiHS%U28Bejdm zkiP0m+&p)96>^W-ygS~PxFfwF@9;3>y^P&-B45k&SMhN-*CBKGh3*EjI`2m4Ze}|7 zU*=X=!!5{o{k40?K9N`32&CQfBFF7aZ;oNA)$b0Z-hRB#QTttF-&nr(dtmi(#(iYZ zQ6IZ_fb1^(AB|l+L{`5NiXA>eRv&Sr$i@|+h+S_5Qb0E9fA{6WKsxC5=BW2Q$!R=$Yg>d2@x>PiJC|g(j7B^I0m1b8z5P>9hCT^ZI(rC{CNz0=}LWddH(hqDwg)_apd~Fm4*K6wdx|S zk&VU0g;n#k{x`^6c0$PdnXde4{rv zYD?4gwd#7cZWF9)C-VR5vOm>Y|DE~O{%hm2qf=8eV<*kx+3i_%F6*U#{Q%Cpo#Z z=-1s4|FT(|J(^^nSl6hll=H|DvsTOzwqlO3MGkr7h&hWK_F0?$edxQ970^p9>U)4+ z@Q$2q4(-SPG`ef-X&)Vz?*+yP*GAkv^eo%_HP-Ei#X5aqKY(sr_`-e=o9mkG&m>#K z#QJBGJ!1A!?;&gz;AdU(!#Vqh#|(x42!4ALyn^m|gL}vJId~Vkcj12axB^;$et8e@ z3;rB>_^s!8;GU817`pct`~~zs3;acN`yT$|==LgjFShRmY0$C zS(`r39KN&3r_H>tAnm2=UF-a6GtaqX*Cu}zX@47cU(Q}b_x`Ly|M|qNTmE|DvHn8h zp2IT^BGr$A4k{SR^-^{bscwD4Nb7SSbB-XbRhxVi>5RmlW9a(hyyMC5KId6)Z+wqj zBex&EKfyh-cNE++tG58x$C<4sxOWiT9{7G1x$kFidt$x8?MdU`;Kq60NPh3%^Gzgf zullG|`y}vf@OSTT+!=K)oh4-vee7oJCE&a|qt2zj@fND^?%o7vsoI`}yYg>$=ge0DX11cQlo35jPEw zIDg*}cNJY<#Lb{LY>l_`9k{vn0DU#`4%0!EwF~^7Y&VkK_hTj1^)9;h zh?_+>?ih%;_t3Tbu0-7X=-MOh19anjYa;GLbnV6cK7wnXPX88sjBX9))91OJ`A>jn zx=-!$IpA9DQ{0O8I}g0$IpC~1pWA>l7zX) zyzBLMfS<^#ZyD%!zsONbc5}?o4cFCycKcNVQTqzIZ$`29FX7r_k5zQ{(H=crL${~L zLG*MTUAz5@8QDPB9&vZjjq3#wcNblIG43n4_K3TOZrn)_abKfrFV5CCaP2W$-=bTC z`SkgF-i5pbBKLRb<~|G}_xI@9E5KfjBYyzK>hqqx*G-_^y!O>zsh5%VT-}*;X4IWc UYf|@pabNZA$W8EwX*dV|0$OhC_5c6? diff --git a/shaders/bin/shadow.vert.json b/shaders/bin/shadow.vert.json index 51723fc4..2f29e06e 100644 --- a/shaders/bin/shadow.vert.json +++ b/shaders/bin/shadow.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 3 } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 3 } diff --git a/shaders/bin/shadow.vert.msl b/shaders/bin/shadow.vert.msl index 724b38ff..e8835fe4 100644 --- a/shaders/bin/shadow.vert.msl +++ b/shaders/bin/shadow.vert.msl @@ -3,6 +3,20 @@ using namespace metal; +struct Block +{ + uint IsSprite; + uint HasOcclusion; + uint HasShadow; + uint IsFullbright; + uint Indices[6]; +}; + +struct type_StructuredBuffer_Block +{ + Block _m0[1]; +}; + struct type_UniformBuffer { float4x4 Proj; @@ -30,11 +44,11 @@ struct main0_in uint in_var_TEXCOORD0 [[attribute(0)]]; }; -vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) +vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]]) { main0_out out = {}; - out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); - out.gl_ClipDistance[0u] = (((in.in_var_TEXCOORD0 >> 6u) & 1u) != 0u) ? 1.0 : (-1.0); + out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].HasShadow != 0u) ? 1.0 : (-1.0); out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; } diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index 1199569c798a39f21cf0ba477c73174c8d57cb06..043c006ff0599ccf474c6f4417f1bdf53f1dfd74 100644 GIT binary patch literal 2684 zcmaKs+j3M@5QbMKgouYALI^6vN#X$oM-)W_IV1s+c*;NkBj81tOw5)rlbVB;ckl+j z2E{{I<&Cf8jiukWXE)hJrCg~__y6}{b+5Jd3|D4GQyNMsjin#??>dkwIis$E$I`HL z&h1YxJhLCJWi3GkF=9`yhtmjp6>=o)%kAE8+s)cauhVbz`km(bTz_Mu*{RKKwHpuc z?@4=!AE1Qo-(W3uSGGG@uPNG_Msway7uUMWjmB2Lo3-=(Bga1Qt!%EXw|_0=*xOR~ zT7PTnekc2Bvj?QsNM6sLms;ytquGTSVV9Kd+u5MYoN?lOhFh&{quqH}xbhl<(@3e_ zY5z=EUUeV(xzN1Mi~mzcpX+wkwDr8sOX%I|ybQm4Kch*XYksredQfk7v)gxRR@{KE}tl`~w-f_5${Z8zgT|-vECTk_hg@o`Ke;CW(MjRXFa)coHgXU-?Fh{&%oc0z|QUO zMPO(1_aU&eXuGfZ&Z0e3U}y2H<$MG7dm2gU(I58pDVF)p9&hBcf;+=4Ia@Sc3bOkF{PH2QfFG`zo$F3W{kQ7?o4gc8P}C|{Ixe$D^)=& z;*CP4+fqAv1+qOAGkfd9=Gy48zP?sZsRNJqJmq@rmAW0a1O3lc_#%HP z{V$I`&x^|1d$oD2a=Sb`;kVCIO!_=CFW**Qmuqh-Ta}s(nr|0+yL|RtsgAx|t&cvN zTbWs0T%NrIMNA=^SIlT0?3{KZ#)zGl*dvxdmZ1iA7DI?{N56Ow@rdoQ*)P@~_pQ0v zFV=4z3se~M9|n7xIcK^r;|hQ8S?@em8W%ZY_RTqhYt9i|v?B_7rew^C@{vSchiI3&)LaqdJ6z$A> zKl~ezv3>d-1TJB__ko9U z+vj+H7_DvnVrzG{a=styJCCIF@!Jh1YyIB!*w0TgUqFv@*ZxNlW2dOf9xft2-yKoB zXHWh}=&R+=xSVqlcLf}A?o-5F#nu;b*RbWvJkQ;~j+o2+(pM$Fv%P`n`%Vwmc@wc# zcl}4s-O73Qbu+K)Hnx1k-N81_9ges$YD6Kkpt`KKhx& zwg&U*vv2#HLhR`iwTq{bNko1M&V89d8sBYWe(ug}&c~fOu=^74#yj^B`6crB{^t?% zdxBfQmU9<^dysRj=rUiL`~MIz-uwFft@=z}eUA|RJ}Mr&flS!-BWCN wzsaxU^LtoC8TcJ8A=Yf1ez9@C= #include using namespace metal; +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + +struct Block +{ + uint IsSprite; + uint HasOcclusion; + uint HasShadow; + uint IsFullbright; + uint Indices[6]; +}; + +struct type_StructuredBuffer_Block +{ + Block _m0[1]; +}; + struct Light { uint Color; @@ -31,6 +86,8 @@ struct type_UniformBuffer_2 float3 PlayerPosition; }; +constant spvUnsafeArray _108 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); + struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; @@ -39,129 +96,133 @@ struct main0_out struct main0_in { float4 in_var_TEXCOORD0 [[user(locn0)]]; - float3 in_var_TEXCOORD1 [[user(locn1), flat]]; - float3 in_var_TEXCOORD2 [[user(locn2)]]; - uint in_var_TEXCOORD3 [[user(locn3)]]; - float2 in_var_TEXCOORD4 [[user(locn4)]]; + float2 in_var_TEXCOORD1 [[user(locn1)]]; + uint in_var_TEXCOORD2 [[user(locn2)]]; + float2 in_var_TEXCOORD3 [[user(locn3)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(3)]], texture2d_array atlasTexture [[texture(0)]], texture2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], texture2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - float4 _109 = atlasTexture.sample(atlasSampler, in.in_var_TEXCOORD2.xy, uint(rint(in.in_var_TEXCOORD2.z))); - float _111 = _109.w; - uint _114 = uint(UniformBuffer.LightCount); - float3 _116; - _116 = float3(0.0); - float3 _117; - for (uint _119 = 0u; _119 < _114; _116 = _117, _119++) + uint _127 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _133 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _134 = blockBuffer._m0[_127].IsSprite != 0u; + uint _137 = _133 + uint(_134 ? 6 : 0); + uint _140 = _134 ? 0u : _133; + float3 _146 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_127].Indices[_140])); + float4 _150 = atlasTexture.sample(atlasSampler, _146.xy, uint(rint(_146.z))); + float _152 = _150.w; + uint _155 = uint(UniformBuffer.LightCount); + float3 _157; + _157 = float3(0.0); + float3 _158; + for (uint _160 = 0u; _160 < _155; _157 = _158, _160++) { - float _132 = float((lightBuffer._m0[_119].Color & 4278190080u) >> 24u); - float3 _139 = (float3(float(lightBuffer._m0[_119].X), float(lightBuffer._m0[_119].Y), float(lightBuffer._m0[_119].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _140 = length(_139); - bool _146; - if (!(_140 >= _132)) + float _173 = float((lightBuffer._m0[_160].Color & 4278190080u) >> 24u); + float3 _180 = (float3(float(lightBuffer._m0[_160].X), float(lightBuffer._m0[_160].Y), float(lightBuffer._m0[_160].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _181 = length(_180); + bool _187; + if (!(_181 >= _173)) { - _146 = _132 <= 0.0; + _187 = _173 <= 0.0; } else { - _146 = true; + _187 = true; } - if (_146) + if (_187) { - _117 = _116; + _158 = _157; continue; } - float _152 = fast::clamp(dot(in.in_var_TEXCOORD1, _139 / float3(_140)), 0.0, 1.0); - if (_152 <= 0.0) + float _193 = fast::clamp(dot(_108[_137], _180 / float3(_181)), 0.0, 1.0); + if (_193 <= 0.0) { - _117 = _116; + _158 = _157; continue; } - float _158 = fast::clamp(1.0 - (_140 / _132), 0.0, 1.0); - _117 = _116 + ((float3(float((lightBuffer._m0[_119].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_119].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_119].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _152) * (_158 * _158)); + float _199 = fast::clamp(1.0 - (_181 / _173), 0.0, 1.0); + _158 = _157 + ((float3(float((lightBuffer._m0[_160].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _193) * (_199 * _199)); } - float _240; + float _279; do { - float4 _187 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _191 = _187.xyz / float3(_187.w); - float2 _194 = (_191.xy * 0.5) + float2(0.5); - float _196 = 1.0 - _194.y; - float2 _197 = _194; - _197.y = _196; - float _198 = _194.x; - bool _204; - if (!(_198 < 0.0)) + float4 _228 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _232 = _228.xyz / float3(_228.w); + float2 _235 = (_232.xy * 0.5) + float2(0.5); + float _237 = 1.0 - _235.y; + float2 _238 = _235; + _238.y = _237; + float _239 = _235.x; + bool _245; + if (!(_239 < 0.0)) { - _204 = _198 > 1.0; + _245 = _239 > 1.0; } else { - _204 = true; + _245 = true; } - bool _209; - if (!_204) + bool _250; + if (!_245) { - _209 = _196 < 0.0; + _250 = _237 < 0.0; } else { - _209 = true; + _250 = true; } - bool _214; - if (!_209) + bool _255; + if (!_250) { - _214 = _196 > 1.0; + _255 = _237 > 1.0; } else { - _214 = true; + _255 = true; } - if (_214) + if (_255) { - _240 = 0.4000000059604644775390625; + _279 = 0.4000000059604644775390625; break; } - float _229; - if (((in.in_var_TEXCOORD3 >> 6u) & 1u) != 0u) + float _268; + if (blockBuffer._m0[_127].HasOcclusion != 0u) { - float _225 = dot(in.in_var_TEXCOORD1, fast::normalize(float4(UniformBuffer_1.ShadowTransform[0][2], UniformBuffer_1.ShadowTransform[1][2], UniformBuffer_1.ShadowTransform[2][2], UniformBuffer_1.ShadowTransform[3][2]).xyz)); - if (_225 > 0.0) + float _264 = dot(_108[_137], fast::normalize(float4(UniformBuffer_1.ShadowTransform[0][2], UniformBuffer_1.ShadowTransform[1][2], UniformBuffer_1.ShadowTransform[2][2], UniformBuffer_1.ShadowTransform[3][2]).xyz)); + if (_264 > 0.0) { - _240 = 0.0; + _279 = 0.0; break; } - _229 = _225; + _268 = _264; } else { - _229 = -0.7070000171661376953125; + _268 = -0.7070000171661376953125; } - if (_191.z < (shadowTexture.sample(shadowSampler, _197, level(0.0)).x + 0.001000000047497451305389404296875)) + if (_232.z < (shadowTexture.sample(shadowSampler, _238, level(0.0)).x + 0.001000000047497451305389404296875)) { - _240 = _229 * (-0.4000000059604644775390625); + _279 = _268 * (-0.4000000059604644775390625); break; } else { - _240 = 0.0; + _279 = 0.0; break; } break; // unreachable workaround } while(false); - float3 _244 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _276; - if (((in.in_var_TEXCOORD3 >> 27u) & 31u) == 16u) + float3 _283 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _314; + if (blockBuffer._m0[_127].Indices[_140] == 16u) { - _276 = _111 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD4).y) * 0.100000001490116119384765625); + _314 = _152 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _276 = _111; + _314 = _152; } - out.out_var_SV_Target0 = float4(mix(_109.xyz * (((_116 * 2.0) + float3(0.5)) + float3(_240)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_244.y, length(float2(_244.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _276); + out.out_var_SV_Target0 = float4(mix(_150.xyz * (((_157 * 2.0) + float3(0.5)) + float3(_279)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_283.y, length(float2(_283.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _314); return out; } - diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index c1fcfd081863f20435659cfd112ff0a819710bec..57aa86a0daf443ca2665ee6ef8981007abf91379 100644 GIT binary patch literal 8564 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 R=j{J)8ALyQ&olDz;D2^SRd4_R literal 7404 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 diff --git a/shaders/bin/transparent.vert.msl b/shaders/bin/transparent.vert.msl index 0ec3d8fc..53969994 100644 --- a/shaders/bin/transparent.vert.msl +++ b/shaders/bin/transparent.vert.msl @@ -1,49 +1,8 @@ -#pragma clang diagnostic ignored "-Wmissing-prototypes" -#pragma clang diagnostic ignored "-Wmissing-braces" - #include #include using namespace metal; -template -struct spvUnsafeArray -{ - T elements[Num ? Num : 1]; - - thread T& operator [] (size_t pos) thread - { - return elements[pos]; - } - constexpr const thread T& operator [] (size_t pos) const thread - { - return elements[pos]; - } - - device T& operator [] (size_t pos) device - { - return elements[pos]; - } - constexpr const device T& operator [] (size_t pos) const device - { - return elements[pos]; - } - - constexpr const constant T& operator [] (size_t pos) const constant - { - return elements[pos]; - } - - threadgroup T& operator [] (size_t pos) threadgroup - { - return elements[pos]; - } - constexpr const threadgroup T& operator [] (size_t pos) const threadgroup - { - return elements[pos]; - } -}; - struct type_UniformBuffer { float4x4 Proj; @@ -59,17 +18,14 @@ struct type_UniformBuffer_2 int2 ChunkPosition; }; -constant float4 _66 = {}; - -constant spvUnsafeArray _65 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant float4 _48 = {}; struct main0_out { float4 out_var_TEXCOORD0 [[user(locn0)]]; - float3 out_var_TEXCOORD1 [[user(locn1)]]; - float3 out_var_TEXCOORD2 [[user(locn2)]]; - uint out_var_TEXCOORD3 [[user(locn3)]]; - float2 out_var_TEXCOORD4 [[user(locn4)]]; + float2 out_var_TEXCOORD1 [[user(locn1)]]; + uint out_var_TEXCOORD2 [[user(locn2)]]; + float2 out_var_TEXCOORD3 [[user(locn3)]]; float4 gl_Position [[position]]; }; @@ -81,19 +37,18 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _88 = float3(float((in.in_var_TEXCOORD0 >> 7u) & 31u), float((in.in_var_TEXCOORD0 >> 12u) & 255u), float((in.in_var_TEXCOORD0 >> 20u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _89 = float4(_88.x, _88.y, _88.z, _66.w); - float4 _101 = UniformBuffer_1.View * float4(_88, 1.0); - _89.w = _101.z; - float4 _106 = UniformBuffer.Proj * _101; - float2 _122 = ((_106.xy / float2(_106.w)) * 0.5) + float2(0.5); - _122.y = 1.0 - _122.y; - out.gl_Position = _106; - out.out_var_TEXCOORD0 = _89; - out.out_var_TEXCOORD1 = _65[((in.in_var_TEXCOORD0 >> 2u) & 15u) - 1u]; - out.out_var_TEXCOORD2 = float3(float((in.in_var_TEXCOORD0 >> 25u) & 1u), float((in.in_var_TEXCOORD0 >> 26u) & 1u), float((in.in_var_TEXCOORD0 >> 27u) & 31u)); - out.out_var_TEXCOORD3 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD4 = _122; + float3 _70 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _71 = float4(_70.x, _70.y, _70.z, _48.w); + float4 _78 = UniformBuffer_1.View * float4(_70, 1.0); + _71.w = _78.z; + float4 _83 = UniformBuffer.Proj * _78; + float2 _96 = ((_83.xy / float2(_83.w)) * 0.5) + float2(0.5); + _96.y = 1.0 - _96.y; + out.gl_Position = _83; + out.out_var_TEXCOORD0 = _71; + out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); + out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; + out.out_var_TEXCOORD3 = _96; return out; } diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index 2d8d30ca72b4a89e7e7ce8ceba3d34165e7aa6ef..a6dd8538e8873a3697106e85a8f5612e0f688205 100644 GIT binary patch literal 2668 zcmZ{kS5uQw5Qe`{>$z2{j@Kt%ot+vVADi%ed&7n~t4!2ixVOX3WuJDm5oaF! z|KezK-L8(kb2p9^&lG0?{LFD?XWCr-&!=iHEA=VVyH)qcq0+R9CF%MBHQ00*hwwQ zi-9Y2>&&tby{oWyAbG|fhJ7hAt9J$VWe7zzmUi{!z@BMe!Cp+dcJ-CO75XY<&zrB4 z-F()%i=L{l2IdrzV-2!*4t*{1#+<$m*?Wb3J@T)d?z=E=*!9&X^dho8)>LA*CVSn< zZx_2<^F21_Cs%~A=hp5_H_$a}4BMt;lQZsScKhLZ&pIPH<7`R1ocdPw0%-QTE!&3d zOiDoe_N3b{^&Ls~{4z4^WG~^di(T3LyV=ce9DRD&t))4$wro$*t^Wje@8&n-8FlaD zHxjxv`%Q#y&B_Jf`KZ}^q1(gIy@TI$=-$C^I&|%R1L_5SOYHuU9mdN$naAZFe~{V# zs#D~(2mUu%OCJ%v=K)}?zD40V?|l$xtD`&fLx~H&!|37X`w71z$lAj1D6(9Ie11d6 zfU$g&+G@nN|Hpy0Z`{E;PXKH6eSc5f$;A7{U#GfGAsf=Ye5rp3`vV7j}F1mb$dv>zl1ICgs(-*n>z}keX0HOyEkmbE=#CV7-FFvQZ zkC2U{?MvbwBg-!Zz72DY0QuD*a*QI60P}w0oO6BxoR2npukTYJKLR{^nyOmatxwr^ Z<$RQVU*1*OcV@4Y{Vy@jPa+%zzX5T-ue<;N literal 3300 zcmZ{lTXPgu6oosP8G<*ia#0XF35dWLE-Io3Ap}gkF+&85R|uNO5Hb@d35XX8^~ER4 ze`J*}{v}^5{l4k5t#&k>T65N3`|N%8+2?epGB`SvWdm83ZOR_->$5c*OiHC^>)o6^ z{tsW8Yqd27fitS01~veaWg9_-KebsV)%be^zIdtAU7EYI0!10h9%Wp;zdS#7wcT34 zb$)GOVZLjgTF>XaX18W8c(X9xGcfPf>N2U2DzXi#$)PlV{Vqd4}jt@l4)Y zYcDoCE3MU5$0k_UX2$=k%l@?5V|VAeV^=QDPBt1d7mk_5z1y?S+UkFt`s`c3?|6!{ z$Njz&$!G8TeJ>`TXVUL`spqTq&N|L?ipo4wd+jro&e8qLU8CUD-udry5|452scgFs zZSRkMYuC0f+UC-BJ#A~$HjlP7jDU#O9tJ-8J;$=T*`iJ{jNVvm%V>Jqs8zq z&DyqrY1WB(MO~Gi9XaBDm2-qv&JkMV(2g8&w<3pqR@1)|ZXG!|LM`&Gz$ff&J?r84 zF8tf!&atO;I7++Y z)UgMhXM6|s?}g-AJo>et0iJ2tafiZw7N5N~K4%m$Up@?coS!p}0R8sMp4%^bUFS|{ z?+4Z-VvPfE*9rSMxMvvlLHJ)K`+2y15C0*!eF^(8+G<<|2$V-Cz~jx&tb zkSF^rqxT@z7>Db3f2W!6-u;HCX}e#)8DYC8&me5~Bp(3Ik3G45*!DPV_vkmTZ2Qd% z+dW%f*zURbUs>$uT=ILqbt-e50Nx|tP2WS`Iq#8o$FYn7GTZO-;3SpUH*5E?kAJY6 z$sVs}=NSE;Y&~a*le^X#_UV~i0PcN)Z-{-q2<**pg7b3t8$e$Ndkf=K(jsmeJK{#* z5%(rsU&OryS8Jwk*4uD%`EAkHCco$Z4$$`-`?Jn>fwlT>{+_f;N%x&yPIWcl>Jit3 z8|Ql*ahKuh2SLQmz||w}J-Bhc-w}5Ou3ld6DziP(-?ziQK)SHjt>V8uv(0pe;0iM4;&&N7G z1?tZ6J-QBjS3G~`_)gsb>X(`0+0OxM^a<@ITy3DFeU>!uSCbp)9zO@hJ751c@C$kM z%>(^6K;&J3tD9qnZaD7?pl-h^AZot__q{LI-ojRoHEzSrryf0Bgxk|YAbNTSu5SP0 zjx52|Bd!fM?l6eB4qUw)w~VbGabLoXtAmK^!qpFeSZ@Wc9(QXMZVl$s*Py4PjBCJs z37_&A+{IS6Pfhyl{ChxM{FJn>;O5cybJFg^)%O7Jt+8JN_5C2u=$oXw?vKp#j(iI| vTYa9JvEKo8b2!)Uk#$+0yvpd=%4>|?O}X!YdzTL}+B^A1Msxm2wo~A5+yCO{ diff --git a/shaders/composite.comp b/shaders/composite.comp index 2c2cb257..c829597d 100644 --- a/shaders/composite.comp +++ b/shaders/composite.comp @@ -6,6 +6,7 @@ Texture2D colorTexture : register(t1, space0); Texture2D lightTexture : register(t2, space0); Texture2D voxelTexture : register(t3, space0); Texture2D positionTexture : register(t4, space0); +StructuredBuffer blockBuffer : register(t5, space0); [[vk::image_format("rgba8")]] RWTexture2D compositeTexture : register(u0, space1); @@ -31,14 +32,15 @@ void main(uint3 threadID : SV_DispatchThreadID) } float3 albedo = colorTexture[threadID.xy].rgb; uint voxel = voxelTexture[threadID.xy].x; + Block block = blockBuffer[GetBlock(voxel)]; float3 position = positionTexture[threadID.xy].xyz; - float3 normal = GetNormal(voxel); + float3 normal = GetNormal(voxel, block); float3 diffuse = lightTexture[threadID.xy].rgb; float3 ambient = GetAmbientLight(); - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, position, normal, voxel); + float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, position, normal, block); float ao = colorTexture[threadID.xy].a; float3 color; - if (IsCloud(albedo) || IsSky(voxel)) + if (block.IsFullbright || IsSky(voxel)) { color = albedo; } diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 1f901acf..d6564f08 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -2,7 +2,8 @@ Texture2DArray atlasTexture : register(t0, space2); SamplerState atlasSampler : register(s0, space2); -StructuredBuffer lightBuffer : register(t1, space2); +StructuredBuffer blockBuffer : register(t1, space2); +StructuredBuffer lightBuffer : register(t2, space2); cbuffer UniformBuffer : register(b0, space3) { @@ -12,10 +13,9 @@ cbuffer UniformBuffer : register(b0, space3) struct Input { float4 WorldPosition : TEXCOORD0; - nointerpolation float3 Normal : TEXCOORD1; - float3 Texcoord : TEXCOORD2; - nointerpolation uint Voxel : TEXCOORD3; - float AO : TEXCOORD4; + float2 Texcoord : TEXCOORD1; + nointerpolation uint Voxel : TEXCOORD2; + float AO : TEXCOORD3; }; struct Output @@ -29,7 +29,10 @@ struct Output Output main(Input input) { Output output; - output.Color = atlasTexture.Sample(atlasSampler, input.Texcoord); + Block block = blockBuffer[GetBlock(input.Voxel)]; + float3 normal = GetNormal(input.Voxel, block); + float3 texcoord = float3(input.Texcoord, GetIndex(input.Voxel, block)); + output.Color = atlasTexture.Sample(atlasSampler, texcoord); output.Position = input.WorldPosition; output.Light = float4(0.0f, 0.0f, 0.0f, 0.0f); output.Voxel = 0; @@ -39,8 +42,7 @@ Output main(Input input) return output; } output.Color.a = input.AO; - output.Voxel |= input.Voxel & (DIRECTION_MASK << DIRECTION_OFFSET); - output.Voxel |= input.Voxel & (SHADOW_MASK << SHADOW_OFFSET); - output.Light.rgb = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, input.Normal); + output.Voxel = input.Voxel & MATERIAL_MASK; + output.Light.rgb = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); return output; } diff --git a/shaders/opaque.vert b/shaders/opaque.vert index 5c8699eb..5d78bd18 100644 --- a/shaders/opaque.vert +++ b/shaders/opaque.vert @@ -24,10 +24,9 @@ struct Output { float4 Position : SV_Position; float4 WorldPosition : TEXCOORD0; - nointerpolation float3 Normal : TEXCOORD1; - float3 Texcoord : TEXCOORD2; - nointerpolation uint Voxel : TEXCOORD3; - float AO : TEXCOORD4; + float2 Texcoord : TEXCOORD1; + nointerpolation uint Voxel : TEXCOORD2; + float AO : TEXCOORD3; }; Output main(Input input) @@ -35,7 +34,6 @@ Output main(Input input) Output output; int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); output.WorldPosition.xyz = GetPosition(input.Voxel) + chunkPosition; - output.Normal = GetNormal(input.Voxel); output.Position = mul(View, float4(output.WorldPosition.xyz, 1.0f)); output.WorldPosition.w = output.Position.z; output.Position = mul(Proj, output.Position); diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 1d8b1ca8..58389e44 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -7,6 +7,15 @@ static const float kEpsilon = 0.001f; static const float kPi = 3.14159265f; +struct Block +{ + uint IsSprite; + uint HasOcclusion; + uint HasShadow; + uint IsFullbright; + uint Indices[6]; +}; + static const float3 kNormals[10] = { float3( 0.0f, 0.0f, 1.0f ), @@ -61,12 +70,12 @@ float GetAO(uint voxel) uint GetDirection(uint voxel) { - return ((voxel >> DIRECTION_OFFSET) & DIRECTION_MASK) - 1; + return (voxel >> DIRECTION_OFFSET) & DIRECTION_MASK; } -bool GetShadow(uint voxel) +uint GetBlock(uint voxel) { - return (voxel >> SHADOW_OFFSET) & SHADOW_MASK; + return (voxel >> BLOCK_OFFSET) & BLOCK_MASK; } float3 GetPosition(uint voxel) @@ -74,19 +83,22 @@ float3 GetPosition(uint voxel) return float3((voxel >> X_OFFSET) & X_MASK, (voxel >> Y_OFFSET) & Y_MASK, (voxel >> Z_OFFSET) & Z_MASK); } -uint GetIndex(uint voxel) +uint GetIndex(uint voxel, Block block) { - return (voxel >> INDEX_OFFSET) & INDEX_MASK; + uint direction = block.IsSprite ? 0 : GetDirection(voxel); + return block.Indices[direction]; } -float3 GetTexcoord(uint voxel) +float2 GetTexcoord(uint voxel) { - return float3((voxel >> U_OFFSET) & U_MASK, (voxel >> V_OFFSET) & V_MASK, GetIndex(voxel)); + return float2((voxel >> U_OFFSET) & U_MASK, (voxel >> V_OFFSET) & V_MASK); } -float3 GetNormal(uint voxel) +float3 GetNormal(uint voxel, Block block) { - return kNormals[GetDirection(voxel)]; + uint direction = GetDirection(voxel); + direction += block.IsSprite ? 6 : 0; + return kNormals[direction]; } float3 GetCubePosition(uint vertexID) @@ -104,11 +116,6 @@ bool IsSky(uint voxel) return voxel == 0; } -bool IsCloud(float3 color) -{ - return length(color) > (1.0f - kEpsilon); -} - struct Light { uint Color; @@ -151,7 +158,7 @@ float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 p return finalColor * kLight; } -float GetSunLight(Texture2D texture, SamplerState state, float4x4 transform, float3 position, float3 normal, uint voxel) +float GetSunLight(Texture2D texture, SamplerState state, float4x4 transform, float3 position, float3 normal, Block block) { static const float kBias = 0.001f; static const float kBase = 0.0f; @@ -166,7 +173,7 @@ float GetSunLight(Texture2D texture, SamplerState state, float4x4 transfo } float3 direction = normalize(float3(transform[2].xyz)); float ratio = -0.707f; - if (GetShadow(voxel)) + if (block.HasOcclusion) { ratio = dot(normal, direction); if (ratio > 0.0f) diff --git a/shaders/shadow.vert b/shaders/shadow.vert index 71cb384a..ba270d9d 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -1,5 +1,7 @@ #include "shader.hlsl" +StructuredBuffer blockBuffer : register(t0, space0); + cbuffer UniformBuffer : register(b0, space1) { float4x4 Proj; @@ -31,7 +33,8 @@ Output main(Input input) Output output; int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); float3 position = GetPosition(input.Voxel) + chunkPosition; + Block block = blockBuffer[GetBlock(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); - output.ClipDistance = GetShadow(input.Voxel) ? 1.0f : -1.0f; + output.ClipDistance = block.HasShadow ? 1.0f : -1.0f; return output; } diff --git a/shaders/transparent.frag b/shaders/transparent.frag index fd50eccb..2efa9bbf 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -6,7 +6,8 @@ Texture2D shadowTexture : register(t1, space2); SamplerState shadowSampler : register(s1, space2); Texture2D positionTexture : register(t2, space2); SamplerState positionSampler : register(s2, space2); -StructuredBuffer lightBuffer : register(t3, space2); +StructuredBuffer blockBuffer : register(t3, space2); +StructuredBuffer lightBuffer : register(t4, space2); cbuffer UniformBuffer : register(b0, space3) { @@ -26,26 +27,28 @@ cbuffer UniformBuffer : register(b2, space3) struct Input { float4 WorldPosition : TEXCOORD0; - nointerpolation float3 Normal : TEXCOORD1; - float3 Texcoord : TEXCOORD2; - nointerpolation uint Voxel : TEXCOORD3; - float2 Fragment : TEXCOORD4; + float2 Texcoord : TEXCOORD1; + nointerpolation uint Voxel : TEXCOORD2; + float2 Fragment : TEXCOORD3; }; static const uint kWater = 16; float4 main(Input input) : SV_Target0 { - float4 color = atlasTexture.Sample(atlasSampler, input.Texcoord); + Block block = blockBuffer[GetBlock(input.Voxel)]; + float3 normal = GetNormal(input.Voxel, block); + float3 texcoord = float3(input.Texcoord, GetIndex(input.Voxel, block)); + float4 color = atlasTexture.Sample(atlasSampler, texcoord); float3 albedo = color.rgb; float alpha = color.a; float4 position = input.WorldPosition; - float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, position, input.Normal); + float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, position, normal); float3 ambient = GetAmbientLight(); - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, position.xyz, input.Normal, input.Voxel); + float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, position.xyz, normal, block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition); float fog = GetFog(distance(position.xz, PlayerPosition.xz)); - if (GetIndex(input.Voxel) == kWater) + if (GetIndex(input.Voxel, block) == kWater) { // TODO: Causes bug where alpha is 0 or 1 as camera approaches water float3 groundPosition = positionTexture.Sample(positionSampler, input.Fragment).xyz; diff --git a/shaders/transparent.vert b/shaders/transparent.vert index aa401d21..be897696 100644 --- a/shaders/transparent.vert +++ b/shaders/transparent.vert @@ -24,10 +24,9 @@ struct Output { float4 Position : SV_Position; float4 WorldPosition : TEXCOORD0; - nointerpolation float3 Normal : TEXCOORD1; - float3 Texcoord : TEXCOORD2; - nointerpolation uint Voxel : TEXCOORD3; - float2 Fragment : TEXCOORD4; + float2 Texcoord : TEXCOORD1; + nointerpolation uint Voxel : TEXCOORD2; + float2 Fragment : TEXCOORD3; }; Output main(Input input) @@ -35,7 +34,6 @@ Output main(Input input) Output output; int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); output.WorldPosition.xyz = GetPosition(input.Voxel) + chunkPosition; - output.Normal = GetNormal(input.Voxel); output.Position = mul(View, float4(output.WorldPosition.xyz, 1.0f)); output.WorldPosition.w = output.Position.z; output.Position = mul(Proj, output.Position); diff --git a/src/block.c b/src/block.c index 40ccb666..7d5e57fd 100644 --- a/src/block.c +++ b/src/block.c @@ -1,4 +1,5 @@ #include "block.h" +#include "buffer.h" #include "direction.h" #define TORCH_INTENSITY 15 @@ -10,6 +11,7 @@ struct bool is_solid; bool has_occlusion; bool has_shadow; + bool is_fullbright; int indices[6]; light_t light; } @@ -92,6 +94,7 @@ static const BLOCKS[BLOCK_COUNT] = .is_solid = true, .has_occlusion = false, .has_shadow = false, + .is_fullbright = true, .indices = {9, 9, 9, 9, 9, 9}, .light = {0, 0, 0, 0}, }, @@ -247,6 +250,47 @@ static const BLOCKS[BLOCK_COUNT] = }, }; +static cpu_buffer_t cpu_blocks; +static gpu_buffer_t gpu_blocks; + +bool block_init(SDL_GPUDevice* device) +{ + SDL_COMPILE_TIME_ASSERT("", sizeof(block_gpu_t) == sizeof(Uint32) * 10); + cpu_buffer_init(&cpu_blocks, device, sizeof(block_gpu_t)); + gpu_buffer_init(&gpu_blocks, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ | SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ); + if (!gpu_buffer_begin_upload(&gpu_blocks)) + { + return false; + } + for (int i = 0; i < BLOCK_COUNT; i++) + { + block_gpu_t block = {0}; + block.is_sprite = BLOCKS[i].is_sprite; + block.has_occlusion = BLOCKS[i].has_occlusion; + block.has_shadow = BLOCKS[i].has_shadow; + block.is_fullbright = BLOCKS[i].is_fullbright; + for (int j = 0; j < DIRECTION_COUNT; j++) + { + block.indices[j] = BLOCKS[i].indices[j]; + } + cpu_buffer_append(&cpu_blocks, &block); + } + gpu_buffer_upload(&gpu_blocks, &cpu_blocks); + gpu_buffer_end_upload(&gpu_blocks); + return gpu_blocks.size == BLOCK_COUNT; +} + +void block_free() +{ + cpu_buffer_free(&cpu_blocks); + gpu_buffer_free(&gpu_blocks); +} + +SDL_GPUBuffer* block_get_buffer() +{ + return gpu_blocks.buffer; +} + bool block_is_opaque(block_t block) { return BLOCKS[block].is_opaque; @@ -267,11 +311,6 @@ bool block_has_occlusion(block_t block) return BLOCKS[block].has_occlusion; } -bool block_has_shadow(block_t block) -{ - return BLOCKS[block].has_shadow; -} - int block_get_index(block_t block, direction_t direction) { return BLOCKS[block].indices[direction]; diff --git a/src/block.h b/src/block.h index dd88e671..b38522da 100644 --- a/src/block.h +++ b/src/block.h @@ -48,11 +48,24 @@ typedef struct light } light_t; +typedef struct block_gpu +{ + Uint32 is_sprite; + Uint32 has_occlusion; + Uint32 has_shadow; + Uint32 is_fullbright; + Uint32 indices[DIRECTION_COUNT]; +} +block_gpu_t; + +bool block_init(SDL_GPUDevice* device); +void block_free(); +SDL_GPUBuffer* block_get_buffer(); + bool block_is_opaque(block_t block); bool block_is_sprite(block_t block); bool block_is_solid(block_t block); bool block_has_occlusion(block_t block); -bool block_has_shadow(block_t block); int block_get_index(block_t block, direction_t direction); bool block_is_light(block_t block); light_t block_get_light(block_t block); diff --git a/src/main.c b/src/main.c index dffdf6b3..e98deedc 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ #include #include +#include "block.h" #include "camera.h" #include "check.h" #include "player.h" @@ -507,6 +508,11 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to load composite pipeline"); return SDL_APP_FAILURE; } + if (!block_init(device)) + { + SDL_Log("Failed to initialize blocks"); + return SDL_APP_FAILURE; + } SDL_ShowWindow(window); SDL_SetWindowResizable(window, true); SDL_FlashWindow(window, SDL_FLASH_BRIEFLY); @@ -524,6 +530,7 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) { SDL_HideWindow(window); world_free(); + block_free(); player_save_or_load(&player, PLAYER_ID, true); save_free(); SDL_ReleaseGPUSampler(device, linear_sampler); @@ -652,6 +659,8 @@ static void render_shadow(SDL_GPUCommandBuffer* cbuf) return; } SDL_BindGPUGraphicsPipeline(pass, shadow_pipeline); + SDL_GPUBuffer* block_buffer = block_get_buffer(); + SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); SDL_PushGPUDebugGroup(cbuf, "shadow"); world_render(&shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); SDL_PopGPUDebugGroup(cbuf); @@ -741,6 +750,8 @@ static void render_composite(SDL_GPUCommandBuffer* cbuf) SDL_BindGPUComputePipeline(compute_pass, composite_pipeline); SDL_BindGPUComputeStorageTextures(compute_pass, 0, read_textures, 4); SDL_BindGPUComputeSamplers(compute_pass, 0, &read_samplers, 1); + SDL_GPUBuffer* block_buffer = block_get_buffer(); + SDL_BindGPUComputeStorageBuffers(compute_pass, 0, &block_buffer, 1); SDL_PushGPUComputeUniformData(cbuf, 0, &shadow_camera.matrix, 64); SDL_PushGPUComputeUniformData(cbuf, 1, player.camera.position, 12); SDL_DispatchGPUCompute(compute_pass, groups_x, groups_y, 1); diff --git a/src/voxel.c b/src/voxel.c index b3f09b21..50e270ee 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -16,37 +16,34 @@ static const int CUBE_POSITIONS[][4][3] = {{0, 0, 0}, {0, 0, 1}, {1, 0, 0}, {1, 0, 1}}, }; -static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_t direction, int normal, int ao) +static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_t direction, int ao) { - normal++; SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", X_OFFSET + X_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", Y_OFFSET + Y_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", Z_OFFSET + Z_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", U_OFFSET + U_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", V_OFFSET + V_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", INDEX_OFFSET + INDEX_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", DIRECTION_OFFSET + DIRECTION_BITS <= 32); - CHECK(direction <= DIRECTION_COUNT); - int index = block_get_index(block, direction); + SDL_COMPILE_TIME_ASSERT("", BLOCK_OFFSET + BLOCK_BITS <= 32); + CHECK(direction < DIRECTION_COUNT); + CHECK(block <= BLOCK_MASK); CHECK(x <= X_MASK); CHECK(y <= Y_MASK); CHECK(z <= Z_MASK); CHECK(u <= U_MASK); CHECK(v <= V_MASK); - CHECK(index <= INDEX_MASK); - CHECK(normal <= DIRECTION_MASK); + CHECK(direction <= DIRECTION_MASK); CHECK(ao <= AO_MASK); voxel_t voxel = 0; + voxel |= direction << DIRECTION_OFFSET; + voxel |= block << BLOCK_OFFSET; voxel |= ao << AO_OFFSET; - voxel |= normal << DIRECTION_OFFSET; - voxel |= block_has_shadow(block) << SHADOW_OFFSET; voxel |= x << X_OFFSET; voxel |= y << Y_OFFSET; voxel |= z << Z_OFFSET; voxel |= u << U_OFFSET; voxel |= v << V_OFFSET; - voxel |= index << INDEX_OFFSET; return voxel; } @@ -75,7 +72,7 @@ voxel_t voxel_pack_sprite(block_t block, int x, int y, int z, direction_t direct int c = POSITIONS[direction][i][2] + z; int d = TEXCOORDS[direction][i][0]; int e = TEXCOORDS[direction][i][1]; - return pack(block, a, b, c, d, e, DIRECTION_NORTH, DIRECTION_COUNT + direction, AO_MASK); + return pack(block, a, b, c, d, e, direction, AO_MASK); } voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t direction, int i, int ao) @@ -98,7 +95,7 @@ voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t directio int c = CUBE_POSITIONS[direction][i][2] + z; int d = TEXCOORDS[direction][i][0]; int e = TEXCOORDS[direction][i][1]; - return pack(block, a, b, c, d, e, direction, direction, ao); + return pack(block, a, b, c, d, e, direction, ao); } void voxel_get_cube_position(direction_t direction, int i, int position[3]) diff --git a/src/voxel.inc b/src/voxel.inc index 4d00b660..c27fcbf9 100644 --- a/src/voxel.inc +++ b/src/voxel.inc @@ -2,31 +2,29 @@ #define INC #define AO_BITS 2 -#define DIRECTION_BITS 4 -#define SHADOW_BITS 1 +#define DIRECTION_BITS 3 +#define BLOCK_BITS 5 #define X_BITS 5 #define Y_BITS 8 #define Z_BITS 5 #define U_BITS 1 #define V_BITS 1 -#define INDEX_BITS 5 -#define AO_OFFSET (0) -#define DIRECTION_OFFSET (AO_OFFSET + AO_BITS) -#define SHADOW_OFFSET (DIRECTION_OFFSET + DIRECTION_BITS) -#define X_OFFSET (SHADOW_OFFSET + SHADOW_BITS) +#define DIRECTION_OFFSET (0) +#define BLOCK_OFFSET (DIRECTION_OFFSET + DIRECTION_BITS) +#define AO_OFFSET (BLOCK_OFFSET + BLOCK_BITS) +#define X_OFFSET (AO_OFFSET + AO_BITS) #define Y_OFFSET (X_OFFSET + X_BITS) #define Z_OFFSET (Y_OFFSET + Y_BITS) #define U_OFFSET (Z_OFFSET + Z_BITS) #define V_OFFSET (U_OFFSET + U_BITS) -#define INDEX_OFFSET (V_OFFSET + V_BITS) #define AO_MASK ((1 << AO_BITS) - 1) #define DIRECTION_MASK ((1 << DIRECTION_BITS) - 1) -#define SHADOW_MASK ((1 << SHADOW_BITS) - 1) +#define BLOCK_MASK ((1 << BLOCK_BITS) - 1) #define X_MASK ((1 << X_BITS) - 1) #define Y_MASK ((1 << Y_BITS) - 1) #define Z_MASK ((1 << Z_BITS) - 1) #define U_MASK ((1 << U_BITS) - 1) #define V_MASK ((1 << V_BITS) - 1) -#define INDEX_MASK ((1 << INDEX_BITS) - 1) +#define MATERIAL_MASK ((1 << (DIRECTION_BITS + BLOCK_BITS)) - 1) #endif diff --git a/src/world.c b/src/world.c index 0060a7bb..3c08d139 100644 --- a/src/world.c +++ b/src/world.c @@ -972,8 +972,9 @@ static void render(chunk_t* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass light_binding = gpu_empty_lights.buffer; light_count = 0; } + SDL_GPUBuffer* bindings[] = {block_get_buffer(), light_binding}; SDL_PushGPUFragmentUniformData(cbuf, 0, &light_count, 4); - SDL_BindGPUFragmentStorageBuffers(pass, 0, &light_binding, 1); + SDL_BindGPUFragmentStorageBuffers(pass, 0, bindings, 2); } SDL_PushGPUVertexUniformData(cbuf, 2, chunk->position, 12); SDL_BindGPUVertexBuffers(pass, 0, &voxel_binding, 1); From db2d3b8af39952d39c55e43f6365c8ef653a88dc Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 21:47:51 -0400 Subject: [PATCH 03/39] v3 --- CMakeLists.txt | 1 - README.md | 12 +- shaders/bin/composite.comp.json | 1 - shaders/bin/composite.comp.msl | 197 -------------------------------- shaders/bin/composite.comp.spv | Bin 6664 -> 0 bytes shaders/bin/opaque.frag.json | 2 +- shaders/bin/opaque.frag.msl | 154 +++++++++++++++++++------ shaders/bin/opaque.frag.spv | Bin 5272 -> 8404 bytes shaders/bin/sky.frag.msl | 4 +- shaders/bin/sky.frag.spv | Bin 1172 -> 1168 bytes shaders/composite.comp | 58 ---------- shaders/opaque.frag | 43 +++++-- shaders/shader.hlsl | 5 - shaders/sky.frag | 4 +- src/block.c | 2 +- src/main.c | 122 +++----------------- src/voxel.inc | 5 +- 17 files changed, 181 insertions(+), 429 deletions(-) delete mode 100644 shaders/bin/composite.comp.json delete mode 100644 shaders/bin/composite.comp.msl delete mode 100644 shaders/bin/composite.comp.spv delete mode 100644 shaders/composite.comp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4513cb82..b0b49cab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,6 @@ function(add_shader FILE) endif() package(${JSON}) endfunction() -add_shader(composite.comp shaders/shader.hlsl src/voxel.inc) add_shader(depth.frag shaders/shader.hlsl src/voxel.inc) add_shader(depth.vert shaders/shader.hlsl src/voxel.inc) add_shader(opaque.frag shaders/shader.hlsl src/voxel.inc) diff --git a/README.md b/README.md index 5f174c01..4036115d 100644 --- a/README.md +++ b/README.md @@ -63,10 +63,8 @@ To build locally, add [SDL_shadercross](https://github.com/libsdl-org/SDL_shader ### Passes 1. Render opaques to depth texture (for shadows) -2. Render sky to G-buffer -3. Render opaques to G-buffer -4. Composite G-buffer with CPU-baked vertex AO -5. Render transparents to depth teture (for predepth) -6. Render transparents and composite -7. Render raycast -8. Render UI +2. Render sky and opaques with CPU-baked vertex AO +3. Render transparents to depth texture (for predepth) +4. Render transparents and composite +5. Render raycast +6. Render UI diff --git a/shaders/bin/composite.comp.json b/shaders/bin/composite.comp.json deleted file mode 100644 index fd628920..00000000 --- a/shaders/bin/composite.comp.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 1, "readonly_storage_textures": 4, "readonly_storage_buffers": 1, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 2, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } diff --git a/shaders/bin/composite.comp.msl b/shaders/bin/composite.comp.msl deleted file mode 100644 index d064ce45..00000000 --- a/shaders/bin/composite.comp.msl +++ /dev/null @@ -1,197 +0,0 @@ -#pragma clang diagnostic ignored "-Wmissing-prototypes" -#pragma clang diagnostic ignored "-Wmissing-braces" - -#include -#include - -using namespace metal; - -template -struct spvUnsafeArray -{ - T elements[Num ? Num : 1]; - - thread T& operator [] (size_t pos) thread - { - return elements[pos]; - } - constexpr const thread T& operator [] (size_t pos) const thread - { - return elements[pos]; - } - - device T& operator [] (size_t pos) device - { - return elements[pos]; - } - constexpr const device T& operator [] (size_t pos) const device - { - return elements[pos]; - } - - constexpr const constant T& operator [] (size_t pos) const constant - { - return elements[pos]; - } - - threadgroup T& operator [] (size_t pos) threadgroup - { - return elements[pos]; - } - constexpr const threadgroup T& operator [] (size_t pos) const threadgroup - { - return elements[pos]; - } -}; - -struct Block -{ - uint IsSprite; - uint HasOcclusion; - uint HasShadow; - uint IsFullbright; - uint Indices[6]; -}; - -struct type_StructuredBuffer_Block -{ - Block _m0[1]; -}; - -struct type_UniformBuffer -{ - float4x4 ShadowTransform; -}; - -struct type_UniformBuffer_1 -{ - float3 PlayerPosition; -}; - -constant spvUnsafeArray _86 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); - -kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(2)]], texture2d shadowTexture [[texture(0)]], texture2d colorTexture [[texture(1)]], texture2d lightTexture [[texture(2)]], texture2d voxelTexture [[texture(3)]], texture2d positionTexture [[texture(4)]], texture2d compositeTexture [[texture(5)]], sampler shadowSampler [[sampler(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) -{ - do - { - uint2 _101 = uint2(colorTexture.get_width(), colorTexture.get_height()); - bool _113; - if (!(gl_GlobalInvocationID.x >= _101.x)) - { - _113 = gl_GlobalInvocationID.y >= _101.y; - } - else - { - _113 = true; - } - if (_113) - { - break; - } - float3 _118 = colorTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz; - uint4 _120 = voxelTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); - uint _121 = _120.x; - uint _123 = (_121 >> 3u) & 31u; - float4 _131 = positionTexture.read(uint2(gl_GlobalInvocationID.xy), 0u); - float _205; - do - { - float4 _154 = UniformBuffer.ShadowTransform * float4(_131.xyz, 1.0); - float3 _158 = _154.xyz / float3(_154.w); - float2 _161 = (_158.xy * 0.5) + float2(0.5); - float _163 = 1.0 - _161.y; - float2 _164 = _161; - _164.y = _163; - float _165 = _161.x; - bool _171; - if (!(_165 < 0.0)) - { - _171 = _165 > 1.0; - } - else - { - _171 = true; - } - bool _176; - if (!_171) - { - _176 = _163 < 0.0; - } - else - { - _176 = true; - } - bool _181; - if (!_176) - { - _181 = _163 > 1.0; - } - else - { - _181 = true; - } - if (_181) - { - _205 = 0.4000000059604644775390625; - break; - } - float _194; - if (blockBuffer._m0[_123].HasOcclusion != 0u) - { - float _190 = dot(_86[((_121 >> 0u) & 7u) + uint((blockBuffer._m0[_123].IsSprite != 0u) ? 6 : 0)], fast::normalize(float4(UniformBuffer.ShadowTransform[0][2], UniformBuffer.ShadowTransform[1][2], UniformBuffer.ShadowTransform[2][2], UniformBuffer.ShadowTransform[3][2]).xyz)); - if (_190 > 0.0) - { - _205 = 0.0; - break; - } - _194 = _190; - } - else - { - _194 = -0.7070000171661376953125; - } - if (_158.z < (shadowTexture.sample(shadowSampler, _164, level(0.0)).x + 0.001000000047497451305389404296875)) - { - _205 = _194 * (-0.4000000059604644775390625); - break; - } - else - { - _205 = 0.0; - break; - } - break; // unreachable workaround - } while(false); - bool _213; - if (!(blockBuffer._m0[_123].IsFullbright != 0u)) - { - _213 = _121 == 0u; - } - else - { - _213 = true; - } - float3 _222; - if (_213) - { - _222 = _118; - } - else - { - _222 = _118 * ((lightTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).xyz + (float3(0.5) * colorTexture.read(uint2(gl_GlobalInvocationID.xy), 0u).w)) + float3(_205)); - } - float3 _248; - if (!(_121 == 0u)) - { - float3 _229 = _131.xyz - UniformBuffer_1.PlayerPosition; - _248 = mix(_222, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_229.y, length(float2(_229.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(_131.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))); - } - else - { - _248 = _222; - } - compositeTexture.write(float4(_248, 1.0), uint2(gl_GlobalInvocationID.xy)); - break; - } while(false); -} - diff --git a/shaders/bin/composite.comp.spv b/shaders/bin/composite.comp.spv deleted file mode 100644 index 8cfba988985535efdbcf13e713595f5f62a49d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6664 zcmaKu37pkc6~`Yl42z5qh#;~wh)W2L#HL9yfC592j0`HMWy8z>6SL5JZxG4~8co}j z%J$7{b15<_Gb0n3f(eT@PN*(2np6+nfu9^h9Z!gAPamT#=JPp{+F-~9PS%S{)Ezx!lmIB|VDcH-9-Z{BR z{OfSIc~>Lt#e1*+dB`C^{um<9Lr%xL2B~gL6Vg33r#a3? zn!~)>Ym*(lG$&uww=UVvpGS62YP-+=PC2yQJAaqL?|%8a6Sn)~Ub#o^#RW+BVi}mtFQ)QB;5R)ToB(Ek z6TwMIst4kmxCrjSG50mplihP&55l(roj2g_urJ2$J9Oh>W8K3`axD@7#Xg4udtJ=B>h^gyns=oIxG#_McO%mA z6#7hLD=?SRc+a{Gc#fN~yg%)Ut4E#>XN{W@kLc$%C(fFe5@(NFfNML~{LbwF@_UIn z9r>cfne!%Mnmf@QPvVpB0&>=^9&2@@yO!^Gtkr`qA8Tzxm$TMG%#S?EgY2Md zzZm$t;GP)o8rD%nI;_K(5|FbFb@REu+VX42=l+#}XCNHz&t>=;k-fnEHpcVyOxEyK zd3Ux0{leiqW9)4d@^VlM%(WJ|BXRj$ab7!xJ*B`OF(DSj@5wW|`^=o@4UkQ!|v2T5e%l8`l zb|pUj!V&uxeP0D<-}VuGzY1M`7PvLt%d64t&$yd;`A$P#1LWrc_u~rc^G?4S=-ZX{ z@ipk?l=pr%AzurI0)6)78NUw5N1v}pKMF*j*P_cEsn6@+^$SPz8M*er4FlT4k#7Ja zfc5z9zY&ZF_F>E_ggztaWC z_X2s}cZYMXC0^eRK>x{LcjDfMegjwtqQ)E1<(=C{oO|?sU~l@?Qn&d&0OTV!=6^78 zh{B!B_dWU$ke>qLef)6ZJ*S({9llHQHv>7(O8u^s=N5GHSc`8}#3MAHmk|njb|vTvL88kaJD-sQqK;_G#^|88OOO^EPzXv<~B)AANotUB7GIj&!)D z{3n2%YpO?|pG1#6cg=`V#+si(cTMXs-ubR^2h!mh#(WycxrVy={4TWRJ-0^Woxr>5 z{f;~MnZ)aJcqjDNrn`Gr;+7+gjd$m>=)RRRfi-;&>98h!p9gZ*pniS2XLqCfo|rfG zVjsG^`){uONQb%feF5wT=2Fl1C$AlADcwKs^gZAV;2xNNKZra0MRdO-d%cj_CL+HC z_5k0Y_38Wna^n3KjJ3wd@fCFa4!<|oycft%264Z>itc*)?C(CL!~XPr4SXHgpEBQ{ zzN=F11L*d&VNi_u{>{lb-*Z36FR!)S59R~!gmt@jO4l%#x#JE026`JP1N-z`qt9=m z>#qiJ{@+614UCKL;M?f(_V^v7!ye_o3*@X({T6!i-S{5Z3Cv^P5u=Rn;QQ!)2li&X z^IhWsq{B6g`2qMLa1EvJ;xy!sz$w5!JSVvygX@64c&8skch3S5`x7|h^?Mf1|0&oG z^jWvHxUMziZF&1}&d-4Jtj)Q`#yj{rH>R9{M6>yVFv z37{VMd+EBr0P?=|+P?%>0{J-OUnPD>j{9}u5dCq#Nt}12iF^x?zXitX^WE_7{SKIG z8PH#wzRBMweiG6(jf-#R59s _84 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +struct type_UniformBuffer_1 +{ + float4x4 ShadowTransform; +}; + +struct type_UniformBuffer_2 +{ + float3 PlayerPosition; +}; + +constant spvUnsafeArray _107 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; float4 out_var_SV_Target1 [[color(1)]]; - float4 out_var_SV_Target2 [[color(2)]]; - uint out_var_SV_Target3 [[color(3)]]; }; struct main0_in @@ -94,56 +102,132 @@ struct main0_in float in_var_TEXCOORD3 [[user(locn3)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(1)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(2)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], texture2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _96 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _100 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _101 = blockBuffer._m0[_96].IsSprite != 0u; - uint _104 = _100 + uint(_101 ? 6 : 0); - float3 _113 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_96].Indices[_101 ? 0u : _100])); - float4 _117 = atlasTexture.sample(atlasSampler, _113.xy, uint(rint(_113.z))); - if (_117.w < 0.001000000047497451305389404296875) + uint _124 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _132 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _133 = blockBuffer._m0[_124].IsSprite != 0u; + uint _136 = _132 + uint(_133 ? 6 : 0); + float3 _145 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_124].Indices[_133 ? 0u : _132])); + float4 _149 = atlasTexture.sample(atlasSampler, _145.xy, uint(rint(_145.z))); + if (_149.w < 0.001000000047497451305389404296875) { discard_fragment(); } - _117.w = in.in_var_TEXCOORD3; - uint _126 = uint(UniformBuffer.LightCount); - float3 _128; - _128 = float3(0.0); - float3 _129; - for (uint _131 = 0u; _131 < _126; _128 = _129, _131++) + float3 _154 = _149.xyz; + uint _157 = uint(UniformBuffer.LightCount); + float3 _159; + _159 = float3(0.0); + float3 _160; + for (uint _162 = 0u; _162 < _157; _159 = _160, _162++) { - float _144 = float((lightBuffer._m0[_131].Color & 4278190080u) >> 24u); - float3 _151 = (float3(float(lightBuffer._m0[_131].X), float(lightBuffer._m0[_131].Y), float(lightBuffer._m0[_131].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _152 = length(_151); - bool _158; - if (!(_152 >= _144)) + float _175 = float((lightBuffer._m0[_162].Color & 4278190080u) >> 24u); + float3 _182 = (float3(float(lightBuffer._m0[_162].X), float(lightBuffer._m0[_162].Y), float(lightBuffer._m0[_162].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _183 = length(_182); + bool _189; + if (!(_183 >= _175)) { - _158 = _144 <= 0.0; + _189 = _175 <= 0.0; } else { - _158 = true; + _189 = true; } - if (_158) + if (_189) { - _129 = _128; + _160 = _159; continue; } - float _164 = fast::clamp(dot(_84[_104], _151 / float3(_152)), 0.0, 1.0); - if (_164 <= 0.0) + float _195 = fast::clamp(dot(_107[_136], _182 / float3(_183)), 0.0, 1.0); + if (_195 <= 0.0) { - _129 = _128; + _160 = _159; continue; } - float _170 = fast::clamp(1.0 - (_152 / _144), 0.0, 1.0); - _129 = _128 + ((float3(float((lightBuffer._m0[_131].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_131].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_131].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _164) * (_170 * _170)); + float _201 = fast::clamp(1.0 - (_183 / _175), 0.0, 1.0); + _160 = _159 + ((float3(float((lightBuffer._m0[_162].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_162].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_162].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _195) * (_201 * _201)); + } + float _281; + do + { + float4 _230 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _234 = _230.xyz / float3(_230.w); + float2 _237 = (_234.xy * 0.5) + float2(0.5); + float _239 = 1.0 - _237.y; + float2 _240 = _237; + _240.y = _239; + float _241 = _237.x; + bool _247; + if (!(_241 < 0.0)) + { + _247 = _241 > 1.0; + } + else + { + _247 = true; + } + bool _252; + if (!_247) + { + _252 = _239 < 0.0; + } + else + { + _252 = true; + } + bool _257; + if (!_252) + { + _257 = _239 > 1.0; + } + else + { + _257 = true; + } + if (_257) + { + _281 = 0.4000000059604644775390625; + break; + } + float _270; + if (blockBuffer._m0[_124].HasOcclusion != 0u) + { + float _266 = dot(_107[_136], fast::normalize(float4(UniformBuffer_1.ShadowTransform[0][2], UniformBuffer_1.ShadowTransform[1][2], UniformBuffer_1.ShadowTransform[2][2], UniformBuffer_1.ShadowTransform[3][2]).xyz)); + if (_266 > 0.0) + { + _281 = 0.0; + break; + } + _270 = _266; + } + else + { + _270 = -0.7070000171661376953125; + } + if (_234.z < (shadowTexture.sample(shadowSampler, _240, level(0.0)).x + 0.001000000047497451305389404296875)) + { + _281 = _270 * (-0.4000000059604644775390625); + break; + } + else + { + _281 = 0.0; + break; + } + break; // unreachable workaround + } while(false); + float3 _291; + if (blockBuffer._m0[_124].IsFullbright != 0u) + { + _291 = _154; + } + else + { + _291 = _154 * (((_159 * 2.0) + (float3(0.5) * in.in_var_TEXCOORD3)) + float3(_281)); } - float3 _188 = _128 * 2.0; - out.out_var_SV_Target0 = _117; + float3 _295 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_291, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_295.y, length(float2(_295.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; - out.out_var_SV_Target2 = float4(_188.x, _188.y, _188.z, float4(0.0).w); - out.out_var_SV_Target3 = in.in_var_TEXCOORD2 & 255u; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index ba8997d655345e8394b72ad9f6a009782a64f2d8..0d048603ef79750f2700f8bf4a43f160a292ea6d 100644 GIT binary patch literal 8404 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 literal 5272 zcmZXW`*&2;6~}J^nHWW=3R)H7P<%o*J@Y$`P?}h?h1$XWk1i}`|PvNoh;~G)t_ZOS(Yu% zKIDJbd0B6+IVUUSbjR-T-IaD{vaO68hDFn#ErNEA&(tdGCM)%+>XBNd+G+UI0W7^ZMPR%rGtYY4yiF)<3qdTkZv5ASsY`fmf`x1LRJGSwo z)yd{V@Uh3f?P}jT+h`nW)sGzQAY$vwB@uER%PEU2e*%n?Y%jlLv8kDp6yy= zYjdvV+17>4xtwRaE^N+abGDNw9N&N6zG~}8twTm*I>%?&$f(WvKEp;vZO;7}HZpoA z_BP&*z8^==W@=D+`zHhB)S1#I};i6qxd(`h-746E}BcJo4J4xvpwW>=_>CC6D=w}Xf_9XV2N1flJ(78vQ-w)4x3Dlfd1AWxH^l|OPCv@JkcdBe` z{o_5J_V4QE*Qnq88r2!cz1C;W{0E;VE6zqmOa)_Z_>!-+I-V`$G8T z&@xyQsEn;X6e|1z9=%r!)n$}53;gub!QduHEX!q0lbPh03O zhj(AtLVpE1{pRbhOuE<;{#PY^?1?(OSJv<{>c0l2ti;l;ygHXo%WIH(3ics*&l~=q zg!dhWT!Ht#jQ=TU8N`0&wZLWn{LtAyXK;up%6{PDj6ox|AGrU4kk`XUkBxmjF!xe! zcLVeqDwW;<++(hdfVD09bR$CKkw)xIdXX;V%?Qp{$T#KI)AAN%-&)wWYNy(ehmoA& zkhj76Jz7p(BhWI~1}^3+?Ce{sed|pWlFQOEdq!ng`d)&U-&FP6RkDUvDDQ?kuf|ipJ<0lCK-4>+EAbeE z%Ik9{)R``WOR;(H_F3B=sI^4>dz0+BH)9`#`a9xM_CA*6QdhQ@{!SP}yS?#uA!PgE z??A}*!}@!G{+{3W60+y_cQRzp?;8l&^LrL!xL?^hEy@E0+5R|}+CA?$)cqr1h?7b8 zft6qtxE%Oxx)NNKsC>YA_b%=NS+;FB-ratrtAToH_#J>hF*mo_+y~+9gLf70=5Bb; zzkySGU)o*X-#?M=fqG8s_HS`(-^yv^t$PbLXW?Gp8I_%-&j8~poA0y0zA9V)=YW0v zD_ZUM0eyzR-;(Zrc=hYS2$`+F3cT;N;C`?gM2k2)W>OLb$iHdUz@<*yFxbuudWB&N&YhQ^FUv1#xVXOXbYU1 z814sSl` zN6cIqItOk9)^Gwm0knCKCxLgU?Ma~Ry>!;6;I$k7@8o_Os@>&zwSNhyH>dmvXWR>Y z1}p>CZ47H)3jH$BW{=JPY|=q;o#*>X(s|$dsrzcu^%itrOFHi-diWf?F*kvDM_-3m zzZt~beFI*7le(5ezX{A6^0(m48S=N`%@_0cJiL4K({_S7%g`5qw*6p?H&KSZ2>iYX zm*?^vC)1vn;N7R+BKl`NF9ZEXf%Xsa-2nX#&}RK_Q@grXfO_ZgRjAARQU4lH=l#fk zkm9@!Z;V0U+=P$R*)Z;R!41HB)!+T*_#V_{4t?GL>dYZ;Jm*ANee~>2cxw+llg|GZ zI?t&6d32ut```hfZ4rG`_XA*0)&T9+ei?`}{SaOs_15_#sLMLF{TQgTF8N}e>aE8- zZ-eNucckteU@mP@&rjf^9_>-jQ)$n;==2dWpFf3v7Wl?vK7R(Uel>{s{5ib(i1iD2 zbq7GidJo=MH-U)tOL+BLK*ahLy!wdsYj}0VSieCw)>aU)ehaUD7(}e!!K;s0zlT?6 zthnd*;jPy^+MlBzW#}J(Ht#5Oe@uFN6>sQI@N+<0@s6CSkNA7I3_Stnz#EBrpYHP> zKZA8Z+d|L>O2F@oe>?O;A4&XK(0da< S0ClfEXG0$a|7Aipg8u_|v)$|f diff --git a/shaders/bin/sky.frag.msl b/shaders/bin/sky.frag.msl index 9dc88e31..50de33a0 100644 --- a/shaders/bin/sky.frag.msl +++ b/shaders/bin/sky.frag.msl @@ -6,7 +6,7 @@ using namespace metal; struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; - uint out_var_SV_Target3 [[color(3)]]; + float4 out_var_SV_Target1 [[color(1)]]; }; struct main0_in @@ -18,7 +18,7 @@ fragment main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; out.out_var_SV_Target0 = float4(mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(in.in_var_TEXCOORD0.y, length(float2(in.in_var_TEXCOORD0.x, in.in_var_TEXCOORD0.z))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), 1.0); - out.out_var_SV_Target3 = 0u; + out.out_var_SV_Target1 = float4(0.0); return out; } diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index db6e08404113ee732a24eea9b97d7a7a3382211f..1f8900f0cf13ea3a42c644d911c3528db60ba6d2 100644 GIT binary patch literal 1168 zcmZXT%}!HM6orp1AV_IJp!fsYiXuwA{u>ix8x-t>ger}}5ow|!48#O0V+E2vf zTS?w`UnlqO-!fhddABrH3WK2!I|tr&wzlPs%JqX$JYy8W%BS2qL_dtWt?gvDvy-%! z*PpJgzF1208}t0T58X7l_Hv`$+1Y&4C2GvP$6~jQ_5IgJ6Wo9dj2H-v+s9% zdCK^nQD-dnH-+upR(PW`?DlG1{j==O#djP>b&kCXbDmw>c}%nWUgmg|Bo1O!TwqL(VKyHx&QZb-5xGto68yx_&Tg>Eth@#!K<(@5>s0R=63FnIq$hk zKt5__vDJ95QF9qvK5DLDt8qS2GlwnTqL%M{6?jg*KqYI<1N(gfj2HMSBPP*HvHKy%-j(|hDcnJOhH+)20 literal 1172 zcmZXT%}!Hc5QaZnizu}Pf#ScXqN0GuAJmu_+xUaskWir^xH3&NgoT)3VGS|H`|tvc zap6694KBR}7rG$vd5-66ns}1w%=^Cc%}nPzr&yRi62hSnLM1Hl>oXP#88Z@wGT&NS zT}t2eUZr>L-c+xIqAt^_VK^KnE?{rEn_Kd#awTjOq(&2>V#cjQlwi!;+)8)5+i7QU z{mJt3%G0dAn&;o{^fGaE?PaICz45w-s%G8)G=?v6YH*Gg*dFIGAF*`@v9-kJ)%YF4 zC)gaB#?BqWUULdOOeAOSB={&k!FMT`L3R8iv;=<r37rtZWKF@32AXf8 shadowTexture : register(t0, space0); -SamplerState shadowSampler : register(s0, space0); -Texture2D colorTexture : register(t1, space0); -Texture2D lightTexture : register(t2, space0); -Texture2D voxelTexture : register(t3, space0); -Texture2D positionTexture : register(t4, space0); -StructuredBuffer blockBuffer : register(t5, space0); -[[vk::image_format("rgba8")]] -RWTexture2D compositeTexture : register(u0, space1); - -cbuffer UniformBuffer : register(b0, space2) -{ - float4x4 ShadowTransform; -}; - -cbuffer UniformBuffer : register(b1, space2) -{ - float3 PlayerPosition; -}; - -[numthreads(8, 8, 1)] -void main(uint3 threadID : SV_DispatchThreadID) -{ - uint width; - uint height; - colorTexture.GetDimensions(width, height); - if (threadID.x >= width || threadID.y >= height) - { - return; - } - float3 albedo = colorTexture[threadID.xy].rgb; - uint voxel = voxelTexture[threadID.xy].x; - Block block = blockBuffer[GetBlock(voxel)]; - float3 position = positionTexture[threadID.xy].xyz; - float3 normal = GetNormal(voxel, block); - float3 diffuse = lightTexture[threadID.xy].rgb; - float3 ambient = GetAmbientLight(); - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, position, normal, block); - float ao = colorTexture[threadID.xy].a; - float3 color; - if (block.IsFullbright || IsSky(voxel)) - { - color = albedo; - } - else - { - color = albedo * (diffuse + ambient * ao + sun); - } - if (!IsSky(voxel)) - { - float3 sky = GetSkyColor(position - PlayerPosition); - float fog = GetFog(distance(position.xz, PlayerPosition.xz)); - color = lerp(color, sky, fog); - } - compositeTexture[threadID.xy] = float4(color, 1.0f); -} diff --git a/shaders/opaque.frag b/shaders/opaque.frag index d6564f08..06e35d17 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -2,14 +2,26 @@ Texture2DArray atlasTexture : register(t0, space2); SamplerState atlasSampler : register(s0, space2); -StructuredBuffer blockBuffer : register(t1, space2); -StructuredBuffer lightBuffer : register(t2, space2); +Texture2D shadowTexture : register(t1, space2); +SamplerState shadowSampler : register(s1, space2); +StructuredBuffer blockBuffer : register(t2, space2); +StructuredBuffer lightBuffer : register(t3, space2); cbuffer UniformBuffer : register(b0, space3) { int LightCount : packoffset(c0); }; +cbuffer UniformBuffer : register(b1, space3) +{ + float4x4 ShadowTransform : packoffset(c0); +}; + +cbuffer UniformBuffer : register(b2, space3) +{ + float3 PlayerPosition : packoffset(c0); +}; + struct Input { float4 WorldPosition : TEXCOORD0; @@ -22,8 +34,6 @@ struct Output { float4 Color : SV_Target0; float4 Position : SV_Target1; - float4 Light : SV_Target2; - uint Voxel : SV_Target3; }; Output main(Input input) @@ -32,17 +42,28 @@ Output main(Input input) Block block = blockBuffer[GetBlock(input.Voxel)]; float3 normal = GetNormal(input.Voxel, block); float3 texcoord = float3(input.Texcoord, GetIndex(input.Voxel, block)); - output.Color = atlasTexture.Sample(atlasSampler, texcoord); + float4 color = atlasTexture.Sample(atlasSampler, texcoord); output.Position = input.WorldPosition; - output.Light = float4(0.0f, 0.0f, 0.0f, 0.0f); - output.Voxel = 0; - if (output.Color.a < kEpsilon) + if (color.a < kEpsilon) { discard; return output; } - output.Color.a = input.AO; - output.Voxel = input.Voxel & MATERIAL_MASK; - output.Light.rgb = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); + float3 albedo = color.rgb; + float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); + float3 ambient = GetAmbientLight(); + float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, input.WorldPosition.xyz, normal, block); + float3 finalColor; + if (block.IsFullbright) + { + finalColor = albedo; + } + else + { + finalColor = albedo * (diffuse + ambient * input.AO + sun); + } + float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition); + float fog = GetFog(distance(input.WorldPosition.xz, PlayerPosition.xz)); + output.Color = float4(lerp(finalColor, sky, fog), 1.0f); return output; } diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 58389e44..558f612e 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -111,11 +111,6 @@ float3 GetCubeNormal(uint vertexID) return kCubeNormals[vertexID / 6]; } -bool IsSky(uint voxel) -{ - return voxel == 0; -} - struct Light { uint Color; diff --git a/shaders/sky.frag b/shaders/sky.frag index 400450af..a230fe2f 100644 --- a/shaders/sky.frag +++ b/shaders/sky.frag @@ -9,14 +9,12 @@ struct Output { float4 Color : SV_Target0; float4 Position : SV_Target1; - float4 Light : SV_Target2; - uint Voxel : SV_Target3; }; Output main(Input input) { Output output; output.Color = float4(GetSkyColor(input.LocalPosition), 1.0f); - output.Voxel = 0; + output.Position = float4(0.0f, 0.0f, 0.0f, 0.0f); return output; } diff --git a/src/block.c b/src/block.c index 7d5e57fd..476de332 100644 --- a/src/block.c +++ b/src/block.c @@ -257,7 +257,7 @@ bool block_init(SDL_GPUDevice* device) { SDL_COMPILE_TIME_ASSERT("", sizeof(block_gpu_t) == sizeof(Uint32) * 10); cpu_buffer_init(&cpu_blocks, device, sizeof(block_gpu_t)); - gpu_buffer_init(&gpu_blocks, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ | SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ); + gpu_buffer_init(&gpu_blocks, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); if (!gpu_buffer_begin_upload(&gpu_blocks)) { return false; diff --git a/src/main.c b/src/main.c index e98deedc..0d2ec9a4 100644 --- a/src/main.c +++ b/src/main.c @@ -33,14 +33,10 @@ static SDL_GPUGraphicsPipeline* shadow_pipeline; static SDL_GPUGraphicsPipeline* sky_pipeline; static SDL_GPUGraphicsPipeline* raycast_pipeline; static SDL_GPUComputePipeline* ui_pipeline; -static SDL_GPUComputePipeline* composite_pipeline; static SDL_Surface* atlas_surface; static SDL_GPUTexture* atlas_texture; static SDL_GPUTexture* depth_texture; -static SDL_GPUTexture* color_texture; static SDL_GPUTexture* position_texture; -static SDL_GPUTexture* light_texture; -static SDL_GPUTexture* voxel_texture; static SDL_GPUTexture* composite_texture; static SDL_GPUTexture* shadow_texture; static SDL_GPUSampler* linear_sampler; @@ -190,11 +186,9 @@ static void set_window_icon(block_t block) static bool create_opaque_pipeline() { - SDL_GPUColorTargetDescription color_targets[4] = {0}; + SDL_GPUColorTargetDescription color_targets[2] = {0}; color_targets[0].format = color_format; color_targets[1].format = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT; - color_targets[2].format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; - color_targets[3].format = SDL_GPU_TEXTUREFORMAT_R8_UINT; SDL_GPUVertexAttribute vertex_attributes[1] = {0}; SDL_GPUVertexBufferDescription vertex_buffers[1] = {0}; vertex_attributes[0].format = SDL_GPU_VERTEXELEMENTFORMAT_UINT; @@ -202,7 +196,7 @@ static bool create_opaque_pipeline() SDL_GPUGraphicsPipelineCreateInfo info = {0}; info.vertex_shader = shader_load(device, "opaque.vert"); info.fragment_shader = shader_load(device, "opaque.frag"); - info.target_info.num_color_targets = 4; + info.target_info.num_color_targets = 2; info.target_info.color_target_descriptions = color_targets; info.target_info.has_depth_stencil_target = true; info.target_info.depth_stencil_format = depth_format; @@ -321,15 +315,13 @@ static bool create_shadow_pipeline() static bool create_sky_pipeline() { - SDL_GPUColorTargetDescription color_targets[4] = {0}; + SDL_GPUColorTargetDescription color_targets[2] = {0}; color_targets[0].format = color_format; color_targets[1].format = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT; - color_targets[2].format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; - color_targets[3].format = SDL_GPU_TEXTUREFORMAT_R8_UINT; SDL_GPUGraphicsPipelineCreateInfo info = {0}; info.vertex_shader = shader_load(device, "sky.vert"); info.fragment_shader = shader_load(device, "sky.frag"); - info.target_info.num_color_targets = 4; + info.target_info.num_color_targets = 2; info.target_info.color_target_descriptions = color_targets; info.target_info.has_depth_stencil_target = true; info.target_info.depth_stencil_format = depth_format; @@ -502,12 +494,6 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to load ui pipeline"); return SDL_APP_FAILURE; } - composite_pipeline = shader_load(device, "composite.comp"); - if (!composite_pipeline) - { - SDL_Log("Failed to load composite pipeline"); - return SDL_APP_FAILURE; - } if (!block_init(device)) { SDL_Log("Failed to initialize blocks"); @@ -537,14 +523,10 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) SDL_ReleaseGPUSampler(device, nearest_sampler); SDL_ReleaseGPUTexture(device, shadow_texture); SDL_ReleaseGPUTexture(device, composite_texture); - SDL_ReleaseGPUTexture(device, color_texture); - SDL_ReleaseGPUTexture(device, light_texture); SDL_ReleaseGPUTexture(device, position_texture); - SDL_ReleaseGPUTexture(device, voxel_texture); SDL_ReleaseGPUTexture(device, depth_texture); SDL_ReleaseGPUTexture(device, atlas_texture); SDL_DestroySurface(atlas_surface); - SDL_ReleaseGPUComputePipeline(device, composite_pipeline); SDL_ReleaseGPUComputePipeline(device, ui_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, raycast_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, sky_pipeline); @@ -561,17 +543,11 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) static bool resize(int width, int height) { SDL_ReleaseGPUTexture(device, depth_texture); - SDL_ReleaseGPUTexture(device, color_texture); - SDL_ReleaseGPUTexture(device, voxel_texture); SDL_ReleaseGPUTexture(device, position_texture); SDL_ReleaseGPUTexture(device, composite_texture); - SDL_ReleaseGPUTexture(device, light_texture); depth_texture = NULL; - color_texture = NULL; - voxel_texture = NULL; position_texture = NULL; composite_texture = NULL; - light_texture = NULL; SDL_GPUTextureCreateInfo info = {0}; info.type = SDL_GPU_TEXTURETYPE_2D; info.format = depth_format; @@ -586,38 +562,14 @@ static bool resize(int width, int height) SDL_Log("Failed to create depth texture: %s", SDL_GetError()); return false; } - info.format = color_format; - info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ; - color_texture = SDL_CreateGPUTexture(device, &info); - if (!color_texture) - { - SDL_Log("Failed to create color texture: %s", SDL_GetError()); - return false; - } - info.format = SDL_GPU_TEXTUREFORMAT_R8_UINT; - info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ; - voxel_texture = SDL_CreateGPUTexture(device, &info); - if (!voxel_texture) - { - SDL_Log("Failed to create voxel texture: %s", SDL_GetError()); - return false; - } info.format = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT; - info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ | SDL_GPU_TEXTUREUSAGE_SAMPLER; + info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_SAMPLER; position_texture = SDL_CreateGPUTexture(device, &info); if (!position_texture) { SDL_Log("Failed to create position texture: %s", SDL_GetError()); return false; } - info.format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; - info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ; - light_texture = SDL_CreateGPUTexture(device, &info); - if (!light_texture) - { - SDL_Log("Failed to create light texture: %s", SDL_GetError()); - return false; - } info.format = color_format; info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE | SDL_GPU_TEXTUREUSAGE_SAMPLER; composite_texture = SDL_CreateGPUTexture(device, &info); @@ -679,35 +631,31 @@ static void render_sky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) static void render_opaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { - SDL_GPUTextureSamplerBinding atlas_binding = {0}; - atlas_binding.texture = atlas_texture; - atlas_binding.sampler = nearest_sampler; + SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; + sampler_bindings[0].texture = atlas_texture; + sampler_bindings[0].sampler = nearest_sampler; + sampler_bindings[1].texture = shadow_texture; + sampler_bindings[1].sampler = linear_sampler; SDL_PushGPUDebugGroup(cbuf, "opaque"); SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); - SDL_BindGPUFragmentSamplers(pass, 0, &atlas_binding, 1); + SDL_PushGPUFragmentUniformData(cbuf, 1, &shadow_camera.matrix, 64); + SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); + SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); world_render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); } -static void render_gbuffer(SDL_GPUCommandBuffer* cbuf) +static void render_opaque_forward(SDL_GPUCommandBuffer* cbuf) { - SDL_GPUColorTargetInfo color_info[4] = {0}; + SDL_GPUColorTargetInfo color_info[2] = {0}; color_info[0].load_op = SDL_GPU_LOADOP_CLEAR; - color_info[0].texture = color_texture; + color_info[0].texture = composite_texture; color_info[0].cycle = true; color_info[0].store_op = SDL_GPU_STOREOP_STORE; color_info[1].load_op = SDL_GPU_LOADOP_CLEAR; color_info[1].texture = position_texture; color_info[1].cycle = true; color_info[1].store_op = SDL_GPU_STOREOP_STORE; - color_info[2].load_op = SDL_GPU_LOADOP_CLEAR; - color_info[2].texture = light_texture; - color_info[2].cycle = true; - color_info[2].store_op = SDL_GPU_STOREOP_STORE; - color_info[3].load_op = SDL_GPU_LOADOP_CLEAR; - color_info[3].texture = voxel_texture; - color_info[3].cycle = true; - color_info[3].store_op = SDL_GPU_STOREOP_STORE; SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_CLEAR; depth_info.stencil_load_op = SDL_GPU_LOADOP_CLEAR; @@ -715,7 +663,7 @@ static void render_gbuffer(SDL_GPUCommandBuffer* cbuf) depth_info.texture = depth_texture; depth_info.clear_depth = 1.0f; depth_info.cycle = true; - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, color_info, 4, &depth_info); + SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, color_info, 2, &depth_info); if (!pass) { SDL_Log("Failed to begin render pass: %s", SDL_GetError()); @@ -726,39 +674,6 @@ static void render_gbuffer(SDL_GPUCommandBuffer* cbuf) SDL_EndGPURenderPass(pass); } -static void render_composite(SDL_GPUCommandBuffer* cbuf) -{ - SDL_GPUStorageTextureReadWriteBinding write_textures = {0}; - write_textures.texture = composite_texture; - SDL_GPUComputePass* compute_pass = SDL_BeginGPUComputePass(cbuf, &write_textures, 1, NULL, 0); - if (!compute_pass) - { - SDL_Log("Failed to begin compute pass: %s", SDL_GetError()); - return; - } - SDL_GPUTexture* read_textures[4] = {0}; - SDL_GPUTextureSamplerBinding read_samplers = {0}; - read_textures[0] = color_texture; - read_textures[1] = light_texture; - read_textures[2] = voxel_texture; - read_textures[3] = position_texture; - read_samplers.texture = shadow_texture; - read_samplers.sampler = linear_sampler; - int groups_x = (player.camera.width + 8 - 1) / 8; - int groups_y = (player.camera.height + 8 - 1) / 8; - SDL_PushGPUDebugGroup(cbuf, "composite"); - SDL_BindGPUComputePipeline(compute_pass, composite_pipeline); - SDL_BindGPUComputeStorageTextures(compute_pass, 0, read_textures, 4); - SDL_BindGPUComputeSamplers(compute_pass, 0, &read_samplers, 1); - SDL_GPUBuffer* block_buffer = block_get_buffer(); - SDL_BindGPUComputeStorageBuffers(compute_pass, 0, &block_buffer, 1); - SDL_PushGPUComputeUniformData(cbuf, 0, &shadow_camera.matrix, 64); - SDL_PushGPUComputeUniformData(cbuf, 1, player.camera.position, 12); - SDL_DispatchGPUCompute(compute_pass, groups_x, groups_y, 1); - SDL_EndGPUComputePass(compute_pass); - SDL_PopGPUDebugGroup(cbuf); -} - static void render_depth(SDL_GPUCommandBuffer* cbuf) { SDL_GPUDepthStencilTargetInfo depth_info = {0}; @@ -900,8 +815,7 @@ static void render() } camera_update(&player.camera); render_shadow(cbuf); - render_gbuffer(cbuf); - render_composite(cbuf); + render_opaque_forward(cbuf); render_depth(cbuf); render_forward(cbuf); render_ui(cbuf); diff --git a/src/voxel.inc b/src/voxel.inc index c27fcbf9..14da387e 100644 --- a/src/voxel.inc +++ b/src/voxel.inc @@ -1,5 +1,5 @@ -#ifndef INC -#define INC +#ifndef VOXEL_INC +#define VOXEL_INC #define AO_BITS 2 #define DIRECTION_BITS 3 @@ -25,6 +25,5 @@ #define Z_MASK ((1 << Z_BITS) - 1) #define U_MASK ((1 << U_BITS) - 1) #define V_MASK ((1 << V_BITS) - 1) -#define MATERIAL_MASK ((1 << (DIRECTION_BITS + BLOCK_BITS)) - 1) #endif From bd4a73447cc6c5e4c26ab6cb895bf050c198af2d Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 22:02:57 -0400 Subject: [PATCH 04/39] v4 --- shaders/bin/opaque.frag.json | 2 +- shaders/bin/opaque.frag.msl | 179 ++++++++++++++++++------------ shaders/bin/opaque.frag.spv | Bin 8404 -> 9588 bytes shaders/bin/shadow.frag.json | 2 +- shaders/bin/shadow.frag.msl | 37 +++++- shaders/bin/shadow.frag.spv | Bin 156 -> 1956 bytes shaders/bin/shadow.vert.msl | 4 + shaders/bin/shadow.vert.spv | Bin 2684 -> 3060 bytes shaders/bin/transparent.frag.json | 2 +- shaders/bin/transparent.frag.msl | 179 ++++++++++++++++++------------ shaders/bin/transparent.frag.spv | Bin 8564 -> 9732 bytes shaders/opaque.frag | 9 +- shaders/shader.hlsl | 41 ++++--- shaders/shadow.frag | 20 +++- shaders/shadow.vert | 4 + shaders/transparent.frag | 9 +- src/main.c | 57 +++++++--- 17 files changed, 351 insertions(+), 194 deletions(-) diff --git a/shaders/bin/opaque.frag.json b/shaders/bin/opaque.frag.json index 41161993..34163435 100644 --- a/shaders/bin/opaque.frag.json +++ b/shaders/bin/opaque.frag.json @@ -1 +1 @@ -{ "samplers": 2, "storage_textures": 0, "storage_buffers": 2, "uniform_buffers": 3 } +{ "samplers": 2, "storage_textures": 0, "storage_buffers": 2, "uniform_buffers": 4 } diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 04ef811d..46372b2d 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -86,7 +86,12 @@ struct type_UniformBuffer_2 float3 PlayerPosition; }; -constant spvUnsafeArray _107 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +struct type_UniformBuffer_3 +{ + float3 SunDirection; +}; + +constant spvUnsafeArray _115 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -102,132 +107,158 @@ struct main0_in float in_var_TEXCOORD3 [[user(locn3)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], texture2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _124 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _132 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _133 = blockBuffer._m0[_124].IsSprite != 0u; - uint _136 = _132 + uint(_133 ? 6 : 0); - float3 _145 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_124].Indices[_133 ? 0u : _132])); - float4 _149 = atlasTexture.sample(atlasSampler, _145.xy, uint(rint(_145.z))); - if (_149.w < 0.001000000047497451305389404296875) + uint _132 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _140 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _141 = blockBuffer._m0[_132].IsSprite != 0u; + uint _144 = _140 + uint(_141 ? 6 : 0); + float3 _153 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_132].Indices[_141 ? 0u : _140])); + float4 _157 = atlasTexture.sample(atlasSampler, _153.xy, uint(rint(_153.z))); + if (_157.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _154 = _149.xyz; - uint _157 = uint(UniformBuffer.LightCount); - float3 _159; - _159 = float3(0.0); - float3 _160; - for (uint _162 = 0u; _162 < _157; _159 = _160, _162++) + float3 _162 = _157.xyz; + uint _165 = uint(UniformBuffer.LightCount); + float3 _167; + _167 = float3(0.0); + float3 _168; + for (uint _170 = 0u; _170 < _165; _167 = _168, _170++) { - float _175 = float((lightBuffer._m0[_162].Color & 4278190080u) >> 24u); - float3 _182 = (float3(float(lightBuffer._m0[_162].X), float(lightBuffer._m0[_162].Y), float(lightBuffer._m0[_162].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _183 = length(_182); - bool _189; - if (!(_183 >= _175)) + float _183 = float((lightBuffer._m0[_170].Color & 4278190080u) >> 24u); + float3 _190 = (float3(float(lightBuffer._m0[_170].X), float(lightBuffer._m0[_170].Y), float(lightBuffer._m0[_170].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _191 = length(_190); + bool _197; + if (!(_191 >= _183)) { - _189 = _175 <= 0.0; + _197 = _183 <= 0.0; } else { - _189 = true; + _197 = true; } - if (_189) + if (_197) { - _160 = _159; + _168 = _167; continue; } - float _195 = fast::clamp(dot(_107[_136], _182 / float3(_183)), 0.0, 1.0); - if (_195 <= 0.0) + float _203 = fast::clamp(dot(_115[_144], _190 / float3(_191)), 0.0, 1.0); + if (_203 <= 0.0) { - _160 = _159; + _168 = _167; continue; } - float _201 = fast::clamp(1.0 - (_183 / _175), 0.0, 1.0); - _160 = _159 + ((float3(float((lightBuffer._m0[_162].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_162].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_162].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _195) * (_201 * _201)); + float _209 = fast::clamp(1.0 - (_191 / _183), 0.0, 1.0); + _168 = _167 + ((float3(float((lightBuffer._m0[_170].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_170].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_170].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _203) * (_209 * _209)); } - float _281; + float _332; do { - float4 _230 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _234 = _230.xyz / float3(_230.w); - float2 _237 = (_234.xy * 0.5) + float2(0.5); - float _239 = 1.0 - _237.y; - float2 _240 = _237; - _240.y = _239; - float _241 = _237.x; - bool _247; - if (!(_241 < 0.0)) - { - _247 = _241 > 1.0; + float _243; + if (blockBuffer._m0[_132].HasOcclusion != 0u) + { + _243 = fast::clamp(-dot(_115[_144], UniformBuffer_3.SunDirection), 0.0, 1.0); } else { - _247 = true; + _243 = 0.7070000171661376953125; + } + if (_243 <= 0.0) + { + _332 = 0.0; + break; } - bool _252; - if (!_247) + float4 _251 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _255 = _251.xyz / float3(_251.w); + float2 _258 = (_255.xy * 0.5) + float2(0.5); + float _260 = 1.0 - _258.y; + float2 _261 = _258; + _261.y = _260; + float _262 = _258.x; + bool _268; + if (!(_262 < 0.0)) { - _252 = _239 < 0.0; + _268 = _262 > 1.0; } else { - _252 = true; + _268 = true; } - bool _257; - if (!_252) + bool _273; + if (!_268) { - _257 = _239 > 1.0; + _273 = _260 < 0.0; } else { - _257 = true; + _273 = true; } - if (_257) + bool _278; + if (!_273) { - _281 = 0.4000000059604644775390625; - break; + _278 = _260 > 1.0; } - float _270; - if (blockBuffer._m0[_124].HasOcclusion != 0u) + else { - float _266 = dot(_107[_136], fast::normalize(float4(UniformBuffer_1.ShadowTransform[0][2], UniformBuffer_1.ShadowTransform[1][2], UniformBuffer_1.ShadowTransform[2][2], UniformBuffer_1.ShadowTransform[3][2]).xyz)); - if (_266 > 0.0) - { - _281 = 0.0; - break; - } - _270 = _266; + _278 = true; + } + bool _284; + if (!_278) + { + _284 = _255.z < 0.0; } else { - _270 = -0.7070000171661376953125; + _284 = true; } - if (_234.z < (shadowTexture.sample(shadowSampler, _240, level(0.0)).x + 0.001000000047497451305389404296875)) + bool _290; + if (!_284) { - _281 = _270 * (-0.4000000059604644775390625); - break; + _290 = _255.z > 1.0; } else { - _281 = 0.0; + _290 = true; + } + if (_290) + { + _332 = 0.4000000059604644775390625 * _243; break; } - break; // unreachable workaround + uint2 _294 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _300 = float2(1.0) / float2(float(_294.x), float(_294.y)); + float _303 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _243)); + float _305; + int _308; + _305 = 0.0; + _308 = -1; + float _306; + for (; _308 <= 1; _305 = _306, _308++) + { + _306 = _305; + for (int _316 = -1; _316 <= 1; ) + { + _306 += shadowTexture.sample_compare(shadowSampler, (_261 + (float2(float(_308), float(_316)) * _300)), _255.z - _303, level(0.0)); + _316++; + continue; + } + } + _332 = (0.4000000059604644775390625 * _243) * (_305 * 0.111111111938953399658203125); + break; } while(false); - float3 _291; - if (blockBuffer._m0[_124].IsFullbright != 0u) + float3 _342; + if (blockBuffer._m0[_132].IsFullbright != 0u) { - _291 = _154; + _342 = _162; } else { - _291 = _154 * (((_159 * 2.0) + (float3(0.5) * in.in_var_TEXCOORD3)) + float3(_281)); + _342 = _162 * (((_167 * 2.0) + (float3(0.5) * in.in_var_TEXCOORD3)) + float3(_332)); } - float3 _295 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_291, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_295.y, length(float2(_295.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _346 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_342, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_346.y, length(float2(_346.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 0d048603ef79750f2700f8bf4a43f160a292ea6d..e337fd3c015d5c3fc14ec2f6aa534f7dc50153c1 100644 GIT binary patch literal 9588 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 literal 8404 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 diff --git a/shaders/bin/shadow.frag.json b/shaders/bin/shadow.frag.json index ec4afe4f..65b839b9 100644 --- a/shaders/bin/shadow.frag.json +++ b/shaders/bin/shadow.frag.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0 } +{ "samplers": 1, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 0 } diff --git a/shaders/bin/shadow.frag.msl b/shaders/bin/shadow.frag.msl index 92ac1d9f..f4cb6c0f 100644 --- a/shaders/bin/shadow.frag.msl +++ b/shaders/bin/shadow.frag.msl @@ -3,7 +3,42 @@ using namespace metal; -fragment void main0() +struct Block { + uint IsSprite; + uint HasOcclusion; + uint HasShadow; + uint IsFullbright; + uint Indices[6]; +}; + +struct type_StructuredBuffer_Block +{ + Block _m0[1]; +}; + +struct main0_in +{ + float2 in_var_TEXCOORD0 [[user(locn0)]]; + uint in_var_TEXCOORD1 [[user(locn1)]]; +}; + +fragment void main0(main0_in in [[stage_in]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(0)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) +{ + uint _41 = (in.in_var_TEXCOORD1 >> 3u) & 31u; + uint _50; + if (blockBuffer._m0[_41].IsSprite != 0u) + { + _50 = 0u; + } + else + { + _50 = (in.in_var_TEXCOORD1 >> 0u) & 7u; + } + float3 _56 = float3(in.in_var_TEXCOORD0, float(blockBuffer._m0[_41].Indices[_50])); + if (atlasTexture.sample(atlasSampler, _56.xy, uint(rint(_56.z))).w < 0.001000000047497451305389404296875) + { + discard_fragment(); + } } diff --git a/shaders/bin/shadow.frag.spv b/shaders/bin/shadow.frag.spv index b893138e1f0d7c3506e34227ef04dbec794a03a8..b41ed2226d25d4c7d9fecdeb23738188570fc092 100644 GIT binary patch literal 1956 zcmZ9M+foxj5QawxK|FB=Ihue66kP=s5kw50$W_!(%I%UYuw@{r-9+Wu$MFTc_Qof& zJd{@Xf0G?uovPmMzq_aB@199IJ7&9$IcAJGV+#7R`b|gT>9m+=ujw`!Y3u_(JS5N| zA)`-U{3;}?({xF1E7+CnX&yBKZ?Woy2mW5*`BCH_DVDW)ezWGsTfw_#D+;vD`m@q@ zPwXEwYC+`u)VKNNw7%cdWfDwSF*4(qm8w}+k;EARW&`dis<4|6ESPg=FwP89C#HwA5n)MIYN z!)jOwVsYs*Cxmxk)@CVBx1D8p=)LhHZ|m{)!&2$RqZ>-IF>3!8TWH5J|J(<4PAZU^ zT{3iIp4yw?ma#MTylIMPfjI+A?_ln5Mnb<1=Vi0N+(kMLPRHpn9S0M4^-sy>o|(<2 zPGe52*|z%QBOhNn4^H^FcefY*_^9iA?7`P3f%9o;&YY8w!+sVytWD)O-&tX12B!9i zzRWHsnO7cmucSWkeq~gcGw_i+EZi@hld#AK4_NdU4+@j-;zP2Tqr=0p;Y+;{>70al z5C@M+SS}yV=OkmACcVRleCCB_Ih|9+SleZD$Cbrd_{S4Jcv6^|!XG}63bSY3hN8 zls_ZADnyUGWfqv;m@x|sFWx3R!0^C^3m6{U5g1;x(!}BA=6+r_=Pv0axRJ}sNxmuj zg7lg)=*?zvIRq5`3xSxGl)W&)ZG!WB(U%rKd#+d#Fu5 zH4AzP^l?*??t@v9?|QkF> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.out_var_TEXCOORD0 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); + out.out_var_TEXCOORD1 = in.in_var_TEXCOORD0; out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].HasShadow != 0u) ? 1.0 : (-1.0); out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index 043c006ff0599ccf474c6f4417f1bdf53f1dfd74..ca8f94caaf038c651e161b4cf421298b7e79e7b3 100644 GIT binary patch literal 3060 zcmZ{k+j3M@5QcXqnZ#od2@nAqkMgQw9PU&rBv0vPqap%|XjMd;?#@ z@*%A9##iFT((l`|o9seZRXyGR--p$!*P1INO2*moQoXyQ;TD{c|D5 z9+$gU`#U@9o%GID4@kXoR?ps-TN`Pk*@dy=Bw4q!L6GQ zB>UR;gnG^=ZB>7&cd9q8tSzjpT)%wMDxTeYZTEZsbL#WHAN8He@GiC~LiS40?jTQSA^m}JBh%4~)0A|>I^hdn7=y%RVzgU07JGY`= ztiOb~-wSAa@=Qx~>pOML4%9==dUC}$Ysi@sxt?FnHxZmUa_;4x`_b%D@m zAQ3MvHvaL8EktFzjJcWz{jxN^9cKUXYOgw zQ{1+1N?a6Uj&efZkNzoa?@C;u#%pM2FXv2OM>|vRZj#?O&~jpPJ)4}lzD0B8^m)(W zdn@(bGhHfYvtVG};{NSn~|p{^j(4h_=3*_-u|n{{)_o(C6Ttuiqy{QDEof_b0Hk@O=dK?Aq>YzGv4S%CTqnZo=U&pL5q*Dg2K!t@?A8D0-#NFG^Zq|~ z^S+j`QOEoK7O`hnaNl9e4HdZWbFPH0(XapM9}x46*FS;$MqPbB zBKqAgxZBwB_8GIOV>_E!BxbXYEkB9GJvOlABX0xSykkh@HL>N3d7EJQ8h!blxr10s z{tr062V02q_51!i@7KAch`eX=e|dp_(+K)@ZkN&4k{`|V;BHQ1-$k60_4JFa_YV_2 Gi~I-XAk_8% literal 2684 zcmaKs+j3M@5QbMKgouYALI^6vN#X$oM-)W_IV1s+c*;NkBj81tOw5)rlbVB;ckl+j z2E{{I<&Cf8jiukWXE)hJrCg~__y6}{b+5Jd3|D4GQyNMsjin#??>dkwIis$E$I`HL z&h1YxJhLCJWi3GkF=9`yhtmjp6>=o)%kAE8+s)cauhVbz`km(bTz_Mu*{RKKwHpuc z?@4=!AE1Qo-(W3uSGGG@uPNG_Msway7uUMWjmB2Lo3-=(Bga1Qt!%EXw|_0=*xOR~ zT7PTnekc2Bvj?QsNM6sLms;ytquGTSVV9Kd+u5MYoN?lOhFh&{quqH}xbhl<(@3e_ zY5z=EUUeV(xzN1Mi~mzcpX+wkwDr8sOX%I|ybQm4Kch*XYksredQfk7v)gxRR@{KE}tl`~w-f_5${Z8zgT|-vECTk_hg@o`Ke;CW(MjRXFa)coHgXU-?Fh{&%oc0z|QUO zMPO(1_aU&eXuGfZ&Z0e3U}y2H<$MG7dm2gU(I58pDVF)p9&hBcf;+=4I _108 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +struct type_UniformBuffer_3 +{ + float3 SunDirection; +}; + +constant spvUnsafeArray _115 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -101,128 +106,154 @@ struct main0_in float2 in_var_TEXCOORD3 [[user(locn3)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], texture2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _127 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _133 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _134 = blockBuffer._m0[_127].IsSprite != 0u; - uint _137 = _133 + uint(_134 ? 6 : 0); - uint _140 = _134 ? 0u : _133; - float3 _146 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_127].Indices[_140])); - float4 _150 = atlasTexture.sample(atlasSampler, _146.xy, uint(rint(_146.z))); - float _152 = _150.w; - uint _155 = uint(UniformBuffer.LightCount); - float3 _157; - _157 = float3(0.0); - float3 _158; - for (uint _160 = 0u; _160 < _155; _157 = _158, _160++) + uint _134 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _140 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _141 = blockBuffer._m0[_134].IsSprite != 0u; + uint _144 = _140 + uint(_141 ? 6 : 0); + uint _147 = _141 ? 0u : _140; + float3 _153 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_134].Indices[_147])); + float4 _157 = atlasTexture.sample(atlasSampler, _153.xy, uint(rint(_153.z))); + float _159 = _157.w; + uint _162 = uint(UniformBuffer.LightCount); + float3 _164; + _164 = float3(0.0); + float3 _165; + for (uint _167 = 0u; _167 < _162; _164 = _165, _167++) { - float _173 = float((lightBuffer._m0[_160].Color & 4278190080u) >> 24u); - float3 _180 = (float3(float(lightBuffer._m0[_160].X), float(lightBuffer._m0[_160].Y), float(lightBuffer._m0[_160].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _181 = length(_180); - bool _187; - if (!(_181 >= _173)) + float _180 = float((lightBuffer._m0[_167].Color & 4278190080u) >> 24u); + float3 _187 = (float3(float(lightBuffer._m0[_167].X), float(lightBuffer._m0[_167].Y), float(lightBuffer._m0[_167].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _188 = length(_187); + bool _194; + if (!(_188 >= _180)) { - _187 = _173 <= 0.0; + _194 = _180 <= 0.0; } else { - _187 = true; + _194 = true; } - if (_187) + if (_194) { - _158 = _157; + _165 = _164; continue; } - float _193 = fast::clamp(dot(_108[_137], _180 / float3(_181)), 0.0, 1.0); - if (_193 <= 0.0) + float _200 = fast::clamp(dot(_115[_144], _187 / float3(_188)), 0.0, 1.0); + if (_200 <= 0.0) { - _158 = _157; + _165 = _164; continue; } - float _199 = fast::clamp(1.0 - (_181 / _173), 0.0, 1.0); - _158 = _157 + ((float3(float((lightBuffer._m0[_160].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _193) * (_199 * _199)); + float _206 = fast::clamp(1.0 - (_188 / _180), 0.0, 1.0); + _165 = _164 + ((float3(float((lightBuffer._m0[_167].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _200) * (_206 * _206)); } - float _279; + float _329; do { - float4 _228 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _232 = _228.xyz / float3(_228.w); - float2 _235 = (_232.xy * 0.5) + float2(0.5); - float _237 = 1.0 - _235.y; - float2 _238 = _235; - _238.y = _237; - float _239 = _235.x; - bool _245; - if (!(_239 < 0.0)) - { - _245 = _239 > 1.0; + float _240; + if (blockBuffer._m0[_134].HasOcclusion != 0u) + { + _240 = fast::clamp(-dot(_115[_144], UniformBuffer_3.SunDirection), 0.0, 1.0); } else { - _245 = true; + _240 = 0.7070000171661376953125; + } + if (_240 <= 0.0) + { + _329 = 0.0; + break; } - bool _250; - if (!_245) + float4 _248 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _252 = _248.xyz / float3(_248.w); + float2 _255 = (_252.xy * 0.5) + float2(0.5); + float _257 = 1.0 - _255.y; + float2 _258 = _255; + _258.y = _257; + float _259 = _255.x; + bool _265; + if (!(_259 < 0.0)) { - _250 = _237 < 0.0; + _265 = _259 > 1.0; } else { - _250 = true; + _265 = true; } - bool _255; - if (!_250) + bool _270; + if (!_265) { - _255 = _237 > 1.0; + _270 = _257 < 0.0; } else { - _255 = true; + _270 = true; } - if (_255) + bool _275; + if (!_270) { - _279 = 0.4000000059604644775390625; - break; + _275 = _257 > 1.0; } - float _268; - if (blockBuffer._m0[_127].HasOcclusion != 0u) + else { - float _264 = dot(_108[_137], fast::normalize(float4(UniformBuffer_1.ShadowTransform[0][2], UniformBuffer_1.ShadowTransform[1][2], UniformBuffer_1.ShadowTransform[2][2], UniformBuffer_1.ShadowTransform[3][2]).xyz)); - if (_264 > 0.0) - { - _279 = 0.0; - break; - } - _268 = _264; + _275 = true; + } + bool _281; + if (!_275) + { + _281 = _252.z < 0.0; } else { - _268 = -0.7070000171661376953125; + _281 = true; } - if (_232.z < (shadowTexture.sample(shadowSampler, _238, level(0.0)).x + 0.001000000047497451305389404296875)) + bool _287; + if (!_281) { - _279 = _268 * (-0.4000000059604644775390625); - break; + _287 = _252.z > 1.0; } else { - _279 = 0.0; + _287 = true; + } + if (_287) + { + _329 = 0.4000000059604644775390625 * _240; break; } - break; // unreachable workaround + uint2 _291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _297 = float2(1.0) / float2(float(_291.x), float(_291.y)); + float _300 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _240)); + float _302; + int _305; + _302 = 0.0; + _305 = -1; + float _303; + for (; _305 <= 1; _302 = _303, _305++) + { + _303 = _302; + for (int _313 = -1; _313 <= 1; ) + { + _303 += shadowTexture.sample_compare(shadowSampler, (_258 + (float2(float(_305), float(_313)) * _297)), _252.z - _300, level(0.0)); + _313++; + continue; + } + } + _329 = (0.4000000059604644775390625 * _240) * (_302 * 0.111111111938953399658203125); + break; } while(false); - float3 _283 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _314; - if (blockBuffer._m0[_127].Indices[_140] == 16u) + float3 _333 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _364; + if (blockBuffer._m0[_134].Indices[_147] == 16u) { - _314 = _152 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _364 = _159 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _314 = _152; + _364 = _159; } - out.out_var_SV_Target0 = float4(mix(_150.xyz * (((_157 * 2.0) + float3(0.5)) + float3(_279)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_283.y, length(float2(_283.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _314); + out.out_var_SV_Target0 = float4(mix(_157.xyz * (((_164 * 2.0) + float3(0.5)) + float3(_329)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_333.y, length(float2(_333.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _364); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 57aa86a0daf443ca2665ee6ef8981007abf91379..9636b9190866da5e8ef2688adddc87906d713b7b 100644 GIT binary patch literal 9732 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 DY+BH_ literal 8564 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 R=j{J)8ALyQ&olDz;D2^SRd4_R diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 06e35d17..2fc1fb72 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -3,7 +3,7 @@ Texture2DArray atlasTexture : register(t0, space2); SamplerState atlasSampler : register(s0, space2); Texture2D shadowTexture : register(t1, space2); -SamplerState shadowSampler : register(s1, space2); +SamplerComparisonState shadowSampler : register(s1, space2); StructuredBuffer blockBuffer : register(t2, space2); StructuredBuffer lightBuffer : register(t3, space2); @@ -22,6 +22,11 @@ cbuffer UniformBuffer : register(b2, space3) float3 PlayerPosition : packoffset(c0); }; +cbuffer UniformBuffer : register(b3, space3) +{ + float3 SunDirection : packoffset(c0); +}; + struct Input { float4 WorldPosition : TEXCOORD0; @@ -52,7 +57,7 @@ Output main(Input input) float3 albedo = color.rgb; float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); float3 ambient = GetAmbientLight(); - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, input.WorldPosition.xyz, normal, block); + float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, SunDirection, input.WorldPosition.xyz, normal, block); float3 finalColor; if (block.IsFullbright) { diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 558f612e..8f32f52c 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -153,39 +153,36 @@ float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 p return finalColor * kLight; } -float GetSunLight(Texture2D texture, SamplerState state, float4x4 transform, float3 position, float3 normal, Block block) +float GetSunLight(Texture2D texture, SamplerComparisonState state, float4x4 transform, float3 sunDirection, float3 position, float3 normal, Block block) { - static const float kBias = 0.001f; static const float kBase = 0.0f; static const float kShadow = 0.4f; + float ratio = block.HasOcclusion ? saturate(-dot(normal, sunDirection)) : 0.707f; + if (ratio <= 0.0f) + { + return kBase; + } float4 shadowPosition = mul(transform, float4(position, 1.0f)); shadowPosition.xyz /= shadowPosition.w; float2 uv = shadowPosition.xy * 0.5f + 0.5f; uv.y = 1.0f - uv.y; - if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f) - { - return kBase + kShadow; - } - float3 direction = normalize(float3(transform[2].xyz)); - float ratio = -0.707f; - if (block.HasOcclusion) - { - ratio = dot(normal, direction); - if (ratio > 0.0f) - { - return 0.0f; - } - } - float depth = shadowPosition.z; - float closestDepth = texture.SampleLevel(state, uv, 0); - if (depth < closestDepth + kBias) + if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || shadowPosition.z > 1.0f) { - return kBase - kShadow * ratio; + return kBase + kShadow * ratio; } - else + uint width; + uint height; + texture.GetDimensions(width, height); + float2 texelSize = 1.0f / float2(width, height); + float bias = 0.0003f + 0.001f * (1.0f - ratio); + float visibility = 0.0f; + for (int x = -1; x <= 1; x++) + for (int y = -1; y <= 1; y++) { - return 0.0f; + visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); } + visibility /= 9.0f; + return kBase + kShadow * ratio * visibility; } float3 GetAmbientLight() diff --git a/shaders/shadow.frag b/shaders/shadow.frag index 91981030..a8c8822f 100644 --- a/shaders/shadow.frag +++ b/shaders/shadow.frag @@ -1,3 +1,21 @@ -void main() +#include "shader.hlsl" + +Texture2DArray atlasTexture : register(t0, space2); +SamplerState atlasSampler : register(s0, space2); +StructuredBuffer blockBuffer : register(t1, space2); + +struct Input { + float2 Texcoord : TEXCOORD0; + nointerpolation uint Voxel : TEXCOORD1; +}; + +void main(Input input) +{ + Block block = blockBuffer[GetBlock(input.Voxel)]; + float3 texcoord = float3(input.Texcoord, GetIndex(input.Voxel, block)); + if (atlasTexture.Sample(atlasSampler, texcoord).a < kEpsilon) + { + discard; + } } diff --git a/shaders/shadow.vert b/shaders/shadow.vert index ba270d9d..805e68b2 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -25,6 +25,8 @@ struct Input struct Output { float4 Position : SV_Position; + float2 Texcoord : TEXCOORD0; + nointerpolation uint Voxel : TEXCOORD1; float ClipDistance : SV_ClipDistance0; }; @@ -35,6 +37,8 @@ Output main(Input input) float3 position = GetPosition(input.Voxel) + chunkPosition; Block block = blockBuffer[GetBlock(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); + output.Texcoord = GetTexcoord(input.Voxel); + output.Voxel = input.Voxel; output.ClipDistance = block.HasShadow ? 1.0f : -1.0f; return output; } diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 2efa9bbf..4e069f1f 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -3,7 +3,7 @@ Texture2DArray atlasTexture : register(t0, space2); SamplerState atlasSampler : register(s0, space2); Texture2D shadowTexture : register(t1, space2); -SamplerState shadowSampler : register(s1, space2); +SamplerComparisonState shadowSampler : register(s1, space2); Texture2D positionTexture : register(t2, space2); SamplerState positionSampler : register(s2, space2); StructuredBuffer blockBuffer : register(t3, space2); @@ -24,6 +24,11 @@ cbuffer UniformBuffer : register(b2, space3) float3 PlayerPosition : packoffset(c0); }; +cbuffer UniformBuffer : register(b3, space3) +{ + float3 SunDirection : packoffset(c0); +}; + struct Input { float4 WorldPosition : TEXCOORD0; @@ -45,7 +50,7 @@ float4 main(Input input) : SV_Target0 float4 position = input.WorldPosition; float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, position, normal); float3 ambient = GetAmbientLight(); - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, position.xyz, normal, block); + float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, SunDirection, position.xyz, normal, block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition); float fog = GetFog(distance(position.xz, PlayerPosition.xz)); if (GetIndex(input.Voxel, block) == kWater) diff --git a/src/main.c b/src/main.c index 0d2ec9a4..f59a3e42 100644 --- a/src/main.c +++ b/src/main.c @@ -19,8 +19,8 @@ static const int SHADOW_RESOLUTION = 4096.0f; static const float SHADOW_Y = 30.0f; static const float SHADOW_ORTHO = 300.0f; static const float SHADOW_FAR = 300.0f; -static const float SHADOW_PITCH = -45.0f; -static const float SHADOW_YAW = 45.0f; +static const float SHADOW_PITCH = -SDL_PI_F / 4.0f; +static const float SHADOW_YAW = SDL_PI_F / 4.0f; static SDL_Window* window; static SDL_GPUDevice* device; @@ -37,11 +37,12 @@ static SDL_Surface* atlas_surface; static SDL_GPUTexture* atlas_texture; static SDL_GPUTexture* depth_texture; static SDL_GPUTexture* position_texture; -static SDL_GPUTexture* composite_texture; +static SDL_GPUTexture* composite_texture; // TODO: remove, replace with swapchain static SDL_GPUTexture* shadow_texture; -static SDL_GPUSampler* linear_sampler; static SDL_GPUSampler* nearest_sampler; +static SDL_GPUSampler* shadow_sampler; static camera_t shadow_camera; +static float sun_direction[3]; static player_t player; static Uint64 ticks1; static Uint64 ticks2; @@ -304,6 +305,11 @@ static bool create_shadow_pipeline() info.depth_stencil_state.enable_depth_test = true; info.depth_stencil_state.enable_depth_write = true; info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS; + info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; + info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; + info.rasterizer_state.depth_bias_constant_factor = 1.0f; + info.rasterizer_state.depth_bias_slope_factor = 1.0f; + info.rasterizer_state.enable_depth_bias = true; if (info.vertex_shader && info.fragment_shader) { shadow_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); @@ -372,12 +378,6 @@ static bool create_samplers() info.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; info.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; info.address_mode_w = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; - linear_sampler = SDL_CreateGPUSampler(device, &info); - if (!linear_sampler) - { - SDL_Log("Failed to create linear sampler: %s", SDL_GetError()); - return false; - } info.min_filter = SDL_GPU_FILTER_NEAREST; info.mag_filter = SDL_GPU_FILTER_NEAREST; nearest_sampler = SDL_CreateGPUSampler(device, &info); @@ -386,6 +386,16 @@ static bool create_samplers() SDL_Log("Failed to create nearest sampler: %s", SDL_GetError()); return false; } + info.min_filter = SDL_GPU_FILTER_LINEAR; + info.mag_filter = SDL_GPU_FILTER_LINEAR; + info.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; + info.enable_compare = true; + shadow_sampler = SDL_CreateGPUSampler(device, &info); + if (!shadow_sampler) + { + SDL_Log("Failed to create shadow sampler: %s", SDL_GetError()); + return false; + } return true; } @@ -519,8 +529,8 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) block_free(); player_save_or_load(&player, PLAYER_ID, true); save_free(); - SDL_ReleaseGPUSampler(device, linear_sampler); SDL_ReleaseGPUSampler(device, nearest_sampler); + SDL_ReleaseGPUSampler(device, shadow_sampler); SDL_ReleaseGPUTexture(device, shadow_texture); SDL_ReleaseGPUTexture(device, composite_texture); SDL_ReleaseGPUTexture(device, position_texture); @@ -587,12 +597,22 @@ static void update_shadow_camera() camera_init(&shadow_camera, CAMERA_TYPE_ORTHO); shadow_camera.ortho = SHADOW_ORTHO; shadow_camera.far = SHADOW_FAR; - shadow_camera.x = SDL_floor(player.camera.x / CHUNK_WIDTH) * CHUNK_WIDTH; + shadow_camera.x = player.camera.x; shadow_camera.y = SHADOW_Y; - shadow_camera.z = SDL_floor(player.camera.z / CHUNK_WIDTH) * CHUNK_WIDTH; + shadow_camera.z = player.camera.z; shadow_camera.pitch = SHADOW_PITCH; shadow_camera.yaw = SHADOW_YAW; camera_update(&shadow_camera); + float texel_size = SHADOW_ORTHO * 2.0f / SHADOW_RESOLUTION; + float light_x = shadow_camera.view[0][0] * shadow_camera.x + shadow_camera.view[1][0] * shadow_camera.y + shadow_camera.view[2][0] * shadow_camera.z; + float light_y = shadow_camera.view[0][1] * shadow_camera.x + shadow_camera.view[1][1] * shadow_camera.y + shadow_camera.view[2][1] * shadow_camera.z; + float delta_x = SDL_roundf(light_x / texel_size) * texel_size - light_x; + float delta_y = SDL_roundf(light_y / texel_size) * texel_size - light_y; + shadow_camera.x += shadow_camera.view[0][0] * delta_x + shadow_camera.view[0][1] * delta_y; + shadow_camera.y += shadow_camera.view[1][0] * delta_x + shadow_camera.view[1][1] * delta_y; + shadow_camera.z += shadow_camera.view[2][0] * delta_x + shadow_camera.view[2][1] * delta_y; + camera_update(&shadow_camera); + camera_get_vector(&shadow_camera, &sun_direction[0], &sun_direction[1], &sun_direction[2]); } static void render_shadow(SDL_GPUCommandBuffer* cbuf) @@ -613,6 +633,11 @@ static void render_shadow(SDL_GPUCommandBuffer* cbuf) SDL_BindGPUGraphicsPipeline(pass, shadow_pipeline); SDL_GPUBuffer* block_buffer = block_get_buffer(); SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); + SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); + SDL_GPUTextureSamplerBinding atlas_binding = {0}; + atlas_binding.texture = atlas_texture; + atlas_binding.sampler = nearest_sampler; + SDL_BindGPUFragmentSamplers(pass, 0, &atlas_binding, 1); SDL_PushGPUDebugGroup(cbuf, "shadow"); world_render(&shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); SDL_PopGPUDebugGroup(cbuf); @@ -635,11 +660,12 @@ static void render_opaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) sampler_bindings[0].texture = atlas_texture; sampler_bindings[0].sampler = nearest_sampler; sampler_bindings[1].texture = shadow_texture; - sampler_bindings[1].sampler = linear_sampler; + sampler_bindings[1].sampler = shadow_sampler; SDL_PushGPUDebugGroup(cbuf, "opaque"); SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); SDL_PushGPUFragmentUniformData(cbuf, 1, &shadow_camera.matrix, 64); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); + SDL_PushGPUFragmentUniformData(cbuf, 3, sun_direction, 12); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); world_render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); @@ -699,13 +725,14 @@ static void render_transparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pa sampler_bindings[0].texture = atlas_texture; sampler_bindings[0].sampler = nearest_sampler; sampler_bindings[1].texture = shadow_texture; - sampler_bindings[1].sampler = linear_sampler; + sampler_bindings[1].sampler = shadow_sampler; sampler_bindings[2].texture = position_texture; sampler_bindings[2].sampler = nearest_sampler; SDL_PushGPUDebugGroup(cbuf, "transparent"); SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); SDL_PushGPUFragmentUniformData(cbuf, 1, &shadow_camera.matrix, 64); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); + SDL_PushGPUFragmentUniformData(cbuf, 3, sun_direction, 12); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); world_render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); From 66767519d0455b7bdc558c1c72abaca1db018e20 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 22:13:32 -0400 Subject: [PATCH 05/39] v5 --- shaders/bin/opaque.frag.msl | 172 +++++++++++++++---------------- shaders/bin/opaque.frag.spv | Bin 9588 -> 9584 bytes shaders/bin/transparent.frag.msl | 172 +++++++++++++++---------------- shaders/bin/transparent.frag.spv | Bin 9732 -> 9728 bytes shaders/shader.hlsl | 7 +- 5 files changed, 175 insertions(+), 176 deletions(-) diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 46372b2d..6b6b1a73 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -10,7 +10,7 @@ template struct spvUnsafeArray { T elements[Num ? Num : 1]; - + thread T& operator [] (size_t pos) thread { return elements[pos]; @@ -19,7 +19,7 @@ struct spvUnsafeArray { return elements[pos]; } - + device T& operator [] (size_t pos) device { return elements[pos]; @@ -28,12 +28,12 @@ struct spvUnsafeArray { return elements[pos]; } - + constexpr const constant T& operator [] (size_t pos) const constant { return elements[pos]; } - + threadgroup T& operator [] (size_t pos) threadgroup { return elements[pos]; @@ -91,7 +91,7 @@ struct type_UniformBuffer_3 float3 SunDirection; }; -constant spvUnsafeArray _115 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _114 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -110,155 +110,155 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _132 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _140 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _141 = blockBuffer._m0[_132].IsSprite != 0u; - uint _144 = _140 + uint(_141 ? 6 : 0); - float3 _153 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_132].Indices[_141 ? 0u : _140])); - float4 _157 = atlasTexture.sample(atlasSampler, _153.xy, uint(rint(_153.z))); - if (_157.w < 0.001000000047497451305389404296875) + uint _131 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _139 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _140 = blockBuffer._m0[_131].IsSprite != 0u; + uint _143 = _139 + uint(_140 ? 6 : 0); + float3 _152 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_131].Indices[_140 ? 0u : _139])); + float4 _156 = atlasTexture.sample(atlasSampler, _152.xy, uint(rint(_152.z))); + if (_156.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _162 = _157.xyz; - uint _165 = uint(UniformBuffer.LightCount); + float3 _161 = _156.xyz; + uint _164 = uint(UniformBuffer.LightCount); + float3 _166; + _166 = float3(0.0); float3 _167; - _167 = float3(0.0); - float3 _168; - for (uint _170 = 0u; _170 < _165; _167 = _168, _170++) + for (uint _169 = 0u; _169 < _164; _166 = _167, _169++) { - float _183 = float((lightBuffer._m0[_170].Color & 4278190080u) >> 24u); - float3 _190 = (float3(float(lightBuffer._m0[_170].X), float(lightBuffer._m0[_170].Y), float(lightBuffer._m0[_170].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _191 = length(_190); - bool _197; - if (!(_191 >= _183)) + float _182 = float((lightBuffer._m0[_169].Color & 4278190080u) >> 24u); + float3 _189 = (float3(float(lightBuffer._m0[_169].X), float(lightBuffer._m0[_169].Y), float(lightBuffer._m0[_169].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _190 = length(_189); + bool _196; + if (!(_190 >= _182)) { - _197 = _183 <= 0.0; + _196 = _182 <= 0.0; } else { - _197 = true; + _196 = true; } - if (_197) + if (_196) { - _168 = _167; + _167 = _166; continue; } - float _203 = fast::clamp(dot(_115[_144], _190 / float3(_191)), 0.0, 1.0); - if (_203 <= 0.0) + float _202 = fast::clamp(dot(_114[_143], _189 / float3(_190)), 0.0, 1.0); + if (_202 <= 0.0) { - _168 = _167; + _167 = _166; continue; } - float _209 = fast::clamp(1.0 - (_191 / _183), 0.0, 1.0); - _168 = _167 + ((float3(float((lightBuffer._m0[_170].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_170].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_170].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _203) * (_209 * _209)); + _167 = _166 + ((float3(float((lightBuffer._m0[_169].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_169].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_169].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _202) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_190 / _182, 0.0, 1.0)))); } - float _332; + float _331; do { - float _243; - if (blockBuffer._m0[_132].HasOcclusion != 0u) + float _242; + if (blockBuffer._m0[_131].HasOcclusion != 0u) { - _243 = fast::clamp(-dot(_115[_144], UniformBuffer_3.SunDirection), 0.0, 1.0); + _242 = fast::clamp(-dot(_114[_143], UniformBuffer_3.SunDirection), 0.0, 1.0); } else { - _243 = 0.7070000171661376953125; + _242 = 0.7070000171661376953125; } - if (_243 <= 0.0) + if (_242 <= 0.0) { - _332 = 0.0; + _331 = 0.0; break; } - float4 _251 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _255 = _251.xyz / float3(_251.w); - float2 _258 = (_255.xy * 0.5) + float2(0.5); - float _260 = 1.0 - _258.y; - float2 _261 = _258; - _261.y = _260; - float _262 = _258.x; - bool _268; - if (!(_262 < 0.0)) + float4 _250 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _254 = _250.xyz / float3(_250.w); + float2 _257 = (_254.xy * 0.5) + float2(0.5); + float _259 = 1.0 - _257.y; + float2 _260 = _257; + _260.y = _259; + float _261 = _257.x; + bool _267; + if (!(_261 < 0.0)) { - _268 = _262 > 1.0; + _267 = _261 > 1.0; } else { - _268 = true; + _267 = true; } - bool _273; - if (!_268) + bool _272; + if (!_267) { - _273 = _260 < 0.0; + _272 = _259 < 0.0; } else { - _273 = true; + _272 = true; } - bool _278; - if (!_273) + bool _277; + if (!_272) { - _278 = _260 > 1.0; + _277 = _259 > 1.0; } else { - _278 = true; + _277 = true; } - bool _284; - if (!_278) + bool _283; + if (!_277) { - _284 = _255.z < 0.0; + _283 = _254.z < 0.0; } else { - _284 = true; + _283 = true; } - bool _290; - if (!_284) + bool _289; + if (!_283) { - _290 = _255.z > 1.0; + _289 = _254.z > 1.0; } else { - _290 = true; + _289 = true; } - if (_290) + if (_289) { - _332 = 0.4000000059604644775390625 * _243; + _331 = 0.4000000059604644775390625 * _242; break; } - uint2 _294 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _300 = float2(1.0) / float2(float(_294.x), float(_294.y)); - float _303 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _243)); + uint2 _293 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _299 = float2(1.0) / float2(float(_293.x), float(_293.y)); + float _302 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _242)); + float _304; + int _307; + _304 = 0.0; + _307 = -1; float _305; - int _308; - _305 = 0.0; - _308 = -1; - float _306; - for (; _308 <= 1; _305 = _306, _308++) + for (; _307 <= 1; _304 = _305, _307++) { - _306 = _305; - for (int _316 = -1; _316 <= 1; ) + _305 = _304; + for (int _315 = -1; _315 <= 1; ) { - _306 += shadowTexture.sample_compare(shadowSampler, (_261 + (float2(float(_308), float(_316)) * _300)), _255.z - _303, level(0.0)); - _316++; + _305 += shadowTexture.sample_compare(shadowSampler, (_260 + (float2(float(_307), float(_315)) * _299)), _254.z - _302, level(0.0)); + _315++; continue; } } - _332 = (0.4000000059604644775390625 * _243) * (_305 * 0.111111111938953399658203125); + _331 = (0.4000000059604644775390625 * _242) * (_304 * 0.111111111938953399658203125); break; } while(false); - float3 _342; - if (blockBuffer._m0[_132].IsFullbright != 0u) + float3 _341; + if (blockBuffer._m0[_131].IsFullbright != 0u) { - _342 = _162; + _341 = _161; } else { - _342 = _162 * (((_167 * 2.0) + (float3(0.5) * in.in_var_TEXCOORD3)) + float3(_332)); + _341 = _161 * (((_166 * 1.0) + (float3(0.5) * in.in_var_TEXCOORD3)) + float3(_331)); } - float3 _346 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_342, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_346.y, length(float2(_346.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _345 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_341, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_345.y, length(float2(_345.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } + diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index e337fd3c015d5c3fc14ec2f6aa534f7dc50153c1..cb2dc8acb206a524808fe3ea2eef4302fc9a4656 100644 GIT binary patch literal 9584 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 diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index 79d28e76..0f390350 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -10,7 +10,7 @@ template struct spvUnsafeArray { T elements[Num ? Num : 1]; - + thread T& operator [] (size_t pos) thread { return elements[pos]; @@ -19,7 +19,7 @@ struct spvUnsafeArray { return elements[pos]; } - + device T& operator [] (size_t pos) device { return elements[pos]; @@ -28,12 +28,12 @@ struct spvUnsafeArray { return elements[pos]; } - + constexpr const constant T& operator [] (size_t pos) const constant { return elements[pos]; } - + threadgroup T& operator [] (size_t pos) threadgroup { return elements[pos]; @@ -91,7 +91,7 @@ struct type_UniformBuffer_3 float3 SunDirection; }; -constant spvUnsafeArray _115 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _114 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -109,151 +109,151 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _134 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _140 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _141 = blockBuffer._m0[_134].IsSprite != 0u; - uint _144 = _140 + uint(_141 ? 6 : 0); - uint _147 = _141 ? 0u : _140; - float3 _153 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_134].Indices[_147])); - float4 _157 = atlasTexture.sample(atlasSampler, _153.xy, uint(rint(_153.z))); - float _159 = _157.w; - uint _162 = uint(UniformBuffer.LightCount); + uint _133 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _139 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _140 = blockBuffer._m0[_133].IsSprite != 0u; + uint _143 = _139 + uint(_140 ? 6 : 0); + uint _146 = _140 ? 0u : _139; + float3 _152 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_133].Indices[_146])); + float4 _156 = atlasTexture.sample(atlasSampler, _152.xy, uint(rint(_152.z))); + float _158 = _156.w; + uint _161 = uint(UniformBuffer.LightCount); + float3 _163; + _163 = float3(0.0); float3 _164; - _164 = float3(0.0); - float3 _165; - for (uint _167 = 0u; _167 < _162; _164 = _165, _167++) + for (uint _166 = 0u; _166 < _161; _163 = _164, _166++) { - float _180 = float((lightBuffer._m0[_167].Color & 4278190080u) >> 24u); - float3 _187 = (float3(float(lightBuffer._m0[_167].X), float(lightBuffer._m0[_167].Y), float(lightBuffer._m0[_167].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _188 = length(_187); - bool _194; - if (!(_188 >= _180)) + float _179 = float((lightBuffer._m0[_166].Color & 4278190080u) >> 24u); + float3 _186 = (float3(float(lightBuffer._m0[_166].X), float(lightBuffer._m0[_166].Y), float(lightBuffer._m0[_166].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _187 = length(_186); + bool _193; + if (!(_187 >= _179)) { - _194 = _180 <= 0.0; + _193 = _179 <= 0.0; } else { - _194 = true; + _193 = true; } - if (_194) + if (_193) { - _165 = _164; + _164 = _163; continue; } - float _200 = fast::clamp(dot(_115[_144], _187 / float3(_188)), 0.0, 1.0); - if (_200 <= 0.0) + float _199 = fast::clamp(dot(_114[_143], _186 / float3(_187)), 0.0, 1.0); + if (_199 <= 0.0) { - _165 = _164; + _164 = _163; continue; } - float _206 = fast::clamp(1.0 - (_188 / _180), 0.0, 1.0); - _165 = _164 + ((float3(float((lightBuffer._m0[_167].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _200) * (_206 * _206)); + _164 = _163 + ((float3(float((lightBuffer._m0[_166].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _199) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_187 / _179, 0.0, 1.0)))); } - float _329; + float _328; do { - float _240; - if (blockBuffer._m0[_134].HasOcclusion != 0u) + float _239; + if (blockBuffer._m0[_133].HasOcclusion != 0u) { - _240 = fast::clamp(-dot(_115[_144], UniformBuffer_3.SunDirection), 0.0, 1.0); + _239 = fast::clamp(-dot(_114[_143], UniformBuffer_3.SunDirection), 0.0, 1.0); } else { - _240 = 0.7070000171661376953125; + _239 = 0.7070000171661376953125; } - if (_240 <= 0.0) + if (_239 <= 0.0) { - _329 = 0.0; + _328 = 0.0; break; } - float4 _248 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _252 = _248.xyz / float3(_248.w); - float2 _255 = (_252.xy * 0.5) + float2(0.5); - float _257 = 1.0 - _255.y; - float2 _258 = _255; - _258.y = _257; - float _259 = _255.x; - bool _265; - if (!(_259 < 0.0)) + float4 _247 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _251 = _247.xyz / float3(_247.w); + float2 _254 = (_251.xy * 0.5) + float2(0.5); + float _256 = 1.0 - _254.y; + float2 _257 = _254; + _257.y = _256; + float _258 = _254.x; + bool _264; + if (!(_258 < 0.0)) { - _265 = _259 > 1.0; + _264 = _258 > 1.0; } else { - _265 = true; + _264 = true; } - bool _270; - if (!_265) + bool _269; + if (!_264) { - _270 = _257 < 0.0; + _269 = _256 < 0.0; } else { - _270 = true; + _269 = true; } - bool _275; - if (!_270) + bool _274; + if (!_269) { - _275 = _257 > 1.0; + _274 = _256 > 1.0; } else { - _275 = true; + _274 = true; } - bool _281; - if (!_275) + bool _280; + if (!_274) { - _281 = _252.z < 0.0; + _280 = _251.z < 0.0; } else { - _281 = true; + _280 = true; } - bool _287; - if (!_281) + bool _286; + if (!_280) { - _287 = _252.z > 1.0; + _286 = _251.z > 1.0; } else { - _287 = true; + _286 = true; } - if (_287) + if (_286) { - _329 = 0.4000000059604644775390625 * _240; + _328 = 0.4000000059604644775390625 * _239; break; } - uint2 _291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _297 = float2(1.0) / float2(float(_291.x), float(_291.y)); - float _300 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _240)); + uint2 _290 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _296 = float2(1.0) / float2(float(_290.x), float(_290.y)); + float _299 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _239)); + float _301; + int _304; + _301 = 0.0; + _304 = -1; float _302; - int _305; - _302 = 0.0; - _305 = -1; - float _303; - for (; _305 <= 1; _302 = _303, _305++) + for (; _304 <= 1; _301 = _302, _304++) { - _303 = _302; - for (int _313 = -1; _313 <= 1; ) + _302 = _301; + for (int _312 = -1; _312 <= 1; ) { - _303 += shadowTexture.sample_compare(shadowSampler, (_258 + (float2(float(_305), float(_313)) * _297)), _252.z - _300, level(0.0)); - _313++; + _302 += shadowTexture.sample_compare(shadowSampler, (_257 + (float2(float(_304), float(_312)) * _296)), _251.z - _299, level(0.0)); + _312++; continue; } } - _329 = (0.4000000059604644775390625 * _240) * (_302 * 0.111111111938953399658203125); + _328 = (0.4000000059604644775390625 * _239) * (_301 * 0.111111111938953399658203125); break; } while(false); - float3 _333 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _364; - if (blockBuffer._m0[_134].Indices[_147] == 16u) + float3 _332 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _363; + if (blockBuffer._m0[_133].Indices[_146] == 16u) { - _364 = _159 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _363 = _158 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _364 = _159; + _363 = _158; } - out.out_var_SV_Target0 = float4(mix(_157.xyz * (((_164 * 2.0) + float3(0.5)) + float3(_329)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_333.y, length(float2(_333.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _364); + out.out_var_SV_Target0 = float4(mix(_156.xyz * (((_163 * 1.0) + float3(0.5)) + float3(_328)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_332.y, length(float2(_332.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _363); return out; } + diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 9636b9190866da5e8ef2688adddc87906d713b7b..914f9a52a0effd581d8b182bbbd52ab73392b92f 100644 GIT binary patch literal 9728 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 literal 9732 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 DY+BH_ diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 8f32f52c..a9801f35 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -122,7 +122,7 @@ struct Light float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 position, float3 normal) { static const float3 kOffset = float3(0.0f, 0.25f, 0.0f); - static const float kLight = 2.0f; + static const float kLight = 1.0f; float3 finalColor = float3(0.0f, 0.0f, 0.0f); for (uint i = 0; i < lightCount; i++) { @@ -141,9 +141,8 @@ float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 p { continue; } - float attenuation = 1.0f - (distance / radius); - attenuation = saturate(attenuation); - attenuation *= attenuation; + float normalizedDistance = saturate(distance / radius); + float attenuation = 1.0f - smoothstep(0.0f, 1.0f, normalizedDistance); float3 color; color.r = ((light.Color & 0x000000FF) >> 0) / 255.0f; color.g = ((light.Color & 0x0000FF00) >> 8) / 255.0f; From c692bc15bac247cb5887c99833193d7f59dd5ea0 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 22:25:03 -0400 Subject: [PATCH 06/39] v6 --- CMakeLists.txt | 1 + shaders/bin/opaque.frag.msl | 176 ++++++++++++++++--------------- shaders/bin/opaque.frag.spv | Bin 9584 -> 10000 bytes shaders/bin/sky.frag.json | 2 +- shaders/bin/sky.frag.msl | 12 ++- shaders/bin/sky.frag.spv | Bin 1168 -> 1488 bytes shaders/bin/transparent.frag.msl | 176 ++++++++++++++++--------------- shaders/bin/transparent.frag.spv | Bin 9728 -> 10144 bytes shaders/opaque.frag | 11 +- shaders/shader.hlsl | 20 ++-- shaders/sky.frag | 10 +- shaders/transparent.frag | 11 +- src/check.h | 1 + src/main.c | 26 +++-- src/save.c | 61 +++++++++++ src/save.h | 2 + src/sky.c | 110 +++++++++++++++++++ src/sky.h | 23 ++++ 18 files changed, 443 insertions(+), 199 deletions(-) create mode 100644 src/sky.c create mode 100644 src/sky.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b0b49cab..1d7ecb8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ add_executable(blocks WIN32 src/rand.c src/save.c src/shader.c + src/sky.c src/voxel.c src/world.c ) diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 6b6b1a73..f735cb95 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -88,10 +88,13 @@ struct type_UniformBuffer_2 struct type_UniformBuffer_3 { - float3 SunDirection; + float4 Sun; + float4 SkyTop; + float4 SkyHorizon; + float4 Ambient; }; -constant spvUnsafeArray _114 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -110,154 +113,159 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _131 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _139 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _140 = blockBuffer._m0[_131].IsSprite != 0u; - uint _143 = _139 + uint(_140 ? 6 : 0); - float3 _152 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_131].Indices[_140 ? 0u : _139])); - float4 _156 = atlasTexture.sample(atlasSampler, _152.xy, uint(rint(_152.z))); - if (_156.w < 0.001000000047497451305389404296875) + uint _126 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _134 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _135 = blockBuffer._m0[_126].IsSprite != 0u; + uint _138 = _134 + uint(_135 ? 6 : 0); + float3 _147 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_126].Indices[_135 ? 0u : _134])); + float4 _151 = atlasTexture.sample(atlasSampler, _147.xy, uint(rint(_147.z))); + if (_151.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _161 = _156.xyz; - uint _164 = uint(UniformBuffer.LightCount); - float3 _166; - _166 = float3(0.0); - float3 _167; - for (uint _169 = 0u; _169 < _164; _166 = _167, _169++) + float3 _156 = _151.xyz; + uint _159 = uint(UniformBuffer.LightCount); + float3 _161; + _161 = float3(0.0); + float3 _162; + for (uint _164 = 0u; _164 < _159; _161 = _162, _164++) { - float _182 = float((lightBuffer._m0[_169].Color & 4278190080u) >> 24u); - float3 _189 = (float3(float(lightBuffer._m0[_169].X), float(lightBuffer._m0[_169].Y), float(lightBuffer._m0[_169].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _190 = length(_189); - bool _196; - if (!(_190 >= _182)) + float _177 = float((lightBuffer._m0[_164].Color & 4278190080u) >> 24u); + float3 _184 = (float3(float(lightBuffer._m0[_164].X), float(lightBuffer._m0[_164].Y), float(lightBuffer._m0[_164].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _185 = length(_184); + bool _191; + if (!(_185 >= _177)) { - _196 = _182 <= 0.0; + _191 = _177 <= 0.0; } else { - _196 = true; + _191 = true; } - if (_196) + if (_191) { - _167 = _166; + _162 = _161; continue; } - float _202 = fast::clamp(dot(_114[_143], _189 / float3(_190)), 0.0, 1.0); - if (_202 <= 0.0) + float _197 = fast::clamp(dot(_109[_138], _184 / float3(_185)), 0.0, 1.0); + if (_197 <= 0.0) { - _167 = _166; + _162 = _161; continue; } - _167 = _166 + ((float3(float((lightBuffer._m0[_169].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_169].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_169].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _202) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_190 / _182, 0.0, 1.0)))); + _162 = _161 + ((float3(float((lightBuffer._m0[_164].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_164].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_164].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _197) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_185 / _177, 0.0, 1.0)))); } - float _331; + float _337; do { - float _242; - if (blockBuffer._m0[_131].HasOcclusion != 0u) + if (UniformBuffer_3.Sun.w <= 0.0) { - _242 = fast::clamp(-dot(_114[_143], UniformBuffer_3.SunDirection), 0.0, 1.0); + _337 = 0.0; + break; + } + float _246; + if (blockBuffer._m0[_126].HasOcclusion != 0u) + { + _246 = fast::clamp(-dot(_109[_138], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _242 = 0.7070000171661376953125; + _246 = 0.7070000171661376953125; } - if (_242 <= 0.0) + if (_246 <= 0.0) { - _331 = 0.0; + _337 = 0.0; break; } - float4 _250 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _254 = _250.xyz / float3(_250.w); - float2 _257 = (_254.xy * 0.5) + float2(0.5); - float _259 = 1.0 - _257.y; - float2 _260 = _257; - _260.y = _259; - float _261 = _257.x; - bool _267; - if (!(_261 < 0.0)) + float4 _254 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _258 = _254.xyz / float3(_254.w); + float2 _261 = (_258.xy * 0.5) + float2(0.5); + float _263 = 1.0 - _261.y; + float2 _264 = _261; + _264.y = _263; + float _265 = _261.x; + bool _271; + if (!(_265 < 0.0)) { - _267 = _261 > 1.0; + _271 = _265 > 1.0; } else { - _267 = true; + _271 = true; } - bool _272; - if (!_267) + bool _276; + if (!_271) { - _272 = _259 < 0.0; + _276 = _263 < 0.0; } else { - _272 = true; + _276 = true; } - bool _277; - if (!_272) + bool _281; + if (!_276) { - _277 = _259 > 1.0; + _281 = _263 > 1.0; } else { - _277 = true; + _281 = true; } - bool _283; - if (!_277) + bool _287; + if (!_281) { - _283 = _254.z < 0.0; + _287 = _258.z < 0.0; } else { - _283 = true; + _287 = true; } - bool _289; - if (!_283) + bool _293; + if (!_287) { - _289 = _254.z > 1.0; + _293 = _258.z > 1.0; } else { - _289 = true; + _293 = true; } - if (_289) + if (_293) { - _331 = 0.4000000059604644775390625 * _242; + _337 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _246; break; } - uint2 _293 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _299 = float2(1.0) / float2(float(_293.x), float(_293.y)); - float _302 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _242)); - float _304; - int _307; - _304 = 0.0; - _307 = -1; - float _305; - for (; _307 <= 1; _304 = _305, _307++) + uint2 _298 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _304 = float2(1.0) / float2(float(_298.x), float(_298.y)); + float _307 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _246)); + float _309; + int _312; + _309 = 0.0; + _312 = -1; + float _310; + for (; _312 <= 1; _309 = _310, _312++) { - _305 = _304; - for (int _315 = -1; _315 <= 1; ) + _310 = _309; + for (int _320 = -1; _320 <= 1; ) { - _305 += shadowTexture.sample_compare(shadowSampler, (_260 + (float2(float(_307), float(_315)) * _299)), _254.z - _302, level(0.0)); - _315++; + _310 += shadowTexture.sample_compare(shadowSampler, (_264 + (float2(float(_312), float(_320)) * _304)), _258.z - _307, level(0.0)); + _320++; continue; } } - _331 = (0.4000000059604644775390625 * _242) * (_304 * 0.111111111938953399658203125); + _337 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _246) * (_309 * 0.111111111938953399658203125); break; } while(false); - float3 _341; - if (blockBuffer._m0[_131].IsFullbright != 0u) + float3 _347; + if (blockBuffer._m0[_126].IsFullbright != 0u) { - _341 = _161; + _347 = _156; } else { - _341 = _161 * (((_166 * 1.0) + (float3(0.5) * in.in_var_TEXCOORD3)) + float3(_331)); + _347 = _156 * (((_161 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_337)); } - float3 _345 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_341, mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_345.y, length(float2(_345.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _351 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_347, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_351.y, length(float2(_351.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index cb2dc8acb206a524808fe3ea2eef4302fc9a4656..e987fb895976f2dec93d01c734d78cd2803cd12f 100644 GIT binary patch literal 10000 zcmaKw2Vj-e6~`YC!Vp=?6fwwB!H5i5LI@j00t69oK1hH_$crzDiqeXrt!=Hft=-zH z)vC3_)(&f}tHauA_qM~)X?H8mTKoIGcTf0?+ADw0IsbF+x#!OJL67cZd*yQ7a=Bdp z+-?PJP_BE4QBK7^AXizkm#wT{S>4v&P(6Ld6yy5mdMHZ10Yp`xcLzK3O)c_z<$8ij zz(Bd)U?3jjw0rQM{tXa4`L7T9j#Y)?&U|wlDon3jUu65P*2e0o4b@FM^V=G$^TlF* z7rshH&E@j#&H1)tO_%|8Iywmsia zIB)*|@&h~h{fVr8P~@p^FLrFPqK1VXTemhAs~0vGw(KBhMQ$)LWy^J`EZI=G6>asc z#isVs94eW∾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 L*X<={H4FR?tlZmJ literal 9584 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 literal 1168 zcmZXT%}!HM6orp1AV_IJp!fsYiXuwA{u>ix8x-t>ger}}5ow|!48#O0V+E2vf zTS?w`UnlqO-!fhddABrH3WK2!I|tr&wzlPs%JqX$JYy8W%BS2qL_dtWt?gvDvy-%! z*PpJgzF1208}t0T58X7l_Hv`$+1Y&4C2GvP$6~jQ_5IgJ6Wo9dj2H-v+s9% zdCK^nQD-dnH-+upR(PW`?DlG1{j==O#djP>b&kCXbDmw>c}%nWUgmg|Bo1O!TwqL(VKyHx&QZb-5xGto68yx_&Tg>Eth@#!K<(@5>s0R=63FnIq$hk zKt5__vDJ95QF9qvK5DLDt8qS2GlwnTqL%M{6?jg*KqYI<1N(gfj2HMSBPP*HvHKy%-j(|hDcnJOhH+)20 diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index 0f390350..fec2ca2b 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -88,10 +88,13 @@ struct type_UniformBuffer_2 struct type_UniformBuffer_3 { - float3 SunDirection; + float4 Sun; + float4 SkyTop; + float4 SkyHorizon; + float4 Ambient; }; -constant spvUnsafeArray _114 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -109,151 +112,156 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _133 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _139 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _140 = blockBuffer._m0[_133].IsSprite != 0u; - uint _143 = _139 + uint(_140 ? 6 : 0); - uint _146 = _140 ? 0u : _139; - float3 _152 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_133].Indices[_146])); - float4 _156 = atlasTexture.sample(atlasSampler, _152.xy, uint(rint(_152.z))); - float _158 = _156.w; - uint _161 = uint(UniformBuffer.LightCount); - float3 _163; - _163 = float3(0.0); - float3 _164; - for (uint _166 = 0u; _166 < _161; _163 = _164, _166++) + uint _128 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _134 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _135 = blockBuffer._m0[_128].IsSprite != 0u; + uint _138 = _134 + uint(_135 ? 6 : 0); + uint _141 = _135 ? 0u : _134; + float3 _147 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_128].Indices[_141])); + float4 _151 = atlasTexture.sample(atlasSampler, _147.xy, uint(rint(_147.z))); + float _153 = _151.w; + uint _156 = uint(UniformBuffer.LightCount); + float3 _158; + _158 = float3(0.0); + float3 _159; + for (uint _161 = 0u; _161 < _156; _158 = _159, _161++) { - float _179 = float((lightBuffer._m0[_166].Color & 4278190080u) >> 24u); - float3 _186 = (float3(float(lightBuffer._m0[_166].X), float(lightBuffer._m0[_166].Y), float(lightBuffer._m0[_166].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _187 = length(_186); - bool _193; - if (!(_187 >= _179)) + float _174 = float((lightBuffer._m0[_161].Color & 4278190080u) >> 24u); + float3 _181 = (float3(float(lightBuffer._m0[_161].X), float(lightBuffer._m0[_161].Y), float(lightBuffer._m0[_161].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _182 = length(_181); + bool _188; + if (!(_182 >= _174)) { - _193 = _179 <= 0.0; + _188 = _174 <= 0.0; } else { - _193 = true; + _188 = true; } - if (_193) + if (_188) { - _164 = _163; + _159 = _158; continue; } - float _199 = fast::clamp(dot(_114[_143], _186 / float3(_187)), 0.0, 1.0); - if (_199 <= 0.0) + float _194 = fast::clamp(dot(_109[_138], _181 / float3(_182)), 0.0, 1.0); + if (_194 <= 0.0) { - _164 = _163; + _159 = _158; continue; } - _164 = _163 + ((float3(float((lightBuffer._m0[_166].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _199) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_187 / _179, 0.0, 1.0)))); + _159 = _158 + ((float3(float((lightBuffer._m0[_161].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_161].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_161].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _194) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_182 / _174, 0.0, 1.0)))); } - float _328; + float _334; do { - float _239; - if (blockBuffer._m0[_133].HasOcclusion != 0u) + if (UniformBuffer_3.Sun.w <= 0.0) { - _239 = fast::clamp(-dot(_114[_143], UniformBuffer_3.SunDirection), 0.0, 1.0); + _334 = 0.0; + break; + } + float _243; + if (blockBuffer._m0[_128].HasOcclusion != 0u) + { + _243 = fast::clamp(-dot(_109[_138], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _239 = 0.7070000171661376953125; + _243 = 0.7070000171661376953125; } - if (_239 <= 0.0) + if (_243 <= 0.0) { - _328 = 0.0; + _334 = 0.0; break; } - float4 _247 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _251 = _247.xyz / float3(_247.w); - float2 _254 = (_251.xy * 0.5) + float2(0.5); - float _256 = 1.0 - _254.y; - float2 _257 = _254; - _257.y = _256; - float _258 = _254.x; - bool _264; - if (!(_258 < 0.0)) + float4 _251 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _255 = _251.xyz / float3(_251.w); + float2 _258 = (_255.xy * 0.5) + float2(0.5); + float _260 = 1.0 - _258.y; + float2 _261 = _258; + _261.y = _260; + float _262 = _258.x; + bool _268; + if (!(_262 < 0.0)) { - _264 = _258 > 1.0; + _268 = _262 > 1.0; } else { - _264 = true; + _268 = true; } - bool _269; - if (!_264) + bool _273; + if (!_268) { - _269 = _256 < 0.0; + _273 = _260 < 0.0; } else { - _269 = true; + _273 = true; } - bool _274; - if (!_269) + bool _278; + if (!_273) { - _274 = _256 > 1.0; + _278 = _260 > 1.0; } else { - _274 = true; + _278 = true; } - bool _280; - if (!_274) + bool _284; + if (!_278) { - _280 = _251.z < 0.0; + _284 = _255.z < 0.0; } else { - _280 = true; + _284 = true; } - bool _286; - if (!_280) + bool _290; + if (!_284) { - _286 = _251.z > 1.0; + _290 = _255.z > 1.0; } else { - _286 = true; + _290 = true; } - if (_286) + if (_290) { - _328 = 0.4000000059604644775390625 * _239; + _334 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _243; break; } - uint2 _290 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _296 = float2(1.0) / float2(float(_290.x), float(_290.y)); - float _299 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _239)); - float _301; - int _304; - _301 = 0.0; - _304 = -1; - float _302; - for (; _304 <= 1; _301 = _302, _304++) + uint2 _295 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _301 = float2(1.0) / float2(float(_295.x), float(_295.y)); + float _304 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _243)); + float _306; + int _309; + _306 = 0.0; + _309 = -1; + float _307; + for (; _309 <= 1; _306 = _307, _309++) { - _302 = _301; - for (int _312 = -1; _312 <= 1; ) + _307 = _306; + for (int _317 = -1; _317 <= 1; ) { - _302 += shadowTexture.sample_compare(shadowSampler, (_257 + (float2(float(_304), float(_312)) * _296)), _251.z - _299, level(0.0)); - _312++; + _307 += shadowTexture.sample_compare(shadowSampler, (_261 + (float2(float(_309), float(_317)) * _301)), _255.z - _304, level(0.0)); + _317++; continue; } } - _328 = (0.4000000059604644775390625 * _239) * (_301 * 0.111111111938953399658203125); + _334 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _243) * (_306 * 0.111111111938953399658203125); break; } while(false); - float3 _332 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _363; - if (blockBuffer._m0[_133].Indices[_146] == 16u) + float3 _338 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _375; + if (blockBuffer._m0[_128].Indices[_141] == 16u) { - _363 = _158 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _375 = _153 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _363 = _158; + _375 = _153; } - out.out_var_SV_Target0 = float4(mix(_156.xyz * (((_163 * 1.0) + float3(0.5)) + float3(_328)), mix(float3(0.2199999988079071044921875, 0.3490000069141387939453125, 0.70200002193450927734375), float3(0.21199999749660491943359375, 0.7730000019073486328125, 0.9570000171661376953125), float3((precise::atan2(_332.y, length(float2(_332.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _363); + out.out_var_SV_Target0 = float4(mix(_151.xyz * (((_158 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_334)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_338.y, length(float2(_338.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _375); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 914f9a52a0effd581d8b182bbbd52ab73392b92f..460dfa70e72e24debf678801f8b9e28c5dcafac8 100644 GIT binary patch literal 10144 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 literal 9728 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 diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 2fc1fb72..9e9fed1a 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -24,7 +24,10 @@ cbuffer UniformBuffer : register(b2, space3) cbuffer UniformBuffer : register(b3, space3) { - float3 SunDirection : packoffset(c0); + float4 Sun : packoffset(c0); + float4 SkyTop : packoffset(c1); + float4 SkyHorizon : packoffset(c2); + float4 Ambient : packoffset(c3); }; struct Input @@ -56,8 +59,8 @@ Output main(Input input) } float3 albedo = color.rgb; float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); - float3 ambient = GetAmbientLight(); - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, SunDirection, input.WorldPosition.xyz, normal, block); + float3 ambient = GetAmbientLight(Ambient.xyz); + float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, input.WorldPosition.xyz, normal, block); float3 finalColor; if (block.IsFullbright) { @@ -67,7 +70,7 @@ Output main(Input input) { finalColor = albedo * (diffuse + ambient * input.AO + sun); } - float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition); + float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFog(distance(input.WorldPosition.xz, PlayerPosition.xz)); output.Color = float4(lerp(finalColor, sky, fog), 1.0f); return output; diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index a9801f35..02adc7a0 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -152,10 +152,14 @@ float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 p return finalColor * kLight; } -float GetSunLight(Texture2D texture, SamplerComparisonState state, float4x4 transform, float3 sunDirection, float3 position, float3 normal, Block block) +float GetSunLight(Texture2D texture, SamplerComparisonState state, float4x4 transform, float3 sunDirection, float sunIntensity, float3 position, float3 normal, Block block) { static const float kBase = 0.0f; static const float kShadow = 0.4f; + if (sunIntensity <= 0.0f) + { + return kBase; + } float ratio = block.HasOcclusion ? saturate(-dot(normal, sunDirection)) : 0.707f; if (ratio <= 0.0f) { @@ -167,7 +171,7 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 uv.y = 1.0f - uv.y; if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || shadowPosition.z > 1.0f) { - return kBase + kShadow * ratio; + return kBase + kShadow * sunIntensity * ratio; } uint width; uint height; @@ -181,12 +185,12 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); } visibility /= 9.0f; - return kBase + kShadow * ratio * visibility; + return kBase + kShadow * sunIntensity * ratio * visibility; } -float3 GetAmbientLight() +float3 GetAmbientLight(float3 color) { - return float3(0.5f, 0.5f, 0.5f); + return color; } float GetFog(float x) @@ -194,14 +198,12 @@ float GetFog(float x) return min(pow(x / 250.0f, 2.5f), 1.0f); } -float3 GetSkyColor(float3 position) +float3 GetSkyColor(float3 position, float3 top, float3 horizon) { - static const float3 kTop = float3(0.212f, 0.773f, 0.957f); - static const float3 kBottom = float3(0.220f, 0.349f, 0.702f); float dy = position.y; float dx = length(float2(position.x, position.z)); float alpha = (atan2(dy, dx) + kPi / 2.0f) / kPi; - return lerp(kBottom, kTop, alpha); + return lerp(horizon, top, alpha); } #endif diff --git a/shaders/sky.frag b/shaders/sky.frag index a230fe2f..ef448087 100644 --- a/shaders/sky.frag +++ b/shaders/sky.frag @@ -11,10 +11,18 @@ struct Output float4 Position : SV_Target1; }; +cbuffer UniformBuffer : register(b0, space3) +{ + float4 Sun : packoffset(c0); + float4 SkyTop : packoffset(c1); + float4 SkyHorizon : packoffset(c2); + float4 Ambient : packoffset(c3); +}; + Output main(Input input) { Output output; - output.Color = float4(GetSkyColor(input.LocalPosition), 1.0f); + output.Color = float4(GetSkyColor(input.LocalPosition, SkyTop.xyz, SkyHorizon.xyz), 1.0f); output.Position = float4(0.0f, 0.0f, 0.0f, 0.0f); return output; } diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 4e069f1f..7c9ee96b 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -26,7 +26,10 @@ cbuffer UniformBuffer : register(b2, space3) cbuffer UniformBuffer : register(b3, space3) { - float3 SunDirection : packoffset(c0); + float4 Sun : packoffset(c0); + float4 SkyTop : packoffset(c1); + float4 SkyHorizon : packoffset(c2); + float4 Ambient : packoffset(c3); }; struct Input @@ -49,9 +52,9 @@ float4 main(Input input) : SV_Target0 float alpha = color.a; float4 position = input.WorldPosition; float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, position, normal); - float3 ambient = GetAmbientLight(); - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, SunDirection, position.xyz, normal, block); - float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition); + float3 ambient = GetAmbientLight(Ambient.xyz); + float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, position.xyz, normal, block); + float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFog(distance(position.xz, PlayerPosition.xz)); if (GetIndex(input.Voxel, block) == kWater) { diff --git a/src/check.h b/src/check.h index 93f095e3..7e2c2c4d 100644 --- a/src/check.h +++ b/src/check.h @@ -2,6 +2,7 @@ #include +// TODO: remove this file. replace CHECK with SDL_assert and add appropriate SDL defs in CMakeLists to remove in Release builds #ifndef NDEBUG #define CHECK(x) SDL_assert_always(x) #else diff --git a/src/main.c b/src/main.c index f59a3e42..5c7509ff 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,7 @@ #include "player.h" #include "save.h" #include "shader.h" +#include "sky.h" #include "world.h" static const char* SAVE_PATH = "blocks.sqlite3"; @@ -19,8 +20,6 @@ static const int SHADOW_RESOLUTION = 4096.0f; static const float SHADOW_Y = 30.0f; static const float SHADOW_ORTHO = 300.0f; static const float SHADOW_FAR = 300.0f; -static const float SHADOW_PITCH = -SDL_PI_F / 4.0f; -static const float SHADOW_YAW = SDL_PI_F / 4.0f; static SDL_Window* window; static SDL_GPUDevice* device; @@ -37,12 +36,12 @@ static SDL_Surface* atlas_surface; static SDL_GPUTexture* atlas_texture; static SDL_GPUTexture* depth_texture; static SDL_GPUTexture* position_texture; -static SDL_GPUTexture* composite_texture; // TODO: remove, replace with swapchain +static SDL_GPUTexture* composite_texture; static SDL_GPUTexture* shadow_texture; static SDL_GPUSampler* nearest_sampler; static SDL_GPUSampler* shadow_sampler; static camera_t shadow_camera; -static float sun_direction[3]; +static sky_t sky; static player_t player; static Uint64 ticks1; static Uint64 ticks2; @@ -514,11 +513,12 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_FlashWindow(window, SDL_FLASH_BRIEFLY); set_window_icon(BLOCK_GRASS); save_init(SAVE_PATH); + sky_save_or_load(&sky, false); world_init(device); player_save_or_load(&player, PLAYER_ID, false); world_update(&player.camera); ticks2 = SDL_GetTicks(); - ticks1 = 0; + ticks1 = ticks2; return SDL_APP_CONTINUE; } @@ -528,6 +528,7 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) world_free(); block_free(); player_save_or_load(&player, PLAYER_ID, true); + sky_save_or_load(&sky, true); save_free(); SDL_ReleaseGPUSampler(device, nearest_sampler); SDL_ReleaseGPUSampler(device, shadow_sampler); @@ -600,8 +601,8 @@ static void update_shadow_camera() shadow_camera.x = player.camera.x; shadow_camera.y = SHADOW_Y; shadow_camera.z = player.camera.z; - shadow_camera.pitch = SHADOW_PITCH; - shadow_camera.yaw = SHADOW_YAW; + shadow_camera.pitch = SDL_asinf(SDL_clamp(sky.render.sun[1], -1.0f, 1.0f)); + shadow_camera.yaw = SDL_atan2f(sky.render.sun[0], -sky.render.sun[2]); camera_update(&shadow_camera); float texel_size = SHADOW_ORTHO * 2.0f / SHADOW_RESOLUTION; float light_x = shadow_camera.view[0][0] * shadow_camera.x + shadow_camera.view[1][0] * shadow_camera.y + shadow_camera.view[2][0] * shadow_camera.z; @@ -612,11 +613,14 @@ static void update_shadow_camera() shadow_camera.y += shadow_camera.view[1][0] * delta_x + shadow_camera.view[1][1] * delta_y; shadow_camera.z += shadow_camera.view[2][0] * delta_x + shadow_camera.view[2][1] * delta_y; camera_update(&shadow_camera); - camera_get_vector(&shadow_camera, &sun_direction[0], &sun_direction[1], &sun_direction[2]); } static void render_shadow(SDL_GPUCommandBuffer* cbuf) { + if (!sky.has_sun) + { + return; + } SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_CLEAR; depth_info.stencil_load_op = SDL_GPU_LOADOP_CLEAR; @@ -650,6 +654,7 @@ static void render_sky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_BindGPUGraphicsPipeline(pass, sky_pipeline); SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.proj, 64); SDL_PushGPUVertexUniformData(cbuf, 1, player.camera.view, 64); + SDL_PushGPUFragmentUniformData(cbuf, 0, &sky.render, sizeof(sky.render)); SDL_DrawGPUPrimitives(pass, 36, 1, 0, 0); SDL_PopGPUDebugGroup(cbuf); } @@ -665,7 +670,7 @@ static void render_opaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); SDL_PushGPUFragmentUniformData(cbuf, 1, &shadow_camera.matrix, 64); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); - SDL_PushGPUFragmentUniformData(cbuf, 3, sun_direction, 12); + SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); world_render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); @@ -732,7 +737,7 @@ static void render_transparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pa SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); SDL_PushGPUFragmentUniformData(cbuf, 1, &shadow_camera.matrix, 64); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); - SDL_PushGPUFragmentUniformData(cbuf, 3, sun_direction, 12); + SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); world_render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); @@ -855,6 +860,7 @@ SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) ticks2 = SDL_GetTicks(); float dt = ticks2 - ticks1; ticks1 = ticks2; + sky_update(&sky, dt / 1000.0f); if (SDL_GetWindowRelativeMouseMode(window)) { player_move(&player, dt); diff --git a/src/save.c b/src/save.c index a482b30f..d04cb1fb 100644 --- a/src/save.c +++ b/src/save.c @@ -18,8 +18,15 @@ static const char* BLOCK_TABLE = " block INTEGER NOT NULL," " PRIMARY KEY (cx, cz, bx, by, bz)" ");"; +static const char* SKY_TABLE = + "CREATE TABLE IF NOT EXISTS sky (" + " id INTEGER PRIMARY KEY NOT NULL," + " time_of_day REAL NOT NULL" + ");"; static const char* SET_PLAYER = "INSERT OR REPLACE INTO players (id, data) VALUES (?, ?);"; static const char* GET_PLAYER = "SELECT data FROM players WHERE id = ?;"; +static const char* SET_SKY = "INSERT OR REPLACE INTO sky (id, time_of_day) VALUES (0, ?);"; +static const char* GET_SKY = "SELECT time_of_day FROM sky WHERE id = 0;"; static const char* SET_BLOCK = "INSERT OR REPLACE INTO blocks (cx, cz, bx, by, bz, block) VALUES (?, ?, ?, ?, ?, ?);"; static const char* GET_BLOCKS = "SELECT bx, by, bz, block FROM blocks WHERE cx = ? AND cz = ?;"; static const char* BLOCK_INDEX = "CREATE INDEX IF NOT EXISTS bindex ON blocks (cx, cz);"; @@ -27,6 +34,8 @@ static const char* BLOCK_INDEX = "CREATE INDEX IF NOT EXISTS bindex ON blocks (c static sqlite3* handle; static sqlite3_stmt* set_player; static sqlite3_stmt* get_player; +static sqlite3_stmt* set_sky; +static sqlite3_stmt* get_sky; static sqlite3_stmt* set_block; static sqlite3_stmt* get_blocks; static SDL_Mutex* mutex; @@ -48,6 +57,11 @@ bool save_init(const char* path) SDL_Log("Failed to create block table: %s", sqlite3_errmsg(handle)); return false; } + if (sqlite3_exec(handle, SKY_TABLE, NULL, NULL, NULL)) + { + SDL_Log("Failed to create sky table: %s", sqlite3_errmsg(handle)); + return false; + } if (sqlite3_prepare_v2(handle, SET_PLAYER, -1, &set_player, NULL)) { SDL_Log("Failed to prepare set player: %s", sqlite3_errmsg(handle)); @@ -58,6 +72,16 @@ bool save_init(const char* path) SDL_Log("Failed to prepare get player: %s", sqlite3_errmsg(handle)); return false; } + if (sqlite3_prepare_v2(handle, SET_SKY, -1, &set_sky, NULL)) + { + SDL_Log("Failed to prepare set sky: %s", sqlite3_errmsg(handle)); + return false; + } + if (sqlite3_prepare_v2(handle, GET_SKY, -1, &get_sky, NULL)) + { + SDL_Log("Failed to prepare get sky: %s", sqlite3_errmsg(handle)); + return false; + } if (sqlite3_prepare_v2(handle, SET_BLOCK, -1, &set_block, NULL)) { SDL_Log("Failed to prepare set block: %s", sqlite3_errmsg(handle)); @@ -89,12 +113,16 @@ void save_free() sqlite3_exec(handle, "COMMIT;", NULL, NULL, NULL); sqlite3_finalize(set_player); sqlite3_finalize(get_player); + sqlite3_finalize(set_sky); + sqlite3_finalize(get_sky); sqlite3_finalize(set_block); sqlite3_finalize(get_blocks); sqlite3_close(handle); handle = NULL; set_player = NULL; get_player = NULL; + set_sky = NULL; + get_sky = NULL; set_block = NULL; get_blocks = NULL; mutex = NULL; @@ -155,6 +183,39 @@ bool save_get_player(int id, void* data, int size) return has_player; } +void save_set_sky(float time_of_day) +{ + if (!handle) + { + return; + } + SDL_LockMutex(mutex); + sqlite3_bind_double(set_sky, 1, time_of_day); + if (sqlite3_step(set_sky) != SQLITE_DONE) + { + SDL_Log("Failed to set sky: %s", sqlite3_errmsg(handle)); + } + sqlite3_reset(set_sky); + SDL_UnlockMutex(mutex); +} + +bool save_get_sky(float* time_of_day) +{ + if (!handle) + { + return false; + } + SDL_LockMutex(mutex); + bool has_sky = sqlite3_step(get_sky) == SQLITE_ROW; + if (has_sky) + { + *time_of_day = (float) sqlite3_column_double(get_sky, 0); + } + sqlite3_reset(get_sky); + SDL_UnlockMutex(mutex); + return has_sky; +} + void save_set_block(int cx, int cz, int bx, int by, int bz, block_t block) { if (!handle) diff --git a/src/save.h b/src/save.h index b341ea06..ea0e514a 100644 --- a/src/save.h +++ b/src/save.h @@ -11,5 +11,7 @@ void save_free(); void save_commit(); void save_set_player(int id, const void* data, int size); bool save_get_player(int id, void* data, int size); +void save_set_sky(float time_of_day); +bool save_get_sky(float* time_of_day); void save_set_block(int cx, int cz, int bx, int by, int bz, block_t block); void save_get_blocks(void* userdata, int cx, int cz, save_set_block_t function); diff --git a/src/sky.c b/src/sky.c new file mode 100644 index 00000000..751a0bc8 --- /dev/null +++ b/src/sky.c @@ -0,0 +1,110 @@ +#include + +#include "save.h" +#include "sky.h" + +static const float SUNRISE_LENGTH = 30.0f; +static const float DAY_LENGTH = 60.0f; +static const float SUNSET_LENGTH = 30.0f; +static const float NIGHT_LENGTH = 60.0f; +static const float SPEED = 1.0f; +static const float AMBIENT_SCALE = 0.5f; + +static const float NIGHT_SKY_TOP[3] = {0.02f, 0.02f, 0.1f}; +static const float NIGHT_SKY_HORIZON[3] = {0.05f, 0.05f, 0.2f}; +static const float SUNRISE_SKY_TOP[3] = {0.5f, 0.2f, 0.1f}; +static const float SUNRISE_SKY_HORIZON[3] = {1.0f, 0.5f, 0.2f}; +static const float DAY_SKY_TOP[3] = {0.5f, 0.7f, 1.0f}; +static const float DAY_SKY_HORIZON[3] = {0.8f, 0.9f, 1.0f}; +static const float SUNSET_SKY_TOP[3] = {0.5f, 0.2f, 0.1f}; +static const float SUNSET_SKY_HORIZON[3] = {1.0f, 0.5f, 0.2f}; +static const float NIGHT_AMBIENT[3] = {0.05f, 0.05f, 0.1f}; +static const float DAY_AMBIENT[3] = {1.0f, 1.0f, 1.0f}; + +static void lerp_color(float output[4], const float a[3], const float b[3], float t) +{ + output[0] = a[0] + (b[0] - a[0]) * t; + output[1] = a[1] + (b[1] - a[1]) * t; + output[2] = a[2] + (b[2] - a[2]) * t; + output[3] = 0.0f; +} + +static void update_render(sky_t* sky) +{ + float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; + float sunrise_end = SUNRISE_LENGTH / total_length; + float day_end = sunrise_end + DAY_LENGTH / total_length; + float sunset_end = day_end + SUNSET_LENGTH / total_length; + float ambient[4]; + float t; + if (sky->time_of_day < sunrise_end) + { + t = sky->time_of_day / sunrise_end; + lerp_color(sky->render.top, NIGHT_SKY_TOP, SUNRISE_SKY_TOP, t); + lerp_color(sky->render.horizon, NIGHT_SKY_HORIZON, SUNRISE_SKY_HORIZON, t); + lerp_color(ambient, NIGHT_AMBIENT, DAY_AMBIENT, t); + } + else if (sky->time_of_day < day_end) + { + t = (sky->time_of_day - sunrise_end) / (day_end - sunrise_end); + lerp_color(sky->render.top, SUNRISE_SKY_TOP, DAY_SKY_TOP, t); + lerp_color(sky->render.horizon, SUNRISE_SKY_HORIZON, DAY_SKY_HORIZON, t); + lerp_color(ambient, DAY_AMBIENT, DAY_AMBIENT, t); + } + else if (sky->time_of_day < sunset_end) + { + t = (sky->time_of_day - day_end) / (sunset_end - day_end); + lerp_color(sky->render.top, DAY_SKY_TOP, SUNSET_SKY_TOP, t); + lerp_color(sky->render.horizon, DAY_SKY_HORIZON, SUNSET_SKY_HORIZON, t); + lerp_color(ambient, DAY_AMBIENT, NIGHT_AMBIENT, t); + } + else + { + t = (sky->time_of_day - sunset_end) / (1.0f - sunset_end); + lerp_color(sky->render.top, SUNSET_SKY_TOP, NIGHT_SKY_TOP, t); + lerp_color(sky->render.horizon, SUNSET_SKY_HORIZON, NIGHT_SKY_HORIZON, t); + lerp_color(ambient, NIGHT_AMBIENT, NIGHT_AMBIENT, t); + } + float angle = sky->time_of_day * 2.0f * SDL_PI_F; + float sun_height = -SDL_cosf(angle); + float sun_intensity = SDL_clamp(sun_height, 0.0f, 1.0f); + float horizontal = SDL_sinf(angle); + sky->render.sun[0] = horizontal * SDL_sqrtf(0.5f); + sky->render.sun[1] = -sun_intensity; + sky->render.sun[2] = -horizontal * SDL_sqrtf(0.5f); + sky->render.sun[3] = sun_intensity; + sky->has_sun = sun_intensity > 0.0f; + float ambient_energy = SDL_clamp(sun_intensity, 0.1f, 1.0f) * AMBIENT_SCALE; + sky->render.ambient[0] = ambient[0] * ambient_energy; + sky->render.ambient[1] = ambient[1] * ambient_energy; + sky->render.ambient[2] = ambient[2] * ambient_energy; + sky->render.ambient[3] = 0.0f; +} + +void sky_save_or_load(sky_t* sky, bool save) +{ + SDL_COMPILE_TIME_ASSERT("", sizeof(sky_render_t) == sizeof(float) * 16); + if (save) + { + save_set_sky(sky->time_of_day); + return; + } + float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; + float sunrise_end = SUNRISE_LENGTH / total_length; + float day_end = sunrise_end + DAY_LENGTH / total_length; + sky->time_of_day = sunrise_end + (day_end - sunrise_end) / 2.0f; + float saved_time; + if (save_get_sky(&saved_time) && saved_time >= 0.0f && saved_time < 1.0f) + { + sky->time_of_day = saved_time; + } + update_render(sky); +} + +void sky_update(sky_t* sky, float dt) +{ + float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; + sky->time_of_day += dt * SPEED / total_length; + sky->time_of_day = SDL_fmodf(sky->time_of_day, 1.0f); + update_render(sky); +} diff --git a/src/sky.h b/src/sky.h new file mode 100644 index 00000000..ddcb8697 --- /dev/null +++ b/src/sky.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +typedef struct sky_render +{ + float sun[4]; + float top[4]; + float horizon[4]; + float ambient[4]; +} +sky_render_t; + +typedef struct sky +{ + float time_of_day; + bool has_sun; + sky_render_t render; +} +sky_t; + +void sky_save_or_load(sky_t* sky, bool save); +void sky_update(sky_t* sky, float dt); From 03d61a07e4b16f2a32e032321c86a7016183a0af Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 22:47:33 -0400 Subject: [PATCH 07/39] bug fix --- src/buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/buffer.c b/src/buffer.c index fda2e2ad..fd34abea 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -115,7 +115,7 @@ void gpu_buffer_upload(gpu_buffer_t* gpu, cpu_buffer_t* cpu) } Uint32 size = cpu->size; cpu->size = 0; - if (size > gpu->size) + if (size > gpu->capacity) { SDL_ReleaseGPUBuffer(gpu->device, gpu->buffer); gpu->buffer = NULL; From aea6e343b74961a3a3961af12f2dd17adde3e099 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 22:57:14 -0400 Subject: [PATCH 08/39] v something --- CMakeLists.txt | 2 +- lib/SDL | 2 +- shaders/bin/depth.frag.spv | Bin 156 -> 828 bytes shaders/bin/depth.vert.spv | Bin 1804 -> 17404 bytes shaders/bin/opaque.frag.msl | 187 +++++++++++++++++-------------- shaders/bin/opaque.frag.spv | Bin 10000 -> 53796 bytes shaders/bin/opaque.vert.msl | 18 +-- shaders/bin/opaque.vert.spv | Bin 2744 -> 20956 bytes shaders/bin/raycast.frag.spv | Bin 336 -> 1340 bytes shaders/bin/raycast.vert.msl | 10 +- shaders/bin/raycast.vert.spv | Bin 1988 -> 14500 bytes shaders/bin/shadow.frag.json | 2 +- shaders/bin/shadow.frag.msl | 37 +----- shaders/bin/shadow.frag.spv | Bin 1956 -> 828 bytes shaders/bin/shadow.vert.msl | 7 +- shaders/bin/shadow.vert.spv | Bin 3060 -> 21232 bytes shaders/bin/sky.frag.spv | Bin 1488 -> 17348 bytes shaders/bin/sky.vert.msl | 16 +-- shaders/bin/sky.vert.spv | Bin 2096 -> 14680 bytes shaders/bin/transparent.frag.msl | 181 ++++++++++++++++-------------- shaders/bin/transparent.frag.spv | Bin 10144 -> 53968 bytes shaders/bin/transparent.vert.msl | 22 ++-- shaders/bin/transparent.vert.spv | Bin 2668 -> 20780 bytes shaders/bin/ui.comp.msl | 146 ++++++++++++------------ shaders/bin/ui.comp.spv | Bin 4728 -> 19816 bytes shaders/opaque.frag | 2 +- shaders/shadow.frag | 20 +--- shaders/shadow.vert | 4 - src/main.c | 5 - 29 files changed, 314 insertions(+), 347 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d7ecb8b..f87bac54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ function(add_shader FILE) function(compile OUTPUT) add_custom_command( OUTPUT ${OUTPUT} - COMMAND ${SHADERCROSS} ${HLSL} -s hlsl -o ${OUTPUT} -I shaders + COMMAND ${SHADERCROSS} ${HLSL} -s hlsl -o ${OUTPUT} -I shaders -g WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} DEPENDS ${HLSL} ${DEPENDS} COMMENT ${OUTPUT} diff --git a/lib/SDL b/lib/SDL index 34b620c3..f00052ff 160000 --- a/lib/SDL +++ b/lib/SDL @@ -1 +1 @@ -Subproject commit 34b620c3f86cb2b5adf11440cdf79a3cec216269 +Subproject commit f00052ffe24b8540a6b27b93ab9197278c80d157 diff --git a/shaders/bin/depth.frag.spv b/shaders/bin/depth.frag.spv index b893138e1f0d7c3506e34227ef04dbec794a03a8..069321632f57044f29283d996b309004e62c6594 100644 GIT binary patch literal 828 zcmYjPO;6iE5M9DYig6Ms-}GX{rB$_Yq9VQ|PEe@`38ALtYHgAYF$rsH*9k(1|IG!7 z_lzyr=w)Yi-prew^=xIYD#VNsqAqsu&$S{d`H3gKh|cv*bou9RWD*lOeXmRw_oCPg z67ZJrW9C(2Iz_128LGav&2!zI++KjzY`0phSr@b1a(+Y1i#ga8;9kXs=gWxGM>9Yp zXP=#f|DCojyi>}!Fty2@?qx3Qj+5TVg)WzJVPB`&usN{mHqWi*wWmqk4_N&BkDB*X z^PX!S>dry=L$eB%1^8TyQTxHFG}RXNJZ>*UcmJ^6KKgb1&iN)5VFdDbUOJE$LD57Y z{{^Xw4x&~dT^ieIAO|j;%E4G=nKsgDmrQI=OJ%KkbVan!DVA*AsPj2iD`I=tsZR|bQzEAhFppqA?16l0`-qbB6<~Y~;QXmY4*3LY@QtX;9?RO~ zGj9a226^m{?{k2gu{Q6+#rwR#+r(bpX$v;O(xk}yF4hX+ukWL=cY z<GgUqxsuEM|L)Fvi$_q_ecyctVYoB1|IE(L&hA?P zTD)lO@>uMmSS+?8_81$yE{`qJnwr?fv4Q?0Lwole9LnW$L%uha&XqDFLz&!I9=J>K zk0uB5xdGdi7??71V|6!Z6bBPBmMoXw9+`bl38<0nVGLTMr~?G;Pf_OjTr3%5-q zl74X{Ih~*JvWZM?1YPX+5hmE2+KpcrG!Vvm;dIokK zQt?!MfHq-B$2@3*3RRq0Xo#tbRfUfR70xU~4+h}Su0h#!g|MRmEHG$LCMhB4SO5y( z4ay`c1RV}Q0lYz(~b%||8VXa&S(qY`qg0%CJf2{~K=v6-lZ9I1eqVyichnzdeTG&5F% zeX|6oMJzU!&8N*?ToStkaygTusP}aZ+6&y*W`8FpvVNAfuUUF2Y-L{#?CI>@b#Q3U zzJYypK~+~M>uQooHBl-R{7uQ^c&0Q_9!`wpr;^#sus@n@$`{9z1KsAPMuI& zgV^+(TjQMSSfl;h3|`eYnn0@nnyLb*6c6+k^`NcJ2XIC=u&4(EaQsvUs4$ZMFTi=y z-c=s<`tyFKgf;e$Z>W;{rc|PRtkL;fCF%s<~0MAWr?a)o#!BM%C7+);B6J_}gLC&;i$~JMnkDRl@^t9oiNCwpcX~ za0~?){1r5u01X>3_?wdB#hjD7y;5giT!*diUG>44QteRf>^t6uHB_fli8g&qbm+eu z@R!MBLU=3|y;8ZDQZqrj)`2_AMl>vRB!r8`r^trDB8YDm^^ z=req{hps~%M~Duf&-4p(?p~=Fb9h-0r{+{uh+EEv^Le&sa2UPZujt%dFB(o|knoC8!L?yXI1$r}1K#k^sru2#hbZWawsZE??xHhIz zFrKs6*2-3W;4fHVJ^L2=IpocZp$oVZERZ^LIigQ`o#~V#>c<7?)%4hRMJAYoD1|9yW!yf~G z22@uQE>?GDY^>~i+G~73-^a>DZ**sQY|JZe(dum~%Q5{%b2ZaKSH7GpHJUqMn=05R zwpFyMoW4DUS)6~y;fmEaHs*UJYy=ZcT%JEIcrNP)0c(quKi^tS>d0Wr<8ZS^**W3k zYC5YkGT*a20LAfGzNpN?^LCortTJkgnXH~4mSc>@!89l z4n-ByqnWY~NL*tQCaBv~YNn?rrC;?tuUp!pmaWFAlv_9t<7cqZ^e2uAbF5x9=(_|O zo7VY0^OA1uC2-yptX^Vf_EgkNjb@Pj+=$1Sdb#n^MBMn16mq(mF%=JR+qTNY@4HX9 zE&9X3m`x>3PKU{&h))!yOs*`~eX8)dV#AkRSsiz9I3gfBqht`|yyy>%=1cp4^wW4y zrb}KNa@-WB&0XNHJ~|^~`+pI--42;k-e`B2&M+p?C2hXyO+g1!SLss8%a!rjOMlK{ z$>T$)Kb6myCj63Dusg?GtIX`&v7+u;k?!!o;3!&76p^U-yjnGt+S8+JHC2xzsinQ0 zn=V`*V?Ms1Im=y}Z#a+n@B-#$uW0k;j;i*~j>pqM2cy<0vwZ8^+}V(AWyupTJTKPS zV+A;USu)!g4~l_uZXb`pI3B4eB(J4=i|*T|aPU*ns0Pwgg{)WX%1;&2#f*s?dr#N3(o zxr=$qn)<2+G9RQhtj)r>yWN14YzcEN2D?-)qa4Q!a7Oo;EMoU%^6+b}FYZTqTzrD9 z(B$qY5%uR-!BgQIY(nkr}G(Isk& zhneRV3l54(Yo4AeiKC{%XF|S|&?B~}@-%V~fy~UJT=j=UbBNnAEl($A0k*rHlI`Hk zASO7=%$trodG>-%%h@G*5N?IvfFAf zE1+*ICo`j^37IFaEEAsdMUCB534I@&;x@pS0dZ~9XpwSQ+qA;M%MReslY}MBmTNhW zl^V{Z`E*7OQ>oT5{RHI~SeQiICS6BgF_fCl_?h8M78}!;N;&GQ1ZOe>eN*#hw5UtA z!4)Ea(3B9Yk%r6$5T|&ZfpDrxO3X3SHC5Q>O?%m6UNIl%HpUTy%4(2F&orvpddwq8 zOJlU=PT>K<`OD<&zHkObDQ^sq`Tx~=W8~1$=9)7#&V93UYB=NNO6EA#t7jia_4eqp zBbi534K$lECr=MyGI`IA-Z= zVImF7cpA5^miQ=+|Ir!V?k4dCDjvN&f6ziQR(A4u@)Y7W#73p#)}G+|46gg;yXrcA z4UO-Vm&R(*VspvC2i@XW9Xs*j_t`7Z>d&59egMBr@jGbwYM6%ve(B;@)cRZDkzxH| zK^@Lz_+&F59dKM1y>Z-ZykdM9U#|Ft^oZ9SuA0sXpNReVfs1Pcs;hZsSNLXSL03mI z9*^4#b%if+qOP!kTU6IXIX5Y}3H;gbs(W*Va^&OJ5&n*b`5xLe*wxo}u$v!6O$^qi zuUvAC%+!^P0Ly_RLm~yX#z^sJ!nht(WjJ)0K?}%h=P=_%4)J3e96I+TQ-IE%AlL>r2UDi7!CI!Lsv>nqXfTw3`mwDLPF_r=wa3-+@tSiLW< zL5sA4Ulv;hzGAK#vm~|}t%=c$bFH?)YT5p0p*>kl7Ybfc$9^5;;kNb7%^O-bf`#t7 z*!5^t(=NT>s;O5W*!US(H62pZ{!qtIN;Ua~OmSK@jroP?rm?L4P|#HL{Cv4M;x(m< z#q=!Tx_6YnLT{ZeXD8FSrjz&?sL7!8Sj%EJpsiSUtzRCy5p8L<;3X=yGUHnoy9s>} zHS|kj3VN<38ZF<9maA;!WwAA2+^-{mV-#3eERV&}R-4Z<^sU+|34?WfFs#<9oAH`kpnSI7Sq!Tr1k6N`ZM1BcmzC?bhmdd~qI>^#Sb2t>9VH((i$1ZHT-9Jl9j?cJTavJ0iD% zXWfbXeDJJIk+*>7|J7kUb7&Pv#-n@=#24{%Xx|2se#Uzzs0JkdPJrjxEb=(`m5%&& z@V{~7{oq$Q@_O*fkq>~s*pW|yzXim4eg|6CGv~J&e;+_g9pxL5l{i}J6f}Q`mU*L& zecXf6_eZvmI{N)%v~yNRY$JH;=;u$Yo;u2ZiuNK9b3ysf&~iN($CVf{fmU+S37+{9 zc_;XTj=T#zpViX87yMaAz5{%%Blm;nok8#e;CaUo`3QJE$3?yiJfF294}s^ID{>nA zm5w|CeupF93%<^gC&6Fh$OZ6BviQqGfw*kAv@Wp`U(Ey;F*7sp8(I=7Wot4pX11%1kaeH|5M-@(`L+udB{u1~aM}7+YrH=e%@Uj=@z<&i)2axaBmV;Y8b|&m z__d%~tTN95?rqi&U!qHar;g*)Vzr6mo}iAltOwRWEmoR++^_5-wSw9}#J7V4(*d6S ztVPxf&o7=E8$mM0Ch)}2Kk@7r`_16Rp7llhEg)lmv5sS_#n3-(>5q2ee;auE;2c?3{$s1_E? zVK;~v*2)SH;}+k$!0!Mtue6i-^nj-g=fgeAeIaA+2G2f{%!hb0AG4-=Y`^52{w1DX z+s7Pne-TT2#&QRUdEW~%YqV0&VIO3U$J}xca$MT%2OR)0ChEnGW5{@Y;AzY8xL-Mc z+V+F)1aUm6nOe-0IXeiF@va0f;|+k9@u(L&j!}#1qwOIOZKYNiJN?xn`|LjqVn5fK zL_Fg;0^&HFi>&os;3e;a;AzLTCZ2u7(_bzA(f3ghFC z+Pw#Q!CwoWc_f~>N`p9e#>+fN?GA&djpUzsk=&2izN^qOW@5!(_1v2rj9R;8Xqf{K zB=t3B`&eH*Ux}s9agfy41bCA-Q(qa#jFI(xBZy0J-z{Ey&g8!ExPrh#kj} zc@(X!%!9r-o@>i_G+3SF+lS0C8RyL)iL)L2LUESRS1nG?rCOXEL*gu3TZxmt7^iE? zIO{=-UFvWeJjdku$us99NcQOrc=oXd*MNxSnLGM)3y4_yIt!}i>$%XozE~>~*YDUq`nnZFEPbUx zmA=f_&x4-6h`$Zg0V1C9@vIK#Ver2To#1Z=FZk!r!<)Or?^!(8o96)c*ma=mL9%8q z08gJhYj_q8f;#MdW)XP4-U<2@PRu_?D|UYYo_0JJ=$lyCcYg_g9-$gL5w3sIy%-=^a zudj>s87USmmza0$E9H}ukKfj4!q*mShu-Ng|`+#@zf|6v0TXy7^fY!ASkM`B@yn zRI9@!4utgfPUP0EstPiEO%ZPM=;{Yo!2E1%mzD_yY4j+ z44;pT$6fbJBbYXeao4>zg5mi}Kkojji(q6dcYm#jV8qXt;7iW2l@ZJqJJwSU=CTMz zV*av&xjcfAJb%T(ToJ)Y4!`PPu8d%0tgktkt0EZj^K}Pvbp#`G|AvFPCW4U~`=*0g z6~RcJzvW<7M=+AZZ#$T4BN!R$I}YYq5sdixu7kNQf{|K%+QD2O!AO3-=U{G#V8qY& z9n6gpjKuQ;2Xj*dBV+y0!KesE{QStl+#JEkdi~hJtchTxHh$t@)pEZTR2I`OIUJ!l(%YeGw(B*rp_wh4On6w#JY7T>G%?=el))UZ8DFZnrsO@E-mVOZ{j+3VH(fV%E!c;OO^G z@DksS1#Hv6JPvx&+I9j*d)7t4u5lM+>cv+#c)WGa+&Gx8kAWnPT>vo-)|%M%EMUvp z_&7-7*bN-*-wvI`(F>V+@pT7yyywNS7rG}jnSAU8h;i(PPHgurVEYMRJ_(XI_5(+I zHy?fU1rlHV;PIXp#~sjp3M4goCqT?4=RqH}s8#NnN5JE)zpruk>OrfQy(%^JAz(?| zBdqlS;8>3m&!GkEIDgtb7i&$s!@w~n+KcUx1#Gz=Xe;~SE{o%SIBI>l`(ZHR=PWR! zhb(m>h7W^33S2$fb0D4p51>5`9rY5^-Qe-o`Q@2%*3!dhN#g4SKn;-3fyCDkbkvKl zd%)v8&zI!%PQ=A?Ee#O!!;ITzI|&f&nQyVpg2#KF zE!Us6axa{+IIjP*LG;D-Kc_L~_lBIsaL)33!=qNW8oF(Gsx3iFTNyuZ`z3b|qMyWP MC+XLSZUg9l045}$&Hw-a literal 1804 zcmZ{k$x>5M5QYzsfFp>=;DiY{qY)=Wks*KuJEEl)TNY48i-d}xC?BNr+cz5rLL4xe_G|YXE1f=NKfV)9Y~~cw0F1a4ef5kj2?c9 z=uLnkc?InKFMHdSH;wvEv$eZ?u(Pw>N~xEqF;A`4e6KEMXiER2W<0&b|Hos@^R~YI zSuKwp9>sGE{AixOWX!Yj?x69Z*8EuCuQz?1e8AHhC>E+JFgtQ|88{}fnCUl&J- zpT;uB*$(6Pqf3ZKe*j%Vx)AI2eWxeD%8NzP-DzV*2*$K7?;i?qm4&q}_#> z@85xUDKjwHhcQnH`9=0s^gOw~;~HXpmA}mi^mRmjzpY}Pz1~2KHSzrpH*+lNZsA9r zdk}TEv5iID6t-B6``o!Zh+OWbu?GBQ^j*Z*58hy(6~tcMsh>G^FUQ@hy}Yk!Z1JeO zk8Pd17IhD>#of24dx$L_b&s&Ea|fgDF}8T;eKYvt@t!Bx_8^}z-|ahR5#RKU-u0g% z=89Lr+=FLG5sA6CccP6)&U51N|G^oXGmnVBq}p$@fXMF&Y!O?`T?lL`$Nc^^Sl#0) jV!ioGi2ozL!)t6AG46eVt>pL|dV#HT@5Fv{(=75A`hIOf diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index f735cb95..8360999d 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -94,7 +94,9 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant float3 _674 = {}; + +constant spvUnsafeArray _665 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -113,159 +115,176 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _126 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _134 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _135 = blockBuffer._m0[_126].IsSprite != 0u; - uint _138 = _134 + uint(_135 ? 6 : 0); - float3 _147 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_126].Indices[_135 ? 0u : _134])); - float4 _151 = atlasTexture.sample(atlasSampler, _147.xy, uint(rint(_147.z))); - if (_151.w < 0.001000000047497451305389404296875) + uint _747 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _775 = spvUnsafeArray({ blockBuffer._m0[_747].Indices[0], blockBuffer._m0[_747].Indices[1], blockBuffer._m0[_747].Indices[2], blockBuffer._m0[_747].Indices[3], blockBuffer._m0[_747].Indices[4], blockBuffer._m0[_747].Indices[5] }); + spvUnsafeArray _676 = _775; + bool _808 = blockBuffer._m0[_747].IsSprite != 0u; + uint _822; + if (_808) + { + _822 = 0u; + } + else + { + _822 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + } + float3 _836 = float3(in.in_var_TEXCOORD1, float(_676[_822])); + float4 _846 = atlasTexture.sample(atlasSampler, _836.xy, uint(rint(_836.z))); + if (_846.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _156 = _151.xyz; - uint _159 = uint(UniformBuffer.LightCount); - float3 _161; - _161 = float3(0.0); - float3 _162; - for (uint _164 = 0u; _164 < _159; _161 = _162, _164++) + float3 _861 = _846.xyz; + uint _898 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_808 ? 6 : 0); + uint _914 = uint(UniformBuffer.LightCount); + float3 _931; + float3 _934; + _931 = _674; + _934 = float3(0.0); + float3 _932; + float3 _935; + for (uint _936 = 0u; _936 < _914; _931 = _932, _934 = _935, _936++) { - float _177 = float((lightBuffer._m0[_164].Color & 4278190080u) >> 24u); - float3 _184 = (float3(float(lightBuffer._m0[_164].X), float(lightBuffer._m0[_164].Y), float(lightBuffer._m0[_164].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _185 = length(_184); - bool _191; - if (!(_185 >= _177)) + float _972 = float((lightBuffer._m0[_936].Color & 4278190080u) >> 24u); + float3 _990 = (float3(float(lightBuffer._m0[_936].X), float(lightBuffer._m0[_936].Y), float(lightBuffer._m0[_936].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _994 = length(_990); + bool _1008; + if (!(_994 >= _972)) { - _191 = _177 <= 0.0; + _1008 = _972 <= 0.0; } else { - _191 = true; + _1008 = true; } - if (_191) + if (_1008) { - _162 = _161; + _932 = _931; + _935 = _934; continue; } - float _197 = fast::clamp(dot(_109[_138], _184 / float3(_185)), 0.0, 1.0); - if (_197 <= 0.0) + float _1023 = fast::clamp(dot(_665[_898], _990 / float3(_994)), 0.0, 1.0); + if (_1023 <= 0.0) { - _162 = _161; + _932 = _931; + _935 = _934; continue; } - _162 = _161 + ((float3(float((lightBuffer._m0[_164].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_164].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_164].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _197) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_185 / _177, 0.0, 1.0)))); + float3 _1069 = float3(float((lightBuffer._m0[_936].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_936].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_936].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _932 = _1069; + _935 = _934 + ((_1069 * _1023) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_994 / _972, 0.0, 1.0)))); } - float _337; + float _1404; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _337 = 0.0; + _1404 = 0.0; break; } - float _246; - if (blockBuffer._m0[_126].HasOcclusion != 0u) + float _1184; + if (blockBuffer._m0[_747].HasOcclusion != 0u) { - _246 = fast::clamp(-dot(_109[_138], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1184 = fast::clamp(-dot(_665[_898], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _246 = 0.7070000171661376953125; + _1184 = 0.7070000171661376953125; } - if (_246 <= 0.0) + if (_1184 <= 0.0) { - _337 = 0.0; + _1404 = 0.0; break; } - float4 _254 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _258 = _254.xyz / float3(_254.w); - float2 _261 = (_258.xy * 0.5) + float2(0.5); - float _263 = 1.0 - _261.y; - float2 _264 = _261; - _264.y = _263; - float _265 = _261.x; - bool _271; - if (!(_265 < 0.0)) + float4 _1203 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1213 = _1203.xyz / float3(_1203.w); + float2 _1223 = (_1213.xy * 0.5) + float2(0.5); + float _1229 = 1.0 - _1223.y; + float2 _1231 = _1223; + _1231.y = _1229; + float _1235 = _1223.x; + bool _1247; + if (!(_1235 < 0.0)) { - _271 = _265 > 1.0; + _1247 = _1235 > 1.0; } else { - _271 = true; + _1247 = true; } - bool _276; - if (!_271) + bool _1257; + if (!_1247) { - _276 = _263 < 0.0; + _1257 = _1229 < 0.0; } else { - _276 = true; + _1257 = true; } - bool _281; - if (!_276) + bool _1267; + if (!_1257) { - _281 = _263 > 1.0; + _1267 = _1229 > 1.0; } else { - _281 = true; + _1267 = true; } - bool _287; - if (!_281) + bool _1279; + if (!_1267) { - _287 = _258.z < 0.0; + _1279 = _1213.z < 0.0; } else { - _287 = true; + _1279 = true; } - bool _293; - if (!_287) + bool _1291; + if (!_1279) { - _293 = _258.z > 1.0; + _1291 = _1213.z > 1.0; } else { - _293 = true; + _1291 = true; } - if (_293) + if (_1291) { - _337 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _246; + _1404 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1184; break; } - uint2 _298 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _304 = float2(1.0) / float2(float(_298.x), float(_298.y)); - float _307 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _246)); - float _309; - int _312; - _309 = 0.0; - _312 = -1; - float _310; - for (; _312 <= 1; _309 = _310, _312++) + uint2 _1302 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1318 = float2(1.0) / float2(float(_1302.x), float(_1302.y)); + float _1326 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1184)); + float _1335; + int _1338; + _1335 = 0.0; + _1338 = -1; + float _1336; + for (; _1338 <= 1; _1335 = _1336, _1338++) { - _310 = _309; - for (int _320 = -1; _320 <= 1; ) + _1336 = _1335; + for (int _1354 = -1; _1354 <= 1; ) { - _310 += shadowTexture.sample_compare(shadowSampler, (_264 + (float2(float(_312), float(_320)) * _304)), _258.z - _307, level(0.0)); - _320++; + _1336 += shadowTexture.sample_compare(shadowSampler, (_1231 + (float2(float(_1338), float(_1354)) * _1318)), _1213.z - _1326, level(0.0)); + _1354++; continue; } } - _337 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _246) * (_309 * 0.111111111938953399658203125); + _1404 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1184) * (_1335 * 0.111111111938953399658203125); break; } while(false); - float3 _347; - if (blockBuffer._m0[_126].IsFullbright != 0u) + float3 _1430; + if (blockBuffer._m0[_747].IsFullbright != 0u) { - _347 = _156; + _1430 = _861; } else { - _347 = _156 * (((_161 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_337)); + _1430 = _861 * (((_934 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1404)); } - float3 _351 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_347, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_351.y, length(float2(_351.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _1437 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_1430, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1437.y, length(float2(_1437.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index e987fb895976f2dec93d01c734d78cd2803cd12f..d9fd1751e7f6de48e86cbe84a3348a4328d3bf9a 100644 GIT binary patch literal 53796 zcmchg2b`6~_4lvBf+C2$mup{SSvppF5flXl5wYOHF0iuf;ueY(doM}sv9J<*jNKTc z(HMIyF^MKoqhf+By%?j$`2M~#bM8I+aPR*8f8O`=-f(#4ocWzIXU@!=nR)KTbXj+o z?z!ALxm<3;+!yQXq0h#-b%TWGAn`qN>*c0RoiY2MiHFT@Y-*g{Qn#q4v9*5g?E1!e zO{(7@*Dc@=m^^KAbxUh)^^l8yS)T;*$ z2-ppCT~G;jdP}dX%19Q~)HfoBuMl+;$zgev%i-=uLV-ipJ=a^l=5k~A?SFVnU2{wS z<7;XfTlz0|H?2$|4Srf`J9ZjI5yO z!juUUrj4JTuN=^)fR1ih#aht5`J#xP6&2N0)9PTOZ@$>GB6?;4T-58EPvI)Ujx4|m z3Vri2C`Hh$0;mA*n~#Aif(|c$3h=)97`!5AMgdfS_sz$E7D00I;L+0#%2!qn%CpPxC>lI=*$itq2#iYp1Qgu~m<-jyKfvYp&zCo~su$v^1c5MMZDv z+B%#zarC(Hhs~a-)YPjmi#rH=_2}O}zo4~sam&8_`_Hd$UC=hCdT!IA{tfkWT522m zH8s!gKW*IP*|C+m%}p&W{p(v=+Ui>R4;na7HnsX2+G^|aJ7;sk&b@l{>e13#qfD8f z+tk?7nxEIuRMVPYIDT>=8pkYIS0c>uY z+nOIkD(ltbq+UJp`VhGMq?T!mo9kQa1S`lU*0fBSEB9LJn;J865^>W~FPzjep{=1| zPILYI1+5+A8l|~)Ek_MIM$%J6rQ98yUwBAU^P-xDmZJs^I3_>5;9KbP;7YnWuPXgL zQ007|s_1A5K);dzgk}M2Sqnj{Gk|M7!m<`3z}YDc$QM2N{{`qI>|@*J)J<(_sc+R7 zw;Z*1iP-lWP(5^BmHWGd*Ix&q@E9y>AsYW50S=b6;B*5&?+(K*dko2rTo)XWFXQT)b&Av?E9p|Q zTeMl+%!{UrGFr$s5OVt0GwzR2_*^_3n9-P3^YYtrLuZy#4la6c=P8WG<3v@ySZfC< zYU4@5*V+k++IWcQV_sP-H3RFGIfts^hL#T}^x`-Nc&)`Rrj#11)uGOy_kn(*mbTi+#MBIicZUZ_-sjz<+G&=@pFah$LO>(!cxwUTDq;YG- zDWn>kd@V4-ID-n^E&RxO0+O{MKWgS0P)jexnu%wJnO zzc6?vUDDxx0hRis>uF6xh{)QOZ38sJ^O~CTao{Z`fb#!X?{D5T>CJYFlKIH2`L$aEKqfwh~ z#ePIPGpk~K^^sPX)hFLKoF()~VO`s1lZ882DH!ip7`^Ic%TLUzX<^t7&V ze(QqDXvacGckAcnD+{<0!>!{dpKPW5!{uOJ3MDEh6@vw<8%1kP!6%Ju z@Vk&4uEXEpIBEr zt{BduPbTZ1;?*Zk=t9@?HLb06jcvMng?koLUYE|6MNLhu3tC$17N?aHk5#dEzOAge z!3uXVVbDt8tD6<5%C+WdoT(EggtIRM5Kh%xLYqvm9m7i9#XmLYb^Vp_Ei))(eTlA7pcjdZ}x>Os`LzWH6w>Ik~p3=^u zLaJ8x-@+`4JqUfki_RRNJ zs_9^}+FnY876;|qmM8`p$g<^{uHljxlX#k@ZA+?`3!GLvT&kewVwY*JVleZ{vwO?C)r@n^WSuq?i zVDP-KgYp7Pov2Jf58iiZD!-(@rG8F*gBE5~wdoj+67*!5Ev6&%zO+06`Uq z#wb9R7a(r(x`ve1EF>|_j9s*Na@~@;hFNvZO_eNTr5MeuzSikwRr%$8)Q>_~s*PJUVOY?%}m)i-LPF0EV^cBpuk9Hcided3jwjuw-8IQ~ytxO^-dVKh0o za1JVD+}5VWh4O-?=K2$x8qLe-MJ*#~*+J{m<-1zuK{_$TNm@uF)f%3H(uqnZPOYY4 z@q!v@R@Ug$HK?*y>A!Xvr@MuEfvT;S{G+G1sFgaeoo8`naM%rl)LZNT~0U+g$vzP*;)L zBGy@egZ`G11)l<@OKvMYYo&nh)|8jWcD7MD^(547D_$K^xgxin$`&~lCF_>kUe8gj z%NN&G52~%MUsN-{F3NY1JR=VH9VMS$r_EZcW@=4y&7x!{uV=K=61Vas-$~D4rzj4- z>@2z6-Bk>>chS>tZBbs4+cnB#l1$j$^z<*OBerX9cjWPQFPmL+dx#&y3vxY)L8YGV zNFrI6Tp!7ldqR0nl@-c>?W<>TB_ivZtCEbBuSdZ2)3cB#f~;$ zE;+vBY+FKIx7eU1vg4wpP6q@dR$ zH$u-iSF$(e>X6t}Exq+~BlQe(rwoko7$ry!f!5i+6doUy++2xw|_^);)KCWNY6M;+RcTT{t)EiQP$hHn1_f=wkOk$?d|Y zqOe_a2k99vWKnmr_@FyAy&OomgY}FzaPf-QA>l2B%E)HuS!-|SlI)0x3orOo3^>L{ zy0#=GJ78VLsQA?xt3kgC;48eHd-RxYSBBBe%{9y8y8x^?+Uc!R31z)@FDm!yF?UXQSCv1!v7U?7+6r?l zK!b~i22N_BnJ`P_n?k-YPT$J81HxfJ2Zpa>+~VMjhi#JEUQGDY?audq(~Lzd+sxqn z)P|bnbpn-P0j1d7eF`lC`Kuz{|J4nEk zfitMV#c@gB98YRo+*W)Unv{=dYHp}?@t8h-=GZAy4jX5$hy!d;UP~gp9#-XRTE$26m(uTo=5IXcXy zR&9pF?o=0IGdy;?y2Gfaq2Z<+_U-B#U2^TG3TxkHwU^DUX|7FL%<6QmPO(ex4vOdW z!TFkoId!$X(1`Y%=g;X7tGL6eS|N$sj1R2Eq=SlnJ;Iy#sMF!KeAv$7I90ix#Dh@uo5{yuGjphxNflKEk#3L#C|ku#+eU`>jDQzye#ybrQ5SVl@_) zmUK4O$5<6&;u68&d~x@8LmK9-zBnuX!ei|rEh?%Paj=qwbk(hEXsL@$ofID-nH66K znij7EY-sxCEs%Sr*lXGMB~%tW|9)w3zGWd7L`?y^38hKUVXlT3NBuHsTu}=NHAS$H zH{q?VI8O7Lc=4(>xE$M|taLjXi;kN`^)jxXvHNLV#hjE@_>jtQu`I??qrQ+gl1=m7 zwYt=LQ5@2Fi8HG$Ruy$#>Y6)B&nY1-!FS6YExtoc0KU?A;Jf5z z>p5D7M(iG^@+6XAsOy@m(bIl&$vtU~c=;}Dm)u;H)tOMPrQFsSY;ZS7qa65o;?wvC zUe{gSV_E#PS&>^H-g1DD1I_oFo?qNDd)Vv&`F<^n>zkM4`^{@vyrkbeZB=?> z+^@N=rKzoXZe70`j+=sq+FE|0I($i6!@`=zeoOVUuznF0+Uk2L-E+bzdMGb0Xi#;D_LjQBRmGr2_gikz;S@y=5? z*H`40O6HQIa6Q61h%$Gxu=`0xxb?#wx%AyE!f5kEVcjMf{60yt4yiBL>y|sYAlHoL zJAouWMNhw@iItu8a;NGU{j~QM)nUkDefQjHDg^&B)x>m#>ih*F>U7JUu7dw++T>@L zJZ?n{N$AU&CbtEe?nh@K?||)+I~&>5dg)c<&Y_%s_@|;I6}fYfIh_h2&y%cFA1c&` z^HrDa1M&+@r={>3M%KIKE;M{P8Hf$?iwtjZO7e^KjN?=s5A0l0kQWVAXg*wOcGkM9 z$N5m9{BoHvHi^2)7CayS9;lo8jeH$Z_Fa(atQ+g%G*{Vlx~S~8HLYDqOFp-P4;rWEbuV=S}!GG?$#^W>hT;uVT+>S4o>*?1a zV}FHY!I#Y9CkE8<34WyY%-CEhSq3ia-E&t-UfNcy!&WwDVDIWO_O9u~9(8=Oxe0sM zN?yvpZ%baf;2OL$^yIhJ@JBfgRq@~mNrv*lWRxK4a2ADAEYjnzwPnyc+P zGeDvczlyc%cx@Nzx~*NutGiIweeJrzR=1uC+T%ilh1-c*WW3fdRi_r2fAq)pWU$wZ z53!5uz3>i~x*N*W9Uv?Cy`ks;*`)6~i1@(MUwGmS4;G#n!_zN#e1WGgULXIxKDlaV zk?F(lB;tcUxyjeV`+9PbuZO4J{39p%dU#*YTKDzv)UPX|eb%3^ho|29$GW24^VIV} zpLOEv;eGqedtVRl+h!xr=0cOeRG(5A3^j%HfXO(GY_6lpaX$5y>;kZZpGtNpG?b@rFgdxyEB-J@cV^G4AlIGW;##72Yr|)W4##9tHj`l^IXsK>ckh zljn`URb}S1@teyS^WOM7RVD}F&nD8(t8DGTZ%SkOfQR2qgvj{K#d!P{;=Mn+tCH^) z4Zo%8%^&P-C8GV!WOZwm!7)d-Q8|}eF~Z`#t$5}Va-MzE3i$0rhS@&V*_^``G1)<+ z&sWAjD27~O{En*s%JF&d5?K95V#%|{?-cBPRp8gCjx|m_zVEF1mtK5vgz>wG|L2!O z!W!IFWiXhi(n!JYCMwRCDBE2!)`(w|dq{TJr0e&=F0rc=eWj1J(?`5Ua1=cKz5`BV z{2MCs{$V@S?}@JLBeVLQ#P2G8Yn@ci(-S}SC-};fk3I9U(Koc03)pRh;*Ns6D#_uo z#a+bP5*t3=R==bJ7XR2A=>zj~2hG^a^n~{WW_!&8_B85uP?^079zUvu$1JiPG|Sk3 z&?k0A=(7h=hdz4?Jo^2UJ~HaqSJ0zwK&nGVZXGC|J~Fqr(%*x`BZEhm{RA1hgZ0#( zAft}Ggt4G*NUB4I&+G-*@dR#Y!ch-DOuS449Q33K$Nxa(ryT!?%1=A~F_kxS{EtWZ{rExHOe-h8Q8vkdNIXfEvHnl-0HU$f1=~J6+h4M+l!y>_#MTMbNsI2A9s8o@vV;U zE56O~RpQroe6{!`jvpX?spAKUZ+84%;!kq?e&WeF)}P_xzv1|i;>mYbKU)07jvp)j zLdTC6e}Ur<5Pz=YCy77X@dt@N%kc+`KhyD3#Gm2#8RAcO{7mtuIewP-QyqV__){Ez ztoV~1KU@6Pj;|44)#UJ7L zrQ&Bge!2La9DlO-$&Noo{K1YtQ+!{?pDUi^ZR2^4%6(k@`QmqR{6*q-bNt2Pw{iSs z;@@@rrQ&yY{N>{NJN_#12Ri;5@sk|?ZSfNvf4%rIj$bK$q~mWAKf>`hi{Ibzw~F7- z@wbcL%kg)LAL97C#1D4--Qov1{$B9|9e=<0O&$NR`0X73i1_Ut|Csm{B8&f{D(~Rx z9~aMtZS_xz-@?^DBYtDYzaf4T$Nye@KgX{Tzq$CGwBzn4yEm%LnP-2M*`Mze&z?M7 zW=4hDo-q+9s!-CoBZi+W+0hPvu=vG} zKSca!$4?PI*6~xt@9FqM#qTQ~{|-}Gf5N%T+M6c96o;QKezxNe7r%$&XNcd&@kfY1 z$ni79A0nRij#QbkWQ?u7St{2${88fT68>nF^(UN54S$RT=Q#Ya;{Eu|7JreeKTiB5 zj;|5VIoIsX5r4Vk=Ze3=@wMWwbbOuos~ta2{LYS_FP^z<_7{k6cYMA0?>PQ=@wYgB zq4?V!-yoi~VD=V?|E}X3#kV-VNqm#z7mGi^@h6DCPdw-KW|di2`ctsqBIXB{9WMI)0h>mmR-c{4?VBlP}z(&R3ZaJol#yBO7?`M(po= zte$b@1J6B&^MM|L=ib7&8qZyYaWtO$2jgfwcaCcv&)woW$8)#nDt;Xi?QyrLa6EU5 zZjR?}!CW^ycZ>DJcM+ivzkcFb8z&|_cT&choO6l3 z{{r#s3FiNW;%$!sf04+}DDW4HwsQDO#M_yP`b$N2CV;<8w5`K`L%i*Y)PGZCdm{X| zM79UQUoP6w>0co}@Axal@8tNa#P96*tHpDMsZx{~=W9evz;#7kL|sJ{qHgI)*@&31 zFI+3xo4ubOS*@8gP~~rntnNCM_qpVE!;QaQ{F$HKRCot-gLu6+-OuW86ranDD!eaT zDSmwsa-N23SNZf6D|969684Il#P`(9B+soBi47l;|>Zw%$?xrLoo~weqdytb0 z(I+mA2tm7_aqE+ne{+>VD1%>+p)pAplx!m*}h+8Y%}M< zQwJV?_mC=D%Z^VSQeN4VDo_dQ3I#5qVfOa1i zQBR*B@U+X`knPhWl3Cm2fAp+R)PcvI^@%+J41EGeyJq__mBAMK6vyaClA+U01fKr% zRCdGH$3@gxU%+~@K0T3e^k)kZdbImvQMOM{N@jifiOSfwK2Zn$2~kh|4o-r>n{hJRr#e4IBwb$EOt9@f_vRenN*KQWF` z=Oyvx6M53>ye$3+5jwAkY%G7KvgwdZz0RxRpAeyQi^#^|=PIMa-bB7-Ug8^1i1o6A zXr(Cnw?T;UFT|tQTePEy7_1a|U0c(?lpO4aBHBaO+J8-DYd^0tzIhw8zmsUCD7GKx z;OpYi>n5UY`qfjjj`9DMh`I(5xMH7UY=52V$#FZ2Y#skb~aHgdXuEKJ@op5pDL= z%wR13Ai|dA1ICK^z_>F`%u!@KA=B}Y_>u!Zk`65$hmST6sw%9bPkqB44x zBd7z9J;VG}Wsmur_}fJ28s_f_1FnyVxZf&bepv4KhsxA%Bid7h4nF=<#5iLQ9m9X3 zvf=U1@c&Y|6#i3(@2fJg!v4QS&xo@2Kaam2K{Rr809Ti)SM@e1C^uNAiyNcm`QF;cZ;Ih%b&=%>7-R z%>lA$K37Oy%I9tlKT!DBMf9=zTKMS0dI@hntS>(6Ll0+jkZjo)@SeHjm_?gCGd6pb zu(_eLIoR3c-SmUvi7ji>#%?2rAL8)5yY7gOIdKz*A1eHZBI3YWkhj|>^h&r1& zonfkD{hAJaFde?*wS2UN)A4&0?eN~*bbJom%IWMSoW&Cz-mRMs<6!M<<8=0x-22A+ zchiY$GxldYr?ZcA$WPXv?VZkDuALp6&c2er=5%&+I% zbJAH)GTNs0xnhy(KXMf8dO z(;xh!y`DNvutyG7nLOBAw4(^SEA{j-wX@Wagxyf}j03u6XK1SPa|AqbCa?MVGAv=4 zFXKh%(jMz6J74%d$o9m&liudSf~O8V_6)O621EZ@o9J48+Badc^N#PDIGbQ2uFaU& z_jmXSs<#|4T=LZ=@FN`l0EZvB7Cz?SQ3-GT8ZDl2#}D&)Ov2#vL}zoXJmO2=<~SYB z4&*e;S#zC^-#==d&NSgIPP9|!bY4-N?TPc8&UDGiq1MiPr$gSeoVOt9_}oid9|la^ zH|rCIoO`$k9qiIyY_VV19(}xIW_w}Mv%EkZcFlI~ zk4K5<9+9?VsX z2Xc!C{ii?pM|*a^_@>Il#nvft#cC^q*65W9!+f11vVLDBIsL{4bI$NrJN#V9*=w+Ujfn9m;^VpM+JrYBzAc`)3(ow! zE`zzg116r0Zb%sXv^|t|8T*dyM*NKqUn`9DYo+9+`ql36b;4V}Zj!u|{Z$S>&*9nE zO5wlb@WUMb<}&zO9DcsT-?|n)#`(5{w>aM}z8L2ilRKPE?whZRh~b^0Qa*pz;TJd` z?ka=-p2H6n{=;PdZpll<{2qs|7nXUCKlh3{`V;fqeGY%T@T?K=tb_YS%xmWAEh4+K zJs_E1TQ`QfxDPy->R49`MPSVyHr8HO(T|6c9(k-$WN~~|W&AFcZ@=$!nw-wVlB4r} zBA>^8;B*!{okx-mc?CVM^Fya|g4204={(j!C+4vqB^~luvxvSE2hNUFBI1DjaXo2^ z{?i})qdm)0PpC|++4ovR*v;BOew~Q?X#2vClOFMG71`Q*QgVyudy>a~#&_F4Njh1d z*<-!Wrbip*=Tk}7{KOW1dR_dyR^yhG&U`9jjk`uRrEu{mIR zv|)b!H0he3*rGkJi=S7DqMvd7z3B9os%}Wq1H;^-P2`tn^j=DO__|C)e>lJKggDDD z7p)ZewefP&BQ86OZWp0PT=2DHT;f`P#p&!KjOo0Ubclz=#OCwQoX)OJhdDw!>{(fz zSDnsoPG@z}VICKC;<@qXNv9&=@6^+L_=U5#yX0W$>lzV0kT*C7#rVYUo_?8hdPu&9 zh&+G}c*cadBL7%~9`PhT^cVkW)82=@rt-SN^cL+X!uCo%{Ww{Uem!9~R6S#huFb7q zr8?%;i6XGft<6O?N05I*gpa28Yo~XTzTSqnwEkK>u;cc~6rXNbUJ>-T!D5oK+?pYUcYwi9iAkm|5? zrU)#ymg`x{)`uBeZwPCB{K(llOLDN-qJJH2#kN0o__Kw3NCY1L*msKki1zqq=kDz}Ni zo9U~bypSY;_t8imFmbz zH;IO6*4?OQ7ZD$RgZ*#K##MUq`$T@L`yEkt>csQ=#B)`Kw?5pkew@EsO4cm!!ffR*_h&F0B@Dk^H9HSDOvrNyo~=iv;7-&}(6@%cdp!*4Xf`1m~HFzf~FX<&T6ewe{<)&S%C^=Jn3O2YVlJ(j^( zTfSdE%3#cn@7LoQ4EtZUUr%H(oC(1AasP1!b8Eu*aep#{*?gU7hu<;V-1tcbV{P%< zX2U#{!I&L>?`)W-GZ^+(d|u%&&tx#>^XU%rYzAX-=C{(;)^iz*#qdmrc|L=&w$5^x z7cv;LbGF0$G=s6epW`quW-vC#&UKiVG8l_9ztOgSy_~^V49|C%S27rD>jH=QSq5Wv z_vZ@OyE?yq3XOTl|LHFt2AY zW{2OE8|GITjE&bf9p={=jLnU2Im~Y|7#pw49p;S;#>V0bhj}xDv9_*sn71+*vvZZh z{5FHJb#b-i!*yQZx9M+-x@yhA@2c`UBF?Aq8>{@Ts9WMcS1wpBzPosf-FxEoC;UeA zKGkE7HSF{0?=l$L0ORxN?=u+M1>^JSnhXYCz{GqS&rmDfdFP6C@H3uu-cP#oh35{z z850^Q`6!W{F+NB*&KReu-u$rhRJ*f(s_HqnS{om_HaJhs6c2G9=N;FRiYzhxNQ7PH ztLc6$UVjQ_G1KM#KVQ1fCfz>>g#PZK-SoSC=acXAADvC#XYK)aibiW>M+@^O5qDI^ z4Ev1zW#a#m>deQ#ir1guqqoOA$KIjI$G-`LE+3QqBgq6S$UaFjpoaT2$+{%jr&9PV z$(W~x`$970d`$LblKD2iN;05^TSvyxwKf=&E=lIws7Nx_!&Loyhy8`?E*Wjp7Phg4 zE?8R=>#MA)uqM7IXNX6;c)un#$Y6*M7{4ZZWiZ4Gj9(MIGZ^9rCa#G%_czX9@E^>U zdPbijZqp2oJ{m6i6>*zqaKyoI(YJ`(GJ_*lhV%Yyoxu@L!{MXNzil%(Vs5yT9B#XW zv$f8h5#o+tC$hD^y|Z_sL*c@8M=Hc=a@;0&kNv?a?n}(^pO8uc7`r*g!_DW4;TXFm>KpB~t86jeCu8S88HI@P`NEIZoE$EGU*VYR=-XLkf0dEj zzh}F{`Rn(^;lfC@u#Z`O7$qTdVX@{gXPptkVbgpYSw@e&op+4vFX)XD?j0J?$7ExY zOw|Q@W6RiEEYMY=soI~v(sP_}*u(}tnLp!IF4YfWj=rsz2?_B|awOaOUZcG;rKlG>2pTj%R<^1+=%FQ!`L!WnH_TKHzH191p&&04k zqcgT{l|Hma z#Cyjn`lShT{utqi3B*UD;Dh;eY#BR@6LxI8XD1xveM_?29_r&6<+zNUn}vZmUtc6L zJ2lQuljQFzAnnf1oHBM^76!7j!dz#kQFcn573wmWQfGzv8BD3OLVX6~&k7dDg&9n_ zv*Dr)uH4zMDT6C_HasDND|a?*$>7SJ4cjuf3h|5&=f`+9jAw)Ixp}!z@sIEO<6Kyh zY}k2dk?JA#9mwXwQrA|g^T*w;4bC5Y&tUOhmT9Bh`D3|o%&}Er?nM7iETfw}f1D&7 z`u_ZJkMk+p?~^ljt>3IA^0@W;l!Rj~HKbFy;V#(J(04*M4G)63}5H}qC0 zkD_;maP$X#>+e}f*ZK=4_BW2l*{R-qI!bmR#)C5fXO$7+&k^oi$A z!TPXL~Gj?VQ1M&Sc=MuBC(%Cse@>QyDcmA|@V&^g8xS!l43}+Oc+)r3H zt5m*8K5^Fgj_77rcZ|89mC!O=YCmeQJ6P8;aN_NSu|I!+}M|H%5 z4`)4e?h_#=j+E{0_rT4mjUdz zs~q>7c#eNEgP}bz@f;s9Ph~K)55~WTdnSXyA29ws*Ru&@ahU z^Ge3f!NNfFh2Ow5X+C_e=g)*AuBP{D89nk4?VH}ug(KFc_lq)mGo-^FV0yn4j`*A2 zYi0EAP+#5=***Jp;qaAqv0?hZQdvzD;${6r{|Hr_uDMEX`n7P_SSgw5{-%sBu}0To z{YJtO>&eMhyUJ$g&5WIcgn`Zx-7T_v(_6x^-$8s-6?`{4zb#{jIf$JzQ(xW|j{acJ zbl)kXOJC5nzPy`o^yNUwvDL1!*;$>jGf5bTe8=43OvJo-PdGhtV?@|6{oj?*$B(EV z^Y-r(4nHO)d+pATH5og{sBMUMfyCoSiUsdK-xm&FnE&R(2W520+t6*A`{;fs9Qu~C zA9gvL_og4Kjt}`7>>owQ$k&uDU;m(!eElck)Kp=9T0gk6unr$h{rIzR^x;d%tRH_V zqs#kDh<(`n;mJNszy7N7c6zd>VAuQlNGHDjO<1X|tLMfu+^@z+4)b#&RAg}^4p=Z zbGdwAJ$@p_rGOyIV*71#Rqi15>5~O_sXIj<{)QOv!h|{FgE4`eK9-y7H*w{ zqc3ArhuwCS&Ca?RJG13K#Q3r3?Jqk`0gTP%n!;oKOT4U zW0czPb8bE1)O=ySA14MXHRrHxHlJ`dvvY3!jLng16Jq`FZjL!a%zFrz&08Ck(dGU1 zO(Gkwp2CR@PZM=GC>anjc2u4Duw@zD$7G+q)y{WY35WhF*Y4J3bh(e+C9-qiHo~EAZEo9%-tE#m zJH>1};m~b&{%)VqoufJ^+t(e0qpx|VyJH#MY+v)jq5qNV>rQ2KvwhuJIP|TryL6)G z`?{-e==#3ymeHN7zChW&?k*gC-O2TJk21R1zE%o{{uz!^~_Y@9&>ucXm z^vDl3u2sUJ8~Yk_U~m1{NA7ochxcQb7i~Z5Cq3o`@xqSfttUIlTh+p0+wL6}N7h+~ z?{^c9b+)hSXscai>)(Kkomv@%?0$NQ=IvL~8z>yQTHNd%!KJBPe{SLY@`-+{ zLjQR`!ut}=M?BfHhzI+OVR%o1uV8qB!MC^<#dGvN;?=#v`w{F$-(&s0uAaVOGuFqx zJ=ICy_Dj0u`eyHEd1rH*h~K$cOozL6dG7*-cKy4fdnB{D`E)0KjLi5^rw&8B%bhLT zHZMjAN1Wo>CI0^E8E4nOyB+Opu8@toM7(pGAlufDF|Hr0grSZ0(9igud2GfG`zyrw zkCGkUxgMbBIN`37o`2^sz7t*ad1o_Fx)X#$-{$%Oo#@e~-8Ux+hc3iNCUdGT^zFc8 zhk3u7D#5ph`q;OFQa$5OjI3|j_uG@5o%RxT4$jzFDGbE^57Ezy)W#vgT^!nvb9bt< zn-`AycIV%rW$fDbdf4SV?!$z;#Mzzh?Cv1D)O)*!m$A!P7h+5&Dv&dTyIOYbJ^CQY zW=e+K=FhBTix_VwUFv;XN2Pj;vBl&zxk3zHOsQ@a-yFJ9ATgwr`WvAAUE&yUK&~tQF4s#`?hT z&t-3(v-WxzlVwQuEDjlh1vn{+gVhmoxZ|C z=5M33vzg@F&%B+cGIov@7P5Dxi=CZKB>$WGf*t>^v^j(MN5X8br`c)EU_MD0|E_dN z22<*L>17$r7s(Fa=lc11Vg~o6!$rU1JU%&t`^w?`Zx&C@;L3e3y&{9_lH!hkkj>9C zGPnwdJ1OAex$De?TM*`Uls%jF75g2>S;Fx7Lhp@M>3Ozz?xH+xk9*GTMSl_IA7PAR z49-byFn9S*YGc(w-18xuQ|BfeYhWYQbKhzY_0i6G89TjI56x45AhUD6v$LV5qyUB25!_cZmDJbj&T=-axwzKq^T_2CE+a}d27gwrFu$G}G6-9h?y z0XLShgAK^XgShbi6T2%_#x^n9MK~Y-S2~GRyYPaq6@Sh<#NXD=O$o;u?2+1QSK0c% zDr2W!x)5{q4Uw&#?+Ayle(n4$Gp}w@Js;*3_}fItm;;n;4!r96wVvAWYv*?1e7}wt z1C?4k*fyI#cQ&(Y=Z=ic?rIa_od#sTpSx2y`@X|ucO{u%1>D_9hMyM4d&;!I`R)(_ zr)s=8AKxn+?O+!>@%$g>@O|R3X?fNBd_;|3FS<-?92@rwhaJvm*8T%!beRw6+I)C0 z;g}EIB*#{}%4X-GjGcvQ58}6QybHFtd|xawD_(h-6YN^vi7G+hZa- z>-V=rRWAS`3~~IAYLM{$Q&;)Wq_^EK{ zN>uRw#WK3wjnTDtt1k)1y1<6@{pB*c_>b;kI-k?`SA;{q*mgW8znb)|U*OuEZ$D4< zHnxjo3nK5}pY`h($+koV-+tMNF8jUx#`ZPg(2qGZ#`Ei#0!j|%NjoN}NZmWf(4U60BnYjH?NilR z+`xV&LPp#uTikxzi7%fESIQTDySTmjZn^3U;n;`3S|0sRC%Q|eYjgEW;n4SU^}l6w zTcigObL$IFi}_b76LZD^yS|@qchXNb=~Df?UTr}Z^L2!y4U73ZnV5HBv)6~Y3bsOo zjF?lln7`YJFWrPI<;#1r+oTGMd3WKmF<-9}-A3u!JYQcp^!+^VQAT&M^dMqxec@>_ z-#}$z&NyJ#_j7e8{p?w$J@!F-wHUvbiE%IK@gc^v-CKl=7*n8 ziNgM~sp=v2AKnMp_e~oM$2)*|Va($`x=AOx+yPB@Q{m8G>2xFrcTkKYYIrnj?jv}t;~ zl+ojCK^~o|{&R-gRXEy2-*k5?qs!btm$N^*y9>8_vSGS=l+k4@(6ty>CLA&Tj|f}s zdYYX+89Se=4kA|c+s?0h3db7ubF6O}-G_za{f5oYD&hDySlF<3`<2nuGidX6*c1br5zK1G6*8+4)p*_787oaK_HR zgn_cZ`yS%#e4_eF^~>8C+KHXVglEkT6Ndc5le|cb_EH(2SjT&d_DOa8MtEP9X@|P~ zQl0f{fAOjccSHJxo#;=zUkrEk_=~MrAHTa?(@Cxvk#ubxT1>dtaPPifdxE9jG$xP4L2al(!tr-NNR{$k6I z(}$hJRr+>zJ65>t*==?wx^2?6oPV5f z=#w|C-I_AG{Jw-UBmX}62E}@gaGU`S!|(LIxmGgd^atC5cQ}jJC7I1d8+Xnu*tR`^ zwZj^~o~@DjN!Qj0n0DE>`Su4l-?HbL1xeT1wY>1C+GQVKp+2!jS(n8%5Od`5u3gq1 z7}_OQTMl6Un;(Dd#E*t#%lxpMX?|dnJjhz&X*U1ViOog-gH7ujdqXh~$G$ZsU1Cc9 z2V;G+eTW=ve*C!;KTb%ttZz#cPl&zte#O|%3eCciBd=4PjcsevwXp?*A2ui3QoY$; zDqZL?VThgCULsufjJ>oIUCuwIyG%IrS86_6yURP#9jo?D_e9~)$8Xa;sf;f1K-Zto zIj4W3|Mvy<`je%{UVo`%JoyfS^M7vJK&)5D{u?PPg!@$T`2AhH+nnBs?&{D+JPZ6a^})X9 zJwtkY*k7=FmgsB|Yl5f!o6*0yzF#X}%;$52@qNEnwxIAmfGX^_Oy>$WQL$YundzQa zMwj>GhYCl2;i*B1wZ1v`c}r?6pagnzx3Dqy*%N}U;6F+{in0<{kQ#kakZ{O`ik2bAucL|3s#3$Rg zyOSOI_EQn~*tdAU`!F+g7IDFt^K0H)LmwkZuC#L)Tq$_bj_u(?S zoPqBY*?r*$!qGN1tldY-=&q4{_I>;JeLoaVrgCFM*fIS_%jgrks2_96V+lv>o)uxQ zT~D*~ql}%WRR=vLVo%{r$9dy%;qYT?5%I^4*?2-_;$m~)X_X;t5J&bTZ2VX_>|7iA z7uWTZ;!Ejr7WD6qej*(D*E`*(%IFdU|NiIcgd+w|iLlkKr}_U(#?CUe0deMsY)^hx zICPCn|G6^ye7DN?PRwI+=JUeok*gN5#>gSqw7u+8x6b@t^MWuIqZKk>`JH|qpX~E* zZ+@C^^z-V}Uc1WX=ZhIT{B{UhE@IBucl<92=YN+;+h*hCGB&uYl84R4E5fliKzzK7 zpOvw}yEgo>Irpk?Vsm3f_=HW%3BO1-=7?v&T+1MD87^p;)xCWP47nuM?CM59GmSbbJnu&l_r(=cSE12 mapYdZf17eWJ<+ACs;~|%rXOc~IYsS2{Cf}ROGR>T(f4v&P(6Ld6yy5mdMHZ10Yp`xcLzK3O)c_z<$8ij zz(Bd)U?3jjw0rQM{tXa4`L7T9j#Y)?&U|wlDon3jUu65P*2e0o4b@FM^V=G$^TlF* z7rshH&E@j#&H1)tO_%|8Iywmsia zIB)*|@&h~h{fVr8P~@p^FLrFPqK1VXTemhAs~0vGw(KBhMQ$)LWy^J`EZI=G6>asc z#isVs94eW∾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 L*X<={H4FR?tlZmJ diff --git a/shaders/bin/opaque.vert.msl b/shaders/bin/opaque.vert.msl index f9c1bd0e..de26c719 100644 --- a/shaders/bin/opaque.vert.msl +++ b/shaders/bin/opaque.vert.msl @@ -59,9 +59,9 @@ struct type_UniformBuffer_2 int2 ChunkPosition; }; -constant float4 _58 = {}; +constant float4 _297 = {}; -constant spvUnsafeArray _57 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); +constant spvUnsafeArray _296 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); struct main0_out { @@ -80,15 +80,15 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _80 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _81 = float4(_80.x, _80.y, _80.z, _58.w); - float4 _88 = UniformBuffer_1.View * float4(_80, 1.0); - _81.w = _88.z; - out.gl_Position = UniformBuffer.Proj * _88; - out.out_var_TEXCOORD0 = _81; + float3 _409 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _411 = float4(_409.x, _409.y, _409.z, _297.w); + float4 _427 = UniformBuffer_1.View * float4(_409, 1.0); + _411.w = _427.z; + out.gl_Position = UniformBuffer.Proj * _427; + out.out_var_TEXCOORD0 = _411; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _57[(in.in_var_TEXCOORD0 >> 8u) & 3u]; + out.out_var_TEXCOORD3 = _296[(in.in_var_TEXCOORD0 >> 8u) & 3u]; return out; } diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index 610f31f965f87401137220c72bb457b6d9e12cfa..aadcb491f1450ff6c9758fe7430f46aef5158666 100644 GIT binary patch literal 20956 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 diff --git a/shaders/bin/raycast.vert.msl b/shaders/bin/raycast.vert.msl index a39bc63c..9ca8f250 100644 --- a/shaders/bin/raycast.vert.msl +++ b/shaders/bin/raycast.vert.msl @@ -54,8 +54,8 @@ struct type_UniformBuffer_1 int3 BlockPosition; }; -constant spvUnsafeArray _54 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _55 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _189 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _190 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -65,9 +65,9 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4 _73 = UniformBuffer.Transform * float4(_54[_55[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); - _73.z = 0.100000001490116119384765625; - out.gl_Position = _73; + float4 _254 = UniformBuffer.Transform * float4(_189[_190[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); + _254.z = 0.100000001490116119384765625; + out.gl_Position = _254; return out; } diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index 8eb4b5ed9ef0ef347a2f0e35e96eab82a3aafa16..c709be0df4cfa7efe2fbeca61af5dcd3ed8de17a 100644 GIT binary patch literal 14500 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 atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) -{ - uint _41 = (in.in_var_TEXCOORD1 >> 3u) & 31u; - uint _50; - if (blockBuffer._m0[_41].IsSprite != 0u) - { - _50 = 0u; - } - else - { - _50 = (in.in_var_TEXCOORD1 >> 0u) & 7u; - } - float3 _56 = float3(in.in_var_TEXCOORD0, float(blockBuffer._m0[_41].Indices[_50])); - if (atlasTexture.sample(atlasSampler, _56.xy, uint(rint(_56.z))).w < 0.001000000047497451305389404296875) - { - discard_fragment(); - } } diff --git a/shaders/bin/shadow.frag.spv b/shaders/bin/shadow.frag.spv index b41ed2226d25d4c7d9fecdeb23738188570fc092..bb2e909a9a050dd66d07731cedf921e68a45b51b 100644 GIT binary patch literal 828 zcmYjPO;6iE5M2UkAaN5uTPPP-T&Svz6M<+z;#81`kWfXSS8J1Oz$C1#T_;gh^?!4z z#Cwh{Wuupw@w}NgJN9bns3OFQ5TY)=;Gbtpl(HvPu`YVQeuuX=_o0bR==7^HX*38U zGm62h;m69m*!1#Lv-hlq+BUCrfBMt~t=Vq1*t0HHX)=C8l*JnS67Z@b!{?jGGsZAL zBV+%(2p*lbE_hMOxFE6diyovd=uhIo*aa?=TG)8r99i|m+Dg`Y7Dq#$&5yrT|5pE1 zsliMcw$Q9VtKKO|X z&%%~3T@u-uFGnt!$ch@VWCM-h$6v6!8vx>U~9*Pq5VTum##0z+T)3 zb(V7<^V|_E^{L@uOXSo6))AbCGmuYh4_R`y0p@oB?w?xZkWa7&-w|~=W6_&@){O!7 zAdmC${hZ-u?9Kb|@IG&dKEoDw+K1124X~bE4^^x?0GPw)l+8kIqL}GFvK`9m+=ujw`!Y3u_(JS5N| zA)`-U{3;}?({xF1E7+CnX&yBKZ?Woy2mW5*`BCH_DVDW)ezWGsTfw_#D+;vD`m@q@ zPwXEwYC+`u)VKNNw7%cdWfDwSF*4(qm8w}+k;EARW&`dis<4|6ESPg=FwP89C#HwA5n)MIYN z!)jOwVsYs*Cxmxk)@CVBx1D8p=)LhHZ|m{)!&2$RqZ>-IF>3!8TWH5J|J(<4PAZU^ zT{3iIp4yw?ma#MTylIMPfjI+A?_ln5Mnb<1=Vi0N+(kMLPRHpn9S0M4^-sy>o|(<2 zPGe52*|z%QBOhNn4^H^FcefY*_^9iA?7`P3f%9o;&YY8w!+sVytWD)O-&tX12B!9i zzRWHsnO7cmucSWkeq~gcGw_i+EZi@hld#AK4_NdU4+@j-;zP2Tqr=0p;Y+;{>70al z5C@M+SS}yV=OkmACcVRleCCB_Ih|9+SleZD$Cbrd_{S4Jcv6^|!XG}63bSY3hN8 zls_ZADnyUGWfqv;m@x|sFWx3R!0^C^3m6{U5g1;x(!}BA=6+r_=Pv0axRJ}sNxmuj zg7lg)=*?zvIRq5`3xSxGl)W&)ZG!WB(U%rKd#+d#Fu5 zH4AzP^l?*??t@v9?|QkF> 3u) & 31u; out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); - out.out_var_TEXCOORD0 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); - out.out_var_TEXCOORD1 = in.in_var_TEXCOORD0; - out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].HasShadow != 0u) ? 1.0 : (-1.0); + out.gl_ClipDistance[0u] = (blockBuffer._m0[_415].HasShadow != 0u) ? 1.0 : (-1.0); out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; } diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index ca8f94caaf038c651e161b4cf421298b7e79e7b3..6bb02c2e244de874498f7d5cbaf663fe75b06c3a 100644 GIT binary patch literal 21232 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 literal 3060 zcmZ{k+j3M@5QcXqnZ#od2@nAqkMgQw9PU&rBv0vPqap%|XjMd;?#@ z@*%A9##iFT((l`|o9seZRXyGR--p$!*P1INO2*moQoXyQ;TD{c|D5 z9+$gU`#U@9o%GID4@kXoR?ps-TN`Pk*@dy=Bw4q!L6GQ zB>UR;gnG^=ZB>7&cd9q8tSzjpT)%wMDxTeYZTEZsbL#WHAN8He@GiC~LiS40?jTQSA^m}JBh%4~)0A|>I^hdn7=y%RVzgU07JGY`= ztiOb~-wSAa@=Qx~>pOML4%9==dUC}$Ysi@sxt?FnHxZmUa_;4x`_b%D@m zAQ3MvHvaL8EktFzjJcWz{jxN^9cKUXYOgw zQ{1+1N?a6Uj&efZkNzoa?@C;u#%pM2FXv2OM>|vRZj#?O&~jpPJ)4}lzD0B8^m)(W zdn@(bGhHfYvtVG};{NSn~|p{^j(4h_=3*_-u|n{{)_o(C6Ttuiqy{QDEof_b0Hk@O=dK?Aq>YzGv4S%CTqnZo=U&pL5q*Dg2K!t@?A8D0-#NFG^Zq|~ z^S+j`QOEoK7O`hnaNl9e4HdZWbFPH0(XapM9}x46*FS;$MqPbB zBKqAgxZBwB_8GIOV>_E!BxbXYEkB9GJvOlABX0xSykkh@HL>N3d7EJQ8h!blxr10s z{tr062V02q_51!i@7KAch`eX=e|dp_(+K)@ZkN&4k{`|V;BHQ1-$k60_4JFa_YV_2 Gi~I-XAk_8% diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index 552efff3f1e665659c384731ac23c50e8ccc8f8a..daef416bba05ca9b70467499425aa3d9a79e095a 100644 GIT binary patch literal 17348 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 diff --git a/shaders/bin/sky.vert.msl b/shaders/bin/sky.vert.msl index 466c5e88..30f269ff 100644 --- a/shaders/bin/sky.vert.msl +++ b/shaders/bin/sky.vert.msl @@ -54,8 +54,8 @@ struct type_UniformBuffer_1 float4x4 View; }; -constant spvUnsafeArray _54 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _55 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _188 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _189 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -66,12 +66,12 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4x4 _59 = transpose(UniformBuffer_1.View); - _59[0].w = 0.0; - _59[1].w = 0.0; - _59[2].w = 0.0; - out.gl_Position = UniformBuffer.Proj * (float4(_54[_55[gl_VertexIndex]], 1.0) * _59); - out.out_var_TEXCOORD0 = _54[_55[gl_VertexIndex]]; + float4x4 _217 = transpose(UniformBuffer_1.View); + _217[0].w = 0.0; + _217[1].w = 0.0; + _217[2].w = 0.0; + out.gl_Position = UniformBuffer.Proj * (float4(_188[_189[gl_VertexIndex]], 1.0) * _217); + out.out_var_TEXCOORD0 = _188[_189[gl_VertexIndex]]; return out; } diff --git a/shaders/bin/sky.vert.spv b/shaders/bin/sky.vert.spv index 171aca9805e3d1f6a3e82e385dd1ca3a0566ec1c..78ad4da110b0b33806e5d4465469f9619e763f47 100644 GIT binary patch literal 14680 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 J7a7_E`X4A2xm*AM literal 2096 zcmZ{k+foxj5Qc{&fJYFKgNm>*o{8~{C_;dM33@@K)Z!L(Q?*(oR!FqG^AUU_U&|Y- z{J+_0T`3)^)BXS5)6>(_OFmZ`c5c8qH{zb_mo?^cfysM}chnvEZSU_TZ9q;!M8WI4 z86E`~tNiXTN4^nva-;Mw925^uO|Or%u0D`Lx%qyxiQaZEx>v z-1d74zBkr`x^7P&j!SMx!1M&n0+VajqZCv7MG1Yy4=zerU~0j=VbFPh9lX$o#CQv zzBlS&o+62z2e!Aj_)FrL#Tmt4mgY_1%zq_d{8wdD6CCe*O`7+mo@xDFmxcq+hS`IQ z#PFSPPin=-Oqp*!_~3{wOH*^&&w{%to1Tyxe(_qAoBsac?l^-X0XxB3p2u8M8QTEC2+(MgN=?PJqfH6>SjIh-4M)w!)dQE4ZtCuQ o7YzyfiO0|X;cv=|Z%cxodm8sF@YF#6xicI#bIh4Pb?Tzz7f3~HssI20 diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index fec2ca2b..d1cdff85 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -94,7 +94,9 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant float3 _676 = {}; + +constant spvUnsafeArray _665 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -112,156 +114,167 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _128 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _134 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _135 = blockBuffer._m0[_128].IsSprite != 0u; - uint _138 = _134 + uint(_135 ? 6 : 0); - uint _141 = _135 ? 0u : _134; - float3 _147 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_128].Indices[_141])); - float4 _151 = atlasTexture.sample(atlasSampler, _147.xy, uint(rint(_147.z))); - float _153 = _151.w; - uint _156 = uint(UniformBuffer.LightCount); - float3 _158; - _158 = float3(0.0); - float3 _159; - for (uint _161 = 0u; _161 < _156; _158 = _159, _161++) + uint _754 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_754].Indices[0], blockBuffer._m0[_754].Indices[1], blockBuffer._m0[_754].Indices[2], blockBuffer._m0[_754].Indices[3], blockBuffer._m0[_754].Indices[4], blockBuffer._m0[_754].Indices[5] }); + uint _830 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _834 = blockBuffer._m0[_754].IsSprite != 0u; + uint _839 = _830 + uint(_834 ? 6 : 0); + spvUnsafeArray _679 = _782; + uint _859 = _834 ? 0u : _830; + float3 _873 = float3(in.in_var_TEXCOORD1, float(_679[_859])); + float4 _883 = atlasTexture.sample(atlasSampler, _873.xy, uint(rint(_873.z))); + float _891 = _883.w; + uint _903 = uint(UniformBuffer.LightCount); + float3 _920; + float3 _923; + _920 = _676; + _923 = float3(0.0); + float3 _921; + float3 _924; + for (uint _925 = 0u; _925 < _903; _920 = _921, _923 = _924, _925++) { - float _174 = float((lightBuffer._m0[_161].Color & 4278190080u) >> 24u); - float3 _181 = (float3(float(lightBuffer._m0[_161].X), float(lightBuffer._m0[_161].Y), float(lightBuffer._m0[_161].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _182 = length(_181); - bool _188; - if (!(_182 >= _174)) + float _961 = float((lightBuffer._m0[_925].Color & 4278190080u) >> 24u); + float3 _979 = (float3(float(lightBuffer._m0[_925].X), float(lightBuffer._m0[_925].Y), float(lightBuffer._m0[_925].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _983 = length(_979); + bool _997; + if (!(_983 >= _961)) { - _188 = _174 <= 0.0; + _997 = _961 <= 0.0; } else { - _188 = true; + _997 = true; } - if (_188) + if (_997) { - _159 = _158; + _921 = _920; + _924 = _923; continue; } - float _194 = fast::clamp(dot(_109[_138], _181 / float3(_182)), 0.0, 1.0); - if (_194 <= 0.0) + float _1012 = fast::clamp(dot(_665[_839], _979 / float3(_983)), 0.0, 1.0); + if (_1012 <= 0.0) { - _159 = _158; + _921 = _920; + _924 = _923; continue; } - _159 = _158 + ((float3(float((lightBuffer._m0[_161].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_161].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_161].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _194) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_182 / _174, 0.0, 1.0)))); + float3 _1058 = float3(float((lightBuffer._m0[_925].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_925].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_925].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _921 = _1058; + _924 = _923 + ((_1058 * _1012) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_983 / _961, 0.0, 1.0)))); } - float _334; + float _1393; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _334 = 0.0; + _1393 = 0.0; break; } - float _243; - if (blockBuffer._m0[_128].HasOcclusion != 0u) + float _1173; + if (blockBuffer._m0[_754].HasOcclusion != 0u) { - _243 = fast::clamp(-dot(_109[_138], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1173 = fast::clamp(-dot(_665[_839], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _243 = 0.7070000171661376953125; + _1173 = 0.7070000171661376953125; } - if (_243 <= 0.0) + if (_1173 <= 0.0) { - _334 = 0.0; + _1393 = 0.0; break; } - float4 _251 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _255 = _251.xyz / float3(_251.w); - float2 _258 = (_255.xy * 0.5) + float2(0.5); - float _260 = 1.0 - _258.y; - float2 _261 = _258; - _261.y = _260; - float _262 = _258.x; - bool _268; - if (!(_262 < 0.0)) + float4 _1192 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1202 = _1192.xyz / float3(_1192.w); + float2 _1212 = (_1202.xy * 0.5) + float2(0.5); + float _1218 = 1.0 - _1212.y; + float2 _1220 = _1212; + _1220.y = _1218; + float _1224 = _1212.x; + bool _1236; + if (!(_1224 < 0.0)) { - _268 = _262 > 1.0; + _1236 = _1224 > 1.0; } else { - _268 = true; + _1236 = true; } - bool _273; - if (!_268) + bool _1246; + if (!_1236) { - _273 = _260 < 0.0; + _1246 = _1218 < 0.0; } else { - _273 = true; + _1246 = true; } - bool _278; - if (!_273) + bool _1256; + if (!_1246) { - _278 = _260 > 1.0; + _1256 = _1218 > 1.0; } else { - _278 = true; + _1256 = true; } - bool _284; - if (!_278) + bool _1268; + if (!_1256) { - _284 = _255.z < 0.0; + _1268 = _1202.z < 0.0; } else { - _284 = true; + _1268 = true; } - bool _290; - if (!_284) + bool _1280; + if (!_1268) { - _290 = _255.z > 1.0; + _1280 = _1202.z > 1.0; } else { - _290 = true; + _1280 = true; } - if (_290) + if (_1280) { - _334 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _243; + _1393 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173; break; } - uint2 _295 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _301 = float2(1.0) / float2(float(_295.x), float(_295.y)); - float _304 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _243)); - float _306; - int _309; - _306 = 0.0; - _309 = -1; - float _307; - for (; _309 <= 1; _306 = _307, _309++) + uint2 _1291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1307 = float2(1.0) / float2(float(_1291.x), float(_1291.y)); + float _1315 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1173)); + float _1324; + int _1327; + _1324 = 0.0; + _1327 = -1; + float _1325; + for (; _1327 <= 1; _1324 = _1325, _1327++) { - _307 = _306; - for (int _317 = -1; _317 <= 1; ) + _1325 = _1324; + for (int _1343 = -1; _1343 <= 1; ) { - _307 += shadowTexture.sample_compare(shadowSampler, (_261 + (float2(float(_309), float(_317)) * _301)), _255.z - _304, level(0.0)); - _317++; + _1325 += shadowTexture.sample_compare(shadowSampler, (_1220 + (float2(float(_1327), float(_1343)) * _1307)), _1202.z - _1315, level(0.0)); + _1343++; continue; } } - _334 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _243) * (_306 * 0.111111111938953399658203125); + _1393 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173) * (_1324 * 0.111111111938953399658203125); break; } while(false); - float3 _338 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _375; - if (blockBuffer._m0[_128].Indices[_141] == 16u) + float3 _1401 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + spvUnsafeArray _678 = _782; + float _1502; + if (_678[_859] == 16u) { - _375 = _153 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + float4 _1482 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); + _1502 = _891 + ((in.in_var_TEXCOORD0.y - _1482.y) * 0.100000001490116119384765625); } else { - _375 = _153; + _1502 = _891; } - out.out_var_SV_Target0 = float4(mix(_151.xyz * (((_158 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_334)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_338.y, length(float2(_338.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _375); + out.out_var_SV_Target0 = float4(mix(_883.xyz * (((_923 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1393)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1401.y, length(float2(_1401.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1502); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 460dfa70e72e24debf678801f8b9e28c5dcafac8..e9a48a68461f5c501316beeb692725851592adc4 100644 GIT binary patch literal 53968 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 XeSb6RSi5|O4Ds(|pik7}5u*PGqojR} literal 54172 zcmchg2b`6~_4lt*Li_u!cgjSVxK3kz!-TIy!ctZSIt zsQPtsT{HYX6Q@k9X>OTQGk8dU?5v~zt*PgMjSW+xO3jq{wQ~whHDe32TIWrWdd-0T z8Ft-VCsZ;!>#4=gDkE7~Ti1XbzKf`75Np{cpw(Y3V= z&HWZNH6C4<-O}7|R(<2_1uc_(R+%&u2 z;>M+g`kK0i+0uVSz0Ku%)y-{~Q<$4SWYY9;6K761a7_1JV(S_TPEr(&nly9tgsD^V z1B;Te6Am6XX6l4V2ZoA4#fs4rCym)Z2!|Af(^J7=L9lxfad?WD76b!|h(l6A$%RSd z$4?nIHDA@gcM%=ju!_~7eexv{Ju4}ytEN?Eqffrnvl4oG5nR&ilaJvl!450JiVA)5 zAt)u#;YCmp-X|XdRRT>bf{O4y`4GGk=#V0)2=9{*0WE>#3m?4Pfy8jv40tmt#T zZ+<`tREm#ns;bo8*i*m@cGDwU>IpmNs zNSJKB1EhPeLc^T8x!tvPI_G+5?X=c4wCEvzy^o}gxPxcztJKu9IE%}KJ-heom!IF#vZ#5_e*NavwajmwRWrMBVZZviSo;ZW#F?R$*-eej&Hd_{n_COb{RR#gAe&nK^{sOX`5n@nutU%8J-auz)GAZvXE!!9 zx8H`cb~7mQofTvy-NkRP7!U(>(;fVq3M51U*k#Gsl1g9i-RW8lyszyLP2&Th$% zCY|-{eq7J)d3^|6enRtvd^3z=3&0M~ker4|Cf*=Zk;FM0C+3(!H>$F$BWOm1whYte8v&)B`4*!S&U zGh}YH`@0>lzYRd)F<5FL82=vu4whPQx(v>c)rL0!+~27MXWUu%A0lUyc4#|sQ(MIu z*Z!1rfNWB%=2B^3UpF+#1NmZHK*^#PuF{iYbKSxcPF<4`mKdyhx;4DoH&Hmn9e-k_cLI!Lq zw6r!gGwx4I_*^;%n9-0`^YYtrLr0cl4la3bM<8hbqGox31`!~?*+h2>O)Z6`6UMF%7?k~;VK_5 z>e;ntn8K`|Z+X$Fj%>320^9wT1q)R%C zu-GZRiq_U=Az9tD?SN)^ZevqEj65gN{(I%?^20)Jvkr>y(?`9)iQ~e9VrV;ygS4_| z^Nc!1pISbdEBU6{Id!egf>dRgn&8yV`Tk4CkMEy-dXumR4o)=(1*10KO8p3SrdNmh zn!~Jcc<+3l>@cB6jO*$)8!g_Mm7?*!#o?=2y6o6gEkCDD;cu8-pr?g~c`fs+f*lJX z-L0FOuPWk347ZLiUv8yg*^9v37)n%*D+LQyZx1bX4Xt*xN2L9V2cI~yncv0iD2HN? z`W2mA&HDrAG`36>vbk0}Wo=8LN_h1>OG_uE+IIcWhzK*itx4KAEgv zjFfx>iF^5Z0+A$S!v*qA*FR!QlD2*oe7_*@7{s>tP1L3wPfl8hPJEk*1R@| ztS|Xp^I-sY&AZ^m2@>a)ZGxqYv1`mM!e!^B5Pj_xQ(7A)k_D@@t7Fdcg)DoiHbW0yIyj$Q%qj6KEN08*)`sFNjKaKR z6B;z;dKFq$1Xjqi753Nm(&p&eW>zw(Hin`-6jzvyOETPG!?DJ_Q~C0Raa?J&+NqSb z%HtiPsdZS_DC6NI<6q!)1}ZL!zJ8_p2=(sGc3-nw|J}T6!RY_3PlNMZel#vACdJ|T zg{}2f=}-->DvbbZt(Y>(waKITeo8uJHfxr|U}RAkm~UOI7$lIT%QS7X_r;LTqekoE znq>mVWe*oC7!xY>TDgvqmO z*%Vf{vJonu583HuN!^^5`PNa6FY^oT(k8C1n(S=2koBO8fvQZWIwCE*#kfkNP(MZK z&mz_@ti6F9Xys?s)v{45i2eHynwxE=+*`@*su=am{j#R=i|d-}X4Tbeg$7ldkJ+h$ zo-CET?|{AZ)WqajJWUiKr~=U-Wsqe>$Z@3=K)$P=}yU5=FOA^%f_%7 z2a|(}r?FzzZ)sdqEYELjsynu^q10^fV-C~Ea#Jxo#5!hSJi29)fyFFVqsdX!I<}b2 zf?jR?qWQH_t*X`eZ(!9NZ9{XGa?V_!Yg-)w$bWi@i;FkLEF043XLUYvJ~LJ9dbkwt z$#+p}>D#XL^vqUwypa$qc_)3_6+YaZZ=hoKGMv?Q&TXh?=4IqJ(lZQ9(A`-4(yXpa zZj(@FVV3RAxlJX@oXRkra+~QnM+&sNIpt-PJLk4gId&zh+fuxGq;i+sRw`TYRFtf1 zZfiY9wk%szs2Mn?rfy;Fyh4y~BY7gu@Y_m0wV-2zmhI%)rrL$k&UQsR&EZfH<#|0b zJ0)@E%l4AnMS_Z%?H%;=o2$utso-zNgS>NYN95sJLHeC@JBc67CA^;WcV|5n<02%J%^Nkx-=Eoq(7jRyQ^@H`yjwg{H zqGvc(hjxaF_qk1M*8XlmUOdeOd6(SoDijYB8Mbq753uCx$nOazoFy|`dx=-PeX`1Y z9VU5}momNXx#4<-IhVe^*JK$^)zVu#H$u;B?o@y=9(xOuC8JEIQ*NZ5(_?v*o`=Qq zXgv?l%AIp#^t6T;gR$bX^<27GQ2SkS<0N+{amm)ojhAfo*Of44`=~BE!Rv|Lef6y8 zWZ&@)^2v45HM3rrdbbWs(8gKyG2wnlTFiej$IW- z*&%ugcVKq45@m-5nJrW49=ayuRr<<~)u3M^@YP}VZQWFReHqo%RJ$y^!wepwSETyd z=2)lWbyH!U-bo8hRV}&~*RKd>7Y6p;t9yLGnUcNMWExT8HJZIfu{C>H3X8M7hID0~ zHniHCRCcm#uT8I1?#E?ULRlk&@{{Xpmlc|9 zMX%n1?mD}Fiy+y6l$%!%S{vH2$z@0AWL_tVsf~*g%mA&Ea?HNr$d=$(PYxHed;%II zkUCNPPJBYcqSh84gu(ek8=LCqxEM?wH+{^cNe7SZ@5~R(YvyNP1<1Yu1_VGuqh^E- z;f*?iaJiJdk{!a2ejIk7VHfFlM~nF4XmKIFU*yN@w?%p{YjN;FMX%j212V%44%L3g zCDVYR*&K_JDatjd&Y zGVgmI=>lLE($XttP!FyS=KPQh;)N;1taw2k%v&t0u@%1iaqXHZZ)W@|!b z(eYZTH)a`~mt(75e^9=*epX=)cP81!U(+;iRy=cO0aSH3s)yQIUst-Emv->8Y|41- zAl;*8n|6p(*;fPEE*9cl?Gi}o{h`_}{mbHB8(y`7L4TB~iVSxpzOTG82DBYCtIGBa zWkA0R=+><~(MZtRfYDG`QgSc|!)e1tsm#~r1-wORQ0-MAPLZ;BWp_J$liZ`WvRn|` zU9c>!dHAx<&28k0R88;-X@?f~Iwr5nvs%s4(rX!)JsnNC{P5xVu)um}spYuR1%iJ6 zGj-C~NqgqU)auKg=DdEIm|rr#&{T+1r>+=$u)Pj=GkI1Mdv^d?Gi8j=yiWY#@LyWwA^%Zl=b zYjnNQFF(LtX~qkT_&yqPOjY(;8rP9-b!?{h$=ej|!_?Djx~73%w;SiF=-*p)w(6Rl zf6JyrJcn@>w!EOCu$^-=^vqIG#&^jbp{Mm(#SC+#o)gG;kv~dL`#mV_%@kkWTl6~R zz9YF@%*wSY%jc{-i*jp2W_z~Ev2PhaM||vc#`E40;t|fAbH!WsQ8B~J(=$sNk)N;U zk|xcJLX+ydWM|`9gLfM+VD~}1&PcXZ?r1&peaGeLN51cbY`tpR$oHL^U(`Hv=*<54 zzRip3nil8#&TU?_xbIwTJi6!Z+f-<7Y;Brd=v&LdRPd~J4!@!uzPPo1L2X0dCHm=F z-+;>6>YU@8zDoBtCmbDmznw z?V3AAb%{8WH%VT;Xak;?+9Wv%-zCRbmrh{8w^qqqh83=RPOr3;-s`g6PSwJ#om--3 z`|ouDMw?58aXV(_H}B=i(#+(?I(b~lnfy4(%W|)H;bb zebw$rYO)~@^=su$R3Yn6QcYVYsm{Nu1f8zAlU4BF$(#HXlZUq^h9vX(RFm7uDZY!H zhP({hDR(-u$#v4}k~@QP{Bfg-l61+PiOlJA5%Mg_+Ur9X_2F#QrF}qtj_EWPuY6>^ zYwldb$1{T1On#o>ElyE>zMf&6O5=f@3ySiRA>waUMgAp zzGf>>TAg#32@|+r8=jBdgLI7;{N&x*czokN#CZH+AHbK(_4MnRIdO$#nJ-BaAwJac z$^3|S1&qO!k|l6iUn}=L$=kOT>admO9_(FJ!QS^futy!AG{<4@YRTL4?;6S5_pft~ zIzHrS#uA>`TCOG@$cV4c*M=p|mb3BUTJi1q&{^`jhML8-O*Qt;!}VYmzb>oS4Y0bd ztJe**y0uoX8)S9eRA_8%$r>!ZywF}}?bxM#o$0?yMGaxot&!_7O+_;E5|ddho;)9$k3+g2#8SPmbC_WO(@PMSQ@MlYBkAuO|oj zdU)#1A99hehxhg5Bwr6t{hA`$CpY;)s3L9rcEXr=Ab> ztRr6!PyHIPo^|2t;i+FU)?b^{!&7hVeJMkX8UF06(X{;8OFSQw(H=67qYY$?so}7T ztcM8y{~hh`7%}8@K4AFlD~!oD7tefy#|}0vN0#tGmihxO^#>Vt&^3Sl6a86VGVGJL z`IPK;F3QXwFxUZa`P1rEJG{5RtH z7@s+rJ8AFDq`!t7#s=+GYnH*UDMBaHQ`z)7shrE5^tj(^7Whz>I}br zw1a&w-yrhHynI9PhDE-K#$zKr^I7*o+~IFZ_*=y@r1X>e*HqS{$lt9p<7xG`tIQr? z{B0^Tr;XoC#+diU-=#A7#`uw{XTIX!#?e1(AAS=W*9ScOrXobfZzjg$Hy7{yt5W55 z4!?!!X@6r`*-~ZfFh{piIhQ+WgvEPn@ysRUJbTM3_-#an**4bMoU=Y{C%Hb~82^wM za*6SI^c=rEcnPfj1F_^(<9EpHeN*(cm-v@nd~pQz_`aj~PyRbNTXQ?9j0}}(jST$G zqSE{bvRwc~GCNh`51w$%9`MAvx9A&vtbSMVFTFT%xbb}gU-Y9|yk^))>X|!t!ikK3 zOXcpOtySMw_2dI&R^N-hh~Glz>9h2tANrHI$&-&g^RiKswU^7VTMET{4f1|b4v#I~ zU%V}`*~i=JA9cXuANwMGV7_jv8NzsmbK{>Lgm?f6Gke#Y^StGuz}pH%sI$3La=3yyzQ<(D1*oXYDs9^IE5|Dwu} z`HSxEj(=6@>Y)jt;#(d|F+6K9siEXBOSj=<#iqZp32{G{QD}ebo{$2ujlv= zRnD(b^7pUeIYXNNe^Z(9HvS`(iLvn?t4#hf{!^77bo}QkKj8Q;Rc6c#{~whZQ{%r@ z`G=0r$+vqPzovNh7{hlKf2ZTSif50p`flQHaeR02H#)wD_!}I*uK4R5zrJ|pvDw>D zJZEU*Hx~Z`$8ReBddF`eo_7YrZzcX%$8RHkuH&~8Kh^Quiy!OwoyGsu@qNTMJHD^@ z7RT3!U)%Bh#kV?sp!mg(A0qxF#}5{NjN|tdzs&K&#h>W-y~UH$tiPkhU*!04;?HyZ zKH|y4hMyq*Y{%~}{tU+-ApSJRPZEEs;|~&lisPq0x#A}~e!lqOjz3y_f5$HrKh5zC;tz5BG2#z(e6#rN9luQcEXOYw zznSAt5Wm0UPZU4V@u!R5$?<23-`VkJi{HiZ=ZN3Z@#l+Q<@oc&S2_Md@x2^>vG~4@ zzeIeE<1ZIK%<)%>AL00`#P8|&tHtl(`0K>)=J*xjhdRDZ{1C_ABz~~tZxKJp@wbT| z==eLt4{-bs#P@UjJ>oZV{QctlIQ~KL+c^GV@!LB75%J_aTMv(_e3IiIqkhd&{S)Fh zb^6bU-@x&2ir>)j?~30<{Px;mhs(|iS2sfZXz`qH_Ewqw_%8A6$s<)>OJ&=mM@8Pw z2BXF6Pj=QZ-^WNWK{DgVir-KCR%)9Z%NY*aZ6D2#s;SUgBaQuPdk9Pbd@lB4OEPjc2{5eQv z{mITvX8&Lb_I3Cv;%7R3s`y zT>Koz&k(=0czi!XWyYEDH{Xv`d3vlrN@e}Y&ZJg9Q-aeaGyXf`&vbmP_;VdUOZ@qc zpDq4k$IlUeiQ^06FLnG}@s~M%p7<*qKVSTcdt-{$xQ;%{<%z4+T5zfk-g zj&Be@&hd@n8y&w$JnP2dag6wT#d8*KQkgZRKgIfHF%LVwMf^O+w~Alj_{HKMar_eT zk2-#-_@6j_nfO;6f2{at#qTA5ct>Kt?D1~VS!FHdjOX2=i{p8>=<0at zncs%zU89@$P9o<2aj~BFPsWd&v|L0R#vd=9HjF<(JT{F#Q9L${KS})Bjz3v^cgLS1 zejUf3D!zx~PZQtM@u!QoGe7>FAzIJXpDBKQ$DbwM_5|=}i)>GTKSyMH7W}!Qjh+5^ z;@LB-Kj(|LJqP>+B0F=yUntt#;V%+zXC~^uE3z{L{KcZJ9R3pV-}u+8qK7^DqkbAx@%S55VPlOua*rX#;O%846unfcp8vz)qHMA%tFL>|6P1fHB~m^)Mk12Na{6p=GS z8{INHyjM}rTDn_=4rD&uqcZjQ!1`cKn0@jsb>0W?!H0D-`#+2r<~r+#_Q2dH!f$M_ zj%fRSk=cGgWo)x1z*7evdp+a{F?dh}hI!7~!*8?wkjh|*3wmakJpdhu^+`-<+sEWb z;;FZopab<#?`iiD5%u(mH4UD2e=JJ-#GYYovtOWReWDIL_N-5jsSJibVV`!*_Twsp zE%hnPla-R8Lk+lAtKq}EdCB3) znJY!s*Oyhscl-%)3_7ofH=pRoN|EWjsr!>AbG8=@2g)hhM0S z4(px#%)CU0C&YRoPv0O4{;iY6_?P0*TTetDA!cB_uC3``Ne-5^Onc~B`){aB9qp5& z@Xgzx{k#a6E0ABc!A@()Gm5gYo7@3hxLBg~rmvj{ug zMBs=yCd{|$E-M@)!t^ZwR^lYtD2OfL2 zcK@L=7}m%xB7DI1N22FM*a&kY>|_5F?`?i8{`QEocK;PI;HpH75jJiTS-YR8Z0+_| z86DdFRJ2M|YB%Jh&m=QEaWMSnDz6fy_%9?g{H`inzrIwtykEioza74h!~bVBe3)ln zMSRzYeN9j6+kaynF|8JXrEg!0SR<*g-$-V@_EnjA3!aUdd6weWklgS!syF&XA`G0M0G1gro&yi>F_5$K?KifGS@{_fbcRG7W{)W@p-syyO724Us z>Fg;y`P16rdr^xP)2`5S$EedyW!hgE$#UyXv7Vf=mk2yI-xp!$UeWp@baz&r z`M*olV~r0JtrVFa-=AZb7zJO#Ikb1w=`Q(j5%~}uo)B$~5Zxg1vD!82tt0u~qB}(B z@jVCm0bO#e*Qs_oBUNYlvajTP{{cSL>F0DtIUT+qLFb)zbOuOHF2c9bPKWPM(0Q*+ zC+w+%q7HEwBO*rhhwoKB(33bI=X)3WME~gz{?T3!wYEa?p(@k%dLqtH*d=y8rgnzf zEn?SIJ>!6`+1WkTbyFSftrUSL&g37h_QbuSp5;I4 zz+=xa!x9YNBe6Eowfr<9V$ylHx8x&5*a&MgVwKTftR2aJ}Sb5DvN@>j#9P0{iD%rgYd(*U7<}Hx+1y9+a+|^DeI0&Z;a7@?@dU}s`xt!KFXGJyz8_0{ znCNUykS&YD0g|`p!+{RJpYSV1_%KQGavy@vlO2A4hd-zS{$PinD7^VIMe=fgLhhRy z@vO6Nn**jfosrV}HaXxBr!&gwbd&=QbvoZR2TYGT-!=!(fBJ)ev}becFqO#x%&h}N z*kzo^9p!Nh<8-*gA1EAa9Q=%kXRZ15bA-cB5^iP0^BpPYoD_eQ!%tSdjq6OwIX{5^ zKu`1kI}U%4wPQmGLcKCH{1D&}}humlT z+dQXpu;dmebol<(+Ih|C)H$6gl9NN}3pz(T9rB*#yaiFGn`E?4I}qn6%enOtL(ZKl zLI=AG^~9FXxebz;?Z&8Qd4W3c*t7UAiWuh4G?Df57|GdNvEgIc7{Xj&YPmnzA z^NEsKpHGT<)@SO#W6$RN$q_@Jy+7DyoWRnD;7@oDJSFP%l6-B^bdj}rYOK>E(?J(J zd%CrGTEwg)*U73Q&6r*nkrt)26t&iQ)2BY9{iob4`%I^^{uMZ}7BE);#BGBH8^p$I+tPk-=_ z_Uzn#k;>%tZV^XZux&ZvyRn{maFhr-xF{9)ORF*IO4C8{5h4e?eX7t_*&Jk zjQFc1XI`ZEYaD)->dpSkDz|6W{4qW8kN(pi z{G&a~UyrNI*lZ{|Mugqe4)SY7KAtP19`S4vtrVfh+0x?4{uyEu?w)@dbyA<7klg!h zdbDAFJ{fh*Pi)bi*Tv7PMc&V+q8@%Wi?|a)k2$hRWyalNWOw9GN1fEqXC(K2njUSK zpU*~J^AlUN=XLS(Dv|f|xu}PqEh65L&|9S^ZQ^HXUkvg5S=34WB>vt{)1wXZ^ZBT2 zeqxLEye@uTDGGju_4GKnT(3r* zE)nnVJYRG6c2qrB{N`N{zuyzRFA9APYx?I=hZyZ7x>bY@c*cMjA-6LNv7xW{PJ4Eb z^t#Hd>Gee1M`4$^`gmJz{zb&Dt9r%=U7I7njCIVBr6RD*5$2YSHS$YDevbUg=`B;; z8zS_;tP(LtkY6P7dT%(rV^#Mn5qg`6ET<#CFwy(9(>qRe)*j(f z0&lwiaP^!)z1@#o9pmro{^{yomQTL!V^_y}g|GXUtK%KT*L~vZJ}uUT-$s2F>$X!{ zH)e4O^3N;Czewam<8QG#NtX}5$NoYy_ZB_*?Igd&y;Zc9>Wsh5@%&ctOx00uzt_59 z?J)N@lkB@{&wgujyRiC`{jQYtcyT25E7p*`58e@R+epqiytAJ8y@}*DK5edzdespl zYv)ea4)bxL>LAXH%^5Dtue)43O_I}3;R7>}SIe&cpe#LQRQ z_8YgGqRq`SS(uOaM%>ntu?~r8TUH-((+^{PK{D0?<7Mye_r*Hm#TxssDCh>;_q%%5 z?ANh=gsjjGzcsWzJ>an9mhR%Q6=EOa_F#hP5iy(TX?7k;Fg+t?Q-^st!K@oGA%3B) zA0?ReB8K0?T3e4KnDrxu-^d!~#|dVGh}ptn9!)SCMhw5LH9J3X81gv3&rIX9#1e`BgV&PWrFDvF+M&&O)&f>l(u|)o=7nKh7^pC&yx;_=%xe+j`}ItMv9^4_o=q@j$M@^G1jGKG_UmT}hBFTsKkm;bnA;-8kNXP=hCK^A z{Lb3u#)}EY+B(T$UP>@#=VXU@Il*vtpsiCJ=9L6vK8N3Jhqd!+g0VQC=Ip$dU@V5G zJIv1$jJ0)!!@Qng%+8q(^NR#yeLu@#ewkowj`4eOi}SA%jK!JXkQ?TW1YEZ_>@qZxf8ghu^6i=B)%{cKGeOVSblj%pZQwZkV?d zjJ3sY+zs>l1Y>si-Me8{B^Vp8OC9E&1Y>jKGKcv?g0bw@3l+n)L-hq+H{ePmqk!*v?rxAh;0IG4chr1FQNE|K3zhZQHSTli-x3Tq!T4PI_XI;bU_vepXTh7-E}h51xib9r z`5#etp75NHbT+{$%GxugjeX=lN%&?k57FUzN2R`h2VN$@lqFXVdqY^XE;XQ5v<; z!h9y;eV=m=_8I4k#eWg&%*QXq>re4aYcXVwWAC8o=bnMDB{+Hf%GwZouka#>l$Tdk63q$G9ISeJ<6EVChHMp%j-e|HcW1*nkQ1Kg{7x6AZqA*<9GrUchah z;PBsYq0NBXGQrVD!})f%PH@D*aI|gnW7`BrtPB^4UuL^cvRqP-eryZT0V`ZnkvD`Vqv^SPj38uZV+%>^e8q4Yg zS7|J35?rOR?4RH&jpe`uS7|H=5o{$#WvhOgz*^?Z7|N{KJF->3nSS$ z4|Q!lC|qfrLmRidHXcwt_Z~JkcT3thSo0PlH*-&Bxp{Ztu**Jax_ea6B{xqM)^hWn z!lBRE!S;(goKI=L_e$(qzsaZUOV;mU5l4<$Dmm@6Isb+yb`FzI5O-P79m=g+iXR~y zb2{`bytA`$OO$<2XYcHHMxS|SzfFLR1=w4<=x?EN$TcD6cXiOeksbJTw)|SIeTE!8 zN;vFWyhm5iBQEHj6!)1i!VwGfEmq^AuEh#Wn~T->SZ{OfaJ3IHmh91^WP6nOeS|wx zGW6LG*N|+2%E;~R=LfFue&5|s7{QDCq~$IA=YGw6-9O^+^-jsL-=?y~VPawjU5M|| z=ZnnF0nSc~})SAWchEBv%?(`bEQrG_`U3)1k+yro04FB{^K6zHrZuw zwfWY$ojG`SG6$I_)1<>3Wd1Vlw#M#p?<-lZ8|IX~tmc5V{};{F^WzGvwnSW@1c^5e{95kE*lw&7YPKCG*j#17|wh=XPL8egXFx=dOOD^c2)=jof*mO9OvxRsqS*MGlYTo-jQ`- zb}n>w4wsz$tW9L`xu^p>Mm0mf2q6N z)v-TaAs!#7yE4|9uiq0daW?Np$XD8E%X|&rw_N4wi3#oa`tQ4X`bt}&KFpK*I+!O{ zM_oIsSv;SRopVI@XgzHy=dKYByQ~R2Q`{fza)$j(YwSAJ5f4897LU#f5pv>4+0GLW zIG={89Y1$(5RQ15PeW7>u{ZKw%ALwl0<;N7eqfE`8|(Zs@i(bVosIR)Dz|5^Cfc+6 ziCct2mk%;>#%)n1Xi;`Ylws3wcSRZMcGkOF3>b3jVKRXIHkJKZ@7@GMdtm&%#eE5e z_QCjjy9W{s{($j!2Mcg_;3YX-s{MN_HOqh;m}8J zXQ>~HM{c$rRhhV?elQ-`vUTy3h$DUnOOBm3mCep$iJgOlf#}P{qDIY!uk?IeIO1x0 zD=X-chiKpQekvTXHoYe*=v^%x^1talDID=Py{9VZ@tcZwM0VDDS~z^AU2K^CGb;Od zSwGP~L2aL`xk_$&Ryb_5scgE>RnR5Y=vu6Q7IDOSvgFumQ`zi1pV*ls3^Yw`ao)1C z(F?+{-$8s-mHBRVUaVk;If$K8V_#kp4j-^*x-VDIr7!4OUtWng`f{M;*lJVR?7W)T zIY1bQe8=439fEoDns9pLMvJgv`aiFrj~_ulFoSG`GXX^*=Y^=jaV?TZ;9DVpkGV90N6?CV{AjCdw{_tcUreD8Tc^f_1Q?ToO zeYgW(R|zY%)qEx9_-b+bQ4*(jq{oLi(e@uj$cPhVi_;^n?fqoW?`!W0=iB~{7>KqZ z`pW)^O>CRZA3K}F5}WTOHYcbaviMnUd0#l@kdejzPZjhz+hOCZxE?4>B%4X*;iJg6ffyi%H>3OMqU_Jg-xCtWkP4{mVbe9Wn=UjCE zE}S0vccp?I=Agn{wDXS&cIb=QSs|5=B96X{R~>fSR5pM9nb@gS8xZ5my0o?Mv2f^y zwGi$JA5G@mC#vVeoCE)v2pRK(vdxd5xcM^vK2wJL!0RRlyG9Wp-9b|GyE( zc#Vm6+f=sk`Z}>QS{Mj_rYla&Vf^_}%LrgD=Fy zW6yNgte{I@%!d_H>lAVHWmL4)rn1@ToYmuAOYCo?!)9qS8mv^Dt zq-*E9wS+@I+;4|_if$Ej?~&duB0C4JEgbsRX7>*Cu9M#BF=p!shwhEe-yVtX9MwT- zUwaBiU$=L<>sHWB`?{WR=zrj1ynY4Uw67Zohrac7!w&R(UpEpCUEkM@6WxOP0;PT3 zL^%4ogX`<26?D_SZYCW1BNcb^dGiXo^p$%k8`mv_L*Mka>_CtFVB@-#aOj4o^q>0??lL$Z@np{;9_%xQ zxm;y@1;Y~zzJ=93-xQIq&FPw|8J?qim0+q~!}9C2bI+jkvLIlKP5j{eT( zDYC)4EySJMKAC=q?*P}2>s3!1^uy-ez{C#u3S#^(5pn0buj~yH?po>jJBPs?=%UY^ z&0y&c5e|K8b7%*8v}x~~y9tLb#79-x8n-dpBido^?4nBWzHfWRdd8m^S>K2e->I0L zy_}tE+p#k&u|qzA*#9B=d7k*;!kw?D+1=aO-2t3<@88G@cKJ;Ogxz!W93|WZ&h8jz zH!r)?d%I&R*yXGXF{TqVF5`r|N_OoYeTZcHNQT_{Fd^C^#@kAldf(Q5vEE{Au{lxL zxv?$g&;G(Of5QD(I9p8YKo@&nd!L-&h~`{gp7&B&W_|d1$mpdt1hO-`@0CpSCwqHV+V4 zzYY_w{d<_O=4ZHeHdi~~eLF`~Xy-t+0hzx?Iy;-l4)15)&QTTYOv2a9PWb)eOlM~! z*=g^4@!AB_-uL3O6O8{}+~!6h!K@j5W?cN-o0s4^JDmTGS6zbZ>Tv!yUJDXjH;3~% zb76w(?r_Vqn1!{`nBaOiT=cE9m-+%vel=N{-7Vfg$H zY5UhRZlC$PF#pszSxlQ_8_Y|-Z`x3G5byAi&6k#lV}5U-`fo&SS$*hJYhq`8)kBA> z-;mi^?Ch+k`d+H@c9tY|>QoPLR+=TU_wc2{u?F$OV)JYgn`2eahxc&s%SFhD4`qwb zb1ptTWzWawc;VE1@$9*&>LL6YDdNn)7+@3IX7gvxW*YMo5}Q3_2jYAV*>93g6ppnL z-r2&Ocs}Xl$-?lVkKj)gohHH`p61UB9r$y)aK4Y`4`&UCKGF_0v2QkC?7-$36>RcO zI#xFAZs<(m$UWp|o0Df%&}Cmo_r#ck&lV1S(>tev-g(lqJ9BdPxx(p@-BDnJIYa== z&UqE=U<2~;ATHc(V)uNNu}zG2lszB+mpX{m1;PtnoMRUM^t^Xr#IXj~iS7Bdb5UaF zXc>i=t8a>I?R-}_eD!PR%?Qz@~ZjCnR0|GF48#-8`lem9nN0X{)!5^%m;KWm);O@%!jpP z7h8Tlv?X@tOBdp|EZp;2Ty7K&T`j}ncUm`#M{Z=k-6EM(i~Ta2_{QCYonvkl4x11k zVve5Kxvc{`_-6Olw+n|Y{F$WpQ(|_f%Gjk&e{x+!{5KZ(Z?XA-DrnDQgN~2Q-Lc-r zr>h)b7%yB{`wC>(ayQQ36w>p+)z#+?AV z_X~&q&QAA%3c8E|x)y^6BaRq!kw4h-F?cAkQ?E84_Mj(3Ha{K~4qb_g{{N_gF7LhQ z+P&!`!Z8rou)hDef-e4}d$2~6zCS7)`lYtR8ThfNZ~X%2`}KINx3OI)TM&5%|Eymt zqiu`(S35UL&TV6|Y?=!07L+%Cp zoCq1Ym$K!_pLdWaemB&|lCbUh$~`G$aeG-f+OW9&B8l6ps^df4!2Vo>jJQ#@xc#yNUtSlk zJzuz|l?zh=PTcVKo+-O z3r8Ckw>Ofwy{S4r#0~6QB4oskvc>J!9r*G);o9?sd#m{(n{RImN8AA0eEWR`UAxmD zZsre9i`y!di5s!RuJ`pf9r*f=u3kAL0h~eGxL^M%m)_ z+YWsBlW^_%(jeh>iks!C4}@bM0&8*mumjyA1+=;PXW`KIbM-Hkbk$~qh?rYncv{T= zsxmQW9I)&A`Bn%0{F|`&p5|oEGmypn@50fB#r$_k%s)~cA7T#nV-Yf9PT6Aqb_c%v zOStxYc~5p5RbeszM7T8OpLU?z$IbK4ghQW(Y`i|NpgUN45HYvD@U)nJp)xUN9I)&A z`TGv~`K7S!^^<)NUoFO~k{JJ6dVGj6ZGR;~MvN(2jNfr>calAS_W!SNzU@U~Aod^b z1MIt`uZ80dU|ME3?4#dwpvya;>1qqhq0hUF#drRUh7uS<2M12>8&RmZJOTt74$e; zkVhx0|D54A5RNv{H{A^@=rT9Zw{xuLxT{UYjO% z{v!-TtmwC$UpEtu3FYV5<`r~j2*>?~&Ce}_-#nlN8kS~!j|v*wuzlDg@Lfc7?_>yoSiQuXaDea@`;_#g@MxFbZ_tM ze5U%|>X)~(LkD(vr)16c5{CT4le|cbc2pUkSjRi5ymPGESoU{OnRckFignhn-r`l2 zy&KXm>;!+p`^B!V9)GbF>cjVvf9xPv^ohE*4lO3U*YMtbpT?K>hic)l8}6gS-QK${ z5A(b18r9P$KICF_`iqbg3(A(i-s`}p0m9K=^XXHSp>&)EMjZ3z6Hz)&gF3Kd<1|

FqBXXCVoc>Km6#tA!qoc46}_=_z+PVaXRlf9yD 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 diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index d9412aa691f30eb5803e20099b6d6ab849b66689..5c42324a54b80518b66b6fbdc24a9790a9236909 100644 GIT binary patch delta 94 zcmZ3pnDNCz#tpkz7@IclW_iyw`69pW=KuUjjEtI-4TP*WZxBpjVziztFLG_Nv?$+X vEm1R813iN@>&fY&y%5&s-=d+6llMu=GFopg7q@2uGPRkwYB%di)tLhTGW;I! delta 252 zcmaE{ka5jo#tpkz7&mX;&GMd0p|~WmBr{ndIX|zsL?JCFKe0q1+b1(UqeQ`0!BEd2 zZSrD%6Gq<6*ZGqexfE(@6p9j4GE0jmzZP`eTq>Bt#I2wORd3BZ`IhiC9;d|ORG?M^ zpjPY2(?m2Fc_;4^F=NjLi364V6zPSrH+PGMGO~fyYfru>rU10%pO`%pLPUOYlq8=k zFIO!u7cUpsX~qifsU?oNNtvm6C16KtK!ua@bMlKcdAX{2xfFn)D7B=tC=ci;wRtx`Au diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 8e5d0b13..50c27612 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -59,7 +59,7 @@ Output main(Input input) float3 albedo = color.rgb; float3 normal = GetNormal(input.Voxel, block); float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); - float3 ambient = GetAmbientLight(Ambient.xyz); + float3 ambient = Ambient.xyz; float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, input.WorldPosition.xyz, normal, block); float3 finalColor; if (block.IsFullbright) diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index b302477f..9ff98495 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -121,7 +121,6 @@ struct Light float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 position, float3 normal) { static const float3 kOffset = float3(0.0f, 0.25f, 0.0f); - static const float kLight = 1.0f; float3 finalColor = float3(0.0f, 0.0f, 0.0f); for (uint i = 0; i < lightCount; i++) { @@ -130,7 +129,7 @@ float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 p float3 lightPosition = float3(light.X, light.Y, light.Z) + 0.5f + kOffset; float3 offset = lightPosition - position.xyz; float distance = length(offset); - if (distance >= radius || radius <= 0.0f) + if (distance >= radius) { continue; } @@ -148,21 +147,20 @@ float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 p color.b = ((light.Color & 0x00FF0000) >> 16) / 255.0f; finalColor += color * NdotL * attenuation; } - return finalColor * kLight; + return finalColor; } float GetSunLight(Texture2D texture, SamplerComparisonState state, float4x4 transform, float3 sunDirection, float sunIntensity, float3 position, float3 normal, Block block) { - static const float kBase = 0.0f; static const float kShadow = 0.4f; if (sunIntensity <= 0.0f) { - return kBase; + return 0.0f; } float ratio = block.HasOcclusion ? saturate(-dot(normal, sunDirection)) : 0.707f; if (ratio <= 0.0f) { - return kBase; + return 0.0f; } float4 shadowPosition = mul(transform, float4(position, 1.0f)); shadowPosition.xyz /= shadowPosition.w; @@ -170,7 +168,7 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 uv.y = 1.0f - uv.y; if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || shadowPosition.z > 1.0f) { - return kBase + kShadow * sunIntensity * ratio; + return kShadow * sunIntensity * ratio; } uint width; uint height; @@ -186,12 +184,7 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 visibility /= 9.0f; float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); visibility = lerp(1.0f, visibility, shadowFade); - return kBase + kShadow * sunIntensity * ratio * visibility; -} - -float3 GetAmbientLight(float3 color) -{ - return color; + return kShadow * sunIntensity * ratio * visibility; } float GetFog(float x) diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 9c44e7ab..385804b7 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -46,17 +46,18 @@ float4 main(Input input) : SV_Target0 { Block block = blockBuffer[GetBlock(input.Voxel)]; float3 normal = GetNormal(input.Voxel, block); - float3 texcoord = float3(input.Texcoord, GetIndex(input.Voxel, block)); + uint index = GetIndex(input.Voxel, block); + float3 texcoord = float3(input.Texcoord, index); float4 color = atlasTexture.Sample(atlasSampler, texcoord); float3 albedo = color.rgb; float alpha = color.a; float4 position = input.WorldPosition; float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, position, normal); - float3 ambient = GetAmbientLight(Ambient.xyz); + float3 ambient = Ambient.xyz; float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, position.xyz, normal, block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFog(distance(position.xz, PlayerPosition.xz)); - if (GetIndex(input.Voxel, block) == kWater) + if (index == kWater) { float3 groundPosition = positionTexture.Sample(positionSampler, input.Fragment).xyz; alpha += (input.WorldPosition.y - groundPosition.y) / 10.0f; diff --git a/src/block.c b/src/block.c index 392715d8..bdf2908b 100644 --- a/src/block.c +++ b/src/block.c @@ -199,7 +199,7 @@ SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) CPUBuffer_Append(&cpu_blocks, &block); } GPUBuffer_Upload(&gpu_blocks, &cpu_blocks); - GPUBuffer_EndUpload(&gpu_blocks); + GPUBuffer_EndUpload(); SDL_GPUBuffer* buffer = gpu_blocks.size == BLOCK_COUNT ? gpu_blocks.buffer : NULL; if (buffer) { diff --git a/src/buffer.c b/src/buffer.c index 7e6f7fb6..e2703a33 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -27,7 +27,7 @@ void CPUBuffer_Free(CPUBuffer* cpu) cpu->stride = 0; } -void CPUBuffer_Append(CPUBuffer* cpu, void* item) +void CPUBuffer_Append(CPUBuffer* cpu, const void* item) { if (!cpu->data && cpu->buffer) { @@ -104,7 +104,6 @@ void GPUBuffer_Upload(GPUBuffer* gpu, CPUBuffer* cpu) } if (!cpu->size) { - gpu->size = 0; return; } Uint32 size = cpu->size; @@ -160,7 +159,7 @@ bool GPUBuffer_BeginUpload(GPUBuffer* gpu) return true; } -void GPUBuffer_EndUpload(GPUBuffer* gpu) +void GPUBuffer_EndUpload() { SDL_assert(pass); SDL_assert(cbuf); diff --git a/src/buffer.h b/src/buffer.h index 8721640d..39bc1650 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -15,7 +15,7 @@ CPUBuffer; void CPUBuffer_Init(CPUBuffer* cpu, SDL_GPUDevice* device, Uint32 stride); void CPUBuffer_Free(CPUBuffer* cpu); -void CPUBuffer_Append(CPUBuffer* cpu, void* item); +void CPUBuffer_Append(CPUBuffer* cpu, const void* item); typedef struct GPUBuffer { @@ -32,4 +32,4 @@ void GPUBuffer_Free(GPUBuffer* gpu); void GPUBuffer_Upload(GPUBuffer* gpu, CPUBuffer* cpu); void GPUBuffer_Clear(GPUBuffer* gpu); bool GPUBuffer_BeginUpload(GPUBuffer* gpu); -void GPUBuffer_EndUpload(GPUBuffer* gpu); +void GPUBuffer_EndUpload(); diff --git a/src/main.c b/src/main.c index 8cac1046..c4386976 100644 --- a/src/main.c +++ b/src/main.c @@ -40,8 +40,7 @@ static SDL_GPUSampler* nearest_sampler; static SDL_GPUSampler* shadow_sampler; static Sky sky; static Player player; -static Uint64 ticks1; -static Uint64 ticks2; +static Uint64 previous_ticks; static bool CreateAtlas() { @@ -149,7 +148,7 @@ static bool CreateAtlas() return true; } -static void SetWindowIcon(Block block) +static void SetWindowIcon() { if (!atlas_surface) { @@ -162,7 +161,7 @@ static void SetWindowIcon(Block block) return; } SDL_Rect src; - src.x = Block_GetIndex(block, DIRECTION_NORTH) * BLOCK_WIDTH; + src.x = Block_GetIndex(BLOCK_GRASS, DIRECTION_NORTH) * BLOCK_WIDTH; src.y = 0; src.w = BLOCK_WIDTH; src.h = BLOCK_WIDTH; @@ -274,8 +273,6 @@ static bool CreateTransparentPipeline() info.vertex_input_state.vertex_buffer_descriptions = vertex_buffers; info.depth_stencil_state.enable_depth_test = true; info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; - info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; - info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; info.multisample_state.sample_count = SAMPLE_COUNT; if (info.vertex_shader && info.fragment_shader) { @@ -399,8 +396,6 @@ static bool CreateUIPipeline() static bool CreateSamplers() { SDL_GPUSamplerCreateInfo info = {0}; - info.min_filter = SDL_GPU_FILTER_LINEAR; - info.mag_filter = SDL_GPU_FILTER_LINEAR; info.mipmap_mode = SDL_GPU_SAMPLERMIPMAPMODE_NEAREST; info.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; info.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; @@ -539,14 +534,13 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_ShowWindow(window); SDL_SetWindowResizable(window, true); SDL_FlashWindow(window, SDL_FLASH_BRIEFLY); - SetWindowIcon(BLOCK_GRASS); + SetWindowIcon(); Save_Init(SAVE_PATH); Sky_Load(&sky); World_Init(device); Player_Load(&player); World_Update(&player.camera); - ticks2 = SDL_GetTicks(); - ticks1 = ticks2; + previous_ticks = SDL_GetTicks(); return SDL_APP_CONTINUE; } @@ -867,9 +861,9 @@ static void Render() SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) { - ticks2 = SDL_GetTicks(); - float dt = ticks2 - ticks1; - ticks1 = ticks2; + Uint64 ticks = SDL_GetTicks(); + float dt = ticks - previous_ticks; + previous_ticks = ticks; Sky_Update(&sky, dt / 1000.0f); if (SDL_GetWindowRelativeMouseMode(window)) { diff --git a/src/save.c b/src/save.c index f2830811..ef9d8af2 100644 --- a/src/save.c +++ b/src/save.c @@ -65,6 +65,16 @@ bool Save_Init(const char* path) if (sqlite3_open(path, &handle)) { SDL_Log("Failed to open %s database: %s", path, sqlite3_errmsg(handle)); + sqlite3_close(handle); + handle = NULL; + return false; + } + mutex = SDL_CreateMutex(); + if (!mutex) + { + SDL_Log("Failed to create mutex: %s", SDL_GetError()); + sqlite3_close(handle); + handle = NULL; return false; } if (!Execute(PLAYER_TABLE, "create player table") || @@ -78,12 +88,7 @@ bool Save_Init(const char* path) !Prepare(&set_block, SET_BLOCK, "set block") || !Prepare(&get_blocks, GET_BLOCKS, "get blocks")) { - return false; - } - mutex = SDL_CreateMutex(); - if (!mutex) - { - SDL_Log("Failed to create mutex: %s", SDL_GetError()); + Save_Free(); return false; } sqlite3_exec(handle, "BEGIN;", NULL, NULL, NULL); @@ -92,6 +97,10 @@ bool Save_Init(const char* path) void Save_Free() { + if (!handle) + { + return; + } SDL_DestroyMutex(mutex); sqlite3_exec(handle, "COMMIT;", NULL, NULL, NULL); sqlite3_finalize(set_player); @@ -146,6 +155,7 @@ bool Save_GetPlayer(void* data, int size) else { SDL_Log("Failed to get player: Out of date"); + has_player = false; } } sqlite3_reset(get_player); diff --git a/src/shader.c b/src/shader.c index d7448b5b..848d77ad 100644 --- a/src/shader.c +++ b/src/shader.c @@ -3,60 +3,6 @@ #include "shader.h" -static bool TokenIs(const char* json, const jsmntok_t* token, const char* string) -{ - int size = token->end - token->start; - return size == SDL_strlen(string) && !SDL_memcmp(json + token->start, string, size); -} - -static Uint32 TokenGetUint(const char* json, const jsmntok_t* token) -{ - Uint32 value = 0; - for (int i = token->start; i < token->end; i++) - { - SDL_assert(json[i] >= '0' && json[i] <= '9'); - value = value * 10 + json[i] - '0'; - } - return value; -} - -static bool GetResources(const char* json, size_t size, SDL_GPUShaderCreateInfo* info) -{ - jsmn_parser parser; - jsmntok_t tokens[128] = {0}; - jsmn_init(&parser); - int count = jsmn_parse(&parser, json, size, tokens, SDL_arraysize(tokens)); - if (count <= 0) - { - return false; - } - for (int i = 1; i + 1 < count; i += 2) - { - if (tokens[i].type != JSMN_STRING) - { - continue; - } - Uint32 value = TokenGetUint(json, &tokens[i + 1]); - if (TokenIs(json, &tokens[i], "samplers")) - { - info->num_samplers = value; - } - else if (TokenIs(json, &tokens[i], "storage_textures")) - { - info->num_storage_textures = value; - } - else if (TokenIs(json, &tokens[i], "storage_buffers")) - { - info->num_storage_buffers = value; - } - else if (TokenIs(json, &tokens[i], "uniform_buffers")) - { - info->num_uniform_buffers = value; - } - } - return true; -} - SDL_GPUShader* Shader_Load(SDL_GPUDevice* device, const char* name) { SDL_GPUShaderFormat format = SDL_GetGPUShaderFormats(device); @@ -83,8 +29,6 @@ SDL_GPUShader* Shader_Load(SDL_GPUDevice* device, const char* name) else { SDL_assert(false); - SDL_Log("Unsupported shader format"); - return NULL; } char shader_path[512] = {0}; char shader_json_path[512] = {0}; @@ -93,43 +37,142 @@ SDL_GPUShader* Shader_Load(SDL_GPUDevice* device, const char* name) size_t shader_size; size_t shader_json_size; Uint8* shader_data = SDL_LoadFile(shader_path, &shader_size); - char* shader_json_data = NULL; - SDL_GPUShader* shader = NULL; if (!shader_data) { SDL_Log("Failed to load shader: %s", shader_path); return NULL; } - shader_json_data = SDL_LoadFile(shader_json_path, &shader_json_size); + char* shader_json_data = SDL_LoadFile(shader_json_path, &shader_json_size); if (!shader_json_data) { SDL_Log("Failed to load shader json: %s", shader_json_path); - goto cleanup; + return NULL; } - SDL_GPUShaderCreateInfo info = {0}; - if (!GetResources(shader_json_data, shader_json_size, &info)) + jsmn_parser json_parser; + jsmntok_t json_tokens[128] = {0}; + jsmn_init(&json_parser); + int tokens = jsmn_parse(&json_parser, shader_json_data, shader_json_size, json_tokens, 128); + if (tokens <= 0) { SDL_Log("Failed to parse json: %s", shader_json_path); - goto cleanup; + return NULL; } - info.code = shader_data; - info.code_size = shader_size; - info.entrypoint = entrypoint; - info.format = format; - if (SDL_strstr(name, ".frag")) + void* shader = NULL; + if (SDL_strstr(name, ".comp")) { - info.stage = SDL_GPU_SHADERSTAGE_FRAGMENT; + SDL_GPUComputePipelineCreateInfo info = {0}; + for (int i = 1; i < tokens; i += 2) + { + if (json_tokens[i].type != JSMN_STRING) + { + continue; + } + char* key_string = shader_json_data + json_tokens[i + 0].start; + char* value_string = shader_json_data + json_tokens[i + 1].start; + int key_size = json_tokens[i + 0].end - json_tokens[i + 0].start; + Uint32* value; + if (!SDL_memcmp("samplers", key_string, key_size)) + { + value = &info.num_samplers; + } + else if (!SDL_memcmp("readonly_storage_textures", key_string, key_size)) + { + value = &info.num_readonly_storage_textures; + } + else if (!SDL_memcmp("readonly_storage_buffers", key_string, key_size)) + { + value = &info.num_readonly_storage_buffers; + } + else if (!SDL_memcmp("readwrite_storage_textures", key_string, key_size)) + { + value = &info.num_readwrite_storage_textures; + } + else if (!SDL_memcmp("readwrite_storage_buffers", key_string, key_size)) + { + value = &info.num_readwrite_storage_buffers; + } + else if (!SDL_memcmp("uniform_buffers", key_string, key_size)) + { + value = &info.num_uniform_buffers; + } + else if (!SDL_memcmp("threadcount_x", key_string, key_size)) + { + value = &info.threadcount_x; + } + else if (!SDL_memcmp("threadcount_y", key_string, key_size)) + { + value = &info.threadcount_y; + } + else if (!SDL_memcmp("threadcount_z", key_string, key_size)) + { + value = &info.threadcount_z; + } + else + { + continue; + } + *value = *value_string - '0'; + } + info.code = shader_data; + info.code_size = shader_size; + info.entrypoint = entrypoint; + info.format = format; + shader = SDL_CreateGPUComputePipeline(device, &info); } else { - info.stage = SDL_GPU_SHADERSTAGE_VERTEX; + SDL_GPUShaderCreateInfo info = {0}; + for (int i = 1; i < tokens; i += 2) + { + if (json_tokens[i].type != JSMN_STRING) + { + continue; + } + char* key_string = shader_json_data + json_tokens[i + 0].start; + char* value_string = shader_json_data + json_tokens[i + 1].start; + int key_size = json_tokens[i + 0].end - json_tokens[i + 0].start; + Uint32* value; + if (!SDL_memcmp("samplers", key_string, key_size)) + { + value = &info.num_samplers; + } + else if (!SDL_memcmp("storage_textures", key_string, key_size)) + { + value = &info.num_storage_textures; + } + else if (!SDL_memcmp("storage_buffers", key_string, key_size)) + { + value = &info.num_storage_buffers; + } + else if (!SDL_memcmp("uniform_buffers", key_string, key_size)) + { + value = &info.num_uniform_buffers; + } + else + { + continue; + } + *value = *value_string - '0'; + } + info.code = shader_data; + info.code_size = shader_size; + info.entrypoint = entrypoint; + info.format = format; + if (SDL_strstr(name, ".frag")) + { + info.stage = SDL_GPU_SHADERSTAGE_FRAGMENT; + } + else + { + info.stage = SDL_GPU_SHADERSTAGE_VERTEX; + } + shader = SDL_CreateGPUShader(device, &info); } - shader = SDL_CreateGPUShader(device, &info); if (!shader) { SDL_Log("Failed to create shader: %s", SDL_GetError()); + return NULL; } -cleanup: SDL_free(shader_data); SDL_free(shader_json_data); return shader; diff --git a/src/voxel.c b/src/voxel.c index 7947ed53..24047b19 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -15,6 +15,16 @@ static const int CUBE_POSITIONS[][4][3] = {{0, 0, 0}, {0, 0, 1}, {1, 0, 0}, {1, 0, 1}}, }; +static const int TEXCOORDS[][4][2] = +{ + {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, + {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, + {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, + {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, + {{0, 0}, {1, 0}, {0, 1}, {1, 1}}, + {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, +}; + static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction direction, int ao) { SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); @@ -59,13 +69,6 @@ Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, in {{0, 0, 1}, {1, 0, 0}, {0, 1, 1}, {1, 1, 0}}, {{0, 0, 1}, {0, 1, 1}, {1, 0, 0}, {1, 1, 0}}, }; - static const int TEXCOORDS[][4][2] = - { - {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, - {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, - {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, - {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, - }; int a = POSITIONS[direction][i][0] + x; int b = POSITIONS[direction][i][1] + y; int c = POSITIONS[direction][i][2] + z; @@ -80,15 +83,6 @@ Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int SDL_assert(block < BLOCK_COUNT); SDL_assert(direction < 6); SDL_assert(i < 4); - static const int TEXCOORDS[][4][2] = - { - {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, - {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, - {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, - {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, - {{0, 0}, {1, 0}, {0, 1}, {1, 1}}, - {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, - }; int a = CUBE_POSITIONS[direction][i][0] + x; int b = CUBE_POSITIONS[direction][i][1] + y; int c = CUBE_POSITIONS[direction][i][2] + z; diff --git a/src/world.c b/src/world.c index e5f40d60..1ec3f8bd 100644 --- a/src/world.c +++ b/src/world.c @@ -86,7 +86,6 @@ static int world_x; static int world_z; static Worker workers[WORKERS]; static GPUBuffer gpu_indices; -static CPUBuffer cpu_empty_lights; static GPUBuffer gpu_empty_lights; static CPUBuffer cpu_voxels[MESH_TYPE_COUNT]; static Chunk* chunks[WORLD_WIDTH][WORLD_WIDTH]; @@ -106,13 +105,6 @@ static void WorldToChunk(const Chunk* chunk, int* bx, int* by, int* bz) SDL_assert(IsBlockLocal(*bx, *by, *bz)); } -static void ChunkToWorld(const Chunk* chunk, int* bx, int* by, int* bz) -{ - SDL_assert(*by >= 0 && *by < CHUNK_HEIGHT); - *bx += chunk->x; - *bz += chunk->z; -} - static bool IsChunkLocal(int cx, int cz) { return cx >= 0 && cz >= 0 && cx < WORLD_WIDTH && cz < WORLD_WIDTH; @@ -130,14 +122,7 @@ static int FloorChunkIndex(float index) static Chunk* GetChunk(int cx, int cz) { - if (IsChunkLocal(cx, cz)) - { - return chunks[cx][cz]; - } - else - { - return NULL; - } + return IsChunkLocal(cx, cz) ? chunks[cx][cz] : NULL; } static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) @@ -268,7 +253,9 @@ static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, i { return chunk->blocks[bx][by][bz]; } - ChunkToWorld(chunk, &bx, &by, &bz); + SDL_assert(by >= 0 && by < CHUNK_HEIGHT); + bx += chunk->x; + bz += chunk->z; int cx = 1; int cz = 1; if (bx < chunk->x) @@ -314,7 +301,7 @@ static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) { GPUBuffer_Upload(&chunk->gpu_voxels[i], &voxels[i]); } - GPUBuffer_EndUpload(&chunk->gpu_voxels[0]); + GPUBuffer_EndUpload(); } static void UploadLights(Chunk* chunk, CPUBuffer* lights) @@ -331,7 +318,7 @@ static void UploadLights(Chunk* chunk, CPUBuffer* lights) return; } GPUBuffer_Upload(&chunk->gpu_lights, lights); - GPUBuffer_EndUpload(&chunk->gpu_lights); + GPUBuffer_EndUpload(); } static bool IsVisible(Block block, Block neighbor) @@ -494,14 +481,18 @@ static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) static void GenerateLights() { + CPUBuffer lights; + CPUBuffer_Init(&lights, device, sizeof(Light)); if (!GPUBuffer_BeginUpload(&gpu_empty_lights)) { + CPUBuffer_Free(&lights); return; } Light light = {0}; - CPUBuffer_Append(&cpu_empty_lights, &light); - GPUBuffer_Upload(&gpu_empty_lights, &cpu_empty_lights); - GPUBuffer_EndUpload(&gpu_empty_lights); + CPUBuffer_Append(&lights, &light); + GPUBuffer_Upload(&gpu_empty_lights, &lights); + GPUBuffer_EndUpload(); + CPUBuffer_Free(&lights); } static void GenerateIndices() @@ -521,7 +512,7 @@ static void GenerateIndices() CPUBuffer_Append(&indices, &index); } GPUBuffer_Upload(&gpu_indices, &indices); - GPUBuffer_EndUpload(&gpu_indices); + GPUBuffer_EndUpload(); CPUBuffer_Free(&indices); } @@ -665,7 +656,6 @@ void World_Init(SDL_GPUDevice* handle) world_x = SDL_MAX_SINT32; world_z = SDL_MAX_SINT32; GPUBuffer_Init(&gpu_indices, device, SDL_GPU_BUFFERUSAGE_INDEX); - CPUBuffer_Init(&cpu_empty_lights, device, sizeof(Light)); GPUBuffer_Init(&gpu_empty_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); for (int i = 0; i < MESH_TYPE_COUNT; i++) { @@ -699,7 +689,6 @@ void World_Free() FreeChunk(chunks[x][z]); } GPUBuffer_Free(&gpu_indices); - CPUBuffer_Free(&cpu_empty_lights); GPUBuffer_Free(&gpu_empty_lights); for (int i = 0; i < MESH_TYPE_COUNT; i++) { @@ -1046,40 +1035,23 @@ WorldQuery World_Raycast(const Camera* camera, float length) { return query; } - for (int i = 0; i < 3; i++) + SDL_memcpy(query.previous, query.current, sizeof(query.current)); + int axis; + if (distances[0] < distances[1] && distances[0] < distances[2]) { - query.previous[i] = query.current[i]; + axis = 0; } - if (distances[0] < distances[1]) + else if (distances[1] < distances[2]) { - if (distances[0] < distances[2]) - { - traveled = distances[0]; - distances[0] += deltas[0]; - query.current[0] += steps[0]; - } - else - { - traveled = distances[2]; - distances[2] += deltas[2]; - query.current[2] += steps[2]; - } + axis = 1; } else { - if (distances[1] < distances[2]) - { - traveled = distances[1]; - distances[1] += deltas[1]; - query.current[1] += steps[1]; - } - else - { - traveled = distances[2]; - distances[2] += deltas[2]; - query.current[2] += steps[2]; - } + axis = 2; } + traveled = distances[axis]; + distances[axis] += deltas[axis]; + query.current[axis] += steps[axis]; } query.block = BLOCK_EMPTY; return query; From 799ee23edbae9d5df595653e9ae7f31e55dbd54b Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 12:10:31 -0400 Subject: [PATCH 21/39] clang-format --- .clang-format | 10 + .vscode/settings.json | 14 +- shaders/bin/depth.vert.spv | Bin 17328 -> 17320 bytes shaders/bin/opaque.frag.spv | Bin 52708 -> 52712 bytes shaders/bin/opaque.vert.msl | 18 +- shaders/bin/opaque.vert.spv | Bin 20848 -> 20872 bytes shaders/bin/raycast.vert.spv | Bin 14440 -> 14432 bytes shaders/bin/shadow.vert.spv | Bin 20904 -> 20916 bytes shaders/bin/sky.frag.spv | Bin 17240 -> 17220 bytes shaders/bin/sky.vert.spv | Bin 14588 -> 14580 bytes shaders/bin/transparent.frag.spv | Bin 52676 -> 52668 bytes shaders/bin/transparent.vert.spv | Bin 20712 -> 20716 bytes shaders/shader.hlsl | 57 +++--- src/block.c | 6 +- src/block.h | 3 +- src/buffer.h | 6 +- src/camera.c | 22 ++- src/camera.h | 6 +- src/direction.h | 15 +- src/main.c | 3 +- src/player.c | 24 ++- src/player.h | 6 +- src/rand.c | 180 +++++++++--------- src/save.c | 36 ++-- src/sky.h | 6 +- src/world.c | 306 +++++++++++++++++-------------- src/world.h | 10 +- 27 files changed, 380 insertions(+), 348 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..eb578320 --- /dev/null +++ b/.clang-format @@ -0,0 +1,10 @@ +BasedOnStyle: Microsoft +BreakBeforeBraces: Allman +ColumnLimit: 0 +IndentWidth: 4 +MaxEmptyLinesToKeep: 1 +PointerAlignment: Left +SortIncludes: Never +UseTab: Never +BracedInitializerIndentWidth: 4 +ContinuationIndentWidth: 0 diff --git a/.vscode/settings.json b/.vscode/settings.json index 5e4ff75f..d9321170 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,13 @@ { - "cmake.parallelJobs": 8 -} \ No newline at end of file + "cmake.parallelJobs": 8, + "C_Cpp.clang_format_style": "file", + "editor.formatOnSave": true, + "[c][cpp]": { + "editor.defaultFormatter": "ms-vscode.cpptools" + }, + "files.associations": { + "*.frag": "cpp", + "*.hlsl": "cpp", + "*.vert": "cpp" + } +} diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index 699779cfaabf477bd76a4f4de29f88af45017695..085894ff85bcfa1b655f9e2c52711c39c2b9d269 100644 GIT binary patch delta 760 zcmdnc&bXqTali6zDw$kMu4B)0Alqa{ctN1DC8t9n<{RXBm zoCKG_rvS--$<-V(so0D{wgu#UQ_L7ZvJ0m?#3~R8v`GQz33~%VQHLxK3La3@#i4l= z5p3i~4N}Zbp2WFpvmaL}D$W`r delta 800 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 delta 13252 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 _294 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); +constant spvUnsafeArray _295 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); struct main0_out { @@ -80,15 +80,15 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _407 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _409 = float4(_407.x, _407.y, _407.z, _295.w); - float4 _425 = UniformBuffer_1.View * float4(_407, 1.0); - _409.w = _425.z; - out.gl_Position = UniformBuffer.Proj * _425; - out.out_var_TEXCOORD0 = _409; + float3 _408 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _410 = float4(_408.x, _408.y, _408.z, _296.w); + float4 _426 = UniformBuffer_1.View * float4(_408, 1.0); + _410.w = _426.z; + out.gl_Position = UniformBuffer.Proj * _426; + out.out_var_TEXCOORD0 = _410; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _294[(in.in_var_TEXCOORD0 >> 8u) & 3u]; + out.out_var_TEXCOORD3 = _295[(in.in_var_TEXCOORD0 >> 8u) & 3u]; return out; } diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index 108e7643a6f9816f2466cb507e779883d3c6e468..4d8834b6ce2bfac41f2ca831ec5fd8d68885a0dd 100644 GIT binary patch delta 3934 zcmbVOdu&rx81LCS*3A}fX-mh}Z7ri*1_P%+Agt}$vB3u0x)De~knncAHiXT9f}4s0 z3W9v1sAvF(^3-98AP*mig1iv~Q3#Ou2QemMd;|?9{=VCL=gF9mxZHcc^Lu>XIrlv7 zdUKOl_O`GkCgdcWOu}R`bu`V|W!q{NO|d=ZCK1i=n?F6z8-G54c5a?6)r-IBv+E|+ z_va?1MR$ltlw3p9hMwgo7}z9+b6&8 z0KA(P?if<5ayNrifL^e8rnOf}?uB1}z?~}~_4S{6yeod9Cof*2F#ldlC+j>tymS-V zyy(Bv_WzegT3OnZvM)9vwINB^V&^(d5p>fYpgJWvw!l6iLD=Ym;|DzVIScUo-MI#? zrLOq`;jb5qS2AX{R&X4z(zeXAB1&GW*MFvwdap|JDn=B z-T-?et9x3!%)Dv!4fATfbq)1%8|pdV7V~9aP4N}tjP*8|O-B&Rafc-wMLR;i-23eh zN$gm($I+zRY&+{l?j*FUVlUusG|c ztGaR&(E=_>!YRNVB%G?}aOdp557;8Qk5v!Xp{Hz?l;E0cT0L8*sLSbAY`P?hfpeuphXagnIzz0H@?( z^?B`8`t$w_(KF`C-(wc#v6KBTCWvy{Ja8bum4W9HGjowqfYI`X8HfblG*)bjL5P#+ zWPv-k7ZhBk8cj*kl*tKkjwi>8O~UTpWD8`AJn9q3pqhY{Mg^RrFU<&K(~f{b>wxlU zXCQ}u1G*M)Qd&?UbI?fv#JNEW*hve*3Y~~pXm;32 z>(LH}EwmcGa=IRI)3;#{odI(jF~8VC-iU`L!d;BWe2tD*ASy#F)Pl&q^N3va7UE4r zPf?r?BQlHWgWD2O`%ygUEG$)A_U^aU4M8kxfM8{3SZxqU$Gg{-%zd#qs)s z5P3Y~5xIU7BKOy<^GD;@#+%NHF99$5OrEL;Z@ZxWxtoP{A{4_h8yJ_i?Uy35J{a*U z%@f~fQ|PHGx0pjEC90^UIVEo2T)1j+*P&_)ob%9T&WbM%_dB09!&^@$;e8Bzz2seh zHgkq|Aten}a~}u8Rbt3yM=dH}M|%<4tQqdbGa+12F!M&8rJ8%gFvYbDEZ15o)mpBpmr?6^DC{^b)mj0}yisc<*-KT|i(t6ULaELw zt*W2ip@jyUZ9X|9|8EY4Q$S4-J>Lmd_%-PM?)I#GB+B?xvs0 z6#rWg`-A5l$-DSG;s$Wc8$E7>TMcdk!#(j|HTvS6*{pL+8{9iOhox_=@UGV1`r%6E z7N}f_GugRYa&6UI*M=*uZBW?BBQZv?T~j?H6#EXaxLV(78|^B0h@DhDLUp|dfwSe_ z--qI+<`GJ63lw(n%*nI#0WhxCiY?kK#pst2s(&|x2cgL`^dUIrjj`>46FatCaqR`m z{j2kT^J0R)f;A?xHrjxBALmZ@C6>bVwD6Ws; zXU{x%jov=d)I}AF|5GUJ2tqYZ&mmyu4fp48tFFUfxK4vq=L@Zlxl-|e356YUouk0a z8+E?Y+*Or|>lj$>g&oFje?;5u$MK%3{{(nkt#iPB{<<8O`aVgQDpmWbHqKdOk2=I@ z@<&zQ8A%(7%(gRCLvx}T;w&wXs*NhV#yG#$^BzG?DQ+_`-@l^06ZawP>?4Thz;VrL zw2j>Jz_?6pbNN?j2i!;W+;7n4{Gxd7NbOU20R*l)l4pXufjffapAj#@#J@$j2p>p3 zW|z=r-k8oA+H`(LuT`n`@4@40oz6>iw#qT>vd+rCTV~=+urm#J2-}}O8N6M&&7TfF d9Ngwl2rmk^lhNjB;I;*A9*Hp>SE#I7{RjWM*}nh) delta 4031 zcmbtWX>e0j7|jc%O=AKtHX&V7ni9gJl0uPUfhK8MN_S|BFoOys6+yvbSz3VsEQ>5I zi12~H;L?h_qGC`$iz0#)t)PM%>IgG1!;CP>xQst^^n5SxmTRZr4?6GWyXSo8JNLf3 zq*=Q|`Q;hK-oxxmFqssS$<)g0lrm}y_qS$fKu zPp6z4qqAM}mFSs1@e2Lq_Vrk7w^B;-eMHIaX6w@E?I{x#il#Q0|1m}Tr;Sm}*2Og2 zCezOL{r&K)Z;R*Y_>D z*tfq+ubMZ#v1#7D-iD^eIZcg_N3$}1Ow5enz6~5${OOhO=53B ze=^O?%5c<3Y#sWw(QR4pnw9Z1F|b~lLgxYvc2$z}q`BGKo8xiAanDUZ8ku&)1aLhi zYypm!aH3Je6J@;>*dpbx15T8%4cIDSJMeWe+^ie)0%4N`y@Bl#R)Kp-*a6&I!q)?f zSK|pK0Xw9;6Zm=wyMU8)+#Gv@J|LWuzzyt@a58Wo38w(NC7cSJEa5cZ6bXBPQze`Z zoW{7>Si-&_Jdz*-I9MaAE+v&wD?B964!< z7R}Dt6Q@*0&*gq?Rw`+KULL^jc_(@#4n##hW*bkR=O<-PHOKxp@FJ{0v*EyuK+J*) zkLhlSt0PA+Nx6ai!Ho1lMt(Z-523*ZwHCcLKy|?kC7YJxb1=0Aeaa9z9Q4tlph|xR zopc`26LOL*q*5g0OdV!;@j5+^)`m6;EkU7*P%0!Ast-Lt&TukW!YT#BP6{AS4Lg;5 zY6|((+jIYC&Y5Lk54|z_!sIeabnA>^H%{3lUlWgux#$@L5Fmw-m?b z6F_AD8blti(crflxD65W&E^vsGQRm{q2B|WAU5M3X{XnKpG8B*Bq?{$r82itPgBNd zBWFW#6Ea7Q#!mcA&;Xuu4Zv>z&*eUv4PQvS>qKs^^0d)gOZu)lJ|zC#n~q&zz`U zNa-b7)*>+M8$~56?!{PV&|i!`=Y)C*%`VY0mx95g-|m%$ichUj-A{$(Zt5seGn*yl zG$?pgV#)-4?$hY+k~C!*wU)Xmr&M(<4ti~!}=Ec~n zq1Ie$z_8Cc$!D$Z^Ba5~M1~c|C7*|ZnHN5f=;}zB>RJbuy%tGckLuYaWvYKYGOUp2 zv;mlT;kA)=m1!vihG)wovBHLbNW6b{>Sth+zGmKX)v*~lUUyObI5L`R3mA6btjKKD zYc`duiQB+xXj^D!d76JadU*8xS%t`1UUfbfqV@?oQ{kq#3f2E4vbo6cx#LrF67gwp z%nNmkuCA$2L#<$WF8o)EZ%jUsI}DC#!98biv2VxNNqt^-*VE|+p3XO9HNPRhgHXRpGb=UMPGmSM&*L?Eu2KuV4wkdL zI`U231&pWDn{{1R?@iiJuNeU<9k1D3~Ug~;wjR`c%z zgQs&GR(5@dcj$*IE%dIWS1vv*Iqy(C@;>cxyMc!R-^|@N}*b*YFyBB8}Zam&R%SPrE3^8g)p@W3;QrO%tls z&~ZsU9txqh;im-O$-AT#9Si)L0EZ!^0I%5CVnP;XK3V~Ni)e&n-t=M9LAO6-`{+B cxX-`6dGolRfIcq+_buqNyI79zsjgQ07d1BHK>z>% diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index 103a156f359b463f7048ef7288070ccd2b503b39..d98da8c859b832c19592bceb3a995f00df4bbaae 100644 GIT binary patch delta 758 zcmaD+@StGBG8V>$&C6LD82t_O4AOKIAfzFXt*OJyr2qtJIr)ht#u~`dx>)2vLNM(h zwUhZc73#5?fl!H68f-YkB&_lTv?EK~VDSO6JYMO^b2yYIx3a7FDd-yLnF9R=rZAiY zm%*n1$$-h#95Sicj6${r(@U4a526Cesa!0x8V2#5)j1KHi{bq(}P({#Wj79(L& z_!IyQgDFEd0b)2l1;Gf-prA3u7D+JE@hO1V0Wo26I)?(I0?>ELlUH%b7y||2v4}mI zkraS~7#z(h=$=7}9*SZSIUN8UDL%QIb1@Sy*JeGgQr68&_>&noa|kYAn!Hl@$>cr} z>&d4?CT)%tEoR(&QH+go@@;Wt=4xK9$(#~plba<@Fmcsx_LmH0+`L$7E~j8R0|SFL a0}I0hAZ-W48Jh!DteF@yH}|St76bsaKe}cB diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index d26e2dfbc6395aa44bf082e47cd6c20062644e85..34510a9cd735d6faf0a87ec679b9e53a30c458d9 100644 GIT binary patch delta 947 zcmZ3nm~qQu#tn;D7#lV(W@%vbH_$Uk(@}tshCsHa4lkDi5TxbgCzcp%AWQ3Fkp~IE zw1d=6=HgVS$7%*bC01#$;SiIs$`jCzENz3u2gvexr6k)La+!!VkbEdI38yh3W1{9Ohy1_lP@%)I2B z(v(yMrQ(dll++@eC0;Jx$@S7Ull^4WCf}Flnrtj1H2IhGOP~qWypx~GC2|llSWMGx}`y I)s0pG08;DaBme*a delta 970 zcmdn8m~q8o#tn;D7@IaPW@%uoS1`~sNYjCmhCsH0rVcNc0uZF-8oCK!T{slfBin&62;B&XBajTju0Vm12^b1&F+56&5t9oz#V7w`<(Qnqt`VSX zpl6z<117P!4km?90nnE)Wk3@qH?oWHqKgPatpO{=XAK?&5NluxK-O@Bt$~QZ{j`Wf z0VQ={k9U_ox`0D58<6ED|hEv{15%?tRG87J=-wBBqln94MH zsqmA@T_V<#kBLm$94T7NxcRIY8{_2b;>yg`yj+u6CCVn(OPpZhs@?1@8Ok_$zSM5U z8IRck%jLe^+`U|`T@U}3ljqyvE1 kXYy1{c|i~hCK?H32W~#9$;`|cH2I`XKcnyFNZn`^0Ci6zDw$kMu4B$>7lqb(*SMgKOHPAB!`VCBB zI0-I;PXUqvllwVjSiwdCSz=yLvq1{*8I4mOVls#X8m9nsv%LYKm_n8Zg$5|5;?OKd zgcA8NffSKIcZpBl%ei=S5?3iJBk$(x{K~BTf$F(TRB zv=}7+PmGOml7u=pC>d5mB5SgiMA_sy5@%R=xoUYgXGw-KPCg)2#W;DgwY0PV7gupf zQE76Cf@fYqX$e>L6W>xKGVm!WiqWW=Z04eLq=>Px# delta 940 zcmX@o#(1NRal z=5WDOrpbGSpG;mPVmTs-RSyk(iQNq?eIXoTJ3c#miM(QdF8;qTrcVP+G!O z%{w_xT8*8TtJWGQx4A=FicyZ2%fGY)D5;Q}n3<;mR;Q2&Qmx4gQomPbKNADP=4x40 ycE!U$o3t5N7#0I*Cm=q8#CHXIE diff --git a/shaders/bin/sky.vert.spv b/shaders/bin/sky.vert.spv index 35c3ebca7961c2b67a6ca40c843b7405ec66a673..c1756029cd79e5dd966b6336e33b43f8cf7e5e6b 100644 GIT binary patch delta 758 zcmexU_@!{eG8V>$&C6LD82t_O4AOKIAfzFXt*OJyr2qtJIr)ht#u~`dx>)2vLNM(h zwUhZc73#5?fl!H68f-YkB&_lTv?EK~VDSO6JYMO^b2yYIx3a7FDd-yLnF9R=rZAiY zm%*n1$$-h#95Sicj6${r(@U4a526Cesa!0x8V2#5)j1KHi{bq(}P({#Wj79(L& z_!IyQgDFEd0b)2l1;Gf-prA3u7D+JE@hO1V0Wo26I)?(I0?>ELlUH%b7y||2v4}mI zkraS~7#z(h=$=7}9*SZSIUN8UDL%QIb1@Sy*JeGgQr68&_>&noa|kYAn!Hl@$>cr} z>&d4?CT)%tEoR(&QH+go@@;Wt=4xK9$(#~plba<@Fmcsx_LmH0+`L$dl}j+4fq_Ar afrViLkhTNjjLkb$teF@yH-A<8F9-lCox1e^ diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 92864534bb0f8aed6908656dc840d06c5aa2888d..b2d22365a961c827ffb06800f35cc694d9b46439 100644 GIT binary patch literal 52668 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 I@hH*%0f(BOLjV8( literal 52676 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 XeSb6RSi5|O4Ds(|pik7}5u*PGqojR} diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index 5c42324a54b80518b66b6fbdc24a9790a9236909..506117bfe063224286261790649b1f8a38023964 100644 GIT binary patch delta 853 zcmaE{knznz#tpkz7#lY4W@%vbH_$Uk(@}tshCsHa4lkDi5TxbgCzcp%AWQ3Fkp~IE zw1d=6?q^e|$7%*bC01#$;SiIs$`jCzENz3u2gvexr6+ITP@X)KUByp9*Fet{=r=Hh z;Uu^WJ_SeyOz!89VFeonWQln}%?2sJXEaWEh{+%lXq*Dj&GrU_VhULv6dItIibJy; z5lZC81X4r--6cMGFX!UTNnE9@jJ%t#^CvR`DJ#JROpLsfZwWsElKVugf#gq-NkEBi z(PEJNKQT7ONfPSZpk!DLiLA+55@nO;NStBe<*Mb~oFy5`IQf875ToX1VQDu;pkOuc zu-O2*?iDJW=yB6Jy}ySe<^xn9Xl> Hek%h2gmldz delta 878 zcmaE}knzPr#tpkz7@IclW@%syQ83UmNYjCmhCsH0rVcNc0uZF-n!@BRHidc|<{%VfR{*vGVj6Y@3WQ96DDVQin<67%CQN2zlbzhcuHmO^pl6z< z117N;43omA0B9sknZo314(Uv+h9TJl3JFteaRM_2p8|+&5EFp5DKG texture, SamplerComparisonState state, float4 float bias = 0.0003f + 0.001f * (1.0f - ratio); float visibility = 0.0f; for (int x = -1; x <= 1; x++) - for (int y = -1; y <= 1; y++) { - visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); + for (int y = -1; y <= 1; y++) + { + visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); + } } visibility /= 9.0f; float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); diff --git a/src/block.c b/src/block.c index bdf2908b..7067a9cc 100644 --- a/src/block.c +++ b/src/block.c @@ -10,8 +10,7 @@ typedef struct BlockGPU Uint32 has_occlusion; Uint32 is_fullbright; Uint32 indices[DIRECTION_COUNT]; -} -BlockGPU; +} BlockGPU; struct { @@ -22,8 +21,7 @@ struct bool is_fullbright; int indices[6]; Light light; -} -static const BLOCKS[BLOCK_COUNT] = +} static const BLOCKS[BLOCK_COUNT] = { [BLOCK_GRASS] = { diff --git a/src/block.h b/src/block.h index edf445c3..f3e81573 100644 --- a/src/block.h +++ b/src/block.h @@ -44,8 +44,7 @@ typedef struct Light Sint32 x; Sint32 y; Sint32 z; -} -Light; +} Light; SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device); diff --git a/src/buffer.h b/src/buffer.h index 39bc1650..cffb6c05 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -10,8 +10,7 @@ typedef struct CPUBuffer Uint32 size; Uint32 capacity; Uint32 stride; -} -CPUBuffer; +} CPUBuffer; void CPUBuffer_Init(CPUBuffer* cpu, SDL_GPUDevice* device, Uint32 stride); void CPUBuffer_Free(CPUBuffer* cpu); @@ -24,8 +23,7 @@ typedef struct GPUBuffer SDL_GPUBuffer* buffer; Uint32 size; Uint32 capacity; -} -GPUBuffer; +} GPUBuffer; void GPUBuffer_Init(GPUBuffer* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage); void GPUBuffer_Free(GPUBuffer* gpu); diff --git a/src/camera.c b/src/camera.c index a5f31af6..0c3fa607 100644 --- a/src/camera.c +++ b/src/camera.c @@ -9,17 +9,21 @@ static void Multiply(float matrix[4][4], float a[4][4], float b[4][4]) { float c[4][4] = {0}; for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) { - c[i][j] += a[0][j] * b[i][0]; - c[i][j] += a[1][j] * b[i][1]; - c[i][j] += a[2][j] * b[i][2]; - c[i][j] += a[3][j] * b[i][3]; + for (int j = 0; j < 4; j++) + { + c[i][j] += a[0][j] * b[i][0]; + c[i][j] += a[1][j] * b[i][1]; + c[i][j] += a[2][j] * b[i][2]; + c[i][j] += a[3][j] * b[i][3]; + } } for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) { - matrix[i][j] = c[i][j]; + for (int j = 0; j < 4; j++) + { + matrix[i][j] = c[i][j]; + } } } @@ -173,7 +177,7 @@ void Camera_Update(Camera* camera) Multiply(camera->view, camera->proj, camera->view); Rotate(camera->proj, 0.0f, 1.0f, 0.0f, -camera->yaw); Multiply(camera->view, camera->proj, camera->view); - float aspect = (float) camera->width / camera->height; + float aspect = (float)camera->width / camera->height; if (camera->type == CAMERA_TYPE_PERSPECTIVE) { Perspective(camera->proj, aspect, camera->fov, camera->near, camera->far); @@ -231,7 +235,7 @@ bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float float z2 = z + sz; for (int i = 0; i < 6; ++i) { - const float *plane = camera->planes[i]; + const float* plane = camera->planes[i]; float a = plane[0] >= 0.0f ? x2 : x; float b = plane[1] >= 0.0f ? y2 : y; float c = plane[2] >= 0.0f ? z2 : z; diff --git a/src/camera.h b/src/camera.h index 45ef444e..4716f2d2 100644 --- a/src/camera.h +++ b/src/camera.h @@ -6,8 +6,7 @@ typedef enum CameraType { CAMERA_TYPE_ORTHO, CAMERA_TYPE_PERSPECTIVE, -} -CameraType; +} CameraType; typedef struct Camera { @@ -34,8 +33,7 @@ typedef struct Camera float near; float far; float ortho; -} -Camera; +} Camera; void Camera_Init(Camera* camera, CameraType type); void Camera_Update(Camera* camera); diff --git a/src/direction.h b/src/direction.h index 1067882f..3a078f21 100644 --- a/src/direction.h +++ b/src/direction.h @@ -9,15 +9,14 @@ typedef enum Direction DIRECTION_UP, DIRECTION_DOWN, DIRECTION_COUNT, -} -Direction; +} Direction; static const int DIRECTIONS[DIRECTION_COUNT][3] = { - [DIRECTION_NORTH] = { 0, 0, 1 }, - [DIRECTION_SOUTH] = { 0, 0,-1 }, - [DIRECTION_EAST] = { 1, 0, 0 }, - [DIRECTION_WEST] = {-1, 0, 0 }, - [DIRECTION_UP] = { 0, 1, 0 }, - [DIRECTION_DOWN] = { 0,-1, 0 }, + [DIRECTION_NORTH] = {0, 0, 1}, + [DIRECTION_SOUTH] = {0, 0, -1}, + [DIRECTION_EAST] = {1, 0, 0}, + [DIRECTION_WEST] = {-1, 0, 0}, + [DIRECTION_UP] = {0, 1, 0}, + [DIRECTION_DOWN] = {0, -1, 0}, }; diff --git a/src/main.c b/src/main.c index c4386976..41bbf272 100644 --- a/src/main.c +++ b/src/main.c @@ -809,8 +809,7 @@ static void RenderUI(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_textu { int viewport[2]; Uint32 index; - } - uniform; + } uniform; uniform.viewport[0] = player.camera.width; uniform.viewport[1] = player.camera.height; uniform.index = Block_GetIndex(player.block, DIRECTION_NORTH); diff --git a/src/player.c b/src/player.c index 1bb6b4e6..92348cfc 100644 --- a/src/player.c +++ b/src/player.c @@ -10,8 +10,7 @@ typedef struct AABB { float min[3]; float max[3]; -} -AABB; +} AABB; typedef struct PlayerSave { @@ -21,8 +20,7 @@ typedef struct PlayerSave float pitch; float yaw; Block block; -} -PlayerSave; +} PlayerSave; static const float PHYSICS_EPSILON = 0.001f; static const float WALK_SPEED = 5.0f; @@ -49,15 +47,15 @@ static bool IsColliding(const float position[3]) max[i] = SDL_floorf(position[i] + PLAYER_AABB.max[i] - PHYSICS_EPSILON); } for (int bx = min[0]; bx <= max[0]; bx++) - for (int by = min[1]; by <= max[1]; by++) - for (int bz = min[2]; bz <= max[2]; bz++) - { - int position[3] = {bx, by, bz}; - if (Block_IsSolid(World_GetBlock(position))) - { - return true; - } - } + for (int by = min[1]; by <= max[1]; by++) + for (int bz = min[2]; bz <= max[2]; bz++) + { + int position[3] = {bx, by, bz}; + if (Block_IsSolid(World_GetBlock(position))) + { + return true; + } + } return false; } diff --git a/src/player.h b/src/player.h index 543b30e9..de4c758c 100644 --- a/src/player.h +++ b/src/player.h @@ -11,8 +11,7 @@ typedef enum PlayerController PLAYER_CONTROLLER_WALK, PLAYER_CONTROLLER_FLY, PLAYER_CONTROLLER_COUNT, -} -PlayerController; +} PlayerController; typedef struct Player { @@ -22,8 +21,7 @@ typedef struct Player bool is_on_ground; WorldQuery query; Block block; -} -Player; +} Player; void Player_Load(Player* player); void Player_Save(const Player* player); diff --git a/src/rand.c b/src/rand.c index 21414999..f8f553d6 100644 --- a/src/rand.c +++ b/src/rand.c @@ -7,113 +7,113 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock function) { for (int a = 0; a < CHUNK_WIDTH; a++) - for (int b = 0; b < CHUNK_WIDTH; b++) - { - int x = cx + a; - int z = cz + b; - bool low = false; - bool grass = false; - float height = stb_perlin_fbm_noise3(x * 0.005f, 0.0f, z * 0.005f, 2.0f, 0.5f, 6); - height *= 50.0f; - height = SDL_powf(SDL_max(height, 0.0f), 1.3f); - height += 30; - height = SDL_clamp(height, 0, CHUNK_HEIGHT - 1); - if (height < 40) + for (int b = 0; b < CHUNK_WIDTH; b++) { - height += stb_perlin_fbm_noise3(-x * 0.01f, 0.0f, z * 0.01f, 2.0f, 0.5f, 6) * 12.0f; - low = true; - } - float biome = stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 6); - Block top; - Block bottom; - if (height + biome < 31) - { - top = BLOCK_SAND; - bottom = BLOCK_SAND; - } - else - { - biome *= 8.0f; - biome = SDL_clamp(biome, -5.0f, 5.0f); - if (height + biome < 61) + int x = cx + a; + int z = cz + b; + bool low = false; + bool grass = false; + float height = stb_perlin_fbm_noise3(x * 0.005f, 0.0f, z * 0.005f, 2.0f, 0.5f, 6); + height *= 50.0f; + height = SDL_powf(SDL_max(height, 0.0f), 1.3f); + height += 30; + height = SDL_clamp(height, 0, CHUNK_HEIGHT - 1); + if (height < 40) { - top = BLOCK_GRASS; - bottom = BLOCK_DIRT; - grass = true; + height += stb_perlin_fbm_noise3(-x * 0.01f, 0.0f, z * 0.01f, 2.0f, 0.5f, 6) * 12.0f; + low = true; } - else if (height + biome < 132) + float biome = stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 6); + Block top; + Block bottom; + if (height + biome < 31) { - top = BLOCK_STONE; - bottom = BLOCK_STONE; + top = BLOCK_SAND; + bottom = BLOCK_SAND; } else { - top = BLOCK_SNOW; - bottom = BLOCK_STONE; - } - } - int y = 0; - for (; y < height; y++) - { - function(userdata, x, y, z, bottom); - } - function(userdata, x, y, z, top); - for (; y < 30; y++) - { - function(userdata, x, y, z, BLOCK_WATER); - } - if (low && grass) - { - float plant = stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; - if (plant > 0.8f && a > 2 && a < CHUNK_WIDTH - 2 && b > 2 && b < CHUNK_WIDTH - 2) - { - int log = 3 + plant * 2.0f; - for (int dy = 0; dy < log; dy++) + biome *= 8.0f; + biome = SDL_clamp(biome, -5.0f, 5.0f); + if (height + biome < 61) + { + top = BLOCK_GRASS; + bottom = BLOCK_DIRT; + grass = true; + } + else if (height + biome < 132) + { + top = BLOCK_STONE; + bottom = BLOCK_STONE; + } + else { - function(userdata, x, y + dy + 1, z, BLOCK_LOG); + top = BLOCK_SNOW; + bottom = BLOCK_STONE; } - for (int dx = -1; dx <= 1; dx++) - for (int dz = -1; dz <= 1; dz++) - for (int dy = 0; dy < 2; dy++) + } + int y = 0; + for (; y < height; y++) + { + function(userdata, x, y, z, bottom); + } + function(userdata, x, y, z, top); + for (; y < 30; y++) + { + function(userdata, x, y, z, BLOCK_WATER); + } + if (low && grass) + { + float plant = stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; + if (plant > 0.8f && a > 2 && a < CHUNK_WIDTH - 2 && b > 2 && b < CHUNK_WIDTH - 2) { - if (dx || dz || dy) + int log = 3 + plant * 2.0f; + for (int dy = 0; dy < log; dy++) { - function(userdata, x + dx, y + log + dy, z + dz, BLOCK_LEAVES); + function(userdata, x, y + dy + 1, z, BLOCK_LOG); } + for (int dx = -1; dx <= 1; dx++) + for (int dz = -1; dz <= 1; dz++) + for (int dy = 0; dy < 2; dy++) + { + if (dx || dz || dy) + { + function(userdata, x + dx, y + log + dy, z + dz, BLOCK_LEAVES); + } + } + } + else if (plant > 0.55f) + { + function(userdata, x, y + 1, z, BLOCK_BUSH); + } + else if (plant > 0.52f) + { + int value = SDL_max(((int)(plant * 1000.0f)) % 4, 0); + Block flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; + function(userdata, x, y + 1, z, flowers[value]); } } - else if (plant > 0.55f) + if (height > 130) { - function(userdata, x, y + 1, z, BLOCK_BUSH); + continue; } - else if (plant > 0.52f) + float cloud = stb_perlin_turbulence_noise3(x * 0.015f, 0.0f, z * 0.015f, 2.0f, 0.5f, 6); + int scale = -1; + if (cloud > 0.9f) { - int value = SDL_max(((int) (plant * 1000.0f)) % 4, 0); - Block flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; - function(userdata, x, y + 1, z, flowers[value]); + scale = 2; + } + else if (cloud > 0.7f) + { + scale = 1; + } + else if (cloud > 0.6) + { + scale = 0; + } + for (int y = -scale; y <= scale; y++) + { + function(userdata, x, 155 - y, z, BLOCK_CLOUD); } } - if (height > 130) - { - continue; - } - float cloud = stb_perlin_turbulence_noise3(x * 0.015f, 0.0f, z * 0.015f, 2.0f, 0.5f, 6); - int scale = -1; - if (cloud > 0.9f) - { - scale = 2; - } - else if (cloud > 0.7f) - { - scale = 1; - } - else if (cloud > 0.6) - { - scale = 0; - } - for (int y = -scale; y <= scale; y++) - { - function(userdata, x, 155 - y, z, BLOCK_CLOUD); - } - } } diff --git a/src/save.c b/src/save.c index ef9d8af2..bcb32df9 100644 --- a/src/save.c +++ b/src/save.c @@ -4,25 +4,25 @@ #include "save.h" static const char* PLAYER_TABLE = - "CREATE TABLE IF NOT EXISTS players (" - " id INT PRIMARY KEY NOT NULL," - " data BLOB NOT NULL" - ");"; +"CREATE TABLE IF NOT EXISTS players (" +" id INT PRIMARY KEY NOT NULL," +" data BLOB NOT NULL" +");"; static const char* BLOCK_TABLE = - "CREATE TABLE IF NOT EXISTS blocks (" - " cx INTEGER NOT NULL," - " cz INTEGER NOT NULL," - " bx INTEGER NOT NULL," - " by INTEGER NOT NULL," - " bz INTEGER NOT NULL," - " block INTEGER NOT NULL," - " PRIMARY KEY (cx, cz, bx, by, bz)" - ");"; +"CREATE TABLE IF NOT EXISTS blocks (" +" cx INTEGER NOT NULL," +" cz INTEGER NOT NULL," +" bx INTEGER NOT NULL," +" by INTEGER NOT NULL," +" bz INTEGER NOT NULL," +" block INTEGER NOT NULL," +" PRIMARY KEY (cx, cz, bx, by, bz)" +");"; static const char* SKY_TABLE = - "CREATE TABLE IF NOT EXISTS sky (" - " id INTEGER PRIMARY KEY NOT NULL," - " time_of_day REAL NOT NULL" - ");"; +"CREATE TABLE IF NOT EXISTS sky (" +" id INTEGER PRIMARY KEY NOT NULL," +" time_of_day REAL NOT NULL" +");"; static const char* SET_PLAYER = "INSERT OR REPLACE INTO players (id, data) VALUES (0, ?);"; static const char* GET_PLAYER = "SELECT data FROM players WHERE id = 0;"; static const char* SET_SKY = "INSERT OR REPLACE INTO sky (id, time_of_day) VALUES (0, ?);"; @@ -189,7 +189,7 @@ bool Save_GetSky(float* time_of_day) bool has_sky = sqlite3_step(get_sky) == SQLITE_ROW; if (has_sky) { - *time_of_day = (float) sqlite3_column_double(get_sky, 0); + *time_of_day = (float)sqlite3_column_double(get_sky, 0); } sqlite3_reset(get_sky); SDL_UnlockMutex(mutex); diff --git a/src/sky.h b/src/sky.h index 0745c936..b6eb7c17 100644 --- a/src/sky.h +++ b/src/sky.h @@ -10,8 +10,7 @@ typedef struct SkyRender float top[4]; float horizon[4]; float ambient[4]; -} -SkyRender; +} SkyRender; typedef struct Sky { @@ -20,8 +19,7 @@ typedef struct Sky SkyRender render; Camera shadow_camera; int shadow_frame; -} -Sky; +} Sky; void Sky_Load(Sky* sky); void Sky_Reset(Sky* sky); diff --git a/src/world.c b/src/world.c index 1ec3f8bd..242d012d 100644 --- a/src/world.c +++ b/src/world.c @@ -20,32 +20,28 @@ typedef enum JobType JOB_TYPE_BLOCKS, JOB_TYPE_VOXELS, JOB_TYPE_LIGHTS, -} -JobType; +} JobType; typedef enum JobState { JOB_STATE_REQUESTED, JOB_STATE_RUNNING, JOB_STATE_COMPLETED, -} -JobState; +} JobState; typedef enum MeshType { MESH_TYPE_OPAQUE, MESH_TYPE_TRANSPARENT, MESH_TYPE_COUNT, -} -MeshType; +} MeshType; typedef struct Job { JobType type; int x; int z; -} -Job; +} Job; typedef struct Worker { @@ -55,8 +51,7 @@ typedef struct Worker Job job; CPUBuffer voxels[MESH_TYPE_COUNT]; CPUBuffer lights; -} -Worker; +} Worker; typedef struct Chunk { @@ -78,8 +73,7 @@ typedef struct Chunk int light_capacity; GPUBuffer gpu_voxels[MESH_TYPE_COUNT]; GPUBuffer gpu_lights; -} -Chunk; +} Chunk; static SDL_GPUDevice* device; static int world_x; @@ -128,12 +122,14 @@ static Chunk* GetChunk(int cx, int cz) static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) { for (int i = -1; i <= 1; i++) - for (int j = -1; j <= 1; j++) { - int x = cx + i; - int z = cz + j; - neighborhood[i + 1][j + 1] = GetChunk(x, z); - SDL_assert(neighborhood[i + 1][j + 1]); + for (int j = -1; j <= 1; j++) + { + int x = cx + i; + int z = cz + j; + neighborhood[i + 1][j + 1] = GetChunk(x, z); + SDL_assert(neighborhood[i + 1][j + 1]); + } } } @@ -397,53 +393,59 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); for (int bx = 0; bx < CHUNK_WIDTH; bx++) - for (int by = 0; by < CHUNK_HEIGHT; by++) - for (int bz = 0; bz < CHUNK_WIDTH; bz++) { - Block block = chunk->blocks[bx][by][bz]; - if (block == BLOCK_EMPTY) - { - continue; - } - if (Block_IsSprite(block)) + for (int by = 0; by < CHUNK_HEIGHT; by++) { - for (int j = 0; j < 4; j++) - for (int k = 0; k < 4; k++) - { - Voxel voxel = Voxel_PackSprite(block, bx, by, bz, j, k); - CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); - } - continue; - } - MeshType mesh = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; - for (int j = 0; j < 6; j++) - { - int dx = DIRECTIONS[j][0]; - int dy = DIRECTIONS[j][1]; - int dz = DIRECTIONS[j][2]; - Block neighbor = GetNeighborhoodBlock(chunks, bx, by, bz, dx, dy, dz); - if (!IsVisible(block, neighbor)) - { - continue; - } - int ao[4]; - int order[] = {0, 1, 2, 3}; - for (int k = 0; k < 4; k++) - { - ao[k] = GetAO(chunks, bx, by, bz, j, k); - } - if (ao[0] + ao[3] > ao[1] + ao[2]) + for (int bz = 0; bz < CHUNK_WIDTH; bz++) { - order[0] = 1; - order[1] = 3; - order[2] = 0; - order[3] = 2; - } - for (int k = 0; k < 4; k++) - { - int vertex = order[k]; - Voxel voxel = Voxel_PackCube(block, bx, by, bz, j, vertex, ao[vertex]); - CPUBuffer_Append(&voxels[mesh], &voxel); + Block block = chunk->blocks[bx][by][bz]; + if (block == BLOCK_EMPTY) + { + continue; + } + if (Block_IsSprite(block)) + { + for (int j = 0; j < 4; j++) + { + for (int k = 0; k < 4; k++) + { + Voxel voxel = Voxel_PackSprite(block, bx, by, bz, j, k); + CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); + } + } + continue; + } + MeshType mesh = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; + for (int j = 0; j < 6; j++) + { + int dx = DIRECTIONS[j][0]; + int dy = DIRECTIONS[j][1]; + int dz = DIRECTIONS[j][2]; + Block neighbor = GetNeighborhoodBlock(chunks, bx, by, bz, dx, dy, dz); + if (!IsVisible(block, neighbor)) + { + continue; + } + int ao[4]; + int order[] = {0, 1, 2, 3}; + for (int k = 0; k < 4; k++) + { + ao[k] = GetAO(chunks, bx, by, bz, j, k); + } + if (ao[0] + ao[3] > ao[1] + ao[2]) + { + order[0] = 1; + order[1] = 3; + order[2] = 0; + order[3] = 2; + } + for (int k = 0; k < 4; k++) + { + int vertex = order[k]; + Voxel voxel = Voxel_PackCube(block, bx, by, bz, j, vertex, ao[vertex]); + CPUBuffer_Append(&voxels[mesh], &voxel); + } + } } } } @@ -466,13 +468,15 @@ static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) { - const Chunk* neighbor = chunks[i][j]; - SDL_assert(neighbor); - for (int k = 0; k < neighbor->light_size; k++) + for (int j = 0; j < 3; j++) { - CPUBuffer_Append(lights, &neighbor->lights[k]); + const Chunk* neighbor = chunks[i][j]; + SDL_assert(neighbor); + for (int k = 0; k < neighbor->light_size; k++) + { + CPUBuffer_Append(lights, &neighbor->lights[k]); + } } } UploadLights(chunk, lights); @@ -506,10 +510,12 @@ static void GenerateIndices() } static const int INDICES[] = {0, 1, 2, 3, 2, 1}; for (Uint32 i = 0; i < INDEX_COUNT / 6; i++) - for (Uint32 j = 0; j < 6; j++) { - Uint32 index = i * 4 + INDICES[j]; - CPUBuffer_Append(&indices, &index); + for (Uint32 j = 0; j < 6; j++) + { + Uint32 index = i * 4 + INDICES[j]; + CPUBuffer_Append(&indices, &index); + } } GPUBuffer_Upload(&gpu_indices, &indices); GPUBuffer_EndUpload(); @@ -666,11 +672,13 @@ void World_Init(SDL_GPUDevice* handle) StartWorker(&workers[i]); } for (int x = 0; x < WORLD_WIDTH; x++) - for (int z = 0; z < WORLD_WIDTH; z++) { - chunks[x][z] = CreateChunk(); - sorted_chunks[x][z][0] = x; - sorted_chunks[x][z][1] = z; + for (int z = 0; z < WORLD_WIDTH; z++) + { + chunks[x][z] = CreateChunk(); + sorted_chunks[x][z][0] = x; + sorted_chunks[x][z][1] = z; + } } SDL_qsort_r(sorted_chunks, WORLD_WIDTH * WORLD_WIDTH, sizeof(int) * 2, SortFunction, NULL); GenerateLights(); @@ -684,9 +692,11 @@ void World_Free() StopWorker(&workers[i]); } for (int x = 0; x < WORLD_WIDTH; x++) - for (int z = 0; z < WORLD_WIDTH; z++) { - FreeChunk(chunks[x][z]); + for (int z = 0; z < WORLD_WIDTH; z++) + { + FreeChunk(chunks[x][z]); + } } GPUBuffer_Free(&gpu_indices); GPUBuffer_Free(&gpu_empty_lights); @@ -717,37 +727,41 @@ static void Shuffle(int offset_x, int offset_z) Chunk* out[WORLD_WIDTH * WORLD_WIDTH] = {0}; int size = 0; for (int x = 0; x < WORLD_WIDTH; x++) - for (int z = 0; z < WORLD_WIDTH; z++) { - SDL_assert(chunks[x][z]); - const int a = x - offset_x; - const int b = z - offset_z; - if (IsChunkLocal(a, b)) - { - in[a][b] = chunks[x][z]; - } - else + for (int z = 0; z < WORLD_WIDTH; z++) { - out[size++] = chunks[x][z]; + SDL_assert(chunks[x][z]); + const int a = x - offset_x; + const int b = z - offset_z; + if (IsChunkLocal(a, b)) + { + in[a][b] = chunks[x][z]; + } + else + { + out[size++] = chunks[x][z]; + } + chunks[x][z] = NULL; } - chunks[x][z] = NULL; } SDL_memcpy(chunks, in, sizeof(in)); for (int x = 0; x < WORLD_WIDTH; x++) - for (int z = 0; z < WORLD_WIDTH; z++) { - if (!chunks[x][z]) + for (int z = 0; z < WORLD_WIDTH; z++) { - SDL_assert(size > 0); - Chunk* chunk = out[--size]; - SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); - SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_REQUESTED); - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); - chunks[x][z] = chunk; + if (!chunks[x][z]) + { + SDL_assert(size > 0); + Chunk* chunk = out[--size]; + SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); + chunks[x][z] = chunk; + } + Chunk* chunk = chunks[x][z]; + chunk->x = (world_x + x) * CHUNK_WIDTH; + chunk->z = (world_z + z) * CHUNK_WIDTH; } - Chunk* chunk = chunks[x][z]; - chunk->x = (world_x + x) * CHUNK_WIDTH; - chunk->z = (world_z + z) * CHUNK_WIDTH; } SDL_assert(!size); } @@ -800,22 +814,24 @@ static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) Chunk* neighborhood[3][3]; GetNeighborhood(x, z, neighborhood); for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) { - if (SDL_GetAtomicInt(&neighborhood[i][j]->block_state) != JOB_STATE_COMPLETED) + for (int j = 0; j < 3; j++) { - return false; + if (SDL_GetAtomicInt(&neighborhood[i][j]->block_state) != JOB_STATE_COMPLETED) + { + return false; + } } } Job job; if (do_voxel) { - job = (Job) {JOB_TYPE_VOXELS, x, z}; + job = (Job){JOB_TYPE_VOXELS, x, z}; SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_RUNNING); } else if (do_light) { - job = (Job) {JOB_TYPE_LIGHTS, x, z}; + job = (Job){JOB_TYPE_LIGHTS, x, z}; SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_RUNNING); } else @@ -835,22 +851,24 @@ void World_Update(const Camera* camera) Worker* local_workers[WORKERS] = {0}; int num_workers = GetWorkers(local_workers); for (int x = 0; x < WORLD_WIDTH; x++) - for (int z = 0; z < WORLD_WIDTH; z++) { - if (num_workers == 0) + for (int z = 0; z < WORLD_WIDTH; z++) { - return; - } - int a = sorted_chunks[x][z][0]; - int b = sorted_chunks[x][z][1]; - Worker* worker = local_workers[num_workers - 1]; - if (TryUpdateBlocks(a, b, worker)) - { - num_workers--; - } - else if (TryUpdateVoxelsOrLights(a, b, worker)) - { - num_workers--; + if (num_workers == 0) + { + return; + } + int a = sorted_chunks[x][z][0]; + int b = sorted_chunks[x][z][1]; + Worker* worker = local_workers[num_workers - 1]; + if (TryUpdateBlocks(a, b, worker)) + { + num_workers--; + } + else if (TryUpdateVoxelsOrLights(a, b, worker)) + { + num_workers--; + } } } } @@ -895,27 +913,29 @@ void World_Render(const Camera* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURende SDL_PushGPUVertexUniformData(cbuf, 0, camera->proj, 64); SDL_PushGPUVertexUniformData(cbuf, 1, camera->view, 64); for (int x = 0; x < WORLD_WIDTH; x++) - for (int y = 0; y < WORLD_WIDTH; y++) { - int a = sorted_chunks[x][y][0]; - int b = sorted_chunks[x][y][1]; - if (IsChunkOnBorder(a, b)) + for (int y = 0; y < WORLD_WIDTH; y++) { - continue; - } - Chunk* chunk = chunks[a][b]; - if (SDL_GetAtomicInt(&chunk->voxel_state) != JOB_STATE_COMPLETED) - { - continue; - } - float sx = CHUNK_WIDTH; - float sy = CHUNK_HEIGHT; - float sz = CHUNK_WIDTH; - if (!Camera_GetVisibility(camera, chunk->x, 0.0f, chunk->z, sx, sy, sz)) - { - continue; + int a = sorted_chunks[x][y][0]; + int b = sorted_chunks[x][y][1]; + if (IsChunkOnBorder(a, b)) + { + continue; + } + Chunk* chunk = chunks[a][b]; + if (SDL_GetAtomicInt(&chunk->voxel_state) != JOB_STATE_COMPLETED) + { + continue; + } + float sx = CHUNK_WIDTH; + float sy = CHUNK_HEIGHT; + float sz = CHUNK_WIDTH; + if (!Camera_GetVisibility(camera, chunk->x, 0.0f, chunk->z, sx, sy, sz)) + { + continue; + } + Render(chunk, cbuf, pass, flags); } - Render(chunk, cbuf, pass, flags); } } @@ -975,13 +995,15 @@ void World_SetBlock(const int position[3], Block block) int min_z = local_z == 0 ? -1 : 0; int max_z = local_z == CHUNK_WIDTH - 1 ? 1 : 0; for (int x = min_x; x <= max_x; x++) - for (int z = min_z; z <= max_z; z++) { - int cx = chunk_x + x; - int cz = chunk_z + z; - if (IsChunkLocal(cx, cz) && !IsChunkOnBorder(cx, cz)) + for (int z = min_z; z <= max_z; z++) { - RegenerateChunkVoxels(cx, cz); + int cx = chunk_x + x; + int cz = chunk_z + z; + if (IsChunkLocal(cx, cz) && !IsChunkOnBorder(cx, cz)) + { + RegenerateChunkVoxels(cx, cz); + } } } Chunk* neighborhood[3][3] = {0}; @@ -989,9 +1011,11 @@ void World_SetBlock(const int position[3], Block block) if (Block_IsLight(block) || Block_IsLight(old_block)) { for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) { - SDL_SetAtomicInt(&neighborhood[i][j]->light_state, JOB_STATE_REQUESTED); + for (int j = 0; j < 3; j++) + { + SDL_SetAtomicInt(&neighborhood[i][j]->light_state, JOB_STATE_REQUESTED); + } } } } diff --git a/src/world.h b/src/world.h index b2f67c15..ba382d58 100644 --- a/src/world.h +++ b/src/world.h @@ -12,19 +12,17 @@ typedef struct Camera Camera; typedef enum WorldFlags { - WORLD_FLAGS_OPAQUE = 0x01, + WORLD_FLAGS_OPAQUE = 0x01, WORLD_FLAGS_TRANSPARENT = 0x02, - WORLD_FLAGS_LIGHT = 0x04, -} -WorldFlags; + WORLD_FLAGS_LIGHT = 0x04, +} WorldFlags; typedef struct WorldQuery { Block block; int current[3]; int previous[3]; -} -WorldQuery; +} WorldQuery; void World_Init(SDL_GPUDevice* device); void World_Free(); From 762a3d5b3e1d6d46a6311783c900a428d00aa5bb Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 14:57:10 -0400 Subject: [PATCH 22/39] reformat --- .clang-format | 12 +- CMakeLists.txt | 2 +- shaders/bin/depth.frag.json | 2 +- shaders/bin/depth.frag.spv | Bin 828 -> 156 bytes shaders/bin/depth.vert.json | 2 +- shaders/bin/depth.vert.spv | Bin 17320 -> 1804 bytes shaders/bin/opaque.frag.json | 2 +- shaders/bin/opaque.frag.msl | 186 ++++++++--------- shaders/bin/opaque.frag.spv | Bin 52712 -> 10080 bytes shaders/bin/opaque.vert.json | 2 +- shaders/bin/opaque.vert.msl | 18 +- shaders/bin/opaque.vert.spv | Bin 20872 -> 2744 bytes shaders/bin/raycast.frag.json | 2 +- shaders/bin/raycast.frag.spv | Bin 1340 -> 336 bytes shaders/bin/raycast.vert.json | 2 +- shaders/bin/raycast.vert.msl | 10 +- shaders/bin/raycast.vert.spv | Bin 14432 -> 1988 bytes shaders/bin/shadow.vert.json | 2 +- shaders/bin/shadow.vert.msl | 7 +- shaders/bin/shadow.vert.spv | Bin 20916 -> 2740 bytes shaders/bin/sky.frag.json | 2 +- shaders/bin/sky.frag.spv | Bin 17220 -> 1488 bytes shaders/bin/sky.vert.json | 2 +- shaders/bin/sky.vert.msl | 16 +- shaders/bin/sky.vert.spv | Bin 14580 -> 2096 bytes shaders/bin/transparent.frag.json | 2 +- shaders/bin/transparent.frag.msl | 181 ++++++++-------- shaders/bin/transparent.frag.spv | Bin 52668 -> 10288 bytes shaders/bin/transparent.vert.json | 2 +- shaders/bin/transparent.vert.msl | 22 +- shaders/bin/transparent.vert.spv | Bin 20716 -> 2680 bytes shaders/bin/ui.frag.json | 2 +- shaders/bin/ui.frag.msl | 16 +- shaders/bin/ui.frag.spv | Bin 5484 -> 1408 bytes shaders/bin/ui.vert.json | 2 +- shaders/bin/ui.vert.msl | 32 +-- shaders/bin/ui.vert.spv | Bin 10280 -> 2548 bytes shaders/opaque.frag | 20 +- shaders/shader.hlsl | 115 ++++++----- shaders/shadow.vert | 2 +- shaders/transparent.frag | 10 +- shaders/ui.vert | 3 +- src/block.c | 330 ++++++++++++++++++------------ src/block.h | 2 + src/camera.c | 18 +- src/camera.h | 9 +- src/direction.h | 15 +- src/main.c | 9 +- src/player.c | 3 +- src/rand.c | 3 +- src/save.c | 55 +++-- src/shader.c | 8 +- src/sky.c | 6 +- src/voxel.c | 9 +- src/world.c | 30 ++- src/world.h | 6 +- 56 files changed, 657 insertions(+), 524 deletions(-) diff --git a/.clang-format b/.clang-format index eb578320..a08ce114 100644 --- a/.clang-format +++ b/.clang-format @@ -1,10 +1,18 @@ BasedOnStyle: Microsoft +AlignAfterOpenBracket: AlwaysBreak +AlwaysBreakBeforeMultilineStrings: true +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false BreakBeforeBraces: Allman -ColumnLimit: 0 +BreakStringLiterals: false +BinPackArguments: false +BinPackParameters: false +ColumnLimit: 100 +Cpp11BracedListStyle: true IndentWidth: 4 MaxEmptyLinesToKeep: 1 PointerAlignment: Left SortIncludes: Never UseTab: Never BracedInitializerIndentWidth: 4 -ContinuationIndentWidth: 0 +ContinuationIndentWidth: 4 diff --git a/CMakeLists.txt b/CMakeLists.txt index c4aa1c03..a92847b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ function(add_shader FILE) function(compile OUTPUT) add_custom_command( OUTPUT ${OUTPUT} - COMMAND ${SHADERCROSS} ${HLSL} -s hlsl -o ${OUTPUT} -I shaders -g + COMMAND ${SHADERCROSS} ${HLSL} -s hlsl -o ${OUTPUT} -I shaders WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} DEPENDS ${HLSL} ${DEPENDS} COMMENT ${OUTPUT} diff --git a/shaders/bin/depth.frag.json b/shaders/bin/depth.frag.json index ec4afe4f..5da52262 100644 --- a/shaders/bin/depth.frag.json +++ b/shaders/bin/depth.frag.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0 } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0, "inputs": [], "outputs": [] } diff --git a/shaders/bin/depth.frag.spv b/shaders/bin/depth.frag.spv index 069321632f57044f29283d996b309004e62c6594..b893138e1f0d7c3506e34227ef04dbec794a03a8 100644 GIT binary patch literal 156 zcmYj~I}U&_3`0!9Yp zXP=#f|DCojyi>}!Fty2@?qx3Qj+5TVg)WzJVPB`&usN{mHqWi*wWmqk4_N&BkDB*X z^PX!S>dry=L$eB%1^8TyQTxHFG}RXNJZ>*UcmJ^6KKgb1&iN)5VFdDbUOJE$LD57Y z{{^Xw4x&~dT^ieIAO|j;%E4G=nKsgDmrQI=OJ%KkbVan!DVA*AsPj2iD`I=tsZR|bQzEAhFppqA?16l0`-qbB6<~Y~;QXmY4*3LY@QtX;9?RO~ zGj9a226^m{?{k2gu{Q6+#rwR#+r(bpX$v;5M5QYzsfFp>=;DiY{qY)=Wks*KuJEEl)TNY48i-d}xC?BNr+cz5rLL4xe_G|YXE1f=NKfV)9Y~~cw0F1a4ef5kj2?c9 z=uLnkc?InKFMHdSH;wvEv$eZ?u(Pw>N~xEqF;A`4e6KEMXiER2W<0&b|Hos@^R~YI zSuKwp9>sGE{AixOWX!Yj?x69Z*8EuCuQz?1e8AHhC>E+JFgtQ|88{}fnCUl&J- zpT;uB*$(6Pqf3ZKe*j%Vx)AI2eWxeD%8NzP-DzV*2*$K7?;i?qm4&q}_#> z@85xUDKjwHhcQnH`9=0s^gOw~;~HXpmA}mi^mRmjzpY}Pz1~2KHSzrpH*+lNZsA9r zdk}TEv5iID6t-B6``o!Zh+OWbu?GBQ^j*Z*58hy(6~tcMsh>G^FUQ@hy}Yk!Z1JeO zk8Pd17IhD>#of24dx$L_b&s&Ea|fgDF}8T;eKYvt@t!Bx_8^}z-|ahR5#RKU-u0g% z=89Lr+=FLG5sA6CccP6)&U51N|G^oXGmnVBq}p$@fXMF&Y!O?`T?lL`$Nc^^Sl#0) jV!ioGi2ozL!)t6AG46eVt>pL|dV#HT@5Fv{(=75A`hIOf literal 17320 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 _650 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _110 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -114,167 +114,153 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _732 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _758 = spvUnsafeArray({ blockBuffer._m0[_732].Indices[0], blockBuffer._m0[_732].Indices[1], blockBuffer._m0[_732].Indices[2], blockBuffer._m0[_732].Indices[3], blockBuffer._m0[_732].Indices[4], blockBuffer._m0[_732].Indices[5] }); - spvUnsafeArray _661 = _758; - bool _787 = blockBuffer._m0[_732].IsSprite != 0u; - uint _801; - if (_787) + uint _128 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + bool _137 = blockBuffer._m0[_128].IsSprite != 0u; + uint _142; + if (_137) { - _801 = 0u; + _142 = 0u; } else { - _801 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + _142 = in.in_var_TEXCOORD2 & 7u; } - float3 _815 = float3(in.in_var_TEXCOORD1, float(_661[_801])); - float4 _825 = atlasTexture.sample(atlasSampler, _815.xy, uint(rint(_815.z))); - if (_825.w < 0.001000000047497451305389404296875) + float3 _148 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_128].Indices[_142])); + float4 _152 = atlasTexture.sample(atlasSampler, _148.xy, uint(rint(_148.z))); + if (_152.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _840 = _825.xyz; - uint _875 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_787 ? 6 : 0); - uint _891 = uint(UniformBuffer.LightCount); - float3 _906; - float3 _909; - _906 = _659; - _909 = float3(0.0); - float3 _907; - float3 _910; - for (uint _911 = 0u; _911 < _891; _906 = _907, _909 = _910, _911++) + uint _161 = (in.in_var_TEXCOORD2 & 7u) + uint(_137 ? 6 : 0); + uint _166 = uint(UniformBuffer.LightCount); + float3 _168; + _168 = float3(0.0); + float3 _169; + for (uint _171 = 0u; _171 < _166; _168 = _169, _171++) { - float _947 = float((lightBuffer._m0[_911].Color & 4278190080u) >> 24u); - float3 _965 = (float3(float(lightBuffer._m0[_911].X), float(lightBuffer._m0[_911].Y), float(lightBuffer._m0[_911].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _969 = length(_965); - if (_969 >= _947) + float _184 = float((lightBuffer._m0[_171].Color & 4278190080u) >> 24u); + float3 _191 = (float3(float(lightBuffer._m0[_171].X), float(lightBuffer._m0[_171].Y), float(lightBuffer._m0[_171].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _192 = length(_191); + if (_192 >= _184) { - _907 = _906; - _910 = _909; + _169 = _168; continue; } - float _988 = fast::clamp(dot(_650[_875], _965 / float3(_969)), 0.0, 1.0); - if (_988 <= 0.0) + float _199 = fast::clamp(dot(_110[_161], _191 / float3(_192)), 0.0, 1.0); + if (_199 <= 0.0) { - _907 = _906; - _910 = _909; + _169 = _168; continue; } - float3 _1034 = float3(float((lightBuffer._m0[_911].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_911].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_911].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _907 = _1034; - _910 = _909 + ((_1034 * _988) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_969 / _947, 0.0, 1.0)))); + _169 = _168 + ((float3(float(lightBuffer._m0[_171].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_171].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_171].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _199) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_192 / _184, 0.0, 1.0)))); } - float _1369; + float _342; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1369 = 0.0; + _342 = 0.0; break; } - float _1141; - if (blockBuffer._m0[_732].HasOcclusion != 0u) + float _246; + if (blockBuffer._m0[_128].HasOcclusion != 0u) { - _1141 = fast::clamp(-dot(_650[_875], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _246 = fast::clamp(-dot(_110[_161], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1141 = 0.7070000171661376953125; + _246 = 0.7070000171661376953125; } - if (_1141 <= 0.0) + if (_246 <= 0.0) { - _1369 = 0.0; + _342 = 0.0; break; } - float4 _1160 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1170 = _1160.xyz / float3(_1160.w); - float2 _1180 = (_1170.xy * 0.5) + float2(0.5); - float _1186 = 1.0 - _1180.y; - float2 _1188 = _1180; - _1188.y = _1186; - float _1192 = _1180.x; - bool _1204; - if (!(_1192 < 0.0)) + if (blockBuffer._m0[_128].CanBeInShadow == 0u) { - _1204 = _1192 > 1.0; + _342 = blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w; + break; + } + float4 _258 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _262 = _258.xyz / float3(_258.w); + float2 _265 = (_262.xy * 0.5) + float2(0.5); + float _267 = 1.0 - _265.y; + float2 _268 = _265; + _268.y = _267; + float _269 = _265.x; + bool _274; + if ((isunordered(_269, 0.0) || _269 >= 0.0)) + { + _274 = _269 > 1.0; } else { - _1204 = true; + _274 = true; } - bool _1214; - if (!_1204) + bool _279; + if (!_274) { - _1214 = _1186 < 0.0; + _279 = _267 < 0.0; } else { - _1214 = true; + _279 = true; } - bool _1224; - if (!_1214) + bool _284; + if (!_279) { - _1224 = _1186 > 1.0; + _284 = _267 > 1.0; } else { - _1224 = true; + _284 = true; } - bool _1236; - if (!_1224) + bool _290; + if (!_284) { - _1236 = _1170.z < 0.0; + _290 = _262.z < 0.0; } else { - _1236 = true; + _290 = true; } - bool _1248; - if (!_1236) + bool _296; + if (!_290) { - _1248 = _1170.z > 1.0; + _296 = _262.z > 1.0; } else { - _1248 = true; + _296 = true; } - if (_1248) + if (_296) { - _1369 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1141; + _342 = (blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w) * _246; break; } - uint2 _1259 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1275 = float2(1.0) / float2(float(_1259.x), float(_1259.y)); - float _1283 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1141)); - float _1292; - int _1295; - _1292 = 0.0; - _1295 = -1; - float _1293; - for (; _1295 <= 1; _1292 = _1293, _1295++) + uint2 _301 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _307 = float2(1.0) / float2(float(_301.x), float(_301.y)); + float _310 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _246)); + float _312; + int _315; + _312 = 0.0; + _315 = -1; + float _313; + for (; _315 <= 1; _312 = _313, _315++) { - _1293 = _1292; - for (int _1311 = -1; _1311 <= 1; ) + _313 = _312; + for (int _323 = -1; _323 <= 1; ) { - _1293 += shadowTexture.sample_compare(shadowSampler, (_1188 + (float2(float(_1295), float(_1311)) * _1275)), _1170.z - _1283, level(0.0)); - _1311++; + _313 += shadowTexture.sample_compare(shadowSampler, (_268 + (float2(float(_315), float(_323)) * _307)), _262.z - _310, level(0.0)); + _323++; continue; } } - _1369 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1141) * mix(1.0, _1292 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _342 = ((blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w) * _246) * mix(1.0, _312 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1395; - if (blockBuffer._m0[_732].IsFullbright != 0u) - { - _1395 = _840; - } - else - { - _1395 = _840 * ((_909 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1369)); - } - float3 _1402 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_1395, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1402.y, length(float2(_1402.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _351 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_152.xyz * ((_168 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_342)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_351.y, length(float2(_351.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 33cbbd45e99eda322928cdba9dc7dcd58e61e4ae..c5690bb268bf1ef5e06e058094394da318db8fdd 100644 GIT binary patch literal 10080 zcmaKw2Vj=f6^4HZgds9iridUSA{db&OGXF?Q6!Nd%lQK#L_!iXP{dX&YVESNwY#=f zJ5W1p?XcD=wZqzK_qIc;9d-|KTl+lUe^2;~+FRb9bKZ0Ax#!ORi)B5>_bC*56bglb zg-aE*A%&h9qnw6)P@z1tm#wHAgqV`$x|C-&RH3@P zuC=YPBb!4x^ES>cSzc_f*|e#tv%Rq;Ti5908se+V%0rJnu6tFnd2xMpbI#W{%jbS< zw352c=IZ8-`sVh=j-6TG-kIOMsBYfexT(IKT6-4`jrh_mVEPpfgUj~gWpiB7*s!%D zo8wSoN|tr?E@<1TTAEtijB?gN&iSp&+0JQw&UP*vfVB)mHaS99Eqw~Z;j&uJY;N4b zu}LoSmuEiQr8=rwI-5I6dpZKHTR7SK6h^*ku9DAOr3GExR%~u}IQo?rM!ibD!~ah{ zeYV=B;?DZE+7`AU+gbH$EgTgB?7>#AyMRxQci0@u&8)y;PzRJOLB zt8Tt&;qz_i=9?Zq--wpZj%>iXHRr7^wl&muFrwr6mb}czh~6>h8Sjv>M`CAdS9%Z9 zLsH5!_Emh#(%aSS{TYuE&o0a!#=l$OGykA>?PvH38zr0^tf6UK&r9W@$x7pu&lJ{%p z$M@Xl{o48QU8}rbJ3qdy|T*eXZMi)U79K zwocoD{JpZ;<)R*A%wzq&v9^e}UOC6s@4IOWf1dNqm&WbY73Uh7!+wz?-owbDUoQOd zzJ=d0|?NPVNcAg-3x~k ze=NFv%s+)y)}93HBaDrH$DtPryYGp($ygDmFL=+5{lXXg@o>g<=PMEyeIovZ#7Cc~ z!!@8S97_E>m)YDU^lN7ibI$fLcAdjN1Ks(CJrli8&OQmf9GHI=ax94c+OvVp{@QbZ z`yBRM^nCn0?EH8qWBZ;*{CsrBJB%y~kdug3E(Ea_i_l};lu>&nI_<@<7h`w_!miSp zvzMStgnucfZ${Xs=qDiTWmuj~ZO_Sa@Wcxo(^85g?}aXgAc5jA9hX2UJ!OIHaoLO+dV%6^arD{S0O#eawGZPlebRy z#9EcMkYnjnSE91mQAGLn$gfVkwz>Q*&F4z)m*hG#k;YojIHWatuEwz1zU$g~nA5l; z*!!c9#*9H9g4DK_HAw518^ek5tu%-07qI_$Y<>3k9n`k}TBQBu^bJSaPv1JEJ~`io z^+;>#1xE1y8<29^_Vw+Pv+r3*`^xF_-E;l*osHBdXU)D_=E=jjbKs2AuYE4E2QW_i zykvXEw9ikr^VcpW+nTjEBFljN4<+*^S@hetXBK+>(sGRMd`Rx*Z_r`CPu-zNiwg)i3d*itX`+Ri2 zDZ(zIm*?z_=&rjt?62K7*{=O|bp77rDa>5i3?>18bEW`)ODcfB5z0K`jc9>?Xwdx& zD;UXrYX#xE5Pi-yk9NH;ZP6FD7RGzriRBw7uZ*}I=$G%_ zJyOwy==s>`x!5bv^+)WL-D0gH@?M3m-`Gav>p?!RYZ&voI{9y94hzuV0IbV8pJIjH zh_pS+I_P^7cr$RVl`;3Xpt~M3!87>mXN>WATYf)vxrWyO$1%qK=BwmnyKZj<`IX75O);%$f8K^IcLwutzupeqQ(JKFK$r8L)v}wuHP-=S^_j!`{gLkk2PJy|@?GFy zu!j7;d+!Fu$gd@rXX-sb-ki1=_r2))Ja2cTb$%bZ`~=`SzaMFHo%MYH$hn5<&r`L! zTn%ev?bieI3Y+utKE$4U5Iy$fW@?;;{UP8!&Ihx>rHtoZ+yM0LratWt1N+|qD&gvp zH-dgZpX+1|HvxHL{0;aB7y-;}jAMQj$j4Y8OPuH8A5iHUa$x_*PFpDAkNIK z=$;vUp8)!9V{FgvCxL$RKgrmiLh84UZ7w)@>A zo4|9aZvb~i?ml3BlY#zYz(jCYs`Fdu#>iXe{Yaa2>iag3vo7^~o$}V>INt&Lfb)&9 zA3%?>^~c!Ze=zwyU*WTl>ut{O0&6uc&dvAGJvUV#&dB%C<*!Wret<5w14O?cqT6o? zi1YR%bor$qa{U-xK63p8T`r&Nr`YB?1w^i&q027=k?ZH^@{#Ko=yK+Y{rx4n^*WCJ zYnX%Q^C6(my$SADiFaM%9RC`9FVL6Y8_&{yUM+L^mKftXQ@W4#bN}Mq^G)&oPY3z; z$v49{t^xTQFb2#6z7y+_zXkGfhaOIxyv_aZ35*|zd;|hRrb#QqbA95Ely+~djTUHCJ)?K$*m$iD#Z zfimvTU(xO3`L)mAkT&m+zP|%G`>DIO=GB&u?~i|=UjZD)JpV-6%%ksL;NQT0O7j?_ ztuNky|DfLlod0F?bxuzJ`M7uc(c@m~v-XJ~pVQp__SpZ)OfS{29NqC_{!b-;%>QX@ zn|14Z2FO{bdVc=$x3KREkk5jvK+OL+bennfJrCr}qaJta1@xS)^wbZPyC$|2_&?83~wtN{}-0@!8Im8+5onno* zDI7cA_;Lti>|aAY)%g0L%eSK2P_y?zUtbLUQ_+1N(>jc|e~dW- zUB6?FMA{rveiV>%O!b)O;pnl(ju|n^7;`kbV_Jvt_Kz`-K-ce>V~{q-ls^*4Ii`B- z(^z!Rif1b3J`P(x<{tf&QO8l})?sbNn=|SdkFMW3jz-$7Lw*8~vkvvB;~4a)Bi3Ug zoP6wi^ixJ1$D&(@wHa?t$DM?d$gX3CZbN%BPvOR@Dw4W}f3 z)S%y7^46dpe+w)_xBjq~qnj)Cq8i;8dDqyzI2B#qJ&8B;G<4rWeQ~B&pvRexJv$vv z-aYZ}<+0>jiT()E@0<>9dWt`tyTe#=dJCYI)7#K zaX(}K@@K>SiZfM4) zc|H?c-h9><-$ly({8tCh?izfqjo(hCH>*(aH{Wjn@3QyZJkBY;lh>j@jQ_R3H9Z!& z4sI_}U;HkwM>l^UVmH7UuirV@|19+Dk^18I`)qW-7laKn+sjJ&T!4NK#Au}Nh~Kj2 zITubo{-!(+-8}O4Yar%)^f5@!e0*mY;pAiNjp%a1rtlm^j!h8em;)lmW;prCQI9Ss zYzlM48Q%h7ee%IIBo3;J+nPB0#@%X!Gge>xt$YDG|FXZ8^$$qz)3(Hq#OIjCxfkw# z6T1Eu^f+JJvE|#~VlSJqGH8)FM@XX2!TyCiX?y(@k5?t-(w@%pXD|CZbbsZYJHI(UIu%?AGiHxA*+ literal 52712 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 _295 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); +constant spvUnsafeArray _57 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); struct main0_out { @@ -80,15 +80,15 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _408 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _410 = float4(_408.x, _408.y, _408.z, _296.w); - float4 _426 = UniformBuffer_1.View * float4(_408, 1.0); - _410.w = _426.z; - out.gl_Position = UniformBuffer.Proj * _426; - out.out_var_TEXCOORD0 = _410; + float3 _80 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _81 = float4(_80.x, _80.y, _80.z, _58.w); + float4 _88 = UniformBuffer_1.View * float4(_80, 1.0); + _81.w = _88.z; + out.gl_Position = UniformBuffer.Proj * _88; + out.out_var_TEXCOORD0 = _81; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _295[(in.in_var_TEXCOORD0 >> 8u) & 3u]; + out.out_var_TEXCOORD3 = _57[(in.in_var_TEXCOORD0 >> 8u) & 3u]; return out; } diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index 4d8834b6ce2bfac41f2ca831ec5fd8d68885a0dd..610f31f965f87401137220c72bb457b6d9e12cfa 100644 GIT binary patch literal 2744 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 literal 1340 zcmY*YYflqF6dg(ttlJhuK*h%(K3ZY7ZEO%B)fhEOOpLL}*Uhx-wxwlvGqWu*#>5|p z|Hm&Tp0nMJb(*tt@7&k9cc$~X?L{Hxgb*dMgD=;L$R#HQu_W4`Pu!0mzPLdcxW+qI zK|JWXgTN2rcMU&AehPzjYI53rb?Ry7t=Ad%j^O4r>UHKUiFs~`e_31+dB{27Tnz%A z)4Gf=&p-$$Cq8cuYF~|~P3=snz|rTTzEEbA|}mSdduSi^n>cW@uI#PTk*?v)^gbD$@NZ7Lxk;q^GRcMfACZb1rhdiv2>XDDpJ) z1;Ln3^LeAO|Ln!oXA_eaLfY>VUeZ32Y2(s9mXUGy+`6<)G|&@i`zD&${z%2K7ueb} z;aGP)TWO5Qq}Eg3PHQqA4OL)Y4C1~$^+FBuv9M2j5MV>LLWJYknJDf28wYLq|L*WT zbo$-{xYnUjmcR~dl!3ab=fC-Aa4tEqR%S8IQB>GtdYf& z8*K!8VSn^zA6fiO$h4C;b2Fy}Hr#Ikv@s9gDt#GGKj!0k7RTHcevG>fFpfLl6#HNt zW3riXRvFK`km)}JSd)4AU*Ox{OXtHGaB;4`aj#FXXFXIPGu{IjPhShn$fXL<#v0_q h`Eu4TaYvj#- _190 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _191 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _54 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _55 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -65,9 +65,9 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4 _255 = UniformBuffer.Transform * float4(_190[_191[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); - _255.z = 0.100000001490116119384765625; - out.gl_Position = _255; + float4 _73 = UniformBuffer.Transform * float4(_54[_55[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); + _73.z = 0.100000001490116119384765625; + out.gl_Position = _73; return out; } diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index d98da8c859b832c19592bceb3a995f00df4bbaae..43cafc9ebc3631599f84d445628b2a9566aa9405 100644 GIT binary patch literal 1988 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 3u) & 31u; out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); - out.gl_ClipDistance[0u] = (blockBuffer._m0[_411].HasOcclusion != 0u) ? 1.0 : (-1.0); + out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].HasShadow != 0u) ? 1.0 : (-1.0); out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; } diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index 34510a9cd735d6faf0a87ec679b9e53a30c458d9..e3df2979cede1134b54efa29bd0be8b95416b073 100644 GIT binary patch literal 2740 zcmaKs*>Y4>6oz*?6HY;d5LAer#2IW+6j5YI0w(R0Km*3iL5n+l17E}P zA*}MoSMtWv?>l`~a*9g1Q!8uz{~GpMd+*cZm8I#F#!^Z%>3jaWj-*P?sH@%=OF8zo+RRqk z^{nJOl-IN8AMB(t%<9>oo%K6|hk5Q~?st}Yw%uv9`}8_V7e)MNik$I8@)>Vuot7>uKdUu%J z+w3y!=n(De8TfRlVz8D*YLBy?Tsh7f za^8RBI-i{99Gp3F&z3mfmE1AJJ`SVp;|yY+ewQ(>bz*`$0bb)I#pAhe|DEl}?{l8< zXzz)=_h?Vnuy^Nh&v;|y8o`xo1Q#{LQ6t`0)Nl_u{l~HGql%nn9_=HDEAVqUdURzD z|50pXoN*THSyd62@#5JW?c?KM?<)Lr*yacJ>^x`dJ&&#;5ifoLaTzau5edKhokW~B z>Yc)Vsf2yo-evgp{aeCSYjCdlzzIbG>spb6-ZAE2q!d!uLwyle6xtXwSrWW4%{7>%3O*a?bWT+8(?Q z{coVX2YKVegW-!HdgEz_`4F=x&0jp>}>vS1a=l}_ch;Hw8skUES|NT@4$Y~At^oj!@l0b zGT+(boxERg=eb4awU*2I|0eo8`VzV3e1KScnHS^C7ZCgN?JCB31|K5&x?p?wsNf>+ zA~^DV=aKg@w!X-_ge|wpetwge5o`JF>dUC_U0gx*{mBgWc@?o&znQ-ZZW;S3;&-!K z^tFO5A9<_T=J_o}-ZgA_zo*E%jx8T~pJ1C;MIvtvTfV&CI#@pDsbkxN_4GNnbAF0A z(=YTc{tPizKKA?^+db!y*z*f)dG}oArFq|9BEC8AN5A(S_ql%uTRwv>ej_%io}m_k9boXIF5yvE_VU!QCmi3VM?+7tvoK<{Piy-{oJat8WX@ z?|#93UGVn#J8^z%-yqI5i~Pphv8QhldF!1+F7uN8R?K%czwz%7dofSH*t~z}`U3JF DxS_kl literal 20916 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 diff --git a/shaders/bin/sky.frag.json b/shaders/bin/sky.frag.json index d4b79af1..67f0a885 100644 --- a/shaders/bin/sky.frag.json +++ b/shaders/bin/sky.frag.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1 } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float3", "location": 0 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }, { "name": "out.var.SV_Target1", "type": "float4", "location": 1 }] } diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index 8873f8a1de2436ad989a7c90a9abe1cf3fc53f53..552efff3f1e665659c384731ac23c50e8ccc8f8a 100644 GIT binary patch literal 1488 zcmZXU-A=bC$8ZCLFav3mzXN)FT!wI(wk%1Y3>mKaai!WM@y>_R$(c9ar zcLIDmi4hK!UJE;u_^PbDJE*qz&GF~3FWgqU)A-n?d(2hCdh>Oo-s&c&?f*}kM1y&a zR`ElvQ>;GSeNrwz-%RePKJU=(b(3J_<*RC~^S0h4YRtR+7rSFD{nso?`1Y6sE`93` z`qt9-e#X^04?GwB0=8?54&K|faJU_Do|l^dG0)k{Z&*7`ldg`{G^I2jF`jbEngP23H znvD-4&&gA8)-$d@#cn^f>Yrv;uji)7oMtb;%&=>lGs|ubbJTT)U0rgI@a^FnMc*FQ zw2yIncn7)Y`^Nflj%Trd6wPVhuGf0Ph%esQ+@G zw~skjfH{5__A%!wkdHanu+52D%()Kacc|lg+yI`F&+^*l+yrXc0LHW2NPZE>J9G7z z_nA7zmVj|%U;EsxKJT0CP}}(xfqX=k)AF~0wT(L;=dAs#UuzlL99QJ{H*s_>a(DZj h^V~tVZ+H)Q-hAW!?X5Byzb#|hepmjD{6@t?@CUVtSC9Yz literal 17220 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 _187 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _188 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _54 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _55 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -66,12 +66,12 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4x4 _216 = transpose(UniformBuffer_1.View); - _216[0].w = 0.0; - _216[1].w = 0.0; - _216[2].w = 0.0; - out.gl_Position = UniformBuffer.Proj * (float4(_187[_188[gl_VertexIndex]], 1.0) * _216); - out.out_var_TEXCOORD0 = _187[_188[gl_VertexIndex]]; + float4x4 _59 = transpose(UniformBuffer_1.View); + _59[0].w = 0.0; + _59[1].w = 0.0; + _59[2].w = 0.0; + out.gl_Position = UniformBuffer.Proj * (float4(_54[_55[gl_VertexIndex]], 1.0) * _59); + out.out_var_TEXCOORD0 = _54[_55[gl_VertexIndex]]; return out; } diff --git a/shaders/bin/sky.vert.spv b/shaders/bin/sky.vert.spv index c1756029cd79e5dd966b6336e33b43f8cf7e5e6b..171aca9805e3d1f6a3e82e385dd1ca3a0566ec1c 100644 GIT binary patch literal 2096 zcmZ{k+foxj5Qc{&fJYFKgNm>*o{8~{C_;dM33@@K)Z!L(Q?*(oR!FqG^AUU_U&|Y- z{J+_0T`3)^)BXS5)6>(_OFmZ`c5c8qH{zb_mo?^cfysM}chnvEZSU_TZ9q;!M8WI4 z86E`~tNiXTN4^nva-;Mw925^uO|Or%u0D`Lx%qyxiQaZEx>v z-1d74zBkr`x^7P&j!SMx!1M&n0+VajqZCv7MG1Yy4=zerU~0j=VbFPh9lX$o#CQv zzBlS&o+62z2e!Aj_)FrL#Tmt4mgY_1%zq_d{8wdD6CCe*O`7+mo@xDFmxcq+hS`IQ z#PFSPPin=-Oqp*!_~3{wOH*^&&w{%to1Tyxe(_qAoBsac?l^-X0XxB3p2u8M8QTEC2+(MgN=?PJqfH6>SjIh-4M)w!)dQE4ZtCuQ o7YzyfiO0|X;cv=|Z%cxodm8sF@YF#6xicI#bIh4Pb?Tzz7f3~HssI20 literal 14580 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 rR)=>#;T^EN9pG_K-GY|3#M^)~zY@z _653 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _110 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -113,157 +113,152 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _739 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _765 = spvUnsafeArray({ blockBuffer._m0[_739].Indices[0], blockBuffer._m0[_739].Indices[1], blockBuffer._m0[_739].Indices[2], blockBuffer._m0[_739].Indices[3], blockBuffer._m0[_739].Indices[4], blockBuffer._m0[_739].Indices[5] }); - uint _809 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _813 = blockBuffer._m0[_739].IsSprite != 0u; - uint _818 = _809 + uint(_813 ? 6 : 0); - spvUnsafeArray _666 = _765; - uint _836 = _813 ? 0u : _809; - float3 _852 = float3(in.in_var_TEXCOORD1, float(_666[_836])); - float4 _862 = atlasTexture.sample(atlasSampler, _852.xy, uint(rint(_852.z))); - float _870 = _862.w; - uint _882 = uint(UniformBuffer.LightCount); - float3 _897; - float3 _900; - _897 = _664; - _900 = float3(0.0); - float3 _898; - float3 _901; - for (uint _902 = 0u; _902 < _882; _897 = _898, _900 = _901, _902++) + uint _130 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _139 = in.in_var_TEXCOORD2 & 7u; + bool _140 = blockBuffer._m0[_130].IsSprite != 0u; + uint _143 = _139 + uint(_140 ? 6 : 0); + uint _146 = _140 ? 0u : _139; + float3 _152 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_130].Indices[_146])); + float4 _156 = atlasTexture.sample(atlasSampler, _152.xy, uint(rint(_152.z))); + float _158 = _156.w; + uint _161 = uint(UniformBuffer.LightCount); + float3 _163; + _163 = float3(0.0); + float3 _164; + for (uint _166 = 0u; _166 < _161; _163 = _164, _166++) { - float _938 = float((lightBuffer._m0[_902].Color & 4278190080u) >> 24u); - float3 _956 = (float3(float(lightBuffer._m0[_902].X), float(lightBuffer._m0[_902].Y), float(lightBuffer._m0[_902].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _960 = length(_956); - if (_960 >= _938) + float _179 = float((lightBuffer._m0[_166].Color & 4278190080u) >> 24u); + float3 _186 = (float3(float(lightBuffer._m0[_166].X), float(lightBuffer._m0[_166].Y), float(lightBuffer._m0[_166].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _187 = length(_186); + if (_187 >= _179) { - _898 = _897; - _901 = _900; + _164 = _163; continue; } - float _979 = fast::clamp(dot(_653[_818], _956 / float3(_960)), 0.0, 1.0); - if (_979 <= 0.0) + float _194 = fast::clamp(dot(_110[_143], _186 / float3(_187)), 0.0, 1.0); + if (_194 <= 0.0) { - _898 = _897; - _901 = _900; + _164 = _163; continue; } - float3 _1025 = float3(float((lightBuffer._m0[_902].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_902].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_902].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _898 = _1025; - _901 = _900 + ((_1025 * _979) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_960 / _938, 0.0, 1.0)))); + _164 = _163 + ((float3(float(lightBuffer._m0[_166].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _194) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_187 / _179, 0.0, 1.0)))); } - float _1360; + float _337; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1360 = 0.0; + _337 = 0.0; break; } - float _1132; - if (blockBuffer._m0[_739].HasOcclusion != 0u) + float _241; + if (blockBuffer._m0[_130].HasOcclusion != 0u) { - _1132 = fast::clamp(-dot(_653[_818], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _241 = fast::clamp(-dot(_110[_143], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1132 = 0.7070000171661376953125; + _241 = 0.7070000171661376953125; + } + if (_241 <= 0.0) + { + _337 = 0.0; + break; } - if (_1132 <= 0.0) + if (blockBuffer._m0[_130].CanBeInShadow == 0u) { - _1360 = 0.0; + _337 = blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w; break; } - float4 _1151 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1161 = _1151.xyz / float3(_1151.w); - float2 _1171 = (_1161.xy * 0.5) + float2(0.5); - float _1177 = 1.0 - _1171.y; - float2 _1179 = _1171; - _1179.y = _1177; - float _1183 = _1171.x; - bool _1195; - if (!(_1183 < 0.0)) + float4 _253 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _257 = _253.xyz / float3(_253.w); + float2 _260 = (_257.xy * 0.5) + float2(0.5); + float _262 = 1.0 - _260.y; + float2 _263 = _260; + _263.y = _262; + float _264 = _260.x; + bool _269; + if ((isunordered(_264, 0.0) || _264 >= 0.0)) { - _1195 = _1183 > 1.0; + _269 = _264 > 1.0; } else { - _1195 = true; + _269 = true; } - bool _1205; - if (!_1195) + bool _274; + if (!_269) { - _1205 = _1177 < 0.0; + _274 = _262 < 0.0; } else { - _1205 = true; + _274 = true; } - bool _1215; - if (!_1205) + bool _279; + if (!_274) { - _1215 = _1177 > 1.0; + _279 = _262 > 1.0; } else { - _1215 = true; + _279 = true; } - bool _1227; - if (!_1215) + bool _285; + if (!_279) { - _1227 = _1161.z < 0.0; + _285 = _257.z < 0.0; } else { - _1227 = true; + _285 = true; } - bool _1239; - if (!_1227) + bool _291; + if (!_285) { - _1239 = _1161.z > 1.0; + _291 = _257.z > 1.0; } else { - _1239 = true; + _291 = true; } - if (_1239) + if (_291) { - _1360 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1132; + _337 = (blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w) * _241; break; } - uint2 _1250 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1266 = float2(1.0) / float2(float(_1250.x), float(_1250.y)); - float _1274 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1132)); - float _1283; - int _1286; - _1283 = 0.0; - _1286 = -1; - float _1284; - for (; _1286 <= 1; _1283 = _1284, _1286++) + uint2 _296 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _302 = float2(1.0) / float2(float(_296.x), float(_296.y)); + float _305 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _241)); + float _307; + int _310; + _307 = 0.0; + _310 = -1; + float _308; + for (; _310 <= 1; _307 = _308, _310++) { - _1284 = _1283; - for (int _1302 = -1; _1302 <= 1; ) + _308 = _307; + for (int _318 = -1; _318 <= 1; ) { - _1284 += shadowTexture.sample_compare(shadowSampler, (_1179 + (float2(float(_1286), float(_1302)) * _1266)), _1161.z - _1274, level(0.0)); - _1302++; + _308 += shadowTexture.sample_compare(shadowSampler, (_263 + (float2(float(_310), float(_318)) * _302)), _257.z - _305, level(0.0)); + _318++; continue; } } - _1360 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1132) * mix(1.0, _1283 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _337 = ((blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w) * _241) * mix(1.0, _307 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1368 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _1464; - if (_666[_836] == 16u) + float3 _341 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _377; + if (blockBuffer._m0[_130].Indices[_146] == 16u) { - float4 _1444 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); - _1464 = _870 + ((in.in_var_TEXCOORD0.y - _1444.y) * 0.100000001490116119384765625); + _377 = _158 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _1464 = _870; + _377 = _158; } - out.out_var_SV_Target0 = float4(mix(_862.xyz * ((_900 + UniformBuffer_3.Ambient.xyz) + float3(_1360)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1368.y, length(float2(_1368.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1464); + out.out_var_SV_Target0 = float4(mix(_156.xyz * ((_163 + UniformBuffer_3.Ambient.xyz) + float3(_337)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_341.y, length(float2(_341.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _377); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index b2d22365a961c827ffb06800f35cc694d9b46439..9252619089fe43ad6160b3a5a85413bdec6282d0 100644 GIT binary patch literal 10288 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 literal 52668 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 I@hH*%0f(BOLjV8( diff --git a/shaders/bin/transparent.vert.json b/shaders/bin/transparent.vert.json index 51723fc4..d4a413d8 100644 --- a/shaders/bin/transparent.vert.json +++ b/shaders/bin/transparent.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 3 } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 3, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "uint", "location": 0 }], "outputs": [{ "name": "out.var.TEXCOORD0", "type": "float4", "location": 0 }, { "name": "out.var.TEXCOORD1", "type": "float2", "location": 1 }, { "name": "out.var.TEXCOORD2", "type": "uint", "location": 2 }, { "name": "out.var.TEXCOORD3", "type": "float2", "location": 3 }] } diff --git a/shaders/bin/transparent.vert.msl b/shaders/bin/transparent.vert.msl index 1b47a92b..53969994 100644 --- a/shaders/bin/transparent.vert.msl +++ b/shaders/bin/transparent.vert.msl @@ -18,7 +18,7 @@ struct type_UniformBuffer_2 int2 ChunkPosition; }; -constant float4 _273 = {}; +constant float4 _48 = {}; struct main0_out { @@ -37,18 +37,18 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _384 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _386 = float4(_384.x, _384.y, _384.z, _273.w); - float4 _402 = UniformBuffer_1.View * float4(_384, 1.0); - _386.w = _402.z; - float4 _416 = UniformBuffer.Proj * _402; - float2 _452 = ((_416.xy / float2(_416.w)) * 0.5) + float2(0.5); - _452.y = 1.0 - _452.y; - out.gl_Position = _416; - out.out_var_TEXCOORD0 = _386; + float3 _70 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _71 = float4(_70.x, _70.y, _70.z, _48.w); + float4 _78 = UniformBuffer_1.View * float4(_70, 1.0); + _71.w = _78.z; + float4 _83 = UniformBuffer.Proj * _78; + float2 _96 = ((_83.xy / float2(_83.w)) * 0.5) + float2(0.5); + _96.y = 1.0 - _96.y; + out.gl_Position = _83; + out.out_var_TEXCOORD0 = _71; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _452; + out.out_var_TEXCOORD3 = _96; return out; } diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index 506117bfe063224286261790649b1f8a38023964..377491bcf69e2e1fadbd70640dab2a46be2b21fe 100644 GIT binary patch literal 2680 zcmZ{kS5uQw5Qe`{>gEL)U4u~!hQdAqvyIB#8f zySjGs4RUk7DOY!M`-`)dC18*|an641Sv_LJo5{xrE*~Sfh@l=a;=M!+bI565iR@h$ z!A@#XUJP8JTW6Mi=v{@q1IaVqVc3@Anl|hFxEMLN6lgV@)M? zYx1r;`R!ttYre%n$1Zkd^Y3Oizj5^GVYim%%-XU&Nw@wJ*zL`4 z#xv^n<2MqzHTzA3Zq3RC;Q6T8e4%@Xq1%Jsbm;crHyyfmzXA0Eza@76)DGiiPv&vi z;}0_Xzjcbd-huy9*3w5r`#b=w)wd`-XWs{bwmP~qKa{xeJB%KFzMt?rf~+n4jv~ud z$mch73>eEdsjWtQ@BcW^_KhB_^8~O~-}m>#olLxM{B^496taByokrHrHynPw$nw79 z@H>MnAAWtv`uRPC-&th&e7=5k`RL~yvNfCm+U(mt&jWkh5 ze`?I|HnM#9-9gr`2*Pg|Sw8P~7hS$WpPlUYfU)Gu+>6|OU~R%x0C5Kokmc<)Vmw5a z7oStyN65y}_9bzTk>!^H--fwHfc$C@IYyC3fO$W0&N)8;&PSVfukTYJKLR{^nyOma dtxwr^<$RQVU-qi(JM*rT{Vy@jPa+%zzX42Uuo?gW literal 20716 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 atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) { main0_out out = {}; - float4 _170; + float4 _49; do { - if (!(in.in_var_TEXCOORD2 != 0u)) + if (in.in_var_TEXCOORD2 == 0u) { - _170 = float4(1.0); + _49 = float4(1.0); break; } - float3 _153 = float3(in.in_var_TEXCOORD0, float(in.in_var_TEXCOORD1)); - float4 _157 = atlasTexture.sample(atlasSampler, _153.xy, uint(rint(_153.z))); - if (_157.w <= 0.001000000047497451305389404296875) + float3 _42 = float3(in.in_var_TEXCOORD0, float(in.in_var_TEXCOORD1)); + float4 _44 = atlasTexture.sample(atlasSampler, _42.xy, uint(rint(_42.z))); + if (_44.w <= 0.001000000047497451305389404296875) { discard_fragment(); } - _170 = _157; + _49 = _44; break; } while(false); - out.out_var_SV_Target0 = _170; + out.out_var_SV_Target0 = _49; return out; } diff --git a/shaders/bin/ui.frag.spv b/shaders/bin/ui.frag.spv index b744816ad882fda05ee7778eaffca7506f9b2b83..5d90ceb42db143f86afbd10488b325efda606e63 100644 GIT binary patch literal 1408 zcmZ9M*-jKu5Qdvs7;$4q0hb#-;K{QLTv712#JzjYSQtelP7Fn5dyv z7;mBzAoCF7)kAETq9&11V#AYumaKnBy1jHSOVYt0Js~$5>eJzVdeq524UY#Ir6GQ% zJad%x`uo|SjE~`j`t54G75eEOBp=g3(s{l6a&z_|EXM9g?&5M z;qfq#ZtuMBq=UU|2y2t6tGlrFEVW_Ayx(HbDB1|yaKpLpeYxKVJzoPW8*sW$vD{*7 z#qL^cKh=77y;RAI+o)o_yQ=2JWqyv^&VgfegtM70Rwbq;*JDm4DR#5Nso_EyxuB)hV&nPADeSCB7>02>( zf^Xb!-?<-P73Vg$h8lBj{l9djZ>+k582r8X?)`J|+jmdiXYF&ieP46`;CPJw2d;2t AM*si- literal 5484 zcmaKu3v(M+700)>>=ai`o1~AVX<(fIwW%e`j!8otr%vsVm^P2buA9RC zuAGDt2n1S&;r)IL?_ntPEAU}>^9dN0tyZ5sce&c`w5xHr8MKpTt=eoiIy;B2|w-zwQzcTc4Rr&?6$&aISG<5 z^~fZ7k2vo!5+_lwmiSBUZZ8>meZ<%2Qcn9yR_k=4x_np8Tv@ny@$zD2))}-r&9-uP zJFOsTcG`YVtRmFIn>pL5|7V-qiN&6t9l1R_qIwjw=GQvyI7utQ=KxE=6J7=|#1$ z6mW&&Ok3yH&u#Tu8$r8tqnTVQrB*K2koSmIn>3NiKkPlKbw0V(4a;$QvoiU9t$ku= ze?ap5sf(5TUhgrjX`JbLxw#pvhh)uiF^G^2Z zrp%A`vrji|I^NYzFL6P)uQ2%v|MeD=Gk zj$ZK_0go*_?>ap7!1KY=JMx+yp8oKmhtBKaP5+3pUlH#MPs$ehC84wT?um!Re^|6H z+#{fee_0?G`d7620v~$#amQ`P`-tQ3JpHKjuZkuIy_itH;Hv^Qd04KilJglKh_+hD z^@QLH2lNX?Pl%14`dImF^_6uk6*=3-WaW!TUd!b0)LGX`EaIRKwGsz8d?Vx2{TDp_ zY`Sw~Kl|i$M62~R>A;=dI#z8nbJQ z=6AvPj_6X3?~3LeP5+wcxf~yfUdZvW=<_+A-=$@N+3IO!wgv@@wmj=v!qn}f1C ztd-d|+nb`fqsHG7&2Pl4Vy|iC{`0}tw2nG1<(XshGH>XaV`eeWGkeA}*UT0^MNQ=q zt?w4l^O@{DqLGoisLo>d-b^;2m3ewXpohE zvIq7{ZR9HIH0Z(80x>unY&Z+z7UhY4UO>-X+Nk-T>^; zVLvaJ&7$bM4Q~c#hi_5;$p1kB8{R7JCiM~TtiTyz%YH59Innu;OX9a!uBJR9EOzO2cdR8=XtxwcuJ$f$F(W89=wia*a9;JIbpZQS-cbD16?}Bhqptqc( z<+&u98aQwM_9Hg-%pSmgzrfw(Jk0NT(fF~~0|IgI<1TP6_#qz^^7$@{w|vw{j{bZH zCELz-pF1<&IQ*EG#|6#|o4l{}bwzS)cMIgh*Xn*jG&<@&Bw$Mn_Pr`lH*(&awC?oH zc~Lxm8^Ut}cAO2fcr1Ir21N5+6aK2({86n|)9a$~=bgkKTe~kG6OE3%=Y^L9-n}`! zpmnXcg~5z}MeE0fLXQ80=pn)8^^RzZ$6Vr1ysLuQd{T7YhM3p{Ih#-Q*^mdDmxaHm zqPtr8{vn!k{ItNnS&Mpknde^%jM41o`L>?x3!~|);9$565o8^ z6up!0rsPY)Tj~zJpB3=8-;&>m#*cZX{?BRU`@8J1{k(vTJwV$Yek&S3_HfS0(>;74 zliMEJ;sJGZguf{cJt7`)E#B`$TfBTvzL?1^-dXX0dkdHcey_hIFrU_sFN-E#zh74} zfS<4RE5fK?eqR;6lV2=(B6Q_S^iDA+B`2oc-5+LlhqUs$LOkw>#rcuwd>m>5%m_1YefhCyd?{y{W;%=)5}r?dW6Cbu)XB_6O3 z@K1RWi_4 Uw?&iJ;x|PD-gxjYX^#v41`+9OKmY&$ diff --git a/shaders/bin/ui.vert.json b/shaders/bin/ui.vert.json index d4b79af1..886950d4 100644 --- a/shaders/bin/ui.vert.json +++ b/shaders/bin/ui.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1 } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1, "inputs": [], "outputs": [{ "name": "out.var.TEXCOORD0", "type": "float2", "location": 0 }, { "name": "out.var.TEXCOORD1", "type": "uint", "location": 1 }, { "name": "out.var.TEXCOORD2", "type": "uint", "location": 2 }] } diff --git a/shaders/bin/ui.vert.msl b/shaders/bin/ui.vert.msl index 6a36ed75..e9aaa6c5 100644 --- a/shaders/bin/ui.vert.msl +++ b/shaders/bin/ui.vert.msl @@ -50,7 +50,7 @@ struct type_UniformBuffer uint Index; }; -constant spvUnsafeArray _188 = spvUnsafeArray({ float2(0.0), float2(1.0, 0.0), float2(0.0, 1.0), float2(0.0, 1.0), float2(1.0, 0.0), float2(1.0) }); +constant spvUnsafeArray _52 = spvUnsafeArray({ float2(0.0), float2(1.0, 0.0), float2(0.0, 1.0), float2(0.0, 1.0), float2(1.0, 0.0), float2(1.0) }); struct main0_out { @@ -63,27 +63,27 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], uint gl_VertexIndex [[vertex_id]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float _220 = precise::max(float(UniformBuffer.Viewport.x) * 0.0007812500116415321826934814453125, float(UniformBuffer.Viewport.y) * 0.001388888922519981861114501953125); - bool _224 = gl_InstanceIndex == 0u; - float2 _268; - float2 _269; - if (_224) + float _68 = precise::max(float(UniformBuffer.Viewport.x) * 0.0007812500116415321826934814453125, float(UniformBuffer.Viewport.y) * 0.001388888922519981861114501953125); + bool _69 = gl_InstanceIndex == 0u; + float2 _86; + float2 _87; + if (_69) { - float2 _231 = float2(10.0) * _220; - _268 = _231 + float2(50.0 * _220); - _269 = _231; + float2 _73 = float2(10.0) * _68; + _86 = _73 + float2(50.0 * _68); + _87 = _73; } else { - float2 _248 = float2(UniformBuffer.Viewport) * 0.5; - float2 _258 = select(float2(2.0, 8.0), float2(8.0, 2.0), bool2(gl_InstanceIndex == 1u)) * _220; - _268 = _248 + _258; - _269 = _248 - _258; + float2 _79 = float2(UniformBuffer.Viewport) * 0.5; + float2 _83 = select(float2(2.0, 8.0), float2(8.0, 2.0), bool2(gl_InstanceIndex == 1u)) * _68; + _86 = _79 + _83; + _87 = _79 - _83; } - out.gl_Position = float4(((mix(_269, _268, _188[gl_VertexIndex]) / float2(UniformBuffer.Viewport)) * 2.0) - float2(1.0), 0.0, 1.0); - out.out_var_TEXCOORD0 = float2(_188[gl_VertexIndex].x, 1.0 - _188[gl_VertexIndex].y); + out.gl_Position = float4(((mix(_87, _86, _52[gl_VertexIndex]) / float2(UniformBuffer.Viewport)) * 2.0) - float2(1.0), 0.0, 1.0); + out.out_var_TEXCOORD0 = float2(_52[gl_VertexIndex].x, 1.0 - _52[gl_VertexIndex].y); out.out_var_TEXCOORD1 = UniformBuffer.Index; - out.out_var_TEXCOORD2 = uint(_224); + out.out_var_TEXCOORD2 = uint(_69); return out; } diff --git a/shaders/bin/ui.vert.spv b/shaders/bin/ui.vert.spv index 93a3d076d989c55f33122b0ac28f3c3e999f6f34..616b482425c2696892b2ace14e8869d42dd0083a 100644 GIT binary patch literal 2548 zcmZ9N>2j1+5QYz#%mhsgJGdZBKtLr9h=3S`Fab=^K*DNN6r!2vh-9c_aQUZYS>-S9 zLodLqkjtT5s;u&P&YYI1e5s!9x4TboU!O0Pf&D`%ZAdANrmy(**^&mbW;oR{pPs!w z+gR%^HIAP+s(mz7WZAYU4QF|P-}{U06@k`4s0!5}5~Ph#g+Fx*I9Jg=h1~t_L920d zrM=u)y+8GEdAYUfnOe4CPPf{vZyt13yUI0AdB$oltt_>^g;&u&4PO@meKl8hZ@#nE z?zTHCYrUM-(|Oo!e7(5ZxN&je{M_8N3pQmv*16vHda+smdfTyV8)RBfdY`6q`*$j@ zLSknjK3uRf=uJ&~CFdQ@wo0B;PadSRl=eVA#<4!J{fn(hY<{tG*awAOJO=s9(4n*Q z+23RT>-1M=JnPZVm^+b2;C1LQ@s*!}e0G7YQ=Pu!#20UZ^pWDsX5^H;RNm2g` z*=J@d@a~M$WW;X*@e;B-vm5^daNmczI`|;m8a;3PLvU+#H?_YEcW>2;Un$raVs}})=eJRnyF7+w z9ImX-YjAhexZ*~^5#tEhn(agT(Sq%BI~MPndheBf<~j{_H{E4*VtcWc4Sm=?0^5ss zOdtL2#kmBw7whcD?!MUkZxp*T9B0Dv_I8U6)21-D-F`+cy+vs9&Q{xjH|$y<=M2A)8+|0Z#r@oC6;c{iGL z?wsH5)2a8Yb3apT9kB21Y|;HhEb(N~*;~XqhaB;}ZxO4BtSw?qA*+j6=aJPpml3)% z{sqYQHV>IgpWn#stS&(twV_hryI(!U@nAefDS^tlv)*Hy?(iZjK?9=tvZy%4DxjAk@_UX*@x3{ppk8JpuRiwf3uNPIbGFCeZOA(nvApMB7QMS6z6ZJY?vQuFZ$lMs XKgu<@v6YA5o>$%o_w2t+;S}^Atc{)_ literal 10280 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 L1-z~sd!F!rzD~yT diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 50c27612..f7fa98f3 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -60,16 +60,16 @@ Output main(Input input) float3 normal = GetNormal(input.Voxel, block); float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); float3 ambient = Ambient.xyz; - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, input.WorldPosition.xyz, normal, block); - float3 finalColor; - if (block.IsFullbright) - { - finalColor = albedo; - } - else - { - finalColor = albedo * (diffuse + ambient * input.AO + sun); - } + float sun = GetSunLight( + shadowTexture, + shadowSampler, + ShadowTransform, + Sun.xyz, + Sun.w, + input.WorldPosition.xyz, + normal, + block); + float3 finalColor = albedo * (diffuse + ambient * input.AO + sun); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFog(distance(input.WorldPosition.xz, PlayerPosition.xz)); output.Color = float4(lerp(finalColor, sky, fog), 1.0f); diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 2399b2b4..d8db237a 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -11,54 +11,53 @@ struct Block { uint IsSprite; uint HasOcclusion; - uint IsFullbright; + uint HasShadow; + uint CanBeInShadow; + float blockSunIntensity; uint Indices[6]; }; -static const float3 kNormals[10] = -{ - float3(0.0f, 0.0f, 1.0f), - float3(0.0f, 0.0f, -1.0f), - float3(1.0f, 0.0f, 0.0f), - float3(-1.0f, 0.0f, 0.0f), - float3(0.0f, 1.0f, 0.0f), - float3(0.0f, -1.0f, 0.0f), - float3(0.0f, 1.0f, 0.0f), - float3(0.0f, 1.0f, 0.0f), - float3(0.0f, 1.0f, 0.0f), - float3(0.0f, 1.0f, 0.0f), +static const float3 kNormals[10] = { + float3(0.0f, 0.0f, 1.0f), // North + float3(0.0f, 0.0f, -1.0f), // South + float3(1.0f, 0.0f, 0.0f), // East + float3(-1.0f, 0.0f, 0.0f), // West + float3(0.0f, 1.0f, 0.0f), // Up + float3(0.0f, -1.0f, 0.0f), // Down + float3(0.0f, 1.0f, 0.0f), // Sprite north + float3(0.0f, 1.0f, 0.0f), // Sprite south + float3(0.0f, 1.0f, 0.0f), // Sprite east + float3(0.0f, 1.0f, 0.0f), // Sprite west }; -static const float3 kCubePositions[8] = -{ - float3(-0.5f, -0.5f, -0.5f), - float3(0.5f, -0.5f, -0.5f), - float3(0.5f, 0.5f, -0.5f), - float3(-0.5f, 0.5f, -0.5f), - float3(-0.5f, -0.5f, 0.5f), - float3(0.5f, -0.5f, 0.5f), - float3(0.5f, 0.5f, 0.5f), - float3(-0.5f, 0.5f, 0.5f), +static const float3 kCubePositions[8] = { + float3(-0.5f, -0.5f, -0.5f), // -X, -Y, -Z + float3(0.5f, -0.5f, -0.5f), // +X, -Y, -Z + float3(0.5f, 0.5f, -0.5f), // +X, +Y, -Z + float3(-0.5f, 0.5f, -0.5f), // -X, +Y, -Z + float3(-0.5f, -0.5f, 0.5f), // -X, -Y, +Z + float3(0.5f, -0.5f, 0.5f), // +X, -Y, +Z + float3(0.5f, 0.5f, 0.5f), // +X, +Y, +Z + float3(-0.5f, 0.5f, 0.5f), // -X, +Y, +Z }; -static const float3 kCubeNormals[6] = -{ - float3(0.0f, 0.0f, -1.0f), - float3(0.0f, 0.0f, 1.0f), - float3(-1.0f, 0.0f, 0.0f), - float3(1.0f, 0.0f, 0.0f), - float3(0.0f, 1.0f, 0.0f), - float3(0.0f, -1.0f, 0.0f), +static const float3 kCubeNormals[6] = { + float3(0.0f, 0.0f, -1.0f), // -Z + float3(0.0f, 0.0f, 1.0f), // +Z + float3(-1.0f, 0.0f, 0.0f), // -X + float3(1.0f, 0.0f, 0.0f), // +X + float3(0.0f, 1.0f, 0.0f), // +Y + float3(0.0f, -1.0f, 0.0f), // -Y }; -static const uint kCubeIndices[36] = -{ - 0, 1, 2, 0, 2, 3, - 5, 4, 7, 5, 7, 6, - 4, 0, 3, 4, 3, 7, - 1, 5, 6, 1, 6, 2, - 3, 2, 6, 3, 6, 7, - 4, 5, 1, 4, 1, 0}; +static const uint kCubeIndices[36] = { + 0, 1, 2, 0, 2, 3, // -Z + 5, 4, 7, 5, 7, 6, // +Z + 4, 0, 3, 4, 3, 7, // -X + 1, 5, 6, 1, 6, 2, // +X + 3, 2, 6, 3, 6, 7, // +Y + 4, 5, 1, 4, 1, 0, // -Y +}; float GetAO(uint voxel) { @@ -78,7 +77,10 @@ uint GetBlock(uint voxel) float3 GetPosition(uint voxel) { - return float3((voxel >> X_OFFSET) & X_MASK, (voxel >> Y_OFFSET) & Y_MASK, (voxel >> Z_OFFSET) & Z_MASK); + return float3( + (voxel >> X_OFFSET) & X_MASK, + (voxel >> Y_OFFSET) & Y_MASK, + (voxel >> Z_OFFSET) & Z_MASK); } uint GetIndex(uint voxel, Block block) @@ -117,7 +119,11 @@ struct Light int Z; }; -float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 position, float3 normal) +float3 GetDiffuseLight( + StructuredBuffer lights, + uint lightCount, + float4 position, + float3 normal) { static const float3 kOffset = float3(0.0f, 0.25f, 0.0f); float3 finalColor = float3(0.0f, 0.0f, 0.0f); @@ -149,9 +155,16 @@ float3 GetDiffuseLight(StructuredBuffer lights, uint lightCount, float4 p return finalColor; } -float GetSunLight(Texture2D texture, SamplerComparisonState state, float4x4 transform, float3 sunDirection, float sunIntensity, float3 position, float3 normal, Block block) +float GetSunLight( + Texture2D texture, + SamplerComparisonState state, + float4x4 transform, + float3 sunDirection, + float sunIntensity, + float3 position, + float3 normal, + Block block) { - static const float kShadow = 0.4f; if (sunIntensity <= 0.0f) { return 0.0f; @@ -161,13 +174,18 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 { return 0.0f; } + if (!block.CanBeInShadow) + { + return block.blockSunIntensity * sunIntensity; + } float4 shadowPosition = mul(transform, float4(position, 1.0f)); shadowPosition.xyz /= shadowPosition.w; float2 uv = shadowPosition.xy * 0.5f + 0.5f; uv.y = 1.0f - uv.y; - if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || shadowPosition.z > 1.0f) + if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || + shadowPosition.z > 1.0f) { - return kShadow * sunIntensity * ratio; + return block.blockSunIntensity * sunIntensity * ratio; } uint width; uint height; @@ -179,13 +197,16 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 { for (int y = -1; y <= 1; y++) { - visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); + visibility += texture.SampleCmpLevelZero( + state, + uv + float2(x, y) * texelSize, + shadowPosition.z - bias); } } visibility /= 9.0f; float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); visibility = lerp(1.0f, visibility, shadowFade); - return kShadow * sunIntensity * ratio * visibility; + return block.blockSunIntensity * sunIntensity * ratio * visibility; } float GetFog(float x) diff --git a/shaders/shadow.vert b/shaders/shadow.vert index 4c02ab8c..ba270d9d 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -35,6 +35,6 @@ Output main(Input input) float3 position = GetPosition(input.Voxel) + chunkPosition; Block block = blockBuffer[GetBlock(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); - output.ClipDistance = block.HasOcclusion ? 1.0f : -1.0f; + output.ClipDistance = block.HasShadow ? 1.0f : -1.0f; return output; } diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 385804b7..125c7019 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -54,7 +54,15 @@ float4 main(Input input) : SV_Target0 float4 position = input.WorldPosition; float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, position, normal); float3 ambient = Ambient.xyz; - float sun = GetSunLight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, position.xyz, normal, block); + float sun = GetSunLight( + shadowTexture, + shadowSampler, + ShadowTransform, + Sun.xyz, + Sun.w, + position.xyz, + normal, + block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFog(distance(position.xz, PlayerPosition.xz)); if (index == kWater) diff --git a/shaders/ui.vert b/shaders/ui.vert index 74084211..a3d67502 100644 --- a/shaders/ui.vert +++ b/shaders/ui.vert @@ -15,8 +15,7 @@ struct Output static const float kWidth = 1280.0f; static const float kHeight = 720.0f; -static const float2 kPositions[6] = -{ +static const float2 kPositions[6] = { float2(0.0f, 0.0f), float2(1.0f, 0.0f), float2(0.0f, 1.0f), diff --git a/src/block.c b/src/block.c index 7067a9cc..093ed93e 100644 --- a/src/block.c +++ b/src/block.c @@ -8,7 +8,9 @@ typedef struct BlockGPU { Uint32 is_sprite; Uint32 has_occlusion; - Uint32 is_fullbright; + Uint32 has_shadow; + Uint32 can_be_in_shadow; + float block_sun_intensity; Uint32 indices[DIRECTION_COUNT]; } BlockGPU; @@ -18,162 +20,214 @@ struct bool is_sprite; bool is_solid; bool has_occlusion; - bool is_fullbright; + bool has_shadow; + bool can_be_in_shadow; + float sun_intensity; int indices[6]; Light light; -} static const BLOCKS[BLOCK_COUNT] = -{ +} static const BLOCKS[BLOCK_COUNT] = { [BLOCK_GRASS] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {2, 2, 2, 2, 1, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {2, 2, 2, 2, 1, 3}, + }, [BLOCK_DIRT] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {3, 3, 3, 3, 3, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {3, 3, 3, 3, 3, 3}, + }, [BLOCK_SAND] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {5, 5, 5, 5, 5, 5}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {5, 5, 5, 5, 5, 5}, + }, [BLOCK_SNOW] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {6, 6, 6, 6, 6, 6}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {6, 6, 6, 6, 6, 6}, + }, [BLOCK_STONE] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {4, 4, 4, 4, 4, 4}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {4, 4, 4, 4, 4, 4}, + }, [BLOCK_LOG] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {8, 8, 8, 8, 7, 7}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {8, 8, 8, 8, 7, 7}, + }, [BLOCK_LEAVES] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {10, 10, 10, 10, 10, 10}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {10, 10, 10, 10, 10, 10}, + }, [BLOCK_CLOUD] = - { - .is_opaque = true, - .is_solid = true, - .is_fullbright = true, - .indices = {9, 9, 9, 9, 9, 9}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .sun_intensity = 1.0f, + .indices = {9, 9, 9, 9, 9, 9}, + }, [BLOCK_BUSH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {15, 15, 15, 15, 15, 15}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {15, 15, 15, 15, 15, 15}, + }, [BLOCK_BLUEBELL] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {13, 13, 13, 13, 13, 13}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {13, 13, 13, 13, 13, 13}, + }, [BLOCK_GARDENIA] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {12, 12, 12, 12, 12, 12}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {12, 12, 12, 12, 12, 12}, + }, [BLOCK_ROSE] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {11, 11, 11, 11, 11, 11}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {11, 11, 11, 11, 11, 11}, + }, [BLOCK_LAVENDER] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {14, 14, 14, 14, 14, 14}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {14, 14, 14, 14, 14, 14}, + }, [BLOCK_WATER] = - { - .indices = {16, 16, 16, 16, 16, 16}, - }, + { + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {16, 16, 16, 16, 16, 16}, + }, [BLOCK_RED_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {17, 17, 17, 17, 17, 17}, - .light = {236, 39, 63, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {17, 17, 17, 17, 17, 17}, + .light = {236, 39, 63, TORCH_INTENSITY}, + }, [BLOCK_GREEN_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {18, 18, 18, 18, 18, 18}, - .light = {90, 181, 82, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {18, 18, 18, 18, 18, 18}, + .light = {90, 181, 82, TORCH_INTENSITY}, + }, [BLOCK_BLUE_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {19, 19, 19, 19, 19, 19}, - .light = {51, 136, 222, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {19, 19, 19, 19, 19, 19}, + .light = {51, 136, 222, TORCH_INTENSITY}, + }, [BLOCK_YELLOW_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {20, 20, 20, 20, 20, 20}, - .light = {243, 168, 51, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {20, 20, 20, 20, 20, 20}, + .light = {243, 168, 51, TORCH_INTENSITY}, + }, [BLOCK_CYAN_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {21, 21, 21, 21, 21, 21}, - .light = {54, 197, 244, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {21, 21, 21, 21, 21, 21}, + .light = {54, 197, 244, TORCH_INTENSITY}, + }, [BLOCK_MAGENTA_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {22, 22, 22, 22, 22, 22}, - .light = {250, 110, 121, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {22, 22, 22, 22, 22, 22}, + .light = {250, 110, 121, TORCH_INTENSITY}, + }, [BLOCK_WHITE_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .indices = {23, 23, 23, 23, 23, 23}, - .light = {255, 255, 255, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {23, 23, 23, 23, 23, 23}, + .light = {255, 255, 255, TORCH_INTENSITY}, + }, [BLOCK_PLANKS] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .indices = {24, 24, 24, 24, 24, 24}, - }, + { + .is_opaque = true, + .is_solid = true, + .has_occlusion = true, + .has_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.4f, + .indices = {24, 24, 24, 24, 24, 24}, + }, }; SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) { - SDL_COMPILE_TIME_ASSERT("", sizeof(BlockGPU) == sizeof(Uint32) * 9); + SDL_COMPILE_TIME_ASSERT("", sizeof(BlockGPU) == sizeof(Uint32) * 11); CPUBuffer cpu_blocks; GPUBuffer gpu_blocks; CPUBuffer_Init(&cpu_blocks, device, sizeof(BlockGPU)); @@ -187,9 +241,11 @@ SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) for (int i = 0; i < BLOCK_COUNT; i++) { BlockGPU block = {0}; - block.is_sprite = BLOCKS[i].is_sprite; - block.has_occlusion = BLOCKS[i].has_occlusion; - block.is_fullbright = BLOCKS[i].is_fullbright; + block.is_sprite = Block_IsSprite(i); + block.has_occlusion = Block_HasOcclusion(i); + block.has_shadow = Block_HasShadow(i); + block.can_be_in_shadow = Block_CanBeInShadow(i); + block.block_sun_intensity = BLOCKS[i].sun_intensity; for (int j = 0; j < DIRECTION_COUNT; j++) { block.indices[j] = BLOCKS[i].indices[j]; @@ -228,6 +284,16 @@ bool Block_HasOcclusion(Block block) return BLOCKS[block].has_occlusion; } +bool Block_HasShadow(Block block) +{ + return BLOCKS[block].has_shadow; +} + +bool Block_CanBeInShadow(Block block) +{ + return BLOCKS[block].can_be_in_shadow; +} + int Block_GetIndex(Block block, Direction direction) { return BLOCKS[block].indices[direction]; diff --git a/src/block.h b/src/block.h index f3e81573..ec657638 100644 --- a/src/block.h +++ b/src/block.h @@ -52,6 +52,8 @@ bool Block_IsOpaque(Block block); bool Block_IsSprite(Block block); bool Block_IsSolid(Block block); bool Block_HasOcclusion(Block block); +bool Block_HasShadow(Block block); +bool Block_CanBeInShadow(Block block); int Block_GetIndex(Block block, Direction direction); bool Block_IsLight(Block block); Light Block_GetLight(Block block); diff --git a/src/camera.c b/src/camera.c index 0c3fa607..ee95b968 100644 --- a/src/camera.c +++ b/src/camera.c @@ -45,7 +45,14 @@ static void Perspective(float matrix[4][4], float aspect, float fov, float near, matrix[3][3] = 0.0f; } -static void Ortho(float matrix[4][4], float left, float right, float bottom, float top, float near, float far) +static void Ortho( + float matrix[4][4], + float left, + float right, + float bottom, + float top, + float near, + float far) { matrix[0][0] = 2.0f / (right - left); matrix[0][1] = 0.0f; @@ -228,7 +235,14 @@ void Camera_GetVector(const Camera* camera, float* x, float* y, float* z) *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * c; } -bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float sx, float sy, float sz) +bool Camera_GetVisibility( + const Camera* camera, + float x, + float y, + float z, + float sx, + float sy, + float sz) { float x2 = x + sx; float y2 = y + sy; diff --git a/src/camera.h b/src/camera.h index 4716f2d2..d82bf8d8 100644 --- a/src/camera.h +++ b/src/camera.h @@ -41,4 +41,11 @@ void Camera_Move(Camera* camera, float x, float y, float z); void Camera_Resize(Camera* camera, int width, int height); void Camera_Rotate(Camera* camera, float pitch, float yaw); void Camera_GetVector(const Camera* camera, float* x, float* y, float* z); -bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float sx, float sy, float sz); +bool Camera_GetVisibility( + const Camera* camera, + float x, + float y, + float z, + float sx, + float sy, + float sz); diff --git a/src/direction.h b/src/direction.h index 3a078f21..87136a2e 100644 --- a/src/direction.h +++ b/src/direction.h @@ -11,12 +11,11 @@ typedef enum Direction DIRECTION_COUNT, } Direction; -static const int DIRECTIONS[DIRECTION_COUNT][3] = -{ - [DIRECTION_NORTH] = {0, 0, 1}, - [DIRECTION_SOUTH] = {0, 0, -1}, - [DIRECTION_EAST] = {1, 0, 0}, - [DIRECTION_WEST] = {-1, 0, 0}, - [DIRECTION_UP] = {0, 1, 0}, - [DIRECTION_DOWN] = {0, -1, 0}, +static const int DIRECTIONS[DIRECTION_COUNT][3] = { + [DIRECTION_NORTH] = {0, 0, 1}, // +Z + [DIRECTION_SOUTH] = {0, 0, -1}, // -Z + [DIRECTION_EAST] = {1, 0, 0}, // +X + [DIRECTION_WEST] = {-1, 0, 0}, // -X + [DIRECTION_UP] = {0, 1, 0}, // +Y + [DIRECTION_DOWN] = {0, -1, 0}, // -Y }; diff --git a/src/main.c b/src/main.c index 41bbf272..177c5e8d 100644 --- a/src/main.c +++ b/src/main.c @@ -460,7 +460,8 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) #ifndef NDEBUG device = SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_MSL, true, NULL); #else - device = SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_MSL, false, NULL); + device = + SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_MSL, false, NULL); #endif if (!device) { @@ -472,7 +473,11 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to claim window: %s", SDL_GetError()); return false; } - SDL_SetGPUSwapchainParameters(device, window, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_MAILBOX); + SDL_SetGPUSwapchainParameters( + device, + window, + SDL_GPU_SWAPCHAINCOMPOSITION_SDR, + SDL_GPU_PRESENTMODE_MAILBOX); color_format = SDL_GetGPUSwapchainTextureFormat(device, window); depth_format = SDL_GPU_TEXTUREFORMAT_D32_FLOAT; if (!CreateAtlas()) diff --git a/src/player.c b/src/player.c index 92348cfc..f6395133 100644 --- a/src/player.c +++ b/src/player.c @@ -219,7 +219,8 @@ void Player_Move(Player* player, float dt) { float speed = keys[SDL_SCANCODE_LCTRL] ? FLY_FAST_SPEED : FLY_SPEED; float dx = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; - float dy = (keys[SDL_SCANCODE_E] || keys[SDL_SCANCODE_SPACE]) - (keys[SDL_SCANCODE_Q] || keys[SDL_SCANCODE_LSHIFT]); + float dy = (keys[SDL_SCANCODE_E] || keys[SDL_SCANCODE_SPACE]) - + (keys[SDL_SCANCODE_Q] || keys[SDL_SCANCODE_LSHIFT]); float dz = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; Camera_Move(&player->camera, dx * speed * dt, dy * speed * dt, dz * speed * dt); } diff --git a/src/rand.c b/src/rand.c index f8f553d6..0e823f0f 100644 --- a/src/rand.c +++ b/src/rand.c @@ -64,7 +64,8 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock function) } if (low && grass) { - float plant = stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; + float plant = + stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; if (plant > 0.8f && a > 2 && a < CHUNK_WIDTH - 2 && b > 2 && b < CHUNK_WIDTH - 2) { int log = 3 + plant * 2.0f; diff --git a/src/save.c b/src/save.c index bcb32df9..44786e8e 100644 --- a/src/save.c +++ b/src/save.c @@ -3,33 +3,32 @@ #include "save.h" -static const char* PLAYER_TABLE = -"CREATE TABLE IF NOT EXISTS players (" -" id INT PRIMARY KEY NOT NULL," -" data BLOB NOT NULL" -");"; -static const char* BLOCK_TABLE = -"CREATE TABLE IF NOT EXISTS blocks (" -" cx INTEGER NOT NULL," -" cz INTEGER NOT NULL," -" bx INTEGER NOT NULL," -" by INTEGER NOT NULL," -" bz INTEGER NOT NULL," -" block INTEGER NOT NULL," -" PRIMARY KEY (cx, cz, bx, by, bz)" -");"; -static const char* SKY_TABLE = -"CREATE TABLE IF NOT EXISTS sky (" -" id INTEGER PRIMARY KEY NOT NULL," -" time_of_day REAL NOT NULL" -");"; +static const char* SCHEMA = + "CREATE TABLE IF NOT EXISTS players (" + " id INT PRIMARY KEY NOT NULL," + " data BLOB NOT NULL" + ");" + "CREATE TABLE IF NOT EXISTS blocks (" + " cx INTEGER NOT NULL," + " cz INTEGER NOT NULL," + " bx INTEGER NOT NULL," + " by INTEGER NOT NULL," + " bz INTEGER NOT NULL," + " block INTEGER NOT NULL," + " PRIMARY KEY (cx, cz, bx, by, bz)" + ");" + "CREATE TABLE IF NOT EXISTS sky (" + " id INTEGER PRIMARY KEY NOT NULL," + " time_of_day REAL NOT NULL" + ");" + "CREATE INDEX IF NOT EXISTS bindex ON blocks (cx, cz);"; static const char* SET_PLAYER = "INSERT OR REPLACE INTO players (id, data) VALUES (0, ?);"; static const char* GET_PLAYER = "SELECT data FROM players WHERE id = 0;"; static const char* SET_SKY = "INSERT OR REPLACE INTO sky (id, time_of_day) VALUES (0, ?);"; static const char* GET_SKY = "SELECT time_of_day FROM sky WHERE id = 0;"; -static const char* SET_BLOCK = "INSERT OR REPLACE INTO blocks (cx, cz, bx, by, bz, block) VALUES (?, ?, ?, ?, ?, ?);"; +static const char* SET_BLOCK = + "INSERT OR REPLACE INTO blocks (cx, cz, bx, by, bz, block) VALUES (?, ?, ?, ?, ?, ?);"; static const char* GET_BLOCKS = "SELECT bx, by, bz, block FROM blocks WHERE cx = ? AND cz = ?;"; -static const char* BLOCK_INDEX = "CREATE INDEX IF NOT EXISTS bindex ON blocks (cx, cz);"; static sqlite3* handle; static sqlite3_stmt* set_player; @@ -77,15 +76,9 @@ bool Save_Init(const char* path) handle = NULL; return false; } - if (!Execute(PLAYER_TABLE, "create player table") || - !Execute(BLOCK_TABLE, "create block table") || - !Execute(SKY_TABLE, "create sky table") || - !Execute(BLOCK_INDEX, "create block index") || - !Prepare(&set_player, SET_PLAYER, "set player") || - !Prepare(&get_player, GET_PLAYER, "get player") || - !Prepare(&set_sky, SET_SKY, "set sky") || - !Prepare(&get_sky, GET_SKY, "get sky") || - !Prepare(&set_block, SET_BLOCK, "set block") || + if (!Execute(SCHEMA, "create schema") || !Prepare(&set_player, SET_PLAYER, "set player") || + !Prepare(&get_player, GET_PLAYER, "get player") || !Prepare(&set_sky, SET_SKY, "set sky") || + !Prepare(&get_sky, GET_SKY, "get sky") || !Prepare(&set_block, SET_BLOCK, "set block") || !Prepare(&get_blocks, GET_BLOCKS, "get blocks")) { Save_Free(); diff --git a/src/shader.c b/src/shader.c index 848d77ad..1f348978 100644 --- a/src/shader.c +++ b/src/shader.c @@ -32,7 +32,13 @@ SDL_GPUShader* Shader_Load(SDL_GPUDevice* device, const char* name) } char shader_path[512] = {0}; char shader_json_path[512] = {0}; - SDL_snprintf(shader_path, sizeof(shader_path), "%s%s.%s", SDL_GetBasePath(), name, file_extension); + SDL_snprintf( + shader_path, + sizeof(shader_path), + "%s%s.%s", + SDL_GetBasePath(), + name, + file_extension); SDL_snprintf(shader_json_path, sizeof(shader_json_path), "%s%s.json", SDL_GetBasePath(), name); size_t shader_size; size_t shader_json_size; diff --git a/src/sky.c b/src/sky.c index 95d260af..d987b079 100644 --- a/src/sky.c +++ b/src/sky.c @@ -128,8 +128,10 @@ void Sky_UpdateShadow(Sky* sky, const Camera* camera, int resolution) shadow->z = camera->z; Camera_Update(shadow); float texel_size = SHADOW_ORTHO * 2.0f / resolution; - float light_x = shadow->view[0][0] * shadow->x + shadow->view[1][0] * shadow->y + shadow->view[2][0] * shadow->z; - float light_y = shadow->view[0][1] * shadow->x + shadow->view[1][1] * shadow->y + shadow->view[2][1] * shadow->z; + float light_x = shadow->view[0][0] * shadow->x + shadow->view[1][0] * shadow->y + + shadow->view[2][0] * shadow->z; + float light_y = shadow->view[0][1] * shadow->x + shadow->view[1][1] * shadow->y + + shadow->view[2][1] * shadow->z; float delta_x = SDL_roundf(light_x / texel_size) * texel_size - light_x; float delta_y = SDL_roundf(light_y / texel_size) * texel_size - light_y; shadow->x += shadow->view[0][0] * delta_x + shadow->view[0][1] * delta_y; diff --git a/src/voxel.c b/src/voxel.c index 24047b19..f6adbe51 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -5,8 +5,7 @@ #include "voxel.h" #include "voxel.inc" -static const int CUBE_POSITIONS[][4][3] = -{ +static const int CUBE_POSITIONS[][4][3] = { {{0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}}, {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 1, 0}}, {{1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1}}, @@ -15,8 +14,7 @@ static const int CUBE_POSITIONS[][4][3] = {{0, 0, 0}, {0, 0, 1}, {1, 0, 0}, {1, 0, 1}}, }; -static const int TEXCOORDS[][4][2] = -{ +static const int TEXCOORDS[][4][2] = { {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, @@ -62,8 +60,7 @@ Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, in SDL_assert(block < BLOCK_COUNT); SDL_assert(direction < 4); SDL_assert(i < 4); - static const int POSITIONS[][4][3] = - { + static const int POSITIONS[][4][3] = { {{0, 0, 0}, {0, 1, 0}, {1, 0, 1}, {1, 1, 1}}, {{0, 0, 0}, {1, 0, 1}, {0, 1, 0}, {1, 1, 1}}, {{0, 0, 1}, {1, 0, 0}, {0, 1, 1}, {1, 1, 0}}, diff --git a/src/world.c b/src/world.c index 242d012d..caa7e86e 100644 --- a/src/world.c +++ b/src/world.c @@ -228,7 +228,14 @@ static Block GetChunkBlock(Chunk* chunk, int bx, int by, int bz) return chunk->blocks[bx][by][bz]; } -static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, int dx, int dy, int dz) +static Block GetNeighborhoodBlock( + Chunk* chunks[3][3], + int bx, + int by, + int bz, + int dx, + int dy, + int dz) { SDL_assert(dx >= -1 && dx <= 1); SDL_assert(dy >= -1 && dy <= 1); @@ -360,9 +367,12 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio corner[i] = offset; } SDL_assert(side == 2); - bool has_side1 = Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); - bool has_side2 = Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); - bool has_corner = Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); + bool has_side1 = + Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); + bool has_side2 = + Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); + bool has_corner = Block_HasOcclusion( + GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); if (has_side1 && has_side2) { return 0; @@ -873,7 +883,11 @@ void World_Update(const Camera* camera) } } -static void Render(Chunk* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, WorldFlags flags) +static void Render( + Chunk* chunk, + SDL_GPUCommandBuffer* cbuf, + SDL_GPURenderPass* pass, + WorldFlags flags) { MeshType mesh = flags & WORLD_FLAGS_OPAQUE ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; GPUBuffer* gpu_voxels = &chunk->gpu_voxels[mesh]; @@ -908,7 +922,11 @@ static void Render(Chunk* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* SDL_DrawGPUIndexedPrimitives(pass, gpu_voxels->size * 1.5, 1, 0, 0, 0); } -void World_Render(const Camera* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, WorldFlags flags) +void World_Render( + const Camera* camera, + SDL_GPUCommandBuffer* cbuf, + SDL_GPURenderPass* pass, + WorldFlags flags) { SDL_PushGPUVertexUniformData(cbuf, 0, camera->proj, 64); SDL_PushGPUVertexUniformData(cbuf, 1, camera->view, 64); diff --git a/src/world.h b/src/world.h index ba382d58..f6d59f83 100644 --- a/src/world.h +++ b/src/world.h @@ -27,7 +27,11 @@ typedef struct WorldQuery void World_Init(SDL_GPUDevice* device); void World_Free(); void World_Update(const Camera* camera); -void World_Render(const Camera* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, WorldFlags flags); +void World_Render( + const Camera* camera, + SDL_GPUCommandBuffer* cbuf, + SDL_GPURenderPass* pass, + WorldFlags flags); Block World_GetBlock(const int position[3]); void World_SetBlock(const int position[3], Block block); WorldQuery World_Raycast(const Camera* camera, float length); From 3317b7816a6e7fce6e2ac5979dbb83cef789b9a6 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 15:31:56 -0400 Subject: [PATCH 23/39] fix raycast --- shaders/bin/depth.vert.msl | 2 +- shaders/bin/depth.vert.spv | Bin 1804 -> 1740 bytes shaders/bin/opaque.frag.msl | 75 +++---- shaders/bin/opaque.frag.spv | Bin 10080 -> 9976 bytes shaders/bin/opaque.vert.msl | 18 +- shaders/bin/opaque.vert.spv | Bin 2744 -> 2680 bytes shaders/bin/raycast.vert.msl | 8 +- shaders/bin/raycast.vert.spv | Bin 1988 -> 1948 bytes shaders/bin/shadow.vert.msl | 2 +- shaders/bin/shadow.vert.spv | Bin 2740 -> 2676 bytes shaders/bin/sky.frag.msl | 2 +- shaders/bin/sky.frag.spv | Bin 1488 -> 1424 bytes shaders/bin/transparent.frag.msl | 81 +++---- shaders/bin/transparent.frag.spv | Bin 10288 -> 10184 bytes shaders/bin/transparent.vert.msl | 22 +- shaders/bin/transparent.vert.spv | Bin 2680 -> 2616 bytes shaders/bin/ui.vert.msl | 34 +-- shaders/bin/ui.vert.spv | Bin 2548 -> 2428 bytes shaders/depth.vert | 2 +- shaders/opaque.frag | 22 +- shaders/opaque.vert | 6 +- shaders/raycast.vert | 3 - shaders/shader.hlsl | 83 +++---- shaders/shadow.vert | 4 +- shaders/transparent.frag | 19 +- shaders/transparent.vert | 5 +- shaders/ui.vert | 20 +- src/block.c | 62 +++--- src/buffer.c | 186 ++++++++-------- src/buffer.h | 16 +- src/camera.c | 177 +++++++-------- src/camera.h | 8 +- src/main.c | 173 ++++++++------- src/player.c | 112 +++++----- src/rand.c | 140 +++++++----- src/rand.h | 2 +- src/save.c | 4 +- src/save.h | 2 +- src/sky.c | 68 +++--- src/voxel.c | 77 ++++--- src/voxel.h | 13 +- src/world.c | 366 +++++++++++++++++-------------- src/world.h | 6 +- 43 files changed, 960 insertions(+), 860 deletions(-) diff --git a/shaders/bin/depth.vert.msl b/shaders/bin/depth.vert.msl index c9562b8a..677a76e7 100644 --- a/shaders/bin/depth.vert.msl +++ b/shaders/bin/depth.vert.msl @@ -31,7 +31,7 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(UniformBuffer_2.ChunkPosition.x, 0, UniformBuffer_2.ChunkPosition.y)), 1.0)); return out; } diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index baebf7828a29e4573713d7f8dfa6f44cea12c04a..1e52666aa6a4de2b06e157824d8f0d4fd4b4911f 100644 GIT binary patch literal 1740 zcmZ{k%T8255QZBVz$=J|;0*`HJ38JGMQ);j9ivghmIcJoFhfSrxYIZAncVnFZj654 zIj53?!6r3T^;gy3)zy9I>8|ys)Rj^iNQ?ZshEjKd^klx#!9*HMdwZkV((Xpg=;5yy zy$;YzUIlyi%g$!~O{=-p?rcBX+uGXfq|`^$n5)rgzgPEWXiER2W;}hw|Hos@^|rbB zSuKwp9>jA9{9vB`WX!evZm;#B(f-)nZMHp}e238o@p08FA}}5IK$OpF}Q}{9$Z4B7O?{Psty_9?hge|2dcE z9)nL@On<_uJrA1mbkt9KE?Fy*ZU9Oo_v4d+mp6^nIAp5 z-!x42Va#P;zsRnk=g9ROmk{fh_!jN$G9thCqL^o|R}f>7cNIJGy!XhvhHb0?Uln~F zu~sf)Kj_JQZy@gN8~IsaQw8oj*TY3M=i7<8I<~m)C+covi$|URJgoCg zMcrL&@$!E6@Wt)lZ{j{;5Aqpn)0g-I#It>)cm0Qmx#CM;ljv#0yNo${$Bzm;a%S+o z-*V1leDRl5JA)^P{I0-evBkXGz@8SE_t}8ecR7bxZ@zKA`S0)=n@5bhUtkLbZlCkK NTHle_Z+4nN{sK_|X<`5X literal 1804 zcmZ{k$x>5M5QYzsfFp>=;DiY{qY)=Wks*KuJEEl)TNY48i-d}xC?BNr+cz5rLL4xe_G|YXE1f=NKfV)9Y~~cw0F1a4ef5kj2?c9 z=uLnkc?InKFMHdSH;wvEv$eZ?u(Pw>N~xEqF;A`4e6KEMXiER2W<0&b|Hos@^R~YI zSuKwp9>sGE{AixOWX!Yj?x69Z*8EuCuQz?1e8AHhC>E+JFgtQ|88{}fnCUl&J- zpT;uB*$(6Pqf3ZKe*j%Vx)AI2eWxeD%8NzP-DzV*2*$K7?;i?qm4&q}_#> z@85xUDKjwHhcQnH`9=0s^gOw~;~HXpmA}mi^mRmjzpY}Pz1~2KHSzrpH*+lNZsA9r zdk}TEv5iID6t-B6``o!Zh+OWbu?GBQ^j*Z*58hy(6~tcMsh>G^FUQ@hy}Yk!Z1JeO zk8Pd17IhD>#of24dx$L_b&s&Ea|fgDF}8T;eKYvt@t!Bx_8^}z-|ahR5#RKU-u0g% z=89Lr+=FLG5sA6CccP6)&U51N|G^oXGmnVBq}p$@fXMF&Y!O?`T?lL`$Nc^^Sl#0) jV!ioGi2ozL!)t6AG46eVt>pL|dV#HT@5Fv{(=75A`hIOf diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 5d2ae9ed..191ca543 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -133,52 +133,53 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& } uint _161 = (in.in_var_TEXCOORD2 & 7u) + uint(_137 ? 6 : 0); uint _166 = uint(UniformBuffer.LightCount); - float3 _168; - _168 = float3(0.0); float3 _169; - for (uint _171 = 0u; _171 < _166; _168 = _169, _171++) + _169 = float3(0.0); + float3 _170; + for (uint _172 = 0u; _172 < _166; _169 = _170, _172++) { - float _184 = float((lightBuffer._m0[_171].Color & 4278190080u) >> 24u); - float3 _191 = (float3(float(lightBuffer._m0[_171].X), float(lightBuffer._m0[_171].Y), float(lightBuffer._m0[_171].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _185 = float((lightBuffer._m0[_172].Color & 4278190080u) >> 24u); + float3 _191 = (float3(float(lightBuffer._m0[_172].X), float(lightBuffer._m0[_172].Y), float(lightBuffer._m0[_172].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; float _192 = length(_191); - if (_192 >= _184) + if (_192 >= _185) { - _169 = _168; + _170 = _169; continue; } float _199 = fast::clamp(dot(_110[_161], _191 / float3(_192)), 0.0, 1.0); if (_199 <= 0.0) { - _169 = _168; + _170 = _169; continue; } - _169 = _168 + ((float3(float(lightBuffer._m0[_171].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_171].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_171].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _199) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_192 / _184, 0.0, 1.0)))); + _170 = _169 + ((float3(float(lightBuffer._m0[_172].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_172].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_172].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _199) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_192 / _185, 0.0, 1.0)))); } - float _342; + float _340; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _342 = 0.0; + _340 = 0.0; break; } - float _246; - if (blockBuffer._m0[_128].HasOcclusion != 0u) + float _239 = blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w; + if (blockBuffer._m0[_128].CanBeInShadow == 0u) { - _246 = fast::clamp(-dot(_110[_161], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _340 = _239; + break; } - else + float _250; + if (blockBuffer._m0[_128].HasOcclusion != 0u) { - _246 = 0.7070000171661376953125; + _250 = fast::clamp(-dot(_110[_161], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } - if (_246 <= 0.0) + else { - _342 = 0.0; - break; + _250 = 0.7070000171661376953125; } - if (blockBuffer._m0[_128].CanBeInShadow == 0u) + if (_250 <= 0.0) { - _342 = blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w; + _340 = 0.0; break; } float4 _258 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); @@ -235,32 +236,32 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& } if (_296) { - _342 = (blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w) * _246; + _340 = _239 * _250; break; } - uint2 _301 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _307 = float2(1.0) / float2(float(_301.x), float(_301.y)); - float _310 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _246)); + uint2 _300 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _306 = float2(1.0) / float2(float(_300.x), float(_300.y)); + float _309 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _250)); + float _311; + int _314; + _311 = 0.0; + _314 = -1; float _312; - int _315; - _312 = 0.0; - _315 = -1; - float _313; - for (; _315 <= 1; _312 = _313, _315++) + for (; _314 <= 1; _311 = _312, _314++) { - _313 = _312; - for (int _323 = -1; _323 <= 1; ) + _312 = _311; + for (int _322 = -1; _322 <= 1; ) { - _313 += shadowTexture.sample_compare(shadowSampler, (_268 + (float2(float(_315), float(_323)) * _307)), _262.z - _310, level(0.0)); - _323++; + _312 += shadowTexture.sample_compare(shadowSampler, (_268 + (float2(float(_314), float(_322)) * _306)), _262.z - _309, level(0.0)); + _322++; continue; } } - _342 = ((blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w) * _246) * mix(1.0, _312 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _340 = (_239 * _250) * mix(1.0, _311 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _351 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_152.xyz * ((_168 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_342)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_351.y, length(float2(_351.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _348 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_152.xyz * ((_169 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_340)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_348.y, length(_348.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index c5690bb268bf1ef5e06e058094394da318db8fdd..bf563dcc868f972d657ebbd34a3a18e878281aee 100644 GIT binary patch delta 2588 zcmYk7TWnQT5Qf)jsjW#dG03IX3$X=33JMilP>_NmP!4THQ9!_micqycMPo?Z8ZRL+ z@n!R7crsd{Dqy{U;w2hmG~vltO~4nU4=O595E8#{pS8@{Ischi|IC^_Gi&zVCsvJ? z$JW-g)Q3lZAsQI(VHAV+w~u=GO4z z-y?ql-+||2b)K6oZU@yfaByT^)234PGHw?92iOCC1qa|f;y=MFz!5kbYQrg{m#3@k zFCb@H>W2R3nSlL-Ck2?f6wQaPj1fI$nGR7XFtvPOgMS3#LbGFbQ;SWS?HVAH=*m- zOTNqTn~koI{GQ0oLGO+>1~MzU)DCG^EG~_}&2Up#Yjc|I=3MlZNNpB(3({hhl@5l` zfo_AQBRj#oXzPHRk6w|zk}Mii5_hoHAtiBVw5KGr8%*9L)YCg*DY^xu^=8|0&O(FdVw)vbpf>_-p1-Z{&ik$#m#u{91|Gy3ER(U6(N7|O2J7P3uY!{| zl6!m+dMN22?TJ0o&sT$eS%RKQukNd*y5=BP6g7LIX_Kdz4y}43Jft*9J?I|B4sMd3 z%ieru%e8r1OT*k*u+E-dy;ZyJMlT){Y$?)eIQhPOUrTd#51K{&4)pY;WdM3ICAn{4oD;4GDq!^=<63yzsBO-7{a5GZ-O_be)h#Z zThO%+pr_M%j5YkyuoE&hb}OWY1P8+2Y=h$$9EXQctWn>TaDU!3wK;nn#x4r4O4`1< zLwEvCdI{)9(Kn^?B)axNY^j_9*8IYiKznbMZF{u!!0G3JQbAUvx&uOogjB-LxXBV6 z2}{y9J;HI9n5GU-=O+vRBu4v4K7kwC-@J^ C_B|{B delta 2719 zcmZvdU2IiF5Xbkn(qhv3B$QeelNLm)C{!)2QYl3Rp|te_rC2edB2;YwQ4r(N_z@Bl zU#@S)#Kb5Fij?|+ikN7O(ZnZTC853;eNa(b3YEm)@7!IzF`nH2o!S4)&d!3|Sd%+U$3U~|b1KJiK_k)E%+uK0f z!7wd!Am0Jn-vkrktZ)FS-RCr8?e7A4*39xjXQ&E;5C_3bum~7rF%xDWM}W3I7BPWC zkwfHMD{?e)zMOt???tYnjC((FmB_C`S1I5J3=G-{K97rhh%Ubr43kI`@-UDeisO&a zM~la1G!FFg3fAoiko_2Z0-hn7{HH+McF+^1=iE{BT@i@9FQ)ozobwsF^Ntp~XEqlO z7kBc%ulUByJ^XjqHNb4D+fX=E{I;%@|7o*U^4~Y>#Q}TwJ+Qad-rkn_cXqz6{nY1+ zD8E4-17Cxu!l=?qnp5ynE1(P zH-?E%B7IC;+bJMtqUx^ka~w~Gb#CfX1x`c008#~}(0vS~?Jpo_Aob_t8=pbn4SoXU z!KX$~G<;VmOpShdK}$t_@<_8TqX5ldqIhO@Lv}gZ81p?Z>1@o0llMv76_JxpTlq=` z`lj&$bp3kCZv}n}(e;tv9k~|tmC?o~&GIT=1!)(oc1rVVxH*iqc>?UlHR!95+I-c!d;8r9c|a;w#-vs>cV0O9olj5v(u3~FyOHh+OG%lE~;)4 zOX66Wl5k-Y(WetE1=>ua3*98NEz6=YC2<2|9a0iEMte#^yTRm5LOp#+ZbJ73(s((# zu~Iu$pz9-Vm2FXWGXo9w#WG8-M6Utb?7yX7gU!Yhjq4m^*do>|_1_X%G9CSTSf*v@sS@R7_RSsJS1X`QbL?qqVfp^BWocjaqT8A+ ztWguHOW%dQVtwQ6>=tN#VLos>>e>g=)LYU2dzx;8lP}-8w=(QQ_mer1ZAJNq2!^6n#@F+t9UdEAxMpF~4vg z(B4~S+a7H_aQfxvAyj2~s*geFkdR*C@i@r? _57 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); +constant spvUnsafeArray _56 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); struct main0_out { @@ -80,15 +80,15 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _80 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _81 = float4(_80.x, _80.y, _80.z, _58.w); - float4 _88 = UniformBuffer_1.View * float4(_80, 1.0); - _81.w = _88.z; - out.gl_Position = UniformBuffer.Proj * _88; - out.out_var_TEXCOORD0 = _81; + float3 _76 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(UniformBuffer_2.ChunkPosition.x, 0, UniformBuffer_2.ChunkPosition.y)); + float4 _77 = float4(_76.x, _76.y, _76.z, _57.w); + float4 _84 = UniformBuffer_1.View * float4(_76, 1.0); + _77.w = _84.z; + out.gl_Position = UniformBuffer.Proj * _84; + out.out_var_TEXCOORD0 = _77; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _57[(in.in_var_TEXCOORD0 >> 8u) & 3u]; + out.out_var_TEXCOORD3 = _56[(in.in_var_TEXCOORD0 >> 8u) & 3u]; return out; } diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index 610f31f965f87401137220c72bb457b6d9e12cfa..5790af1bb527ecbc4c5ca484913399869b0b9f63 100644 GIT binary patch literal 2680 zcmZ{k*-}(j6oxl+cN}7Z%HR-(2AoA4;usY~RB-GTClW_gsB|o83n7+w`Uc)6kCU6+ z;QM%E>GvJZvW|$SYV}_Kzt&!R4SRQ~wRc%cEh(j+(dlvp*+$c1jrSAlQt|9V zW4izEiJAVJ=f{U@wXt&tpt79pO>=Jc8>4-(XNzqI^L_SmvF%W9v&V~Vzh<@)Q%vdE zP>tB-Y=$wb5wNpbm|{vJAkWZWn>B1f{KV#6#O5mYE@*eJ*nMJi5_^W&8TKIIFYZSC zw3|oKF4i9Y_PS^nYxlfSs`F0y^)4)5aptlb8ReYtvmR>}M~t{L#TdaAV+0p5#1SLz zOT_RDIqhBOZLC#fFS)3jS4wXN*MZld$=S0`@LJX?;-|m39kC~YJJ9tH+=*^p?(br) zBH=Gyhxq9)UXO&`_!|)GiFg~)w-)d(=;j#qP3WHrcr&_Zgxx!!Phex|BaU9YpPwHH z+>Pzue>MyT?g77_zmj3|v#-v~er;nlhV`!JcRQ<`cne+8Pp%5HgVhjfyJr)2 z|2Wj0YdcZ=KjO4`?R{8Wk0Vv28|guOH!bY2&nJ+h zoM1o9$Vlw|UNKu>C%XSjQ0A*t1iJb$Wjl{p{gsL|ga`pogFDC;SG{ zwbhB|OwJ(gHI}yj$kB6$5YP6l{hxDZbKdv%f^(hCFd`rO&Y`={HyHcQqs#loV&4UH z`Pest?mpjL>>EXwFP?W1EN}k)7hOWk!Fbx5J^48P#6qsuw#;Kp*Um9@^4&EZC->ywgp@60>m zYP*SO_q>R4E9Z?dMz;FhM&zx>`x&|4LHErRa~}uG#~Ht)dyag};tzCZ;s0XH;x4*; zI}$Uzhb|xc?xVZU|IgU>0A0Sg?;%*ePMv+Mj}T+Y4^V+`z_%1}C(w=Ci$vVV=<*$i t_4X%#6oyZR7V{kQ&`F3n=9xqiBnaJNidm4*lx`IX<&HOS%j39l6Yt|j@qMSy zQb)w8TD{i4roD!}yQ#6GB}p2RBw3tP`1M3ux!TXSk+$=A-{# z9&LU%D`W5E=CR`0@+?F@d!Cj=n_vI)sp`ve?M-E}QnOj}ErQRM&pA}8U2jJxx~`ua z=`WRr&+bE&*6eI*Q!`0?cwjN z^LDXz&l{vW@04Fho&BY=mZi`j=Y*gA*t0lt#GT3K2wgr$=pu(Wa>RX!9G;<0`zqum z@FKK}T9mEJFYvMyedt+@eL1o|&af4{0$zmt^cSy$oKfIbWc>rLLbguhSHp`?_>0#- ze)@~oLSZ-mI>`Pa-+JWDIlKYc8pFO3`Bx5m2h1CGV~q)1L^eijo;K+F^mKRNcJP@jTHGn+c|?nrsv zUtjmB&OAHe=20i!1#f`ryJ}8$BfAglFxMWqH5#LT7hJn~@!kwaynh_pjoE z9@gaNe11^nNw_tc)BifpISqE+ry%?2r5a~;8nRE{h@_u0>`rC=bHUE6C(}jT8F0k; zo+7RnSzE;QA*(BMo^QP$GME1e+N$JtmuDeuU+Kv@&q3De+x(X4&S!ex=j*Jl0c7F#0?><&!2Z0tUmg=f@}@u(`MiHS%U28Bejdm zkiP0m+&p)96>^W-ygS~PxFfwF@9;3>y^P&-B45k&SMhN-*CBKGh3*EjI`2m4Ze}|7 zU*=X=!!5{o{k40?K9N`32&CQfBFF7aZ;oNA)$b0Z-hRB#QTttF-&nr(dtmi(#(iYZ zQ6IZ_fb1^(AB|l+L{`5NiXA>eRv&Sr$i@|+h _54 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _55 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _53 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _54 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -65,9 +65,7 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4 _73 = UniformBuffer.Transform * float4(_54[_55[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); - _73.z = 0.100000001490116119384765625; - out.gl_Position = _73; + out.gl_Position = UniformBuffer.Transform * float4(_53[_54[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); return out; } diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index 43cafc9ebc3631599f84d445628b2a9566aa9405..2f3c31b7ed1416c101ba42c2a49c83ac0e0d29ee 100644 GIT binary patch literal 1948 zcmZ{k+fGwa5QZ1DfJYFKgNoRSiUQ&pQRJ)wcbI76En-O;q%{;Sywf-EjeIR{O#HsR z_r!v6k?G9*b6B%xW>e}M?@6g6rPP}?`StXt&H^cAy4Jpg8%KG6yWUXlg!Cx!*9HFo z(3QGV8F_E*=wofG*{UDbn~heE>yzP|jZgKR8mM>=5h)#h{ZgBG->C045B67&c6VzB z3EaQ@ygS%#v@~Wh-B~p!+_PM#{+p{OY4fapZtm^D^Ij7Mg_A zeZRU#-7ejL>{IAfWRJS{wA%Wmzg1{Ni*)h!A7oZLDL|^RnI#sA!n>pg0kwd$f z_95gm@Cr0V9_76LZ%f1I=g`G`SJ=-ZbAC>9i}qefEGYc?z&K0cXRTu47kGbxhb{1n zh3`pxpe={C@V`{#F@HNgSmJ(l z9?-dQ%&e%k|&{r^Q*p26*jZ+3U>gStI& zH`EuIm$E%j*3UOCfI71|$o{TiahA^^eZ<4(MS<(%eCHu^itFR7Uqa&gIP(R_IaV_{ z-^0ZMZx%62=wjcAF~>3_=1c-xK{od?WN!Co74mJ7djff_z~AEIxAF=y))UxkWU-Dm m>`j5$gDtYU>+6v5`fK-p?GN&5+kmutpZzQq*l)7VL4N?ld}sRr literal 1988 zcmZ{k+fGzb42BoONl`&W4l3dRDheZ>5k<}_pf_kV@fLANCdiE8aN(W4fp6ps;QM%E z;`i;@jRVF-O8fuq>h5X_&4tnSl$ugXo#_?7J>990GtC*++m#68Xzy%Ps@es_h-Q9T z(eEKzQ(J1m-d;ZVP+qU?RrV{j>Rz2UCgaztA1j+>SowBtq_qF#b9wSzwX#*)-B~)= z+A8lRcz^2W?e0c(PiJ)YH_lrGZyEKB>r@+J59R zL%*E~a2lLk@ir-<#(#eh=ejg=FZ z&`n6azb)w&w)gy250R7TVVK)!ZSUMc+n2a=H^;tD|2?$dh;QD{vGva2w_fiXBeo|0 z-U3^bwsq-`nykzG576GXcjAXRwudGDYUHO7_ut)ikKI}K(_M7$+_4g`^v)y1U2=ci z8Ev)u;*Pi%?t-?uh{zddjJ8^zIgBgjwmNdD#m1_Q_pb5Y(^i{zip{j&O^C<-|Dr3? zXnW$D-Cg@2wkPg}c#e5#+XHRmeB&&vGkc8K-$gvm@(E&$e8kM;yfM!ADPm4}W1RIY zB5#Z{pF^DE2x5%$pGV|t`JIKF`^Ft}EFyBwB)BDPbL%s=`?HMrw#e-+J> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(UniformBuffer_2.ChunkPosition.x, 0, UniformBuffer_2.ChunkPosition.y)), 1.0)); out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].HasShadow != 0u) ? 1.0 : (-1.0); out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index e3df2979cede1134b54efa29bd0be8b95416b073..d719cff5bd49de230d21893eee4308cd31239b09 100644 GIT binary patch literal 2676 zcmaKs*-}$M5Qc|@0B#_Phzc0MeTj;SC?dNMHv$2~%NRl#ffFi=7I*jtzJ}#PSmlkc zxFV^a47pn!dCfDq7DxJ$!=JWZ@TBTU>_gf5g$d>((TPuBz#8BH*E|@H&gNUug=cDHL zRFbU)>7ZH&D#hxKk4<AU3M?RXE{gIVdk0d*0B&V121=-|CxtLx0O|A5{X(U}!? z?jasMYA1Kpj*i{@=_zVQ#~u@ruT`9Vqs}=$RS7x+b+(6*4=n0O4lv%|V(AZzIU7a{ z*vSaSUV(LpsH07sI&O)G!_L8nGbbOzx}?u)lIU@7+uyT&|9y-Z*Y9rJ+ed052es1& zciN6ca~KxQVVLDWw;Z-#mV-OMuy;zPj-=?O`ay0NIk!7@R{AMPVDxlG`f2f`h=V^m z^WvC(Mlx?>dZ%RKO+PD{xss2$B}L|seon-}AN{<@?A&)jM1PjATk^$--Xoc}GdsKe zH=^T94c*Gmu8|YHSCgkM^eE9kem&~KcA{4@Z;hT*o}@VQ1Y>S};>7VDUHacI4u(!F zZwy8(??NmXHhMGLrO*aO-pk_51b=*aM=&G;z^@P+4ROAMZQV<+&qUxBHzt`lz72~TmkiGLVQ~|Z$3+%5DVaFF8H<~e z3?992S~@uO^P4dvq6YF|E2%E<=OTLhqT11CMfif-opX}8vr}YurX_=O=Y%$g_j@5? zhnNv|-p}6WrDW_Ax`!QnC1Stu#iw8VwFumN-biNWqCWG|!55T=xn@Mv%rR_1G8p?} z*kXvq#51b0Pdw{oe4NA1@9bCQ#kM5E&V7b0hd6b9mmlBGiiqC$&HbiXQ`1`!IQa%e b&$OBBKJoN+TYObSEyQ6*C+?4`9v1xrKnu3| literal 2740 zcmaKs*>Y4>6oz*?6HY;d5LAer#2IW+6j5YI0w(R0Km*3iL5n+l17E}P zA*}MoSMtWv?>l`~a*9g1Q!8uz{~GpMd+*cZm8I#F#!^Z%>3jaWj-*P?sH@%=OF8zo+RRqk z^{nJOl-IN8AMB(t%<9>oo%K6|hk5Q~?st}Yw%uv9`}8_V7e)MNik$I8@)>Vuot7>uKdUu%J z+w3y!=n(De8TfRlVz8D*YLBy?Tsh7f za^8RBI-i{99Gp3F&z3mfmE1AJJ`SVp;|yY+ewQ(>bz*`$0bb)I#pAhe|DEl}?{l8< zXzz)=_h?Vnuy^Nh&v;|y8o`xo1Q#{LQ6t`0)Nl_u{l~HGql%nn9_=HDEAVqUdURzD z|50pXoN*THSyd62@#5JW?c?KM?<)Lr*yacJ>^x`dJ&&#;5ifoLaTzau5edKhokW~B z>Yc)Vsf2yo-evgp{aeCSYjCdlzzIbG>spb6-ZAE2q!d!uLwyle6xtXwSrWW4%{7>%3O*a?bWT+8(?Q z{coVX2YKVegW-!HdgEz_`4F=x&0jp>}>vS1a=l}_ch;Hw8skUES|NT@4$Y~At^oj!@l0b zGT+(boxERg=eb4awU*2I|0eo8`VzV3e1KScnHS^C7ZCgN?JCB31|K5&x?p?wsNf>+ zA~^DV=aKg@w!X-_ge|wpetwge5o`JF>dUC_U0gx*{mBgWc@?o&znQ-ZZW;S3;&-!K z^tFO5A9<_T=J_o}-ZgA_zo*E%jx8T~pJ1C;MIvtvTfV&CI#@pDsbkxN_4GNnbAF0A z(=YTc{tPizKKA?^+db!y*z*f)dG}oArFq|9BEC8AN5A(S_ql%uTRwv>ej_%io}m_k9boXIF5yvE_VU!QCmi3VM?+7tvoK<{Piy-{oJat8WX@ z?|#93UGVn#J8^z%-yqI5i~Pphv8QhldF!1+F7uN8R?K%czwz%7dofSH*t~z}`U3JF DxS_kl diff --git a/shaders/bin/sky.frag.msl b/shaders/bin/sky.frag.msl index e32ba557..701aa4ee 100644 --- a/shaders/bin/sky.frag.msl +++ b/shaders/bin/sky.frag.msl @@ -25,7 +25,7 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]]) { main0_out out = {}; - out.out_var_SV_Target0 = float4(mix(UniformBuffer.SkyHorizon.xyz, UniformBuffer.SkyTop.xyz, float3((precise::atan2(in.in_var_TEXCOORD0.y, length(float2(in.in_var_TEXCOORD0.x, in.in_var_TEXCOORD0.z))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), 1.0); + out.out_var_SV_Target0 = float4(mix(UniformBuffer.SkyHorizon.xyz, UniformBuffer.SkyTop.xyz, float3((precise::atan2(in.in_var_TEXCOORD0.y, length(in.in_var_TEXCOORD0.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), 1.0); out.out_var_SV_Target1 = float4(0.0); return out; } diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index 552efff3f1e665659c384731ac23c50e8ccc8f8a..7e4cb8131dfb9d2373a272802b9e806e02f9a7d4 100644 GIT binary patch literal 1424 zcmZXT+fGwK6o!YEB1&yR1U$k9JcCseH6}&~sDTTTqOFEIQ)6oy)0WiM1g|v47x8U; z246%kO#Hr0$5b5hGi&|pyk<9>Sw0rRNC=@2Zu8$W6*4I^5ysMcYp1ePdf$6fx_d8m zDTHk5XH+qahf(efXw{l+4O-=LU=mFmMUb*7w+E4f8H4K`?AJ>#+Ra9%+uH0m8ue~~ zA5CqTL#5wF&ZWBbD(?=eoqc`$JFE-0-RU+zcBmeG?O~(!x>;}c(rD`+DU*rGuodsbo#y2Sb6!XTI;^8_poYnw*PE*w2l6=i!F3(%ma_Qd53j# zsXL!`dtCy?MST(3vrPr(_ADP>e>vmjCPDOb_j1V)XI?o6-J(j|<1F$xTmn|;L-{!H zMEyjneOjNxK7p){`DW1b+zGG`{nbw%(F^GIWPFj^c=xf&)av$b&0);bp*?CJMndEi zocXk?pW?Q@y{S)g+n;gMc%J57gqh)1)@PR69QxST9JhVRJw&&LZxVHDnA1Ait>FxE zQTI*Nf_7(eZo=XG1 zOm_Er8Q8z@7@z0$^t}Sixe4^k6C-~W$h$N1>Gzr0wOs?+-S5`{cYVO?ze{fCzX9YU z@`Jssz?r)QoX|iS?04cf J|C=rzfIm1sRIUI3 literal 1488 zcmZXU-A=bC$8ZCLFav3mzXN)FT!wI(wk%1Y3>mKaai!WM@y>_R$(c9ar zcLIDmi4hK!UJE;u_^PbDJE*qz&GF~3FWgqU)A-n?d(2hCdh>Oo-s&c&?f*}kM1y&a zR`ElvQ>;GSeNrwz-%RePKJU=(b(3J_<*RC~^S0h4YRtR+7rSFD{nso?`1Y6sE`93` z`qt9-e#X^04?GwB0=8?54&K|faJU_Do|l^dG0)k{Z&*7`ldg`{G^I2jF`jbEngP23H znvD-4&&gA8)-$d@#cn^f>Yrv;uji)7oMtb;%&=>lGs|ubbJTT)U0rgI@a^FnMc*FQ zw2yIncn7)Y`^Nflj%Trd6wPVhuGf0Ph%esQ+@G zw~skjfH{5__A%!wkdHanu+52D%()Kacc|lg+yI`F&+^*l+yrXc0LHW2NPZE>J9G7z z_nA7zmVj|%U;EsxKJT0CP}}(xfqX=k)AF~0wT(L;=dAs#UuzlL99QJ{H*s_>a(DZj h^V~tVZ+H)Q-hAW!?X5Byzb#|hepmjD{6@t?@CUVtSC9Yz diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index d73b2517..b33b522b 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -122,52 +122,53 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& float4 _156 = atlasTexture.sample(atlasSampler, _152.xy, uint(rint(_152.z))); float _158 = _156.w; uint _161 = uint(UniformBuffer.LightCount); - float3 _163; - _163 = float3(0.0); float3 _164; - for (uint _166 = 0u; _166 < _161; _163 = _164, _166++) + _164 = float3(0.0); + float3 _165; + for (uint _167 = 0u; _167 < _161; _164 = _165, _167++) { - float _179 = float((lightBuffer._m0[_166].Color & 4278190080u) >> 24u); - float3 _186 = (float3(float(lightBuffer._m0[_166].X), float(lightBuffer._m0[_166].Y), float(lightBuffer._m0[_166].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _180 = float((lightBuffer._m0[_167].Color & 4278190080u) >> 24u); + float3 _186 = (float3(float(lightBuffer._m0[_167].X), float(lightBuffer._m0[_167].Y), float(lightBuffer._m0[_167].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; float _187 = length(_186); - if (_187 >= _179) + if (_187 >= _180) { - _164 = _163; + _165 = _164; continue; } float _194 = fast::clamp(dot(_110[_143], _186 / float3(_187)), 0.0, 1.0); if (_194 <= 0.0) { - _164 = _163; + _165 = _164; continue; } - _164 = _163 + ((float3(float(lightBuffer._m0[_166].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_166].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _194) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_187 / _179, 0.0, 1.0)))); + _165 = _164 + ((float3(float(lightBuffer._m0[_167].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _194) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_187 / _180, 0.0, 1.0)))); } - float _337; + float _335; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _337 = 0.0; + _335 = 0.0; break; } - float _241; - if (blockBuffer._m0[_130].HasOcclusion != 0u) + float _234 = blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w; + if (blockBuffer._m0[_130].CanBeInShadow == 0u) { - _241 = fast::clamp(-dot(_110[_143], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _335 = _234; + break; } - else + float _245; + if (blockBuffer._m0[_130].HasOcclusion != 0u) { - _241 = 0.7070000171661376953125; + _245 = fast::clamp(-dot(_110[_143], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } - if (_241 <= 0.0) + else { - _337 = 0.0; - break; + _245 = 0.7070000171661376953125; } - if (blockBuffer._m0[_130].CanBeInShadow == 0u) + if (_245 <= 0.0) { - _337 = blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w; + _335 = 0.0; break; } float4 _253 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); @@ -224,41 +225,41 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& } if (_291) { - _337 = (blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w) * _241; + _335 = _234 * _245; break; } - uint2 _296 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _302 = float2(1.0) / float2(float(_296.x), float(_296.y)); - float _305 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _241)); + uint2 _295 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _301 = float2(1.0) / float2(float(_295.x), float(_295.y)); + float _304 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _245)); + float _306; + int _309; + _306 = 0.0; + _309 = -1; float _307; - int _310; - _307 = 0.0; - _310 = -1; - float _308; - for (; _310 <= 1; _307 = _308, _310++) + for (; _309 <= 1; _306 = _307, _309++) { - _308 = _307; - for (int _318 = -1; _318 <= 1; ) + _307 = _306; + for (int _317 = -1; _317 <= 1; ) { - _308 += shadowTexture.sample_compare(shadowSampler, (_263 + (float2(float(_310), float(_318)) * _302)), _257.z - _305, level(0.0)); - _318++; + _307 += shadowTexture.sample_compare(shadowSampler, (_263 + (float2(float(_309), float(_317)) * _301)), _257.z - _304, level(0.0)); + _317++; continue; } } - _337 = ((blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w) * _241) * mix(1.0, _307 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _335 = (_234 * _245) * mix(1.0, _306 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _341 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _377; + float3 _338 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _372; if (blockBuffer._m0[_130].Indices[_146] == 16u) { - _377 = _158 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _372 = _158 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _377 = _158; + _372 = _158; } - out.out_var_SV_Target0 = float4(mix(_156.xyz * ((_163 + UniformBuffer_3.Ambient.xyz) + float3(_337)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_341.y, length(float2(_341.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _377); + out.out_var_SV_Target0 = float4(mix(_156.xyz * ((_164 + UniformBuffer_3.Ambient.xyz) + float3(_335)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_338.y, length(_338.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _372); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 9252619089fe43ad6160b3a5a85413bdec6282d0..7006522bce30900ac8a44cf7891206f57267de09 100644 GIT binary patch delta 2792 zcmYk7ON?2nvee;4|vNXmo2_XrgS4EW{@&449bseSNFU?eu@oIsbpEy6T+jz9%}qZ12;f zW^io?r4YiEAv@Wp?drPr&?}4}KA4~DU(POtn(zwI#c0om+Cn`9Hx+CLuY$usZ3y-V z7zNZ`18OHi&oCMLI#53VE`-a%QLMVxKg8~6%`pCQon;4`V1WH>RG?Els!k98$Jv6fFHq8xXIX`!EWFY=ng%?FIX?ztM)69b6NUM zeyMbu})=>51IvBz(;ZA7x2}c#0qp{y{v%RMIh%w^{Xq;-Su(9 z*QHW-*WQ6GH9f8G`TX>thHMC{`<}?NpU(MEIC-zc4U3#~I+nu;%uVqKeDgY3?`-mJ zz&A&JcjRuwpA$6>WL8vZq=}GjE**iJ;F^imJk3_~X8gHWH8*z)*3D`w6%654d<)cw zZ2_aA=8HKRe_qsXE3}LkD^_<5gb5Q#@Dnn&NFd;{!s_FIybslP5#wX5O^fisF2tM( zU?Na+5v}+xLTyqO#k7dqiA_k0m>l)A2z4iucM)`Ih_dJ~ji{eW#3r^m79pfCf zi04)MZ;33KiGC?8(H0yfbD+7yNZ@fawGE`9bMeo@S0B@PaPo8VRf8MWw&S_8pMaTuhm3t2o6(wpBV5oF zHo6+V1AidaH_(3`KNX#D^68U(7yiM>J8mWZ{Jd{tzxo9z^FjK1y&GR{LEhR}u3LyV zh};QzePc`hVq>rDJ{V`?W=w6-??sW5_p(2|`D3xii(~FoeDf$-!QUVGdU)qF&-3G$ zCHU&=@l)*{AcmhAHbJI;t)-9(34S%*{xUf3q7nDvxG8hff|utzni}dJgt1Va`GKZ> z*$O=F;=gn`j%s@NL-^{O(bEPVCgu*;0`<-+?UAUp!~X|H*zZ8sp|GU=u*V^M+d!H{lx;tyDtD0&; zD1{I%56_;gZ5x>V6RN^1*cYNa8*0Kh?1Nw~*bZI=hk(9O$k)JRpzkoy*B$zWImp+6 z{+GeIa8Wpd)NlJ2TmMlY&zxCdw1$hr28d&z9!v)gGLsI2k#7KfWhQX}$0LU*xM|1} zk#lp#$-No5stT?8~sFnWKdIc zCtL8`-UG7lfOo+zMw5RZ=-Uc9!X*WFDql0Oe!%V+@j;9_l{X9?SL(?Z@P8=ZH25(8 z4fTyM&Gl8rXM|%1-tS*(05jF?cPvALV^3R9r@H5h8V)gw3eg!T;=}^XK>pQ?W9^-HM zfX2G)cQw$TQRMn6|Q}AZ%f?R$VsP?9fx6Tvadlm zu9HP9CT={sG4gvOHvzpp`Y6w=IPPm9O^3&tmU$iANNjypx@nn+z67byonMdibd)J| zlh94gaO7mr9DQEe8_<_V-;~0adGUHHa4LiWEd=MmkNw3TTQ zPV7RAX#q2VJ{K_y-9_k|okeF_#2jn`(jr=;KP^JPgUP!H_4H!QMRx#ODIN3C zjgj}1O;LFPh7R-MF-zWvUIX;?7E}l~p_hQ~ozIHtScoleT2{ba4Yw$tIIOOAG0Y<1 zNDK4wu)54s@Kp5pGshCOnppS%2H(sn3YsIZRnog>dpUy`>rH7+lsS#v)ErMKQ&>aF#< zjR5v=k?DoL8GQ$SVZ$sAx0SHborg=HtT5{atmBF(wE8cOwFTk@~Ji+E0KQ(;Mey`Y{f7TXJ7sv zM=yBdQl7WLy@ajLo1J!~Oz-LwG3GRJ#=BYjo8~9c4>EuF4kH!CQ;^=ygcQ6T&JOx5 zDhJqs{vuLe>i;ylsYysR<-5(Vs44qdW5$*@#Qg8XFvymUXIJE;6ZcHyEUZon(iH55 Uv%m5B-SsREzb5+rW9q5kf1t}*h5!Hn diff --git a/shaders/bin/transparent.vert.msl b/shaders/bin/transparent.vert.msl index 53969994..5a3cec1e 100644 --- a/shaders/bin/transparent.vert.msl +++ b/shaders/bin/transparent.vert.msl @@ -18,7 +18,7 @@ struct type_UniformBuffer_2 int2 ChunkPosition; }; -constant float4 _48 = {}; +constant float4 _47 = {}; struct main0_out { @@ -37,18 +37,18 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _70 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _71 = float4(_70.x, _70.y, _70.z, _48.w); - float4 _78 = UniformBuffer_1.View * float4(_70, 1.0); - _71.w = _78.z; - float4 _83 = UniformBuffer.Proj * _78; - float2 _96 = ((_83.xy / float2(_83.w)) * 0.5) + float2(0.5); - _96.y = 1.0 - _96.y; - out.gl_Position = _83; - out.out_var_TEXCOORD0 = _71; + float3 _66 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(UniformBuffer_2.ChunkPosition.x, 0, UniformBuffer_2.ChunkPosition.y)); + float4 _67 = float4(_66.x, _66.y, _66.z, _47.w); + float4 _74 = UniformBuffer_1.View * float4(_66, 1.0); + _67.w = _74.z; + float4 _79 = UniformBuffer.Proj * _74; + float2 _92 = ((_79.xy / float2(_79.w)) * 0.5) + float2(0.5); + _92.y = 1.0 - _92.y; + out.gl_Position = _79; + out.out_var_TEXCOORD0 = _67; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _96; + out.out_var_TEXCOORD3 = _92; return out; } diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index 377491bcf69e2e1fadbd70640dab2a46be2b21fe..ebbbd73026f8ff109831bf9fff1b01cb50755527 100644 GIT binary patch literal 2616 zcmZ{k+jCS!5Qit54In5G5C|%878Fo0+;4J8LV&~z>=FT^AeV=vSSYeoNT7I=;)N%R zzlj(AC0;1_zH_FnV~kVPJN^50Pft&GpY3n#TA5N`N@;Dn%dcxNH8Rs*Vy)}ant$|1 z_qua}2BJq389-Jb1cU1@@iYztFstAeojK$FF6!%$l>Qpo0yalEYZmrFbk@iw>>E%D5lg#xBVvuTf6iWHtX;eb zaRuItuD|zfVfQ|B+fNO}Lx^`OamQA4-x&A{^c^+)CA#kj`&Z~6YIqyEvBU0M=o8pj zl~1$G-<+)N5Wg+o3r0QU~^VCZ~Y@@?+a{A1N#QQ;lRGZZ#b}aXI|XLZ^3>5InF8H zPvl{tFx%+=ezxn(iVP4(ZkO<4ZmaP+B(Fuj>i$t z8cW+7a`N62h<7`$Z!>o?^UmyJ?sc|KA@XtV2XxOl$8qj7y1a85=gy$Z$GNlUo^y8N z+&Ogl`h6o{dGq%hA4SZ;c-ng8B|nDvwio0sK97td@@=M}U>`^9gEsqV52J5mAm``; z;;cliTj&=ve-$5Va0xMnE4T@CxxN}VnYjjghlwcIe?&a5zjnX<*TgN@e?qi-U&Q@6 z^TwDW+k*WUMBeu}W0Cu1bmzXF`xUT!+|fq&9{K1+2i;!y-x9sJiZ1VeWb|+fT|UnJ zitai8gW}vZbou(Z>tOi~@ASLBff!4^OUEsXHs2aCen*#AUgfxdpc_Zq z->Whj82X;01LkGk>duw@QFp$4 TtGaV$tgEL)U4u~!hQdAqvyIB#8f zySjGs4RUk7DOY!M`-`)dC18*|an641Sv_LJo5{xrE*~Sfh@l=a;=M!+bI565iR@h$ z!A@#XUJP8JTW6Mi=v{@q1IaVqVc3@Anl|hFxEMLN6lgV@)M? zYx1r;`R!ttYre%n$1Zkd^Y3Oizj5^GVYim%%-XU&Nw@wJ*zL`4 z#xv^n<2MqzHTzA3Zq3RC;Q6T8e4%@Xq1%Jsbm;crHyyfmzXA0Eza@76)DGiiPv&vi z;}0_Xzjcbd-huy9*3w5r`#b=w)wd`-XWs{bwmP~qKa{xeJB%KFzMt?rf~+n4jv~ud z$mch73>eEdsjWtQ@BcW^_KhB_^8~O~-}m>#olLxM{B^496taByokrHrHynPw$nw79 z@H>MnAAWtv`uRPC-&th&e7=5k`RL~yvNfCm+U(mt&jWkh5 ze`?I|HnM#9-9gr`2*Pg|Sw8P~7hS$WpPlUYfU)Gu+>6|OU~R%x0C5Kokmc<)Vmw5a z7oStyN65y}_9bzTk>!^H--fwHfc$C@IYyC3fO$W0&N)8;&PSVfukTYJKLR{^nyOma dtxwr^<$RQVU-qi(JM*rT{Vy@jPa+%zzX42Uuo?gW diff --git a/shaders/bin/ui.vert.msl b/shaders/bin/ui.vert.msl index e9aaa6c5..caf4ba3d 100644 --- a/shaders/bin/ui.vert.msl +++ b/shaders/bin/ui.vert.msl @@ -50,7 +50,7 @@ struct type_UniformBuffer uint Index; }; -constant spvUnsafeArray _52 = spvUnsafeArray({ float2(0.0), float2(1.0, 0.0), float2(0.0, 1.0), float2(0.0, 1.0), float2(1.0, 0.0), float2(1.0) }); +constant spvUnsafeArray _51 = spvUnsafeArray({ float2(0.0), float2(1.0, 0.0), float2(0.0, 1.0), float2(0.0, 1.0), float2(1.0, 0.0), float2(1.0) }); struct main0_out { @@ -63,27 +63,29 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], uint gl_VertexIndex [[vertex_id]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float _68 = precise::max(float(UniformBuffer.Viewport.x) * 0.0007812500116415321826934814453125, float(UniformBuffer.Viewport.y) * 0.001388888922519981861114501953125); - bool _69 = gl_InstanceIndex == 0u; - float2 _86; - float2 _87; - if (_69) + float2 _61 = float2(UniformBuffer.Viewport); + float2 _62 = _61 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); + float _65 = precise::max(_62.x, _62.y); + bool _66 = gl_InstanceIndex == 0u; + float2 _81; + float2 _82; + if (_66) { - float2 _73 = float2(10.0) * _68; - _86 = _73 + float2(50.0 * _68); - _87 = _73; + float2 _70 = float2(10.0) * _65; + _81 = _70 + float2(50.0 * _65); + _82 = _70; } else { - float2 _79 = float2(UniformBuffer.Viewport) * 0.5; - float2 _83 = select(float2(2.0, 8.0), float2(8.0, 2.0), bool2(gl_InstanceIndex == 1u)) * _68; - _86 = _79 + _83; - _87 = _79 - _83; + float2 _74 = _61 * 0.5; + float2 _78 = select(float2(2.0, 8.0), float2(8.0, 2.0), bool2(gl_InstanceIndex == 1u)) * _65; + _81 = _74 + _78; + _82 = _74 - _78; } - out.gl_Position = float4(((mix(_87, _86, _52[gl_VertexIndex]) / float2(UniformBuffer.Viewport)) * 2.0) - float2(1.0), 0.0, 1.0); - out.out_var_TEXCOORD0 = float2(_52[gl_VertexIndex].x, 1.0 - _52[gl_VertexIndex].y); + out.gl_Position = float4(((mix(_82, _81, _51[gl_VertexIndex]) / _61) * 2.0) - float2(1.0), 0.0, 1.0); + out.out_var_TEXCOORD0 = float2(_51[gl_VertexIndex].x, 1.0 - _51[gl_VertexIndex].y); out.out_var_TEXCOORD1 = UniformBuffer.Index; - out.out_var_TEXCOORD2 = uint(_69); + out.out_var_TEXCOORD2 = uint(_66); return out; } diff --git a/shaders/bin/ui.vert.spv b/shaders/bin/ui.vert.spv index 616b482425c2696892b2ace14e8869d42dd0083a..26e84cc2f029c5616b231d2ad7c1c4b7e9c1c5f8 100644 GIT binary patch literal 2428 zcmZ9Mc~6vA6vi(MLl-D$Mcj4Jwzd_=rLMTZpcZUVaHDiplp&ckG6u%&KO1AxzxqAe z58$V;AIG>PCjI^1xu+5?c{uBP?sLw)cS@amK1it}rPP<|{CBNSorR|-br*7C>e^Iw zrL|B!a`d3_zEn~avHsLk=$-t(JKtE+Fxmympc}A3`Vf@((>F(Q8Sh8vt;hH3)f-EV z#pd$e@%xL5^<}^5E@Fh!Y@`10UURvn-pyBjBioBh3-w3HGTx7oYf9iR7tDU2X|6O{ zjpouydr$c^@3*QC=9jD2FU*~rp1ykCrsN~fwXs7vCjYgu!$qu%X}#}#g3j&VseBEz zorU(kY&(PY)Qp#kefx@7shCq+@1nDmb^@1m!0h_4*2~ykGK5TWlx`wH5ydUTjk+Tjxr6;42vmQ&IIpO;> z+xo+|0bN^cWWNDq1<2Rh+8co@>_K$n=5In)fXle{=E8cev1%+t$$bE*tmz4Y2Yq58)X` zs++SP=^c%4s@ZlQ;|Gv(wvPd{gW2yJ({Jrl_dQx$j_xx7e2@BOa^7V28~Y>sE~5Lru{YFpPwTr+ z)c+3M8Tg)q>-Xq#^-WvfGn)eX#oyd4XLkwcuYe&CH7}zZli$`g{46*S-NdfN#`V?q$xO zne!~VInF0~`vG0Qzf;lM9J+qrMcj`c(e=B+_Y=B4_ne`>y~v+|xyJgyI#6T2a{2{C z4{?V*|6g+~@_t*DH;8V(=G_Fw2j1+5QYz#%mhsgJGdZBKtLr9h=3S`Fab=^K*DNN6r!2vh-9c_aQUZYS>-S9 zLodLqkjtT5s;u&P&YYI1e5s!9x4TboU!O0Pf&D`%ZAdANrmy(**^&mbW;oR{pPs!w z+gR%^HIAP+s(mz7WZAYU4QF|P-}{U06@k`4s0!5}5~Ph#g+Fx*I9Jg=h1~t_L920d zrM=u)y+8GEdAYUfnOe4CPPf{vZyt13yUI0AdB$oltt_>^g;&u&4PO@meKl8hZ@#nE z?zTHCYrUM-(|Oo!e7(5ZxN&je{M_8N3pQmv*16vHda+smdfTyV8)RBfdY`6q`*$j@ zLSknjK3uRf=uJ&~CFdQ@wo0B;PadSRl=eVA#<4!J{fn(hY<{tG*awAOJO=s9(4n*Q z+23RT>-1M=JnPZVm^+b2;C1LQ@s*!}e0G7YQ=Pu!#20UZ^pWDsX5^H;RNm2g` z*=J@d@a~M$WW;X*@e;B-vm5^daNmczI`|;m8a;3PLvU+#H?_YEcW>2;Un$raVs}})=eJRnyF7+w z9ImX-YjAhexZ*~^5#tEhn(agT(Sq%BI~MPndheBf<~j{_H{E4*VtcWc4Sm=?0^5ss zOdtL2#kmBw7whcD?!MUkZxp*T9B0Dv_I8U6)21-D-F`+cy+vs9&Q{xjH|$y<=M2A)8+|0Z#r@oC6;c{iGL z?wsH5)2a8Yb3apT9kB21Y|;HhEb(N~*;~XqhaB;}ZxO4BtSw?qA*+j6=aJPpml3)% z{sqYQHV>IgpWn#stS&(twV_hryI(!U@nAefDS^tlv)*Hy?(iZjK?9=tvZy%4DxjAk@_UX*@x3{ppk8JpuRiwf3uNPIbGFCeZOA(nvApMB7QMS6z6ZJY?vQuFZ$lMs XKgu<@v6YA5o>$%o_w2t+;S}^Atc{)_ diff --git a/shaders/depth.vert b/shaders/depth.vert index a1e1fb30..443c59e9 100644 --- a/shaders/depth.vert +++ b/shaders/depth.vert @@ -28,7 +28,7 @@ struct Output Output main(Input input) { Output output; - int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); + int3 chunkPosition = int3(ChunkPosition.x, 0, ChunkPosition.y); float3 position = GetPosition(input.Voxel) + chunkPosition; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); return output; diff --git a/shaders/opaque.frag b/shaders/opaque.frag index f7fa98f3..f16cb317 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -35,7 +35,7 @@ struct Input float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float AO : TEXCOORD3; + float AmbientOcclusion : TEXCOORD3; }; struct Output @@ -47,20 +47,20 @@ struct Output Output main(Input input) { Output output; - Block block = blockBuffer[GetBlock(input.Voxel)]; - float3 texcoord = float3(input.Texcoord, GetIndex(input.Voxel, block)); - float4 color = atlasTexture.Sample(atlasSampler, texcoord); + Block block = blockBuffer[GetBlockIndex(input.Voxel)]; + float3 texcoord = float3(input.Texcoord, GetAtlasIndex(input.Voxel, block)); + float4 texel = atlasTexture.Sample(atlasSampler, texcoord); output.Position = input.WorldPosition; - if (color.a < kEpsilon) + if (texel.a < kEpsilon) { discard; return output; } - float3 albedo = color.rgb; + float3 albedo = texel.rgb; float3 normal = GetNormal(input.Voxel, block); - float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, input.WorldPosition, normal); + float3 pointLight = GetPointLight(lightBuffer, LightCount, input.WorldPosition.xyz, normal); float3 ambient = Ambient.xyz; - float sun = GetSunLight( + float sunlight = GetSunLight( shadowTexture, shadowSampler, ShadowTransform, @@ -69,9 +69,9 @@ Output main(Input input) input.WorldPosition.xyz, normal, block); - float3 finalColor = albedo * (diffuse + ambient * input.AO + sun); + float3 litColor = albedo * (pointLight + ambient * input.AmbientOcclusion + sunlight); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); - float fog = GetFog(distance(input.WorldPosition.xz, PlayerPosition.xz)); - output.Color = float4(lerp(finalColor, sky, fog), 1.0f); + float fog = GetFogAmount(distance(input.WorldPosition.xz, PlayerPosition.xz)); + output.Color = float4(lerp(litColor, sky, fog), 1.0f); return output; } diff --git a/shaders/opaque.vert b/shaders/opaque.vert index 5d78bd18..9908789d 100644 --- a/shaders/opaque.vert +++ b/shaders/opaque.vert @@ -26,19 +26,19 @@ struct Output float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float AO : TEXCOORD3; + float AmbientOcclusion : TEXCOORD3; }; Output main(Input input) { Output output; - int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); + int3 chunkPosition = int3(ChunkPosition.x, 0, ChunkPosition.y); output.WorldPosition.xyz = GetPosition(input.Voxel) + chunkPosition; output.Position = mul(View, float4(output.WorldPosition.xyz, 1.0f)); output.WorldPosition.w = output.Position.z; output.Position = mul(Proj, output.Position); output.Texcoord = GetTexcoord(input.Voxel); output.Voxel = input.Voxel; - output.AO = GetAO(input.Voxel); + output.AmbientOcclusion = GetAmbientOcclusion(input.Voxel); return output; } diff --git a/shaders/raycast.vert b/shaders/raycast.vert index 07eb521c..9de7ca65 100644 --- a/shaders/raycast.vert +++ b/shaders/raycast.vert @@ -15,14 +15,11 @@ struct Output float4 Position : SV_POSITION; }; -static const float kZ = 0.1f; - Output main(uint vertexID : SV_VertexID) { Output output; float3 position = GetCubePosition(vertexID); position += BlockPosition + 0.5f; output.Position = mul(Transform, float4(position, 1.0f)); - output.Position.z = kZ; return output; } diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index d8db237a..d7fd151f 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -59,7 +59,7 @@ static const uint kCubeIndices[36] = { 4, 5, 1, 4, 1, 0, // -Y }; -float GetAO(uint voxel) +float GetAmbientOcclusion(uint voxel) { static const float kAO[4] = {0.4f, 0.6f, 0.8f, 1.0f}; return kAO[(voxel >> AO_OFFSET) & AO_MASK]; @@ -70,7 +70,7 @@ uint GetDirection(uint voxel) return (voxel >> DIRECTION_OFFSET) & DIRECTION_MASK; } -uint GetBlock(uint voxel) +uint GetBlockIndex(uint voxel) { return (voxel >> BLOCK_OFFSET) & BLOCK_MASK; } @@ -83,7 +83,7 @@ float3 GetPosition(uint voxel) (voxel >> Z_OFFSET) & Z_MASK); } -uint GetIndex(uint voxel, Block block) +uint GetAtlasIndex(uint voxel, Block block) { uint direction = block.IsSprite ? 0 : GetDirection(voxel); return block.Indices[direction]; @@ -119,46 +119,46 @@ struct Light int Z; }; -float3 GetDiffuseLight( +float3 GetPointLight( StructuredBuffer lights, uint lightCount, - float4 position, + float3 position, float3 normal) { static const float3 kOffset = float3(0.0f, 0.25f, 0.0f); - float3 finalColor = float3(0.0f, 0.0f, 0.0f); - for (uint i = 0; i < lightCount; i++) + float3 accumulatedLight = float3(0.0f, 0.0f, 0.0f); + for (uint lightIndex = 0; lightIndex < lightCount; lightIndex++) { - Light light = lights[i]; + Light light = lights[lightIndex]; float radius = (light.Color & 0xFF000000) >> 24; float3 lightPosition = float3(light.X, light.Y, light.Z) + 0.5f + kOffset; - float3 offset = lightPosition - position.xyz; + float3 offset = lightPosition - position; float distance = length(offset); if (distance >= radius) { continue; } float3 lightDirection = offset / distance; - float NdotL = saturate(dot(normal, lightDirection)); - if (NdotL <= 0.0f) + float lightAngle = saturate(dot(normal, lightDirection)); + if (lightAngle <= 0.0f) { continue; } float normalizedDistance = saturate(distance / radius); float attenuation = 1.0f - smoothstep(0.0f, 1.0f, normalizedDistance); - float3 color; - color.r = ((light.Color & 0x000000FF) >> 0) / 255.0f; - color.g = ((light.Color & 0x0000FF00) >> 8) / 255.0f; - color.b = ((light.Color & 0x00FF0000) >> 16) / 255.0f; - finalColor += color * NdotL * attenuation; + float3 lightColor; + lightColor.r = ((light.Color & 0x000000FF) >> 0) / 255.0f; + lightColor.g = ((light.Color & 0x0000FF00) >> 8) / 255.0f; + lightColor.b = ((light.Color & 0x00FF0000) >> 16) / 255.0f; + accumulatedLight += lightColor * lightAngle * attenuation; } - return finalColor; + return accumulatedLight; } float GetSunLight( - Texture2D texture, - SamplerComparisonState state, - float4x4 transform, + Texture2D shadowTexture, + SamplerComparisonState shadowSampler, + float4x4 shadowTransform, float3 sunDirection, float sunIntensity, float3 position, @@ -169,57 +169,58 @@ float GetSunLight( { return 0.0f; } - float ratio = block.HasOcclusion ? saturate(-dot(normal, sunDirection)) : 0.707f; - if (ratio <= 0.0f) + float sunlight = block.blockSunIntensity * sunIntensity; + if (!block.CanBeInShadow) { - return 0.0f; + return sunlight; } - if (!block.CanBeInShadow) + float lightAngle = block.HasOcclusion ? saturate(-dot(normal, sunDirection)) : 0.707f; + if (lightAngle <= 0.0f) { - return block.blockSunIntensity * sunIntensity; + return 0.0f; } - float4 shadowPosition = mul(transform, float4(position, 1.0f)); + float4 shadowPosition = mul(shadowTransform, float4(position, 1.0f)); shadowPosition.xyz /= shadowPosition.w; float2 uv = shadowPosition.xy * 0.5f + 0.5f; uv.y = 1.0f - uv.y; if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || shadowPosition.z > 1.0f) { - return block.blockSunIntensity * sunIntensity * ratio; + return sunlight * lightAngle; } uint width; uint height; - texture.GetDimensions(width, height); + shadowTexture.GetDimensions(width, height); float2 texelSize = 1.0f / float2(width, height); - float bias = 0.0003f + 0.001f * (1.0f - ratio); - float visibility = 0.0f; + float bias = 0.0003f + 0.001f * (1.0f - lightAngle); + float shadowVisibility = 0.0f; for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { - visibility += texture.SampleCmpLevelZero( - state, + shadowVisibility += shadowTexture.SampleCmpLevelZero( + shadowSampler, uv + float2(x, y) * texelSize, shadowPosition.z - bias); } } - visibility /= 9.0f; + shadowVisibility /= 9.0f; float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); - visibility = lerp(1.0f, visibility, shadowFade); - return block.blockSunIntensity * sunIntensity * ratio * visibility; + shadowVisibility = lerp(1.0f, shadowVisibility, shadowFade); + return sunlight * lightAngle * shadowVisibility; } -float GetFog(float x) +float GetFogAmount(float distance) { - return min(pow(x / 250.0f, 2.5f), 1.0f); + return min(pow(distance / 250.0f, 2.5f), 1.0f); } float3 GetSkyColor(float3 position, float3 top, float3 horizon) { - float dy = position.y; - float dx = length(float2(position.x, position.z)); - float alpha = (atan2(dy, dx) + kPi / 2.0f) / kPi; - return lerp(horizon, top, alpha); + float vertical = position.y; + float horizontal = length(position.xz); + float blend = (atan2(vertical, horizontal) + kPi / 2.0f) / kPi; + return lerp(horizon, top, blend); } #endif diff --git a/shaders/shadow.vert b/shaders/shadow.vert index ba270d9d..7361178e 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -31,9 +31,9 @@ struct Output Output main(Input input) { Output output; - int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); + int3 chunkPosition = int3(ChunkPosition.x, 0, ChunkPosition.y); float3 position = GetPosition(input.Voxel) + chunkPosition; - Block block = blockBuffer[GetBlock(input.Voxel)]; + Block block = blockBuffer[GetBlockIndex(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); output.ClipDistance = block.HasShadow ? 1.0f : -1.0f; return output; diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 125c7019..63b3c1e8 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -44,17 +44,17 @@ static const uint kWater = 16; float4 main(Input input) : SV_Target0 { - Block block = blockBuffer[GetBlock(input.Voxel)]; + Block block = blockBuffer[GetBlockIndex(input.Voxel)]; float3 normal = GetNormal(input.Voxel, block); - uint index = GetIndex(input.Voxel, block); + uint index = GetAtlasIndex(input.Voxel, block); float3 texcoord = float3(input.Texcoord, index); - float4 color = atlasTexture.Sample(atlasSampler, texcoord); - float3 albedo = color.rgb; - float alpha = color.a; + float4 texel = atlasTexture.Sample(atlasSampler, texcoord); + float3 albedo = texel.rgb; + float alpha = texel.a; float4 position = input.WorldPosition; - float3 diffuse = GetDiffuseLight(lightBuffer, LightCount, position, normal); + float3 pointLight = GetPointLight(lightBuffer, LightCount, position.xyz, normal); float3 ambient = Ambient.xyz; - float sun = GetSunLight( + float sunlight = GetSunLight( shadowTexture, shadowSampler, ShadowTransform, @@ -64,11 +64,12 @@ float4 main(Input input) : SV_Target0 normal, block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); - float fog = GetFog(distance(position.xz, PlayerPosition.xz)); + float fog = GetFogAmount(distance(position.xz, PlayerPosition.xz)); if (index == kWater) { float3 groundPosition = positionTexture.Sample(positionSampler, input.Fragment).xyz; alpha += (input.WorldPosition.y - groundPosition.y) / 10.0f; } - return float4(lerp(albedo * (diffuse + ambient + sun), sky, fog), alpha); + float3 litColor = albedo * (pointLight + ambient + sunlight); + return float4(lerp(litColor, sky, fog), alpha); } diff --git a/shaders/transparent.vert b/shaders/transparent.vert index 01a736b4..46f4db9d 100644 --- a/shaders/transparent.vert +++ b/shaders/transparent.vert @@ -32,15 +32,14 @@ struct Output Output main(Input input) { Output output; - int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); + int3 chunkPosition = int3(ChunkPosition.x, 0, ChunkPosition.y); output.WorldPosition.xyz = GetPosition(input.Voxel) + chunkPosition; output.Position = mul(View, float4(output.WorldPosition.xyz, 1.0f)); output.WorldPosition.w = output.Position.z; output.Position = mul(Proj, output.Position); output.Texcoord = GetTexcoord(input.Voxel); output.Voxel = input.Voxel; - output.Fragment = output.Position.xy / output.Position.w; - output.Fragment = output.Fragment * 0.5f + 0.5f; + output.Fragment = output.Position.xy / output.Position.w * 0.5f + 0.5f; output.Fragment.y = 1.0f - output.Fragment.y; return output; } diff --git a/shaders/ui.vert b/shaders/ui.vert index a3d67502..b30f226c 100644 --- a/shaders/ui.vert +++ b/shaders/ui.vert @@ -12,8 +12,7 @@ struct Output nointerpolation uint IsTexture : TEXCOORD2; }; -static const float kWidth = 1280.0f; -static const float kHeight = 720.0f; +static const float2 kReferenceSize = float2(1280.0f, 720.0f); static const float2 kPositions[6] = { float2(0.0f, 0.0f), @@ -26,22 +25,23 @@ static const float2 kPositions[6] = { Output main(uint vertexID : SV_VertexID, uint instanceID : SV_InstanceID) { - float scale = max(Viewport.x / kWidth, Viewport.y / kHeight); - float2 start; - float2 end; + float2 viewportScale = float2(Viewport) / kReferenceSize; + float scale = max(viewportScale.x, viewportScale.y); + float2 minimum; + float2 maximum; if (instanceID == 0) { - start = float2(10.0f, 10.0f) * scale; - end = start + 50.0f * scale; + minimum = float2(10.0f, 10.0f) * scale; + maximum = minimum + 50.0f * scale; } else { float2 center = float2(Viewport) * 0.5f; float2 size = instanceID == 1 ? float2(8.0f, 2.0f) : float2(2.0f, 8.0f); - start = center - size * scale; - end = center + size * scale; + minimum = center - size * scale; + maximum = center + size * scale; } - float2 position = lerp(start, end, kPositions[vertexID]); + float2 position = lerp(minimum, maximum, kPositions[vertexID]); position = position / float2(Viewport) * 2.0f - 1.0f; Output output; output.Position = float4(position, 0.0f, 1.0f); diff --git a/src/block.c b/src/block.c index 093ed93e..b58f780d 100644 --- a/src/block.c +++ b/src/block.c @@ -33,7 +33,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {2, 2, 2, 2, 1, 3}, }, [BLOCK_DIRT] = @@ -43,7 +43,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {3, 3, 3, 3, 3, 3}, }, [BLOCK_SAND] = @@ -53,7 +53,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {5, 5, 5, 5, 5, 5}, }, [BLOCK_SNOW] = @@ -63,7 +63,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {6, 6, 6, 6, 6, 6}, }, [BLOCK_STONE] = @@ -73,7 +73,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {4, 4, 4, 4, 4, 4}, }, [BLOCK_LOG] = @@ -83,7 +83,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {8, 8, 8, 8, 7, 7}, }, [BLOCK_LEAVES] = @@ -93,7 +93,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {10, 10, 10, 10, 10, 10}, }, [BLOCK_CLOUD] = @@ -109,7 +109,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {15, 15, 15, 15, 15, 15}, }, [BLOCK_BLUEBELL] = @@ -117,7 +117,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {13, 13, 13, 13, 13, 13}, }, [BLOCK_GARDENIA] = @@ -125,7 +125,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {12, 12, 12, 12, 12, 12}, }, [BLOCK_ROSE] = @@ -133,7 +133,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {11, 11, 11, 11, 11, 11}, }, [BLOCK_LAVENDER] = @@ -141,13 +141,13 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {14, 14, 14, 14, 14, 14}, }, [BLOCK_WATER] = { .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {16, 16, 16, 16, 16, 16}, }, [BLOCK_RED_TORCH] = @@ -155,7 +155,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {17, 17, 17, 17, 17, 17}, .light = {236, 39, 63, TORCH_INTENSITY}, }, @@ -164,7 +164,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {18, 18, 18, 18, 18, 18}, .light = {90, 181, 82, TORCH_INTENSITY}, }, @@ -173,7 +173,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {19, 19, 19, 19, 19, 19}, .light = {51, 136, 222, TORCH_INTENSITY}, }, @@ -182,7 +182,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {20, 20, 20, 20, 20, 20}, .light = {243, 168, 51, TORCH_INTENSITY}, }, @@ -191,7 +191,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {21, 21, 21, 21, 21, 21}, .light = {54, 197, 244, TORCH_INTENSITY}, }, @@ -200,7 +200,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {22, 22, 22, 22, 22, 22}, .light = {250, 110, 121, TORCH_INTENSITY}, }, @@ -209,7 +209,7 @@ struct .is_opaque = true, .is_sprite = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {23, 23, 23, 23, 23, 23}, .light = {255, 255, 255, TORCH_INTENSITY}, }, @@ -220,7 +220,7 @@ struct .has_occlusion = true, .has_shadow = true, .can_be_in_shadow = true, - .sun_intensity = 0.4f, + .sun_intensity = 0.55f, .indices = {24, 24, 24, 24, 24, 24}, }, }; @@ -238,19 +238,19 @@ SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) GPUBuffer_Free(&gpu_blocks); return NULL; } - for (int i = 0; i < BLOCK_COUNT; i++) + for (int block_index = 0; block_index < BLOCK_COUNT; block_index++) { - BlockGPU block = {0}; - block.is_sprite = Block_IsSprite(i); - block.has_occlusion = Block_HasOcclusion(i); - block.has_shadow = Block_HasShadow(i); - block.can_be_in_shadow = Block_CanBeInShadow(i); - block.block_sun_intensity = BLOCKS[i].sun_intensity; - for (int j = 0; j < DIRECTION_COUNT; j++) + BlockGPU gpu_block = {0}; + gpu_block.is_sprite = BLOCKS[block_index].is_sprite; + gpu_block.has_occlusion = BLOCKS[block_index].has_occlusion; + gpu_block.has_shadow = BLOCKS[block_index].has_shadow; + gpu_block.can_be_in_shadow = BLOCKS[block_index].can_be_in_shadow; + gpu_block.block_sun_intensity = BLOCKS[block_index].sun_intensity; + for (Direction direction = 0; direction < DIRECTION_COUNT; direction++) { - block.indices[j] = BLOCKS[i].indices[j]; + gpu_block.indices[direction] = BLOCKS[block_index].indices[direction]; } - CPUBuffer_Append(&cpu_blocks, &block); + CPUBuffer_Append(&cpu_blocks, &gpu_block); } GPUBuffer_Upload(&gpu_blocks, &cpu_blocks); GPUBuffer_EndUpload(); diff --git a/src/buffer.c b/src/buffer.c index e2703a33..5ccfd080 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2,158 +2,158 @@ #include "buffer.h" -static _Thread_local SDL_GPUCommandBuffer* cbuf; -static _Thread_local SDL_GPUCopyPass* pass; +static _Thread_local SDL_GPUCommandBuffer* upload_command_buffer; +static _Thread_local SDL_GPUCopyPass* upload_pass; -void CPUBuffer_Init(CPUBuffer* cpu, SDL_GPUDevice* device, Uint32 stride) +void CPUBuffer_Init(CPUBuffer* buffer, SDL_GPUDevice* device, Uint32 stride) { SDL_assert(stride); - cpu->device = device; - cpu->buffer = NULL; - cpu->data = NULL; - cpu->capacity = 0; - cpu->size = 0; - cpu->stride = stride; + buffer->device = device; + buffer->buffer = NULL; + buffer->data = NULL; + buffer->capacity = 0; + buffer->size = 0; + buffer->stride = stride; } -void CPUBuffer_Free(CPUBuffer* cpu) +void CPUBuffer_Free(CPUBuffer* buffer) { - SDL_ReleaseGPUTransferBuffer(cpu->device, cpu->buffer); - cpu->device = NULL; - cpu->buffer = NULL; - cpu->data = NULL; - cpu->capacity = 0; - cpu->size = 0; - cpu->stride = 0; + SDL_ReleaseGPUTransferBuffer(buffer->device, buffer->buffer); + buffer->device = NULL; + buffer->buffer = NULL; + buffer->data = NULL; + buffer->capacity = 0; + buffer->size = 0; + buffer->stride = 0; } -void CPUBuffer_Append(CPUBuffer* cpu, const void* item) +void CPUBuffer_Append(CPUBuffer* buffer, const void* item) { - if (!cpu->data && cpu->buffer) + if (!buffer->data && buffer->buffer) { - SDL_assert(!cpu->size); - cpu->data = SDL_MapGPUTransferBuffer(cpu->device, cpu->buffer, true); - if (!cpu->data) + SDL_assert(!buffer->size); + buffer->data = SDL_MapGPUTransferBuffer(buffer->device, buffer->buffer, true); + if (!buffer->data) { SDL_Log("Failed to map transfer buffer: %s", SDL_GetError()); return; } } - SDL_assert(cpu->size <= cpu->capacity); - if (cpu->size == cpu->capacity) + SDL_assert(buffer->size <= buffer->capacity); + if (buffer->size == buffer->capacity) { - int capacity = SDL_max(64, cpu->size * 2); + int capacity = SDL_max(64, buffer->size * 2); SDL_GPUTransferBufferCreateInfo info = {0}; info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; - info.size = capacity * cpu->stride; - SDL_GPUTransferBuffer* buffer = SDL_CreateGPUTransferBuffer(cpu->device, &info); - if (!buffer) + info.size = capacity * buffer->stride; + SDL_GPUTransferBuffer* transfer_buffer = SDL_CreateGPUTransferBuffer(buffer->device, &info); + if (!transfer_buffer) { SDL_Log("Failed to create transfer buffer: %s", SDL_GetError()); return; } - void* data = SDL_MapGPUTransferBuffer(cpu->device, buffer, false); + void* data = SDL_MapGPUTransferBuffer(buffer->device, transfer_buffer, false); if (!data) { SDL_Log("Failed to map transfer buffer: %s", SDL_GetError()); - SDL_ReleaseGPUTransferBuffer(cpu->device, buffer); + SDL_ReleaseGPUTransferBuffer(buffer->device, transfer_buffer); return; } - if (cpu->data) + if (buffer->data) { - SDL_memcpy(data, cpu->data, cpu->size * cpu->stride); - SDL_UnmapGPUTransferBuffer(cpu->device, cpu->buffer); + SDL_memcpy(data, buffer->data, buffer->size * buffer->stride); + SDL_UnmapGPUTransferBuffer(buffer->device, buffer->buffer); } - SDL_ReleaseGPUTransferBuffer(cpu->device, cpu->buffer); - cpu->capacity = capacity; - cpu->buffer = buffer; - cpu->data = data; + SDL_ReleaseGPUTransferBuffer(buffer->device, buffer->buffer); + buffer->capacity = capacity; + buffer->buffer = transfer_buffer; + buffer->data = data; } - SDL_assert(cpu->data); - SDL_memcpy(cpu->data + cpu->size * cpu->stride, item, cpu->stride); - cpu->size++; + SDL_assert(buffer->data); + SDL_memcpy((Uint8*)buffer->data + buffer->size * buffer->stride, item, buffer->stride); + buffer->size++; } -void GPUBuffer_Init(GPUBuffer* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage) +void GPUBuffer_Init(GPUBuffer* buffer, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage) { - gpu->device = device; - gpu->usage = usage; - gpu->buffer = NULL; - gpu->capacity = 0; - gpu->size = 0; + buffer->device = device; + buffer->usage = usage; + buffer->buffer = NULL; + buffer->capacity = 0; + buffer->size = 0; } -void GPUBuffer_Free(GPUBuffer* gpu) +void GPUBuffer_Free(GPUBuffer* buffer) { - SDL_ReleaseGPUBuffer(gpu->device, gpu->buffer); - gpu->usage = 0; - gpu->buffer = NULL; - gpu->capacity = 0; - gpu->size = 0; + SDL_ReleaseGPUBuffer(buffer->device, buffer->buffer); + buffer->usage = 0; + buffer->buffer = NULL; + buffer->capacity = 0; + buffer->size = 0; } -void GPUBuffer_Upload(GPUBuffer* gpu, CPUBuffer* cpu) +void GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) { - SDL_assert(cbuf); - SDL_assert(pass); - gpu->size = 0; - if (cpu->data) + SDL_assert(upload_command_buffer); + SDL_assert(upload_pass); + destination->size = 0; + if (source->data) { - SDL_UnmapGPUTransferBuffer(gpu->device, cpu->buffer); - cpu->data = NULL; + SDL_UnmapGPUTransferBuffer(destination->device, source->buffer); + source->data = NULL; } - if (!cpu->size) + if (!source->size) { return; } - Uint32 size = cpu->size; - cpu->size = 0; - if (size > gpu->capacity) + Uint32 size = source->size; + source->size = 0; + if (size > destination->capacity) { - SDL_ReleaseGPUBuffer(gpu->device, gpu->buffer); - gpu->buffer = NULL; - gpu->capacity = 0; + SDL_ReleaseGPUBuffer(destination->device, destination->buffer); + destination->buffer = NULL; + destination->capacity = 0; SDL_GPUBufferCreateInfo info = {0}; - info.usage = gpu->usage; - info.size = cpu->capacity * cpu->stride; - gpu->buffer = SDL_CreateGPUBuffer(gpu->device, &info); - if (!gpu->buffer) + info.usage = destination->usage; + info.size = source->capacity * source->stride; + destination->buffer = SDL_CreateGPUBuffer(destination->device, &info); + if (!destination->buffer) { SDL_Log("Failed to create buffer: %s", SDL_GetError()); return; } - gpu->capacity = cpu->capacity; + destination->capacity = source->capacity; } SDL_GPUTransferBufferLocation location = {0}; SDL_GPUBufferRegion region = {0}; - location.transfer_buffer = cpu->buffer; - region.buffer = gpu->buffer; - region.size = size * cpu->stride; - SDL_UploadToGPUBuffer(pass, &location, ®ion, true); - gpu->size = size; + location.transfer_buffer = source->buffer; + region.buffer = destination->buffer; + region.size = size * source->stride; + SDL_UploadToGPUBuffer(upload_pass, &location, ®ion, true); + destination->size = size; } -void GPUBuffer_Clear(GPUBuffer* gpu) +void GPUBuffer_Clear(GPUBuffer* buffer) { - gpu->size = 0; + buffer->size = 0; } -bool GPUBuffer_BeginUpload(GPUBuffer* gpu) +bool GPUBuffer_BeginUpload(GPUBuffer* buffer) { - SDL_assert(!cbuf); - SDL_assert(!pass); - cbuf = SDL_AcquireGPUCommandBuffer(gpu->device); - if (!cbuf) + SDL_assert(!upload_command_buffer); + SDL_assert(!upload_pass); + upload_command_buffer = SDL_AcquireGPUCommandBuffer(buffer->device); + if (!upload_command_buffer) { SDL_Log("Failed to acquire command buffer: %s", SDL_GetError()); return false; } - pass = SDL_BeginGPUCopyPass(cbuf); - if (!pass) + upload_pass = SDL_BeginGPUCopyPass(upload_command_buffer); + if (!upload_pass) { SDL_Log("Failed to begin copy pass: %s", SDL_GetError()); - SDL_CancelGPUCommandBuffer(cbuf); - cbuf = NULL; + SDL_CancelGPUCommandBuffer(upload_command_buffer); + upload_command_buffer = NULL; return false; } return true; @@ -161,10 +161,10 @@ bool GPUBuffer_BeginUpload(GPUBuffer* gpu) void GPUBuffer_EndUpload() { - SDL_assert(pass); - SDL_assert(cbuf); - SDL_EndGPUCopyPass(pass); - SDL_SubmitGPUCommandBuffer(cbuf); - pass = NULL; - cbuf = NULL; + SDL_assert(upload_pass); + SDL_assert(upload_command_buffer); + SDL_EndGPUCopyPass(upload_pass); + SDL_SubmitGPUCommandBuffer(upload_command_buffer); + upload_pass = NULL; + upload_command_buffer = NULL; } diff --git a/src/buffer.h b/src/buffer.h index cffb6c05..129a89bb 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -12,9 +12,9 @@ typedef struct CPUBuffer Uint32 stride; } CPUBuffer; -void CPUBuffer_Init(CPUBuffer* cpu, SDL_GPUDevice* device, Uint32 stride); -void CPUBuffer_Free(CPUBuffer* cpu); -void CPUBuffer_Append(CPUBuffer* cpu, const void* item); +void CPUBuffer_Init(CPUBuffer* buffer, SDL_GPUDevice* device, Uint32 stride); +void CPUBuffer_Free(CPUBuffer* buffer); +void CPUBuffer_Append(CPUBuffer* buffer, const void* item); typedef struct GPUBuffer { @@ -25,9 +25,9 @@ typedef struct GPUBuffer Uint32 capacity; } GPUBuffer; -void GPUBuffer_Init(GPUBuffer* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage); -void GPUBuffer_Free(GPUBuffer* gpu); -void GPUBuffer_Upload(GPUBuffer* gpu, CPUBuffer* cpu); -void GPUBuffer_Clear(GPUBuffer* gpu); -bool GPUBuffer_BeginUpload(GPUBuffer* gpu); +void GPUBuffer_Init(GPUBuffer* buffer, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage); +void GPUBuffer_Free(GPUBuffer* buffer); +void GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source); +void GPUBuffer_Clear(GPUBuffer* buffer); +bool GPUBuffer_BeginUpload(GPUBuffer* buffer); void GPUBuffer_EndUpload(); diff --git a/src/camera.c b/src/camera.c index ee95b968..06828f86 100644 --- a/src/camera.c +++ b/src/camera.c @@ -5,24 +5,24 @@ #define DEGREES(rad) ((rad) * 180.0f / SDL_PI_F) #define RADIANS(deg) ((deg) * SDL_PI_F / 180.0f) -static void Multiply(float matrix[4][4], float a[4][4], float b[4][4]) +static void MultiplyMatrices(float output[4][4], float left[4][4], float right[4][4]) { - float c[4][4] = {0}; - for (int i = 0; i < 4; i++) + float result[4][4] = {0}; + for (int row = 0; row < 4; row++) { - for (int j = 0; j < 4; j++) + for (int column = 0; column < 4; column++) { - c[i][j] += a[0][j] * b[i][0]; - c[i][j] += a[1][j] * b[i][1]; - c[i][j] += a[2][j] * b[i][2]; - c[i][j] += a[3][j] * b[i][3]; + result[row][column] += left[0][column] * right[row][0]; + result[row][column] += left[1][column] * right[row][1]; + result[row][column] += left[2][column] * right[row][2]; + result[row][column] += left[3][column] * right[row][3]; } } - for (int i = 0; i < 4; i++) + for (int row = 0; row < 4; row++) { - for (int j = 0; j < 4; j++) + for (int column = 0; column < 4; column++) { - matrix[i][j] = c[i][j]; + output[row][column] = result[row][column]; } } } @@ -92,66 +92,66 @@ static void Translate(float matrix[4][4], float x, float y, float z) matrix[3][3] = 1.0f; } -static void Frustum(float planes[6][4], float a[4][4]) +static void CalculateFrustum(float planes[6][4], float matrix[4][4]) { - planes[0][0] = a[0][3] + a[0][0]; - planes[0][1] = a[1][3] + a[1][0]; - planes[0][2] = a[2][3] + a[2][0]; - planes[0][3] = a[3][3] + a[3][0]; - planes[1][0] = a[0][3] - a[0][0]; - planes[1][1] = a[1][3] - a[1][0]; - planes[1][2] = a[2][3] - a[2][0]; - planes[1][3] = a[3][3] - a[3][0]; - planes[2][0] = a[0][3] + a[0][1]; - planes[2][1] = a[1][3] + a[1][1]; - planes[2][2] = a[2][3] + a[2][1]; - planes[2][3] = a[3][3] + a[3][1]; - planes[3][0] = a[0][3] - a[0][1]; - planes[3][1] = a[1][3] - a[1][1]; - planes[3][2] = a[2][3] - a[2][1]; - planes[3][3] = a[3][3] - a[3][1]; - planes[4][0] = a[0][2]; - planes[4][1] = a[1][2]; - planes[4][2] = a[2][2]; - planes[4][3] = a[3][2]; - planes[5][0] = a[0][3] - a[0][2]; - planes[5][1] = a[1][3] - a[1][2]; - planes[5][2] = a[2][3] - a[2][2]; - planes[5][3] = a[3][3] - a[3][2]; - for (int i = 0; i < 6; ++i) + planes[0][0] = matrix[0][3] + matrix[0][0]; + planes[0][1] = matrix[1][3] + matrix[1][0]; + planes[0][2] = matrix[2][3] + matrix[2][0]; + planes[0][3] = matrix[3][3] + matrix[3][0]; + planes[1][0] = matrix[0][3] - matrix[0][0]; + planes[1][1] = matrix[1][3] - matrix[1][0]; + planes[1][2] = matrix[2][3] - matrix[2][0]; + planes[1][3] = matrix[3][3] - matrix[3][0]; + planes[2][0] = matrix[0][3] + matrix[0][1]; + planes[2][1] = matrix[1][3] + matrix[1][1]; + planes[2][2] = matrix[2][3] + matrix[2][1]; + planes[2][3] = matrix[3][3] + matrix[3][1]; + planes[3][0] = matrix[0][3] - matrix[0][1]; + planes[3][1] = matrix[1][3] - matrix[1][1]; + planes[3][2] = matrix[2][3] - matrix[2][1]; + planes[3][3] = matrix[3][3] - matrix[3][1]; + planes[4][0] = matrix[0][2]; + planes[4][1] = matrix[1][2]; + planes[4][2] = matrix[2][2]; + planes[4][3] = matrix[3][2]; + planes[5][0] = matrix[0][3] - matrix[0][2]; + planes[5][1] = matrix[1][3] - matrix[1][2]; + planes[5][2] = matrix[2][3] - matrix[2][2]; + planes[5][3] = matrix[3][3] - matrix[3][2]; + for (int plane_index = 0; plane_index < 6; ++plane_index) { float length = 0.0f; - length += planes[i][0] * planes[i][0]; - length += planes[i][1] * planes[i][1]; - length += planes[i][2] * planes[i][2]; + length += planes[plane_index][0] * planes[plane_index][0]; + length += planes[plane_index][1] * planes[plane_index][1]; + length += planes[plane_index][2] * planes[plane_index][2]; length = SDL_sqrtf(length); if (length < SDL_FLT_EPSILON) { continue; } - planes[i][0] /= length; - planes[i][1] /= length; - planes[i][2] /= length; - planes[i][3] /= length; + planes[plane_index][0] /= length; + planes[plane_index][1] /= length; + planes[plane_index][2] /= length; + planes[plane_index][3] /= length; } } -static void Rotate(float matrix[4][4], float x, float y, float z, float angle) +static void Rotate(float matrix[4][4], float axis_x, float axis_y, float axis_z, float angle) { - float s = SDL_sinf(angle); - float c = SDL_cosf(angle); - float i = 1.0f - c; - matrix[0][0] = i * x * x + c; - matrix[0][1] = i * x * y - z * s; - matrix[0][2] = i * z * x + y * s; + float sine = SDL_sinf(angle); + float cosine = SDL_cosf(angle); + float inverse_cosine = 1.0f - cosine; + matrix[0][0] = inverse_cosine * axis_x * axis_x + cosine; + matrix[0][1] = inverse_cosine * axis_x * axis_y - axis_z * sine; + matrix[0][2] = inverse_cosine * axis_z * axis_x + axis_y * sine; matrix[0][3] = 0.0f; - matrix[1][0] = i * x * y + z * s; - matrix[1][1] = i * y * y + c; - matrix[1][2] = i * y * z - x * s; + matrix[1][0] = inverse_cosine * axis_x * axis_y + axis_z * sine; + matrix[1][1] = inverse_cosine * axis_y * axis_y + cosine; + matrix[1][2] = inverse_cosine * axis_y * axis_z - axis_x * sine; matrix[1][3] = 0.0f; - matrix[2][0] = i * z * x - y * s; - matrix[2][1] = i * y * z + x * s; - matrix[2][2] = i * z * z + c; + matrix[2][0] = inverse_cosine * axis_z * axis_x - axis_y * sine; + matrix[2][1] = inverse_cosine * axis_y * axis_z + axis_x * sine; + matrix[2][2] = inverse_cosine * axis_z * axis_z + cosine; matrix[2][3] = 0.0f; matrix[3][0] = 0.0f; matrix[3][1] = 0.0f; @@ -177,13 +177,14 @@ void Camera_Init(Camera* camera, CameraType type) void Camera_Update(Camera* camera) { - float s = SDL_sinf(camera->yaw); - float c = SDL_cosf(camera->yaw); + float sin_yaw = SDL_sinf(camera->yaw); + float cos_yaw = SDL_cosf(camera->yaw); + float rotation[4][4]; Translate(camera->view, -camera->x, -camera->y, -camera->z); - Rotate(camera->proj, c, 0.0f, s, camera->pitch); - Multiply(camera->view, camera->proj, camera->view); - Rotate(camera->proj, 0.0f, 1.0f, 0.0f, -camera->yaw); - Multiply(camera->view, camera->proj, camera->view); + Rotate(rotation, cos_yaw, 0.0f, sin_yaw, camera->pitch); + MultiplyMatrices(camera->view, rotation, camera->view); + Rotate(rotation, 0.0f, 1.0f, 0.0f, -camera->yaw); + MultiplyMatrices(camera->view, rotation, camera->view); float aspect = (float)camera->width / camera->height; if (camera->type == CAMERA_TYPE_PERSPECTIVE) { @@ -195,19 +196,19 @@ void Camera_Update(Camera* camera) float oy = camera->ortho; Ortho(camera->proj, -ox, ox, -oy, oy, -camera->far, camera->far); } - Multiply(camera->matrix, camera->proj, camera->view); - Frustum(camera->planes, camera->matrix); + MultiplyMatrices(camera->matrix, camera->proj, camera->view); + CalculateFrustum(camera->planes, camera->matrix); } -void Camera_Move(Camera* camera, float x, float y, float z) +void Camera_Move(Camera* camera, float right, float up, float forward) { - float sy = SDL_sinf(camera->yaw); - float cy = SDL_cosf(camera->yaw); - float sp = SDL_sinf(camera->pitch); - float cp = SDL_cosf(camera->pitch); - camera->x += cp * (sy * z) + cy * x; - camera->y += y + z * sp; - camera->z -= cp * (cy * z) - sy * x; + float sin_yaw = SDL_sinf(camera->yaw); + float cos_yaw = SDL_cosf(camera->yaw); + float sin_pitch = SDL_sinf(camera->pitch); + float cos_pitch = SDL_cosf(camera->pitch); + camera->x += cos_pitch * sin_yaw * forward + cos_yaw * right; + camera->y += up + forward * sin_pitch; + camera->z -= cos_pitch * cos_yaw * forward - sin_yaw * right; camera->y = SDL_clamp(camera->y, -camera->far, camera->far); } @@ -229,10 +230,10 @@ void Camera_Rotate(Camera* camera, float pitch, float yaw) void Camera_GetVector(const Camera* camera, float* x, float* y, float* z) { - float c = SDL_cosf(camera->pitch); - *x = SDL_cosf(camera->yaw - RADIANS(90.0f)) * c; + float cos_pitch = SDL_cosf(camera->pitch); + *x = SDL_cosf(camera->yaw - RADIANS(90.0f)) * cos_pitch; *y = SDL_sinf(camera->pitch); - *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * c; + *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * cos_pitch; } bool Camera_GetVisibility( @@ -240,20 +241,20 @@ bool Camera_GetVisibility( float x, float y, float z, - float sx, - float sy, - float sz) + float width, + float height, + float depth) { - float x2 = x + sx; - float y2 = y + sy; - float z2 = z + sz; - for (int i = 0; i < 6; ++i) + float max_x = x + width; + float max_y = y + height; + float max_z = z + depth; + for (int plane_index = 0; plane_index < 6; ++plane_index) { - const float* plane = camera->planes[i]; - float a = plane[0] >= 0.0f ? x2 : x; - float b = plane[1] >= 0.0f ? y2 : y; - float c = plane[2] >= 0.0f ? z2 : z; - if (plane[0] * a + plane[1] * b + plane[2] * c + plane[3] < 0.0f) + const float* plane = camera->planes[plane_index]; + float test_x = plane[0] >= 0.0f ? max_x : x; + float test_y = plane[1] >= 0.0f ? max_y : y; + float test_z = plane[2] >= 0.0f ? max_z : z; + if (plane[0] * test_x + plane[1] * test_y + plane[2] * test_z + plane[3] < 0.0f) { return false; } diff --git a/src/camera.h b/src/camera.h index d82bf8d8..0fc2e04a 100644 --- a/src/camera.h +++ b/src/camera.h @@ -37,7 +37,7 @@ typedef struct Camera void Camera_Init(Camera* camera, CameraType type); void Camera_Update(Camera* camera); -void Camera_Move(Camera* camera, float x, float y, float z); +void Camera_Move(Camera* camera, float right, float up, float forward); void Camera_Resize(Camera* camera, int width, int height); void Camera_Rotate(Camera* camera, float pitch, float yaw); void Camera_GetVector(const Camera* camera, float* x, float* y, float* z); @@ -46,6 +46,6 @@ bool Camera_GetVisibility( float x, float y, float z, - float sx, - float sy, - float sz); + float width, + float height, + float depth); diff --git a/src/main.c b/src/main.c index 177c5e8d..bafd4504 100644 --- a/src/main.c +++ b/src/main.c @@ -11,9 +11,9 @@ #include "world.h" static const char* SAVE_PATH = "blocks.sqlite3"; -static const float ATLAS_WIDTH = 512.0f; +static const int ATLAS_WIDTH = 512; static const int ATLAS_MIP_LEVELS = 4; -static const float BLOCK_WIDTH = 16.0f; +static const int BLOCK_WIDTH = 16; static const int SHADOW_RESOLUTION = 2048; static const SDL_GPUSampleCount SAMPLE_COUNT = SDL_GPU_SAMPLECOUNT_4; @@ -52,8 +52,8 @@ static bool CreateAtlas() SDL_Log("Failed to create atlas surface: %s", SDL_GetError()); return false; } - SDL_GPUTexture* texture = NULL; - SDL_GPUTransferBuffer* buffer = NULL; + SDL_GPUTexture* source_texture = NULL; + SDL_GPUTransferBuffer* transfer_buffer = NULL; { SDL_GPUTextureCreateInfo info = {0}; info.format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; @@ -75,8 +75,8 @@ static bool CreateAtlas() info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER; info.width = atlas_surface->w; info.height = atlas_surface->h; - texture = SDL_CreateGPUTexture(device, &info); - if (!texture) + source_texture = SDL_CreateGPUTexture(device, &info); + if (!source_texture) { SDL_Log("Failed to create texture: %s", SDL_GetError()); return false; @@ -86,47 +86,47 @@ static bool CreateAtlas() SDL_GPUTransferBufferCreateInfo info = {0}; info.size = atlas_surface->w * atlas_surface->h * 4; info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; - buffer = SDL_CreateGPUTransferBuffer(device, &info); - if (!buffer) + transfer_buffer = SDL_CreateGPUTransferBuffer(device, &info); + if (!transfer_buffer) { SDL_Log("Failed to create transfer buffer: %s", SDL_GetError()); return false; } } - void* data = SDL_MapGPUTransferBuffer(device, buffer, 0); - if (!data) + void* pixels = SDL_MapGPUTransferBuffer(device, transfer_buffer, false); + if (!pixels) { SDL_Log("Failed to map transfer buffer: %s", SDL_GetError()); return false; } - SDL_memcpy(data, atlas_surface->pixels, atlas_surface->w * atlas_surface->h * 4); - SDL_UnmapGPUTransferBuffer(device, buffer); - SDL_GPUCommandBuffer* cbuf = SDL_AcquireGPUCommandBuffer(device); - if (!cbuf) + SDL_memcpy(pixels, atlas_surface->pixels, atlas_surface->w * atlas_surface->h * 4); + SDL_UnmapGPUTransferBuffer(device, transfer_buffer); + SDL_GPUCommandBuffer* command_buffer = SDL_AcquireGPUCommandBuffer(device); + if (!command_buffer) { SDL_Log("Failed to acquire command buffer: %s", SDL_GetError()); return false; } - SDL_GPUCopyPass* pass = SDL_BeginGPUCopyPass(cbuf); - if (!pass) + SDL_GPUCopyPass* copy_pass = SDL_BeginGPUCopyPass(command_buffer); + if (!copy_pass) { SDL_Log("Failed to begin copy pass: %s", SDL_GetError()); return false; } - SDL_GPUTextureTransferInfo info = {0}; + SDL_GPUTextureTransferInfo transfer_info = {0}; SDL_GPUTextureRegion region = {0}; - info.transfer_buffer = buffer; - region.texture = texture; + transfer_info.transfer_buffer = transfer_buffer; + region.texture = source_texture; region.w = atlas_surface->w; region.h = atlas_surface->h; region.d = 1; - SDL_UploadToGPUTexture(pass, &info, ®ion, 0); - SDL_EndGPUCopyPass(pass); - for (int i = 0; i < ATLAS_WIDTH / BLOCK_WIDTH; i++) + SDL_UploadToGPUTexture(copy_pass, &transfer_info, ®ion, false); + SDL_EndGPUCopyPass(copy_pass); + for (int layer = 0; layer < ATLAS_WIDTH / BLOCK_WIDTH; layer++) { SDL_GPUBlitInfo info = {0}; - info.source.texture = texture; - info.source.x = i * BLOCK_WIDTH; + info.source.texture = source_texture; + info.source.x = layer * BLOCK_WIDTH; info.source.y = 0; info.source.w = BLOCK_WIDTH; info.source.h = BLOCK_WIDTH; @@ -135,16 +135,16 @@ static bool CreateAtlas() info.destination.y = 0; info.destination.w = BLOCK_WIDTH; info.destination.h = BLOCK_WIDTH; - info.destination.layer_or_depth_plane = i; - SDL_BlitGPUTexture(cbuf, &info); + info.destination.layer_or_depth_plane = layer; + SDL_BlitGPUTexture(command_buffer, &info); } if (ATLAS_MIP_LEVELS > 1) { - SDL_GenerateMipmapsForGPUTexture(cbuf, atlas_texture); + SDL_GenerateMipmapsForGPUTexture(command_buffer, atlas_texture); } - SDL_SubmitGPUCommandBuffer(cbuf); - SDL_ReleaseGPUTexture(device, texture); - SDL_ReleaseGPUTransferBuffer(device, buffer); + SDL_SubmitGPUCommandBuffer(command_buffer); + SDL_ReleaseGPUTexture(device, source_texture); + SDL_ReleaseGPUTransferBuffer(device, transfer_buffer); return true; } @@ -160,17 +160,14 @@ static void SetWindowIcon() SDL_Log("Failed to create icon surface: %s", SDL_GetError()); return; } - SDL_Rect src; - src.x = Block_GetIndex(BLOCK_GRASS, DIRECTION_NORTH) * BLOCK_WIDTH; - src.y = 0; - src.w = BLOCK_WIDTH; - src.h = BLOCK_WIDTH; - SDL_Rect dst; - dst.x = 0; - dst.y = 0; - dst.w = BLOCK_WIDTH; - dst.h = BLOCK_WIDTH; - if (!SDL_BlitSurface(atlas_surface, &src, icon, &dst)) + SDL_Rect source = {0}; + source.x = Block_GetIndex(BLOCK_GRASS, DIRECTION_NORTH) * BLOCK_WIDTH; + source.w = BLOCK_WIDTH; + source.h = BLOCK_WIDTH; + SDL_Rect destination = {0}; + destination.w = BLOCK_WIDTH; + destination.h = BLOCK_WIDTH; + if (!SDL_BlitSurface(atlas_surface, &source, icon, &destination)) { SDL_Log("Failed to blit icon surface: %s", SDL_GetError()); SDL_DestroySurface(icon); @@ -357,6 +354,9 @@ static bool CreateRaycastPipeline() info.target_info.depth_stencil_format = depth_format; info.depth_stencil_state.enable_depth_test = true; info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; + info.rasterizer_state.enable_depth_bias = true; + info.rasterizer_state.depth_bias_constant_factor = -1.0f; + info.rasterizer_state.depth_bias_slope_factor = -1.0f; info.multisample_state.sample_count = SAMPLE_COUNT; if (info.vertex_shader && info.fragment_shader) { @@ -466,12 +466,12 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) if (!device) { SDL_Log("Failed to create device: %s", SDL_GetError()); - return false; + return SDL_APP_FAILURE; } if (!SDL_ClaimWindowForGPUDevice(device, window)) { SDL_Log("Failed to claim window: %s", SDL_GetError()); - return false; + return SDL_APP_FAILURE; } SDL_SetGPUSwapchainParameters( device, @@ -633,7 +633,7 @@ static bool Resize(int width, int height) return true; } -static void RenderShadow(SDL_GPUCommandBuffer* cbuf) +static void RenderShadowPass(SDL_GPUCommandBuffer* cbuf) { if (!sky.has_sun) { @@ -660,18 +660,18 @@ static void RenderShadow(SDL_GPUCommandBuffer* cbuf) SDL_EndGPURenderPass(pass); } -static void RenderSky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void DrawSky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_PushGPUDebugGroup(cbuf, "sky"); SDL_BindGPUGraphicsPipeline(pass, sky_pipeline); - SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.proj, 64); - SDL_PushGPUVertexUniformData(cbuf, 1, player.camera.view, 64); + SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.proj, sizeof(player.camera.proj)); + SDL_PushGPUVertexUniformData(cbuf, 1, player.camera.view, sizeof(player.camera.view)); SDL_PushGPUFragmentUniformData(cbuf, 0, &sky.render, sizeof(sky.render)); SDL_DrawGPUPrimitives(pass, 36, 1, 0, 0); SDL_PopGPUDebugGroup(cbuf); } -static void RenderOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void DrawOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; sampler_bindings[0].texture = atlas_texture; @@ -680,8 +680,12 @@ static void RenderOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) sampler_bindings[1].sampler = shadow_sampler; SDL_PushGPUDebugGroup(cbuf, "opaque"); SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, 64); - SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); + SDL_PushGPUFragmentUniformData( + cbuf, + 1, + &sky.shadow_camera.matrix, + sizeof(sky.shadow_camera.matrix)); + SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); @@ -689,7 +693,7 @@ static void RenderOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_PopGPUDebugGroup(cbuf); } -static void RenderOpaqueForward(SDL_GPUCommandBuffer* cbuf) +static void RenderOpaquePass(SDL_GPUCommandBuffer* cbuf) { SDL_GPUColorTargetInfo color_info[2] = {0}; color_info[0].load_op = SDL_GPU_LOADOP_CLEAR; @@ -715,12 +719,12 @@ static void RenderOpaqueForward(SDL_GPUCommandBuffer* cbuf) SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } - RenderSky(cbuf, pass); - RenderOpaque(cbuf, pass); + DrawSky(cbuf, pass); + DrawOpaque(cbuf, pass); SDL_EndGPURenderPass(pass); } -static void RenderDepth(SDL_GPUCommandBuffer* cbuf) +static void RenderTransparentDepthPass(SDL_GPUCommandBuffer* cbuf) { SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_LOAD; @@ -739,7 +743,7 @@ static void RenderDepth(SDL_GPUCommandBuffer* cbuf) SDL_EndGPURenderPass(pass); } -static void RenderTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void DrawTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_GPUTextureSamplerBinding sampler_bindings[3] = {0}; sampler_bindings[0].texture = atlas_texture; @@ -750,8 +754,12 @@ static void RenderTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pas sampler_bindings[2].sampler = nearest_sampler; SDL_PushGPUDebugGroup(cbuf, "transparent"); SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, 64); - SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); + SDL_PushGPUFragmentUniformData( + cbuf, + 1, + &sky.shadow_camera.matrix, + sizeof(sky.shadow_camera.matrix)); + SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); @@ -759,7 +767,7 @@ static void RenderTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pas SDL_PopGPUDebugGroup(cbuf); } -static void RenderRaycast(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void DrawRaycast(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { if (player.query.block == BLOCK_EMPTY) { @@ -767,13 +775,13 @@ static void RenderRaycast(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) } SDL_PushGPUDebugGroup(cbuf, "raycast"); SDL_BindGPUGraphicsPipeline(pass, raycast_pipeline); - SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.matrix, 64); - SDL_PushGPUVertexUniformData(cbuf, 1, player.query.current, 12); + SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.matrix, sizeof(player.camera.matrix)); + SDL_PushGPUVertexUniformData(cbuf, 1, player.query.current, sizeof(player.query.current)); SDL_DrawGPUPrimitives(pass, 36, 1, 0, 0); SDL_PopGPUDebugGroup(cbuf); } -static void RenderForward(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) +static void RenderTransparentPass(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) { SDL_GPUColorTargetInfo color_info = {0}; color_info.load_op = SDL_GPU_LOADOP_LOAD; @@ -790,12 +798,12 @@ static void RenderForward(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_ SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } - RenderTransparent(cbuf, pass); - RenderRaycast(cbuf, pass); + DrawTransparent(cbuf, pass); + DrawRaycast(cbuf, pass); SDL_EndGPURenderPass(pass); } -static void RenderUI(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) +static void RenderUIPass(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) { SDL_GPUColorTargetInfo color_info = {0}; color_info.load_op = SDL_GPU_LOADOP_LOAD; @@ -827,7 +835,7 @@ static void RenderUI(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_textu SDL_EndGPURenderPass(pass); } -static void Render() +static void RenderFrame() { SDL_GPUCommandBuffer* cbuf = SDL_AcquireGPUCommandBuffer(device); if (!cbuf) @@ -855,11 +863,11 @@ static void Render() return; } Camera_Update(&player.camera); - RenderShadow(cbuf); - RenderOpaqueForward(cbuf); - RenderDepth(cbuf); - RenderForward(cbuf, swapchain_texture); - RenderUI(cbuf, swapchain_texture); + RenderShadowPass(cbuf); + RenderOpaquePass(cbuf); + RenderTransparentDepthPass(cbuf); + RenderTransparentPass(cbuf, swapchain_texture); + RenderUIPass(cbuf, swapchain_texture); SDL_SubmitGPUCommandBuffer(cbuf); } @@ -875,7 +883,7 @@ SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) } Sky_UpdateShadow(&sky, &player.camera, SHADOW_RESOLUTION); World_Update(&player.camera); - Render(); + RenderFrame(); return SDL_APP_CONTINUE; } @@ -917,20 +925,17 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) { SDL_SetWindowRelativeMouseMode(window, true); } - else + else if (event->button.button == SDL_BUTTON_LEFT) + { + Player_BreakBlock(&player); + } + else if (event->button.button == SDL_BUTTON_MIDDLE) + { + Player_SelectBlock(&player); + } + else if (event->button.button == SDL_BUTTON_RIGHT) { - if (event->button.button == SDL_BUTTON_LEFT) - { - Player_BreakBlock(&player); - } - else if (event->button.button == SDL_BUTTON_MIDDLE) - { - Player_SelectBlock(&player); - } - else if (event->button.button == SDL_BUTTON_RIGHT) - { - Player_PlaceBlock(&player); - } + Player_PlaceBlock(&player); } break; case SDL_EVENT_MOUSE_WHEEL: diff --git a/src/player.c b/src/player.c index f6395133..1af23990 100644 --- a/src/player.c +++ b/src/player.c @@ -39,23 +39,27 @@ static const AABB PLAYER_AABB = {{-0.3f, -1.62f, -0.3f}, {0.3f, 1.8f - 1.62f, 0. static bool IsColliding(const float position[3]) { - int min[3]; - int max[3]; - for (int i = 0; i < 3; i++) + int min_block[3]; + int max_block[3]; + for (int axis = 0; axis < 3; axis++) { - min[i] = SDL_floorf(position[i] + PLAYER_AABB.min[i] + PHYSICS_EPSILON); - max[i] = SDL_floorf(position[i] + PLAYER_AABB.max[i] - PHYSICS_EPSILON); + min_block[axis] = SDL_floorf(position[axis] + PLAYER_AABB.min[axis] + PHYSICS_EPSILON); + max_block[axis] = SDL_floorf(position[axis] + PLAYER_AABB.max[axis] - PHYSICS_EPSILON); } - for (int bx = min[0]; bx <= max[0]; bx++) - for (int by = min[1]; by <= max[1]; by++) - for (int bz = min[2]; bz <= max[2]; bz++) + for (int bx = min_block[0]; bx <= max_block[0]; bx++) + { + for (int by = min_block[1]; by <= max_block[1]; by++) + { + for (int bz = min_block[2]; bz <= max_block[2]; bz++) { - int position[3] = {bx, by, bz}; - if (Block_IsSolid(World_GetBlock(position))) + int block_position[3] = {bx, by, bz}; + if (Block_IsSolid(World_GetBlock(block_position))) { return true; } } + } + } return false; } @@ -64,18 +68,18 @@ static void Bisect(float position[3], int axis, float step) float start[3] = {position[0], position[1], position[2]}; float lower = 0.0f; float upper = 1.0f; - for (int i = 0; i < 8; i++) + for (int iteration = 0; iteration < 8; iteration++) { - float t = (lower + upper) * 0.5f; + float fraction = (lower + upper) * 0.5f; float location[3] = {start[0], start[1], start[2]}; - location[axis] += step * t; + location[axis] += step * fraction; if (IsColliding(location)) { - upper = t; + upper = fraction; } else { - lower = t; + lower = fraction; } } position[axis] = start[axis] + step * lower; @@ -87,10 +91,9 @@ static bool Move(float position[3], int axis, float delta) { return false; } - int steps = SDL_ceilf(SDL_fabsf(delta) / COLLISION_STEP); - steps = SDL_max(steps, 1); - float step = delta / steps; - for (int i = 0; i < steps; i++) + int step_count = SDL_max(SDL_ceilf(SDL_fabsf(delta) / COLLISION_STEP), 1); + float step = delta / step_count; + for (int step_index = 0; step_index < step_count; step_index++) { float location[3] = {position[0], position[1], position[2]}; location[axis] += step; @@ -99,42 +102,42 @@ static bool Move(float position[3], int axis, float delta) Bisect(position, axis, step); return true; } - SDL_memcpy(position, location, 12); + SDL_memcpy(position, location, sizeof(location)); } return false; } void Player_Load(Player* player) { - PlayerSave data; + PlayerSave saved_player; Camera_Init(&player->camera, CAMERA_TYPE_PERSPECTIVE); player->camera.x = -200.0f; player->camera.y = 50.0f; player->camera.z = 0.0f; player->controller = PLAYER_CONTROLLER_WALK; player->block = BLOCK_YELLOW_TORCH; - if (Save_GetPlayer(&data, sizeof(data))) + if (Save_GetPlayer(&saved_player, sizeof(saved_player))) { - player->block = data.block; - player->camera.x = data.x; - player->camera.y = data.y; - player->camera.z = data.z; - player->camera.pitch = data.pitch; - player->camera.yaw = data.yaw; + player->block = saved_player.block; + player->camera.x = saved_player.x; + player->camera.y = saved_player.y; + player->camera.z = saved_player.z; + player->camera.pitch = saved_player.pitch; + player->camera.yaw = saved_player.yaw; } player->query = World_Raycast(&player->camera, REACH); } void Player_Save(const Player* player) { - PlayerSave data; - data.x = player->camera.x; - data.y = player->camera.y; - data.z = player->camera.z; - data.pitch = player->camera.pitch; - data.yaw = player->camera.yaw; - data.block = player->block; - Save_SetPlayer(&data, sizeof(data)); + PlayerSave saved_player; + saved_player.x = player->camera.x; + saved_player.y = player->camera.y; + saved_player.z = player->camera.z; + saved_player.pitch = player->camera.pitch; + saved_player.yaw = player->camera.yaw; + saved_player.block = player->block; + Save_SetPlayer(&saved_player, sizeof(saved_player)); } void Player_ToggleController(Player* player) @@ -157,17 +160,17 @@ void Player_Move(Player* player, float dt) dt = SDL_min(dt * 0.001f, 0.05f); float input_x = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; float input_z = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; - float length = SDL_sqrtf(input_x * input_x + input_z * input_z); - if (length > SDL_FLT_EPSILON) + float input_length = SDL_sqrtf(input_x * input_x + input_z * input_z); + if (input_length > SDL_FLT_EPSILON) { - input_x /= length; - input_z /= length; + input_x /= input_length; + input_z /= input_length; } float speed = keys[SDL_SCANCODE_LCTRL] ? SPRINT_SPEED : WALK_SPEED; - float sy = SDL_sinf(player->camera.yaw); - float cy = SDL_cosf(player->camera.yaw); - float target_x = (cy * input_x + sy * input_z) * speed; - float target_z = (sy * input_x - cy * input_z) * speed; + float sin_yaw = SDL_sinf(player->camera.yaw); + float cos_yaw = SDL_cosf(player->camera.yaw); + float target_x = (cos_yaw * input_x + sin_yaw * input_z) * speed; + float target_z = (sin_yaw * input_x - cos_yaw * input_z) * speed; if (player->is_on_ground) { player->velocity[0] = target_x; @@ -189,20 +192,20 @@ void Player_Move(Player* player, float dt) return; } player->velocity[1] -= GRAVITY * dt; - bool hits[3]; - for (int i = 0; i < 3; i++) + bool collisions[3]; + for (int axis = 0; axis < 3; axis++) { - hits[i] = Move(player->camera.position, i, player->velocity[i] * dt); + collisions[axis] = Move(player->camera.position, axis, player->velocity[axis] * dt); } - if (hits[0]) + if (collisions[0]) { player->velocity[0] = 0.0f; } - if (hits[2]) + if (collisions[2]) { player->velocity[2] = 0.0f; } - if (hits[1]) + if (collisions[1]) { if (player->velocity[1] < 0.0f) { @@ -238,11 +241,12 @@ void Player_PlaceBlock(const Player* player) World_SetBlock(player->query.previous, player->block); return; } - for (int i = 0; i < 3; i++) + for (int axis = 0; axis < 3; axis++) { - float min = player->camera.position[i] + PLAYER_AABB.min[i] + PHYSICS_EPSILON; - float max = player->camera.position[i] + PLAYER_AABB.max[i] - PHYSICS_EPSILON; - if (max <= player->query.previous[i] || min >= player->query.previous[i] + 1.0f) + float player_min = player->camera.position[axis] + PLAYER_AABB.min[axis] + PHYSICS_EPSILON; + float player_max = player->camera.position[axis] + PLAYER_AABB.max[axis] - PHYSICS_EPSILON; + if (player_max <= player->query.previous[axis] || + player_min >= player->query.previous[axis] + 1.0f) { World_SetBlock(player->query.previous, player->block); break; diff --git a/src/rand.c b/src/rand.c index 0e823f0f..46da07d4 100644 --- a/src/rand.c +++ b/src/rand.c @@ -4,117 +4,141 @@ #include "rand.h" #include "world.h" -void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock function) +void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) { - for (int a = 0; a < CHUNK_WIDTH; a++) - for (int b = 0; b < CHUNK_WIDTH; b++) + for (int local_x = 0; local_x < CHUNK_WIDTH; local_x++) + { + for (int local_z = 0; local_z < CHUNK_WIDTH; local_z++) { - int x = cx + a; - int z = cz + b; - bool low = false; - bool grass = false; - float height = stb_perlin_fbm_noise3(x * 0.005f, 0.0f, z * 0.005f, 2.0f, 0.5f, 6); - height *= 50.0f; - height = SDL_powf(SDL_max(height, 0.0f), 1.3f); - height += 30; - height = SDL_clamp(height, 0, CHUNK_HEIGHT - 1); - if (height < 40) + int world_x = cx + local_x; + int world_z = cz + local_z; + bool is_lowland = false; + bool has_grass = false; + float terrain_height = + stb_perlin_fbm_noise3(world_x * 0.005f, 0.0f, world_z * 0.005f, 2.0f, 0.5f, 6) * + 50.0f; + terrain_height = SDL_powf(SDL_max(terrain_height, 0.0f), 1.3f) + 30.0f; + terrain_height = SDL_clamp(terrain_height, 0.0f, CHUNK_HEIGHT - 1.0f); + if (terrain_height < 40.0f) { - height += stb_perlin_fbm_noise3(-x * 0.01f, 0.0f, z * 0.01f, 2.0f, 0.5f, 6) * 12.0f; - low = true; + terrain_height += + stb_perlin_fbm_noise3(-world_x * 0.01f, 0.0f, world_z * 0.01f, 2.0f, 0.5f, 6) * + 12.0f; + is_lowland = true; } - float biome = stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 6); - Block top; - Block bottom; - if (height + biome < 31) + float biome = + stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 6); + Block surface_block; + Block fill_block; + if (terrain_height + biome < 31.0f) { - top = BLOCK_SAND; - bottom = BLOCK_SAND; + surface_block = BLOCK_SAND; + fill_block = BLOCK_SAND; } else { biome *= 8.0f; biome = SDL_clamp(biome, -5.0f, 5.0f); - if (height + biome < 61) + if (terrain_height + biome < 61.0f) { - top = BLOCK_GRASS; - bottom = BLOCK_DIRT; - grass = true; + surface_block = BLOCK_GRASS; + fill_block = BLOCK_DIRT; + has_grass = true; } - else if (height + biome < 132) + else if (terrain_height + biome < 132.0f) { - top = BLOCK_STONE; - bottom = BLOCK_STONE; + surface_block = BLOCK_STONE; + fill_block = BLOCK_STONE; } else { - top = BLOCK_SNOW; - bottom = BLOCK_STONE; + surface_block = BLOCK_SNOW; + fill_block = BLOCK_STONE; } } int y = 0; - for (; y < height; y++) + for (; y < terrain_height; y++) { - function(userdata, x, y, z, bottom); + callback(userdata, world_x, y, world_z, fill_block); } - function(userdata, x, y, z, top); + callback(userdata, world_x, y, world_z, surface_block); for (; y < 30; y++) { - function(userdata, x, y, z, BLOCK_WATER); + callback(userdata, world_x, y, world_z, BLOCK_WATER); } - if (low && grass) + if (is_lowland && has_grass) { - float plant = - stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; - if (plant > 0.8f && a > 2 && a < CHUNK_WIDTH - 2 && b > 2 && b < CHUNK_WIDTH - 2) + float plant_noise = + stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 3) * + 0.5f + + 0.5f; + bool can_grow_tree = local_x > 2 && local_x < CHUNK_WIDTH - 2 && local_z > 2 && + local_z < CHUNK_WIDTH - 2; + if (plant_noise > 0.8f && can_grow_tree) { - int log = 3 + plant * 2.0f; - for (int dy = 0; dy < log; dy++) + int trunk_height = 3 + plant_noise * 2.0f; + for (int dy = 0; dy < trunk_height; dy++) { - function(userdata, x, y + dy + 1, z, BLOCK_LOG); + callback(userdata, world_x, y + dy + 1, world_z, BLOCK_LOG); } for (int dx = -1; dx <= 1; dx++) + { for (int dz = -1; dz <= 1; dz++) + { for (int dy = 0; dy < 2; dy++) { if (dx || dz || dy) { - function(userdata, x + dx, y + log + dy, z + dz, BLOCK_LEAVES); + callback( + userdata, + world_x + dx, + y + trunk_height + dy, + world_z + dz, + BLOCK_LEAVES); } } + } + } } - else if (plant > 0.55f) + else if (plant_noise > 0.55f) { - function(userdata, x, y + 1, z, BLOCK_BUSH); + callback(userdata, world_x, y + 1, world_z, BLOCK_BUSH); } - else if (plant > 0.52f) + else if (plant_noise > 0.52f) { - int value = SDL_max(((int)(plant * 1000.0f)) % 4, 0); + int flower_index = SDL_max(((int)(plant_noise * 1000.0f)) % 4, 0); Block flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; - function(userdata, x, y + 1, z, flowers[value]); + callback(userdata, world_x, y + 1, world_z, flowers[flower_index]); } } - if (height > 130) + if (terrain_height > 130.0f) { continue; } - float cloud = stb_perlin_turbulence_noise3(x * 0.015f, 0.0f, z * 0.015f, 2.0f, 0.5f, 6); - int scale = -1; - if (cloud > 0.9f) + float cloud_noise = stb_perlin_turbulence_noise3( + world_x * 0.015f, + 0.0f, + world_z * 0.015f, + 2.0f, + 0.5f, + 6); + int cloud_half_height = -1; + if (cloud_noise > 0.9f) { - scale = 2; + cloud_half_height = 2; } - else if (cloud > 0.7f) + else if (cloud_noise > 0.7f) { - scale = 1; + cloud_half_height = 1; } - else if (cloud > 0.6) + else if (cloud_noise > 0.6f) { - scale = 0; + cloud_half_height = 0; } - for (int y = -scale; y <= scale; y++) + for (int cloud_y = -cloud_half_height; cloud_y <= cloud_half_height; cloud_y++) { - function(userdata, x, 155 - y, z, BLOCK_CLOUD); + callback(userdata, world_x, 155 - cloud_y, world_z, BLOCK_CLOUD); } } + } } diff --git a/src/rand.h b/src/rand.h index 63c8f64d..8d92869b 100644 --- a/src/rand.h +++ b/src/rand.h @@ -6,4 +6,4 @@ typedef void (*RandSetBlock)(void* userdata, int bx, int by, int bz, Block block); -void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock function); +void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback); diff --git a/src/save.c b/src/save.c index 44786e8e..bdca2ae0 100644 --- a/src/save.c +++ b/src/save.c @@ -210,7 +210,7 @@ void Save_SetBlock(int cx, int cz, int bx, int by, int bz, Block block) SDL_UnlockMutex(mutex); } -void Save_GetBlocks(void* userdata, int cx, int cz, SaveSetBlock function) +void Save_GetBlocks(void* userdata, int cx, int cz, SaveSetBlock callback) { if (!handle) { @@ -225,7 +225,7 @@ void Save_GetBlocks(void* userdata, int cx, int cz, SaveSetBlock function) int by = sqlite3_column_int(get_blocks, 1); int bz = sqlite3_column_int(get_blocks, 2); Block block = sqlite3_column_int(get_blocks, 3); - function(userdata, bx, by, bz, block); + callback(userdata, bx, by, bz, block); } sqlite3_reset(get_blocks); SDL_UnlockMutex(mutex); diff --git a/src/save.h b/src/save.h index 537f6e11..93e5fcdc 100644 --- a/src/save.h +++ b/src/save.h @@ -13,4 +13,4 @@ bool Save_GetPlayer(void* data, int size); void Save_SetSky(float time_of_day); bool Save_GetSky(float* time_of_day); void Save_SetBlock(int cx, int cz, int bx, int by, int bz, Block block); -void Save_GetBlocks(void* userdata, int cx, int cz, SaveSetBlock function); +void Save_GetBlocks(void* userdata, int cx, int cz, SaveSetBlock callback); diff --git a/src/sky.c b/src/sky.c index d987b079..ff83b4c2 100644 --- a/src/sky.c +++ b/src/sky.c @@ -8,60 +8,68 @@ static const float SUNRISE_END = 30.0f / 180.0f; static const float DAY_END = 90.0f / 180.0f; static const float SUNSET_END = 120.0f / 180.0f; static const float SPEED = 0.1f; -static const float AMBIENT_SCALE = 0.5f; +static const float AMBIENT_SCALE = 0.35f; static const float SHADOW_Y = 30.0f; static const float SHADOW_ORTHO = 300.0f; static const float SHADOW_FAR = 300.0f; static const int SHADOW_UPDATE_FRAMES = 300; -static const float NIGHT_SKY_TOP[3] = {0.02f, 0.02f, 0.1f}; -static const float NIGHT_SKY_HORIZON[3] = {0.05f, 0.05f, 0.2f}; -static const float TWILIGHT_SKY_TOP[3] = {0.5f, 0.2f, 0.1f}; -static const float TWILIGHT_SKY_HORIZON[3] = {1.0f, 0.5f, 0.2f}; -static const float DAY_SKY_TOP[3] = {0.5f, 0.7f, 1.0f}; -static const float DAY_SKY_HORIZON[3] = {0.8f, 0.9f, 1.0f}; -static const float NIGHT_AMBIENT[3] = {0.05f, 0.05f, 0.1f}; -static const float DAY_AMBIENT[3] = {1.0f, 1.0f, 1.0f}; +static const float NIGHT_SKY_TOP[3] = {0.01f, 0.02f, 0.06f}; +static const float NIGHT_SKY_HORIZON[3] = {0.06f, 0.08f, 0.18f}; +static const float TWILIGHT_SKY_TOP[3] = {0.24f, 0.16f, 0.32f}; +static const float TWILIGHT_SKY_HORIZON[3] = {0.95f, 0.45f, 0.28f}; +static const float DAY_SKY_TOP[3] = {0.32f, 0.58f, 0.92f}; +static const float DAY_SKY_HORIZON[3] = {0.72f, 0.84f, 0.98f}; +static const float NIGHT_AMBIENT[3] = {0.12f, 0.16f, 0.28f}; +static const float DAY_AMBIENT[3] = {0.85f, 0.9f, 1.0f}; -static void LerpColor(float output[4], const float a[3], const float b[3], float t) +static void LerpColor(float output[4], const float start[3], const float end[3], float amount) { - output[0] = a[0] + (b[0] - a[0]) * t; - output[1] = a[1] + (b[1] - a[1]) * t; - output[2] = a[2] + (b[2] - a[2]) * t; + output[0] = start[0] + (end[0] - start[0]) * amount; + output[1] = start[1] + (end[1] - start[1]) * amount; + output[2] = start[2] + (end[2] - start[2]) * amount; + output[3] = 0.0f; +} + +static void CopyColor(float output[4], const float color[3]) +{ + output[0] = color[0]; + output[1] = color[1]; + output[2] = color[2]; output[3] = 0.0f; } static void UpdateRender(Sky* sky) { float ambient[4]; - float t; + float progress; if (sky->time_of_day < SUNRISE_END) { - t = sky->time_of_day / SUNRISE_END; - LerpColor(sky->render.top, NIGHT_SKY_TOP, TWILIGHT_SKY_TOP, t); - LerpColor(sky->render.horizon, NIGHT_SKY_HORIZON, TWILIGHT_SKY_HORIZON, t); - LerpColor(ambient, NIGHT_AMBIENT, DAY_AMBIENT, t); + progress = sky->time_of_day / SUNRISE_END; + LerpColor(sky->render.top, NIGHT_SKY_TOP, TWILIGHT_SKY_TOP, progress); + LerpColor(sky->render.horizon, NIGHT_SKY_HORIZON, TWILIGHT_SKY_HORIZON, progress); + LerpColor(ambient, NIGHT_AMBIENT, DAY_AMBIENT, progress); } else if (sky->time_of_day < DAY_END) { - t = (sky->time_of_day - SUNRISE_END) / (DAY_END - SUNRISE_END); - LerpColor(sky->render.top, TWILIGHT_SKY_TOP, DAY_SKY_TOP, t); - LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, DAY_SKY_HORIZON, t); - LerpColor(ambient, DAY_AMBIENT, DAY_AMBIENT, t); + progress = (sky->time_of_day - SUNRISE_END) / (DAY_END - SUNRISE_END); + LerpColor(sky->render.top, TWILIGHT_SKY_TOP, DAY_SKY_TOP, progress); + LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, DAY_SKY_HORIZON, progress); + CopyColor(ambient, DAY_AMBIENT); } else if (sky->time_of_day < SUNSET_END) { - t = (sky->time_of_day - DAY_END) / (SUNSET_END - DAY_END); - LerpColor(sky->render.top, DAY_SKY_TOP, TWILIGHT_SKY_TOP, t); - LerpColor(sky->render.horizon, DAY_SKY_HORIZON, TWILIGHT_SKY_HORIZON, t); - LerpColor(ambient, DAY_AMBIENT, NIGHT_AMBIENT, t); + progress = (sky->time_of_day - DAY_END) / (SUNSET_END - DAY_END); + LerpColor(sky->render.top, DAY_SKY_TOP, TWILIGHT_SKY_TOP, progress); + LerpColor(sky->render.horizon, DAY_SKY_HORIZON, TWILIGHT_SKY_HORIZON, progress); + LerpColor(ambient, DAY_AMBIENT, NIGHT_AMBIENT, progress); } else { - t = (sky->time_of_day - SUNSET_END) / (1.0f - SUNSET_END); - LerpColor(sky->render.top, TWILIGHT_SKY_TOP, NIGHT_SKY_TOP, t); - LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, NIGHT_SKY_HORIZON, t); - LerpColor(ambient, NIGHT_AMBIENT, NIGHT_AMBIENT, t); + progress = (sky->time_of_day - SUNSET_END) / (1.0f - SUNSET_END); + LerpColor(sky->render.top, TWILIGHT_SKY_TOP, NIGHT_SKY_TOP, progress); + LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, NIGHT_SKY_HORIZON, progress); + CopyColor(ambient, NIGHT_AMBIENT); } float angle = sky->time_of_day * 2.0f * SDL_PI_F; float sun_height = -SDL_cosf(angle); diff --git a/src/voxel.c b/src/voxel.c index f6adbe51..37f610e2 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -23,7 +23,15 @@ static const int TEXCOORDS[][4][2] = { {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, }; -static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction direction, int ao) +static Voxel Pack( + Block block, + int x, + int y, + int z, + int texture_u, + int texture_v, + Direction direction, + int ambient_occlusion) { SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", X_OFFSET + X_BITS <= 32); @@ -38,59 +46,76 @@ static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction dire SDL_assert(x <= X_MASK); SDL_assert(y <= Y_MASK); SDL_assert(z <= Z_MASK); - SDL_assert(u <= U_MASK); - SDL_assert(v <= V_MASK); + SDL_assert(texture_u <= U_MASK); + SDL_assert(texture_v <= V_MASK); SDL_assert(direction <= DIRECTION_MASK); - SDL_assert(ao <= AO_MASK); + SDL_assert(ambient_occlusion <= AO_MASK); Voxel voxel = 0; voxel |= direction << DIRECTION_OFFSET; voxel |= block << BLOCK_OFFSET; - voxel |= ao << AO_OFFSET; + voxel |= ambient_occlusion << AO_OFFSET; voxel |= x << X_OFFSET; voxel |= y << Y_OFFSET; voxel |= z << Z_OFFSET; - voxel |= u << U_OFFSET; - voxel |= v << V_OFFSET; + voxel |= texture_u << U_OFFSET; + voxel |= texture_v << V_OFFSET; return voxel; } -Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int i) +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int vertex) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); SDL_assert(direction < 4); - SDL_assert(i < 4); + SDL_assert(vertex < 4); static const int POSITIONS[][4][3] = { {{0, 0, 0}, {0, 1, 0}, {1, 0, 1}, {1, 1, 1}}, {{0, 0, 0}, {1, 0, 1}, {0, 1, 0}, {1, 1, 1}}, {{0, 0, 1}, {1, 0, 0}, {0, 1, 1}, {1, 1, 0}}, {{0, 0, 1}, {0, 1, 1}, {1, 0, 0}, {1, 1, 0}}, }; - int a = POSITIONS[direction][i][0] + x; - int b = POSITIONS[direction][i][1] + y; - int c = POSITIONS[direction][i][2] + z; - int d = TEXCOORDS[direction][i][0]; - int e = TEXCOORDS[direction][i][1]; - return Pack(block, a, b, c, d, e, direction, AO_MASK); + const int* offset = POSITIONS[direction][vertex]; + const int* texcoord = TEXCOORDS[direction][vertex]; + return Pack( + block, + x + offset[0], + y + offset[1], + z + offset[2], + texcoord[0], + texcoord[1], + direction, + AO_MASK); } -Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int i, int ao) +Voxel Voxel_PackCube( + Block block, + int x, + int y, + int z, + Direction direction, + int vertex, + int ambient_occlusion) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); SDL_assert(direction < 6); - SDL_assert(i < 4); - int a = CUBE_POSITIONS[direction][i][0] + x; - int b = CUBE_POSITIONS[direction][i][1] + y; - int c = CUBE_POSITIONS[direction][i][2] + z; - int d = TEXCOORDS[direction][i][0]; - int e = TEXCOORDS[direction][i][1]; - return Pack(block, a, b, c, d, e, direction, ao); + SDL_assert(vertex < 4); + const int* offset = CUBE_POSITIONS[direction][vertex]; + const int* texcoord = TEXCOORDS[direction][vertex]; + return Pack( + block, + x + offset[0], + y + offset[1], + z + offset[2], + texcoord[0], + texcoord[1], + direction, + ambient_occlusion); } -void Voxel_GetCubePosition(Direction direction, int i, int position[3]) +void Voxel_GetCubePosition(Direction direction, int vertex, int position[3]) { SDL_assert(direction < 6); - SDL_assert(i < 4); - SDL_memcpy(position, CUBE_POSITIONS[direction][i], sizeof(int) * 3); + SDL_assert(vertex < 4); + SDL_memcpy(position, CUBE_POSITIONS[direction][vertex], sizeof(int) * 3); } diff --git a/src/voxel.h b/src/voxel.h index 3f526b70..d382a9de 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -7,6 +7,13 @@ typedef Uint32 Voxel; -Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int i); -Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int i, int ao); -void Voxel_GetCubePosition(Direction direction, int i, int position[3]); +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int vertex); +Voxel Voxel_PackCube( + Block block, + int x, + int y, + int z, + Direction direction, + int vertex, + int ambient_occlusion); +void Voxel_GetCubePosition(Direction direction, int vertex, int position[3]); diff --git a/src/world.c b/src/world.c index caa7e86e..d932f3f1 100644 --- a/src/world.c +++ b/src/world.c @@ -121,14 +121,13 @@ static Chunk* GetChunk(int cx, int cz) static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) { - for (int i = -1; i <= 1; i++) + for (int offset_x = -1; offset_x <= 1; offset_x++) { - for (int j = -1; j <= 1; j++) + for (int offset_z = -1; offset_z <= 1; offset_z++) { - int x = cx + i; - int z = cz + j; - neighborhood[i + 1][j + 1] = GetChunk(x, z); - SDL_assert(neighborhood[i + 1][j + 1]); + Chunk* chunk = GetChunk(cx + offset_x, cz + offset_z); + neighborhood[offset_x + 1][offset_z + 1] = chunk; + SDL_assert(chunk); } } } @@ -143,9 +142,9 @@ static Chunk* CreateChunk() SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_COMPLETED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - GPUBuffer_Init(&chunk->gpu_voxels[i], device, SDL_GPU_BUFFERUSAGE_VERTEX); + GPUBuffer_Init(&chunk->gpu_voxels[mesh_index], device, SDL_GPU_BUFFERUSAGE_VERTEX); } GPUBuffer_Init(&chunk->gpu_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); return chunk; @@ -154,9 +153,9 @@ static Chunk* CreateChunk() static void FreeChunk(Chunk* chunk) { GPUBuffer_Free(&chunk->gpu_lights); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - GPUBuffer_Free(&chunk->gpu_voxels[i]); + GPUBuffer_Free(&chunk->gpu_voxels[mesh_index]); } SDL_free(chunk->lights); SDL_free(chunk); @@ -174,12 +173,12 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) } SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); int light_index = -1; - for (int i = 0; i < chunk->light_size; i++) + for (int index = 0; index < chunk->light_size; index++) { - Light* light = &chunk->lights[i]; + Light* light = &chunk->lights[index]; if (light->x == chunk->x + bx && light->y == by && light->z == chunk->z + bz) { - light_index = i; + light_index = index; break; } } @@ -287,10 +286,10 @@ static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); bool has_voxels = false; - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - GPUBuffer_Clear(&chunk->gpu_voxels[i]); - has_voxels |= voxels[i].size > 0; + GPUBuffer_Clear(&chunk->gpu_voxels[mesh_index]); + has_voxels |= voxels[mesh_index].size > 0; } if (!has_voxels) { @@ -300,9 +299,9 @@ static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) { return; } - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - GPUBuffer_Upload(&chunk->gpu_voxels[i], &voxels[i]); + GPUBuffer_Upload(&chunk->gpu_voxels[mesh_index], &voxels[mesh_index]); } GPUBuffer_EndUpload(); } @@ -345,39 +344,45 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio { int position[3]; Voxel_GetCubePosition(direction, vertex, position); - int side1[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; - int side2[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; + int first_side[3] = { + DIRECTIONS[direction][0], + DIRECTIONS[direction][1], + DIRECTIONS[direction][2]}; + int second_side[3] = { + DIRECTIONS[direction][0], + DIRECTIONS[direction][1], + DIRECTIONS[direction][2]}; int corner[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; - int side = 0; - for (int i = 0; i < 3; i++) + int side_count = 0; + for (int axis = 0; axis < 3; axis++) { - if (DIRECTIONS[direction][i]) + if (DIRECTIONS[direction][axis]) { continue; } - int offset = position[i] ? 1 : -1; - if (side++ == 0) + int offset = position[axis] ? 1 : -1; + if (side_count++ == 0) { - side1[i] = offset; + first_side[axis] = offset; } else { - side2[i] = offset; + second_side[axis] = offset; } - corner[i] = offset; + corner[axis] = offset; } - SDL_assert(side == 2); - bool has_side1 = - Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); - bool has_side2 = - Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); + SDL_assert(side_count == 2); + bool has_first_side = Block_HasOcclusion( + GetNeighborhoodBlock(chunks, bx, by, bz, first_side[0], first_side[1], first_side[2])); + bool has_second_side = Block_HasOcclusion( + GetNeighborhoodBlock(chunks, bx, by, bz, second_side[0], second_side[1], second_side[2])); bool has_corner = Block_HasOcclusion( GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); - if (has_side1 && has_side2) + if (has_first_side && has_second_side) { return 0; } - return AO_LEVEL_CLEAR - has_side1 - has_side2 - has_corner; + return AO_LEVEL_CLEAR - has_first_side - has_second_side - has_corner; } static void GenerateChunkBlocks(Chunk* chunk) @@ -415,45 +420,54 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ } if (Block_IsSprite(block)) { - for (int j = 0; j < 4; j++) + for (Direction direction = 0; direction < 4; direction++) { - for (int k = 0; k < 4; k++) + for (int vertex = 0; vertex < 4; vertex++) { - Voxel voxel = Voxel_PackSprite(block, bx, by, bz, j, k); + Voxel voxel = Voxel_PackSprite(block, bx, by, bz, direction, vertex); CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); } } continue; } - MeshType mesh = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; - for (int j = 0; j < 6; j++) + MeshType mesh_type = + Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; + for (Direction direction = 0; direction < DIRECTION_COUNT; direction++) { - int dx = DIRECTIONS[j][0]; - int dy = DIRECTIONS[j][1]; - int dz = DIRECTIONS[j][2]; + int dx = DIRECTIONS[direction][0]; + int dy = DIRECTIONS[direction][1]; + int dz = DIRECTIONS[direction][2]; Block neighbor = GetNeighborhoodBlock(chunks, bx, by, bz, dx, dy, dz); if (!IsVisible(block, neighbor)) { continue; } - int ao[4]; - int order[] = {0, 1, 2, 3}; - for (int k = 0; k < 4; k++) + int ambient_occlusion[4]; + int vertex_order[] = {0, 1, 2, 3}; + for (int vertex = 0; vertex < 4; vertex++) { - ao[k] = GetAO(chunks, bx, by, bz, j, k); + ambient_occlusion[vertex] = GetAO(chunks, bx, by, bz, direction, vertex); } - if (ao[0] + ao[3] > ao[1] + ao[2]) + if (ambient_occlusion[0] + ambient_occlusion[3] > + ambient_occlusion[1] + ambient_occlusion[2]) { - order[0] = 1; - order[1] = 3; - order[2] = 0; - order[3] = 2; + vertex_order[0] = 1; + vertex_order[1] = 3; + vertex_order[2] = 0; + vertex_order[3] = 2; } - for (int k = 0; k < 4; k++) + for (int vertex_index = 0; vertex_index < 4; vertex_index++) { - int vertex = order[k]; - Voxel voxel = Voxel_PackCube(block, bx, by, bz, j, vertex, ao[vertex]); - CPUBuffer_Append(&voxels[mesh], &voxel); + int vertex = vertex_order[vertex_index]; + Voxel voxel = Voxel_PackCube( + block, + bx, + by, + bz, + direction, + vertex, + ambient_occlusion[vertex]); + CPUBuffer_Append(&voxels[mesh_type], &voxel); } } } @@ -477,15 +491,15 @@ static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) Chunk* chunk = chunks[1][1]; SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); - for (int i = 0; i < 3; i++) + for (int x = 0; x < 3; x++) { - for (int j = 0; j < 3; j++) + for (int z = 0; z < 3; z++) { - const Chunk* neighbor = chunks[i][j]; + const Chunk* neighbor = chunks[x][z]; SDL_assert(neighbor); - for (int k = 0; k < neighbor->light_size; k++) + for (int light_index = 0; light_index < neighbor->light_size; light_index++) { - CPUBuffer_Append(lights, &neighbor->lights[k]); + CPUBuffer_Append(lights, &neighbor->lights[light_index]); } } } @@ -519,11 +533,11 @@ static void GenerateIndices() return; } static const int INDICES[] = {0, 1, 2, 3, 2, 1}; - for (Uint32 i = 0; i < INDEX_COUNT / 6; i++) + for (Uint32 quad_index = 0; quad_index < INDEX_COUNT / 6; quad_index++) { - for (Uint32 j = 0; j < 6; j++) + for (Uint32 index_index = 0; index_index < 6; index_index++) { - Uint32 index = i * 4 + INDICES[j]; + Uint32 index = quad_index * 4 + INDICES[index_index]; CPUBuffer_Append(&indices, &index); } } @@ -583,7 +597,7 @@ static int WorkerFunction(void* args) return 0; } -static bool IsJobRunning(const Worker* worker) +static bool IsWorkerBusy(const Worker* worker) { SDL_LockMutex(worker->mutex); bool running = worker->job.type != JOB_TYPE_NONE; @@ -602,9 +616,9 @@ static void DispatchJob(Worker* worker, const Job* job) static void StartWorker(Worker* worker) { - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - CPUBuffer_Init(&worker->voxels[i], device, sizeof(Voxel)); + CPUBuffer_Init(&worker->voxels[mesh_index], device, sizeof(Voxel)); } CPUBuffer_Init(&worker->lights, device, sizeof(Light)); worker->mutex = SDL_CreateMutex(); @@ -641,45 +655,47 @@ static void StopWorker(Worker* worker) worker->thread = NULL; worker->mutex = NULL; worker->condition = NULL; - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - CPUBuffer_Free(&worker->voxels[i]); + CPUBuffer_Free(&worker->voxels[mesh_index]); } CPUBuffer_Free(&worker->lights); } static int SortFunction(void* userdata, const void* lhs, const void* rhs) { - int w = WORLD_WIDTH / 2; - const int* l = lhs; - const int* r = rhs; - int a = (l[0] - w) * (l[0] - w) + (l[1] - w) * (l[1] - w); - int b = (r[0] - w) * (r[0] - w) + (r[1] - w) * (r[1] - w); - if (a < b) + int center = WORLD_WIDTH / 2; + const int* left = lhs; + const int* right = rhs; + int left_distance = + (left[0] - center) * (left[0] - center) + (left[1] - center) * (left[1] - center); + int right_distance = + (right[0] - center) * (right[0] - center) + (right[1] - center) * (right[1] - center); + if (left_distance < right_distance) { return -1; } - else if (a > b) + if (left_distance > right_distance) { return 1; } return 0; } -void World_Init(SDL_GPUDevice* handle) +void World_Init(SDL_GPUDevice* gpu_device) { - device = handle; + device = gpu_device; world_x = SDL_MAX_SINT32; world_z = SDL_MAX_SINT32; GPUBuffer_Init(&gpu_indices, device, SDL_GPU_BUFFERUSAGE_INDEX); GPUBuffer_Init(&gpu_empty_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - CPUBuffer_Init(&cpu_voxels[i], device, sizeof(Voxel)); + CPUBuffer_Init(&cpu_voxels[mesh_index], device, sizeof(Voxel)); } - for (int i = 0; i < WORKERS; i++) + for (int worker_index = 0; worker_index < WORKERS; worker_index++) { - StartWorker(&workers[i]); + StartWorker(&workers[worker_index]); } for (int x = 0; x < WORLD_WIDTH; x++) { @@ -697,9 +713,9 @@ void World_Init(SDL_GPUDevice* handle) void World_Free() { - for (int i = 0; i < WORKERS; i++) + for (int worker_index = 0; worker_index < WORKERS; worker_index++) { - StopWorker(&workers[i]); + StopWorker(&workers[worker_index]); } for (int x = 0; x < WORLD_WIDTH; x++) { @@ -710,59 +726,59 @@ void World_Free() } GPUBuffer_Free(&gpu_indices); GPUBuffer_Free(&gpu_empty_lights); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { - CPUBuffer_Free(&cpu_voxels[i]); + CPUBuffer_Free(&cpu_voxels[mesh_index]); } } -static int GetWorkers(Worker* local_workers[WORKERS]) +static int GetIdleWorkers(Worker* idle_workers[WORKERS]) { - int num_workers = 0; - for (int i = 0; i < WORKERS; i++) + int idle_count = 0; + for (int worker_index = 0; worker_index < WORKERS; worker_index++) { - if (!IsJobRunning(&workers[i])) + if (!IsWorkerBusy(&workers[worker_index])) { - local_workers[num_workers++] = &workers[i]; + idle_workers[idle_count++] = &workers[worker_index]; } } - return num_workers; + return idle_count; } static void Shuffle(int offset_x, int offset_z) { world_x += offset_x; world_z += offset_z; - Chunk* in[WORLD_WIDTH][WORLD_WIDTH] = {0}; - Chunk* out[WORLD_WIDTH * WORLD_WIDTH] = {0}; - int size = 0; + Chunk* retained_chunks[WORLD_WIDTH][WORLD_WIDTH] = {0}; + Chunk* recycled_chunks[WORLD_WIDTH * WORLD_WIDTH] = {0}; + int recycled_count = 0; for (int x = 0; x < WORLD_WIDTH; x++) { for (int z = 0; z < WORLD_WIDTH; z++) { SDL_assert(chunks[x][z]); - const int a = x - offset_x; - const int b = z - offset_z; - if (IsChunkLocal(a, b)) + int new_x = x - offset_x; + int new_z = z - offset_z; + if (IsChunkLocal(new_x, new_z)) { - in[a][b] = chunks[x][z]; + retained_chunks[new_x][new_z] = chunks[x][z]; } else { - out[size++] = chunks[x][z]; + recycled_chunks[recycled_count++] = chunks[x][z]; } chunks[x][z] = NULL; } } - SDL_memcpy(chunks, in, sizeof(in)); + SDL_memcpy(chunks, retained_chunks, sizeof(retained_chunks)); for (int x = 0; x < WORLD_WIDTH; x++) { for (int z = 0; z < WORLD_WIDTH; z++) { if (!chunks[x][z]) { - SDL_assert(size > 0); - Chunk* chunk = out[--size]; + SDL_assert(recycled_count > 0); + Chunk* chunk = recycled_chunks[--recycled_count]; SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); @@ -773,7 +789,7 @@ static void Shuffle(int offset_x, int offset_z) chunk->z = (world_z + z) * CHUNK_WIDTH; } } - SDL_assert(!size); + SDL_assert(!recycled_count); } static bool MoveChunks(const Camera* camera) @@ -784,8 +800,8 @@ static bool MoveChunks(const Camera* camera) { return false; } - Worker* local_workers[WORKERS]; - if (GetWorkers(local_workers) != WORKERS) + Worker* idle_workers[WORKERS]; + if (GetIdleWorkers(idle_workers) != WORKERS) { return true; } @@ -815,31 +831,32 @@ static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) { return false; } - bool do_voxel = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED; - bool do_light = SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED; - if (!do_voxel && !do_light) + bool needs_voxels = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED; + bool needs_lights = SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED; + if (!needs_voxels && !needs_lights) { return false; } Chunk* neighborhood[3][3]; GetNeighborhood(x, z, neighborhood); - for (int i = 0; i < 3; i++) + for (int neighbor_x = 0; neighbor_x < 3; neighbor_x++) { - for (int j = 0; j < 3; j++) + for (int neighbor_z = 0; neighbor_z < 3; neighbor_z++) { - if (SDL_GetAtomicInt(&neighborhood[i][j]->block_state) != JOB_STATE_COMPLETED) + if (SDL_GetAtomicInt(&neighborhood[neighbor_x][neighbor_z]->block_state) != + JOB_STATE_COMPLETED) { return false; } } } Job job; - if (do_voxel) + if (needs_voxels) { job = (Job){JOB_TYPE_VOXELS, x, z}; SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_RUNNING); } - else if (do_light) + else if (needs_lights) { job = (Job){JOB_TYPE_LIGHTS, x, z}; SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_RUNNING); @@ -858,26 +875,26 @@ void World_Update(const Camera* camera) { return; } - Worker* local_workers[WORKERS] = {0}; - int num_workers = GetWorkers(local_workers); + Worker* idle_workers[WORKERS] = {0}; + int idle_count = GetIdleWorkers(idle_workers); for (int x = 0; x < WORLD_WIDTH; x++) { for (int z = 0; z < WORLD_WIDTH; z++) { - if (num_workers == 0) + if (idle_count == 0) { return; } - int a = sorted_chunks[x][z][0]; - int b = sorted_chunks[x][z][1]; - Worker* worker = local_workers[num_workers - 1]; - if (TryUpdateBlocks(a, b, worker)) + int chunk_x = sorted_chunks[x][z][0]; + int chunk_z = sorted_chunks[x][z][1]; + Worker* worker = idle_workers[idle_count - 1]; + if (TryUpdateBlocks(chunk_x, chunk_z, worker)) { - num_workers--; + idle_count--; } - else if (TryUpdateVoxelsOrLights(a, b, worker)) + else if (TryUpdateVoxelsOrLights(chunk_x, chunk_z, worker)) { - num_workers--; + idle_count--; } } } @@ -885,8 +902,8 @@ void World_Update(const Camera* camera) static void Render( Chunk* chunk, - SDL_GPUCommandBuffer* cbuf, - SDL_GPURenderPass* pass, + SDL_GPUCommandBuffer* command_buffer, + SDL_GPURenderPass* render_pass, WorldFlags flags) { MeshType mesh = flags & WORLD_FLAGS_OPAQUE ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; @@ -913,46 +930,51 @@ static void Render( light_binding = gpu_empty_lights.buffer; light_count = 0; } - SDL_PushGPUFragmentUniformData(cbuf, 0, &light_count, 4); - SDL_BindGPUFragmentStorageBuffers(pass, 1, &light_binding, 1); - } - SDL_PushGPUVertexUniformData(cbuf, 2, chunk->position, 8); - SDL_BindGPUVertexBuffers(pass, 0, &voxel_binding, 1); - SDL_BindGPUIndexBuffer(pass, &index_binding, SDL_GPU_INDEXELEMENTSIZE_32BIT); - SDL_DrawGPUIndexedPrimitives(pass, gpu_voxels->size * 1.5, 1, 0, 0, 0); + SDL_PushGPUFragmentUniformData(command_buffer, 0, &light_count, sizeof(light_count)); + SDL_BindGPUFragmentStorageBuffers(render_pass, 1, &light_binding, 1); + } + SDL_PushGPUVertexUniformData(command_buffer, 2, chunk->position, sizeof(chunk->position)); + SDL_BindGPUVertexBuffers(render_pass, 0, &voxel_binding, 1); + SDL_BindGPUIndexBuffer(render_pass, &index_binding, SDL_GPU_INDEXELEMENTSIZE_32BIT); + Uint32 index_count = gpu_voxels->size / 4 * 6; + SDL_DrawGPUIndexedPrimitives(render_pass, index_count, 1, 0, 0, 0); } void World_Render( const Camera* camera, - SDL_GPUCommandBuffer* cbuf, - SDL_GPURenderPass* pass, + SDL_GPUCommandBuffer* command_buffer, + SDL_GPURenderPass* render_pass, WorldFlags flags) { - SDL_PushGPUVertexUniformData(cbuf, 0, camera->proj, 64); - SDL_PushGPUVertexUniformData(cbuf, 1, camera->view, 64); + SDL_PushGPUVertexUniformData(command_buffer, 0, camera->proj, sizeof(camera->proj)); + SDL_PushGPUVertexUniformData(command_buffer, 1, camera->view, sizeof(camera->view)); for (int x = 0; x < WORLD_WIDTH; x++) { - for (int y = 0; y < WORLD_WIDTH; y++) + for (int z = 0; z < WORLD_WIDTH; z++) { - int a = sorted_chunks[x][y][0]; - int b = sorted_chunks[x][y][1]; - if (IsChunkOnBorder(a, b)) + int chunk_x = sorted_chunks[x][z][0]; + int chunk_z = sorted_chunks[x][z][1]; + if (IsChunkOnBorder(chunk_x, chunk_z)) { continue; } - Chunk* chunk = chunks[a][b]; + Chunk* chunk = chunks[chunk_x][chunk_z]; if (SDL_GetAtomicInt(&chunk->voxel_state) != JOB_STATE_COMPLETED) { continue; } - float sx = CHUNK_WIDTH; - float sy = CHUNK_HEIGHT; - float sz = CHUNK_WIDTH; - if (!Camera_GetVisibility(camera, chunk->x, 0.0f, chunk->z, sx, sy, sz)) + if (!Camera_GetVisibility( + camera, + chunk->x, + 0.0f, + chunk->z, + CHUNK_WIDTH, + CHUNK_HEIGHT, + CHUNK_WIDTH)) { continue; } - Render(chunk, cbuf, pass, flags); + Render(chunk, command_buffer, render_pass, flags); } } } @@ -1028,49 +1050,53 @@ void World_SetBlock(const int position[3], Block block) GetNeighborhood(chunk_x, chunk_z, neighborhood); if (Block_IsLight(block) || Block_IsLight(old_block)) { - for (int i = 0; i < 3; i++) + for (int neighbor_x = 0; neighbor_x < 3; neighbor_x++) { - for (int j = 0; j < 3; j++) + for (int neighbor_z = 0; neighbor_z < 3; neighbor_z++) { - SDL_SetAtomicInt(&neighborhood[i][j]->light_state, JOB_STATE_REQUESTED); + SDL_SetAtomicInt( + &neighborhood[neighbor_x][neighbor_z]->light_state, + JOB_STATE_REQUESTED); } } } } -WorldQuery World_Raycast(const Camera* camera, float length) +WorldQuery World_Raycast(const Camera* camera, float max_distance) { WorldQuery query = {0}; float direction[3] = {0}; - float distances[3] = {0}; + float next_distances[3] = {0}; int steps[3] = {0}; - float deltas[3] = {0}; + float step_distances[3] = {0}; Camera_GetVector(camera, &direction[0], &direction[1], &direction[2]); - for (int i = 0; i < 3; i++) + for (int axis = 0; axis < 3; axis++) { - query.current[i] = SDL_floorf(camera->position[i]); - query.previous[i] = query.current[i]; - if (SDL_fabsf(direction[i]) > SDL_FLT_EPSILON) + query.current[axis] = SDL_floorf(camera->position[axis]); + query.previous[axis] = query.current[axis]; + if (SDL_fabsf(direction[axis]) > SDL_FLT_EPSILON) { - deltas[i] = SDL_fabsf(1.0f / direction[i]); + step_distances[axis] = SDL_fabsf(1.0f / direction[axis]); } else { - deltas[i] = 1e6; + step_distances[axis] = 1e6f; } - if (direction[i] < 0.0f) + if (direction[axis] < 0.0f) { - steps[i] = -1; - distances[i] = (camera->position[i] - query.current[i]) * deltas[i]; + steps[axis] = -1; + next_distances[axis] = + (camera->position[axis] - query.current[axis]) * step_distances[axis]; } else { - steps[i] = 1; - distances[i] = (query.current[i] + 1.0f - camera->position[i]) * deltas[i]; + steps[axis] = 1; + next_distances[axis] = + (query.current[axis] + 1.0f - camera->position[axis]) * step_distances[axis]; } } - float traveled = 0.0f; - while (traveled <= length) + float distance = 0.0f; + while (distance <= max_distance) { query.block = World_GetBlock(query.current); if (Block_IsSolid(query.block)) @@ -1079,11 +1105,11 @@ WorldQuery World_Raycast(const Camera* camera, float length) } SDL_memcpy(query.previous, query.current, sizeof(query.current)); int axis; - if (distances[0] < distances[1] && distances[0] < distances[2]) + if (next_distances[0] < next_distances[1] && next_distances[0] < next_distances[2]) { axis = 0; } - else if (distances[1] < distances[2]) + else if (next_distances[1] < next_distances[2]) { axis = 1; } @@ -1091,8 +1117,8 @@ WorldQuery World_Raycast(const Camera* camera, float length) { axis = 2; } - traveled = distances[axis]; - distances[axis] += deltas[axis]; + distance = next_distances[axis]; + next_distances[axis] += step_distances[axis]; query.current[axis] += steps[axis]; } query.block = BLOCK_EMPTY; diff --git a/src/world.h b/src/world.h index f6d59f83..fd740c4c 100644 --- a/src/world.h +++ b/src/world.h @@ -29,9 +29,9 @@ void World_Free(); void World_Update(const Camera* camera); void World_Render( const Camera* camera, - SDL_GPUCommandBuffer* cbuf, - SDL_GPURenderPass* pass, + SDL_GPUCommandBuffer* command_buffer, + SDL_GPURenderPass* render_pass, WorldFlags flags); Block World_GetBlock(const int position[3]); void World_SetBlock(const int position[3], Block block); -WorldQuery World_Raycast(const Camera* camera, float length); +WorldQuery World_Raycast(const Camera* camera, float max_distance); From 5fb936b953528a62d4b3809168b453db2fbde92c Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 16:44:25 -0400 Subject: [PATCH 24/39] more refactors --- .clang-format | 2 +- shaders/bin/opaque.frag.msl | 174 +++++++------ shaders/bin/opaque.frag.spv | Bin 9976 -> 9960 bytes shaders/bin/opaque.vert.spv | Bin 2680 -> 2680 bytes shaders/bin/shadow.vert.msl | 14 +- shaders/bin/shadow.vert.spv | Bin 2676 -> 2948 bytes shaders/bin/transparent.frag.msl | 175 ++++++------- shaders/bin/transparent.frag.spv | Bin 10184 -> 10260 bytes shaders/opaque.frag | 16 +- shaders/opaque.vert | 4 +- shaders/shader.hlsl | 121 +++++---- shaders/shadow.vert | 2 +- shaders/transparent.frag | 15 +- src/block.c | 412 +++++++++++++++---------------- src/block.h | 7 +- src/camera.c | 40 +-- src/camera.h | 9 +- src/main.c | 21 +- src/player.c | 7 +- src/rand.c | 33 +-- src/save.c | 3 +- src/shader.c | 8 +- src/sky.c | 6 +- src/voxel.c | 61 ++--- src/voxel.h | 9 +- src/voxel.inc | 48 ++-- src/world.c | 79 ++---- 27 files changed, 561 insertions(+), 705 deletions(-) diff --git a/.clang-format b/.clang-format index a08ce114..15c009f8 100644 --- a/.clang-format +++ b/.clang-format @@ -7,7 +7,7 @@ BreakBeforeBraces: Allman BreakStringLiterals: false BinPackArguments: false BinPackParameters: false -ColumnLimit: 100 +ColumnLimit: 120 Cpp11BracedListStyle: true IndentWidth: 4 MaxEmptyLinesToKeep: 1 diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 191ca543..1c4f79f0 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -46,11 +46,17 @@ struct spvUnsafeArray struct Block { + uint IsOpaque; + uint IsSolid; uint IsSprite; - uint HasOcclusion; - uint HasShadow; + uint CanBeOccluded; + uint CanCreateShadow; uint CanBeInShadow; - float blockSunIntensity; + float SunIntensity; + uint LightColor; + int LightX; + int LightY; + int LightZ; uint Indices[6]; }; @@ -95,7 +101,7 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _110 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _108 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -114,154 +120,144 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _128 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - bool _137 = blockBuffer._m0[_128].IsSprite != 0u; - uint _142; - if (_137) - { - _142 = 0u; - } - else - { - _142 = in.in_var_TEXCOORD2 & 7u; - } - float3 _148 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_128].Indices[_142])); - float4 _152 = atlasTexture.sample(atlasSampler, _148.xy, uint(rint(_148.z))); - if (_152.w < 0.001000000047497451305389404296875) + uint _126 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _133 = in.in_var_TEXCOORD2 & 7u; + float3 _139 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_126].Indices[_133])); + float4 _143 = atlasTexture.sample(atlasSampler, _139.xy, uint(rint(_139.z))); + if (_143.w < 0.001000000047497451305389404296875) { discard_fragment(); } - uint _161 = (in.in_var_TEXCOORD2 & 7u) + uint(_137 ? 6 : 0); - uint _166 = uint(UniformBuffer.LightCount); - float3 _169; - _169 = float3(0.0); - float3 _170; - for (uint _172 = 0u; _172 < _166; _169 = _170, _172++) + uint _153 = uint(UniformBuffer.LightCount); + float3 _156; + _156 = float3(0.0); + float3 _157; + for (uint _159 = 0u; _159 < _153; _156 = _157, _159++) { - float _185 = float((lightBuffer._m0[_172].Color & 4278190080u) >> 24u); - float3 _191 = (float3(float(lightBuffer._m0[_172].X), float(lightBuffer._m0[_172].Y), float(lightBuffer._m0[_172].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _192 = length(_191); - if (_192 >= _185) + float _172 = float((lightBuffer._m0[_159].Color & 4278190080u) >> 24u); + float3 _178 = (float3(float(lightBuffer._m0[_159].X), float(lightBuffer._m0[_159].Y), float(lightBuffer._m0[_159].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _179 = length(_178); + if (_179 >= _172) { - _170 = _169; + _157 = _156; continue; } - float _199 = fast::clamp(dot(_110[_161], _191 / float3(_192)), 0.0, 1.0); - if (_199 <= 0.0) + float _186 = fast::clamp(dot(_108[_133], _178 / float3(_179)), 0.0, 1.0); + if (_186 <= 0.0) { - _170 = _169; + _157 = _156; continue; } - _170 = _169 + ((float3(float(lightBuffer._m0[_172].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_172].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_172].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _199) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_192 / _185, 0.0, 1.0)))); + _157 = _156 + ((float3(float(lightBuffer._m0[_159].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_159].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_159].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _186) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_179 / _172, 0.0, 1.0)))); } - float _340; + float _327; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _340 = 0.0; + _327 = 0.0; break; } - float _239 = blockBuffer._m0[_128].blockSunIntensity * UniformBuffer_3.Sun.w; - if (blockBuffer._m0[_128].CanBeInShadow == 0u) + float _226 = blockBuffer._m0[_126].SunIntensity * UniformBuffer_3.Sun.w; + if (blockBuffer._m0[_126].CanBeInShadow == 0u) { - _340 = _239; + _327 = _226; break; } - float _250; - if (blockBuffer._m0[_128].HasOcclusion != 0u) + float _237; + if (blockBuffer._m0[_126].CanBeOccluded != 0u) { - _250 = fast::clamp(-dot(_110[_161], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _237 = fast::clamp(-dot(_108[_133], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _250 = 0.7070000171661376953125; + _237 = 0.7070000171661376953125; } - if (_250 <= 0.0) + if (_237 <= 0.0) { - _340 = 0.0; + _327 = 0.0; break; } - float4 _258 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _262 = _258.xyz / float3(_258.w); - float2 _265 = (_262.xy * 0.5) + float2(0.5); - float _267 = 1.0 - _265.y; - float2 _268 = _265; - _268.y = _267; - float _269 = _265.x; - bool _274; - if ((isunordered(_269, 0.0) || _269 >= 0.0)) + float4 _245 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _249 = _245.xyz / float3(_245.w); + float2 _252 = (_249.xy * 0.5) + float2(0.5); + float _254 = 1.0 - _252.y; + float2 _255 = _252; + _255.y = _254; + float _256 = _252.x; + bool _261; + if ((isunordered(_256, 0.0) || _256 >= 0.0)) { - _274 = _269 > 1.0; + _261 = _256 > 1.0; } else { - _274 = true; + _261 = true; } - bool _279; - if (!_274) + bool _266; + if (!_261) { - _279 = _267 < 0.0; + _266 = _254 < 0.0; } else { - _279 = true; + _266 = true; } - bool _284; - if (!_279) + bool _271; + if (!_266) { - _284 = _267 > 1.0; + _271 = _254 > 1.0; } else { - _284 = true; + _271 = true; } - bool _290; - if (!_284) + bool _277; + if (!_271) { - _290 = _262.z < 0.0; + _277 = _249.z < 0.0; } else { - _290 = true; + _277 = true; } - bool _296; - if (!_290) + bool _283; + if (!_277) { - _296 = _262.z > 1.0; + _283 = _249.z > 1.0; } else { - _296 = true; + _283 = true; } - if (_296) + if (_283) { - _340 = _239 * _250; + _327 = _226 * _237; break; } - uint2 _300 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _306 = float2(1.0) / float2(float(_300.x), float(_300.y)); - float _309 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _250)); - float _311; - int _314; - _311 = 0.0; - _314 = -1; - float _312; - for (; _314 <= 1; _311 = _312, _314++) + uint2 _287 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _293 = float2(1.0) / float2(float(_287.x), float(_287.y)); + float _296 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _237)); + float _298; + int _301; + _298 = 0.0; + _301 = -1; + float _299; + for (; _301 <= 1; _298 = _299, _301++) { - _312 = _311; - for (int _322 = -1; _322 <= 1; ) + _299 = _298; + for (int _309 = -1; _309 <= 1; ) { - _312 += shadowTexture.sample_compare(shadowSampler, (_268 + (float2(float(_314), float(_322)) * _306)), _262.z - _309, level(0.0)); - _322++; + _299 += shadowTexture.sample_compare(shadowSampler, (_255 + (float2(float(_301), float(_309)) * _293)), _249.z - _296, level(0.0)); + _309++; continue; } } - _340 = (_239 * _250) * mix(1.0, _311 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _327 = (_226 * _237) * mix(1.0, _298 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _348 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_152.xyz * ((_169 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_340)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_348.y, length(_348.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _335 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_143.xyz * ((_156 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_327)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_335.y, length(_335.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index bf563dcc868f972d657ebbd34a3a18e878281aee..af3a7be4707e9fd8681198320ec0b87348a32109 100644 GIT binary patch literal 9960 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 C=G7wr literal 9976 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 diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index 5790af1bb527ecbc4c5ca484913399869b0b9f63..b91155d50947e52403dedc04edf0aa300e75c967 100644 GIT binary patch literal 2680 zcmZ{k*HTnL5Qc}aVosRj0_K1@D+s7y+!YgMQK4KdSqnkSJADIh^>MuMM&HL9OTX`M z+B%|~s(+{dzh`=Sx@Wejv7;rWhLqC6G{UdnlGKA%J>iyO4zf}Ui4J3ThbitiFdC?I&X~CM(g7*dnZRnN5)-S%6zy}b-e!Ev4lF8 zaoW@@j@irwak9%}kmU@u}U zgPr7}ZC)w8?_LRCf~987mcy4amVux1<*mS)1Yd^j{NT&6%`4)s!2bU2TUYRv@Xw!C zcL!gU`7d?5-)ihKi1_j~z|Z;ewIKZFvkurx{qpr-V}W}IJX84f{VMP>wmF5r4cnN( z+p&!q+`9Vzv5x&VF&f)5TffaY_x!8iTNu^k8>o`KRx6`yWwa-1`s`u&w&gxG<8Ej4 z?9O+t{Zuo~j$Buh?__KMQ@v|WyRhw#c^GRqqd6PP`JIgV)#ZC~9_#(H(C?a7R{0;$ zhO(bg+nBy@^K+gt4l){FO@1inalXTF@3S#a;I|g`&^2<;@B0hx8GUcTJ)?F5aDJT8 z{exTc;GWU{i{PGdR)Kp)^NIYAsh2tcN-IS)U(d zd7ROljOo2`pDxyE8}k%CYkdNErXDi0ekXxv_Wld!SCR5JBO_v>-w=> zR|c_e09(Dd-+8#Y`TM_g0hojF^wr5r{USIGK9IZo5^%11h1X?&E(3d{uNjm;^uGt@ z{k#Iab5ZLp*p*zr${cG@1;+3T?JBmKeGhFg*BTkCble=SWwvut((nEGNL+o_fqwUk z7&mg=7=vW%yqiGX^LSSy_gmP$pJMJqaP`>ZHn#hyM=$PR+lw|3y||05-U_0J_psGt z-Fqoh5&)rMicj)?`bnYnl4cG&GvJZvW|$SYV}_Kzt&!R4SRQ~wRc%cEh(j+(dlvp*+$c1jrSAlQt|9V zW4izEiJAVJ=f{U@wXt&tpt79pO>=Jc8>4-(XNzqI^L_SmvF%W9v&V~Vzh<@)Q%vdE zP>tB-Y=$wb5wNpbm|{vJAkWZWn>B1f{KV#6#O5mYE@*eJ*nMJi5_^W&8TKIIFYZSC zw3|oKF4i9Y_PS^nYxlfSs`F0y^)4)5aptlb8ReYtvmR>}M~t{L#TdaAV+0p5#1SLz zOT_RDIqhBOZLC#fFS)3jS4wXN*MZld$=S0`@LJX?;-|m39kC~YJJ9tH+=*^p?(br) zBH=Gyhxq9)UXO&`_!|)GiFg~)w-)d(=;j#qP3WHrcr&_Zgxx!!Phex|BaU9YpPwHH z+>Pzue>MyT?g77_zmj3|v#-v~er;nlhV`!JcRQ<`cne+8Pp%5HgVhjfyJr)2 z|2Wj0YdcZ=KjO4`?R{8Wk0Vv28|guOH!bY2&nJ+h zoM1o9$Vlw|UNKu>C%XSjQ0A*t1iJb$Wjl{p{gsL|ga`pogFDC;SG{ zwbhB|OwJ(gHI}yj$kB6$5YP6l{hxDZbKdv%f^(hCFd`rO&Y`={HyHcQqs#loV&4UH z`Pest?mpjL>>EXwFP?W1EN}k)7hOWk!Fbx5J^48P#6qsuw#;Kp*Um9@^4&EZC->ywgp@60>m zYP*SO_q>R4E9Z?dMz;FhM&zx>`x&|4LHErRa~}uG#~Ht)dyag};tzCZ;s0XH;x4*; zI}$Uzhb|xc?xVZU|IgU>0A0Sg?;%*ePMv+Mj}T+Y4^V+`z_%1}C(w=Ci$vVV=<*$i t_4> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(UniformBuffer_2.ChunkPosition.x, 0, UniformBuffer_2.ChunkPosition.y)), 1.0)); - out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].HasShadow != 0u) ? 1.0 : (-1.0); + out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].CanCreateShadow != 0u) ? 1.0 : (-1.0); out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; } diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index d719cff5bd49de230d21893eee4308cd31239b09..1de1bc8aed2ef13c0b78f841dd1571eef6b0464e 100644 GIT binary patch delta 455 zcmew&(jq=#UcG-oVqs}20}!w=umUjy10xW776<3&WTpW5AjrVL1Q9DJ$}EAZWe1Bh z1I3*a^PE!slaq5wQ&Llad^QG%91BFwxhOTUBsDlAF(tnoF2@SfSMQkzl|pC)Sr}ZJ z=b2ZMnpd1zQVHY&H9{Q14rKdere~Bm=jY@XAso#C6OTZMal*tR5n^00u_%ZbE66hL z&5Df4O!Xen000Ro1F-}U!^A-Lg2ZHy#6Wg}#1xRkKz4$}RFK3#c7nt-ki@v5Vmd(D zoq>gcALJa6#V(sCGQVWx<^ywtfdaylYgxs4K`fAaz{~|JBo^^0RQD#Xh0}!w=umdpz10xW7Bo_N8C+CzFXXfWYY%drYnKt)wd}jgx$ciL8 diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index b33b522b..365bcafb 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -46,11 +46,17 @@ struct spvUnsafeArray struct Block { + uint IsOpaque; + uint IsSolid; uint IsSprite; - uint HasOcclusion; - uint HasShadow; + uint CanBeOccluded; + uint CanCreateShadow; uint CanBeInShadow; - float blockSunIntensity; + float SunIntensity; + uint LightColor; + int LightX; + int LightY; + int LightZ; uint Indices[6]; }; @@ -95,7 +101,7 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _110 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _108 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -113,153 +119,150 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _130 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _139 = in.in_var_TEXCOORD2 & 7u; - bool _140 = blockBuffer._m0[_130].IsSprite != 0u; - uint _143 = _139 + uint(_140 ? 6 : 0); - uint _146 = _140 ? 0u : _139; - float3 _152 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_130].Indices[_146])); - float4 _156 = atlasTexture.sample(atlasSampler, _152.xy, uint(rint(_152.z))); - float _158 = _156.w; - uint _161 = uint(UniformBuffer.LightCount); - float3 _164; - _164 = float3(0.0); - float3 _165; - for (uint _167 = 0u; _167 < _161; _164 = _165, _167++) + uint _128 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _135 = in.in_var_TEXCOORD2 & 7u; + float3 _143 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_128].Indices[_135])); + float4 _147 = atlasTexture.sample(atlasSampler, _143.xy, uint(rint(_143.z))); + float _149 = _147.w; + uint _152 = uint(UniformBuffer.LightCount); + float3 _155; + _155 = float3(0.0); + float3 _156; + for (uint _158 = 0u; _158 < _152; _155 = _156, _158++) { - float _180 = float((lightBuffer._m0[_167].Color & 4278190080u) >> 24u); - float3 _186 = (float3(float(lightBuffer._m0[_167].X), float(lightBuffer._m0[_167].Y), float(lightBuffer._m0[_167].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _187 = length(_186); - if (_187 >= _180) + float _171 = float((lightBuffer._m0[_158].Color & 4278190080u) >> 24u); + float3 _177 = (float3(float(lightBuffer._m0[_158].X), float(lightBuffer._m0[_158].Y), float(lightBuffer._m0[_158].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _178 = length(_177); + if (_178 >= _171) { - _165 = _164; + _156 = _155; continue; } - float _194 = fast::clamp(dot(_110[_143], _186 / float3(_187)), 0.0, 1.0); - if (_194 <= 0.0) + float _185 = fast::clamp(dot(_108[_135], _177 / float3(_178)), 0.0, 1.0); + if (_185 <= 0.0) { - _165 = _164; + _156 = _155; continue; } - _165 = _164 + ((float3(float(lightBuffer._m0[_167].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_167].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _194) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_187 / _180, 0.0, 1.0)))); + _156 = _155 + ((float3(float(lightBuffer._m0[_158].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_158].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_158].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _185) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_178 / _171, 0.0, 1.0)))); } - float _335; + float _326; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _335 = 0.0; + _326 = 0.0; break; } - float _234 = blockBuffer._m0[_130].blockSunIntensity * UniformBuffer_3.Sun.w; - if (blockBuffer._m0[_130].CanBeInShadow == 0u) + float _225 = blockBuffer._m0[_128].SunIntensity * UniformBuffer_3.Sun.w; + if (blockBuffer._m0[_128].CanBeInShadow == 0u) { - _335 = _234; + _326 = _225; break; } - float _245; - if (blockBuffer._m0[_130].HasOcclusion != 0u) + float _236; + if (blockBuffer._m0[_128].CanBeOccluded != 0u) { - _245 = fast::clamp(-dot(_110[_143], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _236 = fast::clamp(-dot(_108[_135], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _245 = 0.7070000171661376953125; + _236 = 0.7070000171661376953125; } - if (_245 <= 0.0) + if (_236 <= 0.0) { - _335 = 0.0; + _326 = 0.0; break; } - float4 _253 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _257 = _253.xyz / float3(_253.w); - float2 _260 = (_257.xy * 0.5) + float2(0.5); - float _262 = 1.0 - _260.y; - float2 _263 = _260; - _263.y = _262; - float _264 = _260.x; - bool _269; - if ((isunordered(_264, 0.0) || _264 >= 0.0)) + float4 _244 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _248 = _244.xyz / float3(_244.w); + float2 _251 = (_248.xy * 0.5) + float2(0.5); + float _253 = 1.0 - _251.y; + float2 _254 = _251; + _254.y = _253; + float _255 = _251.x; + bool _260; + if ((isunordered(_255, 0.0) || _255 >= 0.0)) { - _269 = _264 > 1.0; + _260 = _255 > 1.0; } else { - _269 = true; + _260 = true; } - bool _274; - if (!_269) + bool _265; + if (!_260) { - _274 = _262 < 0.0; + _265 = _253 < 0.0; } else { - _274 = true; + _265 = true; } - bool _279; - if (!_274) + bool _270; + if (!_265) { - _279 = _262 > 1.0; + _270 = _253 > 1.0; } else { - _279 = true; + _270 = true; } - bool _285; - if (!_279) + bool _276; + if (!_270) { - _285 = _257.z < 0.0; + _276 = _248.z < 0.0; } else { - _285 = true; + _276 = true; } - bool _291; - if (!_285) + bool _282; + if (!_276) { - _291 = _257.z > 1.0; + _282 = _248.z > 1.0; } else { - _291 = true; + _282 = true; } - if (_291) + if (_282) { - _335 = _234 * _245; + _326 = _225 * _236; break; } - uint2 _295 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _301 = float2(1.0) / float2(float(_295.x), float(_295.y)); - float _304 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _245)); - float _306; - int _309; - _306 = 0.0; - _309 = -1; - float _307; - for (; _309 <= 1; _306 = _307, _309++) + uint2 _286 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _292 = float2(1.0) / float2(float(_286.x), float(_286.y)); + float _295 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _236)); + float _297; + int _300; + _297 = 0.0; + _300 = -1; + float _298; + for (; _300 <= 1; _297 = _298, _300++) { - _307 = _306; - for (int _317 = -1; _317 <= 1; ) + _298 = _297; + for (int _308 = -1; _308 <= 1; ) { - _307 += shadowTexture.sample_compare(shadowSampler, (_263 + (float2(float(_309), float(_317)) * _301)), _257.z - _304, level(0.0)); - _317++; + _298 += shadowTexture.sample_compare(shadowSampler, (_254 + (float2(float(_300), float(_308)) * _292)), _248.z - _295, level(0.0)); + _308++; continue; } } - _335 = (_234 * _245) * mix(1.0, _306 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _326 = (_225 * _236) * mix(1.0, _297 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _338 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _372; - if (blockBuffer._m0[_130].Indices[_146] == 16u) + float3 _329 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _363; + if (blockBuffer._m0[_128].Indices[_135] == 16u) { - _372 = _158 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _363 = _149 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _372 = _158; + _363 = _149; } - out.out_var_SV_Target0 = float4(mix(_156.xyz * ((_164 + UniformBuffer_3.Ambient.xyz) + float3(_335)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_338.y, length(_338.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _372); + out.out_var_SV_Target0 = float4(mix(_147.xyz * ((_155 + UniformBuffer_3.Ambient.xyz) + float3(_326)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_329.y, length(_329.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _363); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 7006522bce30900ac8a44cf7891206f57267de09..5d21efd3185423ec96643dceb6effe957937154f 100644 GIT binary patch literal 10260 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 literal 10184 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 J%E~80{{waI>tO%@ diff --git a/shaders/opaque.frag b/shaders/opaque.frag index f16cb317..70c4a204 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -35,7 +35,7 @@ struct Input float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float AmbientOcclusion : TEXCOORD3; + float Occlusion : TEXCOORD3; }; struct Output @@ -49,18 +49,18 @@ Output main(Input input) Output output; Block block = blockBuffer[GetBlockIndex(input.Voxel)]; float3 texcoord = float3(input.Texcoord, GetAtlasIndex(input.Voxel, block)); - float4 texel = atlasTexture.Sample(atlasSampler, texcoord); + float4 rawColor = atlasTexture.Sample(atlasSampler, texcoord); output.Position = input.WorldPosition; - if (texel.a < kEpsilon) + if (rawColor.a < kEpsilon) { discard; return output; } - float3 albedo = texel.rgb; - float3 normal = GetNormal(input.Voxel, block); + float3 albedo = rawColor.rgb; + float3 normal = GetNormal(input.Voxel); float3 pointLight = GetPointLight(lightBuffer, LightCount, input.WorldPosition.xyz, normal); float3 ambient = Ambient.xyz; - float sunlight = GetSunLight( + float sunlight = GetSunlight( shadowTexture, shadowSampler, ShadowTransform, @@ -69,9 +69,9 @@ Output main(Input input) input.WorldPosition.xyz, normal, block); - float3 litColor = albedo * (pointLight + ambient * input.AmbientOcclusion + sunlight); + float3 litColor = albedo * (pointLight + ambient * input.Occlusion + sunlight); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); - float fog = GetFogAmount(distance(input.WorldPosition.xz, PlayerPosition.xz)); + float fog = GetFogValue(distance(input.WorldPosition.xz, PlayerPosition.xz)); output.Color = float4(lerp(litColor, sky, fog), 1.0f); return output; } diff --git a/shaders/opaque.vert b/shaders/opaque.vert index 9908789d..f7a37681 100644 --- a/shaders/opaque.vert +++ b/shaders/opaque.vert @@ -26,7 +26,7 @@ struct Output float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float AmbientOcclusion : TEXCOORD3; + float Occlusion : TEXCOORD3; }; Output main(Input input) @@ -39,6 +39,6 @@ Output main(Input input) output.Position = mul(Proj, output.Position); output.Texcoord = GetTexcoord(input.Voxel); output.Voxel = input.Voxel; - output.AmbientOcclusion = GetAmbientOcclusion(input.Voxel); + output.Occlusion = GetOcclusion(input.Voxel); return output; } diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index d7fd151f..fc01358b 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -9,96 +9,96 @@ static const float kPi = 3.14159265f; struct Block { + uint IsOpaque; + uint IsSolid; uint IsSprite; - uint HasOcclusion; - uint HasShadow; + uint CanBeOccluded; + uint CanCreateShadow; uint CanBeInShadow; - float blockSunIntensity; + float SunIntensity; + uint LightColor; + int LightX; + int LightY; + int LightZ; uint Indices[6]; }; -static const float3 kNormals[10] = { - float3(0.0f, 0.0f, 1.0f), // North - float3(0.0f, 0.0f, -1.0f), // South - float3(1.0f, 0.0f, 0.0f), // East - float3(-1.0f, 0.0f, 0.0f), // West - float3(0.0f, 1.0f, 0.0f), // Up - float3(0.0f, -1.0f, 0.0f), // Down - float3(0.0f, 1.0f, 0.0f), // Sprite north - float3(0.0f, 1.0f, 0.0f), // Sprite south - float3(0.0f, 1.0f, 0.0f), // Sprite east - float3(0.0f, 1.0f, 0.0f), // Sprite west +static const float3 kNormals[6] = { + float3(0.0f, 0.0f, 1.0f), // north + float3(0.0f, 0.0f, -1.0f), // south + float3(1.0f, 0.0f, 0.0f), // east + float3(-1.0f, 0.0f, 0.0f), // west + float3(0.0f, 1.0f, 0.0f), // up + float3(0.0f, -1.0f, 0.0f), // down }; static const float3 kCubePositions[8] = { - float3(-0.5f, -0.5f, -0.5f), // -X, -Y, -Z - float3(0.5f, -0.5f, -0.5f), // +X, -Y, -Z - float3(0.5f, 0.5f, -0.5f), // +X, +Y, -Z - float3(-0.5f, 0.5f, -0.5f), // -X, +Y, -Z - float3(-0.5f, -0.5f, 0.5f), // -X, -Y, +Z - float3(0.5f, -0.5f, 0.5f), // +X, -Y, +Z - float3(0.5f, 0.5f, 0.5f), // +X, +Y, +Z - float3(-0.5f, 0.5f, 0.5f), // -X, +Y, +Z + float3(-0.5f, -0.5f, -0.5f), // -x, -y, -z + float3(0.5f, -0.5f, -0.5f), // +x, -y, -z + float3(0.5f, 0.5f, -0.5f), // +x, +y, -z + float3(-0.5f, 0.5f, -0.5f), // -x, +y, -z + float3(-0.5f, -0.5f, 0.5f), // -x, -y, +z + float3(0.5f, -0.5f, 0.5f), // +x, -y, +z + float3(0.5f, 0.5f, 0.5f), // +x, +y, +z + float3(-0.5f, 0.5f, 0.5f), // -x, +y, +z }; static const float3 kCubeNormals[6] = { - float3(0.0f, 0.0f, -1.0f), // -Z - float3(0.0f, 0.0f, 1.0f), // +Z - float3(-1.0f, 0.0f, 0.0f), // -X - float3(1.0f, 0.0f, 0.0f), // +X - float3(0.0f, 1.0f, 0.0f), // +Y - float3(0.0f, -1.0f, 0.0f), // -Y + float3(0.0f, 0.0f, -1.0f), // -z + float3(0.0f, 0.0f, 1.0f), // +z + float3(-1.0f, 0.0f, 0.0f), // -x + float3(1.0f, 0.0f, 0.0f), // +x + float3(0.0f, 1.0f, 0.0f), // +y + float3(0.0f, -1.0f, 0.0f), // -y }; static const uint kCubeIndices[36] = { - 0, 1, 2, 0, 2, 3, // -Z - 5, 4, 7, 5, 7, 6, // +Z - 4, 0, 3, 4, 3, 7, // -X - 1, 5, 6, 1, 6, 2, // +X - 3, 2, 6, 3, 6, 7, // +Y - 4, 5, 1, 4, 1, 0, // -Y + 0, 1, 2, 0, 2, 3, // -z + 5, 4, 7, 5, 7, 6, // +z + 4, 0, 3, 4, 3, 7, // -x + 1, 5, 6, 1, 6, 2, // +x + 3, 2, 6, 3, 6, 7, // +y + 4, 5, 1, 4, 1, 0, // -y }; -float GetAmbientOcclusion(uint voxel) +static const float kAO[4] = {0.4f, 0.6f, 0.8f, 1.0f}; + +float GetOcclusion(uint voxel) { - static const float kAO[4] = {0.4f, 0.6f, 0.8f, 1.0f}; - return kAO[(voxel >> AO_OFFSET) & AO_MASK]; + return kAO[(voxel >> VOXEL_AO_OFFSET) & VOXEL_AO_MASK]; } uint GetDirection(uint voxel) { - return (voxel >> DIRECTION_OFFSET) & DIRECTION_MASK; + return (voxel >> VOXEL_DIRECTION_OFFSET) & VOXEL_DIRECTION_MASK; } uint GetBlockIndex(uint voxel) { - return (voxel >> BLOCK_OFFSET) & BLOCK_MASK; + return (voxel >> VOXEL_BLOCK_OFFSET) & VOXEL_BLOCK_MASK; } float3 GetPosition(uint voxel) { return float3( - (voxel >> X_OFFSET) & X_MASK, - (voxel >> Y_OFFSET) & Y_MASK, - (voxel >> Z_OFFSET) & Z_MASK); + (voxel >> VOXEL_X_OFFSET) & VOXEL_X_MASK, + (voxel >> VOXEL_Y_OFFSET) & VOXEL_Y_MASK, + (voxel >> VOXEL_Z_OFFSET) & VOXEL_Z_MASK); } uint GetAtlasIndex(uint voxel, Block block) { - uint direction = block.IsSprite ? 0 : GetDirection(voxel); - return block.Indices[direction]; + return block.Indices[GetDirection(voxel)]; } float2 GetTexcoord(uint voxel) { - return float2((voxel >> U_OFFSET) & U_MASK, (voxel >> V_OFFSET) & V_MASK); + return float2((voxel >> VOXEL_U_OFFSET) & VOXEL_U_MASK, (voxel >> VOXEL_V_OFFSET) & VOXEL_V_MASK); } -float3 GetNormal(uint voxel, Block block) +float3 GetNormal(uint voxel) { - uint direction = GetDirection(voxel); - direction += block.IsSprite ? 6 : 0; - return kNormals[direction]; + return kNormals[GetDirection(voxel)]; } float3 GetCubePosition(uint vertexID) @@ -119,11 +119,7 @@ struct Light int Z; }; -float3 GetPointLight( - StructuredBuffer lights, - uint lightCount, - float3 position, - float3 normal) +float3 GetPointLight(StructuredBuffer lights, uint lightCount, float3 position, float3 normal) { static const float3 kOffset = float3(0.0f, 0.25f, 0.0f); float3 accumulatedLight = float3(0.0f, 0.0f, 0.0f); @@ -155,7 +151,7 @@ float3 GetPointLight( return accumulatedLight; } -float GetSunLight( +float GetSunlight( Texture2D shadowTexture, SamplerComparisonState shadowSampler, float4x4 shadowTransform, @@ -169,12 +165,12 @@ float GetSunLight( { return 0.0f; } - float sunlight = block.blockSunIntensity * sunIntensity; + float sunlight = block.SunIntensity * sunIntensity; if (!block.CanBeInShadow) { return sunlight; } - float lightAngle = block.HasOcclusion ? saturate(-dot(normal, sunDirection)) : 0.707f; + float lightAngle = block.CanBeOccluded ? saturate(-dot(normal, sunDirection)) : 0.707f; if (lightAngle <= 0.0f) { return 0.0f; @@ -183,8 +179,7 @@ float GetSunLight( shadowPosition.xyz /= shadowPosition.w; float2 uv = shadowPosition.xy * 0.5f + 0.5f; uv.y = 1.0f - uv.y; - if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || - shadowPosition.z > 1.0f) + if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || shadowPosition.z > 1.0f) { return sunlight * lightAngle; } @@ -198,10 +193,8 @@ float GetSunLight( { for (int y = -1; y <= 1; y++) { - shadowVisibility += shadowTexture.SampleCmpLevelZero( - shadowSampler, - uv + float2(x, y) * texelSize, - shadowPosition.z - bias); + shadowVisibility += + shadowTexture.SampleCmpLevelZero(shadowSampler, uv + float2(x, y) * texelSize, shadowPosition.z - bias); } } shadowVisibility /= 9.0f; @@ -210,7 +203,7 @@ float GetSunLight( return sunlight * lightAngle * shadowVisibility; } -float GetFogAmount(float distance) +float GetFogValue(float distance) { return min(pow(distance / 250.0f, 2.5f), 1.0f); } diff --git a/shaders/shadow.vert b/shaders/shadow.vert index 7361178e..b72568de 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -35,6 +35,6 @@ Output main(Input input) float3 position = GetPosition(input.Voxel) + chunkPosition; Block block = blockBuffer[GetBlockIndex(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); - output.ClipDistance = block.HasShadow ? 1.0f : -1.0f; + output.ClipDistance = block.CanCreateShadow ? 1.0f : -1.0f; return output; } diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 63b3c1e8..5253200f 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -45,7 +45,7 @@ static const uint kWater = 16; float4 main(Input input) : SV_Target0 { Block block = blockBuffer[GetBlockIndex(input.Voxel)]; - float3 normal = GetNormal(input.Voxel, block); + float3 normal = GetNormal(input.Voxel); uint index = GetAtlasIndex(input.Voxel, block); float3 texcoord = float3(input.Texcoord, index); float4 texel = atlasTexture.Sample(atlasSampler, texcoord); @@ -54,17 +54,10 @@ float4 main(Input input) : SV_Target0 float4 position = input.WorldPosition; float3 pointLight = GetPointLight(lightBuffer, LightCount, position.xyz, normal); float3 ambient = Ambient.xyz; - float sunlight = GetSunLight( - shadowTexture, - shadowSampler, - ShadowTransform, - Sun.xyz, - Sun.w, - position.xyz, - normal, - block); + float sunlight = + GetSunlight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, position.xyz, normal, block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); - float fog = GetFogAmount(distance(position.xz, PlayerPosition.xz)); + float fog = GetFogValue(distance(position.xz, PlayerPosition.xz)); if (index == kWater) { float3 groundPosition = positionTexture.Sample(positionSampler, input.Fragment).xyz; diff --git a/src/block.c b/src/block.c index b58f780d..bf7c7381 100644 --- a/src/block.c +++ b/src/block.c @@ -2,235 +2,227 @@ #include "buffer.h" #include "direction.h" -#define TORCH_INTENSITY 15 - -typedef struct BlockGPU +typedef struct BlockData { + Uint32 is_opaque; + Uint32 is_solid; Uint32 is_sprite; - Uint32 has_occlusion; - Uint32 has_shadow; + Uint32 can_be_occluded; + Uint32 can_create_shadow; Uint32 can_be_in_shadow; - float block_sun_intensity; - Uint32 indices[DIRECTION_COUNT]; -} BlockGPU; - -struct -{ - bool is_opaque; - bool is_sprite; - bool is_solid; - bool has_occlusion; - bool has_shadow; - bool can_be_in_shadow; float sun_intensity; - int indices[6]; Light light; -} static const BLOCKS[BLOCK_COUNT] = { + Uint32 indices[DIRECTION_COUNT]; +} BlockData; + +static const BlockData BLOCKS[BLOCK_COUNT] = { [BLOCK_GRASS] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {2, 2, 2, 2, 1, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {2, 2, 2, 2, 1, 3}, + }, [BLOCK_DIRT] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {3, 3, 3, 3, 3, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {3, 3, 3, 3, 3, 3}, + }, [BLOCK_SAND] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {5, 5, 5, 5, 5, 5}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {5, 5, 5, 5, 5, 5}, + }, [BLOCK_SNOW] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {6, 6, 6, 6, 6, 6}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {6, 6, 6, 6, 6, 6}, + }, [BLOCK_STONE] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {4, 4, 4, 4, 4, 4}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {4, 4, 4, 4, 4, 4}, + }, [BLOCK_LOG] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {8, 8, 8, 8, 7, 7}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {8, 8, 8, 8, 7, 7}, + }, [BLOCK_LEAVES] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {10, 10, 10, 10, 10, 10}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {10, 10, 10, 10, 10, 10}, + }, [BLOCK_CLOUD] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .sun_intensity = 1.0f, - .indices = {9, 9, 9, 9, 9, 9}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .sun_intensity = 1.0f, + .indices = {9, 9, 9, 9, 9, 9}, + }, [BLOCK_BUSH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {15, 15, 15, 15, 15, 15}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {15, 15, 15, 15, 15, 15}, + }, [BLOCK_BLUEBELL] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {13, 13, 13, 13, 13, 13}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {13, 13, 13, 13, 13, 13}, + }, [BLOCK_GARDENIA] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {12, 12, 12, 12, 12, 12}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {12, 12, 12, 12, 12, 12}, + }, [BLOCK_ROSE] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {11, 11, 11, 11, 11, 11}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {11, 11, 11, 11, 11, 11}, + }, [BLOCK_LAVENDER] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {14, 14, 14, 14, 14, 14}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {14, 14, 14, 14, 14, 14}, + }, [BLOCK_WATER] = - { - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {16, 16, 16, 16, 16, 16}, - }, + { + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {16, 16, 16, 16, 16, 16}, + }, [BLOCK_RED_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {17, 17, 17, 17, 17, 17}, - .light = {236, 39, 63, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {17, 17, 17, 17, 17, 17}, + .light = {236, 39, 63, 15}, + }, [BLOCK_GREEN_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {18, 18, 18, 18, 18, 18}, - .light = {90, 181, 82, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {18, 18, 18, 18, 18, 18}, + .light = {90, 181, 82, 15}, + }, [BLOCK_BLUE_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {19, 19, 19, 19, 19, 19}, - .light = {51, 136, 222, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {19, 19, 19, 19, 19, 19}, + .light = {51, 136, 222, 15}, + }, [BLOCK_YELLOW_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {20, 20, 20, 20, 20, 20}, - .light = {243, 168, 51, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {20, 20, 20, 20, 20, 20}, + .light = {243, 168, 51, 15}, + }, [BLOCK_CYAN_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {21, 21, 21, 21, 21, 21}, - .light = {54, 197, 244, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {21, 21, 21, 21, 21, 21}, + .light = {54, 197, 244, 15}, + }, [BLOCK_MAGENTA_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {22, 22, 22, 22, 22, 22}, - .light = {250, 110, 121, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {22, 22, 22, 22, 22, 22}, + .light = {250, 110, 121, 15}, + }, [BLOCK_WHITE_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {23, 23, 23, 23, 23, 23}, - .light = {255, 255, 255, TORCH_INTENSITY}, - }, + { + .is_opaque = true, + .is_sprite = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {23, 23, 23, 23, 23, 23}, + .light = {255, 255, 255, 15}, + + }, [BLOCK_PLANKS] = - { - .is_opaque = true, - .is_solid = true, - .has_occlusion = true, - .has_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {24, 24, 24, 24, 24, 24}, - }, + { + .is_opaque = true, + .is_solid = true, + .can_be_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .indices = {24, 24, 24, 24, 24, 24}, + }, }; SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) { - SDL_COMPILE_TIME_ASSERT("", sizeof(BlockGPU) == sizeof(Uint32) * 11); + SDL_COMPILE_TIME_ASSERT("", sizeof(Light) == sizeof(Uint32) * 4); + SDL_COMPILE_TIME_ASSERT("", sizeof(BlockData) == sizeof(Uint32) * 17); CPUBuffer cpu_blocks; GPUBuffer gpu_blocks; - CPUBuffer_Init(&cpu_blocks, device, sizeof(BlockGPU)); + CPUBuffer_Init(&cpu_blocks, device, sizeof(BlockData)); GPUBuffer_Init(&gpu_blocks, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); if (!GPUBuffer_BeginUpload(&gpu_blocks)) { @@ -240,17 +232,7 @@ SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) } for (int block_index = 0; block_index < BLOCK_COUNT; block_index++) { - BlockGPU gpu_block = {0}; - gpu_block.is_sprite = BLOCKS[block_index].is_sprite; - gpu_block.has_occlusion = BLOCKS[block_index].has_occlusion; - gpu_block.has_shadow = BLOCKS[block_index].has_shadow; - gpu_block.can_be_in_shadow = BLOCKS[block_index].can_be_in_shadow; - gpu_block.block_sun_intensity = BLOCKS[block_index].sun_intensity; - for (Direction direction = 0; direction < DIRECTION_COUNT; direction++) - { - gpu_block.indices[direction] = BLOCKS[block_index].indices[direction]; - } - CPUBuffer_Append(&cpu_blocks, &gpu_block); + CPUBuffer_Append(&cpu_blocks, &BLOCKS[block_index]); } GPUBuffer_Upload(&gpu_blocks, &cpu_blocks); GPUBuffer_EndUpload(); @@ -269,24 +251,24 @@ bool Block_IsOpaque(Block block) return BLOCKS[block].is_opaque; } -bool Block_IsSprite(Block block) +bool Block_IsSolid(Block block) { - return BLOCKS[block].is_sprite; + return BLOCKS[block].is_solid; } -bool Block_IsSolid(Block block) +bool Block_IsSprite(Block block) { - return BLOCKS[block].is_solid; + return BLOCKS[block].is_sprite; } -bool Block_HasOcclusion(Block block) +bool Block_CanBeOccluded(Block block) { - return BLOCKS[block].has_occlusion; + return BLOCKS[block].can_be_occluded; } -bool Block_HasShadow(Block block) +bool Block_CanCreateShadow(Block block) { - return BLOCKS[block].has_shadow; + return BLOCKS[block].can_create_shadow; } bool Block_CanBeInShadow(Block block) diff --git a/src/block.h b/src/block.h index ec657638..223bc294 100644 --- a/src/block.h +++ b/src/block.h @@ -47,12 +47,11 @@ typedef struct Light } Light; SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device); - bool Block_IsOpaque(Block block); -bool Block_IsSprite(Block block); bool Block_IsSolid(Block block); -bool Block_HasOcclusion(Block block); -bool Block_HasShadow(Block block); +bool Block_IsSprite(Block block); +bool Block_CanBeOccluded(Block block); +bool Block_CanCreateShadow(Block block); bool Block_CanBeInShadow(Block block); int Block_GetIndex(Block block, Direction direction); bool Block_IsLight(Block block); diff --git a/src/camera.c b/src/camera.c index 06828f86..41d21e3f 100644 --- a/src/camera.c +++ b/src/camera.c @@ -5,24 +5,24 @@ #define DEGREES(rad) ((rad) * 180.0f / SDL_PI_F) #define RADIANS(deg) ((deg) * SDL_PI_F / 180.0f) -static void MultiplyMatrices(float output[4][4], float left[4][4], float right[4][4]) +static void MultiplyMatrices(float matrix[4][4], float lhs[4][4], float rhs[4][4]) { - float result[4][4] = {0}; - for (int row = 0; row < 4; row++) + float c[4][4] = {0}; + for (int i = 0; i < 4; i++) { - for (int column = 0; column < 4; column++) + for (int j = 0; j < 4; j++) { - result[row][column] += left[0][column] * right[row][0]; - result[row][column] += left[1][column] * right[row][1]; - result[row][column] += left[2][column] * right[row][2]; - result[row][column] += left[3][column] * right[row][3]; + c[i][j] += lhs[0][j] * rhs[i][0]; + c[i][j] += lhs[1][j] * rhs[i][1]; + c[i][j] += lhs[2][j] * rhs[i][2]; + c[i][j] += lhs[3][j] * rhs[i][3]; } } - for (int row = 0; row < 4; row++) + for (int i = 0; i < 4; i++) { - for (int column = 0; column < 4; column++) + for (int j = 0; j < 4; j++) { - output[row][column] = result[row][column]; + matrix[i][j] = c[i][j]; } } } @@ -45,14 +45,7 @@ static void Perspective(float matrix[4][4], float aspect, float fov, float near, matrix[3][3] = 0.0f; } -static void Ortho( - float matrix[4][4], - float left, - float right, - float bottom, - float top, - float near, - float far) +static void Ortho(float matrix[4][4], float left, float right, float bottom, float top, float near, float far) { matrix[0][0] = 2.0f / (right - left); matrix[0][1] = 0.0f; @@ -236,14 +229,7 @@ void Camera_GetVector(const Camera* camera, float* x, float* y, float* z) *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * cos_pitch; } -bool Camera_GetVisibility( - const Camera* camera, - float x, - float y, - float z, - float width, - float height, - float depth) +bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float width, float height, float depth) { float max_x = x + width; float max_y = y + height; diff --git a/src/camera.h b/src/camera.h index 0fc2e04a..98895e95 100644 --- a/src/camera.h +++ b/src/camera.h @@ -41,11 +41,4 @@ void Camera_Move(Camera* camera, float right, float up, float forward); void Camera_Resize(Camera* camera, int width, int height); void Camera_Rotate(Camera* camera, float pitch, float yaw); void Camera_GetVector(const Camera* camera, float* x, float* y, float* z); -bool Camera_GetVisibility( - const Camera* camera, - float x, - float y, - float z, - float width, - float height, - float depth); +bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float width, float height, float depth); diff --git a/src/main.c b/src/main.c index bafd4504..d7a79992 100644 --- a/src/main.c +++ b/src/main.c @@ -460,8 +460,7 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) #ifndef NDEBUG device = SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_MSL, true, NULL); #else - device = - SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_MSL, false, NULL); + device = SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_MSL, false, NULL); #endif if (!device) { @@ -473,11 +472,7 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to claim window: %s", SDL_GetError()); return SDL_APP_FAILURE; } - SDL_SetGPUSwapchainParameters( - device, - window, - SDL_GPU_SWAPCHAINCOMPOSITION_SDR, - SDL_GPU_PRESENTMODE_MAILBOX); + SDL_SetGPUSwapchainParameters(device, window, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_MAILBOX); color_format = SDL_GetGPUSwapchainTextureFormat(device, window); depth_format = SDL_GPU_TEXTUREFORMAT_D32_FLOAT; if (!CreateAtlas()) @@ -680,11 +675,7 @@ static void DrawOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) sampler_bindings[1].sampler = shadow_sampler; SDL_PushGPUDebugGroup(cbuf, "opaque"); SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); - SDL_PushGPUFragmentUniformData( - cbuf, - 1, - &sky.shadow_camera.matrix, - sizeof(sky.shadow_camera.matrix)); + SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, sizeof(sky.shadow_camera.matrix)); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); @@ -754,11 +745,7 @@ static void DrawTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) sampler_bindings[2].sampler = nearest_sampler; SDL_PushGPUDebugGroup(cbuf, "transparent"); SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); - SDL_PushGPUFragmentUniformData( - cbuf, - 1, - &sky.shadow_camera.matrix, - sizeof(sky.shadow_camera.matrix)); + SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, sizeof(sky.shadow_camera.matrix)); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); diff --git a/src/player.c b/src/player.c index 1af23990..ed8dae82 100644 --- a/src/player.c +++ b/src/player.c @@ -222,8 +222,8 @@ void Player_Move(Player* player, float dt) { float speed = keys[SDL_SCANCODE_LCTRL] ? FLY_FAST_SPEED : FLY_SPEED; float dx = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; - float dy = (keys[SDL_SCANCODE_E] || keys[SDL_SCANCODE_SPACE]) - - (keys[SDL_SCANCODE_Q] || keys[SDL_SCANCODE_LSHIFT]); + float dy = + (keys[SDL_SCANCODE_E] || keys[SDL_SCANCODE_SPACE]) - (keys[SDL_SCANCODE_Q] || keys[SDL_SCANCODE_LSHIFT]); float dz = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; Camera_Move(&player->camera, dx * speed * dt, dy * speed * dt, dz * speed * dt); } @@ -245,8 +245,7 @@ void Player_PlaceBlock(const Player* player) { float player_min = player->camera.position[axis] + PLAYER_AABB.min[axis] + PHYSICS_EPSILON; float player_max = player->camera.position[axis] + PLAYER_AABB.max[axis] - PHYSICS_EPSILON; - if (player_max <= player->query.previous[axis] || - player_min >= player->query.previous[axis] + 1.0f) + if (player_max <= player->query.previous[axis] || player_min >= player->query.previous[axis] + 1.0f) { World_SetBlock(player->query.previous, player->block); break; diff --git a/src/rand.c b/src/rand.c index 46da07d4..cb692b44 100644 --- a/src/rand.c +++ b/src/rand.c @@ -15,19 +15,15 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) bool is_lowland = false; bool has_grass = false; float terrain_height = - stb_perlin_fbm_noise3(world_x * 0.005f, 0.0f, world_z * 0.005f, 2.0f, 0.5f, 6) * - 50.0f; + stb_perlin_fbm_noise3(world_x * 0.005f, 0.0f, world_z * 0.005f, 2.0f, 0.5f, 6) * 50.0f; terrain_height = SDL_powf(SDL_max(terrain_height, 0.0f), 1.3f) + 30.0f; terrain_height = SDL_clamp(terrain_height, 0.0f, CHUNK_HEIGHT - 1.0f); if (terrain_height < 40.0f) { - terrain_height += - stb_perlin_fbm_noise3(-world_x * 0.01f, 0.0f, world_z * 0.01f, 2.0f, 0.5f, 6) * - 12.0f; + terrain_height += stb_perlin_fbm_noise3(-world_x * 0.01f, 0.0f, world_z * 0.01f, 2.0f, 0.5f, 6) * 12.0f; is_lowland = true; } - float biome = - stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 6); + float biome = stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 6); Block surface_block; Block fill_block; if (terrain_height + biome < 31.0f) @@ -69,11 +65,9 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) if (is_lowland && has_grass) { float plant_noise = - stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 3) * - 0.5f + - 0.5f; - bool can_grow_tree = local_x > 2 && local_x < CHUNK_WIDTH - 2 && local_z > 2 && - local_z < CHUNK_WIDTH - 2; + stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; + bool can_grow_tree = + local_x > 2 && local_x < CHUNK_WIDTH - 2 && local_z > 2 && local_z < CHUNK_WIDTH - 2; if (plant_noise > 0.8f && can_grow_tree) { int trunk_height = 3 + plant_noise * 2.0f; @@ -89,12 +83,7 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) { if (dx || dz || dy) { - callback( - userdata, - world_x + dx, - y + trunk_height + dy, - world_z + dz, - BLOCK_LEAVES); + callback(userdata, world_x + dx, y + trunk_height + dy, world_z + dz, BLOCK_LEAVES); } } } @@ -115,13 +104,7 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) { continue; } - float cloud_noise = stb_perlin_turbulence_noise3( - world_x * 0.015f, - 0.0f, - world_z * 0.015f, - 2.0f, - 0.5f, - 6); + float cloud_noise = stb_perlin_turbulence_noise3(world_x * 0.015f, 0.0f, world_z * 0.015f, 2.0f, 0.5f, 6); int cloud_half_height = -1; if (cloud_noise > 0.9f) { diff --git a/src/save.c b/src/save.c index bdca2ae0..6dc7710a 100644 --- a/src/save.c +++ b/src/save.c @@ -26,8 +26,7 @@ static const char* SET_PLAYER = "INSERT OR REPLACE INTO players (id, data) VALUE static const char* GET_PLAYER = "SELECT data FROM players WHERE id = 0;"; static const char* SET_SKY = "INSERT OR REPLACE INTO sky (id, time_of_day) VALUES (0, ?);"; static const char* GET_SKY = "SELECT time_of_day FROM sky WHERE id = 0;"; -static const char* SET_BLOCK = - "INSERT OR REPLACE INTO blocks (cx, cz, bx, by, bz, block) VALUES (?, ?, ?, ?, ?, ?);"; +static const char* SET_BLOCK = "INSERT OR REPLACE INTO blocks (cx, cz, bx, by, bz, block) VALUES (?, ?, ?, ?, ?, ?);"; static const char* GET_BLOCKS = "SELECT bx, by, bz, block FROM blocks WHERE cx = ? AND cz = ?;"; static sqlite3* handle; diff --git a/src/shader.c b/src/shader.c index 1f348978..848d77ad 100644 --- a/src/shader.c +++ b/src/shader.c @@ -32,13 +32,7 @@ SDL_GPUShader* Shader_Load(SDL_GPUDevice* device, const char* name) } char shader_path[512] = {0}; char shader_json_path[512] = {0}; - SDL_snprintf( - shader_path, - sizeof(shader_path), - "%s%s.%s", - SDL_GetBasePath(), - name, - file_extension); + SDL_snprintf(shader_path, sizeof(shader_path), "%s%s.%s", SDL_GetBasePath(), name, file_extension); SDL_snprintf(shader_json_path, sizeof(shader_json_path), "%s%s.json", SDL_GetBasePath(), name); size_t shader_size; size_t shader_json_size; diff --git a/src/sky.c b/src/sky.c index ff83b4c2..3dfe8a41 100644 --- a/src/sky.c +++ b/src/sky.c @@ -136,10 +136,8 @@ void Sky_UpdateShadow(Sky* sky, const Camera* camera, int resolution) shadow->z = camera->z; Camera_Update(shadow); float texel_size = SHADOW_ORTHO * 2.0f / resolution; - float light_x = shadow->view[0][0] * shadow->x + shadow->view[1][0] * shadow->y + - shadow->view[2][0] * shadow->z; - float light_y = shadow->view[0][1] * shadow->x + shadow->view[1][1] * shadow->y + - shadow->view[2][1] * shadow->z; + float light_x = shadow->view[0][0] * shadow->x + shadow->view[1][0] * shadow->y + shadow->view[2][0] * shadow->z; + float light_y = shadow->view[0][1] * shadow->x + shadow->view[1][1] * shadow->y + shadow->view[2][1] * shadow->z; float delta_x = SDL_roundf(light_x / texel_size) * texel_size - light_x; float delta_y = SDL_roundf(light_y / texel_size) * texel_size - light_y; shadow->x += shadow->view[0][0] * delta_x + shadow->view[0][1] * delta_y; diff --git a/src/voxel.c b/src/voxel.c index 37f610e2..990f14ad 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -33,32 +33,32 @@ static Voxel Pack( Direction direction, int ambient_occlusion) { - SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", X_OFFSET + X_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", Y_OFFSET + Y_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", Z_OFFSET + Z_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", U_OFFSET + U_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", V_OFFSET + V_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", DIRECTION_OFFSET + DIRECTION_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", BLOCK_OFFSET + BLOCK_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_AO_OFFSET + VOXEL_AO_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_X_OFFSET + VOXEL_X_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_Y_OFFSET + VOXEL_Y_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_Z_OFFSET + VOXEL_Z_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_U_OFFSET + VOXEL_U_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_V_OFFSET + VOXEL_V_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_DIRECTION_OFFSET + VOXEL_DIRECTION_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", VOXEL_BLOCK_OFFSET + VOXEL_BLOCK_BITS <= 32); SDL_assert(direction < DIRECTION_COUNT); - SDL_assert(block <= BLOCK_MASK); - SDL_assert(x <= X_MASK); - SDL_assert(y <= Y_MASK); - SDL_assert(z <= Z_MASK); - SDL_assert(texture_u <= U_MASK); - SDL_assert(texture_v <= V_MASK); - SDL_assert(direction <= DIRECTION_MASK); - SDL_assert(ambient_occlusion <= AO_MASK); + SDL_assert(block <= VOXEL_BLOCK_MASK); + SDL_assert(x <= VOXEL_X_MASK); + SDL_assert(y <= VOXEL_Y_MASK); + SDL_assert(z <= VOXEL_Z_MASK); + SDL_assert(texture_u <= VOXEL_U_MASK); + SDL_assert(texture_v <= VOXEL_V_MASK); + SDL_assert(direction <= VOXEL_DIRECTION_MASK); + SDL_assert(ambient_occlusion <= VOXEL_AO_MASK); Voxel voxel = 0; - voxel |= direction << DIRECTION_OFFSET; - voxel |= block << BLOCK_OFFSET; - voxel |= ambient_occlusion << AO_OFFSET; - voxel |= x << X_OFFSET; - voxel |= y << Y_OFFSET; - voxel |= z << Z_OFFSET; - voxel |= texture_u << U_OFFSET; - voxel |= texture_v << V_OFFSET; + voxel |= direction << VOXEL_DIRECTION_OFFSET; + voxel |= block << VOXEL_BLOCK_OFFSET; + voxel |= ambient_occlusion << VOXEL_AO_OFFSET; + voxel |= x << VOXEL_X_OFFSET; + voxel |= y << VOXEL_Y_OFFSET; + voxel |= z << VOXEL_Z_OFFSET; + voxel |= texture_u << VOXEL_U_OFFSET; + voxel |= texture_v << VOXEL_V_OFFSET; return voxel; } @@ -83,18 +83,11 @@ Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, in z + offset[2], texcoord[0], texcoord[1], - direction, - AO_MASK); + DIRECTION_UP, + VOXEL_AO_MASK); } -Voxel Voxel_PackCube( - Block block, - int x, - int y, - int z, - Direction direction, - int vertex, - int ambient_occlusion) +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int vertex, int ambient_occlusion) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); diff --git a/src/voxel.h b/src/voxel.h index d382a9de..0f49e421 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -8,12 +8,5 @@ typedef Uint32 Voxel; Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int vertex); -Voxel Voxel_PackCube( - Block block, - int x, - int y, - int z, - Direction direction, - int vertex, - int ambient_occlusion); +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int vertex, int ambient_occlusion); void Voxel_GetCubePosition(Direction direction, int vertex, int position[3]); diff --git a/src/voxel.inc b/src/voxel.inc index 14da387e..5d47a77d 100644 --- a/src/voxel.inc +++ b/src/voxel.inc @@ -1,29 +1,29 @@ #ifndef VOXEL_INC #define VOXEL_INC -#define AO_BITS 2 -#define DIRECTION_BITS 3 -#define BLOCK_BITS 5 -#define X_BITS 5 -#define Y_BITS 8 -#define Z_BITS 5 -#define U_BITS 1 -#define V_BITS 1 -#define DIRECTION_OFFSET (0) -#define BLOCK_OFFSET (DIRECTION_OFFSET + DIRECTION_BITS) -#define AO_OFFSET (BLOCK_OFFSET + BLOCK_BITS) -#define X_OFFSET (AO_OFFSET + AO_BITS) -#define Y_OFFSET (X_OFFSET + X_BITS) -#define Z_OFFSET (Y_OFFSET + Y_BITS) -#define U_OFFSET (Z_OFFSET + Z_BITS) -#define V_OFFSET (U_OFFSET + U_BITS) -#define AO_MASK ((1 << AO_BITS) - 1) -#define DIRECTION_MASK ((1 << DIRECTION_BITS) - 1) -#define BLOCK_MASK ((1 << BLOCK_BITS) - 1) -#define X_MASK ((1 << X_BITS) - 1) -#define Y_MASK ((1 << Y_BITS) - 1) -#define Z_MASK ((1 << Z_BITS) - 1) -#define U_MASK ((1 << U_BITS) - 1) -#define V_MASK ((1 << V_BITS) - 1) +#define VOXEL_AO_BITS 2 +#define VOXEL_DIRECTION_BITS 3 +#define VOXEL_BLOCK_BITS 5 +#define VOXEL_X_BITS 5 +#define VOXEL_Y_BITS 8 +#define VOXEL_Z_BITS 5 +#define VOXEL_U_BITS 1 +#define VOXEL_V_BITS 1 +#define VOXEL_DIRECTION_OFFSET (0) +#define VOXEL_BLOCK_OFFSET (VOXEL_DIRECTION_OFFSET + VOXEL_DIRECTION_BITS) +#define VOXEL_AO_OFFSET (VOXEL_BLOCK_OFFSET + VOXEL_BLOCK_BITS) +#define VOXEL_X_OFFSET (VOXEL_AO_OFFSET + VOXEL_AO_BITS) +#define VOXEL_Y_OFFSET (VOXEL_X_OFFSET + VOXEL_X_BITS) +#define VOXEL_Z_OFFSET (VOXEL_Y_OFFSET + VOXEL_Y_BITS) +#define VOXEL_U_OFFSET (VOXEL_Z_OFFSET + VOXEL_Z_BITS) +#define VOXEL_V_OFFSET (VOXEL_U_OFFSET + VOXEL_U_BITS) +#define VOXEL_AO_MASK ((1 << VOXEL_AO_BITS) - 1) +#define VOXEL_DIRECTION_MASK ((1 << VOXEL_DIRECTION_BITS) - 1) +#define VOXEL_BLOCK_MASK ((1 << VOXEL_BLOCK_BITS) - 1) +#define VOXEL_X_MASK ((1 << VOXEL_X_BITS) - 1) +#define VOXEL_Y_MASK ((1 << VOXEL_Y_BITS) - 1) +#define VOXEL_Z_MASK ((1 << VOXEL_Z_BITS) - 1) +#define VOXEL_U_MASK ((1 << VOXEL_U_BITS) - 1) +#define VOXEL_V_MASK ((1 << VOXEL_V_BITS) - 1) #endif diff --git a/src/world.c b/src/world.c index d932f3f1..1c3b5a61 100644 --- a/src/world.c +++ b/src/world.c @@ -227,14 +227,7 @@ static Block GetChunkBlock(Chunk* chunk, int bx, int by, int bz) return chunk->blocks[bx][by][bz]; } -static Block GetNeighborhoodBlock( - Chunk* chunks[3][3], - int bx, - int by, - int bz, - int dx, - int dy, - int dz) +static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, int dx, int dy, int dz) { SDL_assert(dx >= -1 && dx <= 1); SDL_assert(dy >= -1 && dy <= 1); @@ -344,14 +337,8 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio { int position[3]; Voxel_GetCubePosition(direction, vertex, position); - int first_side[3] = { - DIRECTIONS[direction][0], - DIRECTIONS[direction][1], - DIRECTIONS[direction][2]}; - int second_side[3] = { - DIRECTIONS[direction][0], - DIRECTIONS[direction][1], - DIRECTIONS[direction][2]}; + int first_side[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; + int second_side[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int corner[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int side_count = 0; for (int axis = 0; axis < 3; axis++) @@ -372,12 +359,11 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio corner[axis] = offset; } SDL_assert(side_count == 2); - bool has_first_side = Block_HasOcclusion( - GetNeighborhoodBlock(chunks, bx, by, bz, first_side[0], first_side[1], first_side[2])); - bool has_second_side = Block_HasOcclusion( - GetNeighborhoodBlock(chunks, bx, by, bz, second_side[0], second_side[1], second_side[2])); - bool has_corner = Block_HasOcclusion( - GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); + bool has_first_side = + Block_CanBeOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, first_side[0], first_side[1], first_side[2])); + bool has_second_side = + Block_CanBeOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, second_side[0], second_side[1], second_side[2])); + bool has_corner = Block_CanBeOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); if (has_first_side && has_second_side) { return 0; @@ -430,8 +416,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ } continue; } - MeshType mesh_type = - Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; + MeshType mesh_type = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; for (Direction direction = 0; direction < DIRECTION_COUNT; direction++) { int dx = DIRECTIONS[direction][0]; @@ -448,8 +433,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ { ambient_occlusion[vertex] = GetAO(chunks, bx, by, bz, direction, vertex); } - if (ambient_occlusion[0] + ambient_occlusion[3] > - ambient_occlusion[1] + ambient_occlusion[2]) + if (ambient_occlusion[0] + ambient_occlusion[3] > ambient_occlusion[1] + ambient_occlusion[2]) { vertex_order[0] = 1; vertex_order[1] = 3; @@ -459,14 +443,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ for (int vertex_index = 0; vertex_index < 4; vertex_index++) { int vertex = vertex_order[vertex_index]; - Voxel voxel = Voxel_PackCube( - block, - bx, - by, - bz, - direction, - vertex, - ambient_occlusion[vertex]); + Voxel voxel = Voxel_PackCube(block, bx, by, bz, direction, vertex, ambient_occlusion[vertex]); CPUBuffer_Append(&voxels[mesh_type], &voxel); } } @@ -667,10 +644,8 @@ static int SortFunction(void* userdata, const void* lhs, const void* rhs) int center = WORLD_WIDTH / 2; const int* left = lhs; const int* right = rhs; - int left_distance = - (left[0] - center) * (left[0] - center) + (left[1] - center) * (left[1] - center); - int right_distance = - (right[0] - center) * (right[0] - center) + (right[1] - center) * (right[1] - center); + int left_distance = (left[0] - center) * (left[0] - center) + (left[1] - center) * (left[1] - center); + int right_distance = (right[0] - center) * (right[0] - center) + (right[1] - center) * (right[1] - center); if (left_distance < right_distance) { return -1; @@ -843,8 +818,7 @@ static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) { for (int neighbor_z = 0; neighbor_z < 3; neighbor_z++) { - if (SDL_GetAtomicInt(&neighborhood[neighbor_x][neighbor_z]->block_state) != - JOB_STATE_COMPLETED) + if (SDL_GetAtomicInt(&neighborhood[neighbor_x][neighbor_z]->block_state) != JOB_STATE_COMPLETED) { return false; } @@ -900,11 +874,7 @@ void World_Update(const Camera* camera) } } -static void Render( - Chunk* chunk, - SDL_GPUCommandBuffer* command_buffer, - SDL_GPURenderPass* render_pass, - WorldFlags flags) +static void Render(Chunk* chunk, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass, WorldFlags flags) { MeshType mesh = flags & WORLD_FLAGS_OPAQUE ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; GPUBuffer* gpu_voxels = &chunk->gpu_voxels[mesh]; @@ -963,14 +933,7 @@ void World_Render( { continue; } - if (!Camera_GetVisibility( - camera, - chunk->x, - 0.0f, - chunk->z, - CHUNK_WIDTH, - CHUNK_HEIGHT, - CHUNK_WIDTH)) + if (!Camera_GetVisibility(camera, chunk->x, 0.0f, chunk->z, CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_WIDTH)) { continue; } @@ -1054,9 +1017,7 @@ void World_SetBlock(const int position[3], Block block) { for (int neighbor_z = 0; neighbor_z < 3; neighbor_z++) { - SDL_SetAtomicInt( - &neighborhood[neighbor_x][neighbor_z]->light_state, - JOB_STATE_REQUESTED); + SDL_SetAtomicInt(&neighborhood[neighbor_x][neighbor_z]->light_state, JOB_STATE_REQUESTED); } } } @@ -1085,14 +1046,12 @@ WorldQuery World_Raycast(const Camera* camera, float max_distance) if (direction[axis] < 0.0f) { steps[axis] = -1; - next_distances[axis] = - (camera->position[axis] - query.current[axis]) * step_distances[axis]; + next_distances[axis] = (camera->position[axis] - query.current[axis]) * step_distances[axis]; } else { steps[axis] = 1; - next_distances[axis] = - (query.current[axis] + 1.0f - camera->position[axis]) * step_distances[axis]; + next_distances[axis] = (query.current[axis] + 1.0f - camera->position[axis]) * step_distances[axis]; } } float distance = 0.0f; From c7e5c7299b46709dbf727d643b98e5a22fca931d Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 17:10:10 -0400 Subject: [PATCH 25/39] refactor --- shaders/bin/opaque.frag.msl | 4 +- shaders/bin/opaque.frag.spv | Bin 9960 -> 9956 bytes shaders/bin/shadow.vert.msl | 2 +- shaders/bin/shadow.vert.spv | Bin 2948 -> 2944 bytes shaders/bin/transparent.frag.msl | 4 +- shaders/bin/transparent.frag.spv | Bin 10260 -> 10256 bytes shaders/shader.hlsl | 4 +- src/block.c | 449 ++++++++++++++++++------------- src/block.h | 2 +- src/buffer.c | 7 +- src/buffer.h | 2 +- src/world.c | 6 +- 12 files changed, 281 insertions(+), 199 deletions(-) diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 1c4f79f0..f95278e6 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -49,7 +49,7 @@ struct Block uint IsOpaque; uint IsSolid; uint IsSprite; - uint CanBeOccluded; + uint IsOccluded; uint CanCreateShadow; uint CanBeInShadow; float SunIntensity; @@ -165,7 +165,7 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& break; } float _237; - if (blockBuffer._m0[_126].CanBeOccluded != 0u) + if (blockBuffer._m0[_126].IsOccluded != 0u) { _237 = fast::clamp(-dot(_108[_133], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index af3a7be4707e9fd8681198320ec0b87348a32109..0f1dd7a680b56969118e7a87f342cdba740099ea 100644 GIT binary patch delta 33 ncmaFi`^0y{F-8$K1|bFp24*1kEcQ=M&M8evP1$^pkxLZ-sjmsG delta 37 rcmaFj`@(m_F-8e?1|bFp24*03PRw&k^-oUDDNRXDVc2|&kxLZ-&=v}- diff --git a/shaders/bin/shadow.vert.msl b/shaders/bin/shadow.vert.msl index 273c8a33..41575c66 100644 --- a/shaders/bin/shadow.vert.msl +++ b/shaders/bin/shadow.vert.msl @@ -8,7 +8,7 @@ struct Block uint IsOpaque; uint IsSolid; uint IsSprite; - uint CanBeOccluded; + uint IsOccluded; uint CanCreateShadow; uint CanBeInShadow; float SunIntensity; diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index 1de1bc8aed2ef13c0b78f841dd1571eef6b0464e..3c7028711c0e6681387c5e211c453d73673d6ebc 100644 GIT binary patch delta 31 lcmZn>ZxEkwO@xhsje&uI8HhcL{gab(N>fr(Holw21ps#G2-*Mu delta 35 pcmZn=ZxNqxO@f_)je&uI8Hk+|^PE!slaq5wQ&LkHHolt11pt>03D^Jt diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index 365bcafb..5ba0e255 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -49,7 +49,7 @@ struct Block uint IsOpaque; uint IsSolid; uint IsSprite; - uint CanBeOccluded; + uint IsOccluded; uint CanCreateShadow; uint CanBeInShadow; float SunIntensity; @@ -161,7 +161,7 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& break; } float _236; - if (blockBuffer._m0[_128].CanBeOccluded != 0u) + if (blockBuffer._m0[_128].IsOccluded != 0u) { _236 = fast::clamp(-dot(_108[_135], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 5d21efd3185423ec96643dceb6effe957937154f..54e790b75f6abf4acfa488a544656e30afce147a 100644 GIT binary patch delta 33 ncmbOdFd<;WCq@xA24MyU24*1kEcQ=M&M8evP1(%F#H9uRmjnoA delta 37 rcmbObFePBaCq@Z&24MyU24*03PRw&k^-oUDDNRXDVc5*Z#H9uRyO#-M diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index fc01358b..4efeda5f 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -12,7 +12,7 @@ struct Block uint IsOpaque; uint IsSolid; uint IsSprite; - uint CanBeOccluded; + uint IsOccluded; uint CanCreateShadow; uint CanBeInShadow; float SunIntensity; @@ -170,7 +170,7 @@ float GetSunlight( { return sunlight; } - float lightAngle = block.CanBeOccluded ? saturate(-dot(normal, sunDirection)) : 0.707f; + float lightAngle = block.IsOccluded ? saturate(-dot(normal, sunDirection)) : 0.707f; if (lightAngle <= 0.0f) { return 0.0f; diff --git a/src/block.c b/src/block.c index bf7c7381..9c32592e 100644 --- a/src/block.c +++ b/src/block.c @@ -7,7 +7,7 @@ typedef struct BlockData Uint32 is_opaque; Uint32 is_solid; Uint32 is_sprite; - Uint32 can_be_occluded; + Uint32 is_occluded; Uint32 can_create_shadow; Uint32 can_be_in_shadow; float sun_intensity; @@ -16,204 +16,282 @@ typedef struct BlockData } BlockData; static const BlockData BLOCKS[BLOCK_COUNT] = { + [BLOCK_EMPTY] = + { + .is_opaque = false, + .is_solid = false, + .is_sprite = false, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = false, + .sun_intensity = 0.0f, + .light = {0}, + .indices = {0}, + }, [BLOCK_GRASS] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {2, 2, 2, 2, 1, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {2, 2, 2, 2, 1, 3}, + }, [BLOCK_DIRT] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {3, 3, 3, 3, 3, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {3, 3, 3, 3, 3, 3}, + }, [BLOCK_SAND] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {5, 5, 5, 5, 5, 5}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {5, 5, 5, 5, 5, 5}, + }, [BLOCK_SNOW] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {6, 6, 6, 6, 6, 6}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {6, 6, 6, 6, 6, 6}, + }, [BLOCK_STONE] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {4, 4, 4, 4, 4, 4}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {4, 4, 4, 4, 4, 4}, + }, [BLOCK_LOG] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {8, 8, 8, 8, 7, 7}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {8, 8, 8, 8, 7, 7}, + }, [BLOCK_LEAVES] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {10, 10, 10, 10, 10, 10}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {10, 10, 10, 10, 10, 10}, + }, [BLOCK_CLOUD] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .sun_intensity = 1.0f, - .indices = {9, 9, 9, 9, 9, 9}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = false, + .can_be_in_shadow = false, + .sun_intensity = 1.0f, + .light = {0}, + .indices = {9, 9, 9, 9, 9, 9}, + }, [BLOCK_BUSH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {15, 15, 15, 15, 15, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {15, 15, 15, 15, 15, 15}, + }, [BLOCK_BLUEBELL] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {13, 13, 13, 13, 13, 13}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {13, 13, 13, 13, 13, 13}, + }, [BLOCK_GARDENIA] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {12, 12, 12, 12, 12, 12}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {12, 12, 12, 12, 12, 12}, + }, [BLOCK_ROSE] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {11, 11, 11, 11, 11, 11}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {11, 11, 11, 11, 11, 11}, + }, [BLOCK_LAVENDER] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {14, 14, 14, 14, 14, 14}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {14, 14, 14, 14, 14, 14}, + }, [BLOCK_WATER] = - { - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {16, 16, 16, 16, 16, 16}, - }, + { + .is_opaque = false, + .is_solid = false, + .is_sprite = false, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {16, 16, 16, 16, 16, 16}, + }, [BLOCK_RED_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {17, 17, 17, 17, 17, 17}, - .light = {236, 39, 63, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {236, 39, 63, 15}, + .indices = {17, 17, 17, 17, 17, 17}, + }, [BLOCK_GREEN_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {18, 18, 18, 18, 18, 18}, - .light = {90, 181, 82, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {90, 181, 82, 15}, + .indices = {18, 18, 18, 18, 18, 18}, + }, [BLOCK_BLUE_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {19, 19, 19, 19, 19, 19}, - .light = {51, 136, 222, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {51, 136, 222, 15}, + .indices = {19, 19, 19, 19, 19, 19}, + }, [BLOCK_YELLOW_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {20, 20, 20, 20, 20, 20}, - .light = {243, 168, 51, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {243, 168, 51, 15}, + .indices = {20, 20, 20, 20, 20, 20}, + }, [BLOCK_CYAN_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {21, 21, 21, 21, 21, 21}, - .light = {54, 197, 244, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {54, 197, 244, 15}, + .indices = {21, 21, 21, 21, 21, 21}, + }, [BLOCK_MAGENTA_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {22, 22, 22, 22, 22, 22}, - .light = {250, 110, 121, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {250, 110, 121, 15}, + .indices = {22, 22, 22, 22, 22, 22}, + }, [BLOCK_WHITE_TORCH] = - { - .is_opaque = true, - .is_sprite = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {23, 23, 23, 23, 23, 23}, - .light = {255, 255, 255, 15}, - - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {255, 255, 255, 15}, + .indices = {23, 23, 23, 23, 23, 23}, + }, [BLOCK_PLANKS] = - { - .is_opaque = true, - .is_solid = true, - .can_be_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .indices = {24, 24, 24, 24, 24, 24}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {24, 24, 24, 24, 24, 24}, + }, }; SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) @@ -234,13 +312,16 @@ SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) { CPUBuffer_Append(&cpu_blocks, &BLOCKS[block_index]); } - GPUBuffer_Upload(&gpu_blocks, &cpu_blocks); - GPUBuffer_EndUpload(); - SDL_GPUBuffer* buffer = gpu_blocks.size == BLOCK_COUNT ? gpu_blocks.buffer : NULL; - if (buffer) + if (!GPUBuffer_Upload(&gpu_blocks, &cpu_blocks)) { - gpu_blocks.buffer = NULL; + GPUBuffer_EndUpload(); + CPUBuffer_Free(&cpu_blocks); + GPUBuffer_Free(&gpu_blocks); + return NULL; } + GPUBuffer_EndUpload(); + SDL_GPUBuffer* buffer = gpu_blocks.buffer; + gpu_blocks.buffer = NULL; CPUBuffer_Free(&cpu_blocks); GPUBuffer_Free(&gpu_blocks); return buffer; @@ -261,9 +342,9 @@ bool Block_IsSprite(Block block) return BLOCKS[block].is_sprite; } -bool Block_CanBeOccluded(Block block) +bool Block_IsOccluded(Block block) { - return BLOCKS[block].can_be_occluded; + return BLOCKS[block].is_occluded; } bool Block_CanCreateShadow(Block block) diff --git a/src/block.h b/src/block.h index 223bc294..55669381 100644 --- a/src/block.h +++ b/src/block.h @@ -50,7 +50,7 @@ SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device); bool Block_IsOpaque(Block block); bool Block_IsSolid(Block block); bool Block_IsSprite(Block block); -bool Block_CanBeOccluded(Block block); +bool Block_IsOccluded(Block block); bool Block_CanCreateShadow(Block block); bool Block_CanBeInShadow(Block block); int Block_GetIndex(Block block, Direction direction); diff --git a/src/buffer.c b/src/buffer.c index 5ccfd080..15cfe451 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -92,7 +92,7 @@ void GPUBuffer_Free(GPUBuffer* buffer) buffer->size = 0; } -void GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) +bool GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) { SDL_assert(upload_command_buffer); SDL_assert(upload_pass); @@ -104,7 +104,7 @@ void GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) } if (!source->size) { - return; + return true; } Uint32 size = source->size; source->size = 0; @@ -120,7 +120,7 @@ void GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) if (!destination->buffer) { SDL_Log("Failed to create buffer: %s", SDL_GetError()); - return; + return false; } destination->capacity = source->capacity; } @@ -131,6 +131,7 @@ void GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) region.size = size * source->stride; SDL_UploadToGPUBuffer(upload_pass, &location, ®ion, true); destination->size = size; + return true; } void GPUBuffer_Clear(GPUBuffer* buffer) diff --git a/src/buffer.h b/src/buffer.h index 129a89bb..5534ca08 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -27,7 +27,7 @@ typedef struct GPUBuffer void GPUBuffer_Init(GPUBuffer* buffer, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage); void GPUBuffer_Free(GPUBuffer* buffer); -void GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source); +bool GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source); void GPUBuffer_Clear(GPUBuffer* buffer); bool GPUBuffer_BeginUpload(GPUBuffer* buffer); void GPUBuffer_EndUpload(); diff --git a/src/world.c b/src/world.c index 1c3b5a61..fab411ef 100644 --- a/src/world.c +++ b/src/world.c @@ -360,10 +360,10 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio } SDL_assert(side_count == 2); bool has_first_side = - Block_CanBeOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, first_side[0], first_side[1], first_side[2])); + Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, first_side[0], first_side[1], first_side[2])); bool has_second_side = - Block_CanBeOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, second_side[0], second_side[1], second_side[2])); - bool has_corner = Block_CanBeOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); + Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, second_side[0], second_side[1], second_side[2])); + bool has_corner = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); if (has_first_side && has_second_side) { return 0; From a071a335ea84a40e345776fa3b95b1d6c72d8854 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 17:19:16 -0400 Subject: [PATCH 26/39] refactor --- src/camera.c | 92 ++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/camera.c b/src/camera.c index 41d21e3f..ca669f7f 100644 --- a/src/camera.c +++ b/src/camera.c @@ -5,7 +5,7 @@ #define DEGREES(rad) ((rad) * 180.0f / SDL_PI_F) #define RADIANS(deg) ((deg) * SDL_PI_F / 180.0f) -static void MultiplyMatrices(float matrix[4][4], float lhs[4][4], float rhs[4][4]) +static void Multiply(float matrix[4][4], float lhs[4][4], float rhs[4][4]) { float c[4][4] = {0}; for (int i = 0; i < 4; i++) @@ -85,7 +85,7 @@ static void Translate(float matrix[4][4], float x, float y, float z) matrix[3][3] = 1.0f; } -static void CalculateFrustum(float planes[6][4], float matrix[4][4]) +static void Frustum(float planes[6][4], float matrix[4][4]) { planes[0][0] = matrix[0][3] + matrix[0][0]; planes[0][1] = matrix[1][3] + matrix[1][0]; @@ -111,40 +111,40 @@ static void CalculateFrustum(float planes[6][4], float matrix[4][4]) planes[5][1] = matrix[1][3] - matrix[1][2]; planes[5][2] = matrix[2][3] - matrix[2][2]; planes[5][3] = matrix[3][3] - matrix[3][2]; - for (int plane_index = 0; plane_index < 6; ++plane_index) + for (int i = 0; i < 6; i++) { float length = 0.0f; - length += planes[plane_index][0] * planes[plane_index][0]; - length += planes[plane_index][1] * planes[plane_index][1]; - length += planes[plane_index][2] * planes[plane_index][2]; + length += planes[i][0] * planes[i][0]; + length += planes[i][1] * planes[i][1]; + length += planes[i][2] * planes[i][2]; length = SDL_sqrtf(length); if (length < SDL_FLT_EPSILON) { continue; } - planes[plane_index][0] /= length; - planes[plane_index][1] /= length; - planes[plane_index][2] /= length; - planes[plane_index][3] /= length; + planes[i][0] /= length; + planes[i][1] /= length; + planes[i][2] /= length; + planes[i][3] /= length; } } -static void Rotate(float matrix[4][4], float axis_x, float axis_y, float axis_z, float angle) +static void Rotate(float matrix[4][4], float x, float y, float z, float angle) { - float sine = SDL_sinf(angle); - float cosine = SDL_cosf(angle); - float inverse_cosine = 1.0f - cosine; - matrix[0][0] = inverse_cosine * axis_x * axis_x + cosine; - matrix[0][1] = inverse_cosine * axis_x * axis_y - axis_z * sine; - matrix[0][2] = inverse_cosine * axis_z * axis_x + axis_y * sine; + float s = SDL_sinf(angle); + float c = SDL_cosf(angle); + float i = 1.0f - c; + matrix[0][0] = i * x * x + c; + matrix[0][1] = i * x * y - z * s; + matrix[0][2] = i * z * x + y * s; matrix[0][3] = 0.0f; - matrix[1][0] = inverse_cosine * axis_x * axis_y + axis_z * sine; - matrix[1][1] = inverse_cosine * axis_y * axis_y + cosine; - matrix[1][2] = inverse_cosine * axis_y * axis_z - axis_x * sine; + matrix[1][0] = i * x * y + z * s; + matrix[1][1] = i * y * y + c; + matrix[1][2] = i * y * z - x * s; matrix[1][3] = 0.0f; - matrix[2][0] = inverse_cosine * axis_z * axis_x - axis_y * sine; - matrix[2][1] = inverse_cosine * axis_y * axis_z + axis_x * sine; - matrix[2][2] = inverse_cosine * axis_z * axis_z + cosine; + matrix[2][0] = i * z * x - y * s; + matrix[2][1] = i * y * z + x * s; + matrix[2][2] = i * z * z + c; matrix[2][3] = 0.0f; matrix[3][0] = 0.0f; matrix[3][1] = 0.0f; @@ -170,14 +170,14 @@ void Camera_Init(Camera* camera, CameraType type) void Camera_Update(Camera* camera) { - float sin_yaw = SDL_sinf(camera->yaw); - float cos_yaw = SDL_cosf(camera->yaw); + float sy = SDL_sinf(camera->yaw); + float cy = SDL_cosf(camera->yaw); float rotation[4][4]; Translate(camera->view, -camera->x, -camera->y, -camera->z); - Rotate(rotation, cos_yaw, 0.0f, sin_yaw, camera->pitch); - MultiplyMatrices(camera->view, rotation, camera->view); + Rotate(rotation, cy, 0.0f, sy, camera->pitch); + Multiply(camera->view, rotation, camera->view); Rotate(rotation, 0.0f, 1.0f, 0.0f, -camera->yaw); - MultiplyMatrices(camera->view, rotation, camera->view); + Multiply(camera->view, rotation, camera->view); float aspect = (float)camera->width / camera->height; if (camera->type == CAMERA_TYPE_PERSPECTIVE) { @@ -189,19 +189,19 @@ void Camera_Update(Camera* camera) float oy = camera->ortho; Ortho(camera->proj, -ox, ox, -oy, oy, -camera->far, camera->far); } - MultiplyMatrices(camera->matrix, camera->proj, camera->view); - CalculateFrustum(camera->planes, camera->matrix); + Multiply(camera->matrix, camera->proj, camera->view); + Frustum(camera->planes, camera->matrix); } void Camera_Move(Camera* camera, float right, float up, float forward) { - float sin_yaw = SDL_sinf(camera->yaw); - float cos_yaw = SDL_cosf(camera->yaw); - float sin_pitch = SDL_sinf(camera->pitch); - float cos_pitch = SDL_cosf(camera->pitch); - camera->x += cos_pitch * sin_yaw * forward + cos_yaw * right; - camera->y += up + forward * sin_pitch; - camera->z -= cos_pitch * cos_yaw * forward - sin_yaw * right; + float sy = SDL_sinf(camera->yaw); + float cy = SDL_cosf(camera->yaw); + float sp = SDL_sinf(camera->pitch); + float cp = SDL_cosf(camera->pitch); + camera->x += cp * sy * forward + cy * right; + camera->y += up + forward * sp; + camera->z -= cp * cy * forward - sy * right; camera->y = SDL_clamp(camera->y, -camera->far, camera->far); } @@ -223,10 +223,10 @@ void Camera_Rotate(Camera* camera, float pitch, float yaw) void Camera_GetVector(const Camera* camera, float* x, float* y, float* z) { - float cos_pitch = SDL_cosf(camera->pitch); - *x = SDL_cosf(camera->yaw - RADIANS(90.0f)) * cos_pitch; + float cp = SDL_cosf(camera->pitch); + *x = SDL_cosf(camera->yaw - RADIANS(90.0f)) * cp; *y = SDL_sinf(camera->pitch); - *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * cos_pitch; + *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * cp; } bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float width, float height, float depth) @@ -234,13 +234,13 @@ bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float float max_x = x + width; float max_y = y + height; float max_z = z + depth; - for (int plane_index = 0; plane_index < 6; ++plane_index) + for (int i = 0; i < 6; i++) { - const float* plane = camera->planes[plane_index]; - float test_x = plane[0] >= 0.0f ? max_x : x; - float test_y = plane[1] >= 0.0f ? max_y : y; - float test_z = plane[2] >= 0.0f ? max_z : z; - if (plane[0] * test_x + plane[1] * test_y + plane[2] * test_z + plane[3] < 0.0f) + const float* plane = camera->planes[i]; + float point_x = plane[0] >= 0.0f ? max_x : x; + float point_y = plane[1] >= 0.0f ? max_y : y; + float point_z = plane[2] >= 0.0f ? max_z : z; + if (plane[0] * point_x + plane[1] * point_y + plane[2] * point_z + plane[3] < 0.0f) { return false; } From ed3bae1d3d3906d80578eb6319a3457dbf7c5482 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 19:09:36 -0400 Subject: [PATCH 27/39] refactor --- shaders/shader.hlsl | 5 +- src/camera.c | 22 ++++++ src/camera.h | 1 + src/main.c | 17 ++--- src/player.c | 156 +++++++++++++++++---------------------- src/rand.c | 113 ++++++++++++++--------------- src/sky.c | 173 +++++++++++++++++++------------------------- src/sky.h | 18 ++--- 8 files changed, 234 insertions(+), 271 deletions(-) diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 4efeda5f..84caa98b 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -210,10 +210,7 @@ float GetFogValue(float distance) float3 GetSkyColor(float3 position, float3 top, float3 horizon) { - float vertical = position.y; - float horizontal = length(position.xz); - float blend = (atan2(vertical, horizontal) + kPi / 2.0f) / kPi; - return lerp(horizon, top, blend); + return lerp(horizon, top, (atan2(position.y, length(position.xz)) + kPi / 2.0f) / kPi); } #endif diff --git a/src/camera.c b/src/camera.c index ca669f7f..21fcdbb2 100644 --- a/src/camera.c +++ b/src/camera.c @@ -193,6 +193,28 @@ void Camera_Update(Camera* camera) Frustum(camera->planes, camera->matrix); } +void Camera_Snap(Camera* camera, int resolution) +{ + SDL_assert(camera->type == CAMERA_TYPE_ORTHO); + SDL_assert(resolution > 0); + Camera_Update(camera); + float texel = camera->ortho * 2.0f / resolution; + float rx = camera->view[0][0]; + float ry = camera->view[1][0]; + float rz = camera->view[2][0]; + float ux = camera->view[0][1]; + float uy = camera->view[1][1]; + float uz = camera->view[2][1]; + float x = rx * camera->x + ry * camera->y + rz * camera->z; + float y = ux * camera->x + uy * camera->y + uz * camera->z; + float dx = SDL_roundf(x / texel) * texel - x; + float dy = SDL_roundf(y / texel) * texel - y; + camera->x += rx * dx + ux * dy; + camera->y += ry * dx + uy * dy; + camera->z += rz * dx + uz * dy; + Camera_Update(camera); +} + void Camera_Move(Camera* camera, float right, float up, float forward) { float sy = SDL_sinf(camera->yaw); diff --git a/src/camera.h b/src/camera.h index 98895e95..d008342c 100644 --- a/src/camera.h +++ b/src/camera.h @@ -37,6 +37,7 @@ typedef struct Camera void Camera_Init(Camera* camera, CameraType type); void Camera_Update(Camera* camera); +void Camera_Snap(Camera* camera, int resolution); void Camera_Move(Camera* camera, float right, float up, float forward); void Camera_Resize(Camera* camera, int width, int height); void Camera_Rotate(Camera* camera, float pitch, float yaw); diff --git a/src/main.c b/src/main.c index d7a79992..f9536e52 100644 --- a/src/main.c +++ b/src/main.c @@ -630,7 +630,7 @@ static bool Resize(int width, int height) static void RenderShadowPass(SDL_GPUCommandBuffer* cbuf) { - if (!sky.has_sun) + if (!sky.is_shadow_on) { return; } @@ -650,7 +650,7 @@ static void RenderShadowPass(SDL_GPUCommandBuffer* cbuf) SDL_BindGPUGraphicsPipeline(pass, shadow_pipeline); SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); SDL_PushGPUDebugGroup(cbuf, "shadow"); - World_Render(&sky.shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); + World_Render(&sky.camera, cbuf, pass, WORLD_FLAGS_OPAQUE); SDL_PopGPUDebugGroup(cbuf); SDL_EndGPURenderPass(pass); } @@ -661,7 +661,7 @@ static void DrawSky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_BindGPUGraphicsPipeline(pass, sky_pipeline); SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.proj, sizeof(player.camera.proj)); SDL_PushGPUVertexUniformData(cbuf, 1, player.camera.view, sizeof(player.camera.view)); - SDL_PushGPUFragmentUniformData(cbuf, 0, &sky.render, sizeof(sky.render)); + SDL_PushGPUFragmentUniformData(cbuf, 0, sky.sun, sizeof(float) * 16); SDL_DrawGPUPrimitives(pass, 36, 1, 0, 0); SDL_PopGPUDebugGroup(cbuf); } @@ -675,9 +675,9 @@ static void DrawOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) sampler_bindings[1].sampler = shadow_sampler; SDL_PushGPUDebugGroup(cbuf, "opaque"); SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, sizeof(sky.shadow_camera.matrix)); + SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.camera.matrix, sizeof(sky.camera.matrix)); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); - SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); + SDL_PushGPUFragmentUniformData(cbuf, 3, sky.sun, sizeof(float) * 16); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); @@ -745,9 +745,9 @@ static void DrawTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) sampler_bindings[2].sampler = nearest_sampler; SDL_PushGPUDebugGroup(cbuf, "transparent"); SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, sizeof(sky.shadow_camera.matrix)); + SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.camera.matrix, sizeof(sky.camera.matrix)); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); - SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); + SDL_PushGPUFragmentUniformData(cbuf, 3, sky.sun, sizeof(float) * 16); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT | WORLD_FLAGS_LIGHT); @@ -863,12 +863,11 @@ SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) Uint64 ticks = SDL_GetTicks(); float dt = ticks - previous_ticks; previous_ticks = ticks; - Sky_Update(&sky, dt / 1000.0f); if (SDL_GetWindowRelativeMouseMode(window)) { Player_Move(&player, dt); } - Sky_UpdateShadow(&sky, &player.camera, SHADOW_RESOLUTION); + Sky_Update(&sky, &player.camera, SHADOW_RESOLUTION, dt / 1000.0f); World_Update(&player.camera); RenderFrame(); return SDL_APP_CONTINUE; diff --git a/src/player.c b/src/player.c index ed8dae82..0d4bb6d4 100644 --- a/src/player.c +++ b/src/player.c @@ -6,12 +6,6 @@ #include "save.h" #include "world.h" -typedef struct AABB -{ - float min[3]; - float max[3]; -} AABB; - typedef struct PlayerSave { float x; @@ -22,38 +16,36 @@ typedef struct PlayerSave Block block; } PlayerSave; -static const float PHYSICS_EPSILON = 0.001f; -static const float WALK_SPEED = 5.0f; -static const float SPRINT_SPEED = 9.0f; +static const float EPSILON = 0.001f; +static const float WALK_SPEED = 4.0f; +static const float SPRINT_MULTIPLER = 2.5f; static const float SENSITIVITY = 0.1f; static const float REACH = 10.0f; static const float AIR_ACCELERATION = 6.0f; static const float GRAVITY = 24.0f; static const float JUMP_SPEED = 8.5f; -static const float FLY_SPEED = 0.01f; -static const float FLY_FAST_SPEED = 0.1f; +static const float FLY_SPEED = 0.05f; static const float COLLISION_STEP = 0.1f; static const float GROUND_OFFSET = 0.002f; - -static const AABB PLAYER_AABB = {{-0.3f, -1.62f, -0.3f}, {0.3f, 1.8f - 1.62f, 0.3f}}; +static const float AABB[2][3] = {{-0.3f, -1.62f, -0.3f}, {0.3f, 1.8f - 1.62f, 0.3f}}; static bool IsColliding(const float position[3]) { - int min_block[3]; - int max_block[3]; - for (int axis = 0; axis < 3; axis++) + int min[3]; + int max[3]; + for (int i = 0; i < 3; i++) { - min_block[axis] = SDL_floorf(position[axis] + PLAYER_AABB.min[axis] + PHYSICS_EPSILON); - max_block[axis] = SDL_floorf(position[axis] + PLAYER_AABB.max[axis] - PHYSICS_EPSILON); + min[i] = SDL_floorf(position[i] + AABB[0][i] + EPSILON); + max[i] = SDL_floorf(position[i] + AABB[1][i] - EPSILON); } - for (int bx = min_block[0]; bx <= max_block[0]; bx++) + for (int bx = min[0]; bx <= max[0]; bx++) { - for (int by = min_block[1]; by <= max_block[1]; by++) + for (int by = min[1]; by <= max[1]; by++) { - for (int bz = min_block[2]; bz <= max_block[2]; bz++) + for (int bz = min[2]; bz <= max[2]; bz++) { - int block_position[3] = {bx, by, bz}; - if (Block_IsSolid(World_GetBlock(block_position))) + int block[3] = {bx, by, bz}; + if (Block_IsSolid(World_GetBlock(block))) { return true; } @@ -68,18 +60,18 @@ static void Bisect(float position[3], int axis, float step) float start[3] = {position[0], position[1], position[2]}; float lower = 0.0f; float upper = 1.0f; - for (int iteration = 0; iteration < 8; iteration++) + for (int i = 0; i < 8; i++) { - float fraction = (lower + upper) * 0.5f; + float half = (lower + upper) * 0.5f; float location[3] = {start[0], start[1], start[2]}; - location[axis] += step * fraction; + location[axis] += step * half; if (IsColliding(location)) { - upper = fraction; + upper = half; } else { - lower = fraction; + lower = half; } } position[axis] = start[axis] + step * lower; @@ -91,9 +83,9 @@ static bool Move(float position[3], int axis, float delta) { return false; } - int step_count = SDL_max(SDL_ceilf(SDL_fabsf(delta) / COLLISION_STEP), 1); - float step = delta / step_count; - for (int step_index = 0; step_index < step_count; step_index++) + int steps = SDL_max(SDL_ceilf(SDL_fabsf(delta) / COLLISION_STEP), 1); + float step = delta / steps; + for (int i = 0; i < steps; i++) { float location[3] = {position[0], position[1], position[2]}; location[axis] += step; @@ -109,35 +101,35 @@ static bool Move(float position[3], int axis, float delta) void Player_Load(Player* player) { - PlayerSave saved_player; + PlayerSave save; Camera_Init(&player->camera, CAMERA_TYPE_PERSPECTIVE); player->camera.x = -200.0f; player->camera.y = 50.0f; player->camera.z = 0.0f; player->controller = PLAYER_CONTROLLER_WALK; player->block = BLOCK_YELLOW_TORCH; - if (Save_GetPlayer(&saved_player, sizeof(saved_player))) + if (Save_GetPlayer(&save, sizeof(save))) { - player->block = saved_player.block; - player->camera.x = saved_player.x; - player->camera.y = saved_player.y; - player->camera.z = saved_player.z; - player->camera.pitch = saved_player.pitch; - player->camera.yaw = saved_player.yaw; + player->block = save.block; + player->camera.x = save.x; + player->camera.y = save.y; + player->camera.z = save.z; + player->camera.pitch = save.pitch; + player->camera.yaw = save.yaw; } player->query = World_Raycast(&player->camera, REACH); } void Player_Save(const Player* player) { - PlayerSave saved_player; - saved_player.x = player->camera.x; - saved_player.y = player->camera.y; - saved_player.z = player->camera.z; - saved_player.pitch = player->camera.pitch; - saved_player.yaw = player->camera.yaw; - saved_player.block = player->block; - Save_SetPlayer(&saved_player, sizeof(saved_player)); + PlayerSave save; + save.x = player->camera.x; + save.y = player->camera.y; + save.z = player->camera.z; + save.pitch = player->camera.pitch; + save.yaw = player->camera.yaw; + save.block = player->block; + Save_SetPlayer(&save, sizeof(save)); } void Player_ToggleController(Player* player) @@ -158,29 +150,29 @@ void Player_Move(Player* player, float dt) if (player->controller == PLAYER_CONTROLLER_WALK) { dt = SDL_min(dt * 0.001f, 0.05f); - float input_x = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; - float input_z = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; - float input_length = SDL_sqrtf(input_x * input_x + input_z * input_z); - if (input_length > SDL_FLT_EPSILON) + float right = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; + float forward = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; + float length = SDL_sqrtf(right * right + forward * forward); + if (length > SDL_FLT_EPSILON) { - input_x /= input_length; - input_z /= input_length; + right /= length; + forward /= length; } - float speed = keys[SDL_SCANCODE_LCTRL] ? SPRINT_SPEED : WALK_SPEED; - float sin_yaw = SDL_sinf(player->camera.yaw); - float cos_yaw = SDL_cosf(player->camera.yaw); - float target_x = (cos_yaw * input_x + sin_yaw * input_z) * speed; - float target_z = (sin_yaw * input_x - cos_yaw * input_z) * speed; + float speed = WALK_SPEED * (keys[SDL_SCANCODE_LCTRL] ? SPRINT_MULTIPLER : 1.0f); + float sy = SDL_sinf(player->camera.yaw); + float cy = SDL_cosf(player->camera.yaw); + float dx = (cy * right + sy * forward) * speed; + float dz = (sy * right - cy * forward) * speed; if (player->is_on_ground) { - player->velocity[0] = target_x; - player->velocity[2] = target_z; + player->velocity[0] = dx; + player->velocity[2] = dz; } else { float blend = SDL_min(1.0f, AIR_ACCELERATION * dt); - player->velocity[0] += (target_x - player->velocity[0]) * blend; - player->velocity[2] += (target_z - player->velocity[2]) * blend; + player->velocity[0] += (dx - player->velocity[0]) * blend; + player->velocity[2] += (dz - player->velocity[2]) * blend; } if (keys[SDL_SCANCODE_SPACE] && player->is_on_ground) { @@ -192,38 +184,22 @@ void Player_Move(Player* player, float dt) return; } player->velocity[1] -= GRAVITY * dt; - bool collisions[3]; - for (int axis = 0; axis < 3; axis++) - { - collisions[axis] = Move(player->camera.position, axis, player->velocity[axis] * dt); - } - if (collisions[0]) - { - player->velocity[0] = 0.0f; - } - if (collisions[2]) + bool hits[3]; + for (int i = 0; i < 3; i++) { - player->velocity[2] = 0.0f; + hits[i] = Move(player->camera.position, i, player->velocity[i] * dt); } - if (collisions[1]) + player->is_on_ground = hits[1] && player->velocity[1] < 0.0f; + for (int i = 0; i < 3; i++) { - if (player->velocity[1] < 0.0f) - { - player->is_on_ground = true; - } - player->velocity[1] = 0.0f; - } - else - { - player->is_on_ground = false; + player->velocity[i] *= !hits[i]; } } else { - float speed = keys[SDL_SCANCODE_LCTRL] ? FLY_FAST_SPEED : FLY_SPEED; + float speed = FLY_SPEED * (keys[SDL_SCANCODE_LCTRL] ? SPRINT_MULTIPLER : 1.0f); float dx = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; - float dy = - (keys[SDL_SCANCODE_E] || keys[SDL_SCANCODE_SPACE]) - (keys[SDL_SCANCODE_Q] || keys[SDL_SCANCODE_LSHIFT]); + float dy = keys[SDL_SCANCODE_SPACE] + keys[SDL_SCANCODE_E] - keys[SDL_SCANCODE_LSHIFT] - keys[SDL_SCANCODE_Q]; float dz = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; Camera_Move(&player->camera, dx * speed * dt, dy * speed * dt, dz * speed * dt); } @@ -241,11 +217,11 @@ void Player_PlaceBlock(const Player* player) World_SetBlock(player->query.previous, player->block); return; } - for (int axis = 0; axis < 3; axis++) + for (int i = 0; i < 3; i++) { - float player_min = player->camera.position[axis] + PLAYER_AABB.min[axis] + PHYSICS_EPSILON; - float player_max = player->camera.position[axis] + PLAYER_AABB.max[axis] - PHYSICS_EPSILON; - if (player_max <= player->query.previous[axis] || player_min >= player->query.previous[axis] + 1.0f) + float min = player->camera.position[i] + AABB[0][i] + EPSILON; + float max = player->camera.position[i] + AABB[1][i] - EPSILON; + if (max <= player->query.previous[i] || min >= player->query.previous[i] + 1.0f) { World_SetBlock(player->query.previous, player->block); break; diff --git a/src/rand.c b/src/rand.c index cb692b44..d13dd746 100644 --- a/src/rand.c +++ b/src/rand.c @@ -6,74 +6,71 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) { - for (int local_x = 0; local_x < CHUNK_WIDTH; local_x++) + for (int x = 0; x < CHUNK_WIDTH; x++) { - for (int local_z = 0; local_z < CHUNK_WIDTH; local_z++) + for (int z = 0; z < CHUNK_WIDTH; z++) { - int world_x = cx + local_x; - int world_z = cz + local_z; - bool is_lowland = false; - bool has_grass = false; - float terrain_height = - stb_perlin_fbm_noise3(world_x * 0.005f, 0.0f, world_z * 0.005f, 2.0f, 0.5f, 6) * 50.0f; - terrain_height = SDL_powf(SDL_max(terrain_height, 0.0f), 1.3f) + 30.0f; - terrain_height = SDL_clamp(terrain_height, 0.0f, CHUNK_HEIGHT - 1.0f); - if (terrain_height < 40.0f) + int bx = cx + x; + int bz = cz + z; + bool is_border = x > 2 && x < CHUNK_WIDTH - 2 && z > 2 && z < CHUNK_WIDTH - 2; + bool is_low = false; + bool is_plains = false; + float height = stb_perlin_fbm_noise3(bx * 0.005f, 0.0f, bz * 0.005f, 2.0f, 0.5f, 6) * 50.0f; + height = SDL_powf(SDL_max(height, 0.0f), 1.3f) + 30.0f; + height = SDL_clamp(height, 0.0f, CHUNK_HEIGHT - 1.0f); + if (height < 40.0f) { - terrain_height += stb_perlin_fbm_noise3(-world_x * 0.01f, 0.0f, world_z * 0.01f, 2.0f, 0.5f, 6) * 12.0f; - is_lowland = true; + height += stb_perlin_fbm_noise3(-bx * 0.01f, 0.0f, bz * 0.01f, 2.0f, 0.5f, 6) * 12.0f; + is_low = true; } - float biome = stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 6); - Block surface_block; - Block fill_block; - if (terrain_height + biome < 31.0f) + float biome = stb_perlin_fbm_noise3(bx * 0.2f, 0.0f, bz * 0.2f, 2.0f, 0.5f, 6); + Block top; + Block bottom; + if (height + biome < 31.0f) { - surface_block = BLOCK_SAND; - fill_block = BLOCK_SAND; + top = BLOCK_SAND; + bottom = BLOCK_SAND; } else { biome *= 8.0f; biome = SDL_clamp(biome, -5.0f, 5.0f); - if (terrain_height + biome < 61.0f) + if (height + biome < 61.0f) { - surface_block = BLOCK_GRASS; - fill_block = BLOCK_DIRT; - has_grass = true; + top = BLOCK_GRASS; + bottom = BLOCK_DIRT; + is_plains = true; } - else if (terrain_height + biome < 132.0f) + else if (height + biome < 132.0f) { - surface_block = BLOCK_STONE; - fill_block = BLOCK_STONE; + top = BLOCK_STONE; + bottom = BLOCK_STONE; } else { - surface_block = BLOCK_SNOW; - fill_block = BLOCK_STONE; + top = BLOCK_SNOW; + bottom = BLOCK_STONE; } } int y = 0; - for (; y < terrain_height; y++) + for (; y < height; y++) { - callback(userdata, world_x, y, world_z, fill_block); + callback(userdata, bx, y, bz, bottom); } - callback(userdata, world_x, y, world_z, surface_block); + callback(userdata, bx, y, bz, top); for (; y < 30; y++) { - callback(userdata, world_x, y, world_z, BLOCK_WATER); + callback(userdata, bx, y, bz, BLOCK_WATER); } - if (is_lowland && has_grass) + if (is_low && is_plains) { - float plant_noise = - stb_perlin_fbm_noise3(world_x * 0.2f, 0.0f, world_z * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; - bool can_grow_tree = - local_x > 2 && local_x < CHUNK_WIDTH - 2 && local_z > 2 && local_z < CHUNK_WIDTH - 2; - if (plant_noise > 0.8f && can_grow_tree) + float plant = stb_perlin_fbm_noise3(bx * 0.2f, 0.0f, bz * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; + if (plant > 0.8f && is_border) { - int trunk_height = 3 + plant_noise * 2.0f; - for (int dy = 0; dy < trunk_height; dy++) + int trunk = 3 + plant * 2.0f; + for (int dy = 0; dy < trunk; dy++) { - callback(userdata, world_x, y + dy + 1, world_z, BLOCK_LOG); + callback(userdata, bx, y + dy + 1, bz, BLOCK_LOG); } for (int dx = -1; dx <= 1; dx++) { @@ -83,44 +80,44 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) { if (dx || dz || dy) { - callback(userdata, world_x + dx, y + trunk_height + dy, world_z + dz, BLOCK_LEAVES); + callback(userdata, bx + dx, y + trunk + dy, bz + dz, BLOCK_LEAVES); } } } } } - else if (plant_noise > 0.55f) + else if (plant > 0.55f) { - callback(userdata, world_x, y + 1, world_z, BLOCK_BUSH); + callback(userdata, bx, y + 1, bz, BLOCK_BUSH); } - else if (plant_noise > 0.52f) + else if (plant > 0.52f) { - int flower_index = SDL_max(((int)(plant_noise * 1000.0f)) % 4, 0); + int i = (int)(plant * 1000.0f) % 4; Block flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; - callback(userdata, world_x, y + 1, world_z, flowers[flower_index]); + callback(userdata, bx, y + 1, bz, flowers[i]); } } - if (terrain_height > 130.0f) + if (height > 130.0f) { continue; } - float cloud_noise = stb_perlin_turbulence_noise3(world_x * 0.015f, 0.0f, world_z * 0.015f, 2.0f, 0.5f, 6); - int cloud_half_height = -1; - if (cloud_noise > 0.9f) + float cloud = stb_perlin_turbulence_noise3(bx * 0.015f, 0.0f, bz * 0.015f, 2.0f, 0.5f, 6); + int scale = -1; + if (cloud > 0.9f) { - cloud_half_height = 2; + scale = 2; } - else if (cloud_noise > 0.7f) + else if (cloud > 0.7f) { - cloud_half_height = 1; + scale = 1; } - else if (cloud_noise > 0.6f) + else if (cloud > 0.6f) { - cloud_half_height = 0; + scale = 0; } - for (int cloud_y = -cloud_half_height; cloud_y <= cloud_half_height; cloud_y++) + for (int y = -scale; y <= scale; y++) { - callback(userdata, world_x, 155 - cloud_y, world_z, BLOCK_CLOUD); + callback(userdata, bx, 155 - y, bz, BLOCK_CLOUD); } } } diff --git a/src/sky.c b/src/sky.c index 3dfe8a41..3f702972 100644 --- a/src/sky.c +++ b/src/sky.c @@ -1,4 +1,5 @@ #include +#include #include "save.h" #include "sky.h" @@ -13,7 +14,6 @@ static const float SHADOW_Y = 30.0f; static const float SHADOW_ORTHO = 300.0f; static const float SHADOW_FAR = 300.0f; static const int SHADOW_UPDATE_FRAMES = 300; - static const float NIGHT_SKY_TOP[3] = {0.01f, 0.02f, 0.06f}; static const float NIGHT_SKY_HORIZON[3] = {0.06f, 0.08f, 0.18f}; static const float TWILIGHT_SKY_TOP[3] = {0.24f, 0.16f, 0.32f}; @@ -23,125 +23,102 @@ static const float DAY_SKY_HORIZON[3] = {0.72f, 0.84f, 0.98f}; static const float NIGHT_AMBIENT[3] = {0.12f, 0.16f, 0.28f}; static const float DAY_AMBIENT[3] = {0.85f, 0.9f, 1.0f}; -static void LerpColor(float output[4], const float start[3], const float end[3], float amount) +static void Lerp(float out[4], const float start[3], const float end[3], float alpha) { - output[0] = start[0] + (end[0] - start[0]) * amount; - output[1] = start[1] + (end[1] - start[1]) * amount; - output[2] = start[2] + (end[2] - start[2]) * amount; - output[3] = 0.0f; + out[0] = start[0] + (end[0] - start[0]) * alpha; + out[1] = start[1] + (end[1] - start[1]) * alpha; + out[2] = start[2] + (end[2] - start[2]) * alpha; + out[3] = 0.0f; } -static void CopyColor(float output[4], const float color[3]) +static void Copy(float out[4], const float in[3]) { - output[0] = color[0]; - output[1] = color[1]; - output[2] = color[2]; - output[3] = 0.0f; + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = 0.0f; } -static void UpdateRender(Sky* sky) +void Sky_Reset(Sky* sky) { - float ambient[4]; - float progress; - if (sky->time_of_day < SUNRISE_END) - { - progress = sky->time_of_day / SUNRISE_END; - LerpColor(sky->render.top, NIGHT_SKY_TOP, TWILIGHT_SKY_TOP, progress); - LerpColor(sky->render.horizon, NIGHT_SKY_HORIZON, TWILIGHT_SKY_HORIZON, progress); - LerpColor(ambient, NIGHT_AMBIENT, DAY_AMBIENT, progress); - } - else if (sky->time_of_day < DAY_END) - { - progress = (sky->time_of_day - SUNRISE_END) / (DAY_END - SUNRISE_END); - LerpColor(sky->render.top, TWILIGHT_SKY_TOP, DAY_SKY_TOP, progress); - LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, DAY_SKY_HORIZON, progress); - CopyColor(ambient, DAY_AMBIENT); - } - else if (sky->time_of_day < SUNSET_END) - { - progress = (sky->time_of_day - DAY_END) / (SUNSET_END - DAY_END); - LerpColor(sky->render.top, DAY_SKY_TOP, TWILIGHT_SKY_TOP, progress); - LerpColor(sky->render.horizon, DAY_SKY_HORIZON, TWILIGHT_SKY_HORIZON, progress); - LerpColor(ambient, DAY_AMBIENT, NIGHT_AMBIENT, progress); - } - else - { - progress = (sky->time_of_day - SUNSET_END) / (1.0f - SUNSET_END); - LerpColor(sky->render.top, TWILIGHT_SKY_TOP, NIGHT_SKY_TOP, progress); - LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, NIGHT_SKY_HORIZON, progress); - CopyColor(ambient, NIGHT_AMBIENT); - } - float angle = sky->time_of_day * 2.0f * SDL_PI_F; - float sun_height = -SDL_cosf(angle); - float sun_intensity = SDL_clamp(sun_height, 0.0f, 1.0f); - float horizontal = SDL_sinf(angle); - sky->render.sun[0] = horizontal * SDL_sqrtf(0.5f); - sky->render.sun[1] = -sun_intensity; - sky->render.sun[2] = -horizontal * SDL_sqrtf(0.5f); - sky->render.sun[3] = sun_intensity; - sky->has_sun = sun_intensity > 0.0f; - float ambient_energy = SDL_clamp(sun_intensity, 0.1f, 1.0f) * AMBIENT_SCALE; - sky->render.ambient[0] = ambient[0] * ambient_energy; - sky->render.ambient[1] = ambient[1] * ambient_energy; - sky->render.ambient[2] = ambient[2] * ambient_energy; - sky->render.ambient[3] = 0.0f; + sky->time_of_day = 3.0f / 8.0f; +} + +void Sky_Save(const Sky* sky) +{ + Save_SetSky(sky->time_of_day); } void Sky_Load(Sky* sky) { - SDL_COMPILE_TIME_ASSERT("", sizeof(SkyRender) == sizeof(float) * 16); - Camera_Init(&sky->shadow_camera, CAMERA_TYPE_ORTHO); - sky->shadow_camera.ortho = SHADOW_ORTHO; - sky->shadow_camera.far = SHADOW_FAR; - sky->shadow_frame = 0; + SDL_COMPILE_TIME_ASSERT("", offsetof(Sky, time_of_day) == sizeof(float) * 16); + Camera_Init(&sky->camera, CAMERA_TYPE_ORTHO); + sky->camera.ortho = SHADOW_ORTHO; + sky->camera.far = SHADOW_FAR; + sky->frame = 0; sky->time_of_day = SUNRISE_END + (DAY_END - SUNRISE_END) / 2.0f; - float saved_time; - if (Save_GetSky(&saved_time) && saved_time >= 0.0f && saved_time < 1.0f) + float time; + if (Save_GetSky(&time) && time >= 0.0f && time < 1.0f) { - sky->time_of_day = saved_time; + sky->time_of_day = time; } - UpdateRender(sky); } -void Sky_Reset(Sky* sky) -{ - sky->time_of_day = 3.0f / 8.0f; - sky->shadow_frame = 0; - UpdateRender(sky); -} - -void Sky_Update(Sky* sky, float dt) +void Sky_Update(Sky* sky, const Camera* camera, int resolution, float dt) { sky->time_of_day += dt * SPEED / TOTAL_LENGTH; sky->time_of_day = SDL_fmodf(sky->time_of_day, 1.0f); - UpdateRender(sky); -} - -void Sky_Save(const Sky* sky) -{ - Save_SetSky(sky->time_of_day); -} - -void Sky_UpdateShadow(Sky* sky, const Camera* camera, int resolution) -{ - Camera* shadow = &sky->shadow_camera; - if (sky->shadow_frame == 0) + float alpha; + if (sky->time_of_day < SUNRISE_END) + { + alpha = sky->time_of_day / SUNRISE_END; + Lerp(sky->top, NIGHT_SKY_TOP, TWILIGHT_SKY_TOP, alpha); + Lerp(sky->horizon, NIGHT_SKY_HORIZON, TWILIGHT_SKY_HORIZON, alpha); + Lerp(sky->ambient, NIGHT_AMBIENT, DAY_AMBIENT, alpha); + } + else if (sky->time_of_day < DAY_END) + { + alpha = (sky->time_of_day - SUNRISE_END) / (DAY_END - SUNRISE_END); + Lerp(sky->top, TWILIGHT_SKY_TOP, DAY_SKY_TOP, alpha); + Lerp(sky->horizon, TWILIGHT_SKY_HORIZON, DAY_SKY_HORIZON, alpha); + Copy(sky->ambient, DAY_AMBIENT); + } + else if (sky->time_of_day < SUNSET_END) + { + alpha = (sky->time_of_day - DAY_END) / (SUNSET_END - DAY_END); + Lerp(sky->top, DAY_SKY_TOP, TWILIGHT_SKY_TOP, alpha); + Lerp(sky->horizon, DAY_SKY_HORIZON, TWILIGHT_SKY_HORIZON, alpha); + Lerp(sky->ambient, DAY_AMBIENT, NIGHT_AMBIENT, alpha); + } + else + { + alpha = (sky->time_of_day - SUNSET_END) / (1.0f - SUNSET_END); + Lerp(sky->top, TWILIGHT_SKY_TOP, NIGHT_SKY_TOP, alpha); + Lerp(sky->horizon, TWILIGHT_SKY_HORIZON, NIGHT_SKY_HORIZON, alpha); + Copy(sky->ambient, NIGHT_AMBIENT); + } + float angle = sky->time_of_day * 2.0f * SDL_PI_F - SDL_PI_F * 0.5f; + float s = SDL_sinf(angle); + float c = SDL_cosf(angle); + float intensity = SDL_clamp(s, 0.0f, 1.0f); + sky->sun[0] = c * SDL_sqrtf(0.5f); + sky->sun[1] = -intensity; + sky->sun[2] = -c * SDL_sqrtf(0.5f); + sky->sun[3] = intensity; + sky->is_shadow_on = intensity > 0.0f; + float ambient = SDL_clamp(intensity, 0.1f, 1.0f) * AMBIENT_SCALE; + sky->ambient[0] *= ambient; + sky->ambient[1] *= ambient; + sky->ambient[2] *= ambient; + Camera* shadow = &sky->camera; + if (sky->frame == 0) { - shadow->pitch = SDL_asinf(sky->render.sun[1]); - shadow->yaw = SDL_atan2f(sky->render.sun[0], -sky->render.sun[2]); + shadow->pitch = SDL_asinf(sky->sun[1]); + shadow->yaw = SDL_atan2f(sky->sun[0], -sky->sun[2]); } - sky->shadow_frame = (sky->shadow_frame + 1) % SHADOW_UPDATE_FRAMES; + sky->frame = (sky->frame + 1) % SHADOW_UPDATE_FRAMES; shadow->x = camera->x; shadow->y = SHADOW_Y; shadow->z = camera->z; - Camera_Update(shadow); - float texel_size = SHADOW_ORTHO * 2.0f / resolution; - float light_x = shadow->view[0][0] * shadow->x + shadow->view[1][0] * shadow->y + shadow->view[2][0] * shadow->z; - float light_y = shadow->view[0][1] * shadow->x + shadow->view[1][1] * shadow->y + shadow->view[2][1] * shadow->z; - float delta_x = SDL_roundf(light_x / texel_size) * texel_size - light_x; - float delta_y = SDL_roundf(light_y / texel_size) * texel_size - light_y; - shadow->x += shadow->view[0][0] * delta_x + shadow->view[0][1] * delta_y; - shadow->y += shadow->view[1][0] * delta_x + shadow->view[1][1] * delta_y; - shadow->z += shadow->view[2][0] * delta_x + shadow->view[2][1] * delta_y; - Camera_Update(shadow); + Camera_Snap(shadow, resolution); } diff --git a/src/sky.h b/src/sky.h index b6eb7c17..dbd21d25 100644 --- a/src/sky.h +++ b/src/sky.h @@ -4,25 +4,19 @@ #include "camera.h" -typedef struct SkyRender +typedef struct Sky { float sun[4]; float top[4]; float horizon[4]; float ambient[4]; -} SkyRender; - -typedef struct Sky -{ float time_of_day; - bool has_sun; - SkyRender render; - Camera shadow_camera; - int shadow_frame; + bool is_shadow_on; + Camera camera; + int frame; } Sky; -void Sky_Load(Sky* sky); void Sky_Reset(Sky* sky); void Sky_Save(const Sky* sky); -void Sky_Update(Sky* sky, float dt); -void Sky_UpdateShadow(Sky* sky, const Camera* camera, int resolution); +void Sky_Load(Sky* sky); +void Sky_Update(Sky* sky, const Camera* camera, int resolution, float dt); From f773f32493bb318dc91a1b7fccfb83e7ef3825d3 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 19:32:38 -0400 Subject: [PATCH 28/39] refactor --- .vscode/settings.json | 9 ++--- src/voxel.c | 84 ++++++++++++++++++------------------------- src/voxel.h | 7 ++-- src/world.c | 77 +++++++++++++++++++-------------------- 4 files changed, 79 insertions(+), 98 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d9321170..aaa3d67e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,13 +1,14 @@ { - "cmake.parallelJobs": 8, - "C_Cpp.clang_format_style": "file", - "editor.formatOnSave": true, "[c][cpp]": { "editor.defaultFormatter": "ms-vscode.cpptools" }, + "C_Cpp.clang_format_style": "file", + "cmake.parallelJobs": 8, + "editor.formatOnSave": true, "files.associations": { "*.frag": "cpp", "*.hlsl": "cpp", + "*.inc": "cpp", "*.vert": "cpp" } -} +} \ No newline at end of file diff --git a/src/voxel.c b/src/voxel.c index 990f14ad..97eba6ad 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -23,15 +23,16 @@ static const int TEXCOORDS[][4][2] = { {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, }; -static Voxel Pack( - Block block, - int x, - int y, - int z, - int texture_u, - int texture_v, - Direction direction, - int ambient_occlusion) +static const int SPRITE_POSITIONS[][4][3] = { + {{0, 0, 0}, {0, 1, 0}, {1, 0, 1}, {1, 1, 1}}, + {{0, 0, 0}, {1, 0, 1}, {0, 1, 0}, {1, 1, 1}}, + {{0, 0, 1}, {1, 0, 0}, {0, 1, 1}, {1, 1, 0}}, + {{0, 0, 1}, {0, 1, 1}, {1, 0, 0}, {1, 1, 0}}, +}; + +static const int AO[2][4] = {{0, 1, 2, 3}, {1, 3, 0, 2}}; + +static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction direction, int ao) { SDL_COMPILE_TIME_ASSERT("", VOXEL_AO_OFFSET + VOXEL_AO_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", VOXEL_X_OFFSET + VOXEL_X_BITS <= 32); @@ -46,69 +47,52 @@ static Voxel Pack( SDL_assert(x <= VOXEL_X_MASK); SDL_assert(y <= VOXEL_Y_MASK); SDL_assert(z <= VOXEL_Z_MASK); - SDL_assert(texture_u <= VOXEL_U_MASK); - SDL_assert(texture_v <= VOXEL_V_MASK); + SDL_assert(u <= VOXEL_U_MASK); + SDL_assert(v <= VOXEL_V_MASK); SDL_assert(direction <= VOXEL_DIRECTION_MASK); - SDL_assert(ambient_occlusion <= VOXEL_AO_MASK); + SDL_assert(ao <= VOXEL_AO_MASK); Voxel voxel = 0; voxel |= direction << VOXEL_DIRECTION_OFFSET; voxel |= block << VOXEL_BLOCK_OFFSET; - voxel |= ambient_occlusion << VOXEL_AO_OFFSET; + voxel |= ao << VOXEL_AO_OFFSET; voxel |= x << VOXEL_X_OFFSET; voxel |= y << VOXEL_Y_OFFSET; voxel |= z << VOXEL_Z_OFFSET; - voxel |= texture_u << VOXEL_U_OFFSET; - voxel |= texture_v << VOXEL_V_OFFSET; + voxel |= u << VOXEL_U_OFFSET; + voxel |= v << VOXEL_V_OFFSET; return voxel; } -Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int vertex) +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int index) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); SDL_assert(direction < 4); - SDL_assert(vertex < 4); - static const int POSITIONS[][4][3] = { - {{0, 0, 0}, {0, 1, 0}, {1, 0, 1}, {1, 1, 1}}, - {{0, 0, 0}, {1, 0, 1}, {0, 1, 0}, {1, 1, 1}}, - {{0, 0, 1}, {1, 0, 0}, {0, 1, 1}, {1, 1, 0}}, - {{0, 0, 1}, {0, 1, 1}, {1, 0, 0}, {1, 1, 0}}, - }; - const int* offset = POSITIONS[direction][vertex]; - const int* texcoord = TEXCOORDS[direction][vertex]; - return Pack( - block, - x + offset[0], - y + offset[1], - z + offset[2], - texcoord[0], - texcoord[1], - DIRECTION_UP, - VOXEL_AO_MASK); + SDL_assert(index < 4); + const int* p = SPRITE_POSITIONS[direction][index]; + const int* t = TEXCOORDS[direction][index]; + return Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], DIRECTION_UP, VOXEL_AO_MASK); } -Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int vertex, int ambient_occlusion) +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); SDL_assert(direction < 6); - SDL_assert(vertex < 4); - const int* offset = CUBE_POSITIONS[direction][vertex]; - const int* texcoord = TEXCOORDS[direction][vertex]; - return Pack( - block, - x + offset[0], - y + offset[1], - z + offset[2], - texcoord[0], - texcoord[1], - direction, - ambient_occlusion); + SDL_assert(index < 4); + const int* p = CUBE_POSITIONS[direction][index]; + const int* t = TEXCOORDS[direction][index]; + return Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], direction, ao); +} + +void Voxel_GetAO(const int ao[4], int order[4]) +{ + int index = ao[0] + ao[3] > ao[1] + ao[2]; + SDL_memcpy(order, AO[index], sizeof(AO[index])); } -void Voxel_GetCubePosition(Direction direction, int vertex, int position[3]) +void Voxel_GetPosition(Direction direction, int index, int position[3]) { SDL_assert(direction < 6); - SDL_assert(vertex < 4); - SDL_memcpy(position, CUBE_POSITIONS[direction][vertex], sizeof(int) * 3); + SDL_memcpy(position, CUBE_POSITIONS[direction][index], sizeof(int) * 3); } diff --git a/src/voxel.h b/src/voxel.h index 0f49e421..dabd37a5 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -7,6 +7,7 @@ typedef Uint32 Voxel; -Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int vertex); -Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int vertex, int ambient_occlusion); -void Voxel_GetCubePosition(Direction direction, int vertex, int position[3]); +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int index); +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao); +void Voxel_GetAO(const int ao[4], int order[4]); +void Voxel_GetPosition(Direction direction, int index, int position[3]); diff --git a/src/world.c b/src/world.c index fab411ef..a34a185b 100644 --- a/src/world.c +++ b/src/world.c @@ -6,12 +6,12 @@ #include "rand.h" #include "save.h" #include "voxel.h" +#include "voxel.inc" #include "world.h" #define WORKERS 4 -static const int AO_LEVEL_CLEAR = 3; -static const Uint32 INDEX_COUNT = CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_WIDTH * DIRECTION_COUNT * 6; +static const Uint32 MAX_INDICES = CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_WIDTH * DIRECTION_COUNT * 6; typedef enum JobType { @@ -121,13 +121,13 @@ static Chunk* GetChunk(int cx, int cz) static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) { - for (int offset_x = -1; offset_x <= 1; offset_x++) + for (int x = -1; x <= 1; x++) { - for (int offset_z = -1; offset_z <= 1; offset_z++) + for (int z = -1; z <= 1; z++) { - Chunk* chunk = GetChunk(cx + offset_x, cz + offset_z); - neighborhood[offset_x + 1][offset_z + 1] = chunk; + Chunk* chunk = GetChunk(cx + x, cz + z); SDL_assert(chunk); + neighborhood[x + 1][z + 1] = chunk; } } } @@ -153,9 +153,9 @@ static Chunk* CreateChunk() static void FreeChunk(Chunk* chunk) { GPUBuffer_Free(&chunk->gpu_lights); - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + for (int i = 0; i < MESH_TYPE_COUNT; i++) { - GPUBuffer_Free(&chunk->gpu_voxels[mesh_index]); + GPUBuffer_Free(&chunk->gpu_voxels[i]); } SDL_free(chunk->lights); SDL_free(chunk); @@ -336,39 +336,40 @@ static bool IsVisible(Block block, Block neighbor) static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction direction, int vertex) { int position[3]; - Voxel_GetCubePosition(direction, vertex, position); - int first_side[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; - int second_side[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; + Voxel_GetPosition(direction, vertex, position); + int side1[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; + int side2[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int corner[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; - int side_count = 0; - for (int axis = 0; axis < 3; axis++) + int sides = 0; + for (int i = 0; i < 3; i++) { - if (DIRECTIONS[direction][axis]) + if (DIRECTIONS[direction][i]) { continue; } - int offset = position[axis] ? 1 : -1; - if (side_count++ == 0) + int offset = position[i] ? 1 : -1; + if (sides++ == 0) { - first_side[axis] = offset; + side1[i] = offset; } else { - second_side[axis] = offset; + side2[i] = offset; } - corner[axis] = offset; + corner[i] = offset; } - SDL_assert(side_count == 2); - bool has_first_side = - Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, first_side[0], first_side[1], first_side[2])); - bool has_second_side = - Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, second_side[0], second_side[1], second_side[2])); + SDL_assert(sides == 2); + bool has_side1 = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); + bool has_side2 = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); bool has_corner = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); - if (has_first_side && has_second_side) + if (!has_side1 || !has_side2) + { + return VOXEL_AO_MASK - has_side1 - has_side2 - has_corner; + } + else { return 0; } - return AO_LEVEL_CLEAR - has_first_side - has_second_side - has_corner; } static void GenerateChunkBlocks(Chunk* chunk) @@ -427,23 +428,17 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ { continue; } - int ambient_occlusion[4]; - int vertex_order[] = {0, 1, 2, 3}; - for (int vertex = 0; vertex < 4; vertex++) - { - ambient_occlusion[vertex] = GetAO(chunks, bx, by, bz, direction, vertex); - } - if (ambient_occlusion[0] + ambient_occlusion[3] > ambient_occlusion[1] + ambient_occlusion[2]) + int ao[4]; + for (int i = 0; i < 4; i++) { - vertex_order[0] = 1; - vertex_order[1] = 3; - vertex_order[2] = 0; - vertex_order[3] = 2; + ao[i] = GetAO(chunks, bx, by, bz, direction, i); } - for (int vertex_index = 0; vertex_index < 4; vertex_index++) + int order[4]; + Voxel_GetAO(ao, order); + for (int i = 0; i < 4; i++) { - int vertex = vertex_order[vertex_index]; - Voxel voxel = Voxel_PackCube(block, bx, by, bz, direction, vertex, ambient_occlusion[vertex]); + int index = order[i]; + Voxel voxel = Voxel_PackCube(block, bx, by, bz, direction, index, ao[index]); CPUBuffer_Append(&voxels[mesh_type], &voxel); } } @@ -510,7 +505,7 @@ static void GenerateIndices() return; } static const int INDICES[] = {0, 1, 2, 3, 2, 1}; - for (Uint32 quad_index = 0; quad_index < INDEX_COUNT / 6; quad_index++) + for (Uint32 quad_index = 0; quad_index < MAX_INDICES / 6; quad_index++) { for (Uint32 index_index = 0; index_index < 6; index_index++) { From 786ad0674730f98fa390737828bddbc3f94d375b Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 20:13:29 -0400 Subject: [PATCH 29/39] refactor worker --- CMakeLists.txt | 1 + src/camera.c | 2 +- src/camera.h | 2 +- src/worker.c | 90 ++++++++++++++++++++++++++ src/worker.h | 20 ++++++ src/world.c | 170 ++++++++++++++----------------------------------- 6 files changed, 161 insertions(+), 124 deletions(-) create mode 100644 src/worker.c create mode 100644 src/worker.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a92847b1..7d1cab4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ add_executable(blocks WIN32 src/shader.c src/sky.c src/voxel.c + src/worker.c src/world.c ) set_target_properties(blocks PROPERTIES C_STANDARD 11) diff --git a/src/camera.c b/src/camera.c index 21fcdbb2..7ebc920d 100644 --- a/src/camera.c +++ b/src/camera.c @@ -251,7 +251,7 @@ void Camera_GetVector(const Camera* camera, float* x, float* y, float* z) *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * cp; } -bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float width, float height, float depth) +bool Camera_IsVisible(const Camera* camera, float x, float y, float z, float width, float height, float depth) { float max_x = x + width; float max_y = y + height; diff --git a/src/camera.h b/src/camera.h index d008342c..e749a685 100644 --- a/src/camera.h +++ b/src/camera.h @@ -42,4 +42,4 @@ void Camera_Move(Camera* camera, float right, float up, float forward); void Camera_Resize(Camera* camera, int width, int height); void Camera_Rotate(Camera* camera, float pitch, float yaw); void Camera_GetVector(const Camera* camera, float* x, float* y, float* z); -bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float width, float height, float depth); +bool Camera_IsVisible(const Camera* camera, float x, float y, float z, float width, float height, float depth); diff --git a/src/worker.c b/src/worker.c new file mode 100644 index 00000000..01c9fa17 --- /dev/null +++ b/src/worker.c @@ -0,0 +1,90 @@ +#include + +#include "worker.h" + +static int Run(void* args) +{ + Worker* worker = args; + while (true) + { + SDL_LockMutex(worker->mutex); + while (!worker->task && !worker->quit) + { + SDL_WaitCondition(worker->condition, worker->mutex); + } + if (worker->quit) + { + SDL_UnlockMutex(worker->mutex); + return 0; + } + WorkerTask task = worker->task; + void* data = worker->data; + SDL_UnlockMutex(worker->mutex); + task(data); + SDL_LockMutex(worker->mutex); + worker->task = NULL; + worker->data = NULL; + SDL_SignalCondition(worker->condition); + SDL_UnlockMutex(worker->mutex); + } +} + +void Worker_Init(Worker* worker) +{ + worker->task = NULL; + worker->data = NULL; + worker->quit = false; + worker->mutex = SDL_CreateMutex(); + if (!worker->mutex) + { + SDL_Log("Failed to create mutex: %s", SDL_GetError()); + } + worker->condition = SDL_CreateCondition(); + if (!worker->condition) + { + SDL_Log("Failed to create condition variable: %s", SDL_GetError()); + } + worker->thread = SDL_CreateThread(Run, "worker", worker); + if (!worker->thread) + { + SDL_Log("Failed to create thread: %s", SDL_GetError()); + } +} + +void Worker_Free(Worker* worker) +{ + SDL_LockMutex(worker->mutex); + while (worker->task) + { + SDL_WaitCondition(worker->condition, worker->mutex); + } + worker->quit = true; + SDL_SignalCondition(worker->condition); + SDL_UnlockMutex(worker->mutex); + SDL_WaitThread(worker->thread, NULL); + SDL_DestroyMutex(worker->mutex); + SDL_DestroyCondition(worker->condition); + worker->thread = NULL; + worker->mutex = NULL; + worker->condition = NULL; +} + +bool Worker_IsBusy(Worker* worker) +{ + SDL_LockMutex(worker->mutex); + bool busy = worker->task != NULL; + SDL_UnlockMutex(worker->mutex); + return busy; +} + +void Worker_Dispatch(Worker* worker, WorkerTask task, void* data) +{ + SDL_assert(!Worker_IsBusy(worker)); + SDL_LockMutex(worker->mutex); + SDL_assert(!worker->task); + SDL_assert(!worker->quit); + worker->task = task; + worker->data = data; + SDL_SignalCondition(worker->condition); + SDL_UnlockMutex(worker->mutex); +} diff --git a/src/worker.h b/src/worker.h new file mode 100644 index 00000000..01f1733a --- /dev/null +++ b/src/worker.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +typedef void (*WorkerTask)(void* data); + +typedef struct Worker +{ + SDL_Thread* thread; + SDL_Mutex* mutex; + SDL_Condition* condition; + WorkerTask task; + void* data; + bool quit; +} Worker; + +void Worker_Init(Worker* worker); +void Worker_Free(Worker* worker); +bool Worker_IsBusy(Worker* worker); +void Worker_Dispatch(Worker* worker, WorkerTask task, void* data); diff --git a/src/world.c b/src/world.c index a34a185b..326a84a7 100644 --- a/src/world.c +++ b/src/world.c @@ -7,6 +7,7 @@ #include "save.h" #include "voxel.h" #include "voxel.inc" +#include "worker.h" #include "world.h" #define WORKERS 4 @@ -15,8 +16,6 @@ static const Uint32 MAX_INDICES = CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_WIDTH * DIR typedef enum JobType { - JOB_TYPE_NONE, - JOB_TYPE_QUIT, JOB_TYPE_BLOCKS, JOB_TYPE_VOXELS, JOB_TYPE_LIGHTS, @@ -43,15 +42,13 @@ typedef struct Job int z; } Job; -typedef struct Worker +typedef struct WorldWorker { - SDL_Thread* thread; - SDL_Mutex* mutex; - SDL_Condition* condition; + Worker worker; Job job; CPUBuffer voxels[MESH_TYPE_COUNT]; CPUBuffer lights; -} Worker; +} WorldWorker; typedef struct Chunk { @@ -78,7 +75,7 @@ typedef struct Chunk static SDL_GPUDevice* device; static int world_x; static int world_z; -static Worker workers[WORKERS]; +static WorldWorker workers[WORKERS]; static GPUBuffer gpu_indices; static GPUBuffer gpu_empty_lights; static CPUBuffer cpu_voxels[MESH_TYPE_COUNT]; @@ -518,120 +515,37 @@ static void GenerateIndices() CPUBuffer_Free(&indices); } -static int WorkerFunction(void* args) +static void RunJob(void* data) { - Worker* worker = args; - while (true) + WorldWorker* worker = data; + Job job = worker->job; + Chunk* chunk = GetChunk(job.x, job.z); + SDL_assert(chunk); + if (job.type == JOB_TYPE_BLOCKS) { - SDL_LockMutex(worker->mutex); - while (worker->job.type == JOB_TYPE_NONE) - { - SDL_WaitCondition(worker->condition, worker->mutex); - } - Job job = worker->job; - SDL_UnlockMutex(worker->mutex); - if (job.type != JOB_TYPE_QUIT) - { - Chunk* chunk = GetChunk(job.x, job.z); - SDL_assert(chunk); - if (job.type == JOB_TYPE_BLOCKS) - { - GenerateChunkBlocks(chunk); - } - else - { - Chunk* chunks[3][3]; - GetNeighborhood(job.x, job.z, chunks); - if (job.type == JOB_TYPE_VOXELS) - { - GenerateChunkVoxels(chunks, worker->voxels); - } - else if (job.type == JOB_TYPE_LIGHTS) - { - GenerateChunkLights(chunks, &worker->lights); - } - else - { - SDL_assert(false); - } - } - } - SDL_LockMutex(worker->mutex); - SDL_assert(worker->job.type != JOB_TYPE_NONE); - worker->job.type = JOB_TYPE_NONE; - SDL_SignalCondition(worker->condition); - SDL_UnlockMutex(worker->mutex); - if (job.type == JOB_TYPE_QUIT) - { - return 0; - } - } - return 0; -} - -static bool IsWorkerBusy(const Worker* worker) -{ - SDL_LockMutex(worker->mutex); - bool running = worker->job.type != JOB_TYPE_NONE; - SDL_UnlockMutex(worker->mutex); - return running; -} - -static void DispatchJob(Worker* worker, const Job* job) -{ - SDL_LockMutex(worker->mutex); - SDL_assert(worker->job.type == JOB_TYPE_NONE); - worker->job = *job; - SDL_SignalCondition(worker->condition); - SDL_UnlockMutex(worker->mutex); -} - -static void StartWorker(Worker* worker) -{ - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) - { - CPUBuffer_Init(&worker->voxels[mesh_index], device, sizeof(Voxel)); + GenerateChunkBlocks(chunk); + return; } - CPUBuffer_Init(&worker->lights, device, sizeof(Light)); - worker->mutex = SDL_CreateMutex(); - if (!worker->mutex) + Chunk* chunks[3][3]; + GetNeighborhood(job.x, job.z, chunks); + if (job.type == JOB_TYPE_VOXELS) { - SDL_Log("Failed to create mutex: %s", SDL_GetError()); + GenerateChunkVoxels(chunks, worker->voxels); } - worker->condition = SDL_CreateCondition(); - if (!worker->condition) + else if (job.type == JOB_TYPE_LIGHTS) { - SDL_Log("Failed to create condition variable: %s", SDL_GetError()); + GenerateChunkLights(chunks, &worker->lights); } - worker->thread = SDL_CreateThread(WorkerFunction, "worker", worker); - if (!worker->thread) + else { - SDL_Log("Failed to create thread: %s", SDL_GetError()); + SDL_assert(false); } } -static void StopWorker(Worker* worker) +static void DispatchJob(WorldWorker* worker, Job job) { - SDL_LockMutex(worker->mutex); - while (worker->job.type != JOB_TYPE_NONE) - { - SDL_WaitCondition(worker->condition, worker->mutex); - } - SDL_UnlockMutex(worker->mutex); - Job job = {0}; - job.type = JOB_TYPE_QUIT; - DispatchJob(worker, &job); - SDL_WaitThread(worker->thread, NULL); - SDL_DestroyMutex(worker->mutex); - SDL_DestroyCondition(worker->condition); - worker->thread = NULL; - worker->mutex = NULL; - worker->condition = NULL; - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) - { - CPUBuffer_Free(&worker->voxels[mesh_index]); - } - CPUBuffer_Free(&worker->lights); + worker->job = job; + Worker_Dispatch(&worker->worker, RunJob, worker); } static int SortFunction(void* userdata, const void* lhs, const void* rhs) @@ -665,7 +579,13 @@ void World_Init(SDL_GPUDevice* gpu_device) } for (int worker_index = 0; worker_index < WORKERS; worker_index++) { - StartWorker(&workers[worker_index]); + WorldWorker* worker = &workers[worker_index]; + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + { + CPUBuffer_Init(&worker->voxels[mesh_index], device, sizeof(Voxel)); + } + CPUBuffer_Init(&worker->lights, device, sizeof(Light)); + Worker_Init(&worker->worker); } for (int x = 0; x < WORLD_WIDTH; x++) { @@ -685,7 +605,13 @@ void World_Free() { for (int worker_index = 0; worker_index < WORKERS; worker_index++) { - StopWorker(&workers[worker_index]); + WorldWorker* worker = &workers[worker_index]; + Worker_Free(&worker->worker); + for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + { + CPUBuffer_Free(&worker->voxels[mesh_index]); + } + CPUBuffer_Free(&worker->lights); } for (int x = 0; x < WORLD_WIDTH; x++) { @@ -702,12 +628,12 @@ void World_Free() } } -static int GetIdleWorkers(Worker* idle_workers[WORKERS]) +static int GetIdleWorkers(WorldWorker* idle_workers[WORKERS]) { int idle_count = 0; for (int worker_index = 0; worker_index < WORKERS; worker_index++) { - if (!IsWorkerBusy(&workers[worker_index])) + if (!Worker_IsBusy(&workers[worker_index].worker)) { idle_workers[idle_count++] = &workers[worker_index]; } @@ -770,7 +696,7 @@ static bool MoveChunks(const Camera* camera) { return false; } - Worker* idle_workers[WORKERS]; + WorldWorker* idle_workers[WORKERS]; if (GetIdleWorkers(idle_workers) != WORKERS) { return true; @@ -779,7 +705,7 @@ static bool MoveChunks(const Camera* camera) return false; } -static bool TryUpdateBlocks(int x, int z, Worker* worker) +static bool TryUpdateBlocks(int x, int z, WorldWorker* worker) { SDL_assert(IsChunkLocal(x, z)); Chunk* chunk = chunks[x][z]; @@ -789,11 +715,11 @@ static bool TryUpdateBlocks(int x, int z, Worker* worker) } Job job = {JOB_TYPE_BLOCKS, x, z}; SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_RUNNING); - DispatchJob(worker, &job); + DispatchJob(worker, job); return true; } -static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) +static bool TryUpdateVoxelsOrLights(int x, int z, WorldWorker* worker) { SDL_assert(IsChunkLocal(x, z)); Chunk* chunk = chunks[x][z]; @@ -834,7 +760,7 @@ static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) { SDL_assert(false); } - DispatchJob(worker, &job); + DispatchJob(worker, job); return true; } @@ -844,7 +770,7 @@ void World_Update(const Camera* camera) { return; } - Worker* idle_workers[WORKERS] = {0}; + WorldWorker* idle_workers[WORKERS] = {0}; int idle_count = GetIdleWorkers(idle_workers); for (int x = 0; x < WORLD_WIDTH; x++) { @@ -856,7 +782,7 @@ void World_Update(const Camera* camera) } int chunk_x = sorted_chunks[x][z][0]; int chunk_z = sorted_chunks[x][z][1]; - Worker* worker = idle_workers[idle_count - 1]; + WorldWorker* worker = idle_workers[idle_count - 1]; if (TryUpdateBlocks(chunk_x, chunk_z, worker)) { idle_count--; @@ -928,7 +854,7 @@ void World_Render( { continue; } - if (!Camera_GetVisibility(camera, chunk->x, 0.0f, chunk->z, CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_WIDTH)) + if (!Camera_IsVisible(camera, chunk->x, 0.0f, chunk->z, CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_WIDTH)) { continue; } From bba774d8cb1fc792542b0220fc1283eb3b4681bd Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 20:39:28 -0400 Subject: [PATCH 30/39] refactor --- src/world.c | 218 +++++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 115 deletions(-) diff --git a/src/world.c b/src/world.c index 326a84a7..f85da770 100644 --- a/src/world.c +++ b/src/world.c @@ -80,7 +80,7 @@ static GPUBuffer gpu_indices; static GPUBuffer gpu_empty_lights; static CPUBuffer cpu_voxels[MESH_TYPE_COUNT]; static Chunk* chunks[WORLD_WIDTH][WORLD_WIDTH]; -static int sorted_chunks[WORLD_WIDTH][WORLD_WIDTH][2]; +static int sorted_chunks[WORLD_WIDTH * WORLD_WIDTH][2]; static bool IsBlockLocal(int bx, int by, int bz) { @@ -164,7 +164,9 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) WorldToChunk(chunk, &bx, &by, &bz); Block old_block = chunk->blocks[bx][by][bz]; chunk->blocks[bx][by][bz] = block; - if (!Block_IsLight(block) && !Block_IsLight(old_block)) + bool is_light = Block_IsLight(block); + bool was_light = Block_IsLight(old_block); + if (!is_light && !was_light) { return old_block; } @@ -179,7 +181,7 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) break; } } - if (Block_IsLight(block)) + if (is_light) { if (light_index < 0) { @@ -245,30 +247,32 @@ static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, i { return chunk->blocks[bx][by][bz]; } - SDL_assert(by >= 0 && by < CHUNK_HEIGHT); - bx += chunk->x; - bz += chunk->z; int cx = 1; int cz = 1; - if (bx < chunk->x) + if (bx < 0) { - cx--; + cx = 0; + bx += CHUNK_WIDTH; } - else if (bx >= chunk->x + CHUNK_WIDTH) + else if (bx >= CHUNK_WIDTH) { - cx++; + cx = 2; + bx -= CHUNK_WIDTH; } - if (bz < chunk->z) + if (bz < 0) { - cz--; + cz = 0; + bz += CHUNK_WIDTH; } - else if (bz >= chunk->z + CHUNK_WIDTH) + else if (bz >= CHUNK_WIDTH) { - cz++; + cz = 2; + bz -= CHUNK_WIDTH; } Chunk* neighbor = chunks[cx][cz]; SDL_assert(neighbor); - return GetChunkBlock(neighbor, bx, by, bz); + SDL_assert(SDL_GetAtomicInt(&neighbor->block_state) == JOB_STATE_COMPLETED); + return neighbor->blocks[bx][by][bz]; } static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) @@ -380,10 +384,6 @@ static void GenerateChunkBlocks(Chunk* chunk) Save_GetBlocks(chunk, chunk->x, chunk->z, SetChunkBlockFunction); SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_COMPLETED); - if (SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED) - { - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); - } } static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_COUNT]) @@ -476,7 +476,7 @@ static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); } -static void GenerateLights() +static void GenerateEmptyLightBuffer() { CPUBuffer lights; CPUBuffer_Init(&lights, device, sizeof(Light)); @@ -492,7 +492,7 @@ static void GenerateLights() CPUBuffer_Free(&lights); } -static void GenerateIndices() +static void GenerateIndexBuffer() { CPUBuffer indices; CPUBuffer_Init(&indices, device, sizeof(Uint32)); @@ -592,13 +592,14 @@ void World_Init(SDL_GPUDevice* gpu_device) for (int z = 0; z < WORLD_WIDTH; z++) { chunks[x][z] = CreateChunk(); - sorted_chunks[x][z][0] = x; - sorted_chunks[x][z][1] = z; + int index = x * WORLD_WIDTH + z; + sorted_chunks[index][0] = x; + sorted_chunks[index][1] = z; } } SDL_qsort_r(sorted_chunks, WORLD_WIDTH * WORLD_WIDTH, sizeof(int) * 2, SortFunction, NULL); - GenerateLights(); - GenerateIndices(); + GenerateEmptyLightBuffer(); + GenerateIndexBuffer(); } void World_Free() @@ -690,8 +691,8 @@ static void Shuffle(int offset_x, int offset_z) static bool MoveChunks(const Camera* camera) { - const int offset_x = camera->x / CHUNK_WIDTH - WORLD_WIDTH / 2 - world_x; - const int offset_z = camera->z / CHUNK_WIDTH - WORLD_WIDTH / 2 - world_z; + const int offset_x = FloorChunkIndex(camera->x) - WORLD_WIDTH / 2 - world_x; + const int offset_z = FloorChunkIndex(camera->z) - WORLD_WIDTH / 2 - world_z; if (!offset_x && !offset_z) { return false; @@ -705,60 +706,59 @@ static bool MoveChunks(const Camera* camera) return false; } -static bool TryUpdateBlocks(int x, int z, WorldWorker* worker) +static bool IsNeighborhoodReady(Chunk* neighborhood[3][3]) { - SDL_assert(IsChunkLocal(x, z)); - Chunk* chunk = chunks[x][z]; - if (SDL_GetAtomicInt(&chunk->block_state) != JOB_STATE_REQUESTED) + for (int x = 0; x < 3; x++) { - return false; + for (int z = 0; z < 3; z++) + { + if (SDL_GetAtomicInt(&neighborhood[x][z]->block_state) != JOB_STATE_COMPLETED) + { + return false; + } + } } - Job job = {JOB_TYPE_BLOCKS, x, z}; - SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_RUNNING); - DispatchJob(worker, job); return true; } -static bool TryUpdateVoxelsOrLights(int x, int z, WorldWorker* worker) +static bool TryDispatchJob(int x, int z, WorldWorker* worker) { SDL_assert(IsChunkLocal(x, z)); Chunk* chunk = chunks[x][z]; - if (IsChunkOnBorder(x, z)) + Job job = {.x = x, .z = z}; + if (SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_REQUESTED) { - return false; + job.type = JOB_TYPE_BLOCKS; + SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_RUNNING); } - bool needs_voxels = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED; - bool needs_lights = SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED; - if (!needs_voxels && !needs_lights) - { - return false; - } - Chunk* neighborhood[3][3]; - GetNeighborhood(x, z, neighborhood); - for (int neighbor_x = 0; neighbor_x < 3; neighbor_x++) + else { - for (int neighbor_z = 0; neighbor_z < 3; neighbor_z++) + if (IsChunkOnBorder(x, z)) { - if (SDL_GetAtomicInt(&neighborhood[neighbor_x][neighbor_z]->block_state) != JOB_STATE_COMPLETED) - { - return false; - } + return false; + } + bool needs_voxels = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED; + bool needs_lights = SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED; + if (!needs_voxels && !needs_lights) + { + return false; + } + Chunk* neighborhood[3][3]; + GetNeighborhood(x, z, neighborhood); + if (!IsNeighborhoodReady(neighborhood)) + { + return false; + } + if (needs_voxels) + { + job.type = JOB_TYPE_VOXELS; + SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_RUNNING); + } + else + { + job.type = JOB_TYPE_LIGHTS; + SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_RUNNING); } - } - Job job; - if (needs_voxels) - { - job = (Job){JOB_TYPE_VOXELS, x, z}; - SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_RUNNING); - } - else if (needs_lights) - { - job = (Job){JOB_TYPE_LIGHTS, x, z}; - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_RUNNING); - } - else - { - SDL_assert(false); } DispatchJob(worker, job); return true; @@ -772,25 +772,18 @@ void World_Update(const Camera* camera) } WorldWorker* idle_workers[WORKERS] = {0}; int idle_count = GetIdleWorkers(idle_workers); - for (int x = 0; x < WORLD_WIDTH; x++) + for (int index = 0; index < WORLD_WIDTH * WORLD_WIDTH; index++) { - for (int z = 0; z < WORLD_WIDTH; z++) + if (idle_count == 0) { - if (idle_count == 0) - { - return; - } - int chunk_x = sorted_chunks[x][z][0]; - int chunk_z = sorted_chunks[x][z][1]; - WorldWorker* worker = idle_workers[idle_count - 1]; - if (TryUpdateBlocks(chunk_x, chunk_z, worker)) - { - idle_count--; - } - else if (TryUpdateVoxelsOrLights(chunk_x, chunk_z, worker)) - { - idle_count--; - } + return; + } + int chunk_x = sorted_chunks[index][0]; + int chunk_z = sorted_chunks[index][1]; + WorldWorker* worker = idle_workers[idle_count - 1]; + if (TryDispatchJob(chunk_x, chunk_z, worker)) + { + idle_count--; } } } @@ -839,47 +832,44 @@ void World_Render( { SDL_PushGPUVertexUniformData(command_buffer, 0, camera->proj, sizeof(camera->proj)); SDL_PushGPUVertexUniformData(command_buffer, 1, camera->view, sizeof(camera->view)); - for (int x = 0; x < WORLD_WIDTH; x++) + for (int index = 0; index < WORLD_WIDTH * WORLD_WIDTH; index++) { - for (int z = 0; z < WORLD_WIDTH; z++) + int chunk_x = sorted_chunks[index][0]; + int chunk_z = sorted_chunks[index][1]; + if (IsChunkOnBorder(chunk_x, chunk_z)) { - int chunk_x = sorted_chunks[x][z][0]; - int chunk_z = sorted_chunks[x][z][1]; - if (IsChunkOnBorder(chunk_x, chunk_z)) - { - continue; - } - Chunk* chunk = chunks[chunk_x][chunk_z]; - if (SDL_GetAtomicInt(&chunk->voxel_state) != JOB_STATE_COMPLETED) - { - continue; - } - if (!Camera_IsVisible(camera, chunk->x, 0.0f, chunk->z, CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_WIDTH)) - { - continue; - } - Render(chunk, command_buffer, render_pass, flags); + continue; + } + Chunk* chunk = chunks[chunk_x][chunk_z]; + if (SDL_GetAtomicInt(&chunk->voxel_state) != JOB_STATE_COMPLETED) + { + continue; + } + if (!Camera_IsVisible(camera, chunk->x, 0.0f, chunk->z, CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_WIDTH)) + { + continue; } + Render(chunk, command_buffer, render_pass, flags); } } -static Chunk* GetWorldChunk(const int position[3], int* chunk_x, int* chunk_z) +static Chunk* GetWorldChunk(const int position[3]) { if (position[1] < 0 || position[1] >= CHUNK_HEIGHT) { return NULL; } - *chunk_x = FloorChunkIndex(position[0] - world_x * CHUNK_WIDTH); - *chunk_z = FloorChunkIndex(position[2] - world_z * CHUNK_WIDTH); - Chunk* chunk = GetChunk(*chunk_x, *chunk_z); + int chunk_x = FloorChunkIndex(position[0] - world_x * CHUNK_WIDTH); + int chunk_z = FloorChunkIndex(position[2] - world_z * CHUNK_WIDTH); + Chunk* chunk = GetChunk(chunk_x, chunk_z); if (chunk) { - SDL_assert(chunk->x == (world_x + *chunk_x) * CHUNK_WIDTH); - SDL_assert(chunk->z == (world_z + *chunk_z) * CHUNK_WIDTH); + SDL_assert(chunk->x == (world_x + chunk_x) * CHUNK_WIDTH); + SDL_assert(chunk->z == (world_z + chunk_z) * CHUNK_WIDTH); } else { - SDL_Log("Bad chunk position: %d, %d", *chunk_x, *chunk_z); + SDL_Log("Bad chunk position: %d, %d", chunk_x, chunk_z); return NULL; } bool has_blocks = SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED; @@ -893,21 +883,19 @@ static Chunk* GetWorldChunk(const int position[3], int* chunk_x, int* chunk_z) Block World_GetBlock(const int position[3]) { - int chunk_x; - int chunk_z; - Chunk* chunk = GetWorldChunk(position, &chunk_x, &chunk_z); + Chunk* chunk = GetWorldChunk(position); return chunk ? GetChunkBlock(chunk, position[0], position[1], position[2]) : BLOCK_EMPTY; } void World_SetBlock(const int position[3], Block block) { - int chunk_x; - int chunk_z; - Chunk* chunk = GetWorldChunk(position, &chunk_x, &chunk_z); + Chunk* chunk = GetWorldChunk(position); if (!chunk) { return; } + int chunk_x = chunk->x / CHUNK_WIDTH - world_x; + int chunk_z = chunk->z / CHUNK_WIDTH - world_z; Save_SetBlock(chunk->x, chunk->z, position[0], position[1], position[2], block); int local_x = position[0]; int local_y = position[1]; From 2cd0d38219ed495f25c33f6934d8292095c18db0 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 21:32:29 -0400 Subject: [PATCH 31/39] next --- .clang-format | 18 -- .vscode/settings.json | 11 - shaders/shader.hlsl | 13 +- src/block.c | 511 +++++++++++++++++++++--------------------- src/camera.c | 18 +- src/direction.h | 15 +- src/player.c | 19 +- src/voxel.c | 58 ++--- src/voxel.h | 8 +- src/voxel.inc | 52 ++--- src/world.c | 80 +++---- 11 files changed, 385 insertions(+), 418 deletions(-) delete mode 100644 .clang-format diff --git a/.clang-format b/.clang-format deleted file mode 100644 index 15c009f8..00000000 --- a/.clang-format +++ /dev/null @@ -1,18 +0,0 @@ -BasedOnStyle: Microsoft -AlignAfterOpenBracket: AlwaysBreak -AlwaysBreakBeforeMultilineStrings: true -AllowAllArgumentsOnNextLine: false -AllowAllParametersOfDeclarationOnNextLine: false -BreakBeforeBraces: Allman -BreakStringLiterals: false -BinPackArguments: false -BinPackParameters: false -ColumnLimit: 120 -Cpp11BracedListStyle: true -IndentWidth: 4 -MaxEmptyLinesToKeep: 1 -PointerAlignment: Left -SortIncludes: Never -UseTab: Never -BracedInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 diff --git a/.vscode/settings.json b/.vscode/settings.json index aaa3d67e..a77dade8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,14 +1,3 @@ { - "[c][cpp]": { - "editor.defaultFormatter": "ms-vscode.cpptools" - }, - "C_Cpp.clang_format_style": "file", "cmake.parallelJobs": 8, - "editor.formatOnSave": true, - "files.associations": { - "*.frag": "cpp", - "*.hlsl": "cpp", - "*.inc": "cpp", - "*.vert": "cpp" - } } \ No newline at end of file diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 84caa98b..c61ca62c 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -65,25 +65,22 @@ static const float kAO[4] = {0.4f, 0.6f, 0.8f, 1.0f}; float GetOcclusion(uint voxel) { - return kAO[(voxel >> VOXEL_AO_OFFSET) & VOXEL_AO_MASK]; + return kAO[(voxel >> AO_OFFSET) & AO_MASK]; } uint GetDirection(uint voxel) { - return (voxel >> VOXEL_DIRECTION_OFFSET) & VOXEL_DIRECTION_MASK; + return (voxel >> DIRECTION_OFFSET) & DIRECTION_MASK; } uint GetBlockIndex(uint voxel) { - return (voxel >> VOXEL_BLOCK_OFFSET) & VOXEL_BLOCK_MASK; + return (voxel >> BLOCK_OFFSET) & BLOCK_MASK; } float3 GetPosition(uint voxel) { - return float3( - (voxel >> VOXEL_X_OFFSET) & VOXEL_X_MASK, - (voxel >> VOXEL_Y_OFFSET) & VOXEL_Y_MASK, - (voxel >> VOXEL_Z_OFFSET) & VOXEL_Z_MASK); + return float3((voxel >> X_OFFSET) & X_MASK, (voxel >> Y_OFFSET) & Y_MASK, (voxel >> Z_OFFSET) & Z_MASK); } uint GetAtlasIndex(uint voxel, Block block) @@ -93,7 +90,7 @@ uint GetAtlasIndex(uint voxel, Block block) float2 GetTexcoord(uint voxel) { - return float2((voxel >> VOXEL_U_OFFSET) & VOXEL_U_MASK, (voxel >> VOXEL_V_OFFSET) & VOXEL_V_MASK); + return float2((voxel >> U_OFFSET) & U_MASK, (voxel >> V_OFFSET) & V_MASK); } float3 GetNormal(uint voxel) diff --git a/src/block.c b/src/block.c index 9c32592e..cb2bb504 100644 --- a/src/block.c +++ b/src/block.c @@ -1,3 +1,5 @@ +#include + #include "block.h" #include "buffer.h" #include "direction.h" @@ -15,283 +17,284 @@ typedef struct BlockData Uint32 indices[DIRECTION_COUNT]; } BlockData; -static const BlockData BLOCKS[BLOCK_COUNT] = { +static const BlockData BLOCKS[BLOCK_COUNT] = +{ [BLOCK_EMPTY] = - { - .is_opaque = false, - .is_solid = false, - .is_sprite = false, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = false, - .sun_intensity = 0.0f, - .light = {0}, - .indices = {0}, - }, + { + .is_opaque = false, + .is_solid = false, + .is_sprite = false, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = false, + .sun_intensity = 0.0f, + .light = {0}, + .indices = {0}, + }, [BLOCK_GRASS] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {2, 2, 2, 2, 1, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {2, 2, 2, 2, 1, 3}, + }, [BLOCK_DIRT] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {3, 3, 3, 3, 3, 3}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {3, 3, 3, 3, 3, 3}, + }, [BLOCK_SAND] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {5, 5, 5, 5, 5, 5}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {5, 5, 5, 5, 5, 5}, + }, [BLOCK_SNOW] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {6, 6, 6, 6, 6, 6}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {6, 6, 6, 6, 6, 6}, + }, [BLOCK_STONE] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {4, 4, 4, 4, 4, 4}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {4, 4, 4, 4, 4, 4}, + }, [BLOCK_LOG] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {8, 8, 8, 8, 7, 7}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {8, 8, 8, 8, 7, 7}, + }, [BLOCK_LEAVES] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {10, 10, 10, 10, 10, 10}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {10, 10, 10, 10, 10, 10}, + }, [BLOCK_CLOUD] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = false, - .can_be_in_shadow = false, - .sun_intensity = 1.0f, - .light = {0}, - .indices = {9, 9, 9, 9, 9, 9}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = false, + .can_be_in_shadow = false, + .sun_intensity = 1.0f, + .light = {0}, + .indices = {9, 9, 9, 9, 9, 9}, + }, [BLOCK_BUSH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {15, 15, 15, 15, 15, 15}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {15, 15, 15, 15, 15, 15}, + }, [BLOCK_BLUEBELL] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {13, 13, 13, 13, 13, 13}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {13, 13, 13, 13, 13, 13}, + }, [BLOCK_GARDENIA] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {12, 12, 12, 12, 12, 12}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {12, 12, 12, 12, 12, 12}, + }, [BLOCK_ROSE] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {11, 11, 11, 11, 11, 11}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {11, 11, 11, 11, 11, 11}, + }, [BLOCK_LAVENDER] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {14, 14, 14, 14, 14, 14}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {14, 14, 14, 14, 14, 14}, + }, [BLOCK_WATER] = - { - .is_opaque = false, - .is_solid = false, - .is_sprite = false, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {16, 16, 16, 16, 16, 16}, - }, + { + .is_opaque = false, + .is_solid = false, + .is_sprite = false, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {16, 16, 16, 16, 16, 16}, + }, [BLOCK_RED_TORCH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {236, 39, 63, 15}, - .indices = {17, 17, 17, 17, 17, 17}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {236, 39, 63, 15}, + .indices = {17, 17, 17, 17, 17, 17}, + }, [BLOCK_GREEN_TORCH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {90, 181, 82, 15}, - .indices = {18, 18, 18, 18, 18, 18}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {90, 181, 82, 15}, + .indices = {18, 18, 18, 18, 18, 18}, + }, [BLOCK_BLUE_TORCH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {51, 136, 222, 15}, - .indices = {19, 19, 19, 19, 19, 19}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {51, 136, 222, 15}, + .indices = {19, 19, 19, 19, 19, 19}, + }, [BLOCK_YELLOW_TORCH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {243, 168, 51, 15}, - .indices = {20, 20, 20, 20, 20, 20}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {243, 168, 51, 15}, + .indices = {20, 20, 20, 20, 20, 20}, + }, [BLOCK_CYAN_TORCH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {54, 197, 244, 15}, - .indices = {21, 21, 21, 21, 21, 21}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {54, 197, 244, 15}, + .indices = {21, 21, 21, 21, 21, 21}, + }, [BLOCK_MAGENTA_TORCH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {250, 110, 121, 15}, - .indices = {22, 22, 22, 22, 22, 22}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {250, 110, 121, 15}, + .indices = {22, 22, 22, 22, 22, 22}, + }, [BLOCK_WHITE_TORCH] = - { - .is_opaque = true, - .is_solid = false, - .is_sprite = true, - .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {255, 255, 255, 15}, - .indices = {23, 23, 23, 23, 23, 23}, - }, + { + .is_opaque = true, + .is_solid = false, + .is_sprite = true, + .is_occluded = false, + .can_create_shadow = false, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {255, 255, 255, 15}, + .indices = {23, 23, 23, 23, 23, 23}, + }, [BLOCK_PLANKS] = - { - .is_opaque = true, - .is_solid = true, - .is_sprite = false, - .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, - .sun_intensity = 0.55f, - .light = {0}, - .indices = {24, 24, 24, 24, 24, 24}, - }, + { + .is_opaque = true, + .is_solid = true, + .is_sprite = false, + .is_occluded = true, + .can_create_shadow = true, + .can_be_in_shadow = true, + .sun_intensity = 0.55f, + .light = {0}, + .indices = {24, 24, 24, 24, 24, 24}, + }, }; SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) diff --git a/src/camera.c b/src/camera.c index 7ebc920d..65016ac2 100644 --- a/src/camera.c +++ b/src/camera.c @@ -9,21 +9,17 @@ static void Multiply(float matrix[4][4], float lhs[4][4], float rhs[4][4]) { float c[4][4] = {0}; for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) { - for (int j = 0; j < 4; j++) - { - c[i][j] += lhs[0][j] * rhs[i][0]; - c[i][j] += lhs[1][j] * rhs[i][1]; - c[i][j] += lhs[2][j] * rhs[i][2]; - c[i][j] += lhs[3][j] * rhs[i][3]; - } + c[i][j] += lhs[0][j] * rhs[i][0]; + c[i][j] += lhs[1][j] * rhs[i][1]; + c[i][j] += lhs[2][j] * rhs[i][2]; + c[i][j] += lhs[3][j] * rhs[i][3]; } for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) { - for (int j = 0; j < 4; j++) - { - matrix[i][j] = c[i][j]; - } + matrix[i][j] = c[i][j]; } } diff --git a/src/direction.h b/src/direction.h index 87136a2e..b8f41ba9 100644 --- a/src/direction.h +++ b/src/direction.h @@ -11,11 +11,12 @@ typedef enum Direction DIRECTION_COUNT, } Direction; -static const int DIRECTIONS[DIRECTION_COUNT][3] = { - [DIRECTION_NORTH] = {0, 0, 1}, // +Z - [DIRECTION_SOUTH] = {0, 0, -1}, // -Z - [DIRECTION_EAST] = {1, 0, 0}, // +X - [DIRECTION_WEST] = {-1, 0, 0}, // -X - [DIRECTION_UP] = {0, 1, 0}, // +Y - [DIRECTION_DOWN] = {0, -1, 0}, // -Y +static const int DIRECTIONS[DIRECTION_COUNT][3] = +{ + [DIRECTION_NORTH] = { 0, 0, 1 }, + [DIRECTION_SOUTH] = { 0, 0, -1 }, + [DIRECTION_EAST] = { 1, 0, 0 }, + [DIRECTION_WEST] = {-1, 0, 0 }, + [DIRECTION_UP] = { 0, 1, 0 }, + [DIRECTION_DOWN] = { 0, -1, 0 }, }; diff --git a/src/player.c b/src/player.c index 0d4bb6d4..34ae4d34 100644 --- a/src/player.c +++ b/src/player.c @@ -39,17 +39,13 @@ static bool IsColliding(const float position[3]) max[i] = SDL_floorf(position[i] + AABB[1][i] - EPSILON); } for (int bx = min[0]; bx <= max[0]; bx++) + for (int by = min[1]; by <= max[1]; by++) + for (int bz = min[2]; bz <= max[2]; bz++) { - for (int by = min[1]; by <= max[1]; by++) + int block[3] = {bx, by, bz}; + if (Block_IsSolid(World_GetBlock(block))) { - for (int bz = min[2]; bz <= max[2]; bz++) - { - int block[3] = {bx, by, bz}; - if (Block_IsSolid(World_GetBlock(block))) - { - return true; - } - } + return true; } } return false; @@ -170,9 +166,8 @@ void Player_Move(Player* player, float dt) } else { - float blend = SDL_min(1.0f, AIR_ACCELERATION * dt); - player->velocity[0] += (dx - player->velocity[0]) * blend; - player->velocity[2] += (dz - player->velocity[2]) * blend; + player->velocity[0] += (dx - player->velocity[0]) * AIR_ACCELERATION * dt; + player->velocity[2] += (dz - player->velocity[2]) * AIR_ACCELERATION * dt; } if (keys[SDL_SCANCODE_SPACE] && player->is_on_ground) { diff --git a/src/voxel.c b/src/voxel.c index 97eba6ad..3c4b48cc 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -34,36 +34,36 @@ static const int AO[2][4] = {{0, 1, 2, 3}, {1, 3, 0, 2}}; static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction direction, int ao) { - SDL_COMPILE_TIME_ASSERT("", VOXEL_AO_OFFSET + VOXEL_AO_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", VOXEL_X_OFFSET + VOXEL_X_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", VOXEL_Y_OFFSET + VOXEL_Y_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", VOXEL_Z_OFFSET + VOXEL_Z_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", VOXEL_U_OFFSET + VOXEL_U_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", VOXEL_V_OFFSET + VOXEL_V_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", VOXEL_DIRECTION_OFFSET + VOXEL_DIRECTION_BITS <= 32); - SDL_COMPILE_TIME_ASSERT("", VOXEL_BLOCK_OFFSET + VOXEL_BLOCK_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", X_OFFSET + X_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", Y_OFFSET + Y_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", Z_OFFSET + Z_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", U_OFFSET + U_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", V_OFFSET + V_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", DIRECTION_OFFSET + DIRECTION_BITS <= 32); + SDL_COMPILE_TIME_ASSERT("", BLOCK_OFFSET + BLOCK_BITS <= 32); SDL_assert(direction < DIRECTION_COUNT); - SDL_assert(block <= VOXEL_BLOCK_MASK); - SDL_assert(x <= VOXEL_X_MASK); - SDL_assert(y <= VOXEL_Y_MASK); - SDL_assert(z <= VOXEL_Z_MASK); - SDL_assert(u <= VOXEL_U_MASK); - SDL_assert(v <= VOXEL_V_MASK); - SDL_assert(direction <= VOXEL_DIRECTION_MASK); - SDL_assert(ao <= VOXEL_AO_MASK); + SDL_assert(block <= BLOCK_MASK); + SDL_assert(x <= X_MASK); + SDL_assert(y <= Y_MASK); + SDL_assert(z <= Z_MASK); + SDL_assert(u <= U_MASK); + SDL_assert(v <= V_MASK); + SDL_assert(direction <= DIRECTION_MASK); + SDL_assert(ao <= AO_MASK); Voxel voxel = 0; - voxel |= direction << VOXEL_DIRECTION_OFFSET; - voxel |= block << VOXEL_BLOCK_OFFSET; - voxel |= ao << VOXEL_AO_OFFSET; - voxel |= x << VOXEL_X_OFFSET; - voxel |= y << VOXEL_Y_OFFSET; - voxel |= z << VOXEL_Z_OFFSET; - voxel |= u << VOXEL_U_OFFSET; - voxel |= v << VOXEL_V_OFFSET; + voxel |= direction << DIRECTION_OFFSET; + voxel |= block << BLOCK_OFFSET; + voxel |= ao << AO_OFFSET; + voxel |= x << X_OFFSET; + voxel |= y << Y_OFFSET; + voxel |= z << Z_OFFSET; + voxel |= u << U_OFFSET; + voxel |= v << V_OFFSET; return voxel; } -Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int index) +Voxel PackSprite(Block block, int x, int y, int z, Direction direction, int index) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); @@ -71,10 +71,10 @@ Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, in SDL_assert(index < 4); const int* p = SPRITE_POSITIONS[direction][index]; const int* t = TEXCOORDS[direction][index]; - return Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], DIRECTION_UP, VOXEL_AO_MASK); + return Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], DIRECTION_UP, AO_MASK); } -Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao) +Voxel PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); @@ -85,13 +85,13 @@ Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int return Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], direction, ao); } -void Voxel_GetAO(const int ao[4], int order[4]) +void GetAO(const int ao[4], int order[4]) { int index = ao[0] + ao[3] > ao[1] + ao[2]; SDL_memcpy(order, AO[index], sizeof(AO[index])); } -void Voxel_GetPosition(Direction direction, int index, int position[3]) +void GetPosition(Direction direction, int index, int position[3]) { SDL_assert(direction < 6); SDL_memcpy(position, CUBE_POSITIONS[direction][index], sizeof(int) * 3); diff --git a/src/voxel.h b/src/voxel.h index dabd37a5..a7e97897 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -7,7 +7,7 @@ typedef Uint32 Voxel; -Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int index); -Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao); -void Voxel_GetAO(const int ao[4], int order[4]); -void Voxel_GetPosition(Direction direction, int index, int position[3]); +Voxel PackSprite(Block block, int x, int y, int z, Direction direction, int index); +Voxel PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao); +void GetAO(const int ao[4], int order[4]); +void GetPosition(Direction direction, int index, int position[3]); diff --git a/src/voxel.inc b/src/voxel.inc index 5d47a77d..60db64b5 100644 --- a/src/voxel.inc +++ b/src/voxel.inc @@ -1,29 +1,29 @@ -#ifndef VOXEL_INC -#define VOXEL_INC +#ifndef INC +#define INC -#define VOXEL_AO_BITS 2 -#define VOXEL_DIRECTION_BITS 3 -#define VOXEL_BLOCK_BITS 5 -#define VOXEL_X_BITS 5 -#define VOXEL_Y_BITS 8 -#define VOXEL_Z_BITS 5 -#define VOXEL_U_BITS 1 -#define VOXEL_V_BITS 1 -#define VOXEL_DIRECTION_OFFSET (0) -#define VOXEL_BLOCK_OFFSET (VOXEL_DIRECTION_OFFSET + VOXEL_DIRECTION_BITS) -#define VOXEL_AO_OFFSET (VOXEL_BLOCK_OFFSET + VOXEL_BLOCK_BITS) -#define VOXEL_X_OFFSET (VOXEL_AO_OFFSET + VOXEL_AO_BITS) -#define VOXEL_Y_OFFSET (VOXEL_X_OFFSET + VOXEL_X_BITS) -#define VOXEL_Z_OFFSET (VOXEL_Y_OFFSET + VOXEL_Y_BITS) -#define VOXEL_U_OFFSET (VOXEL_Z_OFFSET + VOXEL_Z_BITS) -#define VOXEL_V_OFFSET (VOXEL_U_OFFSET + VOXEL_U_BITS) -#define VOXEL_AO_MASK ((1 << VOXEL_AO_BITS) - 1) -#define VOXEL_DIRECTION_MASK ((1 << VOXEL_DIRECTION_BITS) - 1) -#define VOXEL_BLOCK_MASK ((1 << VOXEL_BLOCK_BITS) - 1) -#define VOXEL_X_MASK ((1 << VOXEL_X_BITS) - 1) -#define VOXEL_Y_MASK ((1 << VOXEL_Y_BITS) - 1) -#define VOXEL_Z_MASK ((1 << VOXEL_Z_BITS) - 1) -#define VOXEL_U_MASK ((1 << VOXEL_U_BITS) - 1) -#define VOXEL_V_MASK ((1 << VOXEL_V_BITS) - 1) +#define AO_BITS 2 +#define DIRECTION_BITS 3 +#define BLOCK_BITS 5 +#define X_BITS 5 +#define Y_BITS 8 +#define Z_BITS 5 +#define U_BITS 1 +#define V_BITS 1 +#define DIRECTION_OFFSET (0) +#define BLOCK_OFFSET (DIRECTION_OFFSET + DIRECTION_BITS) +#define AO_OFFSET (BLOCK_OFFSET + BLOCK_BITS) +#define X_OFFSET (AO_OFFSET + AO_BITS) +#define Y_OFFSET (X_OFFSET + X_BITS) +#define Z_OFFSET (Y_OFFSET + Y_BITS) +#define U_OFFSET (Z_OFFSET + Z_BITS) +#define V_OFFSET (U_OFFSET + U_BITS) +#define AO_MASK ((1 << AO_BITS) - 1) +#define DIRECTION_MASK ((1 << DIRECTION_BITS) - 1) +#define BLOCK_MASK ((1 << BLOCK_BITS) - 1) +#define X_MASK ((1 << X_BITS) - 1) +#define Y_MASK ((1 << Y_BITS) - 1) +#define Z_MASK ((1 << Z_BITS) - 1) +#define U_MASK ((1 << U_BITS) - 1) +#define V_MASK ((1 << V_BITS) - 1) #endif diff --git a/src/world.c b/src/world.c index f85da770..034e8d71 100644 --- a/src/world.c +++ b/src/world.c @@ -53,7 +53,7 @@ typedef struct WorldWorker typedef struct Chunk { SDL_AtomicInt block_state; - SDL_AtomicInt voxel_state; + SDL_AtomicInt state; SDL_AtomicInt light_state; union { @@ -84,18 +84,9 @@ static int sorted_chunks[WORLD_WIDTH * WORLD_WIDTH][2]; static bool IsBlockLocal(int bx, int by, int bz) { - SDL_assert(by >= 0 && by < CHUNK_HEIGHT); - SDL_assert(bx >= -1 && bz >= -1 && bx <= CHUNK_WIDTH && bz <= CHUNK_WIDTH); return bx >= 0 && bz >= 0 && bx < CHUNK_WIDTH && bz < CHUNK_WIDTH; } -static void WorldToChunk(const Chunk* chunk, int* bx, int* by, int* bz) -{ - *bx -= chunk->x; - *bz -= chunk->z; - SDL_assert(IsBlockLocal(*bx, *by, *bz)); -} - static bool IsChunkLocal(int cx, int cz) { return cx >= 0 && cz >= 0 && cx < WORLD_WIDTH && cz < WORLD_WIDTH; @@ -111,21 +102,34 @@ static int FloorChunkIndex(float index) return SDL_floorf(index / CHUNK_WIDTH); } +static void WorldToChunk(const Chunk* chunk, int* bx, int* by, int* bz) +{ + *bx -= chunk->x; + *bz -= chunk->z; + SDL_assert(IsBlockLocal(*bx, *by, *bz)); +} + static Chunk* GetChunk(int cx, int cz) { - return IsChunkLocal(cx, cz) ? chunks[cx][cz] : NULL; + if (IsChunkLocal(cx, cz)) + { + return chunks[cx][cz]; + } + else + { + return NULL; + } } static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) { - for (int x = -1; x <= 1; x++) + for (int i = -1; i <= 1; i++) + for (int j = -1; j <= 1; j++) { - for (int z = -1; z <= 1; z++) - { - Chunk* chunk = GetChunk(cx + x, cz + z); - SDL_assert(chunk); - neighborhood[x + 1][z + 1] = chunk; - } + int x = cx + i; + int z = cz + j; + neighborhood[i + 1][j + 1] = GetChunk(x, z); + SDL_assert(neighborhood[i + 1][j + 1]); } } @@ -137,7 +141,7 @@ static Chunk* CreateChunk() SDL_Log("Failed to allocate chunk"); } SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); - SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_COMPLETED); + SDL_SetAtomicInt(&chunk->state, JOB_STATE_COMPLETED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { @@ -160,7 +164,7 @@ static void FreeChunk(Chunk* chunk) static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) { - SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->state, JOB_STATE_REQUESTED); WorldToChunk(chunk, &bx, &by, &bz); Block old_block = chunk->blocks[bx][by][bz]; chunk->blocks[bx][by][bz] = block; @@ -278,7 +282,7 @@ static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, i static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) { SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->state) == JOB_STATE_RUNNING); bool has_voxels = false; for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { @@ -337,7 +341,7 @@ static bool IsVisible(Block block, Block neighbor) static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction direction, int vertex) { int position[3]; - Voxel_GetPosition(direction, vertex, position); + GetPosition(direction, vertex, position); int side1[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int side2[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int corner[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; @@ -365,7 +369,7 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio bool has_corner = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); if (!has_side1 || !has_side2) { - return VOXEL_AO_MASK - has_side1 - has_side2 - has_corner; + return AO_MASK - has_side1 - has_side2 - has_corner; } else { @@ -376,7 +380,7 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio static void GenerateChunkBlocks(Chunk* chunk) { SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); - SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED); + SDL_assert(SDL_GetAtomicInt(&chunk->state) == JOB_STATE_REQUESTED); SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED); SDL_memset(chunk->blocks, 0, sizeof(chunk->blocks)); chunk->light_size = 0; @@ -390,7 +394,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ { Chunk* chunk = chunks[1][1]; SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->state) == JOB_STATE_RUNNING); for (int bx = 0; bx < CHUNK_WIDTH; bx++) { for (int by = 0; by < CHUNK_HEIGHT; by++) @@ -408,7 +412,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ { for (int vertex = 0; vertex < 4; vertex++) { - Voxel voxel = Voxel_PackSprite(block, bx, by, bz, direction, vertex); + Voxel voxel = PackSprite(block, bx, by, bz, direction, vertex); CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); } } @@ -431,11 +435,11 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ ao[i] = GetAO(chunks, bx, by, bz, direction, i); } int order[4]; - Voxel_GetAO(ao, order); + GetAO(ao, order); for (int i = 0; i < 4; i++) { int index = order[i]; - Voxel voxel = Voxel_PackCube(block, bx, by, bz, direction, index, ao[index]); + Voxel voxel = PackCube(block, bx, by, bz, direction, index, ao[index]); CPUBuffer_Append(&voxels[mesh_type], &voxel); } } @@ -443,7 +447,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ } } UploadVoxels(chunk, voxels); - SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_COMPLETED); + SDL_SetAtomicInt(&chunk->state, JOB_STATE_COMPLETED); } static void RegenerateChunkVoxels(int x, int z) @@ -451,7 +455,7 @@ static void RegenerateChunkVoxels(int x, int z) SDL_assert(!IsChunkOnBorder(x, z)); Chunk* chunks[3][3] = {0}; GetNeighborhood(x, z, chunks); - SDL_SetAtomicInt(&chunks[1][1]->voxel_state, JOB_STATE_RUNNING); + SDL_SetAtomicInt(&chunks[1][1]->state, JOB_STATE_RUNNING); GenerateChunkVoxels(chunks, cpu_voxels); } @@ -677,7 +681,7 @@ static void Shuffle(int offset_x, int offset_z) SDL_assert(recycled_count > 0); Chunk* chunk = recycled_chunks[--recycled_count]; SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); - SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); chunks[x][z] = chunk; } @@ -737,7 +741,7 @@ static bool TryDispatchJob(int x, int z, WorldWorker* worker) { return false; } - bool needs_voxels = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED; + bool needs_voxels = SDL_GetAtomicInt(&chunk->state) == JOB_STATE_REQUESTED; bool needs_lights = SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED; if (!needs_voxels && !needs_lights) { @@ -752,7 +756,7 @@ static bool TryDispatchJob(int x, int z, WorldWorker* worker) if (needs_voxels) { job.type = JOB_TYPE_VOXELS; - SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_RUNNING); + SDL_SetAtomicInt(&chunk->state, JOB_STATE_RUNNING); } else { @@ -796,9 +800,9 @@ static void Render(Chunk* chunk, SDL_GPUCommandBuffer* command_buffer, SDL_GPURe { return; } - SDL_GPUBufferBinding voxel_binding = {0}; + SDL_GPUBufferBinding binding = {0}; SDL_GPUBufferBinding index_binding = {0}; - voxel_binding.buffer = gpu_voxels->buffer; + binding.buffer = gpu_voxels->buffer; index_binding.buffer = gpu_indices.buffer; if (flags & WORLD_FLAGS_LIGHT) { @@ -818,7 +822,7 @@ static void Render(Chunk* chunk, SDL_GPUCommandBuffer* command_buffer, SDL_GPURe SDL_BindGPUFragmentStorageBuffers(render_pass, 1, &light_binding, 1); } SDL_PushGPUVertexUniformData(command_buffer, 2, chunk->position, sizeof(chunk->position)); - SDL_BindGPUVertexBuffers(render_pass, 0, &voxel_binding, 1); + SDL_BindGPUVertexBuffers(render_pass, 0, &binding, 1); SDL_BindGPUIndexBuffer(render_pass, &index_binding, SDL_GPU_INDEXELEMENTSIZE_32BIT); Uint32 index_count = gpu_voxels->size / 4 * 6; SDL_DrawGPUIndexedPrimitives(render_pass, index_count, 1, 0, 0, 0); @@ -841,7 +845,7 @@ void World_Render( continue; } Chunk* chunk = chunks[chunk_x][chunk_z]; - if (SDL_GetAtomicInt(&chunk->voxel_state) != JOB_STATE_COMPLETED) + if (SDL_GetAtomicInt(&chunk->state) != JOB_STATE_COMPLETED) { continue; } @@ -873,7 +877,7 @@ static Chunk* GetWorldChunk(const int position[3]) return NULL; } bool has_blocks = SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED; - bool has_voxels = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_COMPLETED; + bool has_voxels = SDL_GetAtomicInt(&chunk->state) == JOB_STATE_COMPLETED; if (!has_blocks || !has_voxels) { return NULL; From 47613b0183939104876bb71093ca41c7bb11fd72 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 22:03:33 -0400 Subject: [PATCH 32/39] refactor --- src/rand.c | 177 +++++++++++++++++++++++++--------------------------- src/save.c | 2 +- src/voxel.c | 45 ++++++------- src/voxel.h | 8 +-- src/world.c | 23 +++---- 5 files changed, 123 insertions(+), 132 deletions(-) diff --git a/src/rand.c b/src/rand.c index d13dd746..47c49312 100644 --- a/src/rand.c +++ b/src/rand.c @@ -7,118 +7,109 @@ void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock callback) { for (int x = 0; x < CHUNK_WIDTH; x++) + for (int z = 0; z < CHUNK_WIDTH; z++) { - for (int z = 0; z < CHUNK_WIDTH; z++) + int bx = cx + x; + int bz = cz + z; + float height = stb_perlin_fbm_noise3(bx * 0.005f, 0.0f, bz * 0.005f, 2.0f, 0.5f, 6) * 50.0f; + height = SDL_powf(SDL_max(height, 0.0f), 1.3f) + 30.0f; + height = SDL_clamp(height, 0.0f, CHUNK_HEIGHT - 1.0f); + bool is_low_elevation = false; + if (height < 40.0f) { - int bx = cx + x; - int bz = cz + z; - bool is_border = x > 2 && x < CHUNK_WIDTH - 2 && z > 2 && z < CHUNK_WIDTH - 2; - bool is_low = false; - bool is_plains = false; - float height = stb_perlin_fbm_noise3(bx * 0.005f, 0.0f, bz * 0.005f, 2.0f, 0.5f, 6) * 50.0f; - height = SDL_powf(SDL_max(height, 0.0f), 1.3f) + 30.0f; - height = SDL_clamp(height, 0.0f, CHUNK_HEIGHT - 1.0f); - if (height < 40.0f) + height += stb_perlin_fbm_noise3(-bx * 0.01f, 0.0f, bz * 0.01f, 2.0f, 0.5f, 6) * 12.0f; + is_low_elevation = true; + } + float biome = stb_perlin_fbm_noise3(bx * 0.2f, 0.0f, bz * 0.2f, 2.0f, 0.5f, 6); + Block top; + Block bottom; + if (height + biome < 31.0f) + { + top = BLOCK_SAND; + bottom = BLOCK_SAND; + } + else + { + biome *= 8.0f; + biome = SDL_clamp(biome, -5.0f, 5.0f); + if (height + biome < 61.0f) { - height += stb_perlin_fbm_noise3(-bx * 0.01f, 0.0f, bz * 0.01f, 2.0f, 0.5f, 6) * 12.0f; - is_low = true; + top = BLOCK_GRASS; + bottom = BLOCK_DIRT; } - float biome = stb_perlin_fbm_noise3(bx * 0.2f, 0.0f, bz * 0.2f, 2.0f, 0.5f, 6); - Block top; - Block bottom; - if (height + biome < 31.0f) + else if (height + biome < 132.0f) { - top = BLOCK_SAND; - bottom = BLOCK_SAND; + top = BLOCK_STONE; + bottom = BLOCK_STONE; } else { - biome *= 8.0f; - biome = SDL_clamp(biome, -5.0f, 5.0f); - if (height + biome < 61.0f) - { - top = BLOCK_GRASS; - bottom = BLOCK_DIRT; - is_plains = true; - } - else if (height + biome < 132.0f) - { - top = BLOCK_STONE; - bottom = BLOCK_STONE; - } - else - { - top = BLOCK_SNOW; - bottom = BLOCK_STONE; - } - } - int y = 0; - for (; y < height; y++) - { - callback(userdata, bx, y, bz, bottom); - } - callback(userdata, bx, y, bz, top); - for (; y < 30; y++) - { - callback(userdata, bx, y, bz, BLOCK_WATER); + top = BLOCK_SNOW; + bottom = BLOCK_STONE; } - if (is_low && is_plains) + } + int y = 0; + for (; y < height; y++) + { + callback(userdata, bx, y, bz, bottom); + } + callback(userdata, bx, y, bz, top); + for (; y < 30; y++) + { + callback(userdata, bx, y, bz, BLOCK_WATER); + } + if (top == BLOCK_GRASS && is_low_elevation) + { + float plant = stb_perlin_fbm_noise3(bx * 0.2f, 0.0f, bz * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; + if (plant > 0.8f && x > 2 && x < CHUNK_WIDTH - 2 && z > 2 && z < CHUNK_WIDTH - 2) { - float plant = stb_perlin_fbm_noise3(bx * 0.2f, 0.0f, bz * 0.2f, 2.0f, 0.5f, 3) * 0.5f + 0.5f; - if (plant > 0.8f && is_border) - { - int trunk = 3 + plant * 2.0f; - for (int dy = 0; dy < trunk; dy++) - { - callback(userdata, bx, y + dy + 1, bz, BLOCK_LOG); - } - for (int dx = -1; dx <= 1; dx++) - { - for (int dz = -1; dz <= 1; dz++) - { - for (int dy = 0; dy < 2; dy++) - { - if (dx || dz || dy) - { - callback(userdata, bx + dx, y + trunk + dy, bz + dz, BLOCK_LEAVES); - } - } - } - } - } - else if (plant > 0.55f) + int trunk = 3 + plant * 2.0f; + for (int dy = 0; dy < trunk; dy++) { - callback(userdata, bx, y + 1, bz, BLOCK_BUSH); + callback(userdata, bx, y + dy + 1, bz, BLOCK_LOG); } - else if (plant > 0.52f) + for (int dx = -1; dx <= 1; dx++) + for (int dz = -1; dz <= 1; dz++) + for (int dy = 0; dy < 2; dy++) { - int i = (int)(plant * 1000.0f) % 4; - Block flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; - callback(userdata, bx, y + 1, bz, flowers[i]); + if (dx || dz || dy) + { + callback(userdata, bx + dx, y + trunk + dy, bz + dz, BLOCK_LEAVES); + } } } - if (height > 130.0f) - { - continue; - } - float cloud = stb_perlin_turbulence_noise3(bx * 0.015f, 0.0f, bz * 0.015f, 2.0f, 0.5f, 6); - int scale = -1; - if (cloud > 0.9f) - { - scale = 2; - } - else if (cloud > 0.7f) - { - scale = 1; - } - else if (cloud > 0.6f) + else if (plant > 0.55f) { - scale = 0; + callback(userdata, bx, y + 1, bz, BLOCK_BUSH); } - for (int y = -scale; y <= scale; y++) + else if (plant > 0.52f) { - callback(userdata, bx, 155 - y, bz, BLOCK_CLOUD); + int i = (int)(plant * 1000.0f) % 4; + Block flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; + callback(userdata, bx, y + 1, bz, flowers[i]); } } + if (height > 130.0f) + { + continue; + } + float cloud = stb_perlin_turbulence_noise3(bx * 0.015f, 0.0f, bz * 0.015f, 2.0f, 0.5f, 6); + int scale = -1; + if (cloud > 0.9f) + { + scale = 2; + } + else if (cloud > 0.7f) + { + scale = 1; + } + else if (cloud > 0.6f) + { + scale = 0; + } + for (int y = -scale; y <= scale; y++) + { + callback(userdata, bx, 155 - y, bz, BLOCK_CLOUD); + } } } diff --git a/src/save.c b/src/save.c index 6dc7710a..56e9d417 100644 --- a/src/save.c +++ b/src/save.c @@ -21,7 +21,7 @@ static const char* SCHEMA = " id INTEGER PRIMARY KEY NOT NULL," " time_of_day REAL NOT NULL" ");" - "CREATE INDEX IF NOT EXISTS bindex ON blocks (cx, cz);"; + "CREATE INDEX IF NOT EXISTS blocks_index ON blocks (cx, cz);"; static const char* SET_PLAYER = "INSERT OR REPLACE INTO players (id, data) VALUES (0, ?);"; static const char* GET_PLAYER = "SELECT data FROM players WHERE id = 0;"; static const char* SET_SKY = "INSERT OR REPLACE INTO sky (id, time_of_day) VALUES (0, ?);"; diff --git a/src/voxel.c b/src/voxel.c index 3c4b48cc..114f7136 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -5,7 +5,8 @@ #include "voxel.h" #include "voxel.inc" -static const int CUBE_POSITIONS[][4][3] = { +static const int CUBE_POSITIONS[][4][3] = +{ {{0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}}, {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 1, 0}}, {{1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1}}, @@ -14,7 +15,8 @@ static const int CUBE_POSITIONS[][4][3] = { {{0, 0, 0}, {0, 0, 1}, {1, 0, 0}, {1, 0, 1}}, }; -static const int TEXCOORDS[][4][2] = { +static const int TEXCOORDS[][4][2] = +{ {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, {{1, 1}, {0, 1}, {1, 0}, {0, 0}}, @@ -23,16 +25,29 @@ static const int TEXCOORDS[][4][2] = { {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, }; -static const int SPRITE_POSITIONS[][4][3] = { +static const int SPRITE_POSITIONS[][4][3] = +{ {{0, 0, 0}, {0, 1, 0}, {1, 0, 1}, {1, 1, 1}}, {{0, 0, 0}, {1, 0, 1}, {0, 1, 0}, {1, 1, 1}}, {{0, 0, 1}, {1, 0, 0}, {0, 1, 1}, {1, 1, 0}}, {{0, 0, 1}, {0, 1, 1}, {1, 0, 0}, {1, 1, 0}}, }; -static const int AO[2][4] = {{0, 1, 2, 3}, {1, 3, 0, 2}}; +void Voxel_GetPosition(Direction direction, int index, int position[3]) +{ + SDL_assert(direction < 6); + SDL_assert(index < 4); + SDL_memcpy(position, CUBE_POSITIONS[direction][index], sizeof(int) * 3); +} -static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction direction, int ao) +void Voxel_GetAO(const int ao[4], int order[4]) +{ + static const int AO[2][4] = {{0, 1, 2, 3}, {1, 3, 0, 2}}; + int index = ao[0] + ao[3] > ao[1] + ao[2]; + SDL_memcpy(order, AO[index], sizeof(AO[index])); +} + +static Voxel Voxel_Pack(Block block, int x, int y, int z, int u, int v, Direction direction, int ao) { SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", X_OFFSET + X_BITS <= 32); @@ -63,7 +78,7 @@ static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction dire return voxel; } -Voxel PackSprite(Block block, int x, int y, int z, Direction direction, int index) +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int index) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); @@ -71,10 +86,10 @@ Voxel PackSprite(Block block, int x, int y, int z, Direction direction, int inde SDL_assert(index < 4); const int* p = SPRITE_POSITIONS[direction][index]; const int* t = TEXCOORDS[direction][index]; - return Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], DIRECTION_UP, AO_MASK); + return Voxel_Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], DIRECTION_UP, AO_MASK); } -Voxel PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao) +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao) { SDL_assert(block > BLOCK_EMPTY); SDL_assert(block < BLOCK_COUNT); @@ -82,17 +97,5 @@ Voxel PackCube(Block block, int x, int y, int z, Direction direction, int index, SDL_assert(index < 4); const int* p = CUBE_POSITIONS[direction][index]; const int* t = TEXCOORDS[direction][index]; - return Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], direction, ao); -} - -void GetAO(const int ao[4], int order[4]) -{ - int index = ao[0] + ao[3] > ao[1] + ao[2]; - SDL_memcpy(order, AO[index], sizeof(AO[index])); -} - -void GetPosition(Direction direction, int index, int position[3]) -{ - SDL_assert(direction < 6); - SDL_memcpy(position, CUBE_POSITIONS[direction][index], sizeof(int) * 3); + return Voxel_Pack(block, x + p[0], y + p[1], z + p[2], t[0], t[1], direction, ao); } diff --git a/src/voxel.h b/src/voxel.h index a7e97897..7d2dcb62 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -7,7 +7,7 @@ typedef Uint32 Voxel; -Voxel PackSprite(Block block, int x, int y, int z, Direction direction, int index); -Voxel PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao); -void GetAO(const int ao[4], int order[4]); -void GetPosition(Direction direction, int index, int position[3]); +void Voxel_GetPosition(Direction direction, int index, int position[3]); +void Voxel_GetAO(const int ao[4], int order[4]); +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int index); +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int index, int ao); diff --git a/src/world.c b/src/world.c index 034e8d71..1dc4ecbe 100644 --- a/src/world.c +++ b/src/world.c @@ -12,8 +12,6 @@ #define WORKERS 4 -static const Uint32 MAX_INDICES = CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_WIDTH * DIRECTION_COUNT * 6; - typedef enum JobType { JOB_TYPE_BLOCKS, @@ -143,9 +141,9 @@ static Chunk* CreateChunk() SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->state, JOB_STATE_COMPLETED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + for (int i = 0; i < MESH_TYPE_COUNT; i++) { - GPUBuffer_Init(&chunk->gpu_voxels[mesh_index], device, SDL_GPU_BUFFERUSAGE_VERTEX); + GPUBuffer_Init(&chunk->gpu_voxels[i], device, SDL_GPU_BUFFERUSAGE_VERTEX); } GPUBuffer_Init(&chunk->gpu_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); return chunk; @@ -168,9 +166,7 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) WorldToChunk(chunk, &bx, &by, &bz); Block old_block = chunk->blocks[bx][by][bz]; chunk->blocks[bx][by][bz] = block; - bool is_light = Block_IsLight(block); - bool was_light = Block_IsLight(old_block); - if (!is_light && !was_light) + if (!Block_IsLight(block) && !Block_IsLight(old_block)) { return old_block; } @@ -185,7 +181,7 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) break; } } - if (is_light) + if (BLock_IsLight(block)) { if (light_index < 0) { @@ -341,7 +337,7 @@ static bool IsVisible(Block block, Block neighbor) static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction direction, int vertex) { int position[3]; - GetPosition(direction, vertex, position); + Voxel_GetPosition(direction, vertex, position); int side1[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int side2[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int corner[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; @@ -412,7 +408,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ { for (int vertex = 0; vertex < 4; vertex++) { - Voxel voxel = PackSprite(block, bx, by, bz, direction, vertex); + Voxel voxel = Voxel_PackSprite(block, bx, by, bz, direction, vertex); CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); } } @@ -435,11 +431,11 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ ao[i] = GetAO(chunks, bx, by, bz, direction, i); } int order[4]; - GetAO(ao, order); + Voxel_GetAO(ao, order); for (int i = 0; i < 4; i++) { int index = order[i]; - Voxel voxel = PackCube(block, bx, by, bz, direction, index, ao[index]); + Voxel voxel = Voxel_PackCube(block, bx, by, bz, direction, index, ao[index]); CPUBuffer_Append(&voxels[mesh_type], &voxel); } } @@ -506,7 +502,8 @@ static void GenerateIndexBuffer() return; } static const int INDICES[] = {0, 1, 2, 3, 2, 1}; - for (Uint32 quad_index = 0; quad_index < MAX_INDICES / 6; quad_index++) + Uint32 max_indices = CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_WIDTH * DIRECTION_COUNT * 6; + for (Uint32 quad_index = 0; quad_index < max_indices / 6; quad_index++) { for (Uint32 index_index = 0; index_index < 6; index_index++) { From 960e38fcb8064450796a8cd26d3eeb91533abbb3 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 22:29:02 -0400 Subject: [PATCH 33/39] v -1 --- CMakeLists.txt | 1 + README.md | 1 - shaders/bin/opaque.frag.msl | 148 ++++++++++++++-------------- shaders/bin/opaque.frag.spv | Bin 9956 -> 10012 bytes shaders/bin/transparent.frag.msl | 28 +++--- shaders/bin/transparent.frag.spv | Bin 10256 -> 10296 bytes shaders/shader.hlsl | 2 +- src/camera.c | 2 +- src/main.c | 1 + src/map.c | 159 +++++++++++++++++++++++++++++++ src/map.h | 27 ++++++ src/save.c | 2 +- src/world.c | 63 +++++------- 13 files changed, 301 insertions(+), 133 deletions(-) create mode 100644 src/map.c create mode 100644 src/map.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d1cab4c..ad2efc87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ add_executable(blocks WIN32 src/buffer.c src/camera.c src/main.c + src/map.c src/player.c src/rand.c src/save.c diff --git a/README.md b/README.md index bc56bba7..8f5b0d19 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ Tiny Minecraft clone in C and HLSL using the new SDL3 GPU API - Asynchronous chunk loading - Persistent worlds - Physics -- Directional shadows - Clustered dynamic lighting - Blocks and sprites - Day and night cycle diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index f95278e6..de4048ec 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -101,7 +101,7 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _108 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -120,144 +120,144 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _126 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _133 = in.in_var_TEXCOORD2 & 7u; - float3 _139 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_126].Indices[_133])); - float4 _143 = atlasTexture.sample(atlasSampler, _139.xy, uint(rint(_139.z))); - if (_143.w < 0.001000000047497451305389404296875) + uint _127 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _134 = in.in_var_TEXCOORD2 & 7u; + float3 _140 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_127].Indices[_134])); + float4 _144 = atlasTexture.sample(atlasSampler, _140.xy, uint(rint(_140.z))); + if (_144.w < 0.001000000047497451305389404296875) { discard_fragment(); } - uint _153 = uint(UniformBuffer.LightCount); - float3 _156; - _156 = float3(0.0); + uint _154 = uint(UniformBuffer.LightCount); float3 _157; - for (uint _159 = 0u; _159 < _153; _156 = _157, _159++) + _157 = float3(0.0); + float3 _158; + for (uint _160 = 0u; _160 < _154; _157 = _158, _160++) { - float _172 = float((lightBuffer._m0[_159].Color & 4278190080u) >> 24u); - float3 _178 = (float3(float(lightBuffer._m0[_159].X), float(lightBuffer._m0[_159].Y), float(lightBuffer._m0[_159].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _179 = length(_178); - if (_179 >= _172) + float _173 = float((lightBuffer._m0[_160].Color & 4278190080u) >> 24u); + float3 _179 = (float3(float(lightBuffer._m0[_160].X), float(lightBuffer._m0[_160].Y), float(lightBuffer._m0[_160].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _180 = length(_179); + if (_180 >= _173) { - _157 = _156; + _158 = _157; continue; } - float _186 = fast::clamp(dot(_108[_133], _178 / float3(_179)), 0.0, 1.0); - if (_186 <= 0.0) + float _187 = fast::clamp(dot(_109[_134], _179 / float3(_180)), 0.0, 1.0); + if (_187 <= 0.0) { - _157 = _156; + _158 = _157; continue; } - _157 = _156 + ((float3(float(lightBuffer._m0[_159].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_159].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_159].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _186) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_179 / _172, 0.0, 1.0)))); + _158 = _157 + ((float3(float(lightBuffer._m0[_160].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _187) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_180 / _173, 0.0, 1.0)))); } - float _327; + float _330; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _327 = 0.0; + _330 = 0.0; break; } - float _226 = blockBuffer._m0[_126].SunIntensity * UniformBuffer_3.Sun.w; - if (blockBuffer._m0[_126].CanBeInShadow == 0u) + float _227 = blockBuffer._m0[_127].SunIntensity * UniformBuffer_3.Sun.w; + if (blockBuffer._m0[_127].CanBeInShadow == 0u) { - _327 = _226; + _330 = _227; break; } - float _237; - if (blockBuffer._m0[_126].IsOccluded != 0u) + float _238; + if (blockBuffer._m0[_127].IsOccluded != 0u) { - _237 = fast::clamp(-dot(_108[_133], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _238 = fast::clamp(-dot(_109[_134], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _237 = 0.7070000171661376953125; + _238 = 0.7070000171661376953125; } - if (_237 <= 0.0) + if (_238 <= 0.0) { - _327 = 0.0; + _330 = 0.0; break; } - float4 _245 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _249 = _245.xyz / float3(_245.w); - float2 _252 = (_249.xy * 0.5) + float2(0.5); - float _254 = 1.0 - _252.y; - float2 _255 = _252; - _255.y = _254; - float _256 = _252.x; - bool _261; - if ((isunordered(_256, 0.0) || _256 >= 0.0)) + float4 _246 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _250 = _246.xyz / float3(_246.w); + float2 _253 = (_250.xy * 0.5) + float2(0.5); + float _255 = 1.0 - _253.y; + float2 _256 = _253; + _256.y = _255; + float _257 = _253.x; + bool _262; + if ((isunordered(_257, 0.0) || _257 >= 0.0)) { - _261 = _256 > 1.0; + _262 = _257 > 1.0; } else { - _261 = true; + _262 = true; } - bool _266; - if (!_261) + bool _267; + if (!_262) { - _266 = _254 < 0.0; + _267 = _255 < 0.0; } else { - _266 = true; + _267 = true; } - bool _271; - if (!_266) + bool _272; + if (!_267) { - _271 = _254 > 1.0; + _272 = _255 > 1.0; } else { - _271 = true; + _272 = true; } - bool _277; - if (!_271) + bool _278; + if (!_272) { - _277 = _249.z < 0.0; + _278 = _250.z < 0.0; } else { - _277 = true; + _278 = true; } - bool _283; - if (!_277) + bool _284; + if (!_278) { - _283 = _249.z > 1.0; + _284 = _250.z > 1.0; } else { - _283 = true; + _284 = true; } - if (_283) + if (_284) { - _327 = _226 * _237; + _330 = _227 * _238; break; } - uint2 _287 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _293 = float2(1.0) / float2(float(_287.x), float(_287.y)); - float _296 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _237)); - float _298; - int _301; - _298 = 0.0; - _301 = -1; + uint2 _288 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _294 = float2(1.0) / float2(float(_288.x), float(_288.y)); + float _297 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _238)); float _299; - for (; _301 <= 1; _298 = _299, _301++) + int _302; + _299 = 0.0; + _302 = -1; + float _300; + for (; _302 <= 1; _299 = _300, _302++) { - _299 = _298; - for (int _309 = -1; _309 <= 1; ) + _300 = _299; + for (int _310 = -1; _310 <= 1; ) { - _299 += shadowTexture.sample_compare(shadowSampler, (_255 + (float2(float(_301), float(_309)) * _293)), _249.z - _296, level(0.0)); - _309++; + _300 += shadowTexture.sample_compare(shadowSampler, (_256 + (float2(float(_302), float(_310)) * _294)), _250.z - _297, level(0.0)); + _310++; continue; } } - _327 = (_226 * _237) * mix(1.0, _298 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _330 = (_227 * _238) * ((mix(1.0, _299 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)) * 0.100000001490116119384765625) + 0.7070000171661376953125); break; } while(false); - float3 _335 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_143.xyz * ((_156 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_327)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_335.y, length(_335.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _338 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_144.xyz * ((_157 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_330)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_338.y, length(_338.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 0f1dd7a680b56969118e7a87f342cdba740099ea..47e8893120fc817b0188a6a60c1b6afa573d0d29 100644 GIT binary patch literal 10012 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 Rl}LT+J<;vii|lGT_#eux+z$W% literal 9956 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 B)Fl7_ diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index 5ba0e255..fbda9246 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -101,7 +101,7 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _108 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -138,7 +138,7 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& _156 = _155; continue; } - float _185 = fast::clamp(dot(_108[_135], _177 / float3(_178)), 0.0, 1.0); + float _185 = fast::clamp(dot(_109[_135], _177 / float3(_178)), 0.0, 1.0); if (_185 <= 0.0) { _156 = _155; @@ -146,24 +146,24 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& } _156 = _155 + ((float3(float(lightBuffer._m0[_158].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_158].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_158].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _185) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_178 / _171, 0.0, 1.0)))); } - float _326; + float _328; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _326 = 0.0; + _328 = 0.0; break; } float _225 = blockBuffer._m0[_128].SunIntensity * UniformBuffer_3.Sun.w; if (blockBuffer._m0[_128].CanBeInShadow == 0u) { - _326 = _225; + _328 = _225; break; } float _236; if (blockBuffer._m0[_128].IsOccluded != 0u) { - _236 = fast::clamp(-dot(_108[_135], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _236 = fast::clamp(-dot(_109[_135], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { @@ -171,7 +171,7 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& } if (_236 <= 0.0) { - _326 = 0.0; + _328 = 0.0; break; } float4 _244 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); @@ -228,7 +228,7 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& } if (_282) { - _326 = _225 * _236; + _328 = _225 * _236; break; } uint2 _286 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); @@ -249,20 +249,20 @@ fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& continue; } } - _326 = (_225 * _236) * mix(1.0, _297 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _328 = (_225 * _236) * ((mix(1.0, _297 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)) * 0.100000001490116119384765625) + 0.7070000171661376953125); break; } while(false); - float3 _329 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _363; + float3 _331 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _365; if (blockBuffer._m0[_128].Indices[_135] == 16u) { - _363 = _149 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _365 = _149 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _363 = _149; + _365 = _149; } - out.out_var_SV_Target0 = float4(mix(_147.xyz * ((_155 + UniformBuffer_3.Ambient.xyz) + float3(_326)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_329.y, length(_329.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _363); + out.out_var_SV_Target0 = float4(mix(_147.xyz * ((_155 + UniformBuffer_3.Ambient.xyz) + float3(_328)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_331.y, length(_331.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _365); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 54e790b75f6abf4acfa488a544656e30afce147a..de94790dcba12e2cc8fdfe258da09f674b39d7cc 100644 GIT binary patch delta 2108 zcmYk6O=w(I6vywI8CzpA6O&1dlbJRd#xZK8MT=k>(^%7wq&3bY%||C`+N4dI@2{#= zM0^avg$N?t3U({FaVMeBjfhL3g>Ezp-H5nz<3ef$!QcPQyXkwp|D5yxpL6frd(M6L z^YWc?G9D}JH^wu@q|E!@COeXudw1{l9x@42L>mUibiSU0kJwj|M>FRG#h5y5yNQ{4 z#fgsEYVxQzW^X4qym4Dh^;IT_#6T-JXyWE+Y&TH$1*~Gy+Taze{x1<|2{Vb6Ca$sV zSZNwNWxq>h{fjWokOK$JK2RH>Q4Y$UhAU5T@k>|_C`bHq$Ol6{6Y{Q*&tl_1`Dtdl zg3X)w%jPPMh$flCQbltJWJ&MDsz8d(W3_;8d#kY{<2JDvs@k-&mh2CWS${cHpTepv zD_AW=<9pyL{u4lt_$am^U^PC5pNeqB8zWrtCnH?(rbpa2=q?gR&!ML~Z zr3rd4$AY%FNlGZ1qzAZ3%4pKvB*Xa9%C`DUn?Hi5XVVLz9h-Gim!V}ydFCT*F7}O#ChyI zTshJwD3HG2YxvSX!q=m|-@q=|>a%Hok;noVMpaLi@HK)rIC|2SA<9$Cm16~8di0Z6 zg?~Z5Vh>rl+kx!gVb9mXoL|W!KNW0GO;<11ZN4k*Z;&z&fs1aUtpmli42{^rzll}M zorvrBs=k9e5pSdM1}8$}bV8Ktw*C%2Il6iuiSO3LV4zF95o$W)W%i{izlWv?l&`q< Qd7Rej&QC4^6o&7e8Nk|3OFOMNoq@I)8&nL05EE-H6)Mz%wNv^xEr0!`zqAyE1sEr$ zVMRhTR}+alm+qQw+__?5LK8L7E_7pzJ2x&2Vq)U+esgdAZoYTUdEayH`R+aUe)Dzl z<6=6QDC{%F8e?kB?ag#cy2_Z=H}fWC2HlzTiR=X;8px*EBuq87mFSTBBz?jTyGQ9Y zJK|og?H(T`k^oKMkV%^7u^m9!V_3zc9e|gx?I0CtDKn0hCa$^7SZSI&;kIjY<%=*? z$b&;>FR0AWtN>+Sf-6sP@yl2Xlp}t{^FGh7dVbjRNo*1*KSQM{Y@11*Hq$sFDl&tm zYvu^Zk=}|`gA|*^Y5`&EbDo#n!@8C#ZCY6i?)$o2dC|w7!>TPySS>{JJK<{nvp_?9 z2wM}e3LnO=jd8{6VqEe4F|K(1|GaEQAdMirP-l1`#&vGl7@xq;#kfx8V2rE#Eita{ ztD6>R1M0rcxWao=M(y9TD^wEp#`q+@I;|q=+p_0_*jMPe?20>HUl_iQ_jBF1-ABpQ z;jMxr%uvVIK*xjMx&pre-+21v$-vi@)3DJQ_)YlsV><(7@ zS$4-8GF2we$V$L z?b6mutxpnm&9xN)@>IG_0o<3y>Nk?UT0s(l;1|_ z1skZk_Z6apcWp&3f=l>!i3t>|tT+V6399vi zMrAjZRZpNv?g1*I+_1ol_=>N)≫WnG7ka9`<}0&ciZ{xrFmF_A9pBjlBZDk9`q5 z;Y+)!M8-c{f5j$&G<_uUb%1H&Q~3L_;?>w`IR8XtGfLq$gc$@SDKJLg^a;=6OaBmG zLpS6$b`DK{2;r9Lpst}w4;Nq_U-NmQ8>^fJi1HMxw1Y!kgeahIJ{;^4{4=;>PuWS> zk?ddoW-R-hU&vFwcB}b1@D=Z$+BF)pSQf}zPO?>5O1noVqMVBXt?|V@#sKob<#u20f@{Uview, rotation, camera->view); Rotate(rotation, 0.0f, 1.0f, 0.0f, -camera->yaw); Multiply(camera->view, rotation, camera->view); - float aspect = (float)camera->width / camera->height; + float aspect = (float) camera->width / camera->height; if (camera->type == CAMERA_TYPE_PERSPECTIVE) { Perspective(camera->proj, aspect, camera->fov, camera->near, camera->far); diff --git a/src/main.c b/src/main.c index f9536e52..68a9be34 100644 --- a/src/main.c +++ b/src/main.c @@ -630,6 +630,7 @@ static bool Resize(int width, int height) static void RenderShadowPass(SDL_GPUCommandBuffer* cbuf) { + return; if (!sky.is_shadow_on) { return; diff --git a/src/map.c b/src/map.c new file mode 100644 index 00000000..fdeb3881 --- /dev/null +++ b/src/map.c @@ -0,0 +1,159 @@ +#include + +#include "map.h" + +static const int EMPTY = 0; +static const int TOMBSTONE = 255; +static const float MAX_LOAD_FACTOR = 0.75f; + +static int HashInt(int x) +{ + x += (x << 10); + x ^= (x >> 6); + x += (x << 3); + x ^= (x >> 11); + x += (x << 15); + return x; +} + +static int HashPosition(int x, int y, int z) +{ + return HashInt(x) ^ HashInt(y) ^ HashInt(z); +} + +static bool IsEqual(MapRow row, int x, int y, int z) +{ + return row.x == x && row.y == y && row.z == z; +} + +static void Grow(Map* map) +{ + Map old_map = *map; + Map_Init(map, old_map.capacity * 2); + for (Uint32 i = 0; i < old_map.capacity; i++) + { + if (Map_IsRowValid(&old_map, i)) + { + MapRow row = old_map.rows[i]; + Map_Set(map, row.x, row.y, row.z, row.value); + } + } + Map_Free(&old_map); +} + +void Map_Init(Map* map, int capacity) +{ + SDL_assert(SDL_HasExactlyOneBitSet32(capacity)); + map->rows = SDL_calloc(capacity, sizeof(MapRow)); + map->capacity = capacity; + map->size = 0; +} + +void Map_Free(Map* map) +{ + SDL_free(map->rows); + map->rows = NULL; + map->size = 0; + map->capacity = 0; +} + +void Map_Set(Map* map, int x, int y, int z, int value) +{ + SDL_assert(value <= SDL_MAX_UINT8); + SDL_assert(value != EMPTY && value != TOMBSTONE); + if ((float) (map->size + 1) / map->capacity > MAX_LOAD_FACTOR) + { + Grow(map); + } + Uint32 mask = map->capacity - 1; + Uint32 index = HashPosition(x, y, z) & mask; + Uint32 tombstone = SDL_MAX_UINT32; + for (;;) + { + MapRow* row = &map->rows[index]; + if (row->value == EMPTY) + { + if (tombstone != SDL_MAX_UINT32) + { + row = &map->rows[tombstone]; + } + row->x = x; + row->y = y; + row->z = z; + row->value = value; + map->size++; + return; + } + if (row->value == TOMBSTONE) + { + if (tombstone == SDL_MAX_UINT32) + { + tombstone = index; + } + } + else if (IsEqual(*row, x, y, z)) + { + row->value = value; + return; + } + index = (index + 1) & mask; + } +} + +int Map_Get(const Map* map, int x, int y, int z) +{ + Uint32 mask = map->capacity - 1; + Uint32 index = HashPosition(x, y, z) & mask; + for (;;) + { + const MapRow row = map->rows[index]; + if (row.value == EMPTY) + { + return EMPTY; + } + if (row.value != TOMBSTONE && IsEqual(row, x, y, z)) + { + return row.value; + } + index = (index + 1) & mask; + } +} + +void Map_Remove(Map* map, int x, int y, int z) +{ + Uint32 mask = map->capacity - 1; + Uint32 index = HashPosition(x, y, z) & mask; + for (;;) + { + MapRow* row = &map->rows[index]; + if (row->value == EMPTY) + { + return; + } + if (row->value != TOMBSTONE && IsEqual(*row, x, y, z)) + { + row->value = TOMBSTONE; + map->size--; + return; + } + index = (index + 1) & mask; + } +} + +void Map_Clear(Map* map) +{ + SDL_memset(map->rows, 0, map->capacity * sizeof(MapRow)); + map->size = 0; +} + +bool Map_IsRowValid(const Map* map, Uint32 index) +{ + MapRow row = map->rows[index]; + return row.value != EMPTY && row.value != TOMBSTONE; +} + +MapRow Map_GetRow(const Map* map, Uint32 index) +{ + SDL_assert(Map_IsRowValid(map, index)); + return map->rows[index]; +} diff --git a/src/map.h b/src/map.h new file mode 100644 index 00000000..9906ab99 --- /dev/null +++ b/src/map.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +typedef struct MapRow +{ + Uint8 x; + Uint8 y; + Uint8 z; + Uint8 value; +} MapRow; + +typedef struct Map +{ + MapRow* rows; + Uint32 size; + Uint32 capacity; +} Map; + +void Map_Init(Map* map, int capacity); +void Map_Free(Map* map); +void Map_Set(Map* map, int x, int y, int z, int value); +int Map_Get(const Map* map, int x, int y, int z); +void Map_Remove(Map* map, int x, int y, int z); +void Map_Clear(Map* map); +bool Map_IsRowValid(const Map* map, Uint32 index); +MapRow Map_GetRow(const Map* map, Uint32 index); diff --git a/src/save.c b/src/save.c index 56e9d417..54e7562a 100644 --- a/src/save.c +++ b/src/save.c @@ -181,7 +181,7 @@ bool Save_GetSky(float* time_of_day) bool has_sky = sqlite3_step(get_sky) == SQLITE_ROW; if (has_sky) { - *time_of_day = (float)sqlite3_column_double(get_sky, 0); + *time_of_day = sqlite3_column_double(get_sky, 0); } sqlite3_reset(get_sky); SDL_UnlockMutex(mutex); diff --git a/src/world.c b/src/world.c index 1dc4ecbe..11fdd7fd 100644 --- a/src/world.c +++ b/src/world.c @@ -3,6 +3,7 @@ #include "block.h" #include "buffer.h" #include "camera.h" +#include "map.h" #include "rand.h" #include "save.h" #include "voxel.h" @@ -63,9 +64,7 @@ typedef struct Chunk Sint32 position[2]; }; Block blocks[CHUNK_WIDTH][CHUNK_HEIGHT][CHUNK_WIDTH]; - Light* lights; - int light_size; - int light_capacity; + Map lights; GPUBuffer gpu_voxels[MESH_TYPE_COUNT]; GPUBuffer gpu_lights; } Chunk; @@ -141,6 +140,7 @@ static Chunk* CreateChunk() SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->state, JOB_STATE_COMPLETED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); + Map_Init(&chunk->lights, 8); for (int i = 0; i < MESH_TYPE_COUNT; i++) { GPUBuffer_Init(&chunk->gpu_voxels[i], device, SDL_GPU_BUFFERUSAGE_VERTEX); @@ -156,7 +156,7 @@ static void FreeChunk(Chunk* chunk) { GPUBuffer_Free(&chunk->gpu_voxels[i]); } - SDL_free(chunk->lights); + Map_Free(&chunk->lights); SDL_free(chunk); } @@ -171,43 +171,13 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) return old_block; } SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); - int light_index = -1; - for (int index = 0; index < chunk->light_size; index++) + if (Block_IsLight(block)) { - Light* light = &chunk->lights[index]; - if (light->x == chunk->x + bx && light->y == by && light->z == chunk->z + bz) - { - light_index = index; - break; - } - } - if (BLock_IsLight(block)) - { - if (light_index < 0) - { - if (chunk->light_size == chunk->light_capacity) - { - int capacity = SDL_max(8, chunk->light_capacity * 2); - Light* lights = SDL_realloc(chunk->lights, capacity * sizeof(Light)); - if (!lights) - { - SDL_Log("Failed to allocate chunk lights"); - return old_block; - } - chunk->lights = lights; - chunk->light_capacity = capacity; - } - light_index = chunk->light_size++; - } - Light light = Block_GetLight(block); - light.x = chunk->x + bx; - light.y = by; - light.z = chunk->z + bz; - chunk->lights[light_index] = light; + Map_Set(&chunk->lights, bx, by, bz, block); } - else if (light_index >= 0) + else { - chunk->lights[light_index] = chunk->lights[--chunk->light_size]; + Map_Remove(&chunk->lights, bx, by, bz); } return old_block; } @@ -379,7 +349,7 @@ static void GenerateChunkBlocks(Chunk* chunk) SDL_assert(SDL_GetAtomicInt(&chunk->state) == JOB_STATE_REQUESTED); SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED); SDL_memset(chunk->blocks, 0, sizeof(chunk->blocks)); - chunk->light_size = 0; + Map_Clear(&chunk->lights); Rand_GetBlocks(chunk, chunk->x, chunk->z, SetChunkBlockFunction); Save_GetBlocks(chunk, chunk->x, chunk->z, SetChunkBlockFunction); SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); @@ -466,9 +436,20 @@ static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) { const Chunk* neighbor = chunks[x][z]; SDL_assert(neighbor); - for (int light_index = 0; light_index < neighbor->light_size; light_index++) + for (Uint32 light_index = 0; light_index < neighbor->lights.capacity; light_index++) { - CPUBuffer_Append(lights, &neighbor->lights[light_index]); + if (!Map_IsRowValid(&neighbor->lights, light_index)) + { + continue; + } + MapRow row = Map_GetRow(&neighbor->lights, light_index); + Block block = row.value; + SDL_assert(Block_IsLight(block)); + Light light = Block_GetLight(block); + light.x = neighbor->x + row.x; + light.y = row.y; + light.z = neighbor->z + row.z; + CPUBuffer_Append(lights, &light); } } } From 1448b10a11949f464ce217473ce5e05d43c487a2 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sun, 19 Jul 2026 12:59:10 -0400 Subject: [PATCH 34/39] refactor --- CMakeLists.txt | 2 +- README.md | 2 +- shaders/bin/opaque.frag.json | 2 +- shaders/bin/opaque.frag.msl | 167 ++------ shaders/bin/opaque.frag.spv | Bin 10012 -> 7196 bytes shaders/bin/shadow.vert.json | 1 - shaders/bin/shadow.vert.msl | 62 --- shaders/bin/shadow.vert.spv | Bin 2944 -> 0 bytes shaders/bin/transparent.frag.json | 2 +- shaders/bin/transparent.frag.msl | 175 +++----- shaders/bin/transparent.frag.spv | Bin 10296 -> 7596 bytes shaders/opaque.frag | 23 +- shaders/shader.hlsl | 51 +-- shaders/shadow.vert | 40 -- shaders/transparent.frag | 20 +- src/block.c | 84 ++-- src/block.h | 2 - src/camera.c | 22 - src/camera.h | 1 - src/main.c | 139 +------ src/sky.c | 22 +- src/sky.h | 7 +- src/sort.c | 18 + src/sort.h | 3 + src/worker.c | 4 +- src/world.c | 657 ++++++++++++++---------------- src/world.h | 6 +- 27 files changed, 482 insertions(+), 1030 deletions(-) delete mode 100644 shaders/bin/shadow.vert.json delete mode 100644 shaders/bin/shadow.vert.msl delete mode 100644 shaders/bin/shadow.vert.spv delete mode 100644 shaders/shadow.vert create mode 100644 src/sort.c create mode 100644 src/sort.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ad2efc87..aefd340b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ add_executable(blocks WIN32 src/save.c src/shader.c src/sky.c + src/sort.c src/voxel.c src/worker.c src/world.c @@ -95,7 +96,6 @@ add_shader(opaque.frag shaders/shader.hlsl src/voxel.inc) add_shader(opaque.vert shaders/shader.hlsl src/voxel.inc) add_shader(raycast.frag shaders/shader.hlsl src/voxel.inc) add_shader(raycast.vert shaders/shader.hlsl src/voxel.inc) -add_shader(shadow.vert shaders/shader.hlsl src/voxel.inc) add_shader(sky.frag shaders/shader.hlsl src/voxel.inc) add_shader(sky.vert shaders/shader.hlsl src/voxel.inc) add_shader(transparent.frag shaders/shader.hlsl src/voxel.inc) diff --git a/README.md b/README.md index 8f5b0d19..811c48cf 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Tiny Minecraft clone in C and HLSL using the new SDL3 GPU API - Asynchronous chunk loading - Persistent worlds - Physics -- Clustered dynamic lighting +- Basic lighting - Blocks and sprites - Day and night cycle diff --git a/shaders/bin/opaque.frag.json b/shaders/bin/opaque.frag.json index 2da10c6f..e790c135 100644 --- a/shaders/bin/opaque.frag.json +++ b/shaders/bin/opaque.frag.json @@ -1 +1 @@ -{ "samplers": 2, "storage_textures": 0, "storage_buffers": 2, "uniform_buffers": 4, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float4", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "float2", "location": 1 }, { "name": "in.var.TEXCOORD2", "type": "uint", "location": 2 }, { "name": "in.var.TEXCOORD3", "type": "float", "location": 3 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }, { "name": "out.var.SV_Target1", "type": "float4", "location": 1 }] } +{ "samplers": 1, "storage_textures": 0, "storage_buffers": 2, "uniform_buffers": 3, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float4", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "float2", "location": 1 }, { "name": "in.var.TEXCOORD2", "type": "uint", "location": 2 }, { "name": "in.var.TEXCOORD3", "type": "float", "location": 3 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }, { "name": "out.var.SV_Target1", "type": "float4", "location": 1 }] } diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index de4048ec..41e2d28f 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -50,8 +50,7 @@ struct Block uint IsSolid; uint IsSprite; uint IsOccluded; - uint CanCreateShadow; - uint CanBeInShadow; + uint UseSunNormal; float SunIntensity; uint LightColor; int LightX; @@ -84,16 +83,11 @@ struct type_UniformBuffer }; struct type_UniformBuffer_1 -{ - float4x4 ShadowTransform; -}; - -struct type_UniformBuffer_2 { float3 PlayerPosition; }; -struct type_UniformBuffer_3 +struct type_UniformBuffer_2 { float4 Sun; float4 SkyTop; @@ -101,7 +95,7 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _90 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -117,147 +111,70 @@ struct main0_in float in_var_TEXCOORD3 [[user(locn3)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) { main0_out out = {}; - uint _127 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _134 = in.in_var_TEXCOORD2 & 7u; - float3 _140 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_127].Indices[_134])); - float4 _144 = atlasTexture.sample(atlasSampler, _140.xy, uint(rint(_140.z))); - if (_144.w < 0.001000000047497451305389404296875) + uint _107 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _114 = in.in_var_TEXCOORD2 & 7u; + float3 _120 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_107].Indices[_114])); + float4 _124 = atlasTexture.sample(atlasSampler, _120.xy, uint(rint(_120.z))); + if (_124.w < 0.001000000047497451305389404296875) { discard_fragment(); } - uint _154 = uint(UniformBuffer.LightCount); - float3 _157; - _157 = float3(0.0); - float3 _158; - for (uint _160 = 0u; _160 < _154; _157 = _158, _160++) + uint _134 = uint(UniformBuffer.LightCount); + float3 _137; + _137 = float3(0.0); + float3 _138; + for (uint _140 = 0u; _140 < _134; _137 = _138, _140++) { - float _173 = float((lightBuffer._m0[_160].Color & 4278190080u) >> 24u); - float3 _179 = (float3(float(lightBuffer._m0[_160].X), float(lightBuffer._m0[_160].Y), float(lightBuffer._m0[_160].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _180 = length(_179); - if (_180 >= _173) + float _153 = float((lightBuffer._m0[_140].Color & 4278190080u) >> 24u); + float3 _159 = (float3(float(lightBuffer._m0[_140].X), float(lightBuffer._m0[_140].Y), float(lightBuffer._m0[_140].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _160 = length(_159); + if (_160 >= _153) { - _158 = _157; + _138 = _137; continue; } - float _187 = fast::clamp(dot(_109[_134], _179 / float3(_180)), 0.0, 1.0); - if (_187 <= 0.0) + float _167 = fast::clamp(dot(_90[_114], _159 / float3(_160)), 0.0, 1.0); + if (_167 <= 0.0) { - _158 = _157; + _138 = _137; continue; } - _158 = _157 + ((float3(float(lightBuffer._m0[_160].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_160].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _187) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_180 / _173, 0.0, 1.0)))); + _138 = _137 + ((float3(float(lightBuffer._m0[_140].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _167) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_160 / _153, 0.0, 1.0)))); } - float _330; + float _217; do { - if (UniformBuffer_3.Sun.w <= 0.0) - { - _330 = 0.0; - break; - } - float _227 = blockBuffer._m0[_127].SunIntensity * UniformBuffer_3.Sun.w; - if (blockBuffer._m0[_127].CanBeInShadow == 0u) - { - _330 = _227; - break; - } - float _238; - if (blockBuffer._m0[_127].IsOccluded != 0u) - { - _238 = fast::clamp(-dot(_109[_134], UniformBuffer_3.Sun.xyz), 0.0, 1.0); - } - else - { - _238 = 0.7070000171661376953125; - } - if (_238 <= 0.0) + if (UniformBuffer_2.Sun.w <= 0.0) { - _330 = 0.0; + _217 = 0.0; break; } - float4 _246 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _250 = _246.xyz / float3(_246.w); - float2 _253 = (_250.xy * 0.5) + float2(0.5); - float _255 = 1.0 - _253.y; - float2 _256 = _253; - _256.y = _255; - float _257 = _253.x; - bool _262; - if ((isunordered(_257, 0.0) || _257 >= 0.0)) - { - _262 = _257 > 1.0; - } - else - { - _262 = true; - } - bool _267; - if (!_262) - { - _267 = _255 < 0.0; - } - else + float _214; + if (blockBuffer._m0[_107].UseSunNormal != 0u) { - _267 = true; - } - bool _272; - if (!_267) - { - _272 = _255 > 1.0; - } - else - { - _272 = true; - } - bool _278; - if (!_272) - { - _278 = _250.z < 0.0; - } - else - { - _278 = true; - } - bool _284; - if (!_278) - { - _284 = _250.z > 1.0; + float _213; + if (blockBuffer._m0[_107].IsOccluded != 0u) + { + _213 = fast::clamp(-dot(_90[_114], UniformBuffer_2.Sun.xyz), 0.0, 1.0); + } + else + { + _213 = 0.7070000171661376953125; + } + _214 = _213; } else { - _284 = true; - } - if (_284) - { - _330 = _227 * _238; - break; - } - uint2 _288 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _294 = float2(1.0) / float2(float(_288.x), float(_288.y)); - float _297 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _238)); - float _299; - int _302; - _299 = 0.0; - _302 = -1; - float _300; - for (; _302 <= 1; _299 = _300, _302++) - { - _300 = _299; - for (int _310 = -1; _310 <= 1; ) - { - _300 += shadowTexture.sample_compare(shadowSampler, (_256 + (float2(float(_302), float(_310)) * _294)), _250.z - _297, level(0.0)); - _310++; - continue; - } + _214 = 1.0; } - _330 = (_227 * _238) * ((mix(1.0, _299 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)) * 0.100000001490116119384765625) + 0.7070000171661376953125); + _217 = (blockBuffer._m0[_107].SunIntensity * UniformBuffer_2.Sun.w) * _214; break; } while(false); - float3 _338 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_144.xyz * ((_157 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_330)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_338.y, length(_338.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _225 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_124.xyz * ((_137 + (UniformBuffer_2.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_217)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_225.y, length(_225.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 47e8893120fc817b0188a6a60c1b6afa573d0d29..eb4cfe183ad645782de1d5450cdbed84dea0e344 100644 GIT binary patch literal 7196 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 ISu6(s1q|=b%K!iX literal 10012 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 Rl}LT+J<;vii|lGT_#eux+z$W% diff --git a/shaders/bin/shadow.vert.json b/shaders/bin/shadow.vert.json deleted file mode 100644 index 5fa667c6..00000000 --- a/shaders/bin/shadow.vert.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 3, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "uint", "location": 0 }], "outputs": [] } diff --git a/shaders/bin/shadow.vert.msl b/shaders/bin/shadow.vert.msl deleted file mode 100644 index 41575c66..00000000 --- a/shaders/bin/shadow.vert.msl +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include - -using namespace metal; - -struct Block -{ - uint IsOpaque; - uint IsSolid; - uint IsSprite; - uint IsOccluded; - uint CanCreateShadow; - uint CanBeInShadow; - float SunIntensity; - uint LightColor; - int LightX; - int LightY; - int LightZ; - uint Indices[6]; -}; - -struct type_StructuredBuffer_Block -{ - Block _m0[1]; -}; - -struct type_UniformBuffer -{ - float4x4 Proj; -}; - -struct type_UniformBuffer_1 -{ - float4x4 View; -}; - -struct type_UniformBuffer_2 -{ - int2 ChunkPosition; -}; - -struct main0_out -{ - float4 gl_Position [[position]]; - float gl_ClipDistance [[clip_distance]] [1]; - float gl_ClipDistance_0 [[user(clip0)]]; -}; - -struct main0_in -{ - uint in_var_TEXCOORD0 [[attribute(0)]]; -}; - -vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]]) -{ - main0_out out = {}; - out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(UniformBuffer_2.ChunkPosition.x, 0, UniformBuffer_2.ChunkPosition.y)), 1.0)); - out.gl_ClipDistance[0u] = (blockBuffer._m0[(in.in_var_TEXCOORD0 >> 3u) & 31u].CanCreateShadow != 0u) ? 1.0 : (-1.0); - out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; - return out; -} - diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv deleted file mode 100644 index 3c7028711c0e6681387c5e211c453d73673d6ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2944 zcmZ{kTUS$85XUzOh?f>?tEg2lT&&ej0Cc~3Cz7q*?n?cBGUgPN41+1%{3q82%Z zeGclZG?GddHQG^qqtQxV^=#BG+d@=La!WssyXu{!nzW;2CvNXb?bVNgTa`^AgmySDsIV@11AZVdGRbI?2mgsu9L1 z3q-z8#rMj`8^%fbk49F0w6s=PU46KCMUY|!{Vv!JE=y+*sEZhM-Wi>P4nFR+uFgCs zKhP%vompXL=ZHrS?c@&a=-ADloX$Cuu_0A7qIC7V`sp=4lw2ec2PwChsC*f zQAEAe#leTOA|J!3YgsRdUi7x1{Ff;7?_<>7?Rl{0$1KP}56q7{ZMXY(_OURB`B@Hh z%VB$MIk*E1`>159sd!073i^e@CqA`brOyc5UtW0Khk(?=x} zZ~Ae`%$0o1tt2vk^pheE{^(zd%+7tMMD%C*c>gnjJ|>yBGdthZe}RrKHJny{cAT8( z>Tp*Xe~>gRvjfdsXDz>wl>0nk3@s-S+3YWMXFYiu6k^&PCBXd4DH< zQy#?3h{!#!O`_-TMbyVmL-;X+SrIn#`$4k#vG3;hqhxF~evLvDg@?lF=7x-Nfy}eQG=*uE}!R^i!$=o?AvOBAi!MSr@o5TD4Bw~k{5q93s z-shfV?DM*Z9lS4MzwpIpQv7ETxcU4dnVk!LR;7bKP#)%56HznAum_UC*cZbd=2$_z zrYa}I>t4pkIqdxY{;9m!9*MAXpJ9)4oI3xOAK%Us5xwzS{Fi1;O}~o3$#+$BOPk3a W6HjlK#MeaBLL7E<;@+$3S<(M)#mo}` diff --git a/shaders/bin/transparent.frag.json b/shaders/bin/transparent.frag.json index c4ab9a94..40ebfefa 100644 --- a/shaders/bin/transparent.frag.json +++ b/shaders/bin/transparent.frag.json @@ -1 +1 @@ -{ "samplers": 3, "storage_textures": 0, "storage_buffers": 2, "uniform_buffers": 4, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float4", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "float2", "location": 1 }, { "name": "in.var.TEXCOORD2", "type": "uint", "location": 2 }, { "name": "in.var.TEXCOORD3", "type": "float2", "location": 3 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }] } +{ "samplers": 2, "storage_textures": 0, "storage_buffers": 2, "uniform_buffers": 3, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float4", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "float2", "location": 1 }, { "name": "in.var.TEXCOORD2", "type": "uint", "location": 2 }, { "name": "in.var.TEXCOORD3", "type": "float2", "location": 3 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }] } diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index fbda9246..6031203e 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -50,8 +50,7 @@ struct Block uint IsSolid; uint IsSprite; uint IsOccluded; - uint CanCreateShadow; - uint CanBeInShadow; + uint UseSunNormal; float SunIntensity; uint LightColor; int LightX; @@ -84,16 +83,11 @@ struct type_UniformBuffer }; struct type_UniformBuffer_1 -{ - float4x4 ShadowTransform; -}; - -struct type_UniformBuffer_2 { float3 PlayerPosition; }; -struct type_UniformBuffer_3 +struct type_UniformBuffer_2 { float4 Sun; float4 SkyTop; @@ -101,7 +95,7 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant spvUnsafeArray _109 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _92 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -116,153 +110,76 @@ struct main0_in float2 in_var_TEXCOORD3 [[user(locn3), center_no_perspective]]; }; -fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], texture2d positionTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler positionSampler [[sampler(1)]]) { main0_out out = {}; - uint _128 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _135 = in.in_var_TEXCOORD2 & 7u; - float3 _143 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_128].Indices[_135])); - float4 _147 = atlasTexture.sample(atlasSampler, _143.xy, uint(rint(_143.z))); - float _149 = _147.w; - uint _152 = uint(UniformBuffer.LightCount); - float3 _155; - _155 = float3(0.0); - float3 _156; - for (uint _158 = 0u; _158 < _152; _155 = _156, _158++) + uint _111 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _118 = in.in_var_TEXCOORD2 & 7u; + float3 _126 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_111].Indices[_118])); + float4 _130 = atlasTexture.sample(atlasSampler, _126.xy, uint(rint(_126.z))); + float _132 = _130.w; + uint _135 = uint(UniformBuffer.LightCount); + float3 _138; + _138 = float3(0.0); + float3 _139; + for (uint _141 = 0u; _141 < _135; _138 = _139, _141++) { - float _171 = float((lightBuffer._m0[_158].Color & 4278190080u) >> 24u); - float3 _177 = (float3(float(lightBuffer._m0[_158].X), float(lightBuffer._m0[_158].Y), float(lightBuffer._m0[_158].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _178 = length(_177); - if (_178 >= _171) + float _154 = float((lightBuffer._m0[_141].Color & 4278190080u) >> 24u); + float3 _160 = (float3(float(lightBuffer._m0[_141].X), float(lightBuffer._m0[_141].Y), float(lightBuffer._m0[_141].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _161 = length(_160); + if (_161 >= _154) { - _156 = _155; + _139 = _138; continue; } - float _185 = fast::clamp(dot(_109[_135], _177 / float3(_178)), 0.0, 1.0); - if (_185 <= 0.0) + float _168 = fast::clamp(dot(_92[_118], _160 / float3(_161)), 0.0, 1.0); + if (_168 <= 0.0) { - _156 = _155; + _139 = _138; continue; } - _156 = _155 + ((float3(float(lightBuffer._m0[_158].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_158].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_158].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _185) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_178 / _171, 0.0, 1.0)))); + _139 = _138 + ((float3(float(lightBuffer._m0[_141].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_141].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_141].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _168) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_161 / _154, 0.0, 1.0)))); } - float _328; + float _218; do { - if (UniformBuffer_3.Sun.w <= 0.0) - { - _328 = 0.0; - break; - } - float _225 = blockBuffer._m0[_128].SunIntensity * UniformBuffer_3.Sun.w; - if (blockBuffer._m0[_128].CanBeInShadow == 0u) - { - _328 = _225; - break; - } - float _236; - if (blockBuffer._m0[_128].IsOccluded != 0u) - { - _236 = fast::clamp(-dot(_109[_135], UniformBuffer_3.Sun.xyz), 0.0, 1.0); - } - else - { - _236 = 0.7070000171661376953125; - } - if (_236 <= 0.0) + if (UniformBuffer_2.Sun.w <= 0.0) { - _328 = 0.0; + _218 = 0.0; break; } - float4 _244 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _248 = _244.xyz / float3(_244.w); - float2 _251 = (_248.xy * 0.5) + float2(0.5); - float _253 = 1.0 - _251.y; - float2 _254 = _251; - _254.y = _253; - float _255 = _251.x; - bool _260; - if ((isunordered(_255, 0.0) || _255 >= 0.0)) - { - _260 = _255 > 1.0; - } - else - { - _260 = true; - } - bool _265; - if (!_260) - { - _265 = _253 < 0.0; - } - else + float _215; + if (blockBuffer._m0[_111].UseSunNormal != 0u) { - _265 = true; - } - bool _270; - if (!_265) - { - _270 = _253 > 1.0; - } - else - { - _270 = true; - } - bool _276; - if (!_270) - { - _276 = _248.z < 0.0; - } - else - { - _276 = true; - } - bool _282; - if (!_276) - { - _282 = _248.z > 1.0; + float _214; + if (blockBuffer._m0[_111].IsOccluded != 0u) + { + _214 = fast::clamp(-dot(_92[_118], UniformBuffer_2.Sun.xyz), 0.0, 1.0); + } + else + { + _214 = 0.7070000171661376953125; + } + _215 = _214; } else { - _282 = true; - } - if (_282) - { - _328 = _225 * _236; - break; - } - uint2 _286 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _292 = float2(1.0) / float2(float(_286.x), float(_286.y)); - float _295 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _236)); - float _297; - int _300; - _297 = 0.0; - _300 = -1; - float _298; - for (; _300 <= 1; _297 = _298, _300++) - { - _298 = _297; - for (int _308 = -1; _308 <= 1; ) - { - _298 += shadowTexture.sample_compare(shadowSampler, (_254 + (float2(float(_300), float(_308)) * _292)), _248.z - _295, level(0.0)); - _308++; - continue; - } + _215 = 1.0; } - _328 = (_225 * _236) * ((mix(1.0, _297 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)) * 0.100000001490116119384765625) + 0.7070000171661376953125); + _218 = (blockBuffer._m0[_111].SunIntensity * UniformBuffer_2.Sun.w) * _215; break; } while(false); - float3 _331 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - float _365; - if (blockBuffer._m0[_128].Indices[_135] == 16u) + float3 _221 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; + float _255; + if (blockBuffer._m0[_111].Indices[_118] == 16u) { - _365 = _149 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _255 = _132 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _365 = _149; + _255 = _132; } - out.out_var_SV_Target0 = float4(mix(_147.xyz * ((_155 + UniformBuffer_3.Ambient.xyz) + float3(_328)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_331.y, length(_331.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _365); + out.out_var_SV_Target0 = float4(mix(_130.xyz * ((_138 + UniformBuffer_2.Ambient.xyz) + float3(_218)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_221.y, length(_221.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _255); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index de94790dcba12e2cc8fdfe258da09f674b39d7cc..c11ba547fe7732906a7daa471c62f519f0b0d26e 100644 GIT binary patch literal 7596 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 lxc0AQ{3$CP-raC-YA-GMWGQ&kTZA2uii8 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 diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 70c4a204..69f21a07 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -2,10 +2,8 @@ Texture2DArray atlasTexture : register(t0, space2); SamplerState atlasSampler : register(s0, space2); -Texture2D shadowTexture : register(t1, space2); -SamplerComparisonState shadowSampler : register(s1, space2); -StructuredBuffer blockBuffer : register(t2, space2); -StructuredBuffer lightBuffer : register(t3, space2); +StructuredBuffer blockBuffer : register(t1, space2); +StructuredBuffer lightBuffer : register(t2, space2); cbuffer UniformBuffer : register(b0, space3) { @@ -13,16 +11,11 @@ cbuffer UniformBuffer : register(b0, space3) }; cbuffer UniformBuffer : register(b1, space3) -{ - float4x4 ShadowTransform : packoffset(c0); -}; - -cbuffer UniformBuffer : register(b2, space3) { float3 PlayerPosition : packoffset(c0); }; -cbuffer UniformBuffer : register(b3, space3) +cbuffer UniformBuffer : register(b2, space3) { float4 Sun : packoffset(c0); float4 SkyTop : packoffset(c1); @@ -60,15 +53,7 @@ Output main(Input input) float3 normal = GetNormal(input.Voxel); float3 pointLight = GetPointLight(lightBuffer, LightCount, input.WorldPosition.xyz, normal); float3 ambient = Ambient.xyz; - float sunlight = GetSunlight( - shadowTexture, - shadowSampler, - ShadowTransform, - Sun.xyz, - Sun.w, - input.WorldPosition.xyz, - normal, - block); + float sunlight = GetSunlight(Sun.xyz, Sun.w, normal, block); float3 litColor = albedo * (pointLight + ambient * input.Occlusion + sunlight); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFogValue(distance(input.WorldPosition.xz, PlayerPosition.xz)); diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index e27b0b77..94f16917 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -13,8 +13,7 @@ struct Block uint IsSolid; uint IsSprite; uint IsOccluded; - uint CanCreateShadow; - uint CanBeInShadow; + uint UseSunNormal; float SunIntensity; uint LightColor; int LightX; @@ -148,56 +147,18 @@ float3 GetPointLight(StructuredBuffer lights, uint lightCount, float3 pos return accumulatedLight; } -float GetSunlight( - Texture2D shadowTexture, - SamplerComparisonState shadowSampler, - float4x4 shadowTransform, - float3 sunDirection, - float sunIntensity, - float3 position, - float3 normal, - Block block) +float GetSunlight(float3 sunDirection, float sunIntensity, float3 normal, Block block) { if (sunIntensity <= 0.0f) { return 0.0f; } - float sunlight = block.SunIntensity * sunIntensity; - if (!block.CanBeInShadow) + float lightAngle = 1.0f; + if (block.UseSunNormal) { - return sunlight; + lightAngle = block.IsOccluded ? saturate(-dot(normal, sunDirection)) : 0.707f; } - float lightAngle = block.IsOccluded ? saturate(-dot(normal, sunDirection)) : 0.707f; - if (lightAngle <= 0.0f) - { - return 0.0f; - } - float4 shadowPosition = mul(shadowTransform, float4(position, 1.0f)); - shadowPosition.xyz /= shadowPosition.w; - float2 uv = shadowPosition.xy * 0.5f + 0.5f; - uv.y = 1.0f - uv.y; - if (uv.x < 0.0f || uv.x > 1.0f || uv.y < 0.0f || uv.y > 1.0f || shadowPosition.z < 0.0f || shadowPosition.z > 1.0f) - { - return sunlight * lightAngle; - } - uint width; - uint height; - shadowTexture.GetDimensions(width, height); - float2 texelSize = 1.0f / float2(width, height); - float bias = 0.0003f + 0.001f * (1.0f - lightAngle); - float shadowVisibility = 0.0f; - for (int x = -1; x <= 1; x++) - { - for (int y = -1; y <= 1; y++) - { - shadowVisibility += - shadowTexture.SampleCmpLevelZero(shadowSampler, uv + float2(x, y) * texelSize, shadowPosition.z - bias); - } - } - shadowVisibility /= 9.0f; - float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); - shadowVisibility = lerp(1.0f, shadowVisibility, shadowFade) * 0.1 + 0.707f; - return sunlight * lightAngle * shadowVisibility; + return block.SunIntensity * sunIntensity * lightAngle; } float GetFogValue(float distance) diff --git a/shaders/shadow.vert b/shaders/shadow.vert deleted file mode 100644 index b72568de..00000000 --- a/shaders/shadow.vert +++ /dev/null @@ -1,40 +0,0 @@ -#include "shader.hlsl" - -StructuredBuffer blockBuffer : register(t0, space0); - -cbuffer UniformBuffer : register(b0, space1) -{ - float4x4 Proj; -}; - -cbuffer UniformBuffer : register(b1, space1) -{ - float4x4 View; -}; - -cbuffer UniformBuffer : register(b2, space1) -{ - int2 ChunkPosition; -}; - -struct Input -{ - uint Voxel : TEXCOORD0; -}; - -struct Output -{ - float4 Position : SV_Position; - float ClipDistance : SV_ClipDistance0; -}; - -Output main(Input input) -{ - Output output; - int3 chunkPosition = int3(ChunkPosition.x, 0, ChunkPosition.y); - float3 position = GetPosition(input.Voxel) + chunkPosition; - Block block = blockBuffer[GetBlockIndex(input.Voxel)]; - output.Position = mul(Proj, mul(View, float4(position, 1.0f))); - output.ClipDistance = block.CanCreateShadow ? 1.0f : -1.0f; - return output; -} diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 5253200f..f449fad2 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -2,12 +2,10 @@ Texture2DArray atlasTexture : register(t0, space2); SamplerState atlasSampler : register(s0, space2); -Texture2D shadowTexture : register(t1, space2); -SamplerComparisonState shadowSampler : register(s1, space2); -Texture2D positionTexture : register(t2, space2); -SamplerState positionSampler : register(s2, space2); -StructuredBuffer blockBuffer : register(t3, space2); -StructuredBuffer lightBuffer : register(t4, space2); +Texture2D positionTexture : register(t1, space2); +SamplerState positionSampler : register(s1, space2); +StructuredBuffer blockBuffer : register(t2, space2); +StructuredBuffer lightBuffer : register(t3, space2); cbuffer UniformBuffer : register(b0, space3) { @@ -15,16 +13,11 @@ cbuffer UniformBuffer : register(b0, space3) }; cbuffer UniformBuffer : register(b1, space3) -{ - float4x4 ShadowTransform : packoffset(c0); -}; - -cbuffer UniformBuffer : register(b2, space3) { float3 PlayerPosition : packoffset(c0); }; -cbuffer UniformBuffer : register(b3, space3) +cbuffer UniformBuffer : register(b2, space3) { float4 Sun : packoffset(c0); float4 SkyTop : packoffset(c1); @@ -54,8 +47,7 @@ float4 main(Input input) : SV_Target0 float4 position = input.WorldPosition; float3 pointLight = GetPointLight(lightBuffer, LightCount, position.xyz, normal); float3 ambient = Ambient.xyz; - float sunlight = - GetSunlight(shadowTexture, shadowSampler, ShadowTransform, Sun.xyz, Sun.w, position.xyz, normal, block); + float sunlight = GetSunlight(Sun.xyz, Sun.w, normal, block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFogValue(distance(position.xz, PlayerPosition.xz)); if (index == kWater) diff --git a/src/block.c b/src/block.c index cb2bb504..3d3595f3 100644 --- a/src/block.c +++ b/src/block.c @@ -10,8 +10,7 @@ typedef struct BlockData Uint32 is_solid; Uint32 is_sprite; Uint32 is_occluded; - Uint32 can_create_shadow; - Uint32 can_be_in_shadow; + Uint32 use_sun_normal; float sun_intensity; Light light; Uint32 indices[DIRECTION_COUNT]; @@ -25,8 +24,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = false, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = false, + .use_sun_normal = false, .sun_intensity = 0.0f, .light = {0}, .indices = {0}, @@ -37,8 +35,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {2, 2, 2, 2, 1, 3}, @@ -49,8 +46,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {3, 3, 3, 3, 3, 3}, @@ -61,8 +57,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {5, 5, 5, 5, 5, 5}, @@ -73,8 +68,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {6, 6, 6, 6, 6, 6}, @@ -85,8 +79,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {4, 4, 4, 4, 4, 4}, @@ -97,8 +90,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {8, 8, 8, 8, 7, 7}, @@ -109,8 +101,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {10, 10, 10, 10, 10, 10}, @@ -121,8 +112,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = false, - .can_be_in_shadow = false, + .use_sun_normal = false, .sun_intensity = 1.0f, .light = {0}, .indices = {9, 9, 9, 9, 9, 9}, @@ -133,8 +123,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {15, 15, 15, 15, 15, 15}, @@ -145,8 +134,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {13, 13, 13, 13, 13, 13}, @@ -157,8 +145,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {12, 12, 12, 12, 12, 12}, @@ -169,8 +156,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {11, 11, 11, 11, 11, 11}, @@ -181,8 +167,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {14, 14, 14, 14, 14, 14}, @@ -193,8 +178,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = false, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {16, 16, 16, 16, 16, 16}, @@ -205,8 +189,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {236, 39, 63, 15}, .indices = {17, 17, 17, 17, 17, 17}, @@ -217,8 +200,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {90, 181, 82, 15}, .indices = {18, 18, 18, 18, 18, 18}, @@ -229,8 +211,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {51, 136, 222, 15}, .indices = {19, 19, 19, 19, 19, 19}, @@ -241,8 +222,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {243, 168, 51, 15}, .indices = {20, 20, 20, 20, 20, 20}, @@ -253,8 +233,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {54, 197, 244, 15}, .indices = {21, 21, 21, 21, 21, 21}, @@ -265,8 +244,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {250, 110, 121, 15}, .indices = {22, 22, 22, 22, 22, 22}, @@ -277,8 +255,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = false, .is_sprite = true, .is_occluded = false, - .can_create_shadow = false, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {255, 255, 255, 15}, .indices = {23, 23, 23, 23, 23, 23}, @@ -289,8 +266,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = .is_solid = true, .is_sprite = false, .is_occluded = true, - .can_create_shadow = true, - .can_be_in_shadow = true, + .use_sun_normal = true, .sun_intensity = 0.55f, .light = {0}, .indices = {24, 24, 24, 24, 24, 24}, @@ -300,7 +276,7 @@ static const BlockData BLOCKS[BLOCK_COUNT] = SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) { SDL_COMPILE_TIME_ASSERT("", sizeof(Light) == sizeof(Uint32) * 4); - SDL_COMPILE_TIME_ASSERT("", sizeof(BlockData) == sizeof(Uint32) * 17); + SDL_COMPILE_TIME_ASSERT("", sizeof(BlockData) == sizeof(Uint32) * 16); CPUBuffer cpu_blocks; GPUBuffer gpu_blocks; CPUBuffer_Init(&cpu_blocks, device, sizeof(BlockData)); @@ -350,16 +326,6 @@ bool Block_IsOccluded(Block block) return BLOCKS[block].is_occluded; } -bool Block_CanCreateShadow(Block block) -{ - return BLOCKS[block].can_create_shadow; -} - -bool Block_CanBeInShadow(Block block) -{ - return BLOCKS[block].can_be_in_shadow; -} - int Block_GetIndex(Block block, Direction direction) { return BLOCKS[block].indices[direction]; diff --git a/src/block.h b/src/block.h index 55669381..3ab0cd92 100644 --- a/src/block.h +++ b/src/block.h @@ -51,8 +51,6 @@ bool Block_IsOpaque(Block block); bool Block_IsSolid(Block block); bool Block_IsSprite(Block block); bool Block_IsOccluded(Block block); -bool Block_CanCreateShadow(Block block); -bool Block_CanBeInShadow(Block block); int Block_GetIndex(Block block, Direction direction); bool Block_IsLight(Block block); Light Block_GetLight(Block block); diff --git a/src/camera.c b/src/camera.c index 55ace041..26d7264b 100644 --- a/src/camera.c +++ b/src/camera.c @@ -189,28 +189,6 @@ void Camera_Update(Camera* camera) Frustum(camera->planes, camera->matrix); } -void Camera_Snap(Camera* camera, int resolution) -{ - SDL_assert(camera->type == CAMERA_TYPE_ORTHO); - SDL_assert(resolution > 0); - Camera_Update(camera); - float texel = camera->ortho * 2.0f / resolution; - float rx = camera->view[0][0]; - float ry = camera->view[1][0]; - float rz = camera->view[2][0]; - float ux = camera->view[0][1]; - float uy = camera->view[1][1]; - float uz = camera->view[2][1]; - float x = rx * camera->x + ry * camera->y + rz * camera->z; - float y = ux * camera->x + uy * camera->y + uz * camera->z; - float dx = SDL_roundf(x / texel) * texel - x; - float dy = SDL_roundf(y / texel) * texel - y; - camera->x += rx * dx + ux * dy; - camera->y += ry * dx + uy * dy; - camera->z += rz * dx + uz * dy; - Camera_Update(camera); -} - void Camera_Move(Camera* camera, float right, float up, float forward) { float sy = SDL_sinf(camera->yaw); diff --git a/src/camera.h b/src/camera.h index e749a685..f943ea61 100644 --- a/src/camera.h +++ b/src/camera.h @@ -37,7 +37,6 @@ typedef struct Camera void Camera_Init(Camera* camera, CameraType type); void Camera_Update(Camera* camera); -void Camera_Snap(Camera* camera, int resolution); void Camera_Move(Camera* camera, float right, float up, float forward); void Camera_Resize(Camera* camera, int width, int height); void Camera_Rotate(Camera* camera, float pitch, float yaw); diff --git a/src/main.c b/src/main.c index 68a9be34..7d7c1f1d 100644 --- a/src/main.c +++ b/src/main.c @@ -14,7 +14,6 @@ static const char* SAVE_PATH = "blocks.sqlite3"; static const int ATLAS_WIDTH = 512; static const int ATLAS_MIP_LEVELS = 4; static const int BLOCK_WIDTH = 16; -static const int SHADOW_RESOLUTION = 2048; static const SDL_GPUSampleCount SAMPLE_COUNT = SDL_GPU_SAMPLECOUNT_4; static SDL_Window* window; @@ -24,7 +23,6 @@ static SDL_GPUTextureFormat depth_format; static SDL_GPUGraphicsPipeline* opaque_pipeline; static SDL_GPUGraphicsPipeline* transparent_pipeline; static SDL_GPUGraphicsPipeline* depth_pipeline; -static SDL_GPUGraphicsPipeline* shadow_pipeline; static SDL_GPUGraphicsPipeline* sky_pipeline; static SDL_GPUGraphicsPipeline* raycast_pipeline; static SDL_GPUGraphicsPipeline* ui_pipeline; @@ -34,10 +32,8 @@ static SDL_GPUTexture* depth_texture; static SDL_GPUTexture* position_texture; static SDL_GPUTexture* multisample_color_texture; static SDL_GPUTexture* multisample_position_texture; -static SDL_GPUTexture* shadow_texture; static SDL_GPUBuffer* block_buffer; static SDL_GPUSampler* nearest_sampler; -static SDL_GPUSampler* shadow_sampler; static Sky sky; static Player player; static Uint64 previous_ticks; @@ -280,38 +276,6 @@ static bool CreateTransparentPipeline() return transparent_pipeline != NULL; } -static bool CreateShadowPipeline() -{ - SDL_GPUVertexAttribute vertex_attributes[1] = {0}; - SDL_GPUVertexBufferDescription vertex_buffers[1] = {0}; - vertex_attributes[0].format = SDL_GPU_VERTEXELEMENTFORMAT_UINT; - vertex_buffers[0].pitch = 4; - SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = Shader_Load(device, "shadow.vert"); - info.fragment_shader = Shader_Load(device, "depth.frag"); - info.target_info.has_depth_stencil_target = true; - info.target_info.depth_stencil_format = depth_format; - info.vertex_input_state.num_vertex_attributes = 1; - info.vertex_input_state.vertex_attributes = vertex_attributes; - info.vertex_input_state.num_vertex_buffers = 1; - info.vertex_input_state.vertex_buffer_descriptions = vertex_buffers; - info.depth_stencil_state.enable_depth_test = true; - info.depth_stencil_state.enable_depth_write = true; - info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS; - info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; - info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; - info.rasterizer_state.depth_bias_constant_factor = 1.0f; - info.rasterizer_state.depth_bias_slope_factor = 2.0f; - info.rasterizer_state.enable_depth_bias = true; - if (info.vertex_shader && info.fragment_shader) - { - shadow_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); - } - SDL_ReleaseGPUShader(device, info.vertex_shader); - SDL_ReleaseGPUShader(device, info.fragment_shader); - return shadow_pipeline != NULL; -} - static bool CreateSkyPipeline() { SDL_GPUColorTargetDescription color_targets[2] = {0}; @@ -408,35 +372,6 @@ static bool CreateSamplers() SDL_Log("Failed to create nearest sampler: %s", SDL_GetError()); return false; } - info.min_filter = SDL_GPU_FILTER_LINEAR; - info.mag_filter = SDL_GPU_FILTER_LINEAR; - info.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; - info.enable_compare = true; - shadow_sampler = SDL_CreateGPUSampler(device, &info); - if (!shadow_sampler) - { - SDL_Log("Failed to create shadow sampler: %s", SDL_GetError()); - return false; - } - return true; -} - -static bool CreateTextures() -{ - SDL_GPUTextureCreateInfo info = {0}; - info.type = SDL_GPU_TEXTURETYPE_2D; - info.format = depth_format; - info.usage = SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET | SDL_GPU_TEXTUREUSAGE_SAMPLER; - info.width = SHADOW_RESOLUTION; - info.height = SHADOW_RESOLUTION; - info.layer_count_or_depth = 1; - info.num_levels = 1; - shadow_texture = SDL_CreateGPUTexture(device, &info); - if (!shadow_texture) - { - SDL_Log("Failed to create shadow texture: %s", SDL_GetError()); - return false; - } return true; } @@ -485,11 +420,6 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to create samplers: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!CreateTextures()) - { - SDL_Log("Failed to create textures: %s", SDL_GetError()); - return SDL_APP_FAILURE; - } if (!CreateOpaquePipeline()) { SDL_Log("Failed to create opaque pipeline: %s", SDL_GetError()); @@ -505,11 +435,6 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to create predepth pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!CreateShadowPipeline()) - { - SDL_Log("Failed to create shadow pipeline: %s", SDL_GetError()); - return SDL_APP_FAILURE; - } if (!CreateSkyPipeline()) { SDL_Log("Failed to create sky pipeline: %s", SDL_GetError()); @@ -552,8 +477,6 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) Sky_Save(&sky); Save_Free(); SDL_ReleaseGPUSampler(device, nearest_sampler); - SDL_ReleaseGPUSampler(device, shadow_sampler); - SDL_ReleaseGPUTexture(device, shadow_texture); SDL_ReleaseGPUTexture(device, multisample_position_texture); SDL_ReleaseGPUTexture(device, multisample_color_texture); SDL_ReleaseGPUTexture(device, position_texture); @@ -564,7 +487,6 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) SDL_ReleaseGPUGraphicsPipeline(device, ui_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, raycast_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, sky_pipeline); - SDL_ReleaseGPUGraphicsPipeline(device, shadow_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, depth_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, transparent_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, opaque_pipeline); @@ -628,34 +550,6 @@ static bool Resize(int width, int height) return true; } -static void RenderShadowPass(SDL_GPUCommandBuffer* cbuf) -{ - return; - if (!sky.is_shadow_on) - { - return; - } - SDL_GPUDepthStencilTargetInfo depth_info = {0}; - depth_info.load_op = SDL_GPU_LOADOP_CLEAR; - depth_info.stencil_load_op = SDL_GPU_LOADOP_CLEAR; - depth_info.store_op = SDL_GPU_STOREOP_STORE; - depth_info.texture = shadow_texture; - depth_info.clear_depth = 1.0f; - depth_info.cycle = true; - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, NULL, 0, &depth_info); - if (!pass) - { - SDL_Log("Failed to begin render pass: %s", SDL_GetError()); - return; - } - SDL_BindGPUGraphicsPipeline(pass, shadow_pipeline); - SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); - SDL_PushGPUDebugGroup(cbuf, "shadow"); - World_Render(&sky.camera, cbuf, pass, WORLD_FLAGS_OPAQUE); - SDL_PopGPUDebugGroup(cbuf); - SDL_EndGPURenderPass(pass); -} - static void DrawSky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_PushGPUDebugGroup(cbuf, "sky"); @@ -669,17 +563,14 @@ static void DrawSky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) static void DrawOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { - SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; - sampler_bindings[0].texture = atlas_texture; - sampler_bindings[0].sampler = nearest_sampler; - sampler_bindings[1].texture = shadow_texture; - sampler_bindings[1].sampler = shadow_sampler; + SDL_GPUTextureSamplerBinding sampler_binding = {0}; + sampler_binding.texture = atlas_texture; + sampler_binding.sampler = nearest_sampler; SDL_PushGPUDebugGroup(cbuf, "opaque"); SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.camera.matrix, sizeof(sky.camera.matrix)); - SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); - SDL_PushGPUFragmentUniformData(cbuf, 3, sky.sun, sizeof(float) * 16); - SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); + SDL_PushGPUFragmentUniformData(cbuf, 1, player.camera.position, sizeof(player.camera.position)); + SDL_PushGPUFragmentUniformData(cbuf, 2, sky.sun, sizeof(float) * 16); + SDL_BindGPUFragmentSamplers(pass, 0, &sampler_binding, 1); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); @@ -737,19 +628,16 @@ static void RenderTransparentDepthPass(SDL_GPUCommandBuffer* cbuf) static void DrawTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { - SDL_GPUTextureSamplerBinding sampler_bindings[3] = {0}; + SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; sampler_bindings[0].texture = atlas_texture; sampler_bindings[0].sampler = nearest_sampler; - sampler_bindings[1].texture = shadow_texture; - sampler_bindings[1].sampler = shadow_sampler; - sampler_bindings[2].texture = position_texture; - sampler_bindings[2].sampler = nearest_sampler; + sampler_bindings[1].texture = position_texture; + sampler_bindings[1].sampler = nearest_sampler; SDL_PushGPUDebugGroup(cbuf, "transparent"); SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.camera.matrix, sizeof(sky.camera.matrix)); - SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, sizeof(player.camera.position)); - SDL_PushGPUFragmentUniformData(cbuf, 3, sky.sun, sizeof(float) * 16); - SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); + SDL_PushGPUFragmentUniformData(cbuf, 1, player.camera.position, sizeof(player.camera.position)); + SDL_PushGPUFragmentUniformData(cbuf, 2, sky.sun, sizeof(float) * 16); + SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); @@ -851,7 +739,6 @@ static void RenderFrame() return; } Camera_Update(&player.camera); - RenderShadowPass(cbuf); RenderOpaquePass(cbuf); RenderTransparentDepthPass(cbuf); RenderTransparentPass(cbuf, swapchain_texture); @@ -868,7 +755,7 @@ SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) { Player_Move(&player, dt); } - Sky_Update(&sky, &player.camera, SHADOW_RESOLUTION, dt / 1000.0f); + Sky_Update(&sky, dt / 1000.0f); World_Update(&player.camera); RenderFrame(); return SDL_APP_CONTINUE; diff --git a/src/sky.c b/src/sky.c index 3f702972..67200f01 100644 --- a/src/sky.c +++ b/src/sky.c @@ -10,10 +10,6 @@ static const float DAY_END = 90.0f / 180.0f; static const float SUNSET_END = 120.0f / 180.0f; static const float SPEED = 0.1f; static const float AMBIENT_SCALE = 0.35f; -static const float SHADOW_Y = 30.0f; -static const float SHADOW_ORTHO = 300.0f; -static const float SHADOW_FAR = 300.0f; -static const int SHADOW_UPDATE_FRAMES = 300; static const float NIGHT_SKY_TOP[3] = {0.01f, 0.02f, 0.06f}; static const float NIGHT_SKY_HORIZON[3] = {0.06f, 0.08f, 0.18f}; static const float TWILIGHT_SKY_TOP[3] = {0.24f, 0.16f, 0.32f}; @@ -52,10 +48,6 @@ void Sky_Save(const Sky* sky) void Sky_Load(Sky* sky) { SDL_COMPILE_TIME_ASSERT("", offsetof(Sky, time_of_day) == sizeof(float) * 16); - Camera_Init(&sky->camera, CAMERA_TYPE_ORTHO); - sky->camera.ortho = SHADOW_ORTHO; - sky->camera.far = SHADOW_FAR; - sky->frame = 0; sky->time_of_day = SUNRISE_END + (DAY_END - SUNRISE_END) / 2.0f; float time; if (Save_GetSky(&time) && time >= 0.0f && time < 1.0f) @@ -64,7 +56,7 @@ void Sky_Load(Sky* sky) } } -void Sky_Update(Sky* sky, const Camera* camera, int resolution, float dt) +void Sky_Update(Sky* sky, float dt) { sky->time_of_day += dt * SPEED / TOTAL_LENGTH; sky->time_of_day = SDL_fmodf(sky->time_of_day, 1.0f); @@ -105,20 +97,8 @@ void Sky_Update(Sky* sky, const Camera* camera, int resolution, float dt) sky->sun[1] = -intensity; sky->sun[2] = -c * SDL_sqrtf(0.5f); sky->sun[3] = intensity; - sky->is_shadow_on = intensity > 0.0f; float ambient = SDL_clamp(intensity, 0.1f, 1.0f) * AMBIENT_SCALE; sky->ambient[0] *= ambient; sky->ambient[1] *= ambient; sky->ambient[2] *= ambient; - Camera* shadow = &sky->camera; - if (sky->frame == 0) - { - shadow->pitch = SDL_asinf(sky->sun[1]); - shadow->yaw = SDL_atan2f(sky->sun[0], -sky->sun[2]); - } - sky->frame = (sky->frame + 1) % SHADOW_UPDATE_FRAMES; - shadow->x = camera->x; - shadow->y = SHADOW_Y; - shadow->z = camera->z; - Camera_Snap(shadow, resolution); } diff --git a/src/sky.h b/src/sky.h index dbd21d25..730dbc40 100644 --- a/src/sky.h +++ b/src/sky.h @@ -2,8 +2,6 @@ #include -#include "camera.h" - typedef struct Sky { float sun[4]; @@ -11,12 +9,9 @@ typedef struct Sky float horizon[4]; float ambient[4]; float time_of_day; - bool is_shadow_on; - Camera camera; - int frame; } Sky; void Sky_Reset(Sky* sky); void Sky_Save(const Sky* sky); void Sky_Load(Sky* sky); -void Sky_Update(Sky* sky, const Camera* camera, int resolution, float dt); +void Sky_Update(Sky* sky, float dt); diff --git a/src/sort.c b/src/sort.c new file mode 100644 index 00000000..66ebeb11 --- /dev/null +++ b/src/sort.c @@ -0,0 +1,18 @@ +#include + +#include "sort.h" + +static int Distance2D(void* userdata, const void* lhs, const void* rhs) +{ + int center = *(int*)userdata; + const int* l = lhs; + const int* r = rhs; + int dl = (l[0] - center) * (l[0] - center) + (l[1] - center) * (l[1] - center); + int dr = (r[0] - center) * (r[0] - center) + (r[1] - center) * (r[1] - center); + return (dl > dr) - (dl < dr); +} + +void Sort_Distance2D(int data[][2], int size, int center) +{ + SDL_qsort_r(data, size, sizeof(data[0]), Distance2D, ¢er); +} diff --git a/src/sort.h b/src/sort.h new file mode 100644 index 00000000..eb695ae8 --- /dev/null +++ b/src/sort.h @@ -0,0 +1,3 @@ +#pragma once + +void Sort_Distance2D(int data[][2], int size, int center); diff --git a/src/worker.c b/src/worker.c index 01c9fa17..81f48080 100644 --- a/src/worker.c +++ b/src/worker.c @@ -2,7 +2,7 @@ #include "worker.h" -static int Run(void* args) +static int WorkerFunction(void* args) { Worker* worker = args; while (true) @@ -44,7 +44,7 @@ void Worker_Init(Worker* worker) { SDL_Log("Failed to create condition variable: %s", SDL_GetError()); } - worker->thread = SDL_CreateThread(Run, "worker", worker); + worker->thread = SDL_CreateThread(WorkerFunction, "worker", worker); if (!worker->thread) { SDL_Log("Failed to create thread: %s", SDL_GetError()); diff --git a/src/world.c b/src/world.c index 11fdd7fd..eae3fcb2 100644 --- a/src/world.c +++ b/src/world.c @@ -6,6 +6,7 @@ #include "map.h" #include "rand.h" #include "save.h" +#include "sort.h" #include "voxel.h" #include "voxel.inc" #include "worker.h" @@ -13,19 +14,19 @@ #define WORKERS 4 -typedef enum JobType +typedef enum TaskType { - JOB_TYPE_BLOCKS, - JOB_TYPE_VOXELS, - JOB_TYPE_LIGHTS, -} JobType; + TASK_TYPE_BLOCKS, + TASK_TYPE_VOXELS, + TASK_TYPE_LIGHTS, +} TaskType; -typedef enum JobState +typedef enum TaskState { - JOB_STATE_REQUESTED, - JOB_STATE_RUNNING, - JOB_STATE_COMPLETED, -} JobState; + TASK_STATE_REQUESTED, + TASK_STATE_RUNNING, + TASK_STATE_COMPLETED, +} TaskState; typedef enum MeshType { @@ -34,17 +35,17 @@ typedef enum MeshType MESH_TYPE_COUNT, } MeshType; -typedef struct Job +typedef struct Task { - JobType type; + TaskType type; int x; int z; -} Job; +} Task; typedef struct WorldWorker { Worker worker; - Job job; + Task task; CPUBuffer voxels[MESH_TYPE_COUNT]; CPUBuffer lights; } WorldWorker; @@ -52,7 +53,7 @@ typedef struct WorldWorker typedef struct Chunk { SDL_AtomicInt block_state; - SDL_AtomicInt state; + SDL_AtomicInt voxel_state; SDL_AtomicInt light_state; union { @@ -72,7 +73,7 @@ typedef struct Chunk static SDL_GPUDevice* device; static int world_x; static int world_z; -static WorldWorker workers[WORKERS]; +static WorldWorker all_workers[WORKERS]; static GPUBuffer gpu_indices; static GPUBuffer gpu_empty_lights; static CPUBuffer cpu_voxels[MESH_TYPE_COUNT]; @@ -130,6 +131,19 @@ static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) } } +static bool IsNeighborhoodGenerated(Chunk* neighborhood[3][3]) +{ + for (int x = 0; x < 3; x++) + for (int z = 0; z < 3; z++) + { + if (SDL_GetAtomicInt(&neighborhood[x][z]->block_state) != TASK_STATE_COMPLETED) + { + return false; + } + } + return true; +} + static Chunk* CreateChunk() { Chunk* chunk = SDL_calloc(1, sizeof(Chunk)); @@ -137,9 +151,9 @@ static Chunk* CreateChunk() { SDL_Log("Failed to allocate chunk"); } - SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); - SDL_SetAtomicInt(&chunk->state, JOB_STATE_COMPLETED); - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); + SDL_SetAtomicInt(&chunk->block_state, TASK_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_COMPLETED); + SDL_SetAtomicInt(&chunk->light_state, TASK_STATE_COMPLETED); Map_Init(&chunk->lights, 8); for (int i = 0; i < MESH_TYPE_COUNT; i++) { @@ -162,7 +176,7 @@ static void FreeChunk(Chunk* chunk) static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) { - SDL_SetAtomicInt(&chunk->state, JOB_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_REQUESTED); WorldToChunk(chunk, &bx, &by, &bz); Block old_block = chunk->blocks[bx][by][bz]; chunk->blocks[bx][by][bz] = block; @@ -170,7 +184,7 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) { return old_block; } - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->light_state, TASK_STATE_REQUESTED); if (Block_IsLight(block)) { Map_Set(&chunk->lights, bx, by, bz, block); @@ -185,13 +199,13 @@ static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) static void SetChunkBlockFunction(void* userdata, int bx, int by, int bz, Block block) { Chunk* chunk = userdata; - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_RUNNING); SetChunkBlock(userdata, bx, by, bz, block); } static Block GetChunkBlock(Chunk* chunk, int bx, int by, int bz) { - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); WorldToChunk(chunk, &bx, &by, &bz); return chunk->blocks[bx][by][bz]; } @@ -241,39 +255,35 @@ static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, i } Chunk* neighbor = chunks[cx][cz]; SDL_assert(neighbor); - SDL_assert(SDL_GetAtomicInt(&neighbor->block_state) == JOB_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&neighbor->block_state) == TASK_STATE_COMPLETED); return neighbor->blocks[bx][by][bz]; } static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) { - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - SDL_assert(SDL_GetAtomicInt(&chunk->state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == TASK_STATE_RUNNING); bool has_voxels = false; - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) - { - GPUBuffer_Clear(&chunk->gpu_voxels[mesh_index]); - has_voxels |= voxels[mesh_index].size > 0; - } - if (!has_voxels) + for (int i = 0; i < MESH_TYPE_COUNT; i++) { - return; + GPUBuffer_Clear(&chunk->gpu_voxels[i]); + has_voxels |= voxels[i].size > 0; } - if (!GPUBuffer_BeginUpload(&chunk->gpu_voxels[0])) + if (!has_voxels || !GPUBuffer_BeginUpload(&chunk->gpu_voxels[0])) { return; } - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + for (int i = 0; i < MESH_TYPE_COUNT; i++) { - GPUBuffer_Upload(&chunk->gpu_voxels[mesh_index], &voxels[mesh_index]); + GPUBuffer_Upload(&chunk->gpu_voxels[i], &voxels[i]); } GPUBuffer_EndUpload(); } static void UploadLights(Chunk* chunk, CPUBuffer* lights) { - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == TASK_STATE_RUNNING); GPUBuffer_Clear(&chunk->gpu_lights); if (!lights->size) { @@ -345,75 +355,69 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio static void GenerateChunkBlocks(Chunk* chunk) { - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); - SDL_assert(SDL_GetAtomicInt(&chunk->state) == JOB_STATE_REQUESTED); - SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == TASK_STATE_REQUESTED); + SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == TASK_STATE_REQUESTED); SDL_memset(chunk->blocks, 0, sizeof(chunk->blocks)); Map_Clear(&chunk->lights); Rand_GetBlocks(chunk, chunk->x, chunk->z, SetChunkBlockFunction); Save_GetBlocks(chunk, chunk->x, chunk->z, SetChunkBlockFunction); - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); - SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_RUNNING); + SDL_SetAtomicInt(&chunk->block_state, TASK_STATE_COMPLETED); } static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_COUNT]) { Chunk* chunk = chunks[1][1]; - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - SDL_assert(SDL_GetAtomicInt(&chunk->state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == TASK_STATE_RUNNING); for (int bx = 0; bx < CHUNK_WIDTH; bx++) + for (int by = 0; by < CHUNK_HEIGHT; by++) + for (int bz = 0; bz < CHUNK_WIDTH; bz++) { - for (int by = 0; by < CHUNK_HEIGHT; by++) + Block block = chunk->blocks[bx][by][bz]; + if (block == BLOCK_EMPTY) { - for (int bz = 0; bz < CHUNK_WIDTH; bz++) + continue; + } + if (Block_IsSprite(block)) + { + for (Direction direction = 0; direction < 4; direction++) + for (int vertex = 0; vertex < 4; vertex++) + { + Voxel voxel = Voxel_PackSprite(block, bx, by, bz, direction, vertex); + CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); + } + continue; + } + MeshType type = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; + for (Direction direction = 0; direction < DIRECTION_COUNT; direction++) + { + int dx = DIRECTIONS[direction][0]; + int dy = DIRECTIONS[direction][1]; + int dz = DIRECTIONS[direction][2]; + Block neighbor = GetNeighborhoodBlock(chunks, bx, by, bz, dx, dy, dz); + if (!IsVisible(block, neighbor)) + { + continue; + } + int ao[4]; + for (int i = 0; i < 4; i++) { - Block block = chunk->blocks[bx][by][bz]; - if (block == BLOCK_EMPTY) - { - continue; - } - if (Block_IsSprite(block)) - { - for (Direction direction = 0; direction < 4; direction++) - { - for (int vertex = 0; vertex < 4; vertex++) - { - Voxel voxel = Voxel_PackSprite(block, bx, by, bz, direction, vertex); - CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); - } - } - continue; - } - MeshType mesh_type = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; - for (Direction direction = 0; direction < DIRECTION_COUNT; direction++) - { - int dx = DIRECTIONS[direction][0]; - int dy = DIRECTIONS[direction][1]; - int dz = DIRECTIONS[direction][2]; - Block neighbor = GetNeighborhoodBlock(chunks, bx, by, bz, dx, dy, dz); - if (!IsVisible(block, neighbor)) - { - continue; - } - int ao[4]; - for (int i = 0; i < 4; i++) - { - ao[i] = GetAO(chunks, bx, by, bz, direction, i); - } - int order[4]; - Voxel_GetAO(ao, order); - for (int i = 0; i < 4; i++) - { - int index = order[i]; - Voxel voxel = Voxel_PackCube(block, bx, by, bz, direction, index, ao[index]); - CPUBuffer_Append(&voxels[mesh_type], &voxel); - } - } + ao[i] = GetAO(chunks, bx, by, bz, direction, i); + } + int order[4]; + Voxel_GetAO(ao, order); + for (int i = 0; i < 4; i++) + { + int index = order[i]; + Voxel voxel = Voxel_PackCube(block, bx, by, bz, direction, index, ao[index]); + CPUBuffer_Append(&voxels[type], &voxel); } } } UploadVoxels(chunk, voxels); - SDL_SetAtomicInt(&chunk->state, JOB_STATE_COMPLETED); + SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_COMPLETED); } static void RegenerateChunkVoxels(int x, int z) @@ -421,40 +425,38 @@ static void RegenerateChunkVoxels(int x, int z) SDL_assert(!IsChunkOnBorder(x, z)); Chunk* chunks[3][3] = {0}; GetNeighborhood(x, z, chunks); - SDL_SetAtomicInt(&chunks[1][1]->state, JOB_STATE_RUNNING); + SDL_SetAtomicInt(&chunks[1][1]->voxel_state, TASK_STATE_RUNNING); GenerateChunkVoxels(chunks, cpu_voxels); } static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) { Chunk* chunk = chunks[1][1]; - SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == TASK_STATE_RUNNING); for (int x = 0; x < 3; x++) + for (int z = 0; z < 3; z++) { - for (int z = 0; z < 3; z++) + const Chunk* neighbor = chunks[x][z]; + SDL_assert(neighbor); + for (Uint32 i = 0; i < neighbor->lights.capacity; i++) { - const Chunk* neighbor = chunks[x][z]; - SDL_assert(neighbor); - for (Uint32 light_index = 0; light_index < neighbor->lights.capacity; light_index++) + if (!Map_IsRowValid(&neighbor->lights, i)) { - if (!Map_IsRowValid(&neighbor->lights, light_index)) - { - continue; - } - MapRow row = Map_GetRow(&neighbor->lights, light_index); - Block block = row.value; - SDL_assert(Block_IsLight(block)); - Light light = Block_GetLight(block); - light.x = neighbor->x + row.x; - light.y = row.y; - light.z = neighbor->z + row.z; - CPUBuffer_Append(lights, &light); + continue; } + MapRow row = Map_GetRow(&neighbor->lights, i); + Block block = row.value; + SDL_assert(Block_IsLight(block)); + Light light = Block_GetLight(block); + light.x = neighbor->x + row.x; + light.y = row.y; + light.z = neighbor->z + row.z; + CPUBuffer_Append(lights, &light); } } UploadLights(chunk, lights); - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); + SDL_SetAtomicInt(&chunk->light_state, TASK_STATE_COMPLETED); } static void GenerateEmptyLightBuffer() @@ -484,37 +486,35 @@ static void GenerateIndexBuffer() } static const int INDICES[] = {0, 1, 2, 3, 2, 1}; Uint32 max_indices = CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_WIDTH * DIRECTION_COUNT * 6; - for (Uint32 quad_index = 0; quad_index < max_indices / 6; quad_index++) + for (Uint32 i = 0; i < max_indices / 6; i++) + for (Uint32 j = 0; j < 6; j++) { - for (Uint32 index_index = 0; index_index < 6; index_index++) - { - Uint32 index = quad_index * 4 + INDICES[index_index]; - CPUBuffer_Append(&indices, &index); - } + Uint32 index = i * 4 + INDICES[j]; + CPUBuffer_Append(&indices, &index); } GPUBuffer_Upload(&gpu_indices, &indices); GPUBuffer_EndUpload(); CPUBuffer_Free(&indices); } -static void RunJob(void* data) +static void RunTask(void* data) { WorldWorker* worker = data; - Job job = worker->job; - Chunk* chunk = GetChunk(job.x, job.z); + Task task = worker->task; + Chunk* chunk = GetChunk(task.x, task.z); SDL_assert(chunk); - if (job.type == JOB_TYPE_BLOCKS) + if (task.type == TASK_TYPE_BLOCKS) { GenerateChunkBlocks(chunk); return; } Chunk* chunks[3][3]; - GetNeighborhood(job.x, job.z, chunks); - if (job.type == JOB_TYPE_VOXELS) + GetNeighborhood(task.x, task.z, chunks); + if (task.type == TASK_TYPE_VOXELS) { GenerateChunkVoxels(chunks, worker->voxels); } - else if (job.type == JOB_TYPE_LIGHTS) + else if (task.type == TASK_TYPE_LIGHTS) { GenerateChunkLights(chunks, &worker->lights); } @@ -524,30 +524,56 @@ static void RunJob(void* data) } } -static void DispatchJob(WorldWorker* worker, Job job) +static void DispatchTask(WorldWorker* worker, Task task) { - worker->job = job; - Worker_Dispatch(&worker->worker, RunJob, worker); + worker->task = task; + Worker_Dispatch(&worker->worker, RunTask, worker); } -static int SortFunction(void* userdata, const void* lhs, const void* rhs) +static bool TryDispatchTask(int x, int z, WorldWorker* worker) { - int center = WORLD_WIDTH / 2; - const int* left = lhs; - const int* right = rhs; - int left_distance = (left[0] - center) * (left[0] - center) + (left[1] - center) * (left[1] - center); - int right_distance = (right[0] - center) * (right[0] - center) + (right[1] - center) * (right[1] - center); - if (left_distance < right_distance) + SDL_assert(IsChunkLocal(x, z)); + Chunk* chunk = chunks[x][z]; + Task task = {.x = x, .z = z}; + if (SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_REQUESTED) { - return -1; + task.type = TASK_TYPE_BLOCKS; + SDL_SetAtomicInt(&chunk->block_state, TASK_STATE_RUNNING); } - if (left_distance > right_distance) + else { - return 1; + if (IsChunkOnBorder(x, z)) + { + return false; + } + bool voxels = SDL_GetAtomicInt(&chunk->voxel_state) == TASK_STATE_REQUESTED; + bool lights = SDL_GetAtomicInt(&chunk->light_state) == TASK_STATE_REQUESTED; + if (!voxels && !lights) + { + return false; + } + Chunk* neighborhood[3][3]; + GetNeighborhood(x, z, neighborhood); + if (!IsNeighborhoodGenerated(neighborhood)) + { + return false; + } + if (voxels) + { + task.type = TASK_TYPE_VOXELS; + SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_RUNNING); + } + else + { + task.type = TASK_TYPE_LIGHTS; + SDL_SetAtomicInt(&chunk->light_state, TASK_STATE_RUNNING); + } } - return 0; + DispatchTask(worker, task); + return true; } + void World_Init(SDL_GPUDevice* gpu_device) { device = gpu_device; @@ -555,40 +581,38 @@ void World_Init(SDL_GPUDevice* gpu_device) world_z = SDL_MAX_SINT32; GPUBuffer_Init(&gpu_indices, device, SDL_GPU_BUFFERUSAGE_INDEX); GPUBuffer_Init(&gpu_empty_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + for (int i = 0; i < MESH_TYPE_COUNT; i++) { - CPUBuffer_Init(&cpu_voxels[mesh_index], device, sizeof(Voxel)); + CPUBuffer_Init(&cpu_voxels[i], device, sizeof(Voxel)); } - for (int worker_index = 0; worker_index < WORKERS; worker_index++) + for (int i = 0; i < WORKERS; i++) { - WorldWorker* worker = &workers[worker_index]; - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + WorldWorker* worker = &all_workers[i]; + for (int j = 0; j < MESH_TYPE_COUNT; j++) { - CPUBuffer_Init(&worker->voxels[mesh_index], device, sizeof(Voxel)); + CPUBuffer_Init(&worker->voxels[j], device, sizeof(Voxel)); } CPUBuffer_Init(&worker->lights, device, sizeof(Light)); Worker_Init(&worker->worker); } for (int x = 0; x < WORLD_WIDTH; x++) + for (int z = 0; z < WORLD_WIDTH; z++) { - for (int z = 0; z < WORLD_WIDTH; z++) - { - chunks[x][z] = CreateChunk(); - int index = x * WORLD_WIDTH + z; - sorted_chunks[index][0] = x; - sorted_chunks[index][1] = z; - } + chunks[x][z] = CreateChunk(); + int index = x * WORLD_WIDTH + z; + sorted_chunks[index][0] = x; + sorted_chunks[index][1] = z; } - SDL_qsort_r(sorted_chunks, WORLD_WIDTH * WORLD_WIDTH, sizeof(int) * 2, SortFunction, NULL); + Sort_Distance2D(sorted_chunks, WORLD_WIDTH * WORLD_WIDTH, WORLD_WIDTH / 2); GenerateEmptyLightBuffer(); GenerateIndexBuffer(); } void World_Free() { - for (int worker_index = 0; worker_index < WORKERS; worker_index++) + for (int i = 0; i < WORKERS; i++) { - WorldWorker* worker = &workers[worker_index]; + WorldWorker* worker = &all_workers[i]; Worker_Free(&worker->worker); for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) { @@ -597,233 +621,165 @@ void World_Free() CPUBuffer_Free(&worker->lights); } for (int x = 0; x < WORLD_WIDTH; x++) + for (int z = 0; z < WORLD_WIDTH; z++) { - for (int z = 0; z < WORLD_WIDTH; z++) - { - FreeChunk(chunks[x][z]); - } + FreeChunk(chunks[x][z]); } GPUBuffer_Free(&gpu_indices); GPUBuffer_Free(&gpu_empty_lights); - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + for (int i = 0; i < MESH_TYPE_COUNT; i++) { - CPUBuffer_Free(&cpu_voxels[mesh_index]); + CPUBuffer_Free(&cpu_voxels[i]); } } -static int GetIdleWorkers(WorldWorker* idle_workers[WORKERS]) +static int GetIdleWorkers(WorldWorker* workers[WORKERS]) { - int idle_count = 0; - for (int worker_index = 0; worker_index < WORKERS; worker_index++) + int count = 0; + for (int i = 0; i < WORKERS; i++) { - if (!Worker_IsBusy(&workers[worker_index].worker)) + if (!Worker_IsBusy(&all_workers[i].worker)) { - idle_workers[idle_count++] = &workers[worker_index]; + workers[count++] = &all_workers[i]; } } - return idle_count; + return count; } -static void Shuffle(int offset_x, int offset_z) +static void Shuffle(int dx, int dz) { - world_x += offset_x; - world_z += offset_z; - Chunk* retained_chunks[WORLD_WIDTH][WORLD_WIDTH] = {0}; - Chunk* recycled_chunks[WORLD_WIDTH * WORLD_WIDTH] = {0}; - int recycled_count = 0; + world_x += dx; + world_z += dz; + Chunk* kept[WORLD_WIDTH][WORLD_WIDTH] = {0}; + Chunk* recycled[WORLD_WIDTH * WORLD_WIDTH] = {0}; + int count = 0; for (int x = 0; x < WORLD_WIDTH; x++) + for (int z = 0; z < WORLD_WIDTH; z++) { - for (int z = 0; z < WORLD_WIDTH; z++) + SDL_assert(chunks[x][z]); + int new_x = x - dx; + int new_z = z - dz; + if (IsChunkLocal(new_x, new_z)) { - SDL_assert(chunks[x][z]); - int new_x = x - offset_x; - int new_z = z - offset_z; - if (IsChunkLocal(new_x, new_z)) - { - retained_chunks[new_x][new_z] = chunks[x][z]; - } - else - { - recycled_chunks[recycled_count++] = chunks[x][z]; - } - chunks[x][z] = NULL; + kept[new_x][new_z] = chunks[x][z]; + } + else + { + recycled[count++] = chunks[x][z]; } + chunks[x][z] = NULL; } - SDL_memcpy(chunks, retained_chunks, sizeof(retained_chunks)); + SDL_memcpy(chunks, kept, sizeof(kept)); for (int x = 0; x < WORLD_WIDTH; x++) + for (int z = 0; z < WORLD_WIDTH; z++) { - for (int z = 0; z < WORLD_WIDTH; z++) + if (!chunks[x][z]) { - if (!chunks[x][z]) - { - SDL_assert(recycled_count > 0); - Chunk* chunk = recycled_chunks[--recycled_count]; - SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); - SDL_SetAtomicInt(&chunk->state, JOB_STATE_REQUESTED); - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); - chunks[x][z] = chunk; - } - Chunk* chunk = chunks[x][z]; - chunk->x = (world_x + x) * CHUNK_WIDTH; - chunk->z = (world_z + z) * CHUNK_WIDTH; + SDL_assert(count > 0); + Chunk* chunk = recycled[--count]; + SDL_SetAtomicInt(&chunk->block_state, TASK_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_REQUESTED); + SDL_SetAtomicInt(&chunk->light_state, TASK_STATE_REQUESTED); + chunks[x][z] = chunk; } + Chunk* chunk = chunks[x][z]; + chunk->x = (world_x + x) * CHUNK_WIDTH; + chunk->z = (world_z + z) * CHUNK_WIDTH; } - SDL_assert(!recycled_count); + SDL_assert(!count); } static bool MoveChunks(const Camera* camera) { - const int offset_x = FloorChunkIndex(camera->x) - WORLD_WIDTH / 2 - world_x; - const int offset_z = FloorChunkIndex(camera->z) - WORLD_WIDTH / 2 - world_z; - if (!offset_x && !offset_z) - { - return false; - } - WorldWorker* idle_workers[WORKERS]; - if (GetIdleWorkers(idle_workers) != WORKERS) + const int dx = FloorChunkIndex(camera->x) - WORLD_WIDTH / 2 - world_x; + const int dz = FloorChunkIndex(camera->z) - WORLD_WIDTH / 2 - world_z; + if (!dx && !dz) { return true; } - Shuffle(offset_x, offset_z); - return false; -} - -static bool IsNeighborhoodReady(Chunk* neighborhood[3][3]) -{ - for (int x = 0; x < 3; x++) + WorldWorker* workers[WORKERS]; + if (GetIdleWorkers(workers) != WORKERS) { - for (int z = 0; z < 3; z++) - { - if (SDL_GetAtomicInt(&neighborhood[x][z]->block_state) != JOB_STATE_COMPLETED) - { - return false; - } - } - } - return true; -} - -static bool TryDispatchJob(int x, int z, WorldWorker* worker) -{ - SDL_assert(IsChunkLocal(x, z)); - Chunk* chunk = chunks[x][z]; - Job job = {.x = x, .z = z}; - if (SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_REQUESTED) - { - job.type = JOB_TYPE_BLOCKS; - SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_RUNNING); - } - else - { - if (IsChunkOnBorder(x, z)) - { - return false; - } - bool needs_voxels = SDL_GetAtomicInt(&chunk->state) == JOB_STATE_REQUESTED; - bool needs_lights = SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED; - if (!needs_voxels && !needs_lights) - { - return false; - } - Chunk* neighborhood[3][3]; - GetNeighborhood(x, z, neighborhood); - if (!IsNeighborhoodReady(neighborhood)) - { - return false; - } - if (needs_voxels) - { - job.type = JOB_TYPE_VOXELS; - SDL_SetAtomicInt(&chunk->state, JOB_STATE_RUNNING); - } - else - { - job.type = JOB_TYPE_LIGHTS; - SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_RUNNING); - } + return false; } - DispatchJob(worker, job); + Shuffle(dx, dz); return true; } void World_Update(const Camera* camera) { - if (MoveChunks(camera)) + if (!MoveChunks(camera)) { return; } - WorldWorker* idle_workers[WORKERS] = {0}; - int idle_count = GetIdleWorkers(idle_workers); - for (int index = 0; index < WORLD_WIDTH * WORLD_WIDTH; index++) + WorldWorker* workers[WORKERS] = {0}; + int count = GetIdleWorkers(workers); + for (int i = 0; i < WORLD_WIDTH * WORLD_WIDTH; i++) { - if (idle_count == 0) + if (count == 0) { return; } - int chunk_x = sorted_chunks[index][0]; - int chunk_z = sorted_chunks[index][1]; - WorldWorker* worker = idle_workers[idle_count - 1]; - if (TryDispatchJob(chunk_x, chunk_z, worker)) + int cx = sorted_chunks[i][0]; + int cz = sorted_chunks[i][1]; + WorldWorker* worker = workers[count - 1]; + if (TryDispatchTask(cx, cz, worker)) { - idle_count--; + count--; } } } static void Render(Chunk* chunk, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass, WorldFlags flags) { + SDL_assert(SDL_HasExactlyOneBitSet32(flags & (WORLD_FLAGS_OPAQUE | WORLD_FLAGS_TRANSPARENT))); MeshType mesh = flags & WORLD_FLAGS_OPAQUE ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; - GPUBuffer* gpu_voxels = &chunk->gpu_voxels[mesh]; - if (gpu_voxels->size == 0) + GPUBuffer* voxels = &chunk->gpu_voxels[mesh]; + if (!voxels->size) { return; } - SDL_GPUBufferBinding binding = {0}; + SDL_GPUBufferBinding voxel_binding = {0}; SDL_GPUBufferBinding index_binding = {0}; - binding.buffer = gpu_voxels->buffer; + voxel_binding.buffer = voxels->buffer; index_binding.buffer = gpu_indices.buffer; if (flags & WORLD_FLAGS_LIGHT) { - Sint32 light_count; + Sint32 count; SDL_GPUBuffer* light_binding; - if (SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_COMPLETED && chunk->gpu_lights.size) + if (SDL_GetAtomicInt(&chunk->light_state) == TASK_STATE_COMPLETED && chunk->gpu_lights.size) { light_binding = chunk->gpu_lights.buffer; - light_count = chunk->gpu_lights.size; + count = chunk->gpu_lights.size; } else { light_binding = gpu_empty_lights.buffer; - light_count = 0; + count = 0; } - SDL_PushGPUFragmentUniformData(command_buffer, 0, &light_count, sizeof(light_count)); + SDL_PushGPUFragmentUniformData(command_buffer, 0, &count, sizeof(count)); SDL_BindGPUFragmentStorageBuffers(render_pass, 1, &light_binding, 1); } SDL_PushGPUVertexUniformData(command_buffer, 2, chunk->position, sizeof(chunk->position)); - SDL_BindGPUVertexBuffers(render_pass, 0, &binding, 1); + SDL_BindGPUVertexBuffers(render_pass, 0, &voxel_binding, 1); SDL_BindGPUIndexBuffer(render_pass, &index_binding, SDL_GPU_INDEXELEMENTSIZE_32BIT); - Uint32 index_count = gpu_voxels->size / 4 * 6; - SDL_DrawGPUIndexedPrimitives(render_pass, index_count, 1, 0, 0, 0); + SDL_DrawGPUIndexedPrimitives(render_pass, voxels->size / 4 * 6, 1, 0, 0, 0); } -void World_Render( - const Camera* camera, - SDL_GPUCommandBuffer* command_buffer, - SDL_GPURenderPass* render_pass, - WorldFlags flags) +void World_Render(const Camera* camera, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass, WorldFlags flags) { SDL_PushGPUVertexUniformData(command_buffer, 0, camera->proj, sizeof(camera->proj)); SDL_PushGPUVertexUniformData(command_buffer, 1, camera->view, sizeof(camera->view)); - for (int index = 0; index < WORLD_WIDTH * WORLD_WIDTH; index++) + for (int i = 0; i < WORLD_WIDTH * WORLD_WIDTH; i++) { - int chunk_x = sorted_chunks[index][0]; - int chunk_z = sorted_chunks[index][1]; - if (IsChunkOnBorder(chunk_x, chunk_z)) + int cx = sorted_chunks[i][0]; + int cz = sorted_chunks[i][1]; + if (IsChunkOnBorder(cx, cz)) { continue; } - Chunk* chunk = chunks[chunk_x][chunk_z]; - if (SDL_GetAtomicInt(&chunk->state) != JOB_STATE_COMPLETED) + Chunk* chunk = chunks[cx][cz]; + if (SDL_GetAtomicInt(&chunk->voxel_state) != TASK_STATE_COMPLETED) { continue; } @@ -841,32 +797,42 @@ static Chunk* GetWorldChunk(const int position[3]) { return NULL; } - int chunk_x = FloorChunkIndex(position[0] - world_x * CHUNK_WIDTH); - int chunk_z = FloorChunkIndex(position[2] - world_z * CHUNK_WIDTH); - Chunk* chunk = GetChunk(chunk_x, chunk_z); + int cx = FloorChunkIndex(position[0] - world_x * CHUNK_WIDTH); + int cz = FloorChunkIndex(position[2] - world_z * CHUNK_WIDTH); + Chunk* chunk = GetChunk(cx, cz); if (chunk) { - SDL_assert(chunk->x == (world_x + chunk_x) * CHUNK_WIDTH); - SDL_assert(chunk->z == (world_z + chunk_z) * CHUNK_WIDTH); + SDL_assert(chunk->x == (world_x + cx) * CHUNK_WIDTH); + SDL_assert(chunk->z == (world_z + cz) * CHUNK_WIDTH); } else { - SDL_Log("Bad chunk position: %d, %d", chunk_x, chunk_z); + SDL_Log("Bad chunk position: %d, %d", cx, cz); return NULL; } - bool has_blocks = SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED; - bool has_voxels = SDL_GetAtomicInt(&chunk->state) == JOB_STATE_COMPLETED; - if (!has_blocks || !has_voxels) + bool blocks = SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED; + bool voxels = SDL_GetAtomicInt(&chunk->voxel_state) == TASK_STATE_COMPLETED; + if (blocks && voxels) + { + return chunk; + } + else { return NULL; } - return chunk; } Block World_GetBlock(const int position[3]) { Chunk* chunk = GetWorldChunk(position); - return chunk ? GetChunkBlock(chunk, position[0], position[1], position[2]) : BLOCK_EMPTY; + if (chunk) + { + return GetChunkBlock(chunk, position[0], position[1], position[2]); + } + else + { + return BLOCK_EMPTY; + } } void World_SetBlock(const int position[3], Block block) @@ -888,65 +854,62 @@ void World_SetBlock(const int position[3], Block block) int max_x = local_x == CHUNK_WIDTH - 1 ? 1 : 0; int min_z = local_z == 0 ? -1 : 0; int max_z = local_z == CHUNK_WIDTH - 1 ? 1 : 0; - for (int x = min_x; x <= max_x; x++) + for (int dx = min_x; dx <= max_x; dx++) + for (int dz = min_z; dz <= max_z; dz++) { - for (int z = min_z; z <= max_z; z++) + int cx = chunk_x + dx; + int cz = chunk_z + dz; + if (IsChunkLocal(cx, cz) && !IsChunkOnBorder(cx, cz)) { - int cx = chunk_x + x; - int cz = chunk_z + z; - if (IsChunkLocal(cx, cz) && !IsChunkOnBorder(cx, cz)) - { - RegenerateChunkVoxels(cx, cz); - } + RegenerateChunkVoxels(cx, cz); } } Chunk* neighborhood[3][3] = {0}; GetNeighborhood(chunk_x, chunk_z, neighborhood); - if (Block_IsLight(block) || Block_IsLight(old_block)) + if (!Block_IsLight(block) && !Block_IsLight(old_block)) { - for (int neighbor_x = 0; neighbor_x < 3; neighbor_x++) - { - for (int neighbor_z = 0; neighbor_z < 3; neighbor_z++) - { - SDL_SetAtomicInt(&neighborhood[neighbor_x][neighbor_z]->light_state, JOB_STATE_REQUESTED); - } - } + return; + } + for (int dx = 0; dx < 3; dx++) + for (int dz = 0; dz < 3; dz++) + { + SDL_SetAtomicInt(&neighborhood[dx][dz]->light_state, TASK_STATE_REQUESTED); } } WorldQuery World_Raycast(const Camera* camera, float max_distance) { WorldQuery query = {0}; - float direction[3] = {0}; - float next_distances[3] = {0}; - int steps[3] = {0}; - float step_distances[3] = {0}; - Camera_GetVector(camera, &direction[0], &direction[1], &direction[2]); - for (int axis = 0; axis < 3; axis++) + float vector[3] = {0}; + int step[3] = {0}; + float distance[3] = {0}; + float delta[3] = {0}; + Camera_GetVector(camera, &vector[0], &vector[1], &vector[2]); + for (int i = 0; i < 3; i++) { - query.current[axis] = SDL_floorf(camera->position[axis]); - query.previous[axis] = query.current[axis]; - if (SDL_fabsf(direction[axis]) > SDL_FLT_EPSILON) + query.current[i] = SDL_floorf(camera->position[i]); + query.previous[i] = query.current[i]; + if (SDL_fabsf(vector[i]) > SDL_FLT_EPSILON) { - step_distances[axis] = SDL_fabsf(1.0f / direction[axis]); + delta[i] = SDL_fabsf(1.0f / vector[i]); } else { - step_distances[axis] = 1e6f; + delta[i] = 1e6f; } - if (direction[axis] < 0.0f) + if (vector[i] < 0.0f) { - steps[axis] = -1; - next_distances[axis] = (camera->position[axis] - query.current[axis]) * step_distances[axis]; + step[i] = -1; + distance[i] = (camera->position[i] - query.current[i]) * delta[i]; } else { - steps[axis] = 1; - next_distances[axis] = (query.current[axis] + 1.0f - camera->position[axis]) * step_distances[axis]; + step[i] = 1; + distance[i] = (query.current[i] + 1.0f - camera->position[i]) * delta[i]; } } - float distance = 0.0f; - while (distance <= max_distance) + float length = 0.0f; + while (length <= max_distance) { query.block = World_GetBlock(query.current); if (Block_IsSolid(query.block)) @@ -955,11 +918,11 @@ WorldQuery World_Raycast(const Camera* camera, float max_distance) } SDL_memcpy(query.previous, query.current, sizeof(query.current)); int axis; - if (next_distances[0] < next_distances[1] && next_distances[0] < next_distances[2]) + if (distance[0] < distance[1] && distance[0] < distance[2]) { axis = 0; } - else if (next_distances[1] < next_distances[2]) + else if (distance[1] < distance[2]) { axis = 1; } @@ -967,9 +930,9 @@ WorldQuery World_Raycast(const Camera* camera, float max_distance) { axis = 2; } - distance = next_distances[axis]; - next_distances[axis] += step_distances[axis]; - query.current[axis] += steps[axis]; + length = distance[axis]; + distance[axis] += delta[axis]; + query.current[axis] += step[axis]; } query.block = BLOCK_EMPTY; return query; diff --git a/src/world.h b/src/world.h index fd740c4c..0097291b 100644 --- a/src/world.h +++ b/src/world.h @@ -27,11 +27,7 @@ typedef struct WorldQuery void World_Init(SDL_GPUDevice* device); void World_Free(); void World_Update(const Camera* camera); -void World_Render( - const Camera* camera, - SDL_GPUCommandBuffer* command_buffer, - SDL_GPURenderPass* render_pass, - WorldFlags flags); +void World_Render(const Camera* camera, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass, WorldFlags flags); Block World_GetBlock(const int position[3]); void World_SetBlock(const int position[3], Block block); WorldQuery World_Raycast(const Camera* camera, float max_distance); From 85b9e45d5ab9c88a4c282acbc641007fc78e74af Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sun, 19 Jul 2026 15:32:05 -0400 Subject: [PATCH 35/39] refactor --- CMakeLists.txt | 2 - README.md | 9 -- shaders/bin/depth.frag.json | 1 - shaders/bin/depth.frag.msl | 9 -- shaders/bin/depth.frag.spv | Bin 156 -> 0 bytes shaders/bin/depth.vert.json | 1 - shaders/bin/depth.vert.msl | 37 ----- shaders/bin/depth.vert.spv | Bin 1740 -> 0 bytes shaders/depth.frag | 3 - shaders/depth.vert | 35 ----- src/buffer.c | 18 +-- src/direction.h | 12 +- src/main.c | 61 +------- src/sort.c | 2 +- src/world.c | 285 +++++++++++++++++------------------- src/world.h | 12 +- 16 files changed, 157 insertions(+), 330 deletions(-) delete mode 100644 shaders/bin/depth.frag.json delete mode 100644 shaders/bin/depth.frag.msl delete mode 100644 shaders/bin/depth.frag.spv delete mode 100644 shaders/bin/depth.vert.json delete mode 100644 shaders/bin/depth.vert.msl delete mode 100644 shaders/bin/depth.vert.spv delete mode 100644 shaders/depth.frag delete mode 100644 shaders/depth.vert diff --git a/CMakeLists.txt b/CMakeLists.txt index aefd340b..7e3638df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,8 +90,6 @@ function(add_shader FILE) endif() package(${JSON}) endfunction() -add_shader(depth.frag shaders/shader.hlsl src/voxel.inc) -add_shader(depth.vert shaders/shader.hlsl src/voxel.inc) add_shader(opaque.frag shaders/shader.hlsl src/voxel.inc) add_shader(opaque.vert shaders/shader.hlsl src/voxel.inc) add_shader(raycast.frag shaders/shader.hlsl src/voxel.inc) diff --git a/README.md b/README.md index 811c48cf..695fb8b4 100644 --- a/README.md +++ b/README.md @@ -60,12 +60,3 @@ To build locally, add [SDL_shadercross](https://github.com/libsdl-org/SDL_shader - `F11` to toggle fullscreen - `LControl` to sprint - `T` to reset the time of day - -### Passes - -1. Render opaques to depth texture (for shadows) -2. Render sky and opaques with CPU-baked vertex AO -3. Render transparents to depth texture (for predepth) -4. Render transparents and composite -5. Render raycast -6. Render UI diff --git a/shaders/bin/depth.frag.json b/shaders/bin/depth.frag.json deleted file mode 100644 index 5da52262..00000000 --- a/shaders/bin/depth.frag.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0, "inputs": [], "outputs": [] } diff --git a/shaders/bin/depth.frag.msl b/shaders/bin/depth.frag.msl deleted file mode 100644 index 92ac1d9f..00000000 --- a/shaders/bin/depth.frag.msl +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -using namespace metal; - -fragment void main0() -{ -} - diff --git a/shaders/bin/depth.frag.spv b/shaders/bin/depth.frag.spv deleted file mode 100644 index b893138e1f0d7c3506e34227ef04dbec794a03a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmYj~I}U&_3`0! -#include - -using namespace metal; - -struct type_UniformBuffer -{ - float4x4 Proj; -}; - -struct type_UniformBuffer_1 -{ - float4x4 View; -}; - -struct type_UniformBuffer_2 -{ - int2 ChunkPosition; -}; - -struct main0_out -{ - float4 gl_Position [[position]]; -}; - -struct main0_in -{ - uint in_var_TEXCOORD0 [[attribute(0)]]; -}; - -vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) -{ - main0_out out = {}; - out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(UniformBuffer_2.ChunkPosition.x, 0, UniformBuffer_2.ChunkPosition.y)), 1.0)); - return out; -} - diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv deleted file mode 100644 index 1e52666aa6a4de2b06e157824d8f0d4fd4b4911f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1740 zcmZ{k%T8255QZBVz$=J|;0*`HJ38JGMQ);j9ivghmIcJoFhfSrxYIZAncVnFZj654 zIj53?!6r3T^;gy3)zy9I>8|ys)Rj^iNQ?ZshEjKd^klx#!9*HMdwZkV((Xpg=;5yy zy$;YzUIlyi%g$!~O{=-p?rcBX+uGXfq|`^$n5)rgzgPEWXiER2W;}hw|Hos@^|rbB zSuKwp9>jA9{9vB`WX!evZm;#B(f-)nZMHp}e238o@p08FA}}5IK$OpF}Q}{9$Z4B7O?{Psty_9?hge|2dcE z9)nL@On<_uJrA1mbkt9KE?Fy*ZU9Oo_v4d+mp6^nIAp5 z-!x42Va#P;zsRnk=g9ROmk{fh_!jN$G9thCqL^o|R}f>7cNIJGy!XhvhHb0?Uln~F zu~sf)Kj_JQZy@gN8~IsaQw8oj*TY3M=i7<8I<~m)C+covi$|URJgoCg zMcrL&@$!E6@Wt)lZ{j{;5Aqpn)0g-I#It>)cm0Qmx#CM;ljv#0yNo${$Bzm;a%S+o z-*V1leDRl5JA)^P{I0-evBkXGz@8SE_t}8ecR7bxZ@zKA`S0)=n@5bhUtkLbZlCkK NTHle_Z+4nN{sK_|X<`5X diff --git a/shaders/depth.frag b/shaders/depth.frag deleted file mode 100644 index 91981030..00000000 --- a/shaders/depth.frag +++ /dev/null @@ -1,3 +0,0 @@ -void main() -{ -} diff --git a/shaders/depth.vert b/shaders/depth.vert deleted file mode 100644 index 443c59e9..00000000 --- a/shaders/depth.vert +++ /dev/null @@ -1,35 +0,0 @@ -#include "shader.hlsl" - -cbuffer UniformBuffer : register(b0, space1) -{ - float4x4 Proj; -}; - -cbuffer UniformBuffer : register(b1, space1) -{ - float4x4 View; -}; - -cbuffer UniformBuffer : register(b2, space1) -{ - int2 ChunkPosition; -}; - -struct Input -{ - uint Voxel : TEXCOORD0; -}; - -struct Output -{ - float4 Position : SV_Position; -}; - -Output main(Input input) -{ - Output output; - int3 chunkPosition = int3(ChunkPosition.x, 0, ChunkPosition.y); - float3 position = GetPosition(input.Voxel) + chunkPosition; - output.Position = mul(Proj, mul(View, float4(position, 1.0f))); - return output; -} diff --git a/src/buffer.c b/src/buffer.c index 15cfe451..67346a6d 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -3,7 +3,7 @@ #include "buffer.h" static _Thread_local SDL_GPUCommandBuffer* upload_command_buffer; -static _Thread_local SDL_GPUCopyPass* upload_pass; +static _Thread_local SDL_GPUCopyPass* upload_copy_pass; void CPUBuffer_Init(CPUBuffer* buffer, SDL_GPUDevice* device, Uint32 stride) { @@ -95,7 +95,7 @@ void GPUBuffer_Free(GPUBuffer* buffer) bool GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) { SDL_assert(upload_command_buffer); - SDL_assert(upload_pass); + SDL_assert(upload_copy_pass); destination->size = 0; if (source->data) { @@ -129,7 +129,7 @@ bool GPUBuffer_Upload(GPUBuffer* destination, CPUBuffer* source) location.transfer_buffer = source->buffer; region.buffer = destination->buffer; region.size = size * source->stride; - SDL_UploadToGPUBuffer(upload_pass, &location, ®ion, true); + SDL_UploadToGPUBuffer(upload_copy_pass, &location, ®ion, true); destination->size = size; return true; } @@ -142,15 +142,15 @@ void GPUBuffer_Clear(GPUBuffer* buffer) bool GPUBuffer_BeginUpload(GPUBuffer* buffer) { SDL_assert(!upload_command_buffer); - SDL_assert(!upload_pass); + SDL_assert(!upload_copy_pass); upload_command_buffer = SDL_AcquireGPUCommandBuffer(buffer->device); if (!upload_command_buffer) { SDL_Log("Failed to acquire command buffer: %s", SDL_GetError()); return false; } - upload_pass = SDL_BeginGPUCopyPass(upload_command_buffer); - if (!upload_pass) + upload_copy_pass = SDL_BeginGPUCopyPass(upload_command_buffer); + if (!upload_copy_pass) { SDL_Log("Failed to begin copy pass: %s", SDL_GetError()); SDL_CancelGPUCommandBuffer(upload_command_buffer); @@ -162,10 +162,10 @@ bool GPUBuffer_BeginUpload(GPUBuffer* buffer) void GPUBuffer_EndUpload() { - SDL_assert(upload_pass); + SDL_assert(upload_copy_pass); SDL_assert(upload_command_buffer); - SDL_EndGPUCopyPass(upload_pass); + SDL_EndGPUCopyPass(upload_copy_pass); SDL_SubmitGPUCommandBuffer(upload_command_buffer); - upload_pass = NULL; + upload_copy_pass = NULL; upload_command_buffer = NULL; } diff --git a/src/direction.h b/src/direction.h index b8f41ba9..782e9c00 100644 --- a/src/direction.h +++ b/src/direction.h @@ -13,10 +13,10 @@ typedef enum Direction static const int DIRECTIONS[DIRECTION_COUNT][3] = { - [DIRECTION_NORTH] = { 0, 0, 1 }, - [DIRECTION_SOUTH] = { 0, 0, -1 }, - [DIRECTION_EAST] = { 1, 0, 0 }, - [DIRECTION_WEST] = {-1, 0, 0 }, - [DIRECTION_UP] = { 0, 1, 0 }, - [DIRECTION_DOWN] = { 0, -1, 0 }, + [DIRECTION_NORTH] = { 0, 0, 1 }, + [DIRECTION_SOUTH] = { 0, 0,-1 }, + [DIRECTION_EAST] = { 1, 0, 0 }, + [DIRECTION_WEST] = {-1, 0, 0 }, + [DIRECTION_UP] = { 0, 1, 0 }, + [DIRECTION_DOWN] = { 0,-1, 0 }, }; diff --git a/src/main.c b/src/main.c index 7d7c1f1d..d68b9160 100644 --- a/src/main.c +++ b/src/main.c @@ -22,7 +22,6 @@ static SDL_GPUTextureFormat color_format; static SDL_GPUTextureFormat depth_format; static SDL_GPUGraphicsPipeline* opaque_pipeline; static SDL_GPUGraphicsPipeline* transparent_pipeline; -static SDL_GPUGraphicsPipeline* depth_pipeline; static SDL_GPUGraphicsPipeline* sky_pipeline; static SDL_GPUGraphicsPipeline* raycast_pipeline; static SDL_GPUGraphicsPipeline* ui_pipeline; @@ -208,36 +207,6 @@ static bool CreateOpaquePipeline() return opaque_pipeline != NULL; } -static bool CreateDepthPipeline() -{ - SDL_GPUVertexAttribute vertex_attributes[1] = {0}; - SDL_GPUVertexBufferDescription vertex_buffers[1] = {0}; - vertex_attributes[0].format = SDL_GPU_VERTEXELEMENTFORMAT_UINT; - vertex_buffers[0].pitch = 4; - SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = Shader_Load(device, "depth.vert"); - info.fragment_shader = Shader_Load(device, "depth.frag"); - info.target_info.has_depth_stencil_target = true; - info.target_info.depth_stencil_format = depth_format; - info.vertex_input_state.num_vertex_attributes = 1; - info.vertex_input_state.vertex_attributes = vertex_attributes; - info.vertex_input_state.num_vertex_buffers = 1; - info.vertex_input_state.vertex_buffer_descriptions = vertex_buffers; - info.depth_stencil_state.enable_depth_test = true; - info.depth_stencil_state.enable_depth_write = true; - info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS; - info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; - info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; - info.multisample_state.sample_count = SAMPLE_COUNT; - if (info.vertex_shader && info.fragment_shader) - { - depth_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); - } - SDL_ReleaseGPUShader(device, info.vertex_shader); - SDL_ReleaseGPUShader(device, info.fragment_shader); - return depth_pipeline != NULL; -} - static bool CreateTransparentPipeline() { SDL_GPUColorTargetDescription color_targets[1] = {0}; @@ -430,11 +399,6 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to create transparent pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!CreateDepthPipeline()) - { - SDL_Log("Failed to create predepth pipeline: %s", SDL_GetError()); - return SDL_APP_FAILURE; - } if (!CreateSkyPipeline()) { SDL_Log("Failed to create sky pipeline: %s", SDL_GetError()); @@ -487,7 +451,6 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) SDL_ReleaseGPUGraphicsPipeline(device, ui_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, raycast_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, sky_pipeline); - SDL_ReleaseGPUGraphicsPipeline(device, depth_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, transparent_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, opaque_pipeline); SDL_ReleaseWindowFromGPUDevice(device, window); @@ -572,7 +535,7 @@ static void DrawOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_PushGPUFragmentUniformData(cbuf, 2, sky.sun, sizeof(float) * 16); SDL_BindGPUFragmentSamplers(pass, 0, &sampler_binding, 1); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); - World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); + World_Render(&player.camera, WORLD_MESH_TYPE_OPAQUE, cbuf, pass); SDL_PopGPUDebugGroup(cbuf); } @@ -607,25 +570,6 @@ static void RenderOpaquePass(SDL_GPUCommandBuffer* cbuf) SDL_EndGPURenderPass(pass); } -static void RenderTransparentDepthPass(SDL_GPUCommandBuffer* cbuf) -{ - SDL_GPUDepthStencilTargetInfo depth_info = {0}; - depth_info.load_op = SDL_GPU_LOADOP_LOAD; - depth_info.store_op = SDL_GPU_STOREOP_STORE; - depth_info.texture = depth_texture; - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, NULL, 0, &depth_info); - if (!pass) - { - SDL_Log("Failed to begin render pass: %s", SDL_GetError()); - return; - } - SDL_PushGPUDebugGroup(cbuf, "depth"); - SDL_BindGPUGraphicsPipeline(pass, depth_pipeline); - World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT); - SDL_PopGPUDebugGroup(cbuf); - SDL_EndGPURenderPass(pass); -} - static void DrawTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; @@ -639,7 +583,7 @@ static void DrawTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_PushGPUFragmentUniformData(cbuf, 2, sky.sun, sizeof(float) * 16); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); - World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT | WORLD_FLAGS_LIGHT); + World_Render(&player.camera, WORLD_MESH_TYPE_TRANSPARENT, cbuf, pass); SDL_PopGPUDebugGroup(cbuf); } @@ -740,7 +684,6 @@ static void RenderFrame() } Camera_Update(&player.camera); RenderOpaquePass(cbuf); - RenderTransparentDepthPass(cbuf); RenderTransparentPass(cbuf, swapchain_texture); RenderUIPass(cbuf, swapchain_texture); SDL_SubmitGPUCommandBuffer(cbuf); diff --git a/src/sort.c b/src/sort.c index 66ebeb11..71275126 100644 --- a/src/sort.c +++ b/src/sort.c @@ -4,7 +4,7 @@ static int Distance2D(void* userdata, const void* lhs, const void* rhs) { - int center = *(int*)userdata; + int center = *(int*) userdata; const int* l = lhs; const int* r = rhs; int dl = (l[0] - center) * (l[0] - center) + (l[1] - center) * (l[1] - center); diff --git a/src/world.c b/src/world.c index eae3fcb2..ddec73cc 100644 --- a/src/world.c +++ b/src/world.c @@ -28,13 +28,6 @@ typedef enum TaskState TASK_STATE_COMPLETED, } TaskState; -typedef enum MeshType -{ - MESH_TYPE_OPAQUE, - MESH_TYPE_TRANSPARENT, - MESH_TYPE_COUNT, -} MeshType; - typedef struct Task { TaskType type; @@ -46,7 +39,7 @@ typedef struct WorldWorker { Worker worker; Task task; - CPUBuffer voxels[MESH_TYPE_COUNT]; + CPUBuffer voxels[WORLD_MESH_TYPE_COUNT]; CPUBuffer lights; } WorldWorker; @@ -66,50 +59,50 @@ typedef struct Chunk }; Block blocks[CHUNK_WIDTH][CHUNK_HEIGHT][CHUNK_WIDTH]; Map lights; - GPUBuffer gpu_voxels[MESH_TYPE_COUNT]; + GPUBuffer gpu_voxels[WORLD_MESH_TYPE_COUNT]; GPUBuffer gpu_lights; } Chunk; static SDL_GPUDevice* device; -static int world_x; -static int world_z; +static Chunk* chunks[WORLD_WIDTH][WORLD_WIDTH]; static WorldWorker all_workers[WORKERS]; static GPUBuffer gpu_indices; static GPUBuffer gpu_empty_lights; -static CPUBuffer cpu_voxels[MESH_TYPE_COUNT]; -static Chunk* chunks[WORLD_WIDTH][WORLD_WIDTH]; +static CPUBuffer cpu_voxels[WORLD_MESH_TYPE_COUNT]; static int sorted_chunks[WORLD_WIDTH * WORLD_WIDTH][2]; +static int world_x; +static int world_z; -static bool IsBlockLocal(int bx, int by, int bz) +static int FloorChunkIndex(float index) { - return bx >= 0 && bz >= 0 && bx < CHUNK_WIDTH && bz < CHUNK_WIDTH; + return SDL_floorf(index / CHUNK_WIDTH); } -static bool IsChunkLocal(int cx, int cz) +static bool IsBlockInChunk(int bx, int by, int bz) { - return cx >= 0 && cz >= 0 && cx < WORLD_WIDTH && cz < WORLD_WIDTH; + return bx >= 0 && bz >= 0 && bx < CHUNK_WIDTH && bz < CHUNK_WIDTH; } -static bool IsChunkOnBorder(int cx, int cz) +static bool IsChunkInWorld(int cx, int cz) { - return cx == 0 || cz == 0 || cx == WORLD_WIDTH - 1 || cz == WORLD_WIDTH - 1; + return cx >= 0 && cz >= 0 && cx < WORLD_WIDTH && cz < WORLD_WIDTH; } -static int FloorChunkIndex(float index) +static bool IsChunkOnWorldBorder(int cx, int cz) { - return SDL_floorf(index / CHUNK_WIDTH); + return cx == 0 || cz == 0 || cx == WORLD_WIDTH - 1 || cz == WORLD_WIDTH - 1; } -static void WorldToChunk(const Chunk* chunk, int* bx, int* by, int* bz) +static void WorldBlockToChunkBlock(const Chunk* chunk, int* bx, int* by, int* bz) { *bx -= chunk->x; *bz -= chunk->z; - SDL_assert(IsBlockLocal(*bx, *by, *bz)); + SDL_assert(IsBlockInChunk(*bx, *by, *bz)); } static Chunk* GetChunk(int cx, int cz) { - if (IsChunkLocal(cx, cz)) + if (IsChunkInWorld(cx, cz)) { return chunks[cx][cz]; } @@ -119,29 +112,16 @@ static Chunk* GetChunk(int cx, int cz) } } -static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) -{ - for (int i = -1; i <= 1; i++) - for (int j = -1; j <= 1; j++) - { - int x = cx + i; - int z = cz + j; - neighborhood[i + 1][j + 1] = GetChunk(x, z); - SDL_assert(neighborhood[i + 1][j + 1]); - } -} - -static bool IsNeighborhoodGenerated(Chunk* neighborhood[3][3]) +static void GetGroup(int cx, int cz, Chunk* group[3][3]) { - for (int x = 0; x < 3; x++) - for (int z = 0; z < 3; z++) + for (int dx = -1; dx <= 1; dx++) + for (int dz = -1; dz <= 1; dz++) { - if (SDL_GetAtomicInt(&neighborhood[x][z]->block_state) != TASK_STATE_COMPLETED) - { - return false; - } + int x = cx + dx; + int z = cz + dz; + group[dx + 1][dz + 1] = GetChunk(x, z); + SDL_assert(group[dx + 1][dz + 1]); } - return true; } static Chunk* CreateChunk() @@ -150,12 +130,13 @@ static Chunk* CreateChunk() if (!chunk) { SDL_Log("Failed to allocate chunk"); + return NULL; } SDL_SetAtomicInt(&chunk->block_state, TASK_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_COMPLETED); SDL_SetAtomicInt(&chunk->light_state, TASK_STATE_COMPLETED); Map_Init(&chunk->lights, 8); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int i = 0; i < WORLD_MESH_TYPE_COUNT; i++) { GPUBuffer_Init(&chunk->gpu_voxels[i], device, SDL_GPU_BUFFERUSAGE_VERTEX); } @@ -166,7 +147,7 @@ static Chunk* CreateChunk() static void FreeChunk(Chunk* chunk) { GPUBuffer_Free(&chunk->gpu_lights); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int i = 0; i < WORLD_MESH_TYPE_COUNT; i++) { GPUBuffer_Free(&chunk->gpu_voxels[i]); } @@ -177,7 +158,7 @@ static void FreeChunk(Chunk* chunk) static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) { SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_REQUESTED); - WorldToChunk(chunk, &bx, &by, &bz); + WorldBlockToChunkBlock(chunk, &bx, &by, &bz); Block old_block = chunk->blocks[bx][by][bz]; chunk->blocks[bx][by][bz] = block; if (!Block_IsLight(block) && !Block_IsLight(old_block)) @@ -206,11 +187,11 @@ static void SetChunkBlockFunction(void* userdata, int bx, int by, int bz, Block static Block GetChunkBlock(Chunk* chunk, int bx, int by, int bz) { SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); - WorldToChunk(chunk, &bx, &by, &bz); + WorldBlockToChunkBlock(chunk, &bx, &by, &bz); return chunk->blocks[bx][by][bz]; } -static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, int dx, int dy, int dz) +static Block GetGroupBlock(Chunk* chunks[3][3], int bx, int by, int bz, int dx, int dy, int dz) { SDL_assert(dx >= -1 && dx <= 1); SDL_assert(dy >= -1 && dy <= 1); @@ -227,7 +208,7 @@ static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, i { return BLOCK_GRASS; } - else if (IsBlockLocal(bx, by, bz)) + else if (IsBlockInChunk(bx, by, bz)) { return chunk->blocks[bx][by][bz]; } @@ -259,12 +240,12 @@ static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, i return neighbor->blocks[bx][by][bz]; } -static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) +static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[WORLD_MESH_TYPE_COUNT]) { SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == TASK_STATE_RUNNING); bool has_voxels = false; - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int i = 0; i < WORLD_MESH_TYPE_COUNT; i++) { GPUBuffer_Clear(&chunk->gpu_voxels[i]); has_voxels |= voxels[i].size > 0; @@ -273,7 +254,7 @@ static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) { return; } - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int i = 0; i < WORLD_MESH_TYPE_COUNT; i++) { GPUBuffer_Upload(&chunk->gpu_voxels[i], &voxels[i]); } @@ -340,9 +321,9 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio corner[i] = offset; } SDL_assert(sides == 2); - bool has_side1 = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); - bool has_side2 = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); - bool has_corner = Block_IsOccluded(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); + bool has_side1 = Block_IsOccluded(GetGroupBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); + bool has_side2 = Block_IsOccluded(GetGroupBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); + bool has_corner = Block_IsOccluded(GetGroupBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); if (!has_side1 || !has_side2) { return AO_MASK - has_side1 - has_side2 - has_corner; @@ -366,7 +347,7 @@ static void GenerateChunkBlocks(Chunk* chunk) SDL_SetAtomicInt(&chunk->block_state, TASK_STATE_COMPLETED); } -static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_COUNT]) +static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[WORLD_MESH_TYPE_COUNT]) { Chunk* chunk = chunks[1][1]; SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_COMPLETED); @@ -386,17 +367,17 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ for (int vertex = 0; vertex < 4; vertex++) { Voxel voxel = Voxel_PackSprite(block, bx, by, bz, direction, vertex); - CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); + CPUBuffer_Append(&voxels[WORLD_MESH_TYPE_OPAQUE], &voxel); } continue; } - MeshType type = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; + WorldMeshType type = Block_IsOpaque(block) ? WORLD_MESH_TYPE_OPAQUE : WORLD_MESH_TYPE_TRANSPARENT; for (Direction direction = 0; direction < DIRECTION_COUNT; direction++) { int dx = DIRECTIONS[direction][0]; int dy = DIRECTIONS[direction][1]; int dz = DIRECTIONS[direction][2]; - Block neighbor = GetNeighborhoodBlock(chunks, bx, by, bz, dx, dy, dz); + Block neighbor = GetGroupBlock(chunks, bx, by, bz, dx, dy, dz); if (!IsVisible(block, neighbor)) { continue; @@ -420,15 +401,6 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_COMPLETED); } -static void RegenerateChunkVoxels(int x, int z) -{ - SDL_assert(!IsChunkOnBorder(x, z)); - Chunk* chunks[3][3] = {0}; - GetNeighborhood(x, z, chunks); - SDL_SetAtomicInt(&chunks[1][1]->voxel_state, TASK_STATE_RUNNING); - GenerateChunkVoxels(chunks, cpu_voxels); -} - static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) { Chunk* chunk = chunks[1][1]; @@ -497,9 +469,9 @@ static void GenerateIndexBuffer() CPUBuffer_Free(&indices); } -static void RunTask(void* data) +static void TaskFunction(void* args) { - WorldWorker* worker = data; + WorldWorker* worker = args; Task task = worker->task; Chunk* chunk = GetChunk(task.x, task.z); SDL_assert(chunk); @@ -509,7 +481,7 @@ static void RunTask(void* data) return; } Chunk* chunks[3][3]; - GetNeighborhood(task.x, task.z, chunks); + GetGroup(task.x, task.z, chunks); if (task.type == TASK_TYPE_VOXELS) { GenerateChunkVoxels(chunks, worker->voxels); @@ -524,25 +496,21 @@ static void RunTask(void* data) } } -static void DispatchTask(WorldWorker* worker, Task task) -{ - worker->task = task; - Worker_Dispatch(&worker->worker, RunTask, worker); -} - static bool TryDispatchTask(int x, int z, WorldWorker* worker) { - SDL_assert(IsChunkLocal(x, z)); + SDL_assert(IsChunkInWorld(x, z)); + SDL_assert(!Worker_IsBusy(&worker->worker)); Chunk* chunk = chunks[x][z]; - Task task = {.x = x, .z = z}; + worker->task.x = x; + worker->task.z = z; if (SDL_GetAtomicInt(&chunk->block_state) == TASK_STATE_REQUESTED) { - task.type = TASK_TYPE_BLOCKS; + worker->task.type = TASK_TYPE_BLOCKS; SDL_SetAtomicInt(&chunk->block_state, TASK_STATE_RUNNING); } else { - if (IsChunkOnBorder(x, z)) + if (IsChunkOnWorldBorder(x, z)) { return false; } @@ -552,27 +520,43 @@ static bool TryDispatchTask(int x, int z, WorldWorker* worker) { return false; } - Chunk* neighborhood[3][3]; - GetNeighborhood(x, z, neighborhood); - if (!IsNeighborhoodGenerated(neighborhood)) + Chunk* group[3][3]; + GetGroup(x, z, group); + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) { - return false; + if (SDL_GetAtomicInt(&group[i][j]->block_state) != TASK_STATE_COMPLETED) + { + return false; + } } if (voxels) { - task.type = TASK_TYPE_VOXELS; + worker->task.type = TASK_TYPE_VOXELS; SDL_SetAtomicInt(&chunk->voxel_state, TASK_STATE_RUNNING); } else { - task.type = TASK_TYPE_LIGHTS; + worker->task.type = TASK_TYPE_LIGHTS; SDL_SetAtomicInt(&chunk->light_state, TASK_STATE_RUNNING); } } - DispatchTask(worker, task); + Worker_Dispatch(&worker->worker, TaskFunction, worker); return true; } +static int GetWorkers(WorldWorker* workers[WORKERS]) +{ + int count = 0; + for (int i = 0; i < WORKERS; i++) + { + if (!Worker_IsBusy(&all_workers[i].worker)) + { + workers[count++] = &all_workers[i]; + } + } + return count; +} void World_Init(SDL_GPUDevice* gpu_device) { @@ -581,14 +565,14 @@ void World_Init(SDL_GPUDevice* gpu_device) world_z = SDL_MAX_SINT32; GPUBuffer_Init(&gpu_indices, device, SDL_GPU_BUFFERUSAGE_INDEX); GPUBuffer_Init(&gpu_empty_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int i = 0; i < WORLD_MESH_TYPE_COUNT; i++) { CPUBuffer_Init(&cpu_voxels[i], device, sizeof(Voxel)); } for (int i = 0; i < WORKERS; i++) { WorldWorker* worker = &all_workers[i]; - for (int j = 0; j < MESH_TYPE_COUNT; j++) + for (int j = 0; j < WORLD_MESH_TYPE_COUNT; j++) { CPUBuffer_Init(&worker->voxels[j], device, sizeof(Voxel)); } @@ -614,9 +598,9 @@ void World_Free() { WorldWorker* worker = &all_workers[i]; Worker_Free(&worker->worker); - for (int mesh_index = 0; mesh_index < MESH_TYPE_COUNT; mesh_index++) + for (int i = 0; i < WORLD_MESH_TYPE_COUNT; i++) { - CPUBuffer_Free(&worker->voxels[mesh_index]); + CPUBuffer_Free(&worker->voxels[i]); } CPUBuffer_Free(&worker->lights); } @@ -627,25 +611,12 @@ void World_Free() } GPUBuffer_Free(&gpu_indices); GPUBuffer_Free(&gpu_empty_lights); - for (int i = 0; i < MESH_TYPE_COUNT; i++) + for (int i = 0; i < WORLD_MESH_TYPE_COUNT; i++) { CPUBuffer_Free(&cpu_voxels[i]); } } -static int GetIdleWorkers(WorldWorker* workers[WORKERS]) -{ - int count = 0; - for (int i = 0; i < WORKERS; i++) - { - if (!Worker_IsBusy(&all_workers[i].worker)) - { - workers[count++] = &all_workers[i]; - } - } - return count; -} - static void Shuffle(int dx, int dz) { world_x += dx; @@ -659,7 +630,7 @@ static void Shuffle(int dx, int dz) SDL_assert(chunks[x][z]); int new_x = x - dx; int new_z = z - dz; - if (IsChunkLocal(new_x, new_z)) + if (IsChunkInWorld(new_x, new_z)) { kept[new_x][new_z] = chunks[x][z]; } @@ -689,7 +660,7 @@ static void Shuffle(int dx, int dz) SDL_assert(!count); } -static bool MoveChunks(const Camera* camera) +static bool TryMoveChunks(const Camera* camera) { const int dx = FloorChunkIndex(camera->x) - WORLD_WIDTH / 2 - world_x; const int dz = FloorChunkIndex(camera->z) - WORLD_WIDTH / 2 - world_z; @@ -698,7 +669,7 @@ static bool MoveChunks(const Camera* camera) return true; } WorldWorker* workers[WORKERS]; - if (GetIdleWorkers(workers) != WORKERS) + if (GetWorkers(workers) != WORKERS) { return false; } @@ -708,15 +679,15 @@ static bool MoveChunks(const Camera* camera) void World_Update(const Camera* camera) { - if (!MoveChunks(camera)) + if (!TryMoveChunks(camera)) { return; } WorldWorker* workers[WORKERS] = {0}; - int count = GetIdleWorkers(workers); + int count = GetWorkers(workers); for (int i = 0; i < WORLD_WIDTH * WORLD_WIDTH; i++) { - if (count == 0) + if (!count) { return; } @@ -730,43 +701,38 @@ void World_Update(const Camera* camera) } } -static void Render(Chunk* chunk, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass, WorldFlags flags) +static void Render(Chunk* chunk, WorldMeshType type, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass) { - SDL_assert(SDL_HasExactlyOneBitSet32(flags & (WORLD_FLAGS_OPAQUE | WORLD_FLAGS_TRANSPARENT))); - MeshType mesh = flags & WORLD_FLAGS_OPAQUE ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; - GPUBuffer* voxels = &chunk->gpu_voxels[mesh]; + GPUBuffer* voxels = &chunk->gpu_voxels[type]; if (!voxels->size) { return; } SDL_GPUBufferBinding voxel_binding = {0}; SDL_GPUBufferBinding index_binding = {0}; + SDL_GPUBuffer* lights = NULL; + Sint32 light_count; voxel_binding.buffer = voxels->buffer; index_binding.buffer = gpu_indices.buffer; - if (flags & WORLD_FLAGS_LIGHT) + if (SDL_GetAtomicInt(&chunk->light_state) == TASK_STATE_COMPLETED && chunk->gpu_lights.size) { - Sint32 count; - SDL_GPUBuffer* light_binding; - if (SDL_GetAtomicInt(&chunk->light_state) == TASK_STATE_COMPLETED && chunk->gpu_lights.size) - { - light_binding = chunk->gpu_lights.buffer; - count = chunk->gpu_lights.size; - } - else - { - light_binding = gpu_empty_lights.buffer; - count = 0; - } - SDL_PushGPUFragmentUniformData(command_buffer, 0, &count, sizeof(count)); - SDL_BindGPUFragmentStorageBuffers(render_pass, 1, &light_binding, 1); + lights = chunk->gpu_lights.buffer; + light_count = chunk->gpu_lights.size; } + else + { + lights = gpu_empty_lights.buffer; + light_count = 0; + } + SDL_PushGPUFragmentUniformData(command_buffer, 0, &light_count, sizeof(light_count)); + SDL_BindGPUFragmentStorageBuffers(render_pass, 1, &lights, 1); SDL_PushGPUVertexUniformData(command_buffer, 2, chunk->position, sizeof(chunk->position)); SDL_BindGPUVertexBuffers(render_pass, 0, &voxel_binding, 1); SDL_BindGPUIndexBuffer(render_pass, &index_binding, SDL_GPU_INDEXELEMENTSIZE_32BIT); SDL_DrawGPUIndexedPrimitives(render_pass, voxels->size / 4 * 6, 1, 0, 0, 0); } -void World_Render(const Camera* camera, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass, WorldFlags flags) +void World_Render(const Camera* camera, WorldMeshType type, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass) { SDL_PushGPUVertexUniformData(command_buffer, 0, camera->proj, sizeof(camera->proj)); SDL_PushGPUVertexUniformData(command_buffer, 1, camera->view, sizeof(camera->view)); @@ -774,7 +740,7 @@ void World_Render(const Camera* camera, SDL_GPUCommandBuffer* command_buffer, SD { int cx = sorted_chunks[i][0]; int cz = sorted_chunks[i][1]; - if (IsChunkOnBorder(cx, cz)) + if (IsChunkOnWorldBorder(cx, cz)) { continue; } @@ -787,7 +753,7 @@ void World_Render(const Camera* camera, SDL_GPUCommandBuffer* command_buffer, SD { continue; } - Render(chunk, command_buffer, render_pass, flags); + Render(chunk, type, command_buffer, render_pass); } } @@ -842,30 +808,45 @@ void World_SetBlock(const int position[3], Block block) { return; } - int chunk_x = chunk->x / CHUNK_WIDTH - world_x; - int chunk_z = chunk->z / CHUNK_WIDTH - world_z; + int cx = chunk->x / CHUNK_WIDTH - world_x; + int cz = chunk->z / CHUNK_WIDTH - world_z; + Chunk* group[3][3] = {0}; + for (int dx = -1; dx <= 1; dx++) + for (int dz = -1; dz <= 1; dz++) + { + Chunk* neighbor = GetChunk(cx + dx, cz + dz); + if (!neighbor || + SDL_GetAtomicInt(&neighbor->block_state) != TASK_STATE_COMPLETED || + SDL_GetAtomicInt(&neighbor->voxel_state) != TASK_STATE_COMPLETED || + SDL_GetAtomicInt(&neighbor->light_state) != TASK_STATE_COMPLETED) + { + return; + } + group[dx + 1][dz + 1] = neighbor; + } Save_SetBlock(chunk->x, chunk->z, position[0], position[1], position[2], block); - int local_x = position[0]; - int local_y = position[1]; - int local_z = position[2]; - WorldToChunk(chunk, &local_x, &local_y, &local_z); + int bx = position[0]; + int by = position[1]; + int bz = position[2]; + WorldBlockToChunkBlock(chunk, &bx, &by, &bz); Block old_block = SetChunkBlock(chunk, position[0], position[1], position[2], block); - int min_x = local_x == 0 ? -1 : 0; - int max_x = local_x == CHUNK_WIDTH - 1 ? 1 : 0; - int min_z = local_z == 0 ? -1 : 0; - int max_z = local_z == CHUNK_WIDTH - 1 ? 1 : 0; + int min_x = bx == 0 ? -1 : 0; + int max_x = bx == CHUNK_WIDTH - 1 ? 1 : 0; + int min_z = bz == 0 ? -1 : 0; + int max_z = bz == CHUNK_WIDTH - 1 ? 1 : 0; for (int dx = min_x; dx <= max_x; dx++) for (int dz = min_z; dz <= max_z; dz++) { - int cx = chunk_x + dx; - int cz = chunk_z + dz; - if (IsChunkLocal(cx, cz) && !IsChunkOnBorder(cx, cz)) + int x = cx + dx; + int z = cz + dz; + if (IsChunkInWorld(x, z) && !IsChunkOnWorldBorder(x, z)) { - RegenerateChunkVoxels(cx, cz); + Chunk* chunks[3][3] = {0}; + GetGroup(x, z, chunks); + SDL_SetAtomicInt(&chunks[1][1]->voxel_state, TASK_STATE_RUNNING); + GenerateChunkVoxels(chunks, cpu_voxels); } } - Chunk* neighborhood[3][3] = {0}; - GetNeighborhood(chunk_x, chunk_z, neighborhood); if (!Block_IsLight(block) && !Block_IsLight(old_block)) { return; @@ -873,7 +854,7 @@ void World_SetBlock(const int position[3], Block block) for (int dx = 0; dx < 3; dx++) for (int dz = 0; dz < 3; dz++) { - SDL_SetAtomicInt(&neighborhood[dx][dz]->light_state, TASK_STATE_REQUESTED); + SDL_SetAtomicInt(&group[dx][dz]->light_state, TASK_STATE_REQUESTED); } } diff --git a/src/world.h b/src/world.h index 0097291b..5f65ac18 100644 --- a/src/world.h +++ b/src/world.h @@ -10,12 +10,12 @@ typedef struct Camera Camera; -typedef enum WorldFlags +typedef enum WorldMeshType { - WORLD_FLAGS_OPAQUE = 0x01, - WORLD_FLAGS_TRANSPARENT = 0x02, - WORLD_FLAGS_LIGHT = 0x04, -} WorldFlags; + WORLD_MESH_TYPE_OPAQUE, + WORLD_MESH_TYPE_TRANSPARENT, + WORLD_MESH_TYPE_COUNT, +} WorldMeshType; typedef struct WorldQuery { @@ -27,7 +27,7 @@ typedef struct WorldQuery void World_Init(SDL_GPUDevice* device); void World_Free(); void World_Update(const Camera* camera); -void World_Render(const Camera* camera, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass, WorldFlags flags); +void World_Render(const Camera* camera, WorldMeshType type, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass); Block World_GetBlock(const int position[3]); void World_SetBlock(const int position[3], Block block); WorldQuery World_Raycast(const Camera* camera, float max_distance); From 90b8a4f47d9ac5636d149031903e9462e9ab9cda Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sun, 19 Jul 2026 15:53:20 -0400 Subject: [PATCH 36/39] fix raycast --- doc/Screenshot 2026-07-19 155117.png | Bin 0 -> 197567 bytes image.png | Bin 792281 -> 0 bytes shaders/bin/raycast.vert.msl | 6 +++--- shaders/bin/raycast.vert.spv | Bin 1948 -> 1984 bytes shaders/raycast.vert | 2 +- src/world.c | 7 ++++++- 6 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 doc/Screenshot 2026-07-19 155117.png delete mode 100644 image.png diff --git a/doc/Screenshot 2026-07-19 155117.png b/doc/Screenshot 2026-07-19 155117.png new file mode 100644 index 0000000000000000000000000000000000000000..3e1180e297b3b7a1710aa622df49828f56ed64c6 GIT binary patch literal 197567 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
d!%niSba;>#u}UaLhAtg!6{wq;WkIZ7dn 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 z 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%0Axt@RA^1{J{4% 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

4a&)19(CkBq2uWafI|7PZG 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%0DX4kM#QnXDPe&NsHiYX{b)uPO?mQzuw(AVSx$$+9 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 o%Xf&f6q-_%tDTmS$707*qoM6N<$f)dB`HUIzs diff --git a/shaders/bin/raycast.vert.msl b/shaders/bin/raycast.vert.msl index a54fca16..b21010bd 100644 --- a/shaders/bin/raycast.vert.msl +++ b/shaders/bin/raycast.vert.msl @@ -54,8 +54,8 @@ struct type_UniformBuffer_1 int3 BlockPosition; }; -constant spvUnsafeArray _53 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _54 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _54 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _55 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -65,7 +65,7 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - out.gl_Position = UniformBuffer.Transform * float4(_53[_54[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); + out.gl_Position = UniformBuffer.Transform * float4((_54[_55[gl_VertexIndex]] * 1.019999980926513671875) + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); return out; } diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index 2f3c31b7ed1416c101ba42c2a49c83ac0e0d29ee..b97a2bfbb06e6521fa6404fd74d89901498a4770 100644 GIT binary patch literal 1984 zcmZ{kTThcg5Qdj>QdAI;gNj-}MWNyuQG^PpfZkxDi5K1=mZU*i!{Nd^^#`c`$iL-{ ziO=)(n^-VzGo5+gnVp@Towl_w)|paEN~t@&;M>)k3OUo7VZA+xFqZcAdbOrqK#XYR z(~f=v(VjX|8}`=H{=3RreYd(-t=D!NyfGQST6c`pUZ>b<6t@O75)?0te+)L(cg{8g+yEr9IG60)+!fq!T08T z_<}!`#~$YUnsVri_|thF^EdPTIhJeY2fz_4-_Lyq(M81NJ;Xy9`iswieV_23#kQA$ z&tXTu+&_#s>)}6-?K=g&fbClbzKHGniQ{eFe*apwz7hB$66cGZA6M-6oqgY7;xD0n zBf0Qj#+KKA1#OLTzV|rVGp%ok@2hAz@da*WU2;X3YiRE+=iUjl^>}wMv{A%Q<5q}TPx^wLeJFm{BbLh;KxTSmUBhHrd zSamHw?^_jysW3<(gOD#55ZM=JpH&$D1-f1S)e%k|={r^Q* zX3+M;J3GtvL2OT)4e>nhrEL$ijq{Fku)f&?#QrYe@hu-B#>hv^Y|b0w`#wUoe GXOKTgxNEim literal 1948 zcmZ{k+fGwa5QZ1DfJYFKgNoRSiUQ&pQRJ)wcbI76En-O;q%{;Sywf-EjeIR{O#HsR z_r!v6k?G9*b6B%xW>e}M?@6g6rPP}?`StXt&H^cAy4Jpg8%KG6yWUXlg!Cx!*9HFo z(3QGV8F_E*=wofG*{UDbn~heE>yzP|jZgKR8mM>=5h)#h{ZgBG->C045B67&c6VzB z3EaQ@ygS%#v@~Wh-B~p!+_PM#{+p{OY4fapZtm^D^Ij7Mg_A zeZRU#-7ejL>{IAfWRJS{wA%Wmzg1{Ni*)h!A7oZLDL|^RnI#sA!n>pg0kwd$f z_95gm@Cr0V9_76LZ%f1I=g`G`SJ=-ZbAC>9i}qefEGYc?z&K0cXRTu47kGbxhb{1n zh3`pxpe={C@V`{#F@HNgSmJ(l z9?-dQ%&e%k|&{r^Q*p26*jZ+3U>gStI& zH`EuIm$E%j*3UOCfI71|$o{TiahA^^eZ<4(MS<(%eCHu^itFR7Uqa&gIP(R_IaV_{ z-^0ZMZx%62=wjcAF~>3_=1c-xK{od?WN!Co74mJ7djff_z~AEIxAF=y))UxkWU-Dm m>`j5$gDtYU>+6v5`fK-p?GN&5+kmutpZzQq*l)7VL4N?ld}sRr diff --git a/shaders/raycast.vert b/shaders/raycast.vert index 9de7ca65..509929a5 100644 --- a/shaders/raycast.vert +++ b/shaders/raycast.vert @@ -18,7 +18,7 @@ struct Output Output main(uint vertexID : SV_VertexID) { Output output; - float3 position = GetCubePosition(vertexID); + float3 position = GetCubePosition(vertexID) * 1.02f; position += BlockPosition + 0.5f; output.Position = mul(Transform, float4(position, 1.0f)); return output; diff --git a/src/world.c b/src/world.c index ddec73cc..6906e0cd 100644 --- a/src/world.c +++ b/src/world.c @@ -839,13 +839,18 @@ void World_SetBlock(const int position[3], Block block) { int x = cx + dx; int z = cz + dz; - if (IsChunkInWorld(x, z) && !IsChunkOnWorldBorder(x, z)) + SDL_assert(IsChunkInWorld(x, z)); + if (!IsChunkOnWorldBorder(x, z)) { Chunk* chunks[3][3] = {0}; GetGroup(x, z, chunks); SDL_SetAtomicInt(&chunks[1][1]->voxel_state, TASK_STATE_RUNNING); GenerateChunkVoxels(chunks, cpu_voxels); } + else + { + SDL_SetAtomicInt(&group[dx + 1][dz + 1]->voxel_state, TASK_STATE_REQUESTED); + } } if (!Block_IsLight(block) && !Block_IsLight(old_block)) { From 3c9471523174de3f627df0b8187cbbd3e8c9f673 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sun, 19 Jul 2026 17:04:41 -0400 Subject: [PATCH 37/39] refactor --- CMakeLists.txt | 4 +- shaders/bin/hud.frag.json | 1 + shaders/bin/hud.frag.msl | 45 +++ shaders/bin/hud.frag.spv | Bin 0 -> 1580 bytes shaders/bin/{ui.vert.json => hud.vert.json} | 2 +- shaders/bin/{ui.vert.msl => hud.vert.msl} | 29 +- shaders/bin/hud.vert.spv | Bin 0 -> 2264 bytes shaders/bin/ui.frag.json | 1 - shaders/bin/ui.frag.msl | 41 --- shaders/bin/ui.frag.spv | Bin 1408 -> 0 bytes shaders/bin/ui.vert.spv | Bin 2428 -> 0 bytes shaders/{ui.frag => hud.frag} | 12 +- shaders/{ui.vert => hud.vert} | 36 +-- src/block.h | 2 + src/camera.h | 11 +- src/main.c | 299 +++++++++----------- src/world.c | 26 +- src/world.h | 2 +- 18 files changed, 241 insertions(+), 270 deletions(-) create mode 100644 shaders/bin/hud.frag.json create mode 100644 shaders/bin/hud.frag.msl create mode 100644 shaders/bin/hud.frag.spv rename shaders/bin/{ui.vert.json => hud.vert.json} (62%) rename shaders/bin/{ui.vert.msl => hud.vert.msl} (69%) create mode 100644 shaders/bin/hud.vert.spv delete mode 100644 shaders/bin/ui.frag.json delete mode 100644 shaders/bin/ui.frag.msl delete mode 100644 shaders/bin/ui.frag.spv delete mode 100644 shaders/bin/ui.vert.spv rename shaders/{ui.frag => hud.frag} (73%) rename shaders/{ui.vert => hud.vert} (50%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e3638df..86dbf16f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,8 @@ function(add_shader FILE) endif() package(${JSON}) endfunction() +add_shader(hud.frag) +add_shader(hud.vert) add_shader(opaque.frag shaders/shader.hlsl src/voxel.inc) add_shader(opaque.vert shaders/shader.hlsl src/voxel.inc) add_shader(raycast.frag shaders/shader.hlsl src/voxel.inc) @@ -98,5 +100,3 @@ add_shader(sky.frag shaders/shader.hlsl src/voxel.inc) add_shader(sky.vert shaders/shader.hlsl src/voxel.inc) add_shader(transparent.frag shaders/shader.hlsl src/voxel.inc) add_shader(transparent.vert shaders/shader.hlsl src/voxel.inc) -add_shader(ui.frag) -add_shader(ui.vert) diff --git a/shaders/bin/hud.frag.json b/shaders/bin/hud.frag.json new file mode 100644 index 00000000..bd643723 --- /dev/null +++ b/shaders/bin/hud.frag.json @@ -0,0 +1 @@ +{ "samplers": 1, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float2", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "uint", "location": 1 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }] } diff --git a/shaders/bin/hud.frag.msl b/shaders/bin/hud.frag.msl new file mode 100644 index 00000000..16409d29 --- /dev/null +++ b/shaders/bin/hud.frag.msl @@ -0,0 +1,45 @@ +#include +#include + +using namespace metal; + +struct type_UniformBuffer +{ + uint Block; +}; + +struct main0_out +{ + float4 out_var_SV_Target0 [[color(0)]]; +}; + +struct main0_in +{ + float2 in_var_TEXCOORD0 [[user(locn0)]]; + uint in_var_TEXCOORD1 [[user(locn1)]]; +}; + +fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) +{ + main0_out out = {}; + float4 _55; + do + { + if (in.in_var_TEXCOORD1 == 0u) + { + _55 = float4(1.0); + break; + } + float3 _48 = float3(in.in_var_TEXCOORD0, float(UniformBuffer.Block)); + float4 _50 = atlasTexture.sample(atlasSampler, _48.xy, uint(rint(_48.z))); + if (_50.w <= 0.001000000047497451305389404296875) + { + discard_fragment(); + } + _55 = _50; + break; + } while(false); + out.out_var_SV_Target0 = _55; + return out; +} + diff --git a/shaders/bin/hud.frag.spv b/shaders/bin/hud.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..a2e7154b10aec548aa25c373ed87a15953f42431 GIT binary patch literal 1580 zcmZ9MSx-}85QaaxP+VDL5l}4P4pv1)qERDg^bQq7?#zj{q><9*P>kG}_;36T{w?F4 z_&kSmk`snZXWrRozLsKPwh}^52;pQ{;!_$7h160^u-^XA7fML=R@B_lQGkumK7gi= zVra!sMs5;N#-iTc@6>Ax?`zFgv{kP~aUAVq@8vIqsJk8QuGc?x_u@J*v0Ep}*^OGA z?RuQq`%sejwYJWDR; zOQ@HUS*C0NiR~}8p4gswzqg!$eHZ=WX;>0_yS!hV_j?ol_Ay?Z`Jb~%cE?%llJjb_ z-zfTVWEGwxSN#Os9{O@`1nf>#xCa*Zrx=mMiw6WymOq%F&yU84A40dLJI`}N@hRAt zJezB;VOSbxLcf3J+S^%`QYNe9j2xJf*a@Qi{%Idg?c%9)--FppVGNt~yn!>GM%qW4 zx#LKCXcteUILn^|d+UQ;3gHa;G?ueS^ zlGq)5Yf0?fzOD7d&Z+LKV&}AOhMm*9Yg?p?v+0wZ^(WcW$OlBZ>kMo?vGdNt=KkRG zJW~3D?t5Q=%~yVwIeOkmG%?!P;JuBd)>jCuO$l=-Rx=3p!Sj{PdGpeb(3@-#79fhI2W~ z8)AL?1z5W|QdajCx;}6BjeKu&8`kb`%iG*RO5R4_BCO3@sQ+aub#3`Od9Uy3@8~YN Uza?*JKVu(K+c($uj~Ywxf5-rIdjJ3c literal 0 HcmV?d00001 diff --git a/shaders/bin/ui.vert.json b/shaders/bin/hud.vert.json similarity index 62% rename from shaders/bin/ui.vert.json rename to shaders/bin/hud.vert.json index 886950d4..b6927f2d 100644 --- a/shaders/bin/ui.vert.json +++ b/shaders/bin/hud.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1, "inputs": [], "outputs": [{ "name": "out.var.TEXCOORD0", "type": "float2", "location": 0 }, { "name": "out.var.TEXCOORD1", "type": "uint", "location": 1 }, { "name": "out.var.TEXCOORD2", "type": "uint", "location": 2 }] } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1, "inputs": [], "outputs": [{ "name": "out.var.TEXCOORD0", "type": "float2", "location": 0 }, { "name": "out.var.TEXCOORD1", "type": "uint", "location": 1 }] } diff --git a/shaders/bin/ui.vert.msl b/shaders/bin/hud.vert.msl similarity index 69% rename from shaders/bin/ui.vert.msl rename to shaders/bin/hud.vert.msl index caf4ba3d..243a4715 100644 --- a/shaders/bin/ui.vert.msl +++ b/shaders/bin/hud.vert.msl @@ -47,45 +47,42 @@ struct spvUnsafeArray struct type_UniformBuffer { int2 Viewport; - uint Index; }; -constant spvUnsafeArray _51 = spvUnsafeArray({ float2(0.0), float2(1.0, 0.0), float2(0.0, 1.0), float2(0.0, 1.0), float2(1.0, 0.0), float2(1.0) }); +constant spvUnsafeArray _48 = spvUnsafeArray({ float2(0.0), float2(1.0, 0.0), float2(0.0, 1.0), float2(0.0, 1.0), float2(1.0, 0.0), float2(1.0) }); struct main0_out { float2 out_var_TEXCOORD0 [[user(locn0)]]; uint out_var_TEXCOORD1 [[user(locn1)]]; - uint out_var_TEXCOORD2 [[user(locn2)]]; float4 gl_Position [[position]]; }; vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], uint gl_VertexIndex [[vertex_id]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float2 _61 = float2(UniformBuffer.Viewport); - float2 _62 = _61 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); - float _65 = precise::max(_62.x, _62.y); - bool _66 = gl_InstanceIndex == 0u; + float2 _59 = float2(UniformBuffer.Viewport); + float2 _60 = _59 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); + float _63 = precise::max(_60.x, _60.y); + uint _65 = uint(gl_InstanceIndex == 0u); float2 _81; float2 _82; - if (_66) + if (_65 != 0u) { - float2 _70 = float2(10.0) * _65; - _81 = _70 + float2(50.0 * _65); + float2 _70 = float2(10.0) * _63; + _81 = _70 + float2(50.0 * _63); _82 = _70; } else { - float2 _74 = _61 * 0.5; - float2 _78 = select(float2(2.0, 8.0), float2(8.0, 2.0), bool2(gl_InstanceIndex == 1u)) * _65; + float2 _74 = _59 * 0.5; + float2 _78 = select(float2(2.0, 8.0), float2(8.0, 2.0), bool2(gl_InstanceIndex == 1u)) * _63; _81 = _74 + _78; _82 = _74 - _78; } - out.gl_Position = float4(((mix(_82, _81, _51[gl_VertexIndex]) / _61) * 2.0) - float2(1.0), 0.0, 1.0); - out.out_var_TEXCOORD0 = float2(_51[gl_VertexIndex].x, 1.0 - _51[gl_VertexIndex].y); - out.out_var_TEXCOORD1 = UniformBuffer.Index; - out.out_var_TEXCOORD2 = uint(_66); + out.gl_Position = float4(((mix(_82, _81, _48[gl_VertexIndex]) / _59) * 2.0) - float2(1.0), 0.0, 1.0); + out.out_var_TEXCOORD0 = float2(_48[gl_VertexIndex].x, 1.0 - _48[gl_VertexIndex].y); + out.out_var_TEXCOORD1 = _65; return out; } diff --git a/shaders/bin/hud.vert.spv b/shaders/bin/hud.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..e267aff1db523462c4ed0f38f194d6fb69b88785 GIT binary patch literal 2264 zcmZ9MX-`yH5QZ;Hqa%nLxQyFHTnB7-M{$A11ymH=5NF&lLeeqP2HKhUO=C>_aifZffjal4T89mbGUO`E{+z8VgHn)>6o!k?SMn zx%#8>;UoL?w`Wa?!nYz@R_KlVKAEh}Nc1*?5@-QjfUT+E69ks9EX7uT{&cE*bEZ07 zn|(6)Y(pK$l&oip50#P%|-27 zbg$yQGRD2V zoGo7g++$qqS&8n7m{sW7M8vE{&$1W&5wixS&6u!tB(6Pdo#=AWNlt5#Ij|p|Enf#* z!PlefH+};$2QK~cKMVGoZ-mEr*1M_j=atA|bFyiVdgk9~crf_ZVo%m@-*R;GvTs}H zx&6-zG-q8%?b;%rZRpP4CiePn_E}pF-;Qhm=Iz-#kml%2>EDTT-n7eiCGHvW-HE$@ z4L9#WcCo|RR5zvv88ayFP279rdy(dxgATMZ@&xuSr1PjxZm#Ciuz;IqaC3F`jWOO_ ztvk56nupwb_a)wq?Byoqe&BpLKhBF#cTVEH{4SkO=QQ5uAo}M|BYnXS!6#ck_QjsV zaAUOF=Oak#w6>#UZLic__U;?(DAGF2(|auYdvIccT46iXBAPr|l~hoTgr-=h6M9%)@%jX$bgD zX&Xy%!^y7iWwKpBcfY>xoa>#Q?>%w;MRfb+HyL$ZLbon!@O zM{(vAbbaRcD&;bY?p^vKKYJRsh54E17y9oVSAlid6XVT2eAm#ePoL-Ob544Y*MYO; zJUJ(xbpvQ`;~zzS6ZqC;;91^f%$t<+IJzO*`~mQM?J+l# b=$`ig_&t`8=A`cbjed2%*9!Pa_Q$|4=F5n@ literal 0 HcmV?d00001 diff --git a/shaders/bin/ui.frag.json b/shaders/bin/ui.frag.json deleted file mode 100644 index b863b41e..00000000 --- a/shaders/bin/ui.frag.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 1, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0, "inputs": [{ "name": "in.var.TEXCOORD0", "type": "float2", "location": 0 }, { "name": "in.var.TEXCOORD1", "type": "uint", "location": 1 }, { "name": "in.var.TEXCOORD2", "type": "uint", "location": 2 }], "outputs": [{ "name": "out.var.SV_Target0", "type": "float4", "location": 0 }] } diff --git a/shaders/bin/ui.frag.msl b/shaders/bin/ui.frag.msl deleted file mode 100644 index 40d03b45..00000000 --- a/shaders/bin/ui.frag.msl +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include - -using namespace metal; - -struct main0_out -{ - float4 out_var_SV_Target0 [[color(0)]]; -}; - -struct main0_in -{ - float2 in_var_TEXCOORD0 [[user(locn0)]]; - uint in_var_TEXCOORD1 [[user(locn1)]]; - uint in_var_TEXCOORD2 [[user(locn2)]]; -}; - -fragment main0_out main0(main0_in in [[stage_in]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) -{ - main0_out out = {}; - float4 _49; - do - { - if (in.in_var_TEXCOORD2 == 0u) - { - _49 = float4(1.0); - break; - } - float3 _42 = float3(in.in_var_TEXCOORD0, float(in.in_var_TEXCOORD1)); - float4 _44 = atlasTexture.sample(atlasSampler, _42.xy, uint(rint(_42.z))); - if (_44.w <= 0.001000000047497451305389404296875) - { - discard_fragment(); - } - _49 = _44; - break; - } while(false); - out.out_var_SV_Target0 = _49; - return out; -} - diff --git a/shaders/bin/ui.frag.spv b/shaders/bin/ui.frag.spv deleted file mode 100644 index 5d90ceb42db143f86afbd10488b325efda606e63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1408 zcmZ9M*-jKu5Qdvs7;$4q0hb#-;K{QLTv712#JzjYSQtelP7Fn5dyv z7;mBzAoCF7)kAETq9&11V#AYumaKnBy1jHSOVYt0Js~$5>eJzVdeq524UY#Ir6GQ% zJad%x`uo|SjE~`j`t54G75eEOBp=g3(s{l6a&z_|EXM9g?&5M z;qfq#ZtuMBq=UU|2y2t6tGlrFEVW_Ayx(HbDB1|yaKpLpeYxKVJzoPW8*sW$vD{*7 z#qL^cKh=77y;RAI+o)o_yQ=2JWqyv^&VgfegtM70Rwbq;*JDm4DR#5Nso_EyxuB)hV&nPADeSCB7>02>( zf^Xb!-?<-P73Vg$h8lBj{l9djZ>+k582r8X?)`J|+jmdiXYF&ieP46`;CPJw2d;2t AM*si- diff --git a/shaders/bin/ui.vert.spv b/shaders/bin/ui.vert.spv deleted file mode 100644 index 26e84cc2f029c5616b231d2ad7c1c4b7e9c1c5f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmZ9Mc~6vA6vi(MLl-D$Mcj4Jwzd_=rLMTZpcZUVaHDiplp&ckG6u%&KO1AxzxqAe z58$V;AIG>PCjI^1xu+5?c{uBP?sLw)cS@amK1it}rPP<|{CBNSorR|-br*7C>e^Iw zrL|B!a`d3_zEn~avHsLk=$-t(JKtE+Fxmympc}A3`Vf@((>F(Q8Sh8vt;hH3)f-EV z#pd$e@%xL5^<}^5E@Fh!Y@`10UURvn-pyBjBioBh3-w3HGTx7oYf9iR7tDU2X|6O{ zjpouydr$c^@3*QC=9jD2FU*~rp1ykCrsN~fwXs7vCjYgu!$qu%X}#}#g3j&VseBEz zorU(kY&(PY)Qp#kefx@7shCq+@1nDmb^@1m!0h_4*2~ykGK5TWlx`wH5ydUTjk+Tjxr6;42vmQ&IIpO;> z+xo+|0bN^cWWNDq1<2Rh+8co@>_K$n=5In)fXle{=E8cev1%+t$$bE*tmz4Y2Yq58)X` zs++SP=^c%4s@ZlQ;|Gv(wvPd{gW2yJ({Jrl_dQx$j_xx7e2@BOa^7V28~Y>sE~5Lru{YFpPwTr+ z)c+3M8Tg)q>-Xq#^-WvfGn)eX#oyd4XLkwcuYe&CH7}zZli$`g{46*S-NdfN#`V?q$xO zne!~VInF0~`vG0Qzf;lM9J+qrMcj`c(e=B+_Y=B4_ne`>y~v+|xyJgyI#6T2a{2{C z4{?V*|6g+~@_t*DH;8V(=G_Fw atlasTexture : register(t0, space2); SamplerState atlasSampler : register(s0, space2); +cbuffer UniformBuffer : register(b0, space3) +{ + uint Block; +}; + struct Input { float2 Texcoord : TEXCOORD0; - nointerpolation uint Index : TEXCOORD1; - nointerpolation uint IsTexture : TEXCOORD2; + nointerpolation uint IsBlock : TEXCOORD1; }; static const float kEpsilon = 0.001f; float4 main(Input input) : SV_Target0 { - if (!input.IsTexture) + if (!input.IsBlock) { return float4(1.0f, 1.0f, 1.0f, 1.0f); } - float4 color = atlasTexture.Sample(atlasSampler, float3(input.Texcoord, input.Index)); + float4 color = atlasTexture.Sample(atlasSampler, float3(input.Texcoord, Block)); if (color.a <= kEpsilon) { discard; diff --git a/shaders/ui.vert b/shaders/hud.vert similarity index 50% rename from shaders/ui.vert rename to shaders/hud.vert index b30f226c..c31bc041 100644 --- a/shaders/ui.vert +++ b/shaders/hud.vert @@ -1,20 +1,25 @@ cbuffer UniformBuffer : register(b0, space1) { int2 Viewport; - uint Index; +}; + +struct Input +{ + uint VertexID : SV_VertexID; + uint InstanceID : SV_InstanceID; }; struct Output { float4 Position : SV_Position; float2 Texcoord : TEXCOORD0; - nointerpolation uint Index : TEXCOORD1; - nointerpolation uint IsTexture : TEXCOORD2; + nointerpolation uint IsBlock : TEXCOORD1; }; -static const float2 kReferenceSize = float2(1280.0f, 720.0f); - -static const float2 kPositions[6] = { +static const float2 kCrosshair = float2(8.0f, 2.0f); +static const float2 kSize = float2(1280.0f, 720.0f); +static const float2 kPositions[6] = +{ float2(0.0f, 0.0f), float2(1.0f, 0.0f), float2(0.0f, 1.0f), @@ -23,13 +28,15 @@ static const float2 kPositions[6] = { float2(1.0f, 1.0f), }; -Output main(uint vertexID : SV_VertexID, uint instanceID : SV_InstanceID) +Output main(Input input) { - float2 viewportScale = float2(Viewport) / kReferenceSize; - float scale = max(viewportScale.x, viewportScale.y); + float2 ratio = float2(Viewport) / kSize; + float scale = max(ratio.x, ratio.y); float2 minimum; float2 maximum; - if (instanceID == 0) + Output output; + output.IsBlock = input.InstanceID == 0; + if (output.IsBlock) { minimum = float2(10.0f, 10.0f) * scale; maximum = minimum + 50.0f * scale; @@ -37,16 +44,13 @@ Output main(uint vertexID : SV_VertexID, uint instanceID : SV_InstanceID) else { float2 center = float2(Viewport) * 0.5f; - float2 size = instanceID == 1 ? float2(8.0f, 2.0f) : float2(2.0f, 8.0f); + float2 size = input.InstanceID == 1 ? kCrosshair.xy : kCrosshair.yx; minimum = center - size * scale; maximum = center + size * scale; } - float2 position = lerp(minimum, maximum, kPositions[vertexID]); + float2 position = lerp(minimum, maximum, kPositions[input.VertexID]); position = position / float2(Viewport) * 2.0f - 1.0f; - Output output; output.Position = float4(position, 0.0f, 1.0f); - output.Texcoord = float2(kPositions[vertexID].x, 1.0f - kPositions[vertexID].y); - output.Index = Index; - output.IsTexture = instanceID == 0; + output.Texcoord = float2(kPositions[input.VertexID].x, 1.0f - kPositions[input.VertexID].y); return output; } diff --git a/src/block.h b/src/block.h index 3ab0cd92..599a0f07 100644 --- a/src/block.h +++ b/src/block.h @@ -4,6 +4,8 @@ #include "direction.h" +#define BLOCK_WIDTH 16 + typedef Uint8 Block; enum // Block { diff --git a/src/camera.h b/src/camera.h index f943ea61..1576cdf6 100644 --- a/src/camera.h +++ b/src/camera.h @@ -27,8 +27,15 @@ typedef struct Camera }; float pitch; float yaw; - Sint32 width; - Sint32 height; + union + { + struct + { + Sint32 width; + Sint32 height; + }; + Sint32 size[2]; + }; float fov; float near; float far; diff --git a/src/main.c b/src/main.c index d68b9160..b8e07f1b 100644 --- a/src/main.c +++ b/src/main.c @@ -11,9 +11,7 @@ #include "world.h" static const char* SAVE_PATH = "blocks.sqlite3"; -static const int ATLAS_WIDTH = 512; -static const int ATLAS_MIP_LEVELS = 4; -static const int BLOCK_WIDTH = 16; +static const int MIP_LEVELS = 4; static const SDL_GPUSampleCount SAMPLE_COUNT = SDL_GPU_SAMPLECOUNT_4; static SDL_Window* window; @@ -24,22 +22,22 @@ static SDL_GPUGraphicsPipeline* opaque_pipeline; static SDL_GPUGraphicsPipeline* transparent_pipeline; static SDL_GPUGraphicsPipeline* sky_pipeline; static SDL_GPUGraphicsPipeline* raycast_pipeline; -static SDL_GPUGraphicsPipeline* ui_pipeline; +static SDL_GPUGraphicsPipeline* hud_pipeline; static SDL_Surface* atlas_surface; static SDL_GPUTexture* atlas_texture; static SDL_GPUTexture* depth_texture; static SDL_GPUTexture* position_texture; -static SDL_GPUTexture* multisample_color_texture; -static SDL_GPUTexture* multisample_position_texture; +static SDL_GPUTexture* msaa_color_texture; +static SDL_GPUTexture* msaa_position_texture; static SDL_GPUBuffer* block_buffer; static SDL_GPUSampler* nearest_sampler; static Sky sky; static Player player; -static Uint64 previous_ticks; +static Uint64 ticks1; static bool CreateAtlas() { - char path[512] = {0}; + char path[1024] = {0}; SDL_snprintf(path, sizeof(path), "%satlas.png", SDL_GetBasePath()); atlas_surface = SDL_LoadPNG(path); if (!atlas_surface) @@ -53,8 +51,8 @@ static bool CreateAtlas() SDL_GPUTextureCreateInfo info = {0}; info.format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; info.type = SDL_GPU_TEXTURETYPE_2D_ARRAY; - info.layer_count_or_depth = ATLAS_WIDTH / BLOCK_WIDTH; - info.num_levels = ATLAS_MIP_LEVELS; + info.layer_count_or_depth = atlas_surface->w / BLOCK_WIDTH; + info.num_levels = MIP_LEVELS; info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; info.width = BLOCK_WIDTH; info.height = BLOCK_WIDTH; @@ -117,7 +115,7 @@ static bool CreateAtlas() region.d = 1; SDL_UploadToGPUTexture(copy_pass, &transfer_info, ®ion, false); SDL_EndGPUCopyPass(copy_pass); - for (int layer = 0; layer < ATLAS_WIDTH / BLOCK_WIDTH; layer++) + for (int layer = 0; layer < atlas_surface->w / BLOCK_WIDTH; layer++) { SDL_GPUBlitInfo info = {0}; info.source.texture = source_texture; @@ -133,7 +131,7 @@ static bool CreateAtlas() info.destination.layer_or_depth_plane = layer; SDL_BlitGPUTexture(command_buffer, &info); } - if (ATLAS_MIP_LEVELS > 1) + if (MIP_LEVELS > 1) { SDL_GenerateMipmapsForGPUTexture(command_buffer, atlas_texture); } @@ -145,10 +143,7 @@ static bool CreateAtlas() static void SetWindowIcon() { - if (!atlas_surface) - { - return; - } + SDL_assert(atlas_surface); SDL_Surface* icon = SDL_CreateSurface(BLOCK_WIDTH, BLOCK_WIDTH, SDL_PIXELFORMAT_RGBA32); if (!icon) { @@ -198,10 +193,7 @@ static bool CreateOpaquePipeline() info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; info.multisample_state.sample_count = SAMPLE_COUNT; - if (info.vertex_shader && info.fragment_shader) - { - opaque_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); - } + opaque_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); SDL_ReleaseGPUShader(device, info.vertex_shader); SDL_ReleaseGPUShader(device, info.fragment_shader); return opaque_pipeline != NULL; @@ -236,10 +228,7 @@ static bool CreateTransparentPipeline() info.depth_stencil_state.enable_depth_test = true; info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; info.multisample_state.sample_count = SAMPLE_COUNT; - if (info.vertex_shader && info.fragment_shader) - { - transparent_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); - } + transparent_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); SDL_ReleaseGPUShader(device, info.vertex_shader); SDL_ReleaseGPUShader(device, info.fragment_shader); return transparent_pipeline != NULL; @@ -258,10 +247,7 @@ static bool CreateSkyPipeline() info.target_info.has_depth_stencil_target = true; info.target_info.depth_stencil_format = depth_format; info.multisample_state.sample_count = SAMPLE_COUNT; - if (info.vertex_shader && info.fragment_shader) - { - sky_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); - } + sky_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); SDL_ReleaseGPUShader(device, info.vertex_shader); SDL_ReleaseGPUShader(device, info.fragment_shader); return sky_pipeline != NULL; @@ -291,16 +277,13 @@ static bool CreateRaycastPipeline() info.rasterizer_state.depth_bias_constant_factor = -1.0f; info.rasterizer_state.depth_bias_slope_factor = -1.0f; info.multisample_state.sample_count = SAMPLE_COUNT; - if (info.vertex_shader && info.fragment_shader) - { - raycast_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); - } + raycast_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); SDL_ReleaseGPUShader(device, info.vertex_shader); SDL_ReleaseGPUShader(device, info.fragment_shader); return raycast_pipeline != NULL; } -static bool CreateUIPipeline() +static bool CreateHudPipeline() { SDL_GPUColorTargetDescription color_target = {0}; color_target.format = color_format; @@ -312,18 +295,15 @@ static bool CreateUIPipeline() color_target.blend_state.color_blend_op = SDL_GPU_BLENDOP_ADD; color_target.blend_state.alpha_blend_op = SDL_GPU_BLENDOP_ADD; SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = Shader_Load(device, "ui.vert"); - info.fragment_shader = Shader_Load(device, "ui.frag"); + info.vertex_shader = Shader_Load(device, "hud.vert"); + info.fragment_shader = Shader_Load(device, "hud.frag"); info.target_info.num_color_targets = 1; info.target_info.color_target_descriptions = &color_target; info.multisample_state.sample_count = SDL_GPU_SAMPLECOUNT_1; - if (info.vertex_shader && info.fragment_shader) - { - ui_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); - } + hud_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); SDL_ReleaseGPUShader(device, info.vertex_shader); SDL_ReleaseGPUShader(device, info.fragment_shader); - return ui_pipeline != NULL; + return hud_pipeline != NULL; } static bool CreateSamplers() @@ -355,7 +335,7 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to initialize SDL: %s", SDL_GetError()); return SDL_APP_FAILURE; } - window = SDL_CreateWindow("Blocks", 960, 720, SDL_WINDOW_HIDDEN); + window = SDL_CreateWindow("Blocks", 960, 720, SDL_WINDOW_RESIZABLE); if (!window) { SDL_Log("Failed to create window: %s", SDL_GetError()); @@ -376,7 +356,7 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to claim window: %s", SDL_GetError()); return SDL_APP_FAILURE; } - SDL_SetGPUSwapchainParameters(device, window, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_MAILBOX); + SDL_SetGPUSwapchainParameters(device, window, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_IMMEDIATE); color_format = SDL_GetGPUSwapchainTextureFormat(device, window); depth_format = SDL_GPU_TEXTUREFORMAT_D32_FLOAT; if (!CreateAtlas()) @@ -409,7 +389,7 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to create raycast pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!CreateUIPipeline()) + if (!CreateHudPipeline()) { SDL_Log("Failed to create ui pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; @@ -420,16 +400,15 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to create block buffer"); return SDL_APP_FAILURE; } - SDL_ShowWindow(window); - SDL_SetWindowResizable(window, true); SDL_FlashWindow(window, SDL_FLASH_BRIEFLY); SetWindowIcon(); Save_Init(SAVE_PATH); Sky_Load(&sky); World_Init(device); Player_Load(&player); + Sky_Update(&sky, 0.0f); World_Update(&player.camera); - previous_ticks = SDL_GetTicks(); + ticks1 = SDL_GetTicks(); return SDL_APP_CONTINUE; } @@ -441,14 +420,14 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) Sky_Save(&sky); Save_Free(); SDL_ReleaseGPUSampler(device, nearest_sampler); - SDL_ReleaseGPUTexture(device, multisample_position_texture); - SDL_ReleaseGPUTexture(device, multisample_color_texture); + SDL_ReleaseGPUTexture(device, msaa_position_texture); + SDL_ReleaseGPUTexture(device, msaa_color_texture); SDL_ReleaseGPUTexture(device, position_texture); SDL_ReleaseGPUTexture(device, depth_texture); SDL_ReleaseGPUTexture(device, atlas_texture); SDL_ReleaseGPUBuffer(device, block_buffer); SDL_DestroySurface(atlas_surface); - SDL_ReleaseGPUGraphicsPipeline(device, ui_pipeline); + SDL_ReleaseGPUGraphicsPipeline(device, hud_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, raycast_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, sky_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, transparent_pipeline); @@ -463,12 +442,12 @@ static bool Resize(int width, int height) { SDL_ReleaseGPUTexture(device, depth_texture); SDL_ReleaseGPUTexture(device, position_texture); - SDL_ReleaseGPUTexture(device, multisample_color_texture); - SDL_ReleaseGPUTexture(device, multisample_position_texture); + SDL_ReleaseGPUTexture(device, msaa_color_texture); + SDL_ReleaseGPUTexture(device, msaa_position_texture); depth_texture = NULL; position_texture = NULL; - multisample_color_texture = NULL; - multisample_position_texture = NULL; + msaa_color_texture = NULL; + msaa_position_texture = NULL; SDL_GPUTextureCreateInfo info = {0}; info.type = SDL_GPU_TEXTURETYPE_2D; info.format = depth_format; @@ -496,15 +475,15 @@ static bool Resize(int width, int height) info.format = color_format; info.sample_count = SAMPLE_COUNT; info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; - multisample_color_texture = SDL_CreateGPUTexture(device, &info); - if (!multisample_color_texture) + msaa_color_texture = SDL_CreateGPUTexture(device, &info); + if (!msaa_color_texture) { SDL_Log("Failed to create multisample color texture: %s", SDL_GetError()); return false; } info.format = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT; - multisample_position_texture = SDL_CreateGPUTexture(device, &info); - if (!multisample_position_texture) + msaa_position_texture = SDL_CreateGPUTexture(device, &info); + if (!msaa_position_texture) { SDL_Log("Failed to create multisample position texture: %s", SDL_GetError()); return false; @@ -513,41 +492,15 @@ static bool Resize(int width, int height) return true; } -static void DrawSky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) -{ - SDL_PushGPUDebugGroup(cbuf, "sky"); - SDL_BindGPUGraphicsPipeline(pass, sky_pipeline); - SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.proj, sizeof(player.camera.proj)); - SDL_PushGPUVertexUniformData(cbuf, 1, player.camera.view, sizeof(player.camera.view)); - SDL_PushGPUFragmentUniformData(cbuf, 0, sky.sun, sizeof(float) * 16); - SDL_DrawGPUPrimitives(pass, 36, 1, 0, 0); - SDL_PopGPUDebugGroup(cbuf); -} - -static void DrawOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) -{ - SDL_GPUTextureSamplerBinding sampler_binding = {0}; - sampler_binding.texture = atlas_texture; - sampler_binding.sampler = nearest_sampler; - SDL_PushGPUDebugGroup(cbuf, "opaque"); - SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, player.camera.position, sizeof(player.camera.position)); - SDL_PushGPUFragmentUniformData(cbuf, 2, sky.sun, sizeof(float) * 16); - SDL_BindGPUFragmentSamplers(pass, 0, &sampler_binding, 1); - SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); - World_Render(&player.camera, WORLD_MESH_TYPE_OPAQUE, cbuf, pass); - SDL_PopGPUDebugGroup(cbuf); -} - -static void RenderOpaquePass(SDL_GPUCommandBuffer* cbuf) +static void RenderOpaquePass(SDL_GPUCommandBuffer* command_buffer) { SDL_GPUColorTargetInfo color_info[2] = {0}; color_info[0].load_op = SDL_GPU_LOADOP_CLEAR; - color_info[0].texture = multisample_color_texture; + color_info[0].texture = msaa_color_texture; color_info[0].cycle = true; color_info[0].store_op = SDL_GPU_STOREOP_STORE; color_info[1].load_op = SDL_GPU_LOADOP_CLEAR; - color_info[1].texture = multisample_position_texture; + color_info[1].texture = msaa_position_texture; color_info[1].cycle = true; color_info[1].store_op = SDL_GPU_STOREOP_RESOLVE; color_info[1].resolve_texture = position_texture; @@ -559,106 +512,105 @@ static void RenderOpaquePass(SDL_GPUCommandBuffer* cbuf) depth_info.texture = depth_texture; depth_info.clear_depth = 1.0f; depth_info.cycle = true; - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, color_info, 2, &depth_info); - if (!pass) + SDL_GPURenderPass* render_pass = SDL_BeginGPURenderPass(command_buffer, color_info, 2, &depth_info); + if (!render_pass) { SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } - DrawSky(cbuf, pass); - DrawOpaque(cbuf, pass); - SDL_EndGPURenderPass(pass); -} - -static void DrawTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) -{ - SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; - sampler_bindings[0].texture = atlas_texture; - sampler_bindings[0].sampler = nearest_sampler; - sampler_bindings[1].texture = position_texture; - sampler_bindings[1].sampler = nearest_sampler; - SDL_PushGPUDebugGroup(cbuf, "transparent"); - SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, player.camera.position, sizeof(player.camera.position)); - SDL_PushGPUFragmentUniformData(cbuf, 2, sky.sun, sizeof(float) * 16); - SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); - SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); - World_Render(&player.camera, WORLD_MESH_TYPE_TRANSPARENT, cbuf, pass); - SDL_PopGPUDebugGroup(cbuf); -} - -static void DrawRaycast(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) -{ - if (player.query.block == BLOCK_EMPTY) - { - return; - } - SDL_PushGPUDebugGroup(cbuf, "raycast"); - SDL_BindGPUGraphicsPipeline(pass, raycast_pipeline); - SDL_PushGPUVertexUniformData(cbuf, 0, player.camera.matrix, sizeof(player.camera.matrix)); - SDL_PushGPUVertexUniformData(cbuf, 1, player.query.current, sizeof(player.query.current)); - SDL_DrawGPUPrimitives(pass, 36, 1, 0, 0); - SDL_PopGPUDebugGroup(cbuf); + SDL_PushGPUDebugGroup(command_buffer, "sky"); + SDL_BindGPUGraphicsPipeline(render_pass, sky_pipeline); + SDL_PushGPUVertexUniformData(command_buffer, 0, player.camera.proj, sizeof(player.camera.proj)); + SDL_PushGPUVertexUniformData(command_buffer, 1, player.camera.view, sizeof(player.camera.view)); + SDL_PushGPUFragmentUniformData(command_buffer, 0, sky.sun, sizeof(float) * 16); + SDL_DrawGPUPrimitives(render_pass, 36, 1, 0, 0); + SDL_PopGPUDebugGroup(command_buffer); + SDL_GPUTextureSamplerBinding sampler_binding = {0}; + sampler_binding.texture = atlas_texture; + sampler_binding.sampler = nearest_sampler; + SDL_PushGPUDebugGroup(command_buffer, "opaque"); + SDL_BindGPUGraphicsPipeline(render_pass, opaque_pipeline); + SDL_PushGPUFragmentUniformData(command_buffer, 1, player.camera.position, sizeof(player.camera.position)); + SDL_PushGPUFragmentUniformData(command_buffer, 2, sky.sun, sizeof(float) * 16); + SDL_BindGPUFragmentSamplers(render_pass, 0, &sampler_binding, 1); + SDL_BindGPUFragmentStorageBuffers(render_pass, 0, &block_buffer, 1); + World_Render(&player.camera, WORLD_MESH_TYPE_OPAQUE, command_buffer, render_pass); + SDL_PopGPUDebugGroup(command_buffer); + SDL_EndGPURenderPass(render_pass); } -static void RenderTransparentPass(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) +static void RenderTransparentPass(SDL_GPUCommandBuffer* command_buffer, SDL_GPUTexture* swapchain_texture) { SDL_GPUColorTargetInfo color_info = {0}; color_info.load_op = SDL_GPU_LOADOP_LOAD; - color_info.texture = multisample_color_texture; + color_info.texture = msaa_color_texture; color_info.store_op = SDL_GPU_STOREOP_RESOLVE; color_info.resolve_texture = swapchain_texture; SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_LOAD; depth_info.store_op = SDL_GPU_STOREOP_STORE; depth_info.texture = depth_texture; - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, &color_info, 1, &depth_info); - if (!pass) + SDL_GPURenderPass* render_pass = SDL_BeginGPURenderPass(command_buffer, &color_info, 1, &depth_info); + if (!render_pass) { SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } - DrawTransparent(cbuf, pass); - DrawRaycast(cbuf, pass); - SDL_EndGPURenderPass(pass); + SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; + sampler_bindings[0].texture = atlas_texture; + sampler_bindings[0].sampler = nearest_sampler; + sampler_bindings[1].texture = position_texture; + sampler_bindings[1].sampler = nearest_sampler; + SDL_PushGPUDebugGroup(command_buffer, "transparent"); + SDL_BindGPUGraphicsPipeline(render_pass, transparent_pipeline); + SDL_PushGPUFragmentUniformData(command_buffer, 1, player.camera.position, sizeof(player.camera.position)); + SDL_PushGPUFragmentUniformData(command_buffer, 2, sky.sun, sizeof(float) * 16); + SDL_BindGPUFragmentSamplers(render_pass, 0, sampler_bindings, 2); + SDL_BindGPUFragmentStorageBuffers(render_pass, 0, &block_buffer, 1); + World_Render(&player.camera, WORLD_MESH_TYPE_TRANSPARENT, command_buffer, render_pass); + SDL_PopGPUDebugGroup(command_buffer); + if (player.query.block != BLOCK_EMPTY) + { + SDL_PushGPUDebugGroup(command_buffer, "raycast"); + SDL_BindGPUGraphicsPipeline(render_pass, raycast_pipeline); + SDL_PushGPUVertexUniformData(command_buffer, 0, player.camera.matrix, sizeof(player.camera.matrix)); + SDL_PushGPUVertexUniformData(command_buffer, 1, player.query.current, sizeof(player.query.current)); + SDL_DrawGPUPrimitives(render_pass, 36, 1, 0, 0); + SDL_PopGPUDebugGroup(command_buffer); + } + SDL_EndGPURenderPass(render_pass); } -static void RenderUIPass(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) +static void RenderHudPass(SDL_GPUCommandBuffer* command_buffer, SDL_GPUTexture* swapchain_texture) { SDL_GPUColorTargetInfo color_info = {0}; color_info.load_op = SDL_GPU_LOADOP_LOAD; color_info.store_op = SDL_GPU_STOREOP_STORE; color_info.texture = swapchain_texture; - SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, &color_info, 1, NULL); - if (!pass) + SDL_GPURenderPass* render_pass = SDL_BeginGPURenderPass(command_buffer, &color_info, 1, NULL); + if (!render_pass) { SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } + Uint32 block = Block_GetIndex(player.block, DIRECTION_NORTH); SDL_GPUTextureSamplerBinding sampler_binding = {0}; sampler_binding.texture = atlas_texture; sampler_binding.sampler = nearest_sampler; - struct - { - int viewport[2]; - Uint32 index; - } uniform; - uniform.viewport[0] = player.camera.width; - uniform.viewport[1] = player.camera.height; - uniform.index = Block_GetIndex(player.block, DIRECTION_NORTH); - SDL_PushGPUDebugGroup(cbuf, "ui"); - SDL_BindGPUGraphicsPipeline(pass, ui_pipeline); - SDL_BindGPUFragmentSamplers(pass, 0, &sampler_binding, 1); - SDL_PushGPUVertexUniformData(cbuf, 0, &uniform, sizeof(uniform)); - SDL_DrawGPUPrimitives(pass, 6, 3, 0, 0); - SDL_PopGPUDebugGroup(cbuf); - SDL_EndGPURenderPass(pass); + SDL_PushGPUDebugGroup(command_buffer, "ui"); + SDL_BindGPUGraphicsPipeline(render_pass, hud_pipeline); + SDL_BindGPUFragmentSamplers(render_pass, 0, &sampler_binding, 1); + SDL_PushGPUVertexUniformData(command_buffer, 0, &player.camera.size, sizeof(player.camera.size)); + SDL_PushGPUFragmentUniformData(command_buffer, 0, &block, sizeof(block)); + SDL_DrawGPUPrimitives(render_pass, 6, 3, 0, 0); + SDL_PopGPUDebugGroup(command_buffer); + SDL_EndGPURenderPass(render_pass); } -static void RenderFrame() +static void Render() { - SDL_GPUCommandBuffer* cbuf = SDL_AcquireGPUCommandBuffer(device); - if (!cbuf) + SDL_GPUCommandBuffer* command_buffer = SDL_AcquireGPUCommandBuffer(device); + if (!command_buffer) { SDL_Log("Failed to acquire command buffer: %s", SDL_GetError()); return; @@ -666,41 +618,41 @@ static void RenderFrame() SDL_GPUTexture* swapchain_texture; Uint32 width; Uint32 height; - if (!SDL_WaitAndAcquireGPUSwapchainTexture(cbuf, window, &swapchain_texture, &width, &height)) + if (!SDL_WaitAndAcquireGPUSwapchainTexture(command_buffer, window, &swapchain_texture, &width, &height)) { SDL_Log("Failed to acquire swapchain texture: %s", SDL_GetError()); - SDL_CancelGPUCommandBuffer(cbuf); + SDL_CancelGPUCommandBuffer(command_buffer); return; } if (!swapchain_texture || !width || !height) { - SDL_SubmitGPUCommandBuffer(cbuf); + SDL_SubmitGPUCommandBuffer(command_buffer); return; } if ((width != player.camera.width || height != player.camera.height) && !Resize(width, height)) { - SDL_SubmitGPUCommandBuffer(cbuf); + SDL_SubmitGPUCommandBuffer(command_buffer); return; } Camera_Update(&player.camera); - RenderOpaquePass(cbuf); - RenderTransparentPass(cbuf, swapchain_texture); - RenderUIPass(cbuf, swapchain_texture); - SDL_SubmitGPUCommandBuffer(cbuf); + RenderOpaquePass(command_buffer); + RenderTransparentPass(command_buffer, swapchain_texture); + RenderHudPass(command_buffer, swapchain_texture); + SDL_SubmitGPUCommandBuffer(command_buffer); } SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) { - Uint64 ticks = SDL_GetTicks(); - float dt = ticks - previous_ticks; - previous_ticks = ticks; + Uint64 ticks2 = SDL_GetTicks(); + float dt = ticks2 - ticks1; + ticks1 = ticks2; if (SDL_GetWindowRelativeMouseMode(window)) { Player_Move(&player, dt); + Sky_Update(&sky, dt / 1000.0f); } - Sky_Update(&sky, dt / 1000.0f); World_Update(&player.camera); - RenderFrame(); + Render(); return SDL_APP_CONTINUE; } @@ -710,12 +662,6 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) { case SDL_EVENT_QUIT: return SDL_APP_SUCCESS; - case SDL_EVENT_MOUSE_MOTION: - if (SDL_GetWindowRelativeMouseMode(window)) - { - Player_Rotate(&player, event->motion.yrel, event->motion.xrel); - } - break; case SDL_EVENT_KEY_DOWN: if (event->key.scancode == SDL_SCANCODE_ESCAPE) { @@ -732,9 +678,7 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) } else if (event->key.scancode == SDL_SCANCODE_F11) { - bool fullscreen = !(SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN); - SDL_SetWindowFullscreen(window, fullscreen); - SDL_SetWindowRelativeMouseMode(window, fullscreen); + SDL_SetWindowFullscreen(window, !(SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN)); } break; case SDL_EVENT_MOUSE_BUTTON_DOWN: @@ -756,7 +700,16 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) } break; case SDL_EVENT_MOUSE_WHEEL: - Player_ChangeBlock(&player, event->wheel.y); + if (SDL_GetWindowRelativeMouseMode(window)) + { + Player_ChangeBlock(&player, event->wheel.y); + } + break; + case SDL_EVENT_MOUSE_MOTION: + if (SDL_GetWindowRelativeMouseMode(window)) + { + Player_Rotate(&player, event->motion.yrel, event->motion.xrel); + } break; } return SDL_APP_CONTINUE; diff --git a/src/world.c b/src/world.c index 6906e0cd..e0d7acf3 100644 --- a/src/world.c +++ b/src/world.c @@ -788,19 +788,6 @@ static Chunk* GetWorldChunk(const int position[3]) } } -Block World_GetBlock(const int position[3]) -{ - Chunk* chunk = GetWorldChunk(position); - if (chunk) - { - return GetChunkBlock(chunk, position[0], position[1], position[2]); - } - else - { - return BLOCK_EMPTY; - } -} - void World_SetBlock(const int position[3], Block block) { Chunk* chunk = GetWorldChunk(position); @@ -863,6 +850,19 @@ void World_SetBlock(const int position[3], Block block) } } +Block World_GetBlock(const int position[3]) +{ + Chunk* chunk = GetWorldChunk(position); + if (chunk) + { + return GetChunkBlock(chunk, position[0], position[1], position[2]); + } + else + { + return BLOCK_EMPTY; + } +} + WorldQuery World_Raycast(const Camera* camera, float max_distance) { WorldQuery query = {0}; diff --git a/src/world.h b/src/world.h index 5f65ac18..7b10a116 100644 --- a/src/world.h +++ b/src/world.h @@ -28,6 +28,6 @@ void World_Init(SDL_GPUDevice* device); void World_Free(); void World_Update(const Camera* camera); void World_Render(const Camera* camera, WorldMeshType type, SDL_GPUCommandBuffer* command_buffer, SDL_GPURenderPass* render_pass); -Block World_GetBlock(const int position[3]); void World_SetBlock(const int position[3], Block block); +Block World_GetBlock(const int position[3]); WorldQuery World_Raycast(const Camera* camera, float max_distance); From ea2da0d897eed3c17d33b27a9577b3ab25cbc1b2 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sun, 19 Jul 2026 18:00:01 -0400 Subject: [PATCH 38/39] fixes --- doc/Screenshot 2026-07-19 155117.png | Bin 197567 -> 0 bytes shaders/bin/opaque.frag.msl | 94 ++++++++--------- shaders/bin/opaque.frag.spv | Bin 7196 -> 6856 bytes shaders/bin/opaque.vert.spv | Bin 2680 -> 2680 bytes shaders/bin/raycast.vert.spv | Bin 1984 -> 1984 bytes shaders/bin/sky.frag.spv | Bin 1424 -> 1424 bytes shaders/bin/sky.vert.spv | Bin 2096 -> 2096 bytes shaders/bin/transparent.frag.msl | 102 +++++++++--------- shaders/bin/transparent.frag.spv | Bin 7596 -> 7256 bytes shaders/bin/transparent.vert.spv | Bin 2616 -> 2616 bytes shaders/opaque.frag | 13 ++- shaders/opaque.vert | 4 +- shaders/shader.hlsl | 148 ++++++++++++--------------- shaders/transparent.frag | 17 ++- src/block.c | 100 +++++++++--------- src/block.h | 8 +- src/world.c | 6 +- 17 files changed, 231 insertions(+), 261 deletions(-) delete mode 100644 doc/Screenshot 2026-07-19 155117.png diff --git a/doc/Screenshot 2026-07-19 155117.png b/doc/Screenshot 2026-07-19 155117.png deleted file mode 100644 index 3e1180e297b3b7a1710aa622df49828f56ed64c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197567 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 W6oa4k8kwV^{!|n-pr!KWLH`Hu18bB3 diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 41e2d28f..395aef86 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -44,18 +44,21 @@ struct spvUnsafeArray } }; +struct Light +{ + packed_int3 Position; + uint Color; +}; + struct Block { + Light _Light; uint IsOpaque; uint IsSolid; uint IsSprite; - uint IsOccluded; + uint UseAO; uint UseSunNormal; float SunIntensity; - uint LightColor; - int LightX; - int LightY; - int LightZ; uint Indices[6]; }; @@ -64,14 +67,6 @@ struct type_StructuredBuffer_Block Block _m0[1]; }; -struct Light -{ - uint Color; - int X; - int Y; - int Z; -}; - struct type_StructuredBuffer_Light { Light _m0[1]; @@ -95,7 +90,7 @@ struct type_UniformBuffer_2 float4 Ambient; }; -constant spvUnsafeArray _90 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _91 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -114,67 +109,66 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) { main0_out out = {}; - uint _107 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _114 = in.in_var_TEXCOORD2 & 7u; - float3 _120 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_107].Indices[_114])); - float4 _124 = atlasTexture.sample(atlasSampler, _120.xy, uint(rint(_120.z))); - if (_124.w < 0.001000000047497451305389404296875) + uint _106 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _113 = in.in_var_TEXCOORD2 & 7u; + float3 _119 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_106].Indices[_113])); + float4 _123 = atlasTexture.sample(atlasSampler, _119.xy, uint(rint(_119.z))); + if (_123.w < 0.001000000047497451305389404296875) { discard_fragment(); } - uint _134 = uint(UniformBuffer.LightCount); + uint _133 = uint(UniformBuffer.LightCount); + float3 _136; + _136 = float3(0.0); float3 _137; - _137 = float3(0.0); - float3 _138; - for (uint _140 = 0u; _140 < _134; _137 = _138, _140++) + for (uint _139 = 0u; _139 < _133; _136 = _137, _139++) { - float _153 = float((lightBuffer._m0[_140].Color & 4278190080u) >> 24u); - float3 _159 = (float3(float(lightBuffer._m0[_140].X), float(lightBuffer._m0[_140].Y), float(lightBuffer._m0[_140].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _160 = length(_159); - if (_160 >= _153) + float _150 = float((lightBuffer._m0[_139].Color & 4278190080u) >> 24u); + float3 _153 = (float3(int3(lightBuffer._m0[_139].Position)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _154 = length(_153); + if (_154 >= _150) { - _138 = _137; + _137 = _136; continue; } - float _167 = fast::clamp(dot(_90[_114], _159 / float3(_160)), 0.0, 1.0); - if (_167 <= 0.0) + float _165; + if (blockBuffer._m0[_106].IsSprite == 0u) + { + _165 = fast::clamp(dot(_91[_113], _153 / float3(_154)), 0.0, 1.0); + } + else + { + _165 = 0.7070000171661376953125; + } + if (_165 <= 0.0) { - _138 = _137; + _137 = _136; continue; } - _138 = _137 + ((float3(float(lightBuffer._m0[_140].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _167) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_160 / _153, 0.0, 1.0)))); + _137 = _136 + ((float3(float(lightBuffer._m0[_139].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_139].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_139].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _165) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_154 / _150, 0.0, 1.0)))); } - float _217; + float _210; do { if (UniformBuffer_2.Sun.w <= 0.0) { - _217 = 0.0; + _210 = 0.0; break; } - float _214; - if (blockBuffer._m0[_107].UseSunNormal != 0u) + float _207; + if (blockBuffer._m0[_106].UseSunNormal != 0u) { - float _213; - if (blockBuffer._m0[_107].IsOccluded != 0u) - { - _213 = fast::clamp(-dot(_90[_114], UniformBuffer_2.Sun.xyz), 0.0, 1.0); - } - else - { - _213 = 0.7070000171661376953125; - } - _214 = _213; + _207 = fast::clamp(-dot(_91[_113], UniformBuffer_2.Sun.xyz), 0.0, 1.0); } else { - _214 = 1.0; + _207 = 1.0; } - _217 = (blockBuffer._m0[_107].SunIntensity * UniformBuffer_2.Sun.w) * _214; + _210 = (blockBuffer._m0[_106].SunIntensity * UniformBuffer_2.Sun.w) * _207; break; } while(false); - float3 _225 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_124.xyz * ((_137 + (UniformBuffer_2.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_217)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_225.y, length(_225.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _213 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_123.xyz * ((_136 + (UniformBuffer_2.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_210)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_213.y, length(_213.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index eb4cfe183ad645782de1d5450cdbed84dea0e344..32abbfe677d70a832bc983a4c0141864c5dff2e6 100644 GIT binary patch literal 6856 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 OsgFW>K95tyLhwHYXRGZ1 literal 7196 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 ISu6(s1q|=b%K!iX diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index b91155d50947e52403dedc04edf0aa300e75c967..b08194c5749b6fbcaf3bb060651c1cc2728ccc37 100644 GIT binary patch delta 473 zcmew%@fiUIfTzfy#sQ ziUKhMLxcU~6U-^~APZ!Gm>>@=7*upwL&ga#4^I z9f8;ytc8K$I0Gw#z~n}DWw4A3R0iZoh|Er?j5}0D0WR~A{X5X)mmKw$ATy(&@*wAe zbpq*Vs5mH03xJ^p@^%bV{1DjQg`C2?Al-3591FxklMixgD}qE4ff(dQkoREbB|*i7 JC-ZV;0{{@4F3GC?b=!=yd5orP<_k$MnE*QN4$e?5VbATV~sT07I zbPCRTpJ(6}(68WX&W1Kn2YkUEc&DWI!Fj09nQcls2XB>h7o0PF{Q)>K2&=}a_kZ=xlP_&GIB}& zpL|z;F?m&+A9Ci@JMwyd M-lg+XZPai60CR*c{r~^~ diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index b97a2bfbb06e6521fa6404fd74d89901498a4770..82f0b53524c5596c0b0e67bd87e84da8a68c8f2a 100644 GIT binary patch delta 670 zcmZ9JJx;?w6oj8+$B_t5Fd>+KkfKzfK_Jn9AV?enaSCdL0u>FSS#b|2s3-`hpym*C zATi&@E3L3JelxSP>-W~v?zH>-lbrW0v$mP-2s|U{In{Zu?7fmM#PL#L*K)5r;$%GB zxKT|=EePG6ZeoFByIPR_6qK7Aoy>% zue2xsJH6KXD%&q-|0T0MB{;Znui4v#Iq02!;Z%C1KYCIho>OT7j~p2|l{L;_4;eT$ zoJB>GrIKf_@*N*Wu&Hvt%}cd=kq`8~$p{?vr=M}(} zaKlD1qG~}%JuBq+!Ll|gWOoD( z8xeQQXcn(34r=)|`Hfnaiwp>QsY VVP!7_IQ_pV=aSY#(00$Q!5`kWE4u&y diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index 7e4cb8131dfb9d2373a272802b9e806e02f9a7d4..8bf16fd2c90b917758d621a00eebc364ffb3513d 100644 GIT binary patch delta 138 zcmbQhJ%M|J1e1X{0}BHu0|NsG5Hka@Hjocua{)03!1&x?UW5H)4<;X8kR%*WUdUw5 v$T|5Y({&)Zk=YnXK4o?WlA0{LB|%1O0kI|$<^fv3Ir%S3J|p+!TvlZO0kILN delta 138 zcmbQhJ%M|J1e1X_0}BHO0|Nsm5Q6}W&jsc+*oy<@xq)nu8fGA#?7`&23sMZnlNU0X wGjdP9$#fk^Ze%tFl24hPfuttOZb^_xv?fQ#*_-ymH4jmUc=1iNPJ%yt*=;_q~Qm`czpPC z18G_t?;DDsd7sx0TfO=(`od9X_J_QF99%-p>v?-o^MO!5>2$PEABodUt5@yByuet& zViNeNA`19KxEJt3m>2Q>sc;bKx}LGvVZ-6L{WI!SYWzZ`kw3efJkp=638X zr>{%JLNV3tOXbY1?UU*s_E!6^eU14yL-!IF)k+RL*9zuiCguQ>nSs9PmHxnFdPBp9 z2TZ2M9r*Bo$^I@f9Ix`EIly5KUN*yCmle+QVEe&X*2U*1<@gI|DC)6zM6 zf4Pn3_Q9#eTq9~6L_v#>GCH@q+m+%u{{bM{oLk$vt4s6a6!2#z9KLxfZ|Jh$;mESV+l5@^c3)B>Q zEzv8#HV^RM%r)NM<~b|;)1Yp6uN4x^T%x!?cjlhN?A(!iaTgacJ3md0IcA929f~t} zh8bdZoyAU$>?{BW!oxhkFfseY-`abu`(m%Mq5rTo-ap}8=1b`7{52c-ul(*8C(kIS diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index 6031203e..fdc274d1 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -44,18 +44,21 @@ struct spvUnsafeArray } }; +struct Light +{ + packed_int3 Position; + uint Color; +}; + struct Block { + Light _Light; uint IsOpaque; uint IsSolid; uint IsSprite; - uint IsOccluded; + uint UseAO; uint UseSunNormal; float SunIntensity; - uint LightColor; - int LightX; - int LightY; - int LightZ; uint Indices[6]; }; @@ -64,14 +67,6 @@ struct type_StructuredBuffer_Block Block _m0[1]; }; -struct Light -{ - uint Color; - int X; - int Y; - int Z; -}; - struct type_StructuredBuffer_Light { Light _m0[1]; @@ -95,7 +90,7 @@ struct type_UniformBuffer_2 float4 Ambient; }; -constant spvUnsafeArray _92 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _93 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -113,73 +108,72 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], texture2d positionTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler positionSampler [[sampler(1)]]) { main0_out out = {}; - uint _111 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _118 = in.in_var_TEXCOORD2 & 7u; - float3 _126 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_111].Indices[_118])); - float4 _130 = atlasTexture.sample(atlasSampler, _126.xy, uint(rint(_126.z))); - float _132 = _130.w; - uint _135 = uint(UniformBuffer.LightCount); + uint _110 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _117 = in.in_var_TEXCOORD2 & 7u; + float3 _125 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_110].Indices[_117])); + float4 _129 = atlasTexture.sample(atlasSampler, _125.xy, uint(rint(_125.z))); + float _131 = _129.w; + uint _134 = uint(UniformBuffer.LightCount); + float3 _137; + _137 = float3(0.0); float3 _138; - _138 = float3(0.0); - float3 _139; - for (uint _141 = 0u; _141 < _135; _138 = _139, _141++) + for (uint _140 = 0u; _140 < _134; _137 = _138, _140++) { - float _154 = float((lightBuffer._m0[_141].Color & 4278190080u) >> 24u); - float3 _160 = (float3(float(lightBuffer._m0[_141].X), float(lightBuffer._m0[_141].Y), float(lightBuffer._m0[_141].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _161 = length(_160); - if (_161 >= _154) + float _151 = float((lightBuffer._m0[_140].Color & 4278190080u) >> 24u); + float3 _154 = (float3(int3(lightBuffer._m0[_140].Position)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _155 = length(_154); + if (_155 >= _151) { - _139 = _138; + _138 = _137; continue; } - float _168 = fast::clamp(dot(_92[_118], _160 / float3(_161)), 0.0, 1.0); - if (_168 <= 0.0) + float _166; + if (blockBuffer._m0[_110].IsSprite == 0u) + { + _166 = fast::clamp(dot(_93[_117], _154 / float3(_155)), 0.0, 1.0); + } + else + { + _166 = 0.7070000171661376953125; + } + if (_166 <= 0.0) { - _139 = _138; + _138 = _137; continue; } - _139 = _138 + ((float3(float(lightBuffer._m0[_141].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_141].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_141].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _168) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_161 / _154, 0.0, 1.0)))); + _138 = _137 + ((float3(float(lightBuffer._m0[_140].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _166) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_155 / _151, 0.0, 1.0)))); } - float _218; + float _211; do { if (UniformBuffer_2.Sun.w <= 0.0) { - _218 = 0.0; + _211 = 0.0; break; } - float _215; - if (blockBuffer._m0[_111].UseSunNormal != 0u) + float _208; + if (blockBuffer._m0[_110].UseSunNormal != 0u) { - float _214; - if (blockBuffer._m0[_111].IsOccluded != 0u) - { - _214 = fast::clamp(-dot(_92[_118], UniformBuffer_2.Sun.xyz), 0.0, 1.0); - } - else - { - _214 = 0.7070000171661376953125; - } - _215 = _214; + _208 = fast::clamp(-dot(_93[_117], UniformBuffer_2.Sun.xyz), 0.0, 1.0); } else { - _215 = 1.0; + _208 = 1.0; } - _218 = (blockBuffer._m0[_111].SunIntensity * UniformBuffer_2.Sun.w) * _215; + _211 = (blockBuffer._m0[_110].SunIntensity * UniformBuffer_2.Sun.w) * _208; break; } while(false); - float3 _221 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; - float _255; - if (blockBuffer._m0[_111].Indices[_118] == 16u) + float3 _214 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; + float _248; + if (blockBuffer._m0[_110].Indices[_117] == 16u) { - _255 = _132 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _248 = _131 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _255 = _132; + _248 = _131; } - out.out_var_SV_Target0 = float4(mix(_130.xyz * ((_138 + UniformBuffer_2.Ambient.xyz) + float3(_218)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_221.y, length(_221.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _255); + out.out_var_SV_Target0 = float4(mix(_129.xyz * ((_137 + UniformBuffer_2.Ambient.xyz) + float3(_211)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_214.y, length(_214.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _248); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index c11ba547fe7732906a7daa471c62f519f0b0d26e..3b3514c978b53bedb15afb07cc6adeec6a734618 100644 GIT binary patch literal 7256 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 Du14b1 literal 7596 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 lxc00@>n7d^sQ+qz0^hav{rXM*hjXton@n zn{8Q{8G#%}wsKLBf#yJL2*e-<9A{u<;GcY!O&KWvkxdv#va&0KRoOySfvkb3vSt6y zC_LGeqdpR3N&r+IWGz@8NC!g2L4GfQ`a1|Jeh6d}kR1%fAlpG+h3N}{iVIEVB*>His65D8uso0sgo=awS^y24AgK5ukWD~#Fc5=m2YD5yF9a$sJeimC KIM9x(oXG&bb0psY diff --git a/shaders/opaque.frag b/shaders/opaque.frag index 69f21a07..394753cc 100644 --- a/shaders/opaque.frag +++ b/shaders/opaque.frag @@ -28,7 +28,7 @@ struct Input float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float Occlusion : TEXCOORD3; + float AO : TEXCOORD3; }; struct Output @@ -42,21 +42,20 @@ Output main(Input input) Output output; Block block = blockBuffer[GetBlockIndex(input.Voxel)]; float3 texcoord = float3(input.Texcoord, GetAtlasIndex(input.Voxel, block)); - float4 rawColor = atlasTexture.Sample(atlasSampler, texcoord); + float4 color = atlasTexture.Sample(atlasSampler, texcoord); output.Position = input.WorldPosition; - if (rawColor.a < kEpsilon) + if (color.a < kEpsilon) { discard; return output; } - float3 albedo = rawColor.rgb; + float3 albedo = color.rgb; float3 normal = GetNormal(input.Voxel); - float3 pointLight = GetPointLight(lightBuffer, LightCount, input.WorldPosition.xyz, normal); + float3 light = GetLight(lightBuffer, LightCount, input.WorldPosition.xyz, normal, block); float3 ambient = Ambient.xyz; float sunlight = GetSunlight(Sun.xyz, Sun.w, normal, block); - float3 litColor = albedo * (pointLight + ambient * input.Occlusion + sunlight); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFogValue(distance(input.WorldPosition.xz, PlayerPosition.xz)); - output.Color = float4(lerp(litColor, sky, fog), 1.0f); + output.Color = float4(lerp(albedo * (light + ambient * input.AO + sunlight), sky, fog), 1.0f); return output; } diff --git a/shaders/opaque.vert b/shaders/opaque.vert index f7a37681..79d7c7a8 100644 --- a/shaders/opaque.vert +++ b/shaders/opaque.vert @@ -26,7 +26,7 @@ struct Output float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float Occlusion : TEXCOORD3; + float AO : TEXCOORD3; }; Output main(Input input) @@ -39,6 +39,6 @@ Output main(Input input) output.Position = mul(Proj, output.Position); output.Texcoord = GetTexcoord(input.Voxel); output.Voxel = input.Voxel; - output.Occlusion = GetOcclusion(input.Voxel); + output.AO = GetAO(input.Voxel); return output; } diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 94f16917..fcc670e9 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -6,67 +6,60 @@ static const float kEpsilon = 0.001f; static const float kPi = 3.14159265f; +static const uint kWater = 16; + +struct Light +{ + int3 Position; + uint Color; +}; struct Block { + Light _Light; uint IsOpaque; uint IsSolid; uint IsSprite; - uint IsOccluded; + uint UseAO; uint UseSunNormal; float SunIntensity; - uint LightColor; - int LightX; - int LightY; - int LightZ; uint Indices[6]; }; -static const float3 kNormals[6] = { - float3(0.0f, 0.0f, 1.0f), // north - float3(0.0f, 0.0f, -1.0f), // south - float3(1.0f, 0.0f, 0.0f), // east - float3(-1.0f, 0.0f, 0.0f), // west - float3(0.0f, 1.0f, 0.0f), // up - float3(0.0f, -1.0f, 0.0f), // down -}; - -static const float3 kCubePositions[8] = { - float3(-0.5f, -0.5f, -0.5f), // -x, -y, -z - float3(0.5f, -0.5f, -0.5f), // +x, -y, -z - float3(0.5f, 0.5f, -0.5f), // +x, +y, -z - float3(-0.5f, 0.5f, -0.5f), // -x, +y, -z - float3(-0.5f, -0.5f, 0.5f), // -x, -y, +z - float3(0.5f, -0.5f, 0.5f), // +x, -y, +z - float3(0.5f, 0.5f, 0.5f), // +x, +y, +z - float3(-0.5f, 0.5f, 0.5f), // -x, +y, +z +static const float3 kCubePositions[8] = +{ + float3(-0.5f,-0.5f,-0.5f ), + float3( 0.5f,-0.5f,-0.5f ), + float3( 0.5f, 0.5f,-0.5f ), + float3(-0.5f, 0.5f,-0.5f ), + float3(-0.5f,-0.5f, 0.5f ), + float3( 0.5f,-0.5f, 0.5f ), + float3( 0.5f, 0.5f, 0.5f ), + float3(-0.5f, 0.5f, 0.5f ), }; -static const float3 kCubeNormals[6] = { - float3(0.0f, 0.0f, -1.0f), // -z - float3(0.0f, 0.0f, 1.0f), // +z - float3(-1.0f, 0.0f, 0.0f), // -x - float3(1.0f, 0.0f, 0.0f), // +x - float3(0.0f, 1.0f, 0.0f), // +y - float3(0.0f, -1.0f, 0.0f), // -y +static const uint kCubeIndices[36] = +{ + 0, 1, 2, 0, 2, 3, + 5, 4, 7, 5, 7, 6, + 4, 0, 3, 4, 3, 7, + 1, 5, 6, 1, 6, 2, + 3, 2, 6, 3, 6, 7, + 4, 5, 1, 4, 1, 0, }; -static const uint kCubeIndices[36] = { - 0, 1, 2, 0, 2, 3, // -z - 5, 4, 7, 5, 7, 6, // +z - 4, 0, 3, 4, 3, 7, // -x - 1, 5, 6, 1, 6, 2, // +x - 3, 2, 6, 3, 6, 7, // +y - 4, 5, 1, 4, 1, 0, // -y +static const float3 kNormals[6] = +{ + float3( 0.0f, 0.0f, 1.0f ), + float3( 0.0f, 0.0f,-1.0f ), + float3( 1.0f, 0.0f, 0.0f ), + float3(-1.0f, 0.0f, 0.0f ), + float3( 0.0f, 1.0f, 0.0f ), + float3( 0.0f,-1.0f, 0.0f ), }; static const float kAO[4] = {0.4f, 0.6f, 0.8f, 1.0f}; -float GetOcclusion(uint voxel) -{ - return kAO[(voxel >> AO_OFFSET) & AO_MASK]; -} - uint GetDirection(uint voxel) { return (voxel >> DIRECTION_OFFSET) & DIRECTION_MASK; @@ -77,14 +70,19 @@ uint GetBlockIndex(uint voxel) return (voxel >> BLOCK_OFFSET) & BLOCK_MASK; } +uint GetAtlasIndex(uint voxel, Block block) +{ + return block.Indices[GetDirection(voxel)]; +} + float3 GetPosition(uint voxel) { return float3((voxel >> X_OFFSET) & X_MASK, (voxel >> Y_OFFSET) & Y_MASK, (voxel >> Z_OFFSET) & Z_MASK); } -uint GetAtlasIndex(uint voxel, Block block) +float3 GetCubePosition(uint vertexID) { - return block.Indices[GetDirection(voxel)]; + return kCubePositions[kCubeIndices[vertexID]]; } float2 GetTexcoord(uint voxel) @@ -97,68 +95,56 @@ float3 GetNormal(uint voxel) return kNormals[GetDirection(voxel)]; } -float3 GetCubePosition(uint vertexID) -{ - return kCubePositions[kCubeIndices[vertexID]]; -} - -float3 GetCubeNormal(uint vertexID) +float GetAO(uint voxel) { - return kCubeNormals[vertexID / 6]; + return kAO[(voxel >> AO_OFFSET) & AO_MASK]; } -struct Light -{ - uint Color; - int X; - int Y; - int Z; -}; - -float3 GetPointLight(StructuredBuffer lights, uint lightCount, float3 position, float3 normal) +float3 GetLight(StructuredBuffer lights, uint count, float3 position, float3 normal, Block block) { static const float3 kOffset = float3(0.0f, 0.25f, 0.0f); - float3 accumulatedLight = float3(0.0f, 0.0f, 0.0f); - for (uint lightIndex = 0; lightIndex < lightCount; lightIndex++) + float3 final = float3(0.0f, 0.0f, 0.0f); + for (uint i = 0; i < count; i++) { - Light light = lights[lightIndex]; + Light light = lights[i]; float radius = (light.Color & 0xFF000000) >> 24; - float3 lightPosition = float3(light.X, light.Y, light.Z) + 0.5f + kOffset; - float3 offset = lightPosition - position; + float3 offset = light.Position + 0.5f + kOffset - position; float distance = length(offset); if (distance >= radius) { continue; } - float3 lightDirection = offset / distance; - float lightAngle = saturate(dot(normal, lightDirection)); - if (lightAngle <= 0.0f) + float angle = 0.707f; + if (!block.IsSprite) + { + angle = saturate(dot(normal, offset / distance)); + } + if (angle <= 0.0f) { continue; } - float normalizedDistance = saturate(distance / radius); - float attenuation = 1.0f - smoothstep(0.0f, 1.0f, normalizedDistance); - float3 lightColor; - lightColor.r = ((light.Color & 0x000000FF) >> 0) / 255.0f; - lightColor.g = ((light.Color & 0x0000FF00) >> 8) / 255.0f; - lightColor.b = ((light.Color & 0x00FF0000) >> 16) / 255.0f; - accumulatedLight += lightColor * lightAngle * attenuation; + float attenuation = 1.0f - smoothstep(0.0f, 1.0f, saturate(distance / radius)); + float3 color; + color.r = ((light.Color & 0x000000FF) >> 0) / 255.0f; + color.g = ((light.Color & 0x0000FF00) >> 8) / 255.0f; + color.b = ((light.Color & 0x00FF0000) >> 16) / 255.0f; + final += color * angle * attenuation; } - return accumulatedLight; + return final; } -float GetSunlight(float3 sunDirection, float sunIntensity, float3 normal, Block block) +float GetSunlight(float3 direction, float intensity, float3 normal, Block block) { - if (sunIntensity <= 0.0f) + if (intensity <= 0.0f) { return 0.0f; } - float lightAngle = 1.0f; + float angle = 1.0f; if (block.UseSunNormal) { - lightAngle = block.IsOccluded ? saturate(-dot(normal, sunDirection)) : 0.707f; + angle = saturate(-dot(normal, direction)); } - return block.SunIntensity * sunIntensity * lightAngle; + return block.SunIntensity * intensity * angle; } float GetFogValue(float distance) diff --git a/shaders/transparent.frag b/shaders/transparent.frag index f449fad2..91eefc7d 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -33,28 +33,25 @@ struct Input noperspective float2 Fragment : TEXCOORD3; }; -static const uint kWater = 16; - float4 main(Input input) : SV_Target0 { Block block = blockBuffer[GetBlockIndex(input.Voxel)]; float3 normal = GetNormal(input.Voxel); uint index = GetAtlasIndex(input.Voxel, block); float3 texcoord = float3(input.Texcoord, index); - float4 texel = atlasTexture.Sample(atlasSampler, texcoord); - float3 albedo = texel.rgb; - float alpha = texel.a; + float4 color = atlasTexture.Sample(atlasSampler, texcoord); + float3 albedo = color.rgb; + float alpha = color.a; float4 position = input.WorldPosition; - float3 pointLight = GetPointLight(lightBuffer, LightCount, position.xyz, normal); + float3 light = GetLight(lightBuffer, LightCount, position.xyz, normal, block); float3 ambient = Ambient.xyz; float sunlight = GetSunlight(Sun.xyz, Sun.w, normal, block); float3 sky = GetSkyColor(input.WorldPosition.xyz - PlayerPosition, SkyTop.xyz, SkyHorizon.xyz); float fog = GetFogValue(distance(position.xz, PlayerPosition.xz)); if (index == kWater) { - float3 groundPosition = positionTexture.Sample(positionSampler, input.Fragment).xyz; - alpha += (input.WorldPosition.y - groundPosition.y) / 10.0f; + float3 seabed = positionTexture.Sample(positionSampler, input.Fragment).xyz; + alpha += (input.WorldPosition.y - seabed.y) / 10.0f; } - float3 litColor = albedo * (pointLight + ambient + sunlight); - return float4(lerp(litColor, sky, fog), alpha); + return float4(lerp(albedo * (light + ambient + sunlight), sky, fog), alpha); } diff --git a/src/block.c b/src/block.c index 3d3595f3..dfe6866d 100644 --- a/src/block.c +++ b/src/block.c @@ -6,13 +6,13 @@ typedef struct BlockData { + Light light; Uint32 is_opaque; Uint32 is_solid; Uint32 is_sprite; - Uint32 is_occluded; + Uint32 use_ao; Uint32 use_sun_normal; float sun_intensity; - Light light; Uint32 indices[DIRECTION_COUNT]; } BlockData; @@ -20,255 +20,255 @@ static const BlockData BLOCKS[BLOCK_COUNT] = { [BLOCK_EMPTY] = { + .light = {0}, .is_opaque = false, .is_solid = false, .is_sprite = false, - .is_occluded = false, + .use_ao = false, .use_sun_normal = false, .sun_intensity = 0.0f, - .light = {0}, .indices = {0}, }, [BLOCK_GRASS] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {2, 2, 2, 2, 1, 3}, }, [BLOCK_DIRT] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {3, 3, 3, 3, 3, 3}, }, [BLOCK_SAND] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {5, 5, 5, 5, 5, 5}, }, [BLOCK_SNOW] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {6, 6, 6, 6, 6, 6}, }, [BLOCK_STONE] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {4, 4, 4, 4, 4, 4}, }, [BLOCK_LOG] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {8, 8, 8, 8, 7, 7}, }, [BLOCK_LEAVES] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {10, 10, 10, 10, 10, 10}, }, [BLOCK_CLOUD] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = false, .sun_intensity = 1.0f, - .light = {0}, .indices = {9, 9, 9, 9, 9, 9}, }, [BLOCK_BUSH] = { + .light = {0}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {15, 15, 15, 15, 15, 15}, }, [BLOCK_BLUEBELL] = { + .light = {0}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {13, 13, 13, 13, 13, 13}, }, [BLOCK_GARDENIA] = { + .light = {0}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {12, 12, 12, 12, 12, 12}, }, [BLOCK_ROSE] = { + .light = {0}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {11, 11, 11, 11, 11, 11}, }, [BLOCK_LAVENDER] = { + .light = {0}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {14, 14, 14, 14, 14, 14}, }, [BLOCK_WATER] = { + .light = {0}, .is_opaque = false, .is_solid = false, .is_sprite = false, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {16, 16, 16, 16, 16, 16}, }, [BLOCK_RED_TORCH] = { + .light = {0, 0, 0, 236, 39, 63, 15}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {236, 39, 63, 15}, .indices = {17, 17, 17, 17, 17, 17}, }, [BLOCK_GREEN_TORCH] = { + .light = {0, 0, 0, 90, 181, 82, 15}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {90, 181, 82, 15}, .indices = {18, 18, 18, 18, 18, 18}, }, [BLOCK_BLUE_TORCH] = { + .light = {0, 0, 0, 51, 136, 222, 15}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {51, 136, 222, 15}, .indices = {19, 19, 19, 19, 19, 19}, }, [BLOCK_YELLOW_TORCH] = { + .light = {0, 0, 0, 243, 168, 51, 15}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {243, 168, 51, 15}, .indices = {20, 20, 20, 20, 20, 20}, }, [BLOCK_CYAN_TORCH] = { + .light = {0, 0, 0, 54, 197, 244, 15}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {54, 197, 244, 15}, .indices = {21, 21, 21, 21, 21, 21}, }, [BLOCK_MAGENTA_TORCH] = { + .light = {0, 0, 0, 250, 110, 121, 15}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {250, 110, 121, 15}, .indices = {22, 22, 22, 22, 22, 22}, }, [BLOCK_WHITE_TORCH] = { + .light = {0, 0, 0, 255, 255, 255, 15}, .is_opaque = true, .is_solid = false, .is_sprite = true, - .is_occluded = false, + .use_ao = false, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {255, 255, 255, 15}, .indices = {23, 23, 23, 23, 23, 23}, }, [BLOCK_PLANKS] = { + .light = {0}, .is_opaque = true, .is_solid = true, .is_sprite = false, - .is_occluded = true, + .use_ao = true, .use_sun_normal = true, .sun_intensity = 0.55f, - .light = {0}, .indices = {24, 24, 24, 24, 24, 24}, }, }; @@ -321,9 +321,9 @@ bool Block_IsSprite(Block block) return BLOCKS[block].is_sprite; } -bool Block_IsOccluded(Block block) +bool Block_UseAO(Block block) { - return BLOCKS[block].is_occluded; + return BLOCKS[block].use_ao; } int Block_GetIndex(Block block, Direction direction) diff --git a/src/block.h b/src/block.h index 599a0f07..e0a2e7e5 100644 --- a/src/block.h +++ b/src/block.h @@ -39,20 +39,20 @@ enum // Block typedef struct Light { + Sint32 x; + Sint32 y; + Sint32 z; Uint8 red; Uint8 green; Uint8 blue; Uint8 radius; - Sint32 x; - Sint32 y; - Sint32 z; } Light; SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device); bool Block_IsOpaque(Block block); bool Block_IsSolid(Block block); bool Block_IsSprite(Block block); -bool Block_IsOccluded(Block block); +bool Block_UseAO(Block block); int Block_GetIndex(Block block, Direction direction); bool Block_IsLight(Block block); Light Block_GetLight(Block block); diff --git a/src/world.c b/src/world.c index e0d7acf3..a6c6b00c 100644 --- a/src/world.c +++ b/src/world.c @@ -321,9 +321,9 @@ static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction directio corner[i] = offset; } SDL_assert(sides == 2); - bool has_side1 = Block_IsOccluded(GetGroupBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); - bool has_side2 = Block_IsOccluded(GetGroupBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); - bool has_corner = Block_IsOccluded(GetGroupBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); + bool has_side1 = Block_UseAO(GetGroupBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); + bool has_side2 = Block_UseAO(GetGroupBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); + bool has_corner = Block_UseAO(GetGroupBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); if (!has_side1 || !has_side2) { return AO_MASK - has_side1 - has_side2 - has_corner; From 2a0f1fa6a452a73a463d0335127399f1abade6e4 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sun, 19 Jul 2026 18:13:12 -0400 Subject: [PATCH 39/39] images --- README.md | 5 ++- doc/image1.png | Bin 0 -> 224970 bytes doc/image2.png | Bin 0 -> 772069 bytes shaders/bin/opaque.frag.msl | 62 +++++++++++++-------------- shaders/bin/opaque.frag.spv | Bin 6856 -> 6840 bytes shaders/bin/transparent.frag.msl | 70 +++++++++++++++---------------- shaders/bin/transparent.frag.spv | Bin 7256 -> 7240 bytes shaders/shader.hlsl | 2 +- 8 files changed, 70 insertions(+), 69 deletions(-) create mode 100644 doc/image1.png create mode 100644 doc/image2.png diff --git a/README.md b/README.md index 695fb8b4..76b996fb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Blocks -![](image.png) +![](doc/image1.png) +![](doc/image2.png) Tiny Minecraft clone in C and HLSL using the new SDL3 GPU API @@ -10,8 +11,8 @@ Tiny Minecraft clone in C and HLSL using the new SDL3 GPU API - Asynchronous chunk loading - Persistent worlds - Physics -- Basic lighting - Blocks and sprites +- Basic lighting - Day and night cycle ### Building diff --git a/doc/image1.png b/doc/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..1c180496eed269835420f4494a40fba388fa008d GIT binary patch literal 224970 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�c(HOg^`#85)ANv4wh=g^4- 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

QQNqPyZV`$$ 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

n8000+i-bemd+qdhICsa3HG+wf`HgB- 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± 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 literal 0 HcmV?d00001 diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index 395aef86..1e5a6b16 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -90,7 +90,7 @@ struct type_UniformBuffer_2 float4 Ambient; }; -constant spvUnsafeArray _91 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _90 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -109,66 +109,66 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) { main0_out out = {}; - uint _106 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _113 = in.in_var_TEXCOORD2 & 7u; - float3 _119 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_106].Indices[_113])); - float4 _123 = atlasTexture.sample(atlasSampler, _119.xy, uint(rint(_119.z))); - if (_123.w < 0.001000000047497451305389404296875) + uint _105 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _112 = in.in_var_TEXCOORD2 & 7u; + float3 _118 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_105].Indices[_112])); + float4 _122 = atlasTexture.sample(atlasSampler, _118.xy, uint(rint(_118.z))); + if (_122.w < 0.001000000047497451305389404296875) { discard_fragment(); } - uint _133 = uint(UniformBuffer.LightCount); + uint _132 = uint(UniformBuffer.LightCount); + float3 _135; + _135 = float3(0.0); float3 _136; - _136 = float3(0.0); - float3 _137; - for (uint _139 = 0u; _139 < _133; _136 = _137, _139++) + for (uint _138 = 0u; _138 < _132; _135 = _136, _138++) { - float _150 = float((lightBuffer._m0[_139].Color & 4278190080u) >> 24u); - float3 _153 = (float3(int3(lightBuffer._m0[_139].Position)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _154 = length(_153); - if (_154 >= _150) + float _149 = float((lightBuffer._m0[_138].Color & 4278190080u) >> 24u); + float3 _152 = (float3(int3(lightBuffer._m0[_138].Position)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _153 = length(_152); + if (_153 >= _149) { - _137 = _136; + _136 = _135; continue; } - float _165; - if (blockBuffer._m0[_106].IsSprite == 0u) + float _164; + if (blockBuffer._m0[_105].IsSprite == 0u) { - _165 = fast::clamp(dot(_91[_113], _153 / float3(_154)), 0.0, 1.0); + _164 = fast::clamp(dot(_90[_112], _152 / float3(_153)), 0.0, 1.0); } else { - _165 = 0.7070000171661376953125; + _164 = 1.0; } - if (_165 <= 0.0) + if (_164 <= 0.0) { - _137 = _136; + _136 = _135; continue; } - _137 = _136 + ((float3(float(lightBuffer._m0[_139].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_139].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_139].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _165) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_154 / _150, 0.0, 1.0)))); + _136 = _135 + ((float3(float(lightBuffer._m0[_138].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_138].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_138].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _164) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_153 / _149, 0.0, 1.0)))); } - float _210; + float _209; do { if (UniformBuffer_2.Sun.w <= 0.0) { - _210 = 0.0; + _209 = 0.0; break; } - float _207; - if (blockBuffer._m0[_106].UseSunNormal != 0u) + float _206; + if (blockBuffer._m0[_105].UseSunNormal != 0u) { - _207 = fast::clamp(-dot(_91[_113], UniformBuffer_2.Sun.xyz), 0.0, 1.0); + _206 = fast::clamp(-dot(_90[_112], UniformBuffer_2.Sun.xyz), 0.0, 1.0); } else { - _207 = 1.0; + _206 = 1.0; } - _210 = (blockBuffer._m0[_106].SunIntensity * UniformBuffer_2.Sun.w) * _207; + _209 = (blockBuffer._m0[_105].SunIntensity * UniformBuffer_2.Sun.w) * _206; break; } while(false); - float3 _213 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_123.xyz * ((_136 + (UniformBuffer_2.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_210)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_213.y, length(_213.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _212 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_122.xyz * ((_135 + (UniformBuffer_2.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_209)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_212.y, length(_212.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 32abbfe677d70a832bc983a4c0141864c5dff2e6..6a250b73f01e909529055159cb664fc270d32e3e 100644 GIT binary patch literal 6840 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 H%fSBtFo~xY literal 6856 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 OsgFW>K95tyLhwHYXRGZ1 diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index fdc274d1..67e29e84 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -90,7 +90,7 @@ struct type_UniformBuffer_2 float4 Ambient; }; -constant spvUnsafeArray _93 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); +constant spvUnsafeArray _92 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0) }); struct main0_out { @@ -108,72 +108,72 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(4)]], texture2d_array atlasTexture [[texture(0)]], texture2d positionTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler positionSampler [[sampler(1)]]) { main0_out out = {}; - uint _110 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - uint _117 = in.in_var_TEXCOORD2 & 7u; - float3 _125 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_110].Indices[_117])); - float4 _129 = atlasTexture.sample(atlasSampler, _125.xy, uint(rint(_125.z))); - float _131 = _129.w; - uint _134 = uint(UniformBuffer.LightCount); + uint _109 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + uint _116 = in.in_var_TEXCOORD2 & 7u; + float3 _124 = float3(in.in_var_TEXCOORD1, float(blockBuffer._m0[_109].Indices[_116])); + float4 _128 = atlasTexture.sample(atlasSampler, _124.xy, uint(rint(_124.z))); + float _130 = _128.w; + uint _133 = uint(UniformBuffer.LightCount); + float3 _136; + _136 = float3(0.0); float3 _137; - _137 = float3(0.0); - float3 _138; - for (uint _140 = 0u; _140 < _134; _137 = _138, _140++) + for (uint _139 = 0u; _139 < _133; _136 = _137, _139++) { - float _151 = float((lightBuffer._m0[_140].Color & 4278190080u) >> 24u); - float3 _154 = (float3(int3(lightBuffer._m0[_140].Position)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _155 = length(_154); - if (_155 >= _151) + float _150 = float((lightBuffer._m0[_139].Color & 4278190080u) >> 24u); + float3 _153 = (float3(int3(lightBuffer._m0[_139].Position)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _154 = length(_153); + if (_154 >= _150) { - _138 = _137; + _137 = _136; continue; } - float _166; - if (blockBuffer._m0[_110].IsSprite == 0u) + float _165; + if (blockBuffer._m0[_109].IsSprite == 0u) { - _166 = fast::clamp(dot(_93[_117], _154 / float3(_155)), 0.0, 1.0); + _165 = fast::clamp(dot(_92[_116], _153 / float3(_154)), 0.0, 1.0); } else { - _166 = 0.7070000171661376953125; + _165 = 1.0; } - if (_166 <= 0.0) + if (_165 <= 0.0) { - _138 = _137; + _137 = _136; continue; } - _138 = _137 + ((float3(float(lightBuffer._m0[_140].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_140].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _166) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_155 / _151, 0.0, 1.0)))); + _137 = _136 + ((float3(float(lightBuffer._m0[_139].Color & 255u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_139].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_139].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125) * _165) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_154 / _150, 0.0, 1.0)))); } - float _211; + float _210; do { if (UniformBuffer_2.Sun.w <= 0.0) { - _211 = 0.0; + _210 = 0.0; break; } - float _208; - if (blockBuffer._m0[_110].UseSunNormal != 0u) + float _207; + if (blockBuffer._m0[_109].UseSunNormal != 0u) { - _208 = fast::clamp(-dot(_93[_117], UniformBuffer_2.Sun.xyz), 0.0, 1.0); + _207 = fast::clamp(-dot(_92[_116], UniformBuffer_2.Sun.xyz), 0.0, 1.0); } else { - _208 = 1.0; + _207 = 1.0; } - _211 = (blockBuffer._m0[_110].SunIntensity * UniformBuffer_2.Sun.w) * _208; + _210 = (blockBuffer._m0[_109].SunIntensity * UniformBuffer_2.Sun.w) * _207; break; } while(false); - float3 _214 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; - float _248; - if (blockBuffer._m0[_110].Indices[_117] == 16u) + float3 _213 = in.in_var_TEXCOORD0.xyz - UniformBuffer_1.PlayerPosition; + float _247; + if (blockBuffer._m0[_109].Indices[_116] == 16u) { - _248 = _131 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); + _247 = _130 + ((in.in_var_TEXCOORD0.y - positionTexture.sample(positionSampler, in.in_var_TEXCOORD3).y) * 0.100000001490116119384765625); } else { - _248 = _131; + _247 = _130; } - out.out_var_SV_Target0 = float4(mix(_129.xyz * ((_137 + UniformBuffer_2.Ambient.xyz) + float3(_211)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_214.y, length(_214.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _248); + out.out_var_SV_Target0 = float4(mix(_128.xyz * ((_136 + UniformBuffer_2.Ambient.xyz) + float3(_210)), mix(UniformBuffer_2.SkyHorizon.xyz, UniformBuffer_2.SkyTop.xyz, float3((precise::atan2(_213.y, length(_213.xz)) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_1.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _247); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 3b3514c978b53bedb15afb07cc6adeec6a734618..336757f5cc04f978ec980c918447526adc4f34bf 100644 GIT binary patch literal 7240 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 Du14b1 diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index fcc670e9..53e230a8 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -114,7 +114,7 @@ float3 GetLight(StructuredBuffer lights, uint count, float3 position, flo { continue; } - float angle = 0.707f; + float angle = 1.0f; if (!block.IsSprite) { angle = saturate(dot(normal, offset / distance));

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�YEtRuIqTBq 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

TR?gIqb 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 W6oa4k8kwV^{!|n-pr!KWLH`Hu18bB3 literal 0 HcmV?d00001 diff --git a/image.png b/image.png deleted file mode 100644 index 71fe42c16253f01bf809ef7bdf8cb1f2c6260cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 792281 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

4P48JJ_c~hO-+O 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 OS7&=+|Dzu7F8V)$<2G~v literal 10144 zcmaKw37l6|703T9!y-E>h$sxA0)nF;AOiw3>?i^p15ZA{l5P__?!=RnZr5fcg{WM+;i`{@6B}UI=W|} z(4|l)^eZNK_aIs*iFv{%KncP{F@m$eWk8l(rO`+7Ll{7J9?mx3@M_O{%YI+)~`w zP*p6IircaEAY-9WY;P*It!%isy`$7np3{SR)10>Ame!_*Qs8~VzwWhozwnP7=*I64 zZ`)L?Z`t;00`UR+@mB+h4+L**X=`k6Y-x@e;)8N{%&1^xgTb@4)wP#8*1LlGIUO4| zG?c35G_|bXOby)&2jf%L>|u{g2P!OXt7|Pawr6YZL7((<`xX`3maSjk)X_!_`o$c3 zj;$_RPKKA~xJQfI7IZWw9*1RUCTkBfLT86@#%&@O-Vy&N zo;JtwrsDR7((-hI%Jm%yexUkBfFHQN?ged*x{l^-FV*dB-RA8pTUyI!Ld^bxEovz> z?(np@@8b5kcFVfP2AX7#Mxr062K^eFtF{(PRV(MOp1W+>ih0?+VE;Tjooo|GCM&81*`~ zh3P)>xnD?3*B8B1cTLetb=MJnRJZo%pStzt=X+lr1zD?hb!%~`dq3sv>Uq0$e{;|yXQ1-SJxi-w7EytvxwdE&UB0}v;CO)#PWXT5c3@sbB!zJ zJ_Y6+F?;Kpl+8I7(#JdBA?{d&Phj3roV(!j`1hZW%c7A=Scd-yz$7)yD$7EpoO2dz>i0EUf2S!0@JTEenP@xPWZc4ePd44 zkzLA#!t6t--%Gd>a%fl2F5jF!8QDIEeG0Pc4Sgzd&zycTvga-A(~#XC^Hswup@^qG z9dhWeJ_B+OLq7#M?>`egpMMs*&wcpMMmGN;M5%#~!&_bpMQ`RHM<2^QDzAMmIOCP5 zeIANuJ@ok+bNT{gfv_(`?Ul1H(vE|6&&guwk%u3i75b^@&%8W2J4>e_>*LxdaK6=- zK<<|m*y+gbwG?rdBCl9{W3{?HTn4?u2>Wt$I$xvi9-jgEE;<5z1>AEhHjMAP-f-)% z=hh;31g~UHT^Y)J567zyy7IiiL|O+Q1+pHltWQ1MXWH6^W2=OFF0?hk&0n4L4M~su8F$-i?*f_Mz4DxdegSet zPS@^T7WN{t`(h0H)s*xV@CkHLz6Cli(+h>;;l4L~NBBOF=PB-oX7I-bJT$wC$nIkc z6t-66>OD`+4E-YX-7nm{{|+nZKX~_yu(zRe$L;rTM=um=X2;#zfi@8mm&d%V$h&s# zoZ-5*A-m={GZ!PU)$IqkffZJnx)C;n2vsj<9J(`KlwO#_* zPj#P}OCjT`o97LXdlL4`klm99K(${E=`#g-Fkw59#b-gaWVZfYkY{T;v=cfBiX2xU zYY*Su$a&w%Io~UhwMYJ|kj-zr$p1!U@u|=q)Kmk16J#F!Zes=2@T(#5*^qTzn%4Yg zWNkasdftL;Oz~Q0HqV&7YkOYp9059}*PUTv9a3TDo&``*_jbZIW;2(puxn}dDQP3SoV(yRfJt@wYk&Q71^4x@v+_O;wzXz&?+*kdbZ;r3P9p=#IUP#Ow%EsH9 zbn)ofeaO}xbah(){a~(9`*mQh|ErL9#QjiTo*%IXAbT<%(r)czp;*(`ko6I_&acBA z)~W3qkeGEU=j#-=9`k$?iXKPq2f-q@_Q)OfZzcQ0oXt7zu`wTltX01_tKUYx6`Bvl zS^W;OxX)yq)rXPAuS&5VK^EHzMXc{48*2d+vA%~az7UF7-$xdYSU*4(%g6d5y0I2P z5$i|D;?tmr^F=NG^{}kDJ&7*w}Yw$Vw8Klkq3hd_zw^#8z{Q}whOIv=w z_M-3OhBlUWnm(RAxqIt8_cY#1HzVH!O@@r){pdNk1s?eyMRxvJ$oqE#{4r=GG&7^} zcfcz!`n*Iri$Mg9wWcx85(q`@Mb3UfAz5AU1Z^$|3ITbR0tp6Eg?XmuS$PVk)_ADf3 zoyz(3i^u!^Ipj+qM_|t*i&<-6FC@$}wVe9g`xhbS>#yClT+4aV_7bGsGZZoYlkjfv zcs5@~77vPZ^xx!b97mj^xUXLU)5rPCsOL1ePU0=f4CnY%o_tw0tJ-A9=hl`y$s8%RScL`H{09vUYR!hdazEJ^&Ikr*hOj5ZQHFyJskT z^)f?P{1>(Jl%k#i`r zc5@yEcbHRr7$jy+<=D5wkv%(}?^yeAF!5M>%#%kQM=kZXx=ZTcJ2yrba`^XhXnBxYXacyAtqycj?4 z)WD7f6Zf9U-yhE3$eG*>J_gx$i|+*2FbO^uOxzLJxP%GEyZbm4eM29Qtlx6t_>4_J z)<@juUhH_}(~~Wp&nhr`W1Ug^31G*fYx8;cK0Oh6DO{WDnFzNJa{H*yBxLv7HJ$`b zPPS^WDagx`ZECXJMeG`|lhL)Gg6!`p(~=!E>%I1BNZg#t)-XNk@~FYQ)}hY~=oCns zHOxe|25qyFEozvJu03j~N%p8gyRpQrK{^Dfren_*f{D8){vJDuc#DudOOHcq)A#mbFmdBL$LG`ii9NMH_Des% zv+R+5i9Y0e?7G$6Q`aw#IqqldU;b>kUvZ{RMRs3W$r0FT=$)UNC1B$D^LRSCxG{|X z6fvwpzK`GPJ$p;BxwfYvx$kYC!J{GPTT8qjmm&L(mK>-=^A4!U{${xx;7IiNRvU+W z2AH^epuPgxIO5LR09J=Q67CuDJJ5IeN-*)reI~M)@f8us-p?)+P*SKX!J)oEvBL958*g#qYA`BJ-2|E~~w7dfv}V_%Lkd)GyA~ z`N-OvvBiF0fG&PfmaqJGnuYJ=uzE{>G=l9SxgsmQ%`yx5C zMa>Oh!gC>G=o|HIK-ON$`ENw$C;L0T_T@R-reyO@(a(F-J@X!KMBf9yowHE`zYtw) z8nW+}&BzYlE!vtOG0(NKar$B3f;&ZR%G$Z@N;-Rx4|z0 z^ZPN*r_W6ZOgzp>8?y8H+5ZjKj-sEo=v4=@cpHAP=UdTlK-cDT8takA{k$#t`0VQM zTAlBnUyS@H+~3FI8+SXH&vsDw?f}zYyEQrg66EXQ+G75t$nH~6oUb>4@sph|=Xu`r sjXqq4tdAqG%M&IX*v^ENpP}-%{Vp))>#yB4`}gRc%+vNVnWsVj0~Y1#vj6}9 diff --git a/shaders/bin/transparent.vert.msl b/shaders/bin/transparent.vert.msl index 53969994..7a70c203 100644 --- a/shaders/bin/transparent.vert.msl +++ b/shaders/bin/transparent.vert.msl @@ -18,7 +18,7 @@ struct type_UniformBuffer_2 int2 ChunkPosition; }; -constant float4 _48 = {}; +constant float4 _274 = {}; struct main0_out { @@ -37,18 +37,18 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _70 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _71 = float4(_70.x, _70.y, _70.z, _48.w); - float4 _78 = UniformBuffer_1.View * float4(_70, 1.0); - _71.w = _78.z; - float4 _83 = UniformBuffer.Proj * _78; - float2 _96 = ((_83.xy / float2(_83.w)) * 0.5) + float2(0.5); - _96.y = 1.0 - _96.y; - out.gl_Position = _83; - out.out_var_TEXCOORD0 = _71; + float3 _385 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _387 = float4(_385.x, _385.y, _385.z, _274.w); + float4 _403 = UniformBuffer_1.View * float4(_385, 1.0); + _387.w = _403.z; + float4 _417 = UniformBuffer.Proj * _403; + float2 _453 = ((_417.xy / float2(_417.w)) * 0.5) + float2(0.5); + _453.y = 1.0 - _453.y; + out.gl_Position = _417; + out.out_var_TEXCOORD0 = _387; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _96; + out.out_var_TEXCOORD3 = _453; return out; } diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index a6dd8538e8873a3697106e85a8f5612e0f688205..b7c9225e1bac6c3db1f2923d507b4281618dab61 100644 GIT binary patch literal 20780 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 literal 2668 zcmZ{kS5uQw5Qe`{>$z2{j@Kt%ot+vVADi%ed&7n~t4!2ixVOX3WuJDm5oaF! z|KezK-L8(kb2p9^&lG0?{LFD?XWCr-&!=iHEA=VVyH)qcq0+R9CF%MBHQ00*hwwQ zi-9Y2>&&tby{oWyAbG|fhJ7hAt9J$VWe7zzmUi{!z@BMe!Cp+dcJ-CO75XY<&zrB4 z-F()%i=L{l2IdrzV-2!*4t*{1#+<$m*?Wb3J@T)d?z=E=*!9&X^dho8)>LA*CVSn< zZx_2<^F21_Cs%~A=hp5_H_$a}4BMt;lQZsScKhLZ&pIPH<7`R1ocdPw0%-QTE!&3d zOiDoe_N3b{^&Ls~{4z4^WG~^di(T3LyV=ce9DRD&t))4$wro$*t^Wje@8&n-8FlaD zHxjxv`%Q#y&B_Jf`KZ}^q1(gIy@TI$=-$C^I&|%R1L_5SOYHuU9mdN$naAZFe~{V# zs#D~(2mUu%OCJ%v=K)}?zD40V?|l$xtD`&fLx~H&!|37X`w71z$lAj1D6(9Ie11d6 zfU$g&+G@nN|Hpy0Z`{E;PXKH6eSc5f$;A7{U#GfGAsf=Ye5rp3`vV7j}F1mb$dv>zl1ICgs(-*n>z}keX0HOyEkmbE=#CV7-FFvQZ zkC2U{?MvbwBg-!Zz72DY0QuD*a*QI60P}w0oO6BxoR2npukTYJKLR{^nyOmatxwr^ Z<$RQVU*1*OcV@4Y{Vy@jPa+%zzX5T-ue<;N diff --git a/shaders/bin/ui.comp.msl b/shaders/bin/ui.comp.msl index a7601676..d71546e1 100644 --- a/shaders/bin/ui.comp.msl +++ b/shaders/bin/ui.comp.msl @@ -22,143 +22,143 @@ kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], cons { do { - uint2 _59 = uint2(colorTexture.get_width(), colorTexture.get_height()); - bool _71; - if (!(gl_GlobalInvocationID.x >= _59.x)) + uint2 _258 = uint2(colorTexture.get_width(), colorTexture.get_height()); + bool _286; + if (!(gl_GlobalInvocationID.x >= _258.x)) { - _71 = gl_GlobalInvocationID.y >= _59.y; + _286 = gl_GlobalInvocationID.y >= _258.y; } else { - _71 = true; + _286 = true; } - if (_71) + if (_286) { break; } - float2 _76 = float2(UniformBuffer.Viewport); - float2 _77 = _76 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); - float _80 = precise::max(_77.x, _77.y); - float _81 = 50.0 * _80; - float _82 = 10.0 * _80; - float2 _85 = float2(_82) + float2(_81); - float _86 = float(gl_GlobalInvocationID.x); - float _93 = float(uint(UniformBuffer.Viewport.y) - gl_GlobalInvocationID.y); - bool _99; - if (_86 > _82) + float2 _297 = float2(UniformBuffer.Viewport); + float2 _299 = _297 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); + float _307 = precise::max(_299.x, _299.y); + float _311 = 50.0 * _307; + float _315 = 10.0 * _307; + float2 _323 = float2(_315) + float2(_311); + float _327 = float(gl_GlobalInvocationID.x); + float _341 = float(uint(UniformBuffer.Viewport.y) - gl_GlobalInvocationID.y); + bool _357; + if (_327 > _315) { - _99 = _86 < _85.x; + _357 = _327 < _323.x; } else { - _99 = false; + _357 = false; } - bool _103; - if (_99) + bool _365; + if (_357) { - _103 = _93 > _82; + _365 = _341 > _315; } else { - _103 = false; + _365 = false; } - bool _108; - if (_103) + bool _375; + if (_365) { - _108 = _93 < _85.y; + _375 = _341 < _323.y; } else { - _108 = false; + _375 = false; } - if (_108) + if (_375) { - float3 _121 = float3((_86 - _82) / _81, 1.0 - ((_93 - _82) / _81), float(UniformBuffer_1.Index)); - float4 _123 = atlasTexture.sample(atlasSampler, _121.xy, uint(rint(_121.z)), level(0.0)); - float _124 = _123.w; - if (_124 > 0.001000000047497451305389404296875) + float3 _405 = float3((_327 - _315) / _311, 1.0 - ((_341 - _315) / _311), float(UniformBuffer_1.Index)); + float4 _409 = atlasTexture.sample(atlasSampler, _405.xy, uint(rint(_405.z)), level(0.0)); + float _413 = _409.w; + if (_413 > 0.001000000047497451305389404296875) { spvImageFence(colorTexture); - float4 _130 = colorTexture.read(uint2(gl_GlobalInvocationID.xy)); - float _131 = fast::clamp(_124, 0.0, 1.0); - float _136 = 1.0 - _131; - colorTexture.write(float4((_123.xyz * _131) + (_130.xyz * _136), _131 + (_130.w * _136)), uint2(gl_GlobalInvocationID.xy)); + float4 _425 = colorTexture.read(uint2(gl_GlobalInvocationID.xy)); + float _429 = fast::clamp(_413, 0.0, 1.0); + float _443 = 1.0 - _429; + colorTexture.write(float4((_409.xyz * _429) + (_425.xyz * _443), _429 + (_425.w * _443)), uint2(gl_GlobalInvocationID.xy)); break; } } - float _146 = 8.0 * _80; - float _147 = 2.0 * _80; - float2 _148 = _76 * 0.5; - float2 _149 = float2(_146, _147); - float2 _150 = _148 - _149; - float2 _151 = _148 + _149; - float2 _152 = float2(_147, _146); - float2 _153 = _148 - _152; - float2 _154 = _148 + _152; - bool _161; - if (_86 > _150.x) + float _470 = 8.0 * _307; + float _474 = 2.0 * _307; + float2 _478 = _297 * 0.5; + float2 _482 = float2(_470, _474); + float2 _484 = _478 - _482; + float2 _488 = _478 + _482; + float2 _492 = float2(_474, _470); + float2 _494 = _478 - _492; + float2 _498 = _478 + _492; + bool _514; + if (_327 > _484.x) { - _161 = _93 > _150.y; + _514 = _341 > _484.y; } else { - _161 = false; + _514 = false; } - bool _166; - if (_161) + bool _524; + if (_514) { - _166 = _86 < _151.x; + _524 = _327 < _488.x; } else { - _166 = false; + _524 = false; } - bool _171; - if (_166) + bool _534; + if (_524) { - _171 = _93 < _151.y; + _534 = _341 < _488.y; } else { - _171 = false; + _534 = false; } - bool _192; - if (!_171) + bool _576; + if (!_534) { - bool _181; - if (_86 > _153.x) + bool _554; + if (_327 > _494.x) { - _181 = _93 > _153.y; + _554 = _341 > _494.y; } else { - _181 = false; + _554 = false; } - bool _186; - if (_181) + bool _564; + if (_554) { - _186 = _86 < _154.x; + _564 = _327 < _498.x; } else { - _186 = false; + _564 = false; } - bool _191; - if (_186) + bool _574; + if (_564) { - _191 = _93 < _154.y; + _574 = _341 < _498.y; } else { - _191 = false; + _574 = false; } - _192 = _191; + _576 = _574; } else { - _192 = true; + _576 = true; } - if (_192) + if (_576) { colorTexture.write(float4(1.0), uint2(gl_GlobalInvocationID.xy)); break; diff --git a/shaders/bin/ui.comp.spv b/shaders/bin/ui.comp.spv index fa4614ecfbac71ae8d2e608afa7247957e8b9fd5..99d08fa5e45b4400aa858a96f10e08b4066e7abd 100644 GIT binary patch literal 19816 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 literal 4728 zcmZ9OXLnUq5QYyS5Rl%bCt#xmM4CZ_U)KkH+dEsA?`UqeOJDxe=UU&=w6mkVvs>L-1CXbL z!&hVj;q%_7INhB-*UGlWrd>$u3__j~3SWNG`C4}{ae3Y18KlF@vN~ctf9IJ1v_0=B zz!i2?(adent<i3-Vdw=F@m-_9czbyH+Oa1Pt)UU1IdMlVN&U7latBxJWSxkB0|7c=|AS=NPW>X&u+K2C}8HMfps|5DauRR>NMp9t}avC+1BSFNBLN{j&Iir!* zwO{lYgU)oz!#+K?D{H5xT4S-pH!k<}EDd{nZvXH1o>;ZvpIEe)g*~ZgFLjp5=+5Hr zW+v}IyAs%=6l1w1V~lkl&aQNYtR$kUNaeBPi1N23KPBF{9zgE{T8|M>}+&v$XWNC?TJzRAlI-%c&>w?1+E$s!Av@reJpRf+S=2Qt5L z4M1CIjxpBNw;K4Z(-+)T=zj0y8dCo?=<*`Cwdm%HJt=M-y0Q8?*o!^Z1Mjnzug`4c z)gbmCcQXubL-O50p6}wC#KnDHi+$>SUI!j2oEY!(2H;HY#e2LF z>GB@+Z31%Mn|hpg0p0z%j-^_g(XFM=`;I(iyq_)TV}WnL_)WmRjYyY$jcEdM_EnF0 zo6+5a^V%a~l+j}=x;^Y`y!rOnhIHA(m=+*s5B1pFP3Z2;cM^NM8Qs46>>GK?=(`== zzRqI2HSODqblKOKHXvtT^?jV5Z=)T=T^vYUN8)`~5qArEoI%8O!pR%w@4Fn?1^Ohr zFR~j{fT*(r-G4{T^-WYjy+Yw4T28)EbPu4LE~+ zH_&-9@^&C^P8k>v;@s~**WVk&ecy>LKNNVDcOhM#rM|m?oM)-NiaxWDJz!x1BEL)b z(+_$C!54yR|yNVpoVn1*X!ezeuJjj{o zzZV!|?Z~+g-8#Y*IdM-1;OuKo)VUwsJbiv|to;D6zP|W=J&5j{5$C=h0@l(OdwCe$ zd{=M>(dC>cxJMG_o*L4fK8kL>@%pVFXZ;wuXT60P)q8;PuF`)KyhH6)q<5)|Jv@#+ z0W_3wPoPgsoM$o`{Yg*{CgpsQdkWor<2_H~o(9J1i*NNaC0u;dpM^8e{K$PS#p#RO z=S#Rarx)Pte2-p5 z_j}}79s<_1?`uexeT{h?$k|st`o4kgxwzsx_$Io0&}ZMsQ%2vn(CzCi##__AZzEmy zHRdpov#)yeeFxpX?l=0ri|&5)**Ef((f2)c`#Ov9){OsWdLLcCb9{hwIfwiaAm<$F zF~^7K-nT2x{Udbuug_W^BVE?g_X&`*mU`6s6x~{-cla5$d(!8gB2O86`W)RoIhXO) zwC_=*%f7~Z0p#qf9(|9Y`#xQ9mS3W~2YvR9JZ1Dfj&5IPG2WW?{R-)_uQ6W(Is2+d z-*3?ETY87zV!K~`_KiGc^!*OqzRqI2HI0q?QAX?u^pU_fV4iiH@q47p8BZX80CLW# o9{)!Ch`ulZk atlasTexture : register(t0, space2); -SamplerState atlasSampler : register(s0, space2); -StructuredBuffer blockBuffer : register(t1, space2); - -struct Input +void main() { - float2 Texcoord : TEXCOORD0; - nointerpolation uint Voxel : TEXCOORD1; -}; - -void main(Input input) -{ - Block block = blockBuffer[GetBlock(input.Voxel)]; - float3 texcoord = float3(input.Texcoord, GetIndex(input.Voxel, block)); - if (atlasTexture.Sample(atlasSampler, texcoord).a < kEpsilon) - { - discard; - } } diff --git a/shaders/shadow.vert b/shaders/shadow.vert index 805e68b2..ba270d9d 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -25,8 +25,6 @@ struct Input struct Output { float4 Position : SV_Position; - float2 Texcoord : TEXCOORD0; - nointerpolation uint Voxel : TEXCOORD1; float ClipDistance : SV_ClipDistance0; }; @@ -37,8 +35,6 @@ Output main(Input input) float3 position = GetPosition(input.Voxel) + chunkPosition; Block block = blockBuffer[GetBlock(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); - output.Texcoord = GetTexcoord(input.Voxel); - output.Voxel = input.Voxel; output.ClipDistance = block.HasShadow ? 1.0f : -1.0f; return output; } diff --git a/src/main.c b/src/main.c index 5c7509ff..fc6f6935 100644 --- a/src/main.c +++ b/src/main.c @@ -637,11 +637,6 @@ static void render_shadow(SDL_GPUCommandBuffer* cbuf) SDL_BindGPUGraphicsPipeline(pass, shadow_pipeline); SDL_GPUBuffer* block_buffer = block_get_buffer(); SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); - SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); - SDL_GPUTextureSamplerBinding atlas_binding = {0}; - atlas_binding.texture = atlas_texture; - atlas_binding.sampler = nearest_sampler; - SDL_BindGPUFragmentSamplers(pass, 0, &atlas_binding, 1); SDL_PushGPUDebugGroup(cbuf, "shadow"); world_render(&shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); SDL_PopGPUDebugGroup(cbuf); From 73d60dbbf23c1d04deb1c6aa9a3efd54f5d0a7eb Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Fri, 17 Jul 2026 23:17:15 -0400 Subject: [PATCH 09/39] v 1024 --- shaders/bin/depth.vert.spv | Bin 17404 -> 17396 bytes shaders/bin/opaque.frag.spv | Bin 53796 -> 53788 bytes shaders/bin/opaque.vert.spv | Bin 20956 -> 20948 bytes shaders/bin/raycast.vert.spv | Bin 14500 -> 14492 bytes shaders/bin/shadow.vert.spv | Bin 21232 -> 21220 bytes shaders/bin/sky.frag.spv | Bin 17348 -> 17340 bytes shaders/bin/sky.vert.spv | Bin 14680 -> 14672 bytes shaders/bin/transparent.frag.spv | Bin 53968 -> 53960 bytes shaders/bin/transparent.vert.spv | Bin 20780 -> 20772 bytes src/main.c | 2 +- 10 files changed, 1 insertion(+), 1 deletion(-) diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index 5078dec86f224ea50a08a95e0a76cdde79617c9d..a164d19a185778c15dd77ee554ca8138849ff339 100644 GIT binary patch delta 41 zcmV+^0M`HfhXM450kEb70h6<*1jz;h3VV}u3o!!z~3o8$^_!CB43l|Tw H?ivOuz!wmf diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index d9fd1751e7f6de48e86cbe84a3348a4328d3bf9a..5d933afa73ac21b17f423248b7b0d86e20f861fb 100644 GIT binary patch delta 40 ycmV+@0N4MdqywC!1F+Hr0h6=S1jz;h3VV~F3o!!!h3o8$!BpbIrL=LC` delta 63 zcmV-F0Kos8qywa+1F+Hr0hP1U1jz=I91ReYPYVi@vT0kF0N0h6=01jz;h3VV};3o!!!F3o8$^2piNkQV9;t delta 48 zcmV-00MGx_qXFEb0kF0N0hP121jz=IBMTanmz`3o8$k^cv0q*OS8= SS(6&*& diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index daef416bba05ca9b70467499425aa3d9a79e095a..babdb123c5bbcd88491bf72f6a9ade00f1cfc458 100644 GIT binary patch delta 41 zcmV+^0M`G+hXK5Y0kFCR0h6=41jz;h3VV}?3o!!!J3o8$^3>&y8L#GZ? delta 49 zcmdnf&UmDqal=xMlb^GfD5# F0066N50?M{ diff --git a/shaders/bin/sky.vert.spv b/shaders/bin/sky.vert.spv index 78ad4da110b0b33806e5d4465469f9619e763f47..15ff6541ae5fa09dad22bd926bb4bd2ca181f5a1 100644 GIT binary patch delta 39 xcmV+?0NDT7a?o-UO4s-wj delta 47 zcmV+~0MP%?a@caPrUU_%v!?{f29pyD8k2|%8wL#ueGLi?lcozFlkf}`v)Kz553}wX FVjicQ5OV+k diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index e9a48a68461f5c501316beeb692725851592adc4..39aca22f611d35ea28ae543cf6874b197cdf7a4a 100644 GIT binary patch delta 41 zcmV+^0M`G|r31*N1F+Hr0h6=S1jz;h3VV~F3o!!!h3o8$^Bpa-^TfPsz delta 63 zcmV-F0Kosqr328V1F+Hr0hP1U1jz=I91ReYPYVi@v!J3o8$^3>zReLp%-7 delta 49 zcmZ3oh;hv##tpkz7^iOD&2o}$vO2fa2ZY`k2xyj;AKcX7)Dg# Date: Fri, 17 Jul 2026 23:45:05 -0400 Subject: [PATCH 10/39] shadows --- shaders/bin/depth.vert.spv | Bin 17396 -> 17504 bytes shaders/bin/opaque.frag.msl | 194 +++++++++++++++---------------- shaders/bin/opaque.frag.spv | Bin 53788 -> 54332 bytes shaders/bin/opaque.vert.spv | Bin 20948 -> 21056 bytes shaders/bin/raycast.vert.spv | Bin 14492 -> 14600 bytes shaders/bin/shadow.vert.spv | Bin 21220 -> 21328 bytes shaders/bin/sky.frag.spv | Bin 17340 -> 17448 bytes shaders/bin/sky.vert.spv | Bin 14672 -> 14780 bytes shaders/bin/transparent.frag.msl | 192 +++++++++++++++--------------- shaders/bin/transparent.frag.spv | Bin 53960 -> 54504 bytes shaders/bin/transparent.vert.spv | Bin 20772 -> 20880 bytes shaders/shader.hlsl | 2 + src/block.c | 10 -- src/block.h | 1 - src/main.c | 9 +- src/sky.c | 2 +- textures/atlas.png | Bin 713 -> 688 bytes textures/atlas.xcf | Bin 13077 -> 12859 bytes 18 files changed, 204 insertions(+), 206 deletions(-) diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index a164d19a185778c15dd77ee554ca8138849ff339..5350de3d9bad4edf4f0b6424d97199e4cc6fc7a2 100644 GIT binary patch delta 226 zcmey;&iJ5%al+m{wQuD%cTGWX*v0cB?@Jk#hFQ&IhiGu3bqOcdIo9M zlU*c~CZ|g%v4K@pPo5}ISPy2_f=MI|`nC#|ARS1?6=x)-tzPvv>+m-X+dG`IoqsJTI355TxbgCzdFbWfo^9W#(j-R4Uji z80Z _665 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _672 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -115,176 +115,176 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _747 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _775 = spvUnsafeArray({ blockBuffer._m0[_747].Indices[0], blockBuffer._m0[_747].Indices[1], blockBuffer._m0[_747].Indices[2], blockBuffer._m0[_747].Indices[3], blockBuffer._m0[_747].Indices[4], blockBuffer._m0[_747].Indices[5] }); - spvUnsafeArray _676 = _775; - bool _808 = blockBuffer._m0[_747].IsSprite != 0u; - uint _822; - if (_808) + uint _754 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_754].Indices[0], blockBuffer._m0[_754].Indices[1], blockBuffer._m0[_754].Indices[2], blockBuffer._m0[_754].Indices[3], blockBuffer._m0[_754].Indices[4], blockBuffer._m0[_754].Indices[5] }); + spvUnsafeArray _683 = _782; + bool _815 = blockBuffer._m0[_754].IsSprite != 0u; + uint _829; + if (_815) { - _822 = 0u; + _829 = 0u; } else { - _822 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + _829 = (in.in_var_TEXCOORD2 >> 0u) & 7u; } - float3 _836 = float3(in.in_var_TEXCOORD1, float(_676[_822])); - float4 _846 = atlasTexture.sample(atlasSampler, _836.xy, uint(rint(_836.z))); - if (_846.w < 0.001000000047497451305389404296875) + float3 _843 = float3(in.in_var_TEXCOORD1, float(_683[_829])); + float4 _853 = atlasTexture.sample(atlasSampler, _843.xy, uint(rint(_843.z))); + if (_853.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _861 = _846.xyz; - uint _898 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_808 ? 6 : 0); - uint _914 = uint(UniformBuffer.LightCount); - float3 _931; - float3 _934; - _931 = _674; - _934 = float3(0.0); - float3 _932; - float3 _935; - for (uint _936 = 0u; _936 < _914; _931 = _932, _934 = _935, _936++) + float3 _868 = _853.xyz; + uint _905 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_815 ? 6 : 0); + uint _921 = uint(UniformBuffer.LightCount); + float3 _938; + float3 _941; + _938 = _681; + _941 = float3(0.0); + float3 _939; + float3 _942; + for (uint _943 = 0u; _943 < _921; _938 = _939, _941 = _942, _943++) { - float _972 = float((lightBuffer._m0[_936].Color & 4278190080u) >> 24u); - float3 _990 = (float3(float(lightBuffer._m0[_936].X), float(lightBuffer._m0[_936].Y), float(lightBuffer._m0[_936].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _994 = length(_990); - bool _1008; - if (!(_994 >= _972)) + float _979 = float((lightBuffer._m0[_943].Color & 4278190080u) >> 24u); + float3 _997 = (float3(float(lightBuffer._m0[_943].X), float(lightBuffer._m0[_943].Y), float(lightBuffer._m0[_943].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _1001 = length(_997); + bool _1015; + if (!(_1001 >= _979)) { - _1008 = _972 <= 0.0; + _1015 = _979 <= 0.0; } else { - _1008 = true; + _1015 = true; } - if (_1008) + if (_1015) { - _932 = _931; - _935 = _934; + _939 = _938; + _942 = _941; continue; } - float _1023 = fast::clamp(dot(_665[_898], _990 / float3(_994)), 0.0, 1.0); - if (_1023 <= 0.0) + float _1030 = fast::clamp(dot(_672[_905], _997 / float3(_1001)), 0.0, 1.0); + if (_1030 <= 0.0) { - _932 = _931; - _935 = _934; + _939 = _938; + _942 = _941; continue; } - float3 _1069 = float3(float((lightBuffer._m0[_936].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_936].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_936].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _932 = _1069; - _935 = _934 + ((_1069 * _1023) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_994 / _972, 0.0, 1.0)))); + float3 _1076 = float3(float((lightBuffer._m0[_943].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_943].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_943].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _939 = _1076; + _942 = _941 + ((_1076 * _1030) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_1001 / _979, 0.0, 1.0)))); } - float _1404; + float _1419; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1404 = 0.0; + _1419 = 0.0; break; } - float _1184; - if (blockBuffer._m0[_747].HasOcclusion != 0u) + float _1191; + if (blockBuffer._m0[_754].HasOcclusion != 0u) { - _1184 = fast::clamp(-dot(_665[_898], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1191 = fast::clamp(-dot(_672[_905], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1184 = 0.7070000171661376953125; + _1191 = 0.7070000171661376953125; } - if (_1184 <= 0.0) + if (_1191 <= 0.0) { - _1404 = 0.0; + _1419 = 0.0; break; } - float4 _1203 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1213 = _1203.xyz / float3(_1203.w); - float2 _1223 = (_1213.xy * 0.5) + float2(0.5); - float _1229 = 1.0 - _1223.y; - float2 _1231 = _1223; - _1231.y = _1229; - float _1235 = _1223.x; - bool _1247; - if (!(_1235 < 0.0)) + float4 _1210 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1220 = _1210.xyz / float3(_1210.w); + float2 _1230 = (_1220.xy * 0.5) + float2(0.5); + float _1236 = 1.0 - _1230.y; + float2 _1238 = _1230; + _1238.y = _1236; + float _1242 = _1230.x; + bool _1254; + if (!(_1242 < 0.0)) { - _1247 = _1235 > 1.0; + _1254 = _1242 > 1.0; } else { - _1247 = true; + _1254 = true; } - bool _1257; - if (!_1247) + bool _1264; + if (!_1254) { - _1257 = _1229 < 0.0; + _1264 = _1236 < 0.0; } else { - _1257 = true; + _1264 = true; } - bool _1267; - if (!_1257) + bool _1274; + if (!_1264) { - _1267 = _1229 > 1.0; + _1274 = _1236 > 1.0; } else { - _1267 = true; + _1274 = true; } - bool _1279; - if (!_1267) + bool _1286; + if (!_1274) { - _1279 = _1213.z < 0.0; + _1286 = _1220.z < 0.0; } else { - _1279 = true; + _1286 = true; } - bool _1291; - if (!_1279) + bool _1298; + if (!_1286) { - _1291 = _1213.z > 1.0; + _1298 = _1220.z > 1.0; } else { - _1291 = true; + _1298 = true; } - if (_1291) + if (_1298) { - _1404 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1184; + _1419 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1191; break; } - uint2 _1302 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1318 = float2(1.0) / float2(float(_1302.x), float(_1302.y)); - float _1326 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1184)); - float _1335; - int _1338; - _1335 = 0.0; - _1338 = -1; - float _1336; - for (; _1338 <= 1; _1335 = _1336, _1338++) + uint2 _1309 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1325 = float2(1.0) / float2(float(_1309.x), float(_1309.y)); + float _1333 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1191)); + float _1342; + int _1345; + _1342 = 0.0; + _1345 = -1; + float _1343; + for (; _1345 <= 1; _1342 = _1343, _1345++) { - _1336 = _1335; - for (int _1354 = -1; _1354 <= 1; ) + _1343 = _1342; + for (int _1361 = -1; _1361 <= 1; ) { - _1336 += shadowTexture.sample_compare(shadowSampler, (_1231 + (float2(float(_1338), float(_1354)) * _1318)), _1213.z - _1326, level(0.0)); - _1354++; + _1343 += shadowTexture.sample_compare(shadowSampler, (_1238 + (float2(float(_1345), float(_1361)) * _1325)), _1220.z - _1333, level(0.0)); + _1361++; continue; } } - _1404 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1184) * (_1335 * 0.111111111938953399658203125); + _1419 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1191) * mix(1.0, _1342 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1430; - if (blockBuffer._m0[_747].IsFullbright != 0u) + float3 _1445; + if (blockBuffer._m0[_754].IsFullbright != 0u) { - _1430 = _861; + _1445 = _868; } else { - _1430 = _861 * (((_934 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1404)); + _1445 = _868 * (((_941 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1419)); } - float3 _1437 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_1430, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1437.y, length(float2(_1437.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _1452 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_1445, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1452.y, length(float2(_1452.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 5d933afa73ac21b17f423248b7b0d86e20f861fb..d038133c85ef35a91f3e944269119b1eaaa59ffe 100644 GIT binary patch literal 54332 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 TCA>RRUpEN{{a2CPMf86FRS7`Q literal 53788 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 diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index e4fd871ae16c88ee65f938d0bbcb197f005aaeda..047bb5df1a21fa510d0f0851ea25bed402572f63 100644 GIT binary patch delta 226 zcmcbznDM|8#tqw87}ssy&f+ONnNh+-mP-K$(sJ?>OBBj7i!+llb23XR6>Jp@^bFFh zCx=KVO)i&EVgswHp1e?^upZ2;1(Qe`^lcR^K{}9(E6zwv$uDXQrFA?>Iz5G delta 118 zcmX@Ggz?H^#tqw87$KWG)FUd0s9BAV|x}Pb^U=%Ph`J%FM|usZ_94 zFwiqdv*w)~D51p2JGodwX|l0^;N&F|8Hx}cwGawPi@vRbC0NhqxsqoYH|I!SF#`a6 CStEM@ diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index 89c8c3337f1d3441a7561b1bd0143710b3a7f66b..b0aa079465920f9ca6356c7b755bd51a0ad28313 100644 GIT binary patch delta 224 zcmbPJ*ip1$84KgO&C6Llg(rU$H<9I10D`of{KOK4vdrSlq|BVml1c?z1p_^UH0#MO z5=xWPC6w5}s;VbXlqjqRGi$*lk_LTS1xt_)B;$%R5>xWa-4at$fyNc*=I57W6qlqH zXaG$%P16BdU<4$KOY=PQN>cNRfwpQwbR(H+tB{jgRG?u9G+77gJRy+#fcoHuYg%ts NmORV2`JL1{Spc%=M>_xj delta 116 zcmeAunp3!884Kg&&C6Llg(vS4=brpaTuYvpO92Sda`F>P6v{G-Gm|oNGD|8IY!wXj z4AQK5Cp$_gG4f7MmQb3kEFd^}ibRGYL`N-zLeipdt6&M%v$+mW|c6RY$YK(IYL5daV)pC=_QTrsS8qC8ne**eVp~=I57W6qlqHXc*`jn5O9{80Z-R$>P#H&%Bb< zyyDD~N=<99?y}6{%%sd5pa4)`PHItshM}GTP$@zjs10s5R8vuENoi4@!e(d5gN&P* zq`z@0o@QWR&}Lv^SPG<_fcOj&-xbI{KUq>$Uho`}s27lZcC)AIY9_`Do4=|bmj(cu CPf6MU delta 167 zcmZ3{!MLZLalty^vv>+mJ}1sSnNLECk$19%ge;H@l~4kbHlQMHMODYxgZ51r_4AQK5H!qYt%ec8f`U|JxNd^W6Z3Y&Gr9j#V lh)*H$U4iVglUr5g1lo0qeA3QzthZX(O200e0{`H3Y8Wtqj9NtrpBC6x-c3I=)xY1Wfn zB$OtnODM5{RaH-(C{b7sX4Zm9Bn|qu3YH)pNX8XsB&Ot-yCtTi0*x!q&Cf5%C@x7Y z&;Xijnx+G^zz9edm*#oqm89ks18voW=teTtRv{;~s6fLIXtEB}c|suf0rkNR*R? delta 116 zcmdl}e4%K=G8V?ko0qeA3Qyi8&OP~;xRyLGmjV!^<>V)pD3oOuXC`IlWR_Ga*eV$4 z8KhbBPIi<~V&t8iETJ@6SwL{|6p0K)h>ltag``E_R>2aiXLGOQS;oyV(g|_^e|I9{ diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index d1cdff85..faf42cee 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -94,9 +94,9 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant float3 _676 = {}; +constant float3 _683 = {}; -constant spvUnsafeArray _665 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _672 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -114,167 +114,167 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _754 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_754].Indices[0], blockBuffer._m0[_754].Indices[1], blockBuffer._m0[_754].Indices[2], blockBuffer._m0[_754].Indices[3], blockBuffer._m0[_754].Indices[4], blockBuffer._m0[_754].Indices[5] }); - uint _830 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _834 = blockBuffer._m0[_754].IsSprite != 0u; - uint _839 = _830 + uint(_834 ? 6 : 0); - spvUnsafeArray _679 = _782; - uint _859 = _834 ? 0u : _830; - float3 _873 = float3(in.in_var_TEXCOORD1, float(_679[_859])); - float4 _883 = atlasTexture.sample(atlasSampler, _873.xy, uint(rint(_873.z))); - float _891 = _883.w; - uint _903 = uint(UniformBuffer.LightCount); - float3 _920; - float3 _923; - _920 = _676; - _923 = float3(0.0); - float3 _921; - float3 _924; - for (uint _925 = 0u; _925 < _903; _920 = _921, _923 = _924, _925++) + uint _761 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _789 = spvUnsafeArray({ blockBuffer._m0[_761].Indices[0], blockBuffer._m0[_761].Indices[1], blockBuffer._m0[_761].Indices[2], blockBuffer._m0[_761].Indices[3], blockBuffer._m0[_761].Indices[4], blockBuffer._m0[_761].Indices[5] }); + uint _837 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _841 = blockBuffer._m0[_761].IsSprite != 0u; + uint _846 = _837 + uint(_841 ? 6 : 0); + spvUnsafeArray _686 = _789; + uint _866 = _841 ? 0u : _837; + float3 _880 = float3(in.in_var_TEXCOORD1, float(_686[_866])); + float4 _890 = atlasTexture.sample(atlasSampler, _880.xy, uint(rint(_880.z))); + float _898 = _890.w; + uint _910 = uint(UniformBuffer.LightCount); + float3 _927; + float3 _930; + _927 = _683; + _930 = float3(0.0); + float3 _928; + float3 _931; + for (uint _932 = 0u; _932 < _910; _927 = _928, _930 = _931, _932++) { - float _961 = float((lightBuffer._m0[_925].Color & 4278190080u) >> 24u); - float3 _979 = (float3(float(lightBuffer._m0[_925].X), float(lightBuffer._m0[_925].Y), float(lightBuffer._m0[_925].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _983 = length(_979); - bool _997; - if (!(_983 >= _961)) + float _968 = float((lightBuffer._m0[_932].Color & 4278190080u) >> 24u); + float3 _986 = (float3(float(lightBuffer._m0[_932].X), float(lightBuffer._m0[_932].Y), float(lightBuffer._m0[_932].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _990 = length(_986); + bool _1004; + if (!(_990 >= _968)) { - _997 = _961 <= 0.0; + _1004 = _968 <= 0.0; } else { - _997 = true; + _1004 = true; } - if (_997) + if (_1004) { - _921 = _920; - _924 = _923; + _928 = _927; + _931 = _930; continue; } - float _1012 = fast::clamp(dot(_665[_839], _979 / float3(_983)), 0.0, 1.0); - if (_1012 <= 0.0) + float _1019 = fast::clamp(dot(_672[_846], _986 / float3(_990)), 0.0, 1.0); + if (_1019 <= 0.0) { - _921 = _920; - _924 = _923; + _928 = _927; + _931 = _930; continue; } - float3 _1058 = float3(float((lightBuffer._m0[_925].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_925].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_925].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _921 = _1058; - _924 = _923 + ((_1058 * _1012) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_983 / _961, 0.0, 1.0)))); + float3 _1065 = float3(float((lightBuffer._m0[_932].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_932].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_932].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _928 = _1065; + _931 = _930 + ((_1065 * _1019) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_990 / _968, 0.0, 1.0)))); } - float _1393; + float _1408; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1393 = 0.0; + _1408 = 0.0; break; } - float _1173; - if (blockBuffer._m0[_754].HasOcclusion != 0u) + float _1180; + if (blockBuffer._m0[_761].HasOcclusion != 0u) { - _1173 = fast::clamp(-dot(_665[_839], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1180 = fast::clamp(-dot(_672[_846], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1173 = 0.7070000171661376953125; + _1180 = 0.7070000171661376953125; } - if (_1173 <= 0.0) + if (_1180 <= 0.0) { - _1393 = 0.0; + _1408 = 0.0; break; } - float4 _1192 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1202 = _1192.xyz / float3(_1192.w); - float2 _1212 = (_1202.xy * 0.5) + float2(0.5); - float _1218 = 1.0 - _1212.y; - float2 _1220 = _1212; - _1220.y = _1218; - float _1224 = _1212.x; - bool _1236; - if (!(_1224 < 0.0)) + float4 _1199 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1209 = _1199.xyz / float3(_1199.w); + float2 _1219 = (_1209.xy * 0.5) + float2(0.5); + float _1225 = 1.0 - _1219.y; + float2 _1227 = _1219; + _1227.y = _1225; + float _1231 = _1219.x; + bool _1243; + if (!(_1231 < 0.0)) { - _1236 = _1224 > 1.0; + _1243 = _1231 > 1.0; } else { - _1236 = true; + _1243 = true; } - bool _1246; - if (!_1236) + bool _1253; + if (!_1243) { - _1246 = _1218 < 0.0; + _1253 = _1225 < 0.0; } else { - _1246 = true; + _1253 = true; } - bool _1256; - if (!_1246) + bool _1263; + if (!_1253) { - _1256 = _1218 > 1.0; + _1263 = _1225 > 1.0; } else { - _1256 = true; + _1263 = true; } - bool _1268; - if (!_1256) + bool _1275; + if (!_1263) { - _1268 = _1202.z < 0.0; + _1275 = _1209.z < 0.0; } else { - _1268 = true; + _1275 = true; } - bool _1280; - if (!_1268) + bool _1287; + if (!_1275) { - _1280 = _1202.z > 1.0; + _1287 = _1209.z > 1.0; } else { - _1280 = true; + _1287 = true; } - if (_1280) + if (_1287) { - _1393 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173; + _1408 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1180; break; } - uint2 _1291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1307 = float2(1.0) / float2(float(_1291.x), float(_1291.y)); - float _1315 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1173)); - float _1324; - int _1327; - _1324 = 0.0; - _1327 = -1; - float _1325; - for (; _1327 <= 1; _1324 = _1325, _1327++) + uint2 _1298 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1314 = float2(1.0) / float2(float(_1298.x), float(_1298.y)); + float _1322 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1180)); + float _1331; + int _1334; + _1331 = 0.0; + _1334 = -1; + float _1332; + for (; _1334 <= 1; _1331 = _1332, _1334++) { - _1325 = _1324; - for (int _1343 = -1; _1343 <= 1; ) + _1332 = _1331; + for (int _1350 = -1; _1350 <= 1; ) { - _1325 += shadowTexture.sample_compare(shadowSampler, (_1220 + (float2(float(_1327), float(_1343)) * _1307)), _1202.z - _1315, level(0.0)); - _1343++; + _1332 += shadowTexture.sample_compare(shadowSampler, (_1227 + (float2(float(_1334), float(_1350)) * _1314)), _1209.z - _1322, level(0.0)); + _1350++; continue; } } - _1393 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173) * (_1324 * 0.111111111938953399658203125); + _1408 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1180) * mix(1.0, _1331 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1401 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - spvUnsafeArray _678 = _782; - float _1502; - if (_678[_859] == 16u) + float3 _1416 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + spvUnsafeArray _685 = _789; + float _1517; + if (_685[_866] == 16u) { - float4 _1482 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); - _1502 = _891 + ((in.in_var_TEXCOORD0.y - _1482.y) * 0.100000001490116119384765625); + float4 _1497 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); + _1517 = _898 + ((in.in_var_TEXCOORD0.y - _1497.y) * 0.100000001490116119384765625); } else { - _1502 = _891; + _1517 = _898; } - out.out_var_SV_Target0 = float4(mix(_883.xyz * (((_923 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1393)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1401.y, length(float2(_1401.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1502); + out.out_var_SV_Target0 = float4(mix(_890.xyz * (((_930 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1408)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1416.y, length(float2(_1416.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1517); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 39aca22f611d35ea28ae543cf6874b197cdf7a4a..bee2b4c5c2754fd7d5bf93a8b22aee1e0cfb310f 100644 GIT binary patch literal 54504 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 Il2$SU062s@c>n+a delta 99 zcmbQRm~qJ>#tpkz7$ r`4WYS5Kb+GD$6X+Ov=p3EU8q`w^gvzGf1=M-MmopEaT<^X$3O?Wepnm diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index 02adc7a0..f8f1f6d1 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -185,6 +185,8 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); } visibility /= 9.0f; + float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); + visibility = lerp(1.0f, visibility, shadowFade); return kBase + kShadow * sunIntensity * ratio * visibility; } diff --git a/src/block.c b/src/block.c index 476de332..bce6b610 100644 --- a/src/block.c +++ b/src/block.c @@ -238,16 +238,6 @@ static const BLOCKS[BLOCK_COUNT] = .indices = {24, 24, 24, 24, 24, 24}, .light = {0, 0, 0, 0}, }, - [BLOCK_GLASS] = - { - .is_opaque = false, - .is_sprite = false, - .is_solid = true, - .has_occlusion = false, - .has_shadow = false, - .indices = {25, 25, 25, 25, 25, 25}, - .light = {0, 0, 0, 0}, - }, }; static cpu_buffer_t cpu_blocks; diff --git a/src/block.h b/src/block.h index b38522da..bcd2feb1 100644 --- a/src/block.h +++ b/src/block.h @@ -31,7 +31,6 @@ enum // block_t BLOCK_MAGENTA_TORCH, BLOCK_WHITE_TORCH, BLOCK_PLANKS, - BLOCK_GLASS, BLOCK_COUNT, }; diff --git a/src/main.c b/src/main.c index 06c6f5ac..c835fed1 100644 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,8 @@ static const int SHADOW_RESOLUTION = 4096.0f; static const float SHADOW_Y = 30.0f; static const float SHADOW_ORTHO = 300.0f; static const float SHADOW_FAR = 300.0f; +static const float SHADOW_ANGLE_STEP = SDL_PI_F / 360.0f; +static const float SHADOW_PITCH_BIAS = SDL_PI_F / 3600.0f; static SDL_Window* window; static SDL_GPUDevice* device; @@ -40,7 +42,7 @@ static SDL_GPUTexture* composite_texture; static SDL_GPUTexture* shadow_texture; static SDL_GPUSampler* nearest_sampler; static SDL_GPUSampler* shadow_sampler; -static camera_t shadow_camera; +static camera_t shadow_camera; // TODO: move into sky static sky_t sky; static player_t player; static Uint64 ticks1; @@ -593,6 +595,8 @@ static bool resize(int width, int height) return true; } +// TODO: shadow clamp with update shadow every N frames +// TODO: move into sky static void update_shadow_camera() { camera_init(&shadow_camera, CAMERA_TYPE_ORTHO); @@ -602,7 +606,10 @@ static void update_shadow_camera() shadow_camera.y = SHADOW_Y; shadow_camera.z = player.camera.z; shadow_camera.pitch = SDL_asinf(SDL_clamp(sky.render.sun[1], -1.0f, 1.0f)); + shadow_camera.pitch = SDL_roundf(shadow_camera.pitch / SHADOW_ANGLE_STEP) * SHADOW_ANGLE_STEP; + shadow_camera.pitch = SDL_clamp(shadow_camera.pitch, -SDL_PI_F * 0.5f + SHADOW_PITCH_BIAS, SDL_PI_F * 0.5f - SHADOW_PITCH_BIAS); shadow_camera.yaw = SDL_atan2f(sky.render.sun[0], -sky.render.sun[2]); + shadow_camera.yaw = SDL_roundf(shadow_camera.yaw / SHADOW_ANGLE_STEP) * SHADOW_ANGLE_STEP; camera_update(&shadow_camera); float texel_size = SHADOW_ORTHO * 2.0f / SHADOW_RESOLUTION; float light_x = shadow_camera.view[0][0] * shadow_camera.x + shadow_camera.view[1][0] * shadow_camera.y + shadow_camera.view[2][0] * shadow_camera.z; diff --git a/src/sky.c b/src/sky.c index 751a0bc8..eb127f4b 100644 --- a/src/sky.c +++ b/src/sky.c @@ -7,7 +7,7 @@ static const float SUNRISE_LENGTH = 30.0f; static const float DAY_LENGTH = 60.0f; static const float SUNSET_LENGTH = 30.0f; static const float NIGHT_LENGTH = 60.0f; -static const float SPEED = 1.0f; +static const float SPEED = 0.1f; static const float AMBIENT_SCALE = 0.5f; static const float NIGHT_SKY_TOP[3] = {0.02f, 0.02f, 0.1f}; diff --git a/textures/atlas.png b/textures/atlas.png index 9560726030430cbfb1151276fe20d7fa0c674afd..67c3070a8a36a00c2819bd48c539f92378ac3535 100644 GIT binary patch delta 552 zcmV+@0@wY?1+WE>iGK$Y11T_5;=o=200IU{L_t(|+U?viNE=Zc$MN?sZUwu97D^X8 zMBIcsLbr_VkVr{!s6#-IWHJQ0M1+z>$kL%WX>oB$2Bm`v(k);xLqg|tNa-F5CF$bw zIH(H~ST>sa zabDOZKgIk5ZUF!Q?w>ijARhdMN0E;2eE&tK0RRI4AYKNG<5Qc7UNh2CfwgulFCvlh zFW#Pv<=gdaqShG&Nj&pDrJjclqla?W3sw(M1D%Q3#UQ;xi z07XPJn*iJOtY|g?`bCi_n*d!3dU7XYSq^{}@7d3Go;?7F?I7T~FuD{v5mDva^{guI z7j@^q3)bgHs{F9}LzRDe{P!bMUDp|i54!*Vq?}ge-&}rC<{91^@s6 qfB^si0F#*l4jll@0001hP=5d)8{dZwWv0^r0000Zqu4JUVWZv_p|AFH-BiNl>K?8%0HW&SLI(0 zSykR%45;$CwuzA}n;1Crij{&Uf0TP(pcU`0uQMrC2R8BXhwA#j z^IJw!fA*$V$t&`Ycmx0dczC*Kf_U%~PePr4SUsoF0NhOfvsC>Ms{ffwEYNBU0DxOj z>u;Uf>^|NPwSQD#t!>GRNT~daH`^`waw#1ufB32O`hG@O>Hu(~SOP%oi+|9uPK$rg zu}+JB(6LU7f6y@iUVzyJV1jEetV4+3ia zDH~?#<+}0RQ9Hgn>YVqA73&o%&iVSfXY1>pb3S>{uz$&ehI77|&D&-+@0_=P@pK?a zm-aowN%KW@1KRiaf$O@D_eHY_P((zt39wvBi)Is`pAiYO3DBjW_bm=tmIDwq-qVjZ z&mI88b`bEdFuD{v5mDvKrL-#VXLQ&9A51-NsPgr~sVd*QarKd@Bi9*-W!?XOI-64E z$9{cR*J{%2v@urLQ77E&@${0 zTHY2yE44ysHA4ukadk7ln2kU^`w4ad80KFDV}WQI@!+8G% zVc5J*Q=ElK=PxuZl!HbQv16QT4%D7_I%AB50)F!~~t zKe@orbMtIHPbNlbSoSmUhsYU;Luq9wtq;zA2J<0Y186Qa*bn8Ohtkm8YVaP)hh|qJ K_RWQcOBexfIOLoF delta 1441 zcmdm;GBs_2lV}J71A`b4vj8y@5Q{P}2>+TG?p*&%qqw9pCsm<1KPNLqlS?BlJvl!o zzlci#2sFS<1*IT$cXcOqg;EP81!D!J7&BuCQc^I`1nNk_sl!nrEhj&*L`lKW45-Zj z2#pL3V$98vn370rBqq@4%~Fhd!h(%Jw*rCAMF_3`e)3x#>B$QEER!olJ~2)P@|2`R zk3%GN)Q2OZPL=j~omqxj=~ub|DbvM_~gURRP38Ku5vlDHf|oGZ4*kurt^z_;Vo^gB$>H8nwjgkqrb| z4!01AZ4YFxXO{tCeiSy)QR{(N251Ico{%#08d7**R=7YMPOpIT_HX3R|#Em{e>Aw)# qm=k8BVI@SwuoFtpgwiXaG_(*hJPGCBgwRG0AvDm&xXr%}92fyi5ohxN From a74421ff3d4e7d2f856bb6059656dcfd0f810612 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 00:17:18 -0400 Subject: [PATCH 11/39] msaa and zlib --- LICENSE.txt | 35 +++++++++++++++-------------------- src/main.c | 45 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 3c577b03..0fd87e1e 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,24 +1,19 @@ -This is free and unencumbered software released into the public domain. +zlib License -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. +(C) 2026 Jaan Soulier -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: -For more information, please refer to \ No newline at end of file +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. diff --git a/src/main.c b/src/main.c index c835fed1..2b824302 100644 --- a/src/main.c +++ b/src/main.c @@ -22,6 +22,7 @@ static const float SHADOW_ORTHO = 300.0f; static const float SHADOW_FAR = 300.0f; static const float SHADOW_ANGLE_STEP = SDL_PI_F / 360.0f; static const float SHADOW_PITCH_BIAS = SDL_PI_F / 3600.0f; +static const SDL_GPUSampleCount SAMPLE_COUNT = SDL_GPU_SAMPLECOUNT_4; static SDL_Window* window; static SDL_GPUDevice* device; @@ -39,6 +40,8 @@ static SDL_GPUTexture* atlas_texture; static SDL_GPUTexture* depth_texture; static SDL_GPUTexture* position_texture; static SDL_GPUTexture* composite_texture; +static SDL_GPUTexture* multisample_color_texture; +static SDL_GPUTexture* multisample_position_texture; static SDL_GPUTexture* shadow_texture; static SDL_GPUSampler* nearest_sampler; static SDL_GPUSampler* shadow_sampler; @@ -211,6 +214,7 @@ static bool create_opaque_pipeline() info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS; info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; + info.multisample_state.sample_count = SAMPLE_COUNT; if (info.vertex_shader && info.fragment_shader) { opaque_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); @@ -240,6 +244,7 @@ static bool create_depth_pipeline() info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS; info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; + info.multisample_state.sample_count = SAMPLE_COUNT; if (info.vertex_shader && info.fragment_shader) { depth_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); @@ -279,6 +284,7 @@ static bool create_transparent_pipeline() info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; + info.multisample_state.sample_count = SAMPLE_COUNT; if (info.vertex_shader && info.fragment_shader) { transparent_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); @@ -332,6 +338,7 @@ static bool create_sky_pipeline() info.target_info.color_target_descriptions = color_targets; info.target_info.has_depth_stencil_target = true; info.target_info.depth_stencil_format = depth_format; + info.multisample_state.sample_count = SAMPLE_COUNT; if (info.vertex_shader && info.fragment_shader) { sky_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); @@ -361,6 +368,7 @@ static bool create_raycast_pipeline() info.target_info.depth_stencil_format = depth_format; info.depth_stencil_state.enable_depth_test = true; info.depth_stencil_state.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; + info.multisample_state.sample_count = SAMPLE_COUNT; if (info.vertex_shader && info.fragment_shader) { raycast_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); @@ -535,6 +543,8 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) SDL_ReleaseGPUSampler(device, nearest_sampler); SDL_ReleaseGPUSampler(device, shadow_sampler); SDL_ReleaseGPUTexture(device, shadow_texture); + SDL_ReleaseGPUTexture(device, multisample_position_texture); + SDL_ReleaseGPUTexture(device, multisample_color_texture); SDL_ReleaseGPUTexture(device, composite_texture); SDL_ReleaseGPUTexture(device, position_texture); SDL_ReleaseGPUTexture(device, depth_texture); @@ -558,9 +568,13 @@ static bool resize(int width, int height) SDL_ReleaseGPUTexture(device, depth_texture); SDL_ReleaseGPUTexture(device, position_texture); SDL_ReleaseGPUTexture(device, composite_texture); + SDL_ReleaseGPUTexture(device, multisample_color_texture); + SDL_ReleaseGPUTexture(device, multisample_position_texture); depth_texture = NULL; position_texture = NULL; composite_texture = NULL; + multisample_color_texture = NULL; + multisample_position_texture = NULL; SDL_GPUTextureCreateInfo info = {0}; info.type = SDL_GPU_TEXTURETYPE_2D; info.format = depth_format; @@ -569,12 +583,14 @@ static bool resize(int width, int height) info.height = height; info.layer_count_or_depth = 1; info.num_levels = 1; + info.sample_count = SAMPLE_COUNT; depth_texture = SDL_CreateGPUTexture(device, &info); if (!depth_texture) { SDL_Log("Failed to create depth texture: %s", SDL_GetError()); return false; } + info.sample_count = SDL_GPU_SAMPLECOUNT_1; info.format = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT; info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_SAMPLER; position_texture = SDL_CreateGPUTexture(device, &info); @@ -591,6 +607,21 @@ static bool resize(int width, int height) SDL_Log("Failed to create composite texture: %s", SDL_GetError()); return false; } + info.sample_count = SAMPLE_COUNT; + info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; + multisample_color_texture = SDL_CreateGPUTexture(device, &info); + if (!multisample_color_texture) + { + SDL_Log("Failed to create multisample color texture: %s", SDL_GetError()); + return false; + } + info.format = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT; + multisample_position_texture = SDL_CreateGPUTexture(device, &info); + if (!multisample_position_texture) + { + SDL_Log("Failed to create multisample position texture: %s", SDL_GetError()); + return false; + } camera_resize(&player.camera, width, height); return true; } @@ -682,13 +713,15 @@ static void render_opaque_forward(SDL_GPUCommandBuffer* cbuf) { SDL_GPUColorTargetInfo color_info[2] = {0}; color_info[0].load_op = SDL_GPU_LOADOP_CLEAR; - color_info[0].texture = composite_texture; + color_info[0].texture = multisample_color_texture; color_info[0].cycle = true; color_info[0].store_op = SDL_GPU_STOREOP_STORE; color_info[1].load_op = SDL_GPU_LOADOP_CLEAR; - color_info[1].texture = position_texture; + color_info[1].texture = multisample_position_texture; color_info[1].cycle = true; - color_info[1].store_op = SDL_GPU_STOREOP_STORE; + color_info[1].store_op = SDL_GPU_STOREOP_RESOLVE; + color_info[1].resolve_texture = position_texture; + color_info[1].cycle_resolve_texture = true; SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_CLEAR; depth_info.stencil_load_op = SDL_GPU_LOADOP_CLEAR; @@ -763,8 +796,10 @@ static void render_forward(SDL_GPUCommandBuffer* cbuf) { SDL_GPUColorTargetInfo color_info = {0}; color_info.load_op = SDL_GPU_LOADOP_LOAD; - color_info.texture = composite_texture; - color_info.store_op = SDL_GPU_STOREOP_STORE; + color_info.texture = multisample_color_texture; + color_info.store_op = SDL_GPU_STOREOP_RESOLVE; + color_info.resolve_texture = composite_texture; + color_info.cycle_resolve_texture = true; SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_LOAD; depth_info.store_op = SDL_GPU_STOREOP_STORE; From e3ab9e0db9eac8fc36c78c8af7e7365f0dffddd7 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 00:49:10 -0400 Subject: [PATCH 12/39] next --- LICENSE.txt | 35 ++++++++++++++++++++--------------- src/main.c | 41 ++++------------------------------------- src/sky.c | 32 ++++++++++++++++++++++++++++++++ src/sky.h | 5 +++++ 4 files changed, 61 insertions(+), 52 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 0fd87e1e..3c577b03 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,19 +1,24 @@ -zlib License +This is free and unencumbered software released into the public domain. -(C) 2026 Jaan Soulier +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. +For more information, please refer to \ No newline at end of file diff --git a/src/main.c b/src/main.c index 2b824302..30a5f1c3 100644 --- a/src/main.c +++ b/src/main.c @@ -17,11 +17,6 @@ static const float ATLAS_WIDTH = 512.0f; static const int ATLAS_MIP_LEVELS = 4; static const float BLOCK_WIDTH = 16.0f; static const int SHADOW_RESOLUTION = 4096.0f; -static const float SHADOW_Y = 30.0f; -static const float SHADOW_ORTHO = 300.0f; -static const float SHADOW_FAR = 300.0f; -static const float SHADOW_ANGLE_STEP = SDL_PI_F / 360.0f; -static const float SHADOW_PITCH_BIAS = SDL_PI_F / 3600.0f; static const SDL_GPUSampleCount SAMPLE_COUNT = SDL_GPU_SAMPLECOUNT_4; static SDL_Window* window; @@ -45,7 +40,6 @@ static SDL_GPUTexture* multisample_position_texture; static SDL_GPUTexture* shadow_texture; static SDL_GPUSampler* nearest_sampler; static SDL_GPUSampler* shadow_sampler; -static camera_t shadow_camera; // TODO: move into sky static sky_t sky; static player_t player; static Uint64 ticks1; @@ -626,33 +620,6 @@ static bool resize(int width, int height) return true; } -// TODO: shadow clamp with update shadow every N frames -// TODO: move into sky -static void update_shadow_camera() -{ - camera_init(&shadow_camera, CAMERA_TYPE_ORTHO); - shadow_camera.ortho = SHADOW_ORTHO; - shadow_camera.far = SHADOW_FAR; - shadow_camera.x = player.camera.x; - shadow_camera.y = SHADOW_Y; - shadow_camera.z = player.camera.z; - shadow_camera.pitch = SDL_asinf(SDL_clamp(sky.render.sun[1], -1.0f, 1.0f)); - shadow_camera.pitch = SDL_roundf(shadow_camera.pitch / SHADOW_ANGLE_STEP) * SHADOW_ANGLE_STEP; - shadow_camera.pitch = SDL_clamp(shadow_camera.pitch, -SDL_PI_F * 0.5f + SHADOW_PITCH_BIAS, SDL_PI_F * 0.5f - SHADOW_PITCH_BIAS); - shadow_camera.yaw = SDL_atan2f(sky.render.sun[0], -sky.render.sun[2]); - shadow_camera.yaw = SDL_roundf(shadow_camera.yaw / SHADOW_ANGLE_STEP) * SHADOW_ANGLE_STEP; - camera_update(&shadow_camera); - float texel_size = SHADOW_ORTHO * 2.0f / SHADOW_RESOLUTION; - float light_x = shadow_camera.view[0][0] * shadow_camera.x + shadow_camera.view[1][0] * shadow_camera.y + shadow_camera.view[2][0] * shadow_camera.z; - float light_y = shadow_camera.view[0][1] * shadow_camera.x + shadow_camera.view[1][1] * shadow_camera.y + shadow_camera.view[2][1] * shadow_camera.z; - float delta_x = SDL_roundf(light_x / texel_size) * texel_size - light_x; - float delta_y = SDL_roundf(light_y / texel_size) * texel_size - light_y; - shadow_camera.x += shadow_camera.view[0][0] * delta_x + shadow_camera.view[0][1] * delta_y; - shadow_camera.y += shadow_camera.view[1][0] * delta_x + shadow_camera.view[1][1] * delta_y; - shadow_camera.z += shadow_camera.view[2][0] * delta_x + shadow_camera.view[2][1] * delta_y; - camera_update(&shadow_camera); -} - static void render_shadow(SDL_GPUCommandBuffer* cbuf) { if (!sky.has_sun) @@ -676,7 +643,7 @@ static void render_shadow(SDL_GPUCommandBuffer* cbuf) SDL_GPUBuffer* block_buffer = block_get_buffer(); SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); SDL_PushGPUDebugGroup(cbuf, "shadow"); - world_render(&shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); + world_render(&sky.shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); SDL_PopGPUDebugGroup(cbuf); SDL_EndGPURenderPass(pass); } @@ -701,7 +668,7 @@ static void render_opaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) sampler_bindings[1].sampler = shadow_sampler; SDL_PushGPUDebugGroup(cbuf, "opaque"); SDL_BindGPUGraphicsPipeline(pass, opaque_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &shadow_camera.matrix, 64); + SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, 64); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); @@ -770,7 +737,7 @@ static void render_transparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pa sampler_bindings[2].sampler = nearest_sampler; SDL_PushGPUDebugGroup(cbuf, "transparent"); SDL_BindGPUGraphicsPipeline(pass, transparent_pipeline); - SDL_PushGPUFragmentUniformData(cbuf, 1, &shadow_camera.matrix, 64); + SDL_PushGPUFragmentUniformData(cbuf, 1, &sky.shadow_camera.matrix, 64); SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); @@ -903,7 +870,7 @@ SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) player_move(&player, dt); player_save_or_load(&player, PLAYER_ID, true); } - update_shadow_camera(); + sky_update_shadow(&sky, &player.camera, SHADOW_RESOLUTION); world_update(&player.camera); render(); return SDL_APP_CONTINUE; diff --git a/src/sky.c b/src/sky.c index eb127f4b..cdf2cd04 100644 --- a/src/sky.c +++ b/src/sky.c @@ -9,6 +9,10 @@ static const float SUNSET_LENGTH = 30.0f; static const float NIGHT_LENGTH = 60.0f; static const float SPEED = 0.1f; static const float AMBIENT_SCALE = 0.5f; +static const float SHADOW_Y = 30.0f; +static const float SHADOW_ORTHO = 300.0f; +static const float SHADOW_FAR = 300.0f; +static const int SHADOW_UPDATE_FRAMES = 300; static const float NIGHT_SKY_TOP[3] = {0.02f, 0.02f, 0.1f}; static const float NIGHT_SKY_HORIZON[3] = {0.05f, 0.05f, 0.2f}; @@ -89,6 +93,10 @@ void sky_save_or_load(sky_t* sky, bool save) save_set_sky(sky->time_of_day); return; } + camera_init(&sky->shadow_camera, CAMERA_TYPE_ORTHO); + sky->shadow_camera.ortho = SHADOW_ORTHO; + sky->shadow_camera.far = SHADOW_FAR; + sky->shadow_frame = 0; float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; float sunrise_end = SUNRISE_LENGTH / total_length; float day_end = sunrise_end + DAY_LENGTH / total_length; @@ -108,3 +116,27 @@ void sky_update(sky_t* sky, float dt) sky->time_of_day = SDL_fmodf(sky->time_of_day, 1.0f); update_render(sky); } + +void sky_update_shadow(sky_t* sky, const camera_t* camera, int resolution) +{ + camera_t* shadow = &sky->shadow_camera; + if (sky->shadow_frame == 0) + { + shadow->pitch = SDL_asinf(sky->render.sun[1]); + shadow->yaw = SDL_atan2f(sky->render.sun[0], -sky->render.sun[2]); + } + sky->shadow_frame = (sky->shadow_frame + 1) % SHADOW_UPDATE_FRAMES; + shadow->x = camera->x; + shadow->y = SHADOW_Y; + shadow->z = camera->z; + camera_update(shadow); + float texel_size = SHADOW_ORTHO * 2.0f / resolution; + float light_x = shadow->view[0][0] * shadow->x + shadow->view[1][0] * shadow->y + shadow->view[2][0] * shadow->z; + float light_y = shadow->view[0][1] * shadow->x + shadow->view[1][1] * shadow->y + shadow->view[2][1] * shadow->z; + float delta_x = SDL_roundf(light_x / texel_size) * texel_size - light_x; + float delta_y = SDL_roundf(light_y / texel_size) * texel_size - light_y; + shadow->x += shadow->view[0][0] * delta_x + shadow->view[0][1] * delta_y; + shadow->y += shadow->view[1][0] * delta_x + shadow->view[1][1] * delta_y; + shadow->z += shadow->view[2][0] * delta_x + shadow->view[2][1] * delta_y; + camera_update(shadow); +} diff --git a/src/sky.h b/src/sky.h index ddcb8697..d81a7877 100644 --- a/src/sky.h +++ b/src/sky.h @@ -2,6 +2,8 @@ #include +#include "camera.h" + typedef struct sky_render { float sun[4]; @@ -16,8 +18,11 @@ typedef struct sky float time_of_day; bool has_sun; sky_render_t render; + camera_t shadow_camera; + int shadow_frame; } sky_t; void sky_save_or_load(sky_t* sky, bool save); void sky_update(sky_t* sky, float dt); +void sky_update_shadow(sky_t* sky, const camera_t* camera, int resolution); From 007941f510069acbe01027b7f79c525c1fd19094 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 09:58:32 -0400 Subject: [PATCH 13/39] move to SDL style syntax --- CMakeLists.txt | 5 +- shaders/bin/depth.vert.spv | Bin 17504 -> 17476 bytes shaders/bin/opaque.frag.msl | 195 +++++----- shaders/bin/opaque.frag.spv | Bin 54332 -> 53880 bytes shaders/bin/opaque.vert.msl | 18 +- shaders/bin/opaque.vert.spv | Bin 21056 -> 20996 bytes shaders/bin/raycast.vert.msl | 10 +- shaders/bin/raycast.vert.spv | Bin 14600 -> 14588 bytes shaders/bin/shadow.vert.json | 2 +- shaders/bin/shadow.vert.msl | 21 +- shaders/bin/shadow.vert.spv | Bin 21328 -> 17460 bytes shaders/bin/sky.frag.spv | Bin 17448 -> 17388 bytes shaders/bin/sky.vert.msl | 16 +- shaders/bin/sky.vert.spv | Bin 14780 -> 14736 bytes shaders/bin/transparent.frag.msl | 193 +++++----- shaders/bin/transparent.frag.spv | Bin 54504 -> 54100 bytes shaders/bin/transparent.vert.msl | 22 +- shaders/bin/transparent.vert.spv | Bin 20880 -> 20836 bytes shaders/bin/ui.comp.json | 1 - shaders/bin/ui.comp.msl | 169 -------- shaders/bin/ui.comp.spv | Bin 19816 -> 0 bytes shaders/bin/ui.frag.json | 1 + shaders/bin/ui.frag.msl | 41 ++ shaders/bin/ui.frag.spv | Bin 0 -> 5484 bytes shaders/bin/ui.vert.json | 1 + shaders/bin/ui.vert.msl | 89 +++++ shaders/bin/ui.vert.spv | Bin 0 -> 10280 bytes shaders/shader.hlsl | 1 - shaders/shadow.vert | 5 - shaders/ui.comp | 68 ---- shaders/ui.frag | 25 ++ shaders/ui.vert | 53 +++ src/block.c | 87 ++--- src/block.h | 31 +- src/buffer.c | 41 +- src/buffer.h | 28 +- src/camera.c | 49 ++- src/camera.h | 24 +- src/check.h | 10 - src/direction.h | 4 +- src/main.c | 286 +++++++------- src/map.c | 160 -------- src/map.h | 29 -- src/player.c | 115 +++--- src/player.h | 33 +- src/rand.c | 8 +- src/rand.h | 4 +- src/save.c | 20 +- src/save.h | 20 +- src/shader.c | 192 ++++------ src/shader.h | 2 +- src/sky.c | 60 +-- src/sky.h | 19 +- src/voxel.c | 53 ++- src/voxel.h | 8 +- src/world.c | 639 ++++++++++++++++--------------- src/world.h | 26 +- 57 files changed, 1287 insertions(+), 1597 deletions(-) delete mode 100644 shaders/bin/ui.comp.json delete mode 100644 shaders/bin/ui.comp.msl delete mode 100644 shaders/bin/ui.comp.spv create mode 100644 shaders/bin/ui.frag.json create mode 100644 shaders/bin/ui.frag.msl create mode 100644 shaders/bin/ui.frag.spv create mode 100644 shaders/bin/ui.vert.json create mode 100644 shaders/bin/ui.vert.msl create mode 100644 shaders/bin/ui.vert.spv delete mode 100644 shaders/ui.comp create mode 100644 shaders/ui.frag create mode 100644 shaders/ui.vert delete mode 100644 src/check.h delete mode 100644 src/map.c delete mode 100644 src/map.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f87bac54..9c978915 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,6 @@ add_executable(blocks WIN32 src/buffer.c src/camera.c src/main.c - src/map.c src/player.c src/rand.c src/save.c @@ -32,6 +31,7 @@ add_executable(blocks WIN32 src/world.c ) set_target_properties(blocks PROPERTIES C_STANDARD 11) +target_compile_definitions(blocks PRIVATE SDL_ASSERT_LEVEL=$,3,0>) target_include_directories(blocks PUBLIC lib/jsmn) target_include_directories(blocks PUBLIC lib/sqlite3) target_include_directories(blocks PUBLIC lib/stb) @@ -99,4 +99,5 @@ add_shader(sky.frag shaders/shader.hlsl src/voxel.inc) add_shader(sky.vert shaders/shader.hlsl src/voxel.inc) add_shader(transparent.frag shaders/shader.hlsl src/voxel.inc) add_shader(transparent.vert shaders/shader.hlsl src/voxel.inc) -add_shader(ui.comp shaders/shader.hlsl src/voxel.inc) +add_shader(ui.frag) +add_shader(ui.vert) diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index 5350de3d9bad4edf4f0b6424d97199e4cc6fc7a2..d179cdd317dc5ad893abcd7190df4f6dd5b2d7aa 100644 GIT binary patch delta 3373 zcmZ8iYfzMB82!FvfhEk#Mhoq#OPhm+ml$9dTyTLMC2~l~F>@TI$QY#%9Fb|5Vipw> zZ;8B_mKRtxtrUyMva;0D(#q2AW~ElvG*kWQS5r-$^X>P*tKZDo_nh-Q@BOluI?NLt z=1Y4M%zbKK!msmF9!>G#Yp!cp=BsF$y<}uYtZW ztfEBpT4;Wv*IBA9>_+|d;A~?EFu_Q)^agO&A($)mo&YzDw&+nw+z2U&42s_g&WaKf ze-k|BUF&z*p45?iW&2VmK9HzkJc$6lfq`s>peK+KKgBG=2up)oAm~Y+_*-pXV&Xq- z=U(Nbf8!ag5eB8gHgHMS{q43-Pxp5~b1>qkVM}&G`v88N2z8;Q;yOwr7cc=ys0F`H z(*@w%Q;Fw;J2agKo}lS=@FYzafhPhSP&Y~+VD}fbj2;;L*Z~t_fIgrq=oCB70apWK zG`$dfn5K7u|EK9naJQy|;66)7<4bZEM6zYX^&{Z70zB2bQSwxChUxg-gOVQgXspXP zl=OUXo<+%(qsQ27C?&Snj?rVg`%rdAZIj6pz-h9f=WL%I_46oAAikdo#tY!w5)QeyII^TK4awivt=6SV|( z#GNq#Ho!}fV0-L<`|=*Z`l8>zCVmQd;vZ}(_eziZDsyffPMR{ z75W-lZa3rS0bUNfy{PdG#7%>SaRJ<|>2JZ)HT@m9yf19LZOk-`A7IG)!3sYDV*sh}6Sz;)SHLqh{WJJ2qWhO;UraKCswUTMwyBm}PsVbD zOn_q?3$y`Kf!V4TIV;r3+{qa$p(Q5^oUaRW+SSlJx4BA<&GVa&s|x(?SBvvP4(4~L z-aLK$Ie&obIh`s$e~g3Ko7C}u zOV#J6TB=L6+P+dTn{}y^1FS0OQvVF(4h_WH=u$ZWzjHHMv&N>X10LrVTgBA!fXCdb zb_D!tdmvez3V78ql)nYM<~H=y#PvsMeszDRYjgSkR*` zA*U!mRh>nxPIVczj=)JR@R}U4OBEHQn>}hyf!~a&mV!UccD1;$9KVMO|2EtE`=-2T zLev!fV(wHG#o0)0E)JOoRbR1tR1bzs6x(-yB33LLXoOy^t`tYCjF^^@i)hY3#c2|d1{k+Ksm!*XeK&akC^I zFGp+|uxlV*Rl@ihJ6?&{jH~LOM|`~+Q92jDb*1F7(#G)zQJ*+$qZBXIYvA)xmk(zT zz`5^Hg=Kz+m91*ZJkCLXRhfUFl~<8XRH2pCC~MHl9DtwYsdHs66YEx%l_ov&|Al|n zv+xA&R+$l3&N`@6JaCg3L2Wj$5SR`~EtY)rJJHi_RT~*>uM#ew|9B)8$+Aa%Cc>Tl SD>5_v0HQ>$jepTY0q{RYzvHa{ delta 3456 zcmZ8jX>3$g7@a4bZnjdWwbW^0a3B>+!7`nhmQvbj1+1h(B}$B$n6Wgph%KQdgdmwg ztd>>E1r!vRDXU6>TEq>+1s4?D7Zea&(3r>%q9z(Odd_?A8!x={%suCP-(BAQ-hHpf zx{UK(#(`Z)#y+(>>E}ph`r^!VH?9ROtsU;V_8If$w{$dBXx^>i_Gyica~HI?w6$L0 z&u9+MYFntAb?uWE%$=}X5%IHHlGlDHO95*ZY~8=M^_CjL5j%)8Q8wkLfgf4%KXA8R2IhhqZ*xDpH52tiLE zD}J0=4o8&?_yhz!$rFE*?MqDj&35i(KIV5ksSU!Qba)C}l68NJ?bFl!t%nt19RPQmI$~|f?GUM^Vd;h7 zBLF_tJJ9l}<{b{f?@qMzsE1--ZbVDZ4QCfx?i@YFZbB=u-FA!~$K8WA7O_nxj|Qj7 zfu6Q~deqOLH2{{2`dPFr2^W%$DaW9d-3fwo$3)kF-=XPA;CZ$->pvADY8#y3HXuXO z)4{LR^bGL9n!XD>U(++e3p9N%_)txU!LuzLG4H4uqS`V{JqJ8f)Axg?X?h+w_gU_+ z4e}Z-z6hK(miU9<#hP9Mo?~je{!xhGCI&e6qSd#v7uo}`X8X{_0R1%VhaL;CEC&r7q_( zuobGW)K&5j*c#wwAP!{UF&TsQBEYeE$IMv^FsDcTQ=03f)2){Jv(;!{hN;%6O5ZS( zDHXQadexcm1_iR!VLMl;lL`M)g5~%0dw^3;y&0_eBwLy2Ow)*8d3NtJUw-Gx1v=B<~EiIiu(wReuIuX>l;# z!%kID;~8c8aQL|(f_TI6^Af_CMQH!eZmIF)MBxyJY&0OdOT}xlbGqO(qR*WG{_w8| zBgbnB6EpAw#83Woyd!s@osG0Gz+O$jDwS93O3V;N20sRCG0qNES6i5f)WhXx!HRU& Z7CNI)QPo$=8lSD5=In*;RVBA%{|9Th?TG*Y diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index bfe6108c..be92196e 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -48,7 +48,6 @@ struct Block { uint IsSprite; uint HasOcclusion; - uint HasShadow; uint IsFullbright; uint Indices[6]; }; @@ -94,9 +93,9 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant float3 _681 = {}; +constant float3 _673 = {}; -constant spvUnsafeArray _672 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _664 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -115,176 +114,176 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _754 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_754].Indices[0], blockBuffer._m0[_754].Indices[1], blockBuffer._m0[_754].Indices[2], blockBuffer._m0[_754].Indices[3], blockBuffer._m0[_754].Indices[4], blockBuffer._m0[_754].Indices[5] }); - spvUnsafeArray _683 = _782; - bool _815 = blockBuffer._m0[_754].IsSprite != 0u; - uint _829; - if (_815) + uint _746 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _772 = spvUnsafeArray({ blockBuffer._m0[_746].Indices[0], blockBuffer._m0[_746].Indices[1], blockBuffer._m0[_746].Indices[2], blockBuffer._m0[_746].Indices[3], blockBuffer._m0[_746].Indices[4], blockBuffer._m0[_746].Indices[5] }); + spvUnsafeArray _675 = _772; + bool _801 = blockBuffer._m0[_746].IsSprite != 0u; + uint _815; + if (_801) { - _829 = 0u; + _815 = 0u; } else { - _829 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + _815 = (in.in_var_TEXCOORD2 >> 0u) & 7u; } - float3 _843 = float3(in.in_var_TEXCOORD1, float(_683[_829])); - float4 _853 = atlasTexture.sample(atlasSampler, _843.xy, uint(rint(_843.z))); - if (_853.w < 0.001000000047497451305389404296875) + float3 _829 = float3(in.in_var_TEXCOORD1, float(_675[_815])); + float4 _839 = atlasTexture.sample(atlasSampler, _829.xy, uint(rint(_829.z))); + if (_839.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _868 = _853.xyz; - uint _905 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_815 ? 6 : 0); - uint _921 = uint(UniformBuffer.LightCount); - float3 _938; - float3 _941; - _938 = _681; - _941 = float3(0.0); - float3 _939; - float3 _942; - for (uint _943 = 0u; _943 < _921; _938 = _939, _941 = _942, _943++) + float3 _854 = _839.xyz; + uint _889 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_801 ? 6 : 0); + uint _905 = uint(UniformBuffer.LightCount); + float3 _922; + float3 _925; + _922 = _673; + _925 = float3(0.0); + float3 _923; + float3 _926; + for (uint _927 = 0u; _927 < _905; _922 = _923, _925 = _926, _927++) { - float _979 = float((lightBuffer._m0[_943].Color & 4278190080u) >> 24u); - float3 _997 = (float3(float(lightBuffer._m0[_943].X), float(lightBuffer._m0[_943].Y), float(lightBuffer._m0[_943].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _1001 = length(_997); - bool _1015; - if (!(_1001 >= _979)) + float _963 = float((lightBuffer._m0[_927].Color & 4278190080u) >> 24u); + float3 _981 = (float3(float(lightBuffer._m0[_927].X), float(lightBuffer._m0[_927].Y), float(lightBuffer._m0[_927].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _985 = length(_981); + bool _999; + if (!(_985 >= _963)) { - _1015 = _979 <= 0.0; + _999 = _963 <= 0.0; } else { - _1015 = true; + _999 = true; } - if (_1015) + if (_999) { - _939 = _938; - _942 = _941; + _923 = _922; + _926 = _925; continue; } - float _1030 = fast::clamp(dot(_672[_905], _997 / float3(_1001)), 0.0, 1.0); - if (_1030 <= 0.0) + float _1014 = fast::clamp(dot(_664[_889], _981 / float3(_985)), 0.0, 1.0); + if (_1014 <= 0.0) { - _939 = _938; - _942 = _941; + _923 = _922; + _926 = _925; continue; } - float3 _1076 = float3(float((lightBuffer._m0[_943].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_943].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_943].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _939 = _1076; - _942 = _941 + ((_1076 * _1030) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_1001 / _979, 0.0, 1.0)))); + float3 _1060 = float3(float((lightBuffer._m0[_927].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _923 = _1060; + _926 = _925 + ((_1060 * _1014) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_985 / _963, 0.0, 1.0)))); } - float _1419; + float _1401; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1419 = 0.0; + _1401 = 0.0; break; } - float _1191; - if (blockBuffer._m0[_754].HasOcclusion != 0u) + float _1173; + if (blockBuffer._m0[_746].HasOcclusion != 0u) { - _1191 = fast::clamp(-dot(_672[_905], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1173 = fast::clamp(-dot(_664[_889], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1191 = 0.7070000171661376953125; + _1173 = 0.7070000171661376953125; } - if (_1191 <= 0.0) + if (_1173 <= 0.0) { - _1419 = 0.0; + _1401 = 0.0; break; } - float4 _1210 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1220 = _1210.xyz / float3(_1210.w); - float2 _1230 = (_1220.xy * 0.5) + float2(0.5); - float _1236 = 1.0 - _1230.y; - float2 _1238 = _1230; - _1238.y = _1236; - float _1242 = _1230.x; - bool _1254; - if (!(_1242 < 0.0)) + float4 _1192 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1202 = _1192.xyz / float3(_1192.w); + float2 _1212 = (_1202.xy * 0.5) + float2(0.5); + float _1218 = 1.0 - _1212.y; + float2 _1220 = _1212; + _1220.y = _1218; + float _1224 = _1212.x; + bool _1236; + if (!(_1224 < 0.0)) { - _1254 = _1242 > 1.0; + _1236 = _1224 > 1.0; } else { - _1254 = true; + _1236 = true; } - bool _1264; - if (!_1254) + bool _1246; + if (!_1236) { - _1264 = _1236 < 0.0; + _1246 = _1218 < 0.0; } else { - _1264 = true; + _1246 = true; } - bool _1274; - if (!_1264) + bool _1256; + if (!_1246) { - _1274 = _1236 > 1.0; + _1256 = _1218 > 1.0; } else { - _1274 = true; + _1256 = true; } - bool _1286; - if (!_1274) + bool _1268; + if (!_1256) { - _1286 = _1220.z < 0.0; + _1268 = _1202.z < 0.0; } else { - _1286 = true; + _1268 = true; } - bool _1298; - if (!_1286) + bool _1280; + if (!_1268) { - _1298 = _1220.z > 1.0; + _1280 = _1202.z > 1.0; } else { - _1298 = true; + _1280 = true; } - if (_1298) + if (_1280) { - _1419 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1191; + _1401 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173; break; } - uint2 _1309 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1325 = float2(1.0) / float2(float(_1309.x), float(_1309.y)); - float _1333 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1191)); - float _1342; - int _1345; - _1342 = 0.0; - _1345 = -1; - float _1343; - for (; _1345 <= 1; _1342 = _1343, _1345++) + uint2 _1291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1307 = float2(1.0) / float2(float(_1291.x), float(_1291.y)); + float _1315 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1173)); + float _1324; + int _1327; + _1324 = 0.0; + _1327 = -1; + float _1325; + for (; _1327 <= 1; _1324 = _1325, _1327++) { - _1343 = _1342; - for (int _1361 = -1; _1361 <= 1; ) + _1325 = _1324; + for (int _1343 = -1; _1343 <= 1; ) { - _1343 += shadowTexture.sample_compare(shadowSampler, (_1238 + (float2(float(_1345), float(_1361)) * _1325)), _1220.z - _1333, level(0.0)); - _1361++; + _1325 += shadowTexture.sample_compare(shadowSampler, (_1220 + (float2(float(_1327), float(_1343)) * _1307)), _1202.z - _1315, level(0.0)); + _1343++; continue; } } - _1419 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1191) * mix(1.0, _1342 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1401 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173) * mix(1.0, _1324 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1445; - if (blockBuffer._m0[_754].IsFullbright != 0u) + float3 _1427; + if (blockBuffer._m0[_746].IsFullbright != 0u) { - _1445 = _868; + _1427 = _854; } else { - _1445 = _868 * (((_941 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1419)); + _1427 = _854 * (((_925 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1401)); } - float3 _1452 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_1445, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1452.y, length(float2(_1452.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _1434 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_1427, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1434.y, length(float2(_1434.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index d038133c85ef35a91f3e944269119b1eaaa59ffe..f08b23a024e260c30bde49537de1fc5aac8e4060 100644 GIT binary patch literal 53880 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�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 TCA>RRUpEN{{a2CPMf86FRS7`Q diff --git a/shaders/bin/opaque.vert.msl b/shaders/bin/opaque.vert.msl index de26c719..c4191471 100644 --- a/shaders/bin/opaque.vert.msl +++ b/shaders/bin/opaque.vert.msl @@ -59,9 +59,9 @@ struct type_UniformBuffer_2 int2 ChunkPosition; }; -constant float4 _297 = {}; +constant float4 _295 = {}; -constant spvUnsafeArray _296 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); +constant spvUnsafeArray _294 = spvUnsafeArray({ 0.4000000059604644775390625, 0.60000002384185791015625, 0.800000011920928955078125, 1.0 }); struct main0_out { @@ -80,15 +80,15 @@ struct main0_in vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - float3 _409 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _411 = float4(_409.x, _409.y, _409.z, _297.w); - float4 _427 = UniformBuffer_1.View * float4(_409, 1.0); - _411.w = _427.z; - out.gl_Position = UniformBuffer.Proj * _427; - out.out_var_TEXCOORD0 = _411; + float3 _407 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _409 = float4(_407.x, _407.y, _407.z, _295.w); + float4 _425 = UniformBuffer_1.View * float4(_407, 1.0); + _409.w = _425.z; + out.gl_Position = UniformBuffer.Proj * _425; + out.out_var_TEXCOORD0 = _409; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _296[(in.in_var_TEXCOORD0 >> 8u) & 3u]; + out.out_var_TEXCOORD3 = _294[(in.in_var_TEXCOORD0 >> 8u) & 3u]; return out; } diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index 047bb5df1a21fa510d0f0851ea25bed402572f63..3e7dbc58bb2ff434732d8525af7ca602b97d23b7 100644 GIT binary patch literal 20996 zcmcgy33yybksjYh$Z_sCBu-xJ#2H!A=(OzEmTg(KVqwK{EZg|NC?n~~nrJj5=8z>j zUYrC%SP1uhCa@diex8IIcdR5hbRaaM6 zAM>nvb5|}(B<3U%iPI9-&cy?tGZJ%+rYf;G(YJel|IQtI`g8eQe=!_O=SrEu{!DH- z58Pw%kCwagxjxsF>KjQ9g@x3%aG-p&8?aPUVwM4x z&_WP`LhpPoO*{tA&h-uZieaJHaBVuBD>jT5^4ErgrDDTCHa|F8Y$%#;iw*hl^pneB zY9cI@XnT61>e1V#QVqqzV8cXyGR&qjxk1=JU?N?a8O{xb!@>UE1KWH0yLWX~t%R7# zg-R2tI(qxJcJJ*Anj_7&?mgQ(_jdR0vJEX!!`7bO&Yf1dCQ=^o6$hE8-A(ySn)Hn7QyLHi?61g{NjLSqnuysD#bXOK)b1sgX; zF$eWQQw)l;q_MHqfVgZ_LJn0xTrMgh`zjzV6P1wt z6%bo&H5O8}GRzHShO4l4<|nGL_J*_hG?t=~m*82>x4e@9PW&yuLBE0jyB8XAI;Qfa)nzMNDb!48nT&z;!w6e zUpU&(x2>n&_A*$=7mE#MEI@j|8)ZirPo(#76E#8%AYb4uM^>?&uo1BJ}dk&;$pZU)2R;kF|is!nd0G4hsR zbXUGGmd+LrH#Hs!+Lu(FSYo;}<7!EAIKy@BcN6%arfyb1{fq!A#RI+h9*ot)0aWi6 z=6kRJr8B}`@U@VXgtU*DKoGhC;B&k*&a0U$jB z^F3JSj|fmO--EK{3)BCq>&fL*CF=RB$=tgQ>c;CGu- zLkC=oX~gffP7M#hwHa6V-R#srz%dkH@LSMu0yJ#E;CJH^>@M8M>|S_fSnB9any}5? zswUb~X4*JAdJnf^4ucbosaCU1w3*-Q@SDk_V{V9ruv9MOf>FSe#%r)?6Axy4A*l&g zQQ*mX1O_J=j0pg-Y|9jIbHpN>F(l_V_8A}GvFljJ9{di>zO9|RJ$#yLeQ9FE@pS;( zbCu0rOMsANTc~tekqEav$8pQ;iH_~%p)QD9<=VtndvDOKa$jPry)xAJgGB9xlPaD% zdt3$PJ|54oN&1jv9MfvrQ*x38n}fz+J%;axkAS z45`rKXxt1~bTZC{T>Us+d;ihdkSiiv?bRpBhRr(rwfm3i_0c9|_OVC93~Fb{TO0D$ zSed2h^b~~MWZ9LbWxFyhwVUiZt)m21h}8L zMeD9YJ-o<7+lDEs&U`jsaO3CY=z!u6D*g~%f!uCna4`6Jd1}joF}&OV?qfE>7h)y2uRXkQZ}enLE~gsSEKpV zaHno=^(|YhQ`zd`aacbG>TG-JpfHDOf?9Knz{90=y3f3%+jxnb*GIFLnw&cBn*~D| zWIs0;a-?DIXlW#A{YVNq+{|#0jBuOUW#HFcC)`GJ^&fVrq{)dmSrqYop_Iv$L)ASF zDz@Ark- zEl78~VXzk?rwT|^a$2q0O6}@0wc1#NEvb3U8ZNqceysV?S`L zf;G z9OE*;Yk;J&sdGr#tX*1R5oY_a=}E#G?2>EttyD!0WYRpGk;2BtmSJ;%^6eCYPP&|% z;N9+Nt9T+)%nW3*SeDjOt{%Kca2S(N*Eemz6Gh1Xf) zL|cR%wXKRS{BH(=uRM0_RjnBpHoZkS-^wd*4~21)*t#IrOLX+@jQ&@Zg^|Y2yl;vf zV*{BmSF#(o8HhXhYAU~k+QZP>@w@UzlXmcv@h#ScHkQd@OE{LCG-shbdzASvosDl7?k6jr(15atH^_&?N7Xqj(XEL!LVwo{+4S8@!oD7h+vt z;x?Y(`y{?t*mvGb_+L%tJ@@H&Vi|Yz8hIZ6Kh1s?;eWZ#1dEpz26q;C^KBQ;Mfjhu zv+;!8UiTH&=+3b^*{-3RmpB(XEIjc4N}LBiem%{i#s9wXHMw~+Jvd;#(ggc*8J@rP z3l0vILUMs97` zfd}Frc76N%MN(zd8ayFi$PP(Mh5xwNngf|g1!%Hva(N5~dqX~J@3-cB@PlnuUE*z) z^3vj7-`nT|{vT@6j6TRP2k}%oK;Defx>~$v5)SAJHR54hT8oy>Z13S6xc7kj=Dn^g_HLmccRAf$uBkBub zF<&kWhV|(}Aw31SX&vHUCbUnKv!m%;{W1JkV7*0|z7{4{;aO4dM!zU=Ii97d@i0}f zl`_7Ci6q)QwaH-(^ekgMjJz687MGP5CThXxmujM~6TN#iCi;5O%cK|ScR?aWeFb)2 zqJg^I8Pm=`z>xot1PhBri6%T}8qY$svW*{!bpgiM4A~ze{j@+on;*9EBRQa-R>(8? zSp)sdeikLz#*aTQ^w$RcO#b-yB$-@lB3(#Dn?HRpX8w%{YI0g5+xWL9ejD?_HvUbD z-^RSKjeo1+w{iRna9*#)lV|<{tSkLDFIPh5-@MqrhQZknEc@X9i?fYm;JV|7GUL`V zW2MZ$!C^aXDYFmCjEOS+P-d)Le}bpX^~n$0IXAkUGTQ~uT>50&qo1!iJ$017j^`YZ zt)=;iZ-8h183%nmgePO9FXF$6C)=r~{9jHM`)@g!HW#A(zwso`Iywtp*5N6+*$IA& zl6$~+C>htY#8xHm2G4t-*!O`yQ^^OwA6D`~@K01S`SX>04S4z#e`)ZXKaoelpHea} zGu28S1JApr;K#u;nIh*QUZC2G;J2vuW00>=@&sg_k79ou{3+Fb9ptlB`}N>2QSwv4 zuT=6);8!U5X7Fbz`8nX1DEYbI`S+*N|BJwL;zfQTM4s0ozZyKxMUig<&-U(&iTZ0i_--oPg=Le9v_elE>!C$H5AAxUH z@{hr90MY+X@T7mPAF=-__{)@h2l%9te+Hg=so;MOewC7c0sbN-{}Ox(#QuJT=OWNM zKw|%E@Ruw3H{ctU{9EufN`5=|)k^*y_%oFJd+>Xd{0H#dE2O_ag6~xFpTM)8rTx#~ zSzjXm1^n$w{ww&WDEV*T?^N>N!QZ9ie}F%t;f&b^W2<62k*9es+t7&3i|{1|5=ausCy z6#21`W$n^mHRLMQz67%DEo?sxvg~D)mqM1kfb!{(Wvx>_1M*TlrN1*FOTO8D7G$YM z%4b79Q{m5nEPD^z&xL%pYCjJ$_X_d94Dz{3J|FUVN`4&VWlFvPvh3~je<9?@srKcN zWiMv?MUXF4?H5B{uH*o+tY_jcfqb!QUjaE#@=C~;DEU&zE0la0t<%2}Jy6kYKieXFJyb>!Jg+71U{D+s8KW#IR1cfapi;w}TgZ))DQyK-PY-iQ`I# zS&S!rZvoLx#;^lCeQ*q{J=UA}?*`8{l8k|PJBHJY|Hr#_))i}${SmVhL>u~Gjk50^ zkodj|JpHo%h-Vw|^jD34%;7E&F{~-pHFH61FK9Q2KCT8;V-*p<2PAmbJ;y1r^ns^u z=8yfz`1gXR4cGk^5ckV!taAF>4`SP55aTD-=FX1&36R;&v6F~re+NMR*tze@*bjlH zos6Ar#M7UQpreh9g)z%mp5)qOEX3-u^t*PBgK-hhv0MZ4 z$C8Fl#xek2kA-c-)1QoG&|&8zr@?Rw)P{C#rGEQ#K?Fuu8r$`8HiZgb1c__7~?3& z#$#(U3z`0C!#z`M#=z5tc;6-mo!BsUtUvaX2hnC6v=gNJc`{_N;oi$RrcD9FzKWm@ zkhUp77MlyfZvoM!44MEP1I0FHnYA$q9c`*W%R$T|ZKgn6lgu&o$3g6iIb#kuCdSA< zC7&n2OaD6N>!3dgVm{;kmzw_n&DpU3i$Kyp*SYjhz1Xo2Sqo1A&;AyJ7#qhzf7RFl z*Wq~z#CEQQi$TP5Z1lx`IJPrDw7niAb#()H+Hw65&o<&ufn-m+5j-)R&j7?4CibZy zj+H((fdv0F@PfYtJYyyPCJ<{N#@jl3I&^|x0iNR`z5{eK=oE>F zx%hY2#$0eM5i9;?&V^k+&vbSR@f-r}1Ic_p%e6fg&s88|>GKv4bHMqI>)Ouuv!P>* zobSs)?3*^v0X-MQIiX(c*oTbadEjZwGb9P3FW;8>HV|t^>g4(0X~()90mXT^*F?ieaJXo;%sFc^u_+PEyvO7bdv9v zLS~oG(M$OmT87GsVe1B+i#RTZxmt7^k*noXsGcZ(B33fXqG@fVgkH z5+v*3Rp8mibyEu>b_eLypqoM6Anoflkj2*#@LeGBb*pQmuR0L1^mQBPwIJWu>!8!V zY(Msn@*l2^zUo25(pLv)CSR|IUi)ILNL+7lZS<7_5ldg((<*)0zTXHveG%UP+5#e; z@p12r$6@hrf==*_;J1K?za3PGw`cI1p(lP6#C?Ek>{8HWAlWJKTlP?E=yNded%evevbS&@l&$P4h>_wmmb&SJ&gF#!)=es$<9PltwV|-sHn1dch^2~R5 zf;r@2B!_&jCz!(?M*8BrKEXWE!-yZg{}ap+4l82G}@I9em`aO*J;k!e@ zT;pLR9==Z$OxnXpUwp?Xm;nzXe)!%|FoPaO=8Nwl1vBJfq&5PD2|bL=7vEWmpJ5Lp zbFo5Uj(QmBi|;nY&xnT+KbI;@#>2?E;5*QE+@0>hTDunfJUqqksIqywYv-E0*I?}Z zYGAH^zp66#uB@{?3hXfGsgAD4^Shu9+|Ry;=NNEpc+w|{v3v&4JoIeKLw*P3CzA(N z;~O6Dbp`PFF?UYw|NGGW03`m40EvI@+2X$pJ=?_pG4Rxh|4H!pndW~Cx*vjeBmVc| zIRy}7dpCIc$RXbEfIk7AZQ}1b@c5bLk99$Ra%Vj0aLb{)5kx=Cx%l}v&kyg^q}xD0 zGB|s;e2Vfj2tDW4`my)cK{am!Xn%{bwYfc|`r!Tl_l~Z^^ADiAaSvy`Tn`-mo&+!P z-7t&o&A|K-bdR&W5jfg^9=dTi$4`Syz4*EbJbp~hbR5jrpFk4F(*a@}w?HShH_u|r z+W0d_;&=vdw0{6PiQ}1&sTW_*0*{|*ag0Lu7m&np3qXux3OccU_AIu41?F!ciQ_rI z(O&1{d620WU(W}RpJ{Pi3*FyAQj;$Lh`HoA=tI5>4XHW50eJEILSXO{)uz{>|Q*JU5B%~9&=5*mjK6@XfL)e1&^O;eR4gp&tANheGt!=0dzTtKITJS z09pvr`_wDYh9C1j@o9L{hP7_*Xtt(b=`gY%{S@t_yrT|y{t5V30mt_vvKM_B{A-}2 zUShv>7GHM&`!mqh@WnmrHsBaHKcah`(@`zD*E=1iC+g!3&=KRudp&fl;obO_%ly0% zAofGQ^z$C*B+fTM#?Le#tWU0?=ORw}xE&z+;W)+i&EWAf%{Jbz?0xGk4#)k9xu-AY zp7|4BZ}oir9BrgufPM**Jlp{s?R6gBHj6FepzR)11IO@o;Aqde*R}CZXD{&)=hw!& z97b~eYxpDiwefD?_)bdK#(SZoUdH;qS$r|)zX3_k-wzzeN_(;Wz$~^LD{bXm{-DFj znCQ#T`G-7TtW6Tn;ollx_MEs=`8o_e_b>XAcQm2eGY&!jR?}wJ)Lp6%?$7^l#B+js zz3hu029ACU(8*XoGK=la!2A;=`{GA|qkTJcvOj+uGWFu?Zt(aqwW{Oz7j$fpI6eWM zag?DJ+fPEq&otXPP|gKO9G?PDdmYC;kf|46p8=1bX}-8W&qKp*tha~2-wU2&puOzP z!z#}=03$v>3k-gubtv;F^)EH?Ifs*)U>}@E`yJHI*L|KZ)&YsW#z5lhe$SWGg#E5+ zeSO~Z#dmZh*165Et*-}^uRUlJUs7L3)wr)h``bV=_AjVDIIq2qc*i4c!b<1+xK+T3 z%@;iz)*e#**nQ zdA804Re|P#5EOdnby4gDT)S5{?kc46g~mh4WVX;ap3fah4HgTH1DV|5XrZxSx-B&3 z#**9A6F5olKk3gLBuOvBg$vA=S%L*`f4sHP+7DSPjU!Q5D5 zCOuFX$~5Hi2OIk~Ztb_d4CZr%LSwp6D5VOGEzQmFiQOPm8cGFA{XJso!s><9g<=xB zVlbG?7K(uxa4@=QypYc1vO!1ClxS*d9$r%!wml6*YofWWdBw#o?JEc)Fkc!h1{=7w zEv!DeusXnpi3@rPedGCbF$Gwt+mbBw4kEllI+ykI+>CRFwX&zMxs=Ha_6Oksa>(}AEPjLnR>HO`?9*Sp`%;Dg$F8)yYULq!0U z;(^|L560?=0IGKj^F3IA@>3ZQM3MY|0iGc3-KBxl_FN%d#2gp)ud0yyhNi@d;d=GE zLex(MfbDO$9QJYO-l-1JX7IbUbpquK0=K7!oahl()Zh5Y#58CR3 zmGuD_{BCz@=zwcAjrhINso?>*cH;`aTbvpQIEDfYehV5-fQAhi{BDx%#qN`rq>5d= zaTB&Vch!b_N~KM;t9O4J<}f(glxQ>CM7#OD3cr~=CWPB!K2!H}Vl z6(f$03Tvv5Rae^$H9*L+EtESgON85fBj<9mqGNlos1Kr6Ia0CJo+)&zoTb=mj}x{2 zAW?g%Nfl4My_E&#tRBs`L#yf8D!XJq23*I#_E5YsLq;t`37>3`gyStnJ#Q0aoT(*q`R)vy~qcN{~+urAq}s;s%qj zL0uR$O>W-YWInarsax87%U0`D$}Jj)^|PnmwkP%qv#&O&Gp7h#Tw165%t^Y9m(Y1b zID3i7sUyBwFqB62vx6y)G?hJA9En>$l0ptQJsiYCTxW+2{Hm*jTWcN*hFvOYax_X7 zMLbIs)7g?7^r^y)iWh#|%$m5v%@F~)5jBQEPK$oqP_DQY$U+jg$Ye1Uha9)X>2eqP ztMx}@ZT~MqcgrDtBsH`#N@o<4=o($VYHdM>Ll2V0Vk%q0QZG>u42}Tt*=TT`v`4d zZ4SoOtpf^VN!WccT%~dhWk0rqW2Vh!5vwnqgI{}m(GT%B_=HQLL9b7pnc7<3;}a{J zR!ZS9EbCO_u?2ZFs>`y7tlG`JosWPoKyrt}t*|2)D`n#T6t%^p%ya358%4P_ch8^^ zTTPkIguIS0J+=g;3FN?oOirO(&Euin#9f(|CK6KsyVXv~HE`q*CvmUhWCqx0jo4|i zR-7ttoeH8>ulpkkIjzZBO}_`~)bgg&XGV>2lvT=dY-pHvR}FRs%!%c2dZ;)e91H1-^8=HEEl+D_u6&9&XA2vNnSfgEXExwhi$boc{H)o`4ihJV$UClTbG_ufY{X$t%tewo5_KkO<6= zK}-qaXtKk(gw*@hb_BN$ z4&9B*u2Iz`O8DY%i?E}%Rk0a==|J%1w;g*_Yr%m{PrUQ3yz=yrA2*4u4`9r9^8G1YZ=G?)!9sFc;iglrlrL)))4#y|W zz0lr!Tkv+L);^ZAG^5*xdC=$^o$BT-*Sc&CPh8>NUd)Y${75dJK9b8yls1YX){X2# z*a=h}53%Un+01}j!VN2datMu%VB=C|$;|jj5|;5K&UY>GA>3$&CV7q=#YbZsQ5QkKw_>z7Jo>KSP;!;3wgVW!%+kb0)w>Ip+1Mv^LzTN#IsWNH{o|VgIhNPv;e^hKOflQ9EO9vA(ye| zTXTQ#gKbe=;%%1l(u%rUgE_I$2mJeL+>Aa*GY8RBIzY~h(z-*(*b;Oeu^!CGTjOQv z)A%+9EkBldtVm^pMXB*I!x`Ag?XVMM(@{2h%&&2U zH>Emb7UQ-d>xz4h-7gkn?Mv3cVn3J{I}_KkDKYx0*fVgIFu?*lH+B}TCN3k-iJgrr zH!Zd;0pDxN#>(eFHYH}Tb7SY?Du35!zX9a3xplbnaJ6w;KT9E-0lM~OxE{_Y$H!B7 z^jj4>AM!xk%I4-(trvrZ?yT4axCRZIOq~Y}J?7?)e-j8Ab_NrL{`UT+prJ6H&QAml z!-esQhG8r!JV!L-Q-xe9KbUGr=JUxZz)kBA|7)RRqLdj;W*ZLU&x8#YW%`;IyAap1 zdN=y{v5RmmPK~D$Wm_rZn-`0t%~P8k)L3Xabu@WpS=Es_Gtu&r_Xk{Be5^EL4*aF!fBmJ~O zKa(G}@gq5)pEk&q{H%b!vY+`ew(;Z73;nf2U&$Z;*Cd@yOeFJ(aPy}R#?1deK}}9; zWE=l4#cyLi*v9`?@!Oaew(|L>ALbIs{C^nxpE9`j1Is@6 zH*>ae3|x2oP-fg(W~`L?|2b@@EoJsWnK4nOAIglC>re2Mxjy+}JLg8XQ)av1nQPrn zneFUv3!;;{;hN@0>lho)MO)C1;5c@UnX>qhn$bQ)r+tV{d{7o2QZM3zeNe~t)4|_` zYXGW4Eacw}%AIoEYLVXq`SC?P>qUMqWPU`x+epXPodNszfu|4VxE|F*`TZc;kcbt# z4}g!wj^8J^4?+?g+eH5%@U)XQ(cc3dalZaurxP2&f7t28M&kGg^!S8v+y{X=A;EnV zI(*iNzmGxqC`fRk|G3jjo9I8`u)hA2PES8<6a1%~?CU@6^u&?`e?NG^Qhyre<1@Gh zAbvOw%H2kaS>&6*FH-X7!T(FiN5Jzr zLhuFfJPU|C0iNdp%B=M-fF64A!A_CC2>I2oI&+=KUo!1mjm-RC4&q)U{<^>iO1=&J z`5>;RM{#8z9N%L6ehgRYD4&BYG~-HL0L_PC2s}4LCH9tnR*udcF2oWdms2yl)MN0vz5FT`~fAi?Mx+K0se9& zC&BMf@+kP@O6FmvM#*E~dDfKp#=$e0B3}t{JxJsnc%DN=E`ndL@RN|QQ1W5Oyk83b zDEQ;5{TSq@tM+TbpQq&O!7o$t4d9n5`9|=kD*0yc{GT@I@1@{RQ1Y$dSqRd83q;<( zMSdOll}dgCc%I{={f*#H1D%Ho`VOwT7QPFaXF=B7_i$zXvd+Zz``{ZvthpcHiZBdD z+J6XH`}+}O?oHDEWAK+K`6u98l>AfhYe4k>GhFHaF_75*9Q*}Jz7u?0$-e;Kq2ynJ zzfj4)0)LK@e+@nXVt>EEbw21Wko5Ok@E0lhci@|p{Cn`VN`4pk-0VNAO%P z;{Q+Jo0a@$@T_lX{|or5l>ArlZ&mW&z&}^Xe+Pe$lK%nzUM2q%{BxAdJ$aXsW3ys0 zu2<=Q7UY|hJR9;JCC`EUdL_?=e7lmXAa7LiJjf?0c|PRTkk=sp+*?@-oO8+p7%&;{}y=8x5(Tx7dV;qumFzP{%sKR!L@J# zbo425HDvk}`DxBZBHvh3ZI&xL%J!UvGgR`Pj}mneBDWLeL&Uk3SH)qXzYK*<+CK2OOPLSCxm ziy$w9T#uRmHm-5VU%>T?pf7>$2F*gnJc?^A+G)nLqX;#!9XF+B=$4(-i z{p|tyW9L3BW8Vj!b~1Lh5l??Imi^#~;n?+9==<3qV*RlkfQ~jY7RD@Nd5&w7u@I}r z((l?i4#q`1$8rV8A4?KC8Os28Jr=eRPk%C&L5K0jas~7p3$f8y?D`pkj(%r@xF>ai zh_SV8*G395F&r=PcD%N2*tM~)PXKWrlb8>>Hrg^)`X%1hwY49CEWX!+Cq~ATc5Phm zi$TQFo?|%#VvM688;`Bc3}pJF4fjm383Run;(ePebYjEYvHsXk4n&)A(3K$FPad+^ zaPQ?D)20AoUqw(CNZXVki_O{K*Mn#?0Xhtt1VuKdnzb80O&@~|X zXI!!ez7RZZBp=Lyf~kM zX~()90Y!PUxqi88=QwIX#M3Xwa0`gzxD~`YsllC%h+x=d00HDNc^1Qk?8V;(U#>l{o2(acWz}*#cth zQiuNmo_$t$(S|eZ3yC_&NZ7Ge~^h?%L?99`t$; zeZ2wnMv(98KcUmUY(Msl@+Q|tUkxB)>FZihC13vqz4pagk+|OM+UP3*B9^{5zH(o- z@3%ltU&J?p)`N&=e8)i1I4u6H&Pi1T$FNZQ^3UfS;T+TN+!-sRfb-T8YqWPZK_`ZG=d%i)C2fP98q3Eg~94et6} zPXhq6k265FZ+nKXgOd6YkeuNM9d@zN*)v|f!<`M?HW2-Ci_Fe zwJm{;xqUat+FIX@s-1K7p0M5Kw@I~g?%(g)AHY@aDa{_{gAVgKg=z6HA99!n6{gk0 z+~Y70DNLJ(xz}MHR+tqY=EDxdXK9JK-NT3qG3>ZF#3+Cb(Fnl%_ z%xZ<ASPdbdw^EwanDTmQ{UhiQ( z?JzpeT^{CshtYZ7pfIm&t?xJ^`rB1iHE6F zhg%ee_m6Hjc0H~h57Xf=dR))+Fg(j}o$GO3>S3fWJ+7@DM*Qe;UFKmnxW4qfZ}Tv` zk24-U@4X(T(_!?yZ}%{FIE-FjmwOoLORujT9!C7|eVDAlJ`cnDF=OUCGQsThFcPzU zZ)W$*T^>gA%y((xXSauu9P<5|V4me+q%Xd66U-hDBYyZEPB42tjEtS{<^;3P!$^(s zeVt(Tdl<PJ6hFfrMrvcJ!W{H4 zGGBaWDSk#gjLgOP3X}FQ(ih)til0LsM*Q%7r(i}sjI0a31MR@s=`&bs8Sry(6`L_- z^8(k-HTi(S*z?uUZ2x>!ZO&a;XUj9;Fz9+m*W&tpP#4Z;KfpBy9G|P`lf+m)i|dup zvn>btF31J&)Yae#kLS7~czn&7Q~UoRbUy-#{}MprpL@3WKMXzF#Qzj{>csyM@c2&i zKL*{8LE91k`*1x95Mz5Uc>2g9-tU1w2A*x=?`rV)PV>jQpg%b?KG)%vK=(Wl{V?a^ z=eXzRHnfqx3;Kz{*|X&}%FiJ5oLlS1o?BCD-UiVAc4KREd#&nY3-o_B# zK#b!i=*0GgGuW~={sNLXUIZNNKM$S6@nXo-i?5r&<2x;mQRw~(k~m%h5aT!ko!H(y zgYDmd`8!DBcqwqS*ZFuEWa`D&%faJ2EsjIb{R1R5c?&?yCC5P@@+>s0=KMO~#qX`a z;2YMa)YMO*BXNze)?Wb->rw1pIfGr7v%3a!O}keC$Czj@wyy?{@3cO-9@u9u-pW3T z>uUh21<}V`$W@?uAiYoBhBkc7`^4wtN*mU?J)_y0eyzjEe)My+lX8x_;Q43ZUk4oD zk30b4Uhx>Nw?jw0#QugEeBBA`FF=>W7x%0;0>`-d5#5`dj%v}p+37GnVIOaSju=1Q zYoTKeZ^u(E^Yd1K*bn{E&)v{ToOeLRcbX5@C)d!;h?73v1`z#loMQWS@c2%%jrJ>h z-g<|_EdiFfr!VH7`4eAvdcJ;%Hqx&^zXnMj-U%G-bspX|gDvBr?G97}$8Z;LwCCLG z+IWw%m-vYDYva8RBf0)9{E__HxEnaWlhU>Ee(0!|v3_6%U(EUMK$7zh0>`n^UTi-! zgDuBOTe&aa<8U%2`toyrujh-kN#cF@_r{mKPkdPU+7CVVFZz;qGzZn5u@Cxpm^Qnn zKBD^I{`^lz$8hZh$-a0WaP(V%PR9Dt8Eko<_!mg_#g73;`wr-2fBpny>c!V5!Q*Rc zRmVZ)ERe+UDe#PA0$8#AG%*!yXG1v$Byrpip7uJ9&$1mPz8(ON@3c4$K{po-+p*rh z0seE~IR@Ix-aMl6toP;zfx$Oihcb^+|56hVIh@o4``|pPWr1Z4AT>+1{3*ABFaFR8Dz8uw*re46J-+wZlp-tU4ZaSf6Ff!0-^{{aG;*HQog diff --git a/shaders/bin/raycast.vert.msl b/shaders/bin/raycast.vert.msl index 9ca8f250..ce2050a9 100644 --- a/shaders/bin/raycast.vert.msl +++ b/shaders/bin/raycast.vert.msl @@ -54,8 +54,8 @@ struct type_UniformBuffer_1 int3 BlockPosition; }; -constant spvUnsafeArray _189 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _190 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _190 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _191 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -65,9 +65,9 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4 _254 = UniformBuffer.Transform * float4(_189[_190[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); - _254.z = 0.100000001490116119384765625; - out.gl_Position = _254; + float4 _255 = UniformBuffer.Transform * float4(_190[_191[gl_VertexIndex]] + (float3(UniformBuffer_1.BlockPosition) + float3(0.5)), 1.0); + _255.z = 0.100000001490116119384765625; + out.gl_Position = _255; return out; } diff --git a/shaders/bin/raycast.vert.spv b/shaders/bin/raycast.vert.spv index b0aa079465920f9ca6356c7b755bd51a0ad28313..48186ac2a3be92952d4fc383b8c1cf4847d089bf 100644 GIT binary patch delta 3738 zcmZ{l32c=`6ovl>ZK1UYQt<(;QY^@xE{~<5mQ7_*kxfYq!H7Vhu~KYHWf5NylvP;< zl?p1AO%VmGqKJa1QAse-#3+hJiJ&2hMvYqp^gHkUw+sefaysYSxpU{vo%>IhRGz-O zMbjpE&4M5j1i{6@(A_QSQX<>jwv>|-GUjFE@|#sQqdIp))wr3JWz|zl&Y6Z!sv0$U za`~*PvWgj=c|_IFS>@$-RF+MfUhSJ_Oevc@wQ54&i6t5HOI%@Un}(dU;_Ubww#@}S zf|NjfE~sd|u)pbf=%X!13^IK$T0hhC6RLJ#l=b()6{9KW8Kfn29IiEjd~IDVJP2yz z2h4E+(j05yX1^boLp5ZY}`G7-{ykO_W`i7ZCQX0VKx$SVj2 zTEL|U+04)E%R;-&nSFWad!Ak8S>XlIq%C*|ZqB~_;m|IdZ(oU4GG=eXm8?SN0{wIl z={^aS)NvW|f!fa;R>PZkx;I>RYV(EgR8JScQ#@S*r=uJFi{WXZR)4Gk9~?ehN`mpg zA##BwAiWmorwyea0e(U;bS|)jCc-m3eFMBX$YK4XjA~5T%)boY3FHLvl;AOlsvx7f zcpam%)QQ^iw~kRZ=_{ziRgALbVtJfViOHt5>lu}>swLm9jIzmh1EYLplYW9RqWjn8 zGCawsh1x6&*Y1p#aVdP7rw72NdwMYZa!(J3*Lr#=yrrjy!81YJHn<+q!gII@eyOKN z!P|IxEIjJzo8gyvdOWyz076hJ4Eeg!Ci=~v+jYI-l+9wGU^2GYFweQ<4R{;$KEd-@G{dN5f{b5SC* z{TLR5rC=FY4psm?!+LU8f}Yet@5KS2XH-40I^-IA1656xtO(mi$rm7qTu?@r-U?NST!+s#6oPaeD| z^r>+p3!;&G+|+`+$ZWT?Ag_()b~^~u z9(sQ=xdY7%#vohUgspkP_Ll2d*dg+^8_eH#+@!*6x1q3Ad@dgPPBXa;t$Y_~rCzUU zFb^c>(-ZUWp>19j(2J@0wIGulRE+n5@3R0cAN7>^97_7Q{G!xIl`D-!-Hk<=sfxJJ zeH6=bGefn=Ehy@MM}1LVVs?=`RMa74r;0k1YQ-X;`06Q({~_GZ!F<$b1L$Pca=#l9 z%TBlK*1Ee;cAh-I3bQ>h~$!_PrIp z1}L{u?r;_35uoqL{6B-6|1IIX{Oyj1Fsb<{7@e?ZsK!l#&)w=i(fB4zf`vN@w{U~t z+AbNcS>kH0@xl#cZZ^o|pS7;-3!t^rfEsys2t9s!j|S6R8yUX@IySN6jpzC*oUmYD zqc0R}81@FBV0!A00o{ext44bEzX7sa4X!1SV*RHE!STSY>C-;GIpLaY-xF}Ts(r@* zg-V`3dB$(in%5bJfUP06F$zj+3*&b{Z>ri_X{~2G31qJb)BHYZi#HbV2MqrgT>o+w z5M1Xw1+-YtnAPh?_=VOMV)xhngw~-HBYEk0LGUxeKee3vQ~%-)_KUjXeOq<@m6@sb?!8Kg1ahQw;tE8rQn$ delta 3765 zcmZ{ldyv*+6vuzR+O~`L)zr#cZP{(Mv{bXV%95@~F?7RdOhziTtX8|5rQ5qiLa988 z61qpa-&~X2|6s-+#w|mx=lea+Ip;ag<@fBL)8^MEn>HzG z9z}5!MJGoW>_{%piMP6qIp3s{t!5@$74n;2HMPEQc-@$rYOCre^$UE%#@CIQFrj*S zT~*E06Z~VQjGtK35ITp~4V_+HeQj;kgvbWSGfh9 zk~?!N^V2ivtPu2waw74Wpr-BIb4<@dA8b8*km=cI{Y=lvsK$XQ^3!nDXbO5pxf$IE zSB{`q%exI8MUCnG7I-_-0ySv{Ejs; zA0eN?I=)*`Q8dsB-h+_O;>>@q_uH8H7x>tJ`L$&WgCZKVg!|wY9Qqe|zkH#8FCWK>qCsFO#J~4@s!Oe?J%3kV<&!>*eK;K}Um>1{v1&{{<*vl4VeOV;i?Q-4_7SXN z<&%CC8>=%-F2`e7C2F!fLeIon$Nk|`0zCk(hHZQ>ymO$3!5afT6y7?}7s3-DZ3Qku zB!hrU;im+81iW3KN5fNrz6^e9ps#?p4fNIUYXU9aQYT{#Ov0i4F+CA^GBAAu{H#D% z!}9`N1Md~+T6mWXnntUz+D+~9YOF4&cD;wrUt|sF1Qf6qs{kF1O}-A^J<#jn`f3!v z0jqP>Ia~Zjc>6#<4sQb#{{&X?xWJdNW*?%*MCC`vrO{{MarJe`rxotPY6tb{ zN$>VrUz!%6FJuoOKYRXi>;)=d0Z+kI)b!JEdvp~449E?}pM`5ui+>K@BGAvnxp2I$ zCuJJj2cI9g0mU89*2CG86|27&fF4Ml?){$2_6FJ?ZCZop4Q^p^ewmb_HCpMptYyhc ztAcF9t`CZz%WYN*9pU1VytvM7Dam(7N)pK~`0BtppxS*}l5)kR371pawZqML*sjc( z7GcYQq8i-b(o}ql8(Ufw-|A+U7Ij&L_XtO~AFIRJjqL`sH`2S@fzrHQ11Y9@DKHWw z*js%eF9P}X)|hXQi_7xj1Fl_JLHv^IQ&y0E*+)&nUI}zj6704ryaH4~uaUZ*33>t> ze-&=y)8Vs@jknC?zZQ(w!yEnhQfz_~WR3yR>j*2Npxb?rZj}#;-Z&v1`jrg?{dt85%&A!ZyuPExQ>u)*lz-@I?;p(a=JrAbrr-5eD zq3X8U#=Z-;tg&zh6yKjiUxIxP=mWF(_u&?QxgXCSRBq-V1~aH}e?{EPJ}u)9+_c`Q z^g6tPRr(Nal?K5zQ?^p`Or;?~rGbpy3KIOo)^#}ulsg&dLT~rb1GobW=3=hKegw2) zYF~G3Ngw+GEA|QczlvRme*%Pa69fI0O>BDr)RJcVnMa{CQ@<`n1<) z#|F5_nmD?z;1$_@ljurvSJq-V^TrDun{Q<2-sYW8|o?Z2ih;Y>k3RnG;JJ7d# zx1aHL2ezga@Lz!Z*2b?yrY@<$BaEWq8Q9-|YU*dcBXIdNulauWz9v|!_=hU?+Kfm4 z8AtNkEyw-|R8>`!H3wM6QDt-+jb|%ZOb^QV3n)t+Tjbx0Olyl2X&)!GC`bJsL$6XNu_sz!EI*|#v~_#7Q0O`^c#lVqRlW^Q$5-mvq1 cXnUgcI^_6hYbDo@TPtfA7fL*ivY1Nn4>AP5QUCw| diff --git a/shaders/bin/shadow.vert.json b/shaders/bin/shadow.vert.json index 2f29e06e..51723fc4 100644 --- a/shaders/bin/shadow.vert.json +++ b/shaders/bin/shadow.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 3 } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 3 } diff --git a/shaders/bin/shadow.vert.msl b/shaders/bin/shadow.vert.msl index 854c448a..c9562b8a 100644 --- a/shaders/bin/shadow.vert.msl +++ b/shaders/bin/shadow.vert.msl @@ -3,20 +3,6 @@ using namespace metal; -struct Block -{ - uint IsSprite; - uint HasOcclusion; - uint HasShadow; - uint IsFullbright; - uint Indices[6]; -}; - -struct type_StructuredBuffer_Block -{ - Block _m0[1]; -}; - struct type_UniformBuffer { float4x4 Proj; @@ -35,8 +21,6 @@ struct type_UniformBuffer_2 struct main0_out { float4 gl_Position [[position]]; - float gl_ClipDistance [[clip_distance]] [1]; - float gl_ClipDistance_0 [[user(clip0)]]; }; struct main0_in @@ -44,13 +28,10 @@ struct main0_in uint in_var_TEXCOORD0 [[attribute(0)]]; }; -vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]]) +vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) { main0_out out = {}; - uint _415 = (in.in_var_TEXCOORD0 >> 3u) & 31u; out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); - out.gl_ClipDistance[0u] = (blockBuffer._m0[_415].HasShadow != 0u) ? 1.0 : (-1.0); - out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; } diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index f9314da66221da5f2612f531a414dc4c37e52da4..5740262af1d3daea614401b32838e66a91455833 100644 GIT binary patch literal 17460 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 literal 21328 zcmcgy33yz^ksfTz1|eZCa~qy*AR|i}jSe69mL&@djAbm_@exNFNl((C(Tp;0MwV<|(N5JCvK53(eiWm!V9*=#mT2v-PUSwb!#1PG85a^H8t{(pDZdp$jp!+zg>J65@? zs{g94uCDIa^Q4(G7R`ypj*7)%$HflJK!eW-u^CFk)`MIbJ37|AWk=7&8@KjkbJ?E2 zA5CQo>HeN{b})zjWATq3Hs`Y4rYq4soEq@+iFUuQIMfMPqA{5S1f$GkqwsU#mmdy0 zno4KMvv(G#0yHN!H#Qq>+lq$mfu9c=E=#4dLBm)+cbVT`2pak_x&D!$Ay7l-L&LO?&6o4Q<;xyEf~N=CEV^rmnV&wQ@%7zASxKJ1iRx~sWr3=HwzC?d+v>}u33kEXvx%^N=cl)LuJxYH* z7X%IIASn7lLsMfTd}8-!iUYp4&^;3tR##S6289$(KCeHQ4GP|1CYLIBBOAtobS9Ve zR(r`rGTAt|a%$L?G!V^+#+Jq<7c?zhLKuPhVt>I~&!eom@<4T^hYu6ybq3vI`EjR$6>hUPvN@L@ zO=W^Tjmf><>M%An=jJ%4I#_4^Zv^kv)agK{0Mt(jpi(^0o9jVY9SLBKu3@eR4Y2%7 z4e+8!{=Wc6NPAnc&)<>@(gmz>uxI%cxvx(qmJHTe|4$M1D*+%q0&_iR=YJPq!CViP zEf;4=+45?D^}p-Ea&CF}JDHQBT{=bHFjiP`Q zt=TDNtqzG1R!gVZ(9I>2PS$yibzT$VRR1@d?YX4RYpL^=)p=m>|5Brd4!CC3iT{@w zH9P>fRJp?cO-2m_976#H{|g#UfQAhi{GXKLMW2%w`i0i6xC&d{vueUKWvWB9wQElc z*3dhUOth$DVyXInIsRwzm=GR|dB0H1XT1@?y}#bvKVz zSS5WxGLB_c{Rw%-d279-w}MlQRz=rH=`tHDQ}3a_aBbD>o9JhoKhdAdEgJ2eW{8q}9B}|Sxy7T`;OQHRbxqpD zyG(d&sG@4iWpa5le_oq*TKq1H-wpmCsM^|3?die6V&E&U@ose!E9U)y^~J$KKfg+; z*LWF@8Pw@ZnG)J^#cZKY-~L*>G4rf8ie@jX?oCk^%TG64uDS*X1HXWcU^c8gd7AJ< zR*wMI77w^`Yi~qF23sD4D;3HVAikKUGAbkGp5@Uejt6sjPcJ<0rOB0E+FPY3tL6u} zwic6M3WRu8Sx04vo7d(vEd_VS}b@$#vGbTI%Vt}qE5)cIa=qN5|JJ~ce4n_67U zX6;nUEt-e+v$Ib3Cw2+5yT+?kw+J*Qt>r#*l5XWCbY35>USeW$ziZ|Vq>=q>zt5Ta z*`dO4T>Fs}a=Ph3FCOC7td@yiez|a~)YpPRlS-N#h>}GS-z5s^Y*8-yRN+Czh99%C zD(>)bL_lUn4PlUF(Qh8e6*d7Gr0|GL75q5lxGqkUyU<^aJ0orTe-XOb4(a{=Kzo$V zC??T0n0(dff)1zdr3wWc?wXPA=)mA8 zN>1dFsCZee>PqeCP_>$@!I9LoWC=H2v_9H=Xj*fYyE0#X1oOUW%=KPT=8a3Iw6}IV zo(?J)Z?UJBZ?T;_6SAo+c>+e~#bR@;0H>}=dK=?G(Ot}L;t?3fBNc_@H?^-)eQP`% z{8ZF=-Ko*BjGu4IjgF=A=>V?*@h#a`M;Ce(x@DrpE9CL|4#&=DcvJ?(Y*>Rv=|R_- z#ggM2&}0al=8!FYxSIRbR43;8RKQ)#TG9126-a-DRj*VslUE!^4jjnD zB+6BNJ=BM|DbwP3ViI7p+bNk2&K%+do>g2-59h2B*J!L3Crf)Ly{Ok2e!qn*>(W-` z&p)tyeT=Qzg`WaFp8suL0u9 zrp_Scur_Ihg`erhp(hDz&|9v_wX!O*FP-AU87WLAn+Mecly9yuhq%eP3f`Qax{Als zLAo!U!M4M0ATap^c`qI1={7C)Bf0KYN?-cBe*vEoW&)j}P@l zqkCksjgMUIvN^nQg=c#qHx}~4xqNzmE-O*$CLcCu@lkS4;8Jih@GVM`gk(flhN8QhBbCpY##Ocd$o$~6vz_zoY<4GQz1vM z#{bdRdu)IHnyPltq7x1Df7)$m0N#w1vzfXPJ^0sHw zyc(3l`vi{Pw;a&Ns7exV6kG7CKvo>6`W1M>J1I4AV^r3ms~u^dkE>Ve3a`IhS2zQk zytd(Dc0^Vz^k?4kcV@?m&ezu+{EZ{Bvu(r9wyv(N?ffdQV=y*d#R81XuGP_c;vaV1 zJ9GPpfJ!$X6=s18E>=l^{9w-PTp|Zn$Su&swL=~B?G1&HTlj-8wBYUpI$zE-x zr;?CyV99F_>!?m~ECX{ImEV0#}cQHdadeQ2%&YxRv}1)g}}BgLE}lFx(uU0Fr! zH0&)22&~%Er=zt8(E3@iGr)AI<g`3f^Dwh*nJh8}kjWVL3d|6H{D@~N>gKMy|@vGXAJ zwJd9FT;6;ESm@4-osZV5-=ONxtM60~Yy6tutKa602R%!Bl3slQ2T zeHEBNPq2vQnAlRZN196o^0o{ZNx*E(jWR#>^K3Ropq_tE;y%;FhJP;-?lbUW z!@nJIpKY@d9sTidO62)g0o`)QcK#|bE(>$2TA&YAwCI<0uE3}(AiMQJKP!*mhkg7= z{m{=U$W!@Q4gJ*d%!#p&AGfCIZw>TQ`C|^!*~EA%p9mi}^ue{U{|4tm$jl{w@6MJo z{~m`jKa}ZQ^QMk>IMLCDI(09DhtGlMm^?#>;U3_J7=AVa zBRZb(7b2UK>6>_|sR$qG__s?OhduE zk8hy$K>TnXlrK_JB)3C8%Id!nJZnSno4|8DMeYF4^Frhe;AdI#2f(v7rN0yWY!Ksl z9IXeE@hCq5;)i(3PlD|JZ$h@?>4jVg690$5^PVH}5O{vq68S0cFI)1rz@KW#8^L>) zoCD9ZLhP>ue=g`O#CI23=8$tb+dRuC+eFNKWQ^wr&#AM)^IV|p!N=2RIUnk{XP!aJ zJ;NNHhX0>MOC4p}@;so9w%Wk2IQ37*!Xm3(ah&zceWQt+2p@;2}%Tk>EcqJn3oZFt@Cz*YdhmP~ zApUOxe}X074E`8Peh+vqzToeG$T}7I6X5GD`IF%1ffiuJe}I;2%^LV2TGjyTMr>aM z9|y7iUP8`ei?k5CC846#V)htqad@cB<>lIZ?oi?kgu@h zS&;9t$Dq@eD`6S5IXl4A9A{&|q)nML^&$j4jwQz6TqX8&oB zPqg|^hb(6R`_F(ZXDsD2A{;@wATO}wIOK(vTmyL#3_I)>wv|1Q(d^=8d+JYu$hXhR>YJ&t`T zNPP1dOTY6##Iuih`m2HkW9Jz}4A+|V%DBb%Ht@tUFSHZC+riU@IblsRCmdVnMCW}6 zWMa4niD$p$>($`dC;1{)=S$Cbr|IW>xkrd+OuInte0M`9aqR(5zcOF;5l??I-`9XA z#+@&H?*$PX%~$8>wb0Rq>&87QIqCu53*x*b2Qp3yIW1`az7JW6EB69eDa$1Y+&*%#!uZgJ&O! zV{n~_?*NH?0G|D{W!(`Yb1Q&nAJ>s*AF;GAg1DAkN6t^rO|ShpWU=A-NT0OX2bus8 zALaLWm5)j2Xv2K4&KN6gSYONs=Ry5`5XWL%97p0j0A9xAnaeez{pFxu5aW!-oU6t> z2%U_{b6LjR242RbUhFuA?8n!Gr|r=o#>4pOuL>su&xk8P>}P$=2NBPB4uLoh=Ti-$ zE&a=S9R^Q3))DdSBcA@M@Q=RV03wF@I2*)TBKArU^GhFk4K@CakOhAZ_#GhPuLAXe zBD_B1-vk};JgYnqW1v6gP-^DQ;E7?)5YKr?d{={KALCm9B9`M_1L_4G2HEkw1+w55 zf@dy?zZO&)pRTX#pcg!Ao_Qz!5a@c)6(IU&-Xz|)f~U>VAjY~DBx`j8c=mCv&IJ)G z{^+B8t@N4jHuTX>a&RMfsmHgQKJJ@WfrzEgn?SuF=F$i0yy<#;2W0xI1jRudn>ItB zn?a0&da>geGKY79r|pTL8W4TCw$!fyv9_g--vyp_84&k&lsBF0cbk6BV=;($`sKO| zfH;r$fb4m^7xGl|=!M>%huCopnaBH#t;~bII9@MEY&nlrAUzKq=ldaZOvYIYk~lvA ze!4h6h`y=f?0{azV!kC#jv;Y=$kALzelS0RBP{?YIuTAlhyO**5z#?=Q;xF1!X{^AU#+8 zJpCAC+Ejv00kwl@(+gt$nOExNdHP}S%+IYL#?LXUP(3^s{s}~1b3q9ZeXj%2pRALd zE4M*M>~Wx5K(v(_`DgI#W9}P3#Ii;h_g+vQME!CQV-%magQuP3=1SG4&+>mUeLP!} zAYvKU9iZz$oTu&UpihEaU;hf7?MsiNeSOOG(N`0Q zSo*paG?lM^gWmSl3t65YpEiB;)eIt*zBs>9UwZ6+hn~KOZvkxw5zqLxfueb6{AZvO z{1Whj=UGvT*U!WMFnHGA4Ir-Dd7$$_vSyzJPoJlQt^yqfN#B2hmp-l~`<7yLS!**u z{QLm)2S|$n6uVmRwDUn6msmNs>rCH#=s2IxgIcZrdaIxLxhL$`b4pnK%=ZJP{|U5m z7in-X4;svq7AEOnzGyJtv@neh<{^XO`w1DV$-#WdVEE2LFwG9;VT0j&48gQG81ch* z8-iIf4TkSK1haG+4BvqWX4y0tz84Y9atp&f@`#Dq&hrHh=23&O^Sr{reA!^^Jg;;x zj~R@e=T#2oD+Xidd9{Q2s=?TKUgKcCW-xZ1*E*Q58;qUjbr$AM^h=G|`Dt}9Qmb}; z);k!fF*`qP4n}I#&QH68k@~Uov%$ekRfioGhG#aP8?7LFUKctTKC_6i=e5zn+-NZN zygD6>jAhU3A_pUW?0H@6VECMB1=;Jq$-#6OjJ@ucIG7CvW3T&W2g9?MW7+$w%fZN4 z_Ws)9V8jpKMamw$)WPr>*b3tNNx^J&FcPzVXQ|K3ZU-ZI=6g)>v(3Rs4*70VFxwrB zjK%kzg4y9<#1G$r3g*=gM&{1zI zKYZ6Ln6!hDeNhAbYW&9G8`x`?fuDs|Y(^}b>r8(uT75pwR(GQS7aqXW`>eytwo>Uc z#&!t0*MY7v#JlE?K&|*j{$sSG!14PoeUcc<<7jixvo8nvZpg1A530hq2j0o@;PIor zciaAd0^LtR;y(aL{PWBf|3&E8C;s<=r%wD&fX7dn|DQqkbI=yVe?QtufEe4o;OQfa zcwYj406hD|-{s)(Q|6C#L4R^*JZNz9p}QJHKdq`?&-?YJU-Eht`h^UD1(|yB^(OH6Q8}~YV7}NPal9Ek<6ut2_G-xZDYIp59EA>v;~Ma^ ze+qhu<66kni?8dzLf@ztvO^?rD-kf zNH2nZsc?EfywCE}4ZXV`#;x3JML)j}O04g<#$X-JhD_=MKL@R>{|CU+FP}YP`$5R~ z3D-<)xn@VBL)QO8;AwwI+3NM$XT@|_>Ghm%0S-UmddZx*$9@Ci+4pO-9|mYSTAr)) z&$DkC_*=oVPh$KCc>I+4<66+)rDo556d>C2Bf5_n9o3?{&FBz*sJq?hW*XgHXzwt( zSr+b2=&0vM{C(2ss21I)jLsh8(?%y_@QnJ5(b;2s*61qGFVDKWpu>;)J-{2#a;~jt z^|MajE$?DV;xVF$;Y3eJx25eLUS3yv|$JRWs$%)Q`_wQyfHIC-x94s#_H4Yi^M ze+&LG;8vhz4p`66qWvm#)XSJ(o5q*;6klHlj_;^#Uynmaz4&@!8ecr4NUX=Z(LMcMXo`_*+2q z)ryw67hm5q7|Fw*&_|LQxE*u&Gvx0B$9=^+to)6{FOBW6rJF#Kp;o^Wy$xp~*XajP z(EdK~Ur<oXn5ow4z_{LH!=_C4;eJ v+;7FWCN>i@l-yLPzf=1WYV_3)r*svBXP=qAAo6UxO5JaK^i8^AdwG@iNOa^%*jvZt+ z0nvz{=uf0oqgG9TmPZg2Q4vG6K8n`1ww0o`QTwn{Uo&+^XLQEzyZ8LoBY)_^$N9eB z>zs4X`Q2T1b_f1j z%GJx;m!`fl&Hc%m1xuE+b*x!_%?iuhyk<^ETifE*%dcM6o{~UG#n94qDLEb-eW12v zAe`TfX(GTBr^q4S0$g*(h6dHQLZ2MooK<}rG(W1hda5%MLjLXGtT7ar>Xdl;4shlW zjMY2=cbv}rQ4PEkQUmE!`!;YUs!#2A!N#~#?c0q_b2R?v#;!U3Lh_FD3pns8EaYwo z+7!Ctdl=<787+7(1Z^6p_8wzbpW5#;v0t-ee&>Fx2%Vbn0JsL*_Fo!1ZMOYEXf8(W z6*!WIpd$c3+z55bQ@+mA5CeGKG++Vv5KA|J^GwyB057(59K6WV-Qc*vh4`O=mjGPQ z!x$rgnJ@1ddST#)6EL6;&;?QN0JtDtvYi-t$vELuOhdg3(0ibxE;b2Y1WswKX{{Rp8q32lNvA{0C>ila1i`rOFs(ETde-az<*@vL*SK` zejL2c(ucvv8SS0_6A+WFfG5Fg0k+#y7&imlg-&<`obL?PPlMN3`Y8DCE&UAmcp!y( z?3{A|)`QM_t;1f%ae4u}G4kay)Y2tJbHazg2Tsw)pjkuxzX8`56yu)-SVR5Kf%`8g zoIeA83k0oz=fU;D(EkEZYWZIT*OsLJB|tldn(bT$=!D0?^+M9m_8m@t-t6cV2<-p{ z@bPH}P`?Uj2T=b3FfHV5;E&L}usY$N!1Y2i{xx8f<^MA{TQsi;e}T{*Wx`(pz17sO z1A3{bPXPK7q5d17T|s>k7z=3qH^BAM(f=lZJF%h=@D>aaKokBBUTx`rfKRaWAb8Yh zUeLFJlfz%kFrWGzV8dq*rrCz?f(L-j2R@#hIjwj;Xs2}5ln1(`xh6bzJ@gQO`(qz; z0cju!cyaSKfH8uXioMJBbMc4og&P3Po&wHTX0HS~fedgtpz#}JuqGV1QC_YYFIBbf zm~Qy^zWFL{m{<2^$<;>7Ho?Q{Jd0aoRc)w(@1sv)`zJ;h*O+Vgm-N(z^Zy28ET8*L zz!rdg>EdoP>OX+`H-g^^_+Vb`x{Viuu5fkyUk3ul9Bc#LH!Ooom#Qy77h$7Fcm? zeA#+r-)*Y)%8Xd(d$inZELd$}EuVnvS{T!V)%*GPndkxOiG{q1_Z!PG8Hj}f>*Yi& zihsZG{;iHj%kuE+6X})Kc*wKpbL^9jcxKqPLe(SjuzVg529C)fSbN=>G9uwhebOzn zpZE|NOojq|GA|L9{zOo&i@9=rVuUm%gMk6rmWU$%Fno)WL3txlCE5C*1mmu_^&{kg zR8Y>UuL^Wau0HB{+B|hLRA)m_4%SzBF|T7pJ^36X>qL^ieReX7+>Obod<1JhtgQYT zMrMDCk@l*FthchCHu%}y(Dc7*^#2=JC6p*N|gl&qUMS zj`6$b+9Hg4Zze+PSzT@XynX)jD)DaUZs}KjO03YVw{X9M!NVGU>8jJmg)=8aa{jY#4(rPhXdEI9XSmK-OoI{jlBeJ zNGCeS1f05!1Bf{Y=r*P!j@#H_<<9tqT;}WMY7obK*U9_4tNn&VPO7`BLmZO{emK~> zi^HJ1y8u2f9;3ds_833Eh_b+@vpuK3h=g%+=X{;!4EU;Sm0Y@99#4-Rxz{Su1kWZ} zmqt^i-5ESeKAm?lHXw@Eh;7eZ^ZTI@Hrn+`&y@GmA!*4JO<<-TP}kh!H_xGi4zkAxBqo;A$)o~=b3Qq zZBw>Vrssm+=Y!@qAWw_c=9_B#CgQ_mbzRv4sm_HenZbQ^VP(u{K?Jkjc4Sm;!kA?+ zJq>I$?u+1J$UD-Si%Ng4sG44V@|VD)tD6lwqibYKE}TCKMLc8Bg6*=|E=2^R6uP*D zrjp(y&0mO|wE$;i{$+^6U++J4ysB(o*5u=4)9(YvisYfjk@+9^++j`o_0kIcD9~#5 z_(R08E)>SbKo(La~^}E#r*eo5dt|83$xHxIWa5jH2|+N zkDbx_4qc20eXvVmXEt9sy)w2bTzm-Zkj!j~R_p?!y$^7)9X^7kGSF0hNx!MU--~Jd fP%p;FD&!^L%+yU>Wny&`d*LHu24CQj*8^Vyi>7>C delta 4890 zcmai1YjBj+8U7ZMut|3zVN2GqNfTKCg+xi%Yc`i%E*7Xr0**=%#~6?>!$2y~%UEU; z5k+cIcu|P;hL;*tFd@`SQ7+b6Xw}lY3bx{{+SbnatL+S(>GOQwdBbU@PIvNfp69)t z_nhyXZU9q}z<@#lbSpiQA2KgcM@Y1M)cLC~ggYJb?+)u;AHOzeNzF~76dI9P~IO?cGkk@m-oow0WO z#zr4!%6^eWuyhxA$kJ=TOD(+?yi7IkL^m*A4H$0*daQ=N z3C-uB4Q+rN3#i@*UTo=2;5@eK?*Xr~bT9Y>quo1k8^ncHz*g`tySCBJvl#8?I{;k? zXz}lZS6F%wd@8_mau6fW5zmRn4}mwG*Lmj<#O(71=SSc?1Dfz0_!3J$56*L~{ujWP zTlz)tiI)B`c+Ap=!M`%BvHveYOdB>h&dcC40bal(7`Fplg-&=BoNp1;$G{sbeH{Fh zrC$NB1~RDk493d<)}!9f=g-^iGll~g`MTltVgPlK(VUQPh@XtmuR^ni`hN`F{f*vh;7kd0=(I-+}81Xa4Vja?Ae*aPJD|y)AtU2ED^f zcpK1DP5lm_hl=_%pf4HfGl1R->UV)EKpXlaxE?zC{{-+%OwXHV`W{3L4Mv{@ztGa} zgHN*b2jEeow`2SeI6dxUEAy#80yh8a(H36AkHLAqXb<3I%)nR=@DL82m{vQcq6e%O zXa$x50h|v;-73L`Nd0Co#&QFAQEmlVfZKrom9<5dHbkm!hgY+vgKq(t)dlp*@rLTM zTCkL{a@MV~qajpvCz$5(t)&s$+=$N`LcZ@w;mm0IE)&Pc#Fx+tAYoQF8k`@#y#9%5 zf5xb5`b0WrM%q7xg|qM>amKp=Ug7{Q0$2VQK>c@s-vfC5V%Psy%g>eWk_oZuAlZE; zvR`ts@MKzc8_Pb70bDHB|2v@dZ=KCvG++?+?%Hl z@$Be?G{?j4%xXC)9r17>pV|YmDPHY9zlTh8KSu50AK=;pqaQXg`{WIi|A_R)LUJx1 z@NJgjL=^wlC89ybK4xNHljR9-uE)_?NbX9+igy`bznn}&iuVjx{VWmj?RG0xCIgq` zVb_jd1=p@d;izg?jPZ72MY42f+ArTtR!Upa@9USn$!O5t&?5Of6_!unA87PTAXO>v zCH<001f(fdD%~l+Tm{>yj9ds9)@ddyYtLY+f>f7*+wO;>Wdwsh7_*#k4n zy_9C^+vzBqkb=fax5UMbSyy*Mv&b%JMxTL3GdnY$oR{(3YcecyXC~^FJ_IYfdkazM zE_l}3ipi2ohJEi#eN$M@r2@GR;A_T(7K~G|O$Ao$#n!g1GJYP9C*7DL_s|`X4pchS zRGR07A%=iMKn@q@AjWB^av4VNn3T9#(@kYoT@2W{%x6bWVXQ?Q^8@&<;1RF;;=FQq z(nYvyT*{>gWOA)kHHR0^FloG*3yqfx(X#blP?oqSc|_t2@_NF zJ(o2Tu<`jO+}`b+>}UuODl2cX@9I!BIz6HI*%0=5e>C zefN1%p9k8_La##{>+++v>y3?OwcTKBqvY(Y$R&Cwxv4JzZRWqYHzJA^S%DclrEYel z(2bUbv!i+Xc}RKuboDD?)77)n7Y(@KJXZSka+8VUfnNzc4X{=}pg)dQnHWA!wH-9J m3wTdj@cW# _188 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); -constant spvUnsafeArray _189 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); +constant spvUnsafeArray _187 = spvUnsafeArray({ float3(-0.5), float3(0.5, -0.5, -0.5), float3(0.5, 0.5, -0.5), float3(-0.5, 0.5, -0.5), float3(-0.5, -0.5, 0.5), float3(0.5, -0.5, 0.5), float3(0.5), float3(-0.5, 0.5, 0.5) }); +constant spvUnsafeArray _188 = spvUnsafeArray({ 0u, 1u, 2u, 0u, 2u, 3u, 5u, 4u, 7u, 5u, 7u, 6u, 4u, 0u, 3u, 4u, 3u, 7u, 1u, 5u, 6u, 1u, 6u, 2u, 3u, 2u, 6u, 3u, 6u, 7u, 4u, 5u, 1u, 4u, 1u, 0u }); struct main0_out { @@ -66,12 +66,12 @@ struct main0_out vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) { main0_out out = {}; - float4x4 _217 = transpose(UniformBuffer_1.View); - _217[0].w = 0.0; - _217[1].w = 0.0; - _217[2].w = 0.0; - out.gl_Position = UniformBuffer.Proj * (float4(_188[_189[gl_VertexIndex]], 1.0) * _217); - out.out_var_TEXCOORD0 = _188[_189[gl_VertexIndex]]; + float4x4 _216 = transpose(UniformBuffer_1.View); + _216[0].w = 0.0; + _216[1].w = 0.0; + _216[2].w = 0.0; + out.gl_Position = UniformBuffer.Proj * (float4(_187[_188[gl_VertexIndex]], 1.0) * _216); + out.out_var_TEXCOORD0 = _187[_188[gl_VertexIndex]]; return out; } diff --git a/shaders/bin/sky.vert.spv b/shaders/bin/sky.vert.spv index 212de71c748ec9ea7dd21762e306a37d6addec5c..6ab44988e009a99eb63b47ce88905399ca0486c0 100644 GIT binary patch delta 3800 zcmZ{ld2Ccw6vp3_wm>b5R2*tiN(O{V4V?}pK!sBOU{MhPF(QyqD}hEV(qWXXPFWOD z(ZU4*S3t0Wpe*j9Xbk=(CdMTwE{z%$BgQRCjN9**m*c=JClfsd@9RZ>XCyccE{tzoD*nc5?dAnU#5sl`fvs^I-4XeMRZTY+DQl z1=)f45-`8V$`PiQqK|hQKic#%w0@==Gpea7%KF>jiqQd-2DurXhHH%=Ut8A%4}zxj zVRKxLG{+{m*;l}|(B{m(5?j+5?5jeXtug=GL%XeMON8|9V1i$JBC8Ry87$*Fj(^tYff!?g&$f!n?&HU@&{eb50XVgQ>77fzb!6t~hR!`82 z|ILiDNngNoU&tt1F_tZis*G%!8^~yL4}^2F$@f7D{U z3p_mqevYTFffssu8oZ~cuY-4G|Mm@MVCdmF)WB71OQ;sv*_*!+KGf6o@KVs1B0s{Y zYO2hSGO8Kv7`DQ7ggUlCI)6=U1LtN8ZF)OA>gmVey*#}Lex9dyz;#Qs;Z8Y?oo0a&cmfQUA=JAv{IuSUzQUV-65iL-d*C`ETfZ0X-+-sk>Uf)f8eRt4 z&wn36_qvh<)a3(!$|SAMF7dQFTb&#MnpbD*w#X)}&er=uS{2#PsEX)nN*@R{SF!E< z*JC&cw4pMTeg-Ij>1W~E#PoA;dkM+^d64VPzW~>!=KmtRlc!&TcUB9R24`h5dl|!O zu*Q8du&APx3XorL2vh*QBlTVs*QnE0y;Q_h$Wty}QWQzK2_?}&^U*jA$X{dXU}MS3 z+(^Pj%A%14uCT1AumQ75sfOwc7Jw08hMRy-(#?8s_X*jNc6Oq?&osqd6~@)UkD|5o zm^yRY<0#zrxCy=-WYY9}-u{nIn#5!7twg8DLAN$hU+KT%g+;*KF&bJjWH&eVyCN;0Okq$JU51)$qzH1y3E7=PB0O)o)pj|dI z9s{zQ_lI~#UF(qUlRm;~`&}D)w(Zvz_jouzhw)OdEkvAAujt9Nigx%IECa_}bwxqn zPhoyk&H7P4b7xn?s;1Xu#prfe*x_?&i6L8IG6WwLK ze+7LA^zN)S5#PrAKw)FDj;+Cb&q04(F5;eIeZwGSn{727Xh z0PtJ)*U)aUenb1Q(iW(N34Jyv5o|HzDWGKZGu!WQ*%ZKRe}p#mjcxL0=%eG()7u`q z;Jd+99Qh{3zjXfENP!io5m=DF;eMtTMBnN?pqWG!L{0?CG_kFXU^~;=?fB_iZfmn5 zVf|GmTioG)7VGS^*xqp2p`RUH7FtKA^5>JB`XeXwnd{j`g|=SUMiq0}vLRZm7hDcp NCAMU8-NxYq{sDuAvkw3O delta 3921 zcmZ{md2Ccw6vp4s4eN|76^9DgHU$B}&`zlWTA)USx*?zjL=CkPI*7$~N>N#+tRkWo zFDP}TD&kfIaTmnx5C1VSao?gwja$^XMT~LzeKYUig}_U`p6@&7+;i`{_uMz_NbOF= za(a{(1VJPSf}?_oJ7b->k?n3Qy(<^is4Q)5|ideL|e^X}D_SfRRCd zMz_N?Mo_MeTMiF`_Viv$T!FMi1`0nhbx8@#~NW8nEf z3v$>}5YCs*I5y(YqY0F-3HS@DLYD$tz-)M-r_Y1;1Opj=8&En3sosmzmVOWdZ8OG#O?p;{DgeH@|8>?MZ zZRvZYwNjyovL|3|#WnCoPmhOd#TKuH5AyV6c)O?1g!l6FBzV-*XTxWMv=uxH(Hoea z0{_g@=fY#2o(3=S^mO>qp1ufP?CF{CexAM=FA=o=ii0Und%&Eviso2c=~>L+|v)h`+NFY__3be z3Loj|2jRL!TEI4}7NBDvk;b8wJOl>F5$cEG2~R%)AM5EyGyMPj$I$0^@ou<|%<652 z`#0io^gM8tCG0@x9-H0?uLP&CAa(svpk0zyrw{kEI$fO|0g9{Bb$jHKR;TNGk>mOd zD@tn*cA>Nfx{R99VV?w=!SqvbRWSWDTvbg!1Gle`#y<=4z4&u*&0+b^!+ToCX}}9W z9W^pIGV|5g4POh^0e!^RgPXw3;1dcN%;Em1jKvgN5ym#TK8bjqJS$ySRgs&Rh(=QG z<*In>b$m8k$~7m-Gg)g~XQCv-R=Yj>+2@Ip8r4`GR#hW~GX`(?b-Wz))_B@?Fm|`A zsT$z6RP}VTs|F5f$D{Y&1gy%Na9hn)@Kvm~+$~|mj6~GEUp3IRCwkVubx_tCv?}Q$ zXfBmIK-XM5teTzJ z4}knpet&hUACet+PmbsR^A zbyt_CRpoP_D$39Z|4qLLeS@%Ci*o%cUxx9y*werRA#`)~J2Z_R*BoB~&7tw?<#3L4 z=GDK(p^0r0CHs?n6UJ?lYth2i5OyrzhIy(p5$M>mbqX@`)G&$WiGvB?8vSzE{(px< zK~17NuJ5|=5ZD1~xzk&)--97Q#jQVn2>n*;NA#g;O~StusMa>@PiksG1yqdn1V4kH zK$LH=8e_bgDg6t~N@}BR546$xO|%Q}YnZ1!xDcqC_8@ynvJLbb+OMTo^r7W-;rks7 z1+;B?f8YKQ2JBt;p$}E;Vf>GPsT8{o`zO$1^qB82xO^IKzQ04Cy2R%AM;mjfN%Z6W z7&xCc+l>7eXd)F>p=H2|sKB9WG?UW}I#{S`L`YH{b)k*zkv`1e`$^J&1U5KFc|f~l zgL4lvwlW-RN0%4o+0m(%j*jgQ>Y}Vp-H;z9HNwp|A@udfr_Wa|R)fX!;M!taOo2;| G9r_ _672 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _667 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -114,167 +113,167 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _761 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _789 = spvUnsafeArray({ blockBuffer._m0[_761].Indices[0], blockBuffer._m0[_761].Indices[1], blockBuffer._m0[_761].Indices[2], blockBuffer._m0[_761].Indices[3], blockBuffer._m0[_761].Indices[4], blockBuffer._m0[_761].Indices[5] }); - uint _837 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _841 = blockBuffer._m0[_761].IsSprite != 0u; - uint _846 = _837 + uint(_841 ? 6 : 0); - spvUnsafeArray _686 = _789; - uint _866 = _841 ? 0u : _837; - float3 _880 = float3(in.in_var_TEXCOORD1, float(_686[_866])); - float4 _890 = atlasTexture.sample(atlasSampler, _880.xy, uint(rint(_880.z))); - float _898 = _890.w; - uint _910 = uint(UniformBuffer.LightCount); - float3 _927; - float3 _930; - _927 = _683; - _930 = float3(0.0); - float3 _928; - float3 _931; - for (uint _932 = 0u; _932 < _910; _927 = _928, _930 = _931, _932++) + uint _756 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_756].Indices[0], blockBuffer._m0[_756].Indices[1], blockBuffer._m0[_756].Indices[2], blockBuffer._m0[_756].Indices[3], blockBuffer._m0[_756].Indices[4], blockBuffer._m0[_756].Indices[5] }); + uint _826 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _830 = blockBuffer._m0[_756].IsSprite != 0u; + uint _835 = _826 + uint(_830 ? 6 : 0); + spvUnsafeArray _681 = _782; + uint _853 = _830 ? 0u : _826; + float3 _867 = float3(in.in_var_TEXCOORD1, float(_681[_853])); + float4 _877 = atlasTexture.sample(atlasSampler, _867.xy, uint(rint(_867.z))); + float _885 = _877.w; + uint _897 = uint(UniformBuffer.LightCount); + float3 _914; + float3 _917; + _914 = _678; + _917 = float3(0.0); + float3 _915; + float3 _918; + for (uint _919 = 0u; _919 < _897; _914 = _915, _917 = _918, _919++) { - float _968 = float((lightBuffer._m0[_932].Color & 4278190080u) >> 24u); - float3 _986 = (float3(float(lightBuffer._m0[_932].X), float(lightBuffer._m0[_932].Y), float(lightBuffer._m0[_932].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _990 = length(_986); - bool _1004; - if (!(_990 >= _968)) + float _955 = float((lightBuffer._m0[_919].Color & 4278190080u) >> 24u); + float3 _973 = (float3(float(lightBuffer._m0[_919].X), float(lightBuffer._m0[_919].Y), float(lightBuffer._m0[_919].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _977 = length(_973); + bool _991; + if (!(_977 >= _955)) { - _1004 = _968 <= 0.0; + _991 = _955 <= 0.0; } else { - _1004 = true; + _991 = true; } - if (_1004) + if (_991) { - _928 = _927; - _931 = _930; + _915 = _914; + _918 = _917; continue; } - float _1019 = fast::clamp(dot(_672[_846], _986 / float3(_990)), 0.0, 1.0); - if (_1019 <= 0.0) + float _1006 = fast::clamp(dot(_667[_835], _973 / float3(_977)), 0.0, 1.0); + if (_1006 <= 0.0) { - _928 = _927; - _931 = _930; + _915 = _914; + _918 = _917; continue; } - float3 _1065 = float3(float((lightBuffer._m0[_932].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_932].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_932].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _928 = _1065; - _931 = _930 + ((_1065 * _1019) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_990 / _968, 0.0, 1.0)))); + float3 _1052 = float3(float((lightBuffer._m0[_919].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _915 = _1052; + _918 = _917 + ((_1052 * _1006) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_977 / _955, 0.0, 1.0)))); } - float _1408; + float _1393; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1408 = 0.0; + _1393 = 0.0; break; } - float _1180; - if (blockBuffer._m0[_761].HasOcclusion != 0u) + float _1165; + if (blockBuffer._m0[_756].HasOcclusion != 0u) { - _1180 = fast::clamp(-dot(_672[_846], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1165 = fast::clamp(-dot(_667[_835], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1180 = 0.7070000171661376953125; + _1165 = 0.7070000171661376953125; } - if (_1180 <= 0.0) + if (_1165 <= 0.0) { - _1408 = 0.0; + _1393 = 0.0; break; } - float4 _1199 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1209 = _1199.xyz / float3(_1199.w); - float2 _1219 = (_1209.xy * 0.5) + float2(0.5); - float _1225 = 1.0 - _1219.y; - float2 _1227 = _1219; - _1227.y = _1225; - float _1231 = _1219.x; - bool _1243; - if (!(_1231 < 0.0)) + float4 _1184 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1194 = _1184.xyz / float3(_1184.w); + float2 _1204 = (_1194.xy * 0.5) + float2(0.5); + float _1210 = 1.0 - _1204.y; + float2 _1212 = _1204; + _1212.y = _1210; + float _1216 = _1204.x; + bool _1228; + if (!(_1216 < 0.0)) { - _1243 = _1231 > 1.0; + _1228 = _1216 > 1.0; } else { - _1243 = true; + _1228 = true; } - bool _1253; - if (!_1243) + bool _1238; + if (!_1228) { - _1253 = _1225 < 0.0; + _1238 = _1210 < 0.0; } else { - _1253 = true; + _1238 = true; } - bool _1263; - if (!_1253) + bool _1248; + if (!_1238) { - _1263 = _1225 > 1.0; + _1248 = _1210 > 1.0; } else { - _1263 = true; + _1248 = true; } - bool _1275; - if (!_1263) + bool _1260; + if (!_1248) { - _1275 = _1209.z < 0.0; + _1260 = _1194.z < 0.0; } else { - _1275 = true; + _1260 = true; } - bool _1287; - if (!_1275) + bool _1272; + if (!_1260) { - _1287 = _1209.z > 1.0; + _1272 = _1194.z > 1.0; } else { - _1287 = true; + _1272 = true; } - if (_1287) + if (_1272) { - _1408 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1180; + _1393 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165; break; } - uint2 _1298 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1314 = float2(1.0) / float2(float(_1298.x), float(_1298.y)); - float _1322 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1180)); - float _1331; - int _1334; - _1331 = 0.0; - _1334 = -1; - float _1332; - for (; _1334 <= 1; _1331 = _1332, _1334++) + uint2 _1283 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1299 = float2(1.0) / float2(float(_1283.x), float(_1283.y)); + float _1307 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1165)); + float _1316; + int _1319; + _1316 = 0.0; + _1319 = -1; + float _1317; + for (; _1319 <= 1; _1316 = _1317, _1319++) { - _1332 = _1331; - for (int _1350 = -1; _1350 <= 1; ) + _1317 = _1316; + for (int _1335 = -1; _1335 <= 1; ) { - _1332 += shadowTexture.sample_compare(shadowSampler, (_1227 + (float2(float(_1334), float(_1350)) * _1314)), _1209.z - _1322, level(0.0)); - _1350++; + _1317 += shadowTexture.sample_compare(shadowSampler, (_1212 + (float2(float(_1319), float(_1335)) * _1299)), _1194.z - _1307, level(0.0)); + _1335++; continue; } } - _1408 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1180) * mix(1.0, _1331 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1393 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165) * mix(1.0, _1316 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1416 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - spvUnsafeArray _685 = _789; - float _1517; - if (_685[_866] == 16u) + float3 _1401 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + spvUnsafeArray _680 = _782; + float _1502; + if (_680[_853] == 16u) { - float4 _1497 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); - _1517 = _898 + ((in.in_var_TEXCOORD0.y - _1497.y) * 0.100000001490116119384765625); + float4 _1482 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); + _1502 = _885 + ((in.in_var_TEXCOORD0.y - _1482.y) * 0.100000001490116119384765625); } else { - _1517 = _898; + _1502 = _885; } - out.out_var_SV_Target0 = float4(mix(_890.xyz * (((_930 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1408)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1416.y, length(float2(_1416.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1517); + out.out_var_SV_Target0 = float4(mix(_877.xyz * (((_917 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1393)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1401.y, length(float2(_1401.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1502); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index bee2b4c5c2754fd7d5bf93a8b22aee1e0cfb310f..6282492d7ad908412a18a0510df987bc513e9fa5 100644 GIT binary patch literal 54100 zcmchg2bh(`75A@FLduPtQ=MH-}e$Vqg-wlU%&YAx?bLPy=H8wTQYAGzNZEUTdGpoLF zZj%t|}v0SXvKV-_x36p0{I&fUi9mUo+7M!Fg8Z%|q*h$l; zS}f|3hU zCQh6-VS2u5K%XKyxM3BmLHp)QB6?O*R98)_%tqgQsb?kh%p$m?*Eb)-Re~K>gcTL~ z=0i|Qpu>xxBD`-t1gZp@Q3Ms?ee)rBCD0*7P!ZlY9|Bqe$;ku8Oxr(SRW&d_VnosB ze82p_5~vgJ8D)?diE_vx zWsor0`UFVN9Sece_?R3rc(%NaOZ*0{={Cc_GdVa&T9M*Kr{DzhWbZ_alu5@i3 zPTP0P_z4Hk+E=NmcX1Y%348bK-#*8u~Rg z&+9*J{N!1ol{w8#EiL`)TUy!*E&T@#94MPw{S9q(h5Qa_PS~M$&)z*-T5FXl^K+US zTUzsT8=7ic^9v>{YN>B%YRr$!52zV1VBp;09mA&93o*E6;E;hs_Z&2AC@_G{ZF5@l zV@YQ{kMEh+hp^=*wM<*oT;Ez4UJ~tF+cIU2d~2z1YINdBEfd=s8fG`w&zs-s#Ttt_ zg_a|R9W}h?3Bx<|d~kljflbW|Ya3dQ7&zdl{K(!tkMEr|m-TCK72TOz9seGva=uS> zML@p}0SL_k)=~?ZR%Za$dVr-C0>Ihn7?3Y{^8X8PLLA_9!YJ(H+GZD~Hnr5ZYA9Qd z*rS8k_Zv_%bZ)i#y92Mk2|(d7SZW~{|DON{OD#BE250DM!y5qZ@6>`b?kxO|$l0VF z)8PN;2lQ5UA(4e#xKE*V%#^Ck?d&Yor3$1OCxzVyf#PnS9+fGXu z4u^&6e5uxsNz{gOg0Hpn5w+on&?oJr=3Zf`^QSs&SNZG=UK-&n=yeux4Qp0kV>?-X z@BD!LUUacEDq)V44|CLt^Sx-VIJQ~u2VrM=VdO2wVKs97GMY%ck2Cc0Z_ zZY?aGG=8->C0kNi&RHClj;hc^Sv)#zz%sX4%=gdhd=eLJJPJ+bAX7{m*`ylR)X>x% z`_JKMrYj%j%7$!EMPzl$w)L6exlPUaFz}o`2Mo{G=SPIjX8jZ2x34;Z z566cG#n5yX25Du_mLuvJCu;d*uH>6*>+0KD1gXj}HNmM}@&lGmoH!u+^dVCZ8j@-b z4n{52mHH9v%&ZReHHTT@@ILvz*(pMg7}nKoHd(kcD@Eh|ilbMvblGvKTE4Dc(Qlkn zpr?h#d9CxSf*lJX-L0RSuPWk3jkJz0Uv8xl+0lP)3?(YZmx2YW_l4H_#^B5PX-?71!lEjFpbEY7 zZKdW0E8L}oK`R+w)2u*Mtu|M~Or1C}o2vu*C?yRVI+R6M8lRv(ucA8BJyYMK6ZP2@ z)WcfI)CUghP~WY1?GBkU`Q7qi_;&NLi!R5RWjkOgU+fmsig4L6Da;}5O4HgJCzArJ zw54hy6$XtTk=2dLYqvm9ou5{_a8W~{d0f*%U9;7<=n7D8!i6k#sWw9oSvn-2UBoHv zEG(wVmbS*?9E`%eWRn^-c^vgMm=JYRK`F~`=nu!@;0VSaT4;=ZzJNd_Ad zVXSWNP~MhA$cx2Q8soWuc0vOuWOX5mT7C6RvKx*s{#{)MpW;&J=hvr?OrJjN@in^- z*xe=`ZUv*}PneL$m*!=eM?oCNK8#16OOB=`#Z)*lzp$;LDjlLBRi((Y^ooh1T$}8f z@2^x-X0v8VoOD@>gYs>Q6@vt_beX1W_IenSc+_ZHT(eBzxZ2@j1w9wLRC^VJnOC08 z*iiu+*k$Fl%krh#r1|3rlbr__vJ7+$P?hOaN2Dd|7*=T%8m1}fS-|>-B{wM5ax-#veJz`_ zLO5W+;JMib%I%b#u8J|woR8Tv%;LrME%meO8?-EgrX4*vN6?L>689T8Tu)6(o;p8- zCJlii2#rsMSZ0Xhiwns$qI_n-2nlA~!bOt{iwg~h7n+-@Sinjynp1tPyGyI{%lfDb z#eh_&v+X!-9dteRE38r1q^9tm#S{^G9cINueUl;Q%eS3yR2!rNn@B**mghG$ z*B{r^XkG>{>XqC7)io|&DJIP+zD$?cXv#mx2&diqV& zp7eJYJ>5YklkF;5Y3YOOlB<$Ti7qSmQCXqP zu)FD5T8YTI=K4xTrqLtARO?yHOPQ=|uAiPE_XnLC@mZqJ>bvCn>)E!Ly6!o?I4$3x zg3dt6vs9hwbj`lQjT=(t$6(2`Q%S5JqGxstiTqGK!>Kv6GfceCW@5AUcMtO7X)VaR z<@QjacxcG5U2}VaB|S%eFEHV(nAsXGUh(!hD)V)O^m^t->KW!-`fgs6B{o${ zZ|&SDJ+rw}0mgXjElie%GMz5D(R$8|DEB) zcgszX+`XkpwpMPUWUIf8gfZJkb=e7BPweiiX9Gt77hUX5lH6V`RTQ>sZa+Q4t6$LF zUwo!JHC{tR++;n&J9yALz;Ic8m)wDR)@S8zxhZ;<-Xj8js$}7wA@B#mPs!e*K=qcQR*}X}W9U5e|Or<-0O~$MA z6&$NUzb@db!0g+%>Gpaurn$LxS$IboGD@#N4Ye(?PRHox!aTik7MiPCb=|FB1ZrLgrSw898;numEhgNN`S7&ryMR)IscyE8;$>O~y86PPsN1{eoY~n8Tz*Dl zJ+F(a<7eAY3@#l|ID%%aWHVBpX>b>WrBXF#K+V$ZXrklEH!*KfcjmKAnYY+!*;q~I zMGj|et9x)C3atZT7qgWV7Lp8P z`*E1$M<@?wm3pI+a!uxMAAL<4Z_%s9R`@E% zwQHults(J_X=GVqtqHkA$7v-e-l>8?e|V{i z47VV@ue=rpv{qb}nySin3FSPW_jQj}o?0YmYs6?MEGan{gyDQ)qg3W=%L3k+G^qA+ z5T{64ys}%Heo3}bTiNQ5?JigrS2=uH=jJwX>8U1oU9@A0d;5~t<$0`TDQ{unmV;}Y z&Zb;`XDul%@LeRtE6*N+SHOXe4v3vueyx9Gb>-8c-) z>xyGe?ZQHHZN7GqejHdkXTIP|ShXc<*`ynspVzGKbV}K#^t!1P!X2kg@MQ0-j?>T* zM<1dTyNIu0GV3Cv!|*TDZA5v)HM+m(pC6cAQwATC`&xcfG^8qf4~^?cH#RoY`{r$m z_GRknm0Z(6uhvcTRE#gG+3R_B#_FD(dCMk5JbQ8ewalQR&R$(}N9dU)qm1vCJ5o>U zwTc<$C_N{UwjzJDp7xtg&bhP1m-iRFF1c?>E+?~ct;+H`E6=9f)|lCzqjKzB#@C6D z{myvaH9|zfIdiUf%Ree+7`;O4{jKEReDO<~H8%>)s_&Mahi4Djec-@72J;Fd*;ct@ z^vw60kf$H{ev`5ltDl_a`%TX;YMC``)_{D!mPPf=i}U^Fwk%rQZ>}~Q-Cg%yIg?L=2BtYo|*a0yLhrVGx>2&9@lav zKVI^(>?@wQEHBCp9pooS?sqq_!uQCXsAqUbwR@48Y{*0XTDg-{$oi91)7HtV^RFjC zr+e-c75ta%CO_5W;Z2Dl$$UP|z4W@}&ZHcFps1oG-EwCk zb2{CGJX^Ak`p`{%I7fA9ACRAGIxWR(9$D|6JJ0a(lpr>fpKo}JQ?6Y%k;WX7w@PThfBr#IgYR2k*s51vlS?O$&DtUcl&EneT8hg*-N-&FGx7F(gT3z?m>jqifTC3L$wz?iFH0cF|21~CmwAWQT zc4=Q{{H_z9#V4%w;{7mn*H@_9M^^A{UC};)s3L8uf;Ur=Ab>tQ}tuPyHIPp0(iX;i+FU)?b^{!&7hVeIY}P8UF06 z(X^boqj)|hqdjCEM;pi(Q^R2wSuYX(|2x{>DPqXue8BM8R~VCRE}r=Yj~#4UUM%5* zEcFLm>JKvPplkm8C;GF#WY{NH^C{WyT9lbTV6X$;a;D+&7a46+Pmbhc^() z;=(-WlJRE4a-Z3t4P;htxyzm~>WO*|4RIu>rEPM{MX|77@s+rJ9+QTq`!t7#s=+GYnH*UDMBaHQ`z*osGQ54 z{HWo&IvjN-?*`7*nY_DX;LNtk*NQUJF?o+DHy!h1ZOQd1`q5K7G9$yS6L5Q*y(^7Whz>I}brw1a&w-yrhHynI9PhDE-K#$zKr^I7*o+~IFZ_*=y@ zr1X>emsQrI$p27f#?$I=SD8J)_}f%wP8+|Oj4|(x|GvuP8{DYfBN4c*_zu~Wn`#SYh>Ve5tZggknIW}lG&*efAFMh_Jk+aeMDdDWA(dHv-%zBi})>chCW+Q`k_CWn>_j0 zGcOx8S$nw*yQNUP%OLL`>~_89c28yxG9k!Od9r+=)w z&Gq+C@yOuOWlute?l3*|CzDafzQQ)D zzvKU<@_ml~LS@Fx@c&VnF*W`xm4D>;oP4{>@oS1_k1>2#@pn4DyLk2(tM4KH7RUD# zf1~4jiNC?|>x#e5@#~9c9-F-l#dC%>eq-@JaQvp?uXp?w;(2E<{8r+RbNn{q=Q@5n z@zWi@z4-Bt-$ne-9N$-bi{tx=Z*_c)__ZBBKzy6y2Z>+o_@UxYcKi_W$2xv5@yi@P zQv6Ad-&;I6&H6i5{Kbx+ApU&E?<1Z(Z1_py&vE?z;?H#a0pd@0{1ox0IsPE=r#gO` z_){Ezg!mI3f0XzW96w9^a>v(-Ki=`P#c$#GI`OrRpDTW<G)&B4{-cK@iQFX zDE<(~A1nS)$G3>z-to)C&vyKB@tZmRMDhDO{v`2}9e;-SogIIc_+1=-j`&?2f3El~ z9e;uNRgOPje3j!b62GJ4FA?9*@t2CPas1`tM>zgU@uM7nmH53Jf3^5M9eD1KYV zKO~-`2*J;p#?-A1j{o z&E6`rAAeswd-7gtUuYg$?P92!M+YZP5dm!PZz(N<7bHPBc51YucyzM zhp29h!yYPr2glD8e}Ll;6F{8^5#6@Q-NXN$kU@pHsq;`lo8mpZ;6{yUDJEB-Ra&l7)z zuXX$};@cg+K>SUPZxDaG;}?p*!|{#cCpf-Ie3RoBiD%tdJdPEAw|LIt%__5o^ru+g zBIZHIw~C+V_%`ti9KTrnLylh}{$a;275`JmFBAWwnl=$KDhj%3QTR!l-8!=XV z;Cb(1toT^{g@G;BU*vf7+3)#)=RJq9)Fb10Z@Jv@gT-Izc-}v*ay;)GS390}3&v89 z%pUI+T~*dn&UoG}x;dVAi|&r6p80Kf-ZgrN?;>LUA0O*^|785gNy|mFVf+c=X~Xyv z#beX>lf+}w_>;x2?f6r~_jLTJ;@5HfY2tf1{&exZ9e;*+JM-h;nWFVv{aNDIcl_Dn zZBGDyj>z@|_;W?JXThH*+SuuzFP=Ta`g4JJ+jGEQD6%sL{6(V89sXkRc4ngf+afzd zz+WQT%Hb~+Pd>8tz9ZiDOz@Y9Y|n(hT(q6TUm-s4_$$S4@A&VE-@)-$iRX+`ttd0@ z-xIAV>MH6c>MmMK)FVDA8{s4S$kmd)x!y1KuF*^yqVhE&tGia^Jum!2@m}OQ@uz)p zL-AhZdhxnL9d7s);&p#h#NQx3mm6KYOKcavjtDtV)4NgSQ%*j4IP>@>mE~5v*XWY% zMK?>v;dRNtWRP>+dd{g7Eis!1RbcCdQZC#iKwSftZDGH`x8;xC-w|$oBaYk z>l1b0v1fgHL}f7a3H!8bwjWg)Y^hISo~)D%9da;u`qN7@248!ttU!;>N~^og8iePVxnT7(VyWcXjGY z;h#~tBmA=tzq!Ldw;Ddoo97*#oVikDeSJY?e8-;<$Ds3~c=L&VtQ48fODdbr%PQMg z{!(SrA@{Bnna(RJn-1}^arl+W=&;_&&&*47ctWff^7IX&;NLn~jDIa2z4b)o5n=|$ z>)M)rRdTSbW!gj6+J8-D>S&)Fg>T*l?dL_<4(*3I__}!Xx{GK#jAzI(zln7XdV-@a z^f|=#jaa{qp4*FT9lxpaTO#^x>(pZVTghk-ogGA`^R~+9fKPRPCz|=iy?`?h}{`QEo zcK;DE;HpH75jJiTS-YRAZ0+_@86DdFOteZ=YB%Jhe@bR};$ZlHsk};*;y;(n@VlvO z{rW=X@_q&T|91Gk4*#Fk@L`^P8S&jC_GLY-Z~u*T#I#xjmcD%@VvVG}el3~#+D~QX zEqFF+=2?ngLvq8{sNV2vu7(d|)+OR?9&kTg8ne*<7dX+YdxG zb{jbSV29_9yBr^K;YJQWM0nOMabRt756)U+?uRyl&L&Q0sOnaVOozL2)8Tty%Uzp0 zovjib?$b@j=esSP&M@g%Jn@Y?cheze*3Q;WXZNHX?&VD<F;#LI32zp zLFb(gbOuUJF2c95PKWPM(0Q*+C+w+%qYiNxCn84lhwoKB(33bI=X)3WME~gz{?T49 zwYEa?VJg%1dLqtH*d=y8rgnzfJ!02YJ>!6`+1Vr3^-vw{trUSL&g37h_Qc^)&+;F2;IU_z5ebIxkyxAPT7DW8G3mV9Tk_E&Y=pHL^7L&3_kDUZ0;j@xy|77z7D^y z@GC{cc#`DheGESA7xCr;-;bp}Om;RW$(F_80LeS@;XsGqPxzH0e3&A6xevkTsSdxt z!yi-uf3U+(7T)}sCV9C(A@@y>c-GlB%>gr<&S>dKmEZ!+OxTJn9Ae;=GFls>@rT|j`BE$aXQ@L4-}3y4*rOUXRZ15bELyh5pHF~ z^BpPYoD_ew!%tPcjq5DQIX{5^Ku`1kTMmDas-KxeMgA@|w-HqYrCEV;!A9lpP{c3yTm^-gD+i#isUl~K>fWpTt1mqSG8 z5Eu5`G%m~yi_4OzXK|qpJoYRuOCu(Y%QDG{3pRXQj&pb)7kuGthV3*i$2%P#7j%|8 zoe-CBhB_hY(C0%%KM>L96D3dke3E3==aZwJ^_e>G*t0o*O2p7-?+>;aC$RJ(_!Hg( zPmMY|O1`#erpVenE!OFg>7WaqJ>A+oJ!008>@X2)6U-SR^2<#ka+zP7XF8q3RsUtw zIV3Q%xr*ow0t)25F$F~dgd`HjFPB`0L7CVAMM$>{bH5L>pdclxM16I!nb2R^WbO^c-px{M4Pm; zzMiyksmeAc-%%O6%meV$fybUw#{$E$Y z{`C%D=kO~k;BRpFt%SFE-ChBIqr-11y!n5V(%lx@jWbZt8 zOXk&4!|5Mc7U4Aiq}RO?2i12sFV8nq~zXD)1wXZ^Qow7eqxLEye@uTCGvhg9rf_DRm3|IdaLxLP5dnF ziy@xBh&rjC#NYdAdbDAFJ`;7#Pi)bi*Tv5(MZwRoUY~V(ZK~Tn>b<4%Y?YaJ$S+Uy zo{M_;x>!ViI4|*p?iMW(-5~Po>G`NfT(%e8Awmy7X|p^oAxFL7baoKNbl#3S#KU4@ z`Qb&U!x_qSRz;n6%5=h+>!qmEE#m#1=gZFCPO1ls-@FUr_j{uEMWL@@P5(0L5Tl(% zw~EjK&lnIR(Z8dT%R*J%!348hu=QSIE3^}Az3*(DCVjBjV%>LS>yL>o)|~b6183`W$-!caIZ|#bwEdyO zpCR0XBJlXf`&%g{0skk5KU4LFXWp0N!#(3i5x+p#AF0fIt5^9Lk*(`LN6Z$I{Xk{T z=~nj_SI4<9)P?UU{_5(Msk}r4-gN)w>N$gYyC1tc#^2Zd-POGypM2dXu8#K#U-u7J z$2*Fz`_$EaR;&xZjrwP-+fHrWn8hW?|5ZW$c_JSce~Z;cx_tOO_UD?px9G`lC;2Vz zt)jJ5XZ&rB=eLSysg8R4z19tDhq=F*WZzbM_FJ3Vh1H+zccrYyOCqsfv4-q@@Q#Sv zMsm*KUG>E8O(eJRX?JZjsE!y}J9oNvn2!rp2XSU>$#7wQec!dyEIIuoZkxMyZcN%? zUYMUhO!SEh;}P`3Z`|&RnE7hke&cpiw7GdE3-j^rh}&8+)*&%%&+0>N`cbSeNXA-V zyzJfmo>)h`SY!Vc1>Io#URTeW{VLXvk`>zFw}#fI`y7_s(o;OPLhM7_?oTkiB4#r^ z&CUY}rgy|_>M#!`m~|s2#4oh<;{>x_#PEAqYwMu|vwpeMp35MT<(w2|UV+n@e zkb?2?`MJZe*WIN0v|o=Wm|G*p_v?uS^K!)aem$9BtS#TKrxJ|W@%?%_!LYxl{rW|M z;miZZkNYzT=C+9OU@Xq3J3B8Y7>nT<4)eKlqU@V5`In3(`#@gby=4R(N3C8SP;4p6_7@Mp7Cf)43nP4nF{7&64 zZzUMB!*ACO^VV0bhj}-_SX);*%zFvO?0nZ@-cK;LF8B?;?Wuosn0vI=N5}O(Ql}Aq zTmONGa|!&;Dt{>I7Ws`-{*$P?tN%!RI3tC%`DgL^ll@keGY;6v@pGJB!`o?4PW9 z&g6C$`@3s{v)D}W5NAH_7avp9h}S0~>@rtP_aEZ*Cp#~CUG79U&p#D)KNSf5s;u46 z=UbgmzR#aIo4(JSKW`F^(Ws3T=ARC=;wG`zp$Sg8PEXENFTG;HOjob?onp;h;@%B<6*izql`Ii zvR+Zfyq>CW+xC|3x{}d0ZDAW*=z_JpvA)W*$9eSoa)!RQt4u5nvtfcE7GV7R-#Eb# z8!%!1hdI1yg26X1n+qG-3%Jb_9R3?Fv>9+)COG+&@EPYjy``?|8{eYc|-~v4WkK6g$YqX(wmrIN9lF zEO$vT9gSsGg6U{1cS|sp#u|nRT|4732ybV4DWQexg51b zu?_bRVSI*08;mo#k2?zJqDVH*!(3bU3s)NF(8leqjr&y3y@$=s-IF#B*1Uzt&D@h& zZr(#U?6Oaq?w%EN$<5P+wcNayaOiV(u>Il==TqA6;fY=AH~Ex($@)Da;>a;eC8wQs z=ikW0&SCNi;w}riL%DTJ@uP%ePKUmQcXl>ziL&qM?4AA2=rix^w+XPZ0DDUp{Vh}u zxhBN?`ttcJKGBjS^k^i>~KfKTxpj- zelI&H!E}`WrX?7k|G0;_O?KH^ZN7EwU=IE;nS;!e8PZ`6GJhF&TVr>*acGj?;od6r z{Se`7EXXa#svcr2d<+kbIL2a;>S?Q8WgCl`iJhZl6k^_xrZ;lj3@Z!9&@#cIwP8Ew}?@N`B5)PZ@+tC&Dn9tnnbH+h$mT;WC`IxLW z%2ZvnH@kwp%0xx&{A$M-qr_c0apXzNPp9ilj1r}6^fXcPTI z6^kM2(?XSz(+56gvr)W{h4q10VAEpJ6mi7jR>`r~?(8f|?C@I@i0>-6>z$%sGchK| z3WqMlN7Y&T=1+44JNSbg^QR@^@aJY3!ESq2AJ$cCVu$lT#Jk08k1C@phJ1uw!FIj+mgfPY~`(>5^BOi|nr_Nrv3^#8Xs8W^JFQvS8VJ#yqu6eYb&rR&i5(eUX56JAC=j9&Qn ze~HRB>v@alQkB2s>Mm0mf2q6N)v-TaAs!#7yE4|9uiq6faW?Np$yeHF&wLHvw_N4w zi3#oa`tP}V`bt}&KFpJQI+-U|M_oIsSv((;opVKZX+3Qz=dKYByQ~R2Q`{Tva)$k< z*4TBbBOZMIEgqc}BILx8vYjXHb3TnwJAUroARO^9pN6U)VsGTVlslE91!xzJ{J)D8r`Vz8__%+gb02V!)7F z50e4xx2x>WdUq!n+5_Y7E$&G$v=7GL+ufI7@CS^)JGeh$EUwe!6U2USj>z7z9uN*+ zx0CZ0!v`zq@?J+Cw0FB73x_^(J4^jUJaV)3u*$?G^@H)imaU7QMjY`wSaR&Nt88{2 zN$eaX3`Acp5jAN(e5vQ7!Vy=~TUkMmJVg7Z_cP&$wdp-pLGNnmkpE5Z=fV+x(|f#v z9>1x0M`UNcCxpXS+Qo+HKdG{hm-Q3<6V>)9nycidr-Z{syUM2fbOl{vjjqM|7ZFFS zr%H~kc9qS}Gl`uk!ay_B7UwNH8$Bx=`yIqbRhjQ*=eY`Yn1k3kE%xPk;qU=_ru#w# zUHXEq_2tEgqb~D4o`PNP>w}&6x=L87t>!B+$5)HfkCQmPBRxLEiMIbBLPne@ zTbv$pZSN<0eqVc6IN$cS#6YwS(O33QY+~DN{>0fFk=T4Mu{lZgkj2k(%lpDHhm0)# zf2^R-*$x|L$MyJuaI69BnC^!abXf=J+Isv`#IX+cRUNk4RW>^xC3f}^1|q**rRR6# z1MBh6!c7vPZ@Pb}pu1dnJLjVNSK;)~zbh5&Fb5UpqMg50utQ(W&I+k~9C7qzqUx~Q zuCn>__ry-E+JG2e)}^h5PlQ7^tc7q-_;51kK2<#*<{bEcijXlsDBJw_shc0;)rOyQ z{}N8k7w7wIF;GWy4%=q)5oa@xbW{F=vSR7s91^>)#c0xkIscb#(tD zoF3VDVJ980FDuw#yv)uD>Hjz47_V{BZoA4hUSB14#tH-B&rHRMIgCGF3#Ui+@1&Y9 z_-J-CL}hU{JG>)fhkXq@Yw(4bct@2CKU#4&pEs|dOJBK%vT@x) zIP^_#%TDyj4>qn_35RazYsi6{bZ}4osLPACpKUEY<^}P>j^(YDo#d@;gi~mWxzOUs zI>Rs9ueOai)*0{PwB^^?c8Q(2G72phmiN;OHE%hO=Y>O;Ja4htz7t)}j;6bVaOjgS zOn1i$y7-T-y$9?h9CrlRus-b)b?MWQ!h#8X3U>rQb8$=Wl6H-{_P%C!1ZTx|{ketn z%V+v-pZ;?{!d(XEBcAM8#DjgtFqf;0uV8qB!MCs%g>!UOY~RKMyX|hg`nY=fhRskP z`u12SecLVSR_dF555}F%6(WBBV==9E?Q-t|hIakk(RGs9-28bbe$*s>%v1azzWbOh z+cq!y3rC!o$o5^wcdT)1p1-qPeA;xr)#$|$VSIMs3qYssAAIXqg zA0|ax#CTijQt#W^FV)(^XCBJ(6{+>U?+OC zY4c}_aOgsOR8=;A4vKc@+t%ob_kBA!)~9`2DC~af6L*#S>p4w0>l^C>zrPe_hUC;) zEDw$LXm86{@7tRh>(llo%jN+h>(^nzb$kyK*8CB!oz2w_c;C*E71}vaZ9wMlQO?dL zvcvnCw{vs_J5%sAvlD*5ILq1DNOn5)7q_`lNHA+gpBWcF_vR(I zt`6sa<5i#Fx;vczjn{$%*Tdm_&Rm$_dOFsp z;+WqXsQznFdsZL%)Rx#;U-i(T>NjL|7CSrZseVV*c{@uIJN2rEI4jK-*?ag>;aG$C zVX=8CiOq4U=fitA_~jyG#D}uQ=V=$8-m>T8bAoVczIgWBRP_-4j23ZbU<|N{ZL|3c zXETlYiHXf#vIB8GhwL{=Cke+|3GZxSPCS$J@f2bB&`0p6iB1>c4^Q*w*-rd9Lpa|@ z^M|trL?3Afo7gv-&vjz+%nCMnCmk=Fb~kjEaO58Hv(3q~E9kPXqkB@!!RH8vzUiG? zLGOI&*_}DL`#jO$cK zFU~QGe|p}#DB@Uy>%{i_+POHfbBv5a%+)tUwsyWP9KQOs^FlJOE>%4r<`wwMM97!} zlx+^Y==!y`+VE@Va^ZZx7Knj5T07V_n=d(=>Dsv>vDrgyLbpV+-&R~HoPC#Jva6y@ z(Bf|}u8uPNwDG^DLK~dh4iRvw#+$S6wZhR3cCq8<&~@UmX?fNBDlIOfAzvWqQ0AKDW;^Q8;%TNdtlEiN|-hpv`k@jI=X#UnQ| z-)@mis>ObpO?=~S!p3p2?A+Fg9elI<>)VCH7XD1p`zbNIQ)TQ@r$4!F zBK{i-{I}TrKozuSu|dbj=7+J~#;3a+gq{?!?@iGd?<@m%2}e8EU`!wSVSTu}6B}m; z$h#jlek2@r)=}AX@99LBdB&Xpy7vl){w_}Uz6!dG0lF50`y-ARbdx{W@-cWIvD2V7 zAoifgL^eMj6b@a9ivIt&f-dj9=-R#ML&7l-*s#9;q=GK~qkFJMlfFMJ9QviU!x{LI zsBirO=lk_&thcdUC|eMD2mh>JE2C|RioX4<6W!6$e^BGX_gIe!hknSR;SBWi3c9Og zAF}WE9v2RMJGZ=?w^vmr zZp0G1-q%+<@%1%fJMxw9Kp>0T>%!57#qG5uZf~fL4{-zgmIxVfqik_|y%S%4D_lpu zaBnqVWb^H9;fNbxn{U6Xplf#;#LfKSX>nVnGI1l8*!8~trW0S^5w;^=?F?aY`@L|q zVR3sSiQBuX<3rrQzAr*X+$dYz-t5GeKML28FO3pzr?^?J`an4LA+Q#=4?EF4Nd ze-aLTKUY7hq^mX?Ma10t!qZ~@XO)RL$CWAHsFy%X_lhqza4qr^2N%|Ev?;zHXlXQ#kZ#$j0km z6?BJ44ig>Zq!yvyRjGT5>S{%+o8@+xq%S80ah+f$TfK-onwI z#cSOPdi*8;GQIVLqfOIWzk(iT3-ahx^`A4`2Ex%M`lh>K1zqL_x}5#d-AK4yqYcyD zxPmTYfv&}PlZYe6{}o}&$7|EX&VPh~h!y>|^Xq29F`@h%+q{DA5yEl5Ve@kf;rKUL zuwnjhSwWZgb96cPbC zR(Y3Lx3TQ+sxs|RR~755Uwy=@DtkAiU)Tx$g!hZxTs{6`E7XVYCI8S#uIL+eZ5>)n zc(38T`yP!i?+?|&VK>}Ihr7LZT^{Cl*)^)CPkhM5=nN1cCl-_~f4$dhTv_ew^O#Bqqb7ZW@zxoJI(TT|Z8LOvY)H>gf|7#t9vGy8Bkpy;|*}Yj+=$gnL-)7aOL#Uj<#xyR9NSyX`Mr zdUl)KiEf*8E$1H~9Qx!z$<(|#X3bTYGM_#Ks8{68b zYhw#0jBPk4&yMwG`(xRJ9uQqF+t^{BoFkkb*>50sll{ITf8MUEU{ZMyi~R!O(sz)CPINgRn(jj3(D&!V#!htGoosdea*ZgGP53n@&vY-1x?xU)Ir*Imy33`vtoL*!@C;Js-QP5<5=`1Cg`C?@_|L-}i*W5B|Mh;*TBkzwZO6?BP#e?MOlam3(B5w?5`Zb9+NX~5>9Nk53|Oy9HOWFKJ{;Io%wy@W@rCY8L+%b zKlyihY@OT^arEti^HY(<{KwATU22o}M~FW2-`uc2ju!uraM+z8yX<=#sr;~H z$gS`HaP9cM|J1cX-_2*<>t@K#?P`O&phtwmCSzuI@}EYV_B+3os^`P~0{F*7$ap8B zY`%Qve7P*M7v{;&g;7)49T2`;8Hu$9(YNze|G01$>1lC#qJo~C<80IlP@NA$Q2NK1^Ya6=qB+m3CD4q^CR&hm;6#PPEoSTnZo z|4KOeB~elL*A;Z}16{k!6tqY!Z2l=+j_`o|8 zZG|-x&LqE!Hq95X-j{z>@MTrhGhg^^7<8!UCHX@C*=OGouD{ydU1YKQeFa_nZ#`^} z|ATPHIx_utE9lcUHmvRUgrj}znC|-(blGdz%NcY0{-bcmDrVR)-4810THnp@4}~L# z8=3x}D(Ev;w-+%#X!|4K#Aas`{NU_>OG;b;fD*kN82^Rvp>@W0Le+~sWcqaLcqhV}iksAKJxzWe6;Z@#BmBe#d> F{{Tv(Z}&XcA+?)z~$f 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 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); - float4 _387 = float4(_385.x, _385.y, _385.z, _274.w); - float4 _403 = UniformBuffer_1.View * float4(_385, 1.0); - _387.w = _403.z; - float4 _417 = UniformBuffer.Proj * _403; - float2 _453 = ((_417.xy / float2(_417.w)) * 0.5) + float2(0.5); - _453.y = 1.0 - _453.y; - out.gl_Position = _417; - out.out_var_TEXCOORD0 = _387; + float3 _384 = float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))); + float4 _386 = float4(_384.x, _384.y, _384.z, _273.w); + float4 _402 = UniformBuffer_1.View * float4(_384, 1.0); + _386.w = _402.z; + float4 _416 = UniformBuffer.Proj * _402; + float2 _452 = ((_416.xy / float2(_416.w)) * 0.5) + float2(0.5); + _452.y = 1.0 - _452.y; + out.gl_Position = _416; + out.out_var_TEXCOORD0 = _386; out.out_var_TEXCOORD1 = float2(float((in.in_var_TEXCOORD0 >> 28u) & 1u), float((in.in_var_TEXCOORD0 >> 29u) & 1u)); out.out_var_TEXCOORD2 = in.in_var_TEXCOORD0; - out.out_var_TEXCOORD3 = _453; + out.out_var_TEXCOORD3 = _452; return out; } diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index e85a9d2a8db29c5e9dddce541c51eca9e7b77f22..7b86d48b2ec424d83411cd0ed2651dc2d2a92eef 100644 GIT binary patch delta 4540 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 diff --git a/shaders/bin/ui.comp.json b/shaders/bin/ui.comp.json deleted file mode 100644 index 71e95b64..00000000 --- a/shaders/bin/ui.comp.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 1, "readonly_storage_textures": 0, "readonly_storage_buffers": 0, "readwrite_storage_textures": 1, "readwrite_storage_buffers": 0, "uniform_buffers": 2, "threadcount_x": 8, "threadcount_y": 8, "threadcount_z": 1 } diff --git a/shaders/bin/ui.comp.msl b/shaders/bin/ui.comp.msl deleted file mode 100644 index d71546e1..00000000 --- a/shaders/bin/ui.comp.msl +++ /dev/null @@ -1,169 +0,0 @@ -#pragma clang diagnostic ignored "-Wmissing-prototypes" - -#include -#include - -using namespace metal; - -template -void spvImageFence(ImageT img) { img.fence(); } - -struct type_UniformBuffer -{ - int2 Viewport; -}; - -struct type_UniformBuffer_1 -{ - uint Index; -}; - -kernel void main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], texture2d_array atlasTexture [[texture(0)]], texture2d colorTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) -{ - do - { - uint2 _258 = uint2(colorTexture.get_width(), colorTexture.get_height()); - bool _286; - if (!(gl_GlobalInvocationID.x >= _258.x)) - { - _286 = gl_GlobalInvocationID.y >= _258.y; - } - else - { - _286 = true; - } - if (_286) - { - break; - } - float2 _297 = float2(UniformBuffer.Viewport); - float2 _299 = _297 * float2(0.0007812500116415321826934814453125, 0.001388888922519981861114501953125); - float _307 = precise::max(_299.x, _299.y); - float _311 = 50.0 * _307; - float _315 = 10.0 * _307; - float2 _323 = float2(_315) + float2(_311); - float _327 = float(gl_GlobalInvocationID.x); - float _341 = float(uint(UniformBuffer.Viewport.y) - gl_GlobalInvocationID.y); - bool _357; - if (_327 > _315) - { - _357 = _327 < _323.x; - } - else - { - _357 = false; - } - bool _365; - if (_357) - { - _365 = _341 > _315; - } - else - { - _365 = false; - } - bool _375; - if (_365) - { - _375 = _341 < _323.y; - } - else - { - _375 = false; - } - if (_375) - { - float3 _405 = float3((_327 - _315) / _311, 1.0 - ((_341 - _315) / _311), float(UniformBuffer_1.Index)); - float4 _409 = atlasTexture.sample(atlasSampler, _405.xy, uint(rint(_405.z)), level(0.0)); - float _413 = _409.w; - if (_413 > 0.001000000047497451305389404296875) - { - spvImageFence(colorTexture); - float4 _425 = colorTexture.read(uint2(gl_GlobalInvocationID.xy)); - float _429 = fast::clamp(_413, 0.0, 1.0); - float _443 = 1.0 - _429; - colorTexture.write(float4((_409.xyz * _429) + (_425.xyz * _443), _429 + (_425.w * _443)), uint2(gl_GlobalInvocationID.xy)); - break; - } - } - float _470 = 8.0 * _307; - float _474 = 2.0 * _307; - float2 _478 = _297 * 0.5; - float2 _482 = float2(_470, _474); - float2 _484 = _478 - _482; - float2 _488 = _478 + _482; - float2 _492 = float2(_474, _470); - float2 _494 = _478 - _492; - float2 _498 = _478 + _492; - bool _514; - if (_327 > _484.x) - { - _514 = _341 > _484.y; - } - else - { - _514 = false; - } - bool _524; - if (_514) - { - _524 = _327 < _488.x; - } - else - { - _524 = false; - } - bool _534; - if (_524) - { - _534 = _341 < _488.y; - } - else - { - _534 = false; - } - bool _576; - if (!_534) - { - bool _554; - if (_327 > _494.x) - { - _554 = _341 > _494.y; - } - else - { - _554 = false; - } - bool _564; - if (_554) - { - _564 = _327 < _498.x; - } - else - { - _564 = false; - } - bool _574; - if (_564) - { - _574 = _341 < _498.y; - } - else - { - _574 = false; - } - _576 = _574; - } - else - { - _576 = true; - } - if (_576) - { - colorTexture.write(float4(1.0), uint2(gl_GlobalInvocationID.xy)); - break; - } - break; - } while(false); -} - diff --git a/shaders/bin/ui.comp.spv b/shaders/bin/ui.comp.spv deleted file mode 100644 index 99d08fa5e45b4400aa858a96f10e08b4066e7abd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19816 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 diff --git a/shaders/bin/ui.frag.json b/shaders/bin/ui.frag.json new file mode 100644 index 00000000..f95ec6a7 --- /dev/null +++ b/shaders/bin/ui.frag.json @@ -0,0 +1 @@ +{ "samplers": 1, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0 } diff --git a/shaders/bin/ui.frag.msl b/shaders/bin/ui.frag.msl new file mode 100644 index 00000000..69516af0 --- /dev/null +++ b/shaders/bin/ui.frag.msl @@ -0,0 +1,41 @@ +#include +#include + +using namespace metal; + +struct main0_out +{ + float4 out_var_SV_Target0 [[color(0)]]; +}; + +struct main0_in +{ + float2 in_var_TEXCOORD0 [[user(locn0)]]; + uint in_var_TEXCOORD1 [[user(locn1)]]; + uint in_var_TEXCOORD2 [[user(locn2)]]; +}; + +fragment main0_out main0(main0_in in [[stage_in]], texture2d_array atlasTexture [[texture(0)]], sampler atlasSampler [[sampler(0)]]) +{ + main0_out out = {}; + float4 _170; + do + { + if (!(in.in_var_TEXCOORD2 != 0u)) + { + _170 = float4(1.0); + break; + } + float3 _153 = float3(in.in_var_TEXCOORD0, float(in.in_var_TEXCOORD1)); + float4 _157 = atlasTexture.sample(atlasSampler, _153.xy, uint(rint(_153.z))); + if (_157.w <= 0.001000000047497451305389404296875) + { + discard_fragment(); + } + _170 = _157; + break; + } while(false); + out.out_var_SV_Target0 = _170; + return out; +} + diff --git a/shaders/bin/ui.frag.spv b/shaders/bin/ui.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..b744816ad882fda05ee7778eaffca7506f9b2b83 GIT binary patch literal 5484 zcmaKu3v(M+700)>>=ai`o1~AVX<(fIwW%e`j!8otr%vsVm^P2buA9RC zuAGDt2n1S&;r)IL?_ntPEAU}>^9dN0tyZ5sce&c`w5xHr8MKpTt=eoiIy;B2|w-zwQzcTc4Rr&?6$&aISG<5 z^~fZ7k2vo!5+_lwmiSBUZZ8>meZ<%2Qcn9yR_k=4x_np8Tv@ny@$zD2))}-r&9-uP zJFOsTcG`YVtRmFIn>pL5|7V-qiN&6t9l1R_qIwjw=GQvyI7utQ=KxE=6J7=|#1$ z6mW&&Ok3yH&u#Tu8$r8tqnTVQrB*K2koSmIn>3NiKkPlKbw0V(4a;$QvoiU9t$ku= ze?ap5sf(5TUhgrjX`JbLxw#pvhh)uiF^G^2Z zrp%A`vrji|I^NYzFL6P)uQ2%v|MeD=Gk zj$ZK_0go*_?>ap7!1KY=JMx+yp8oKmhtBKaP5+3pUlH#MPs$ehC84wT?um!Re^|6H z+#{fee_0?G`d7620v~$#amQ`P`-tQ3JpHKjuZkuIy_itH;Hv^Qd04KilJglKh_+hD z^@QLH2lNX?Pl%14`dImF^_6uk6*=3-WaW!TUd!b0)LGX`EaIRKwGsz8d?Vx2{TDp_ zY`Sw~Kl|i$M62~R>A;=dI#z8nbJQ z=6AvPj_6X3?~3LeP5+wcxf~yfUdZvW=<_+A-=$@N+3IO!wgv@@wmj=v!qn}f1C ztd-d|+nb`fqsHG7&2Pl4Vy|iC{`0}tw2nG1<(XshGH>XaV`eeWGkeA}*UT0^MNQ=q zt?w4l^O@{DqLGoisLo>d-b^;2m3ewXpohE zvIq7{ZR9HIH0Z(80x>unY&Z+z7UhY4UO>-X+Nk-T>^; zVLvaJ&7$bM4Q~c#hi_5;$p1kB8{R7JCiM~TtiTyz%YH59Innu;OX9a!uBJR9EOzO2cdR8=XtxwcuJ$f$F(W89=wia*a9;JIbpZQS-cbD16?}Bhqptqc( z<+&u98aQwM_9Hg-%pSmgzrfw(Jk0NT(fF~~0|IgI<1TP6_#qz^^7$@{w|vw{j{bZH zCELz-pF1<&IQ*EG#|6#|o4l{}bwzS)cMIgh*Xn*jG&<@&Bw$Mn_Pr`lH*(&awC?oH zc~Lxm8^Ut}cAO2fcr1Ir21N5+6aK2({86n|)9a$~=bgkKTe~kG6OE3%=Y^L9-n}`! zpmnXcg~5z}MeE0fLXQ80=pn)8^^RzZ$6Vr1ysLuQd{T7YhM3p{Ih#-Q*^mdDmxaHm zqPtr8{vn!k{ItNnS&Mpknde^%jM41o`L>?x3!~|);9$565o8^ z6up!0rsPY)Tj~zJpB3=8-;&>m#*cZX{?BRU`@8J1{k(vTJwV$Yek&S3_HfS0(>;74 zliMEJ;sJGZguf{cJt7`)E#B`$TfBTvzL?1^-dXX0dkdHcey_hIFrU_sFN-E#zh74} zfS<4RE5fK?eqR;6lV2=(B6Q_S^iDA+B`2oc-5+LlhqUs$LOkw>#rcuwd>m>5%m_1YefhCyd?{y{W;%=)5}r?dW6Cbu)XB_6O3 z@K1RWi_4 Uw?&iJ;x|PD-gxjYX^#v41`+9OKmY&$ literal 0 HcmV?d00001 diff --git a/shaders/bin/ui.vert.json b/shaders/bin/ui.vert.json new file mode 100644 index 00000000..d4b79af1 --- /dev/null +++ b/shaders/bin/ui.vert.json @@ -0,0 +1 @@ +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 1 } diff --git a/shaders/bin/ui.vert.msl b/shaders/bin/ui.vert.msl new file mode 100644 index 00000000..6a36ed75 --- /dev/null +++ b/shaders/bin/ui.vert.msl @@ -0,0 +1,89 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wmissing-braces" + +#include +#include + +using namespace metal; + +template +struct spvUnsafeArray +{ + T elements[Num ? Num : 1]; + + thread T& operator [] (size_t pos) thread + { + return elements[pos]; + } + constexpr const thread T& operator [] (size_t pos) const thread + { + return elements[pos]; + } + + device T& operator [] (size_t pos) device + { + return elements[pos]; + } + constexpr const device T& operator [] (size_t pos) const device + { + return elements[pos]; + } + + constexpr const constant T& operator [] (size_t pos) const constant + { + return elements[pos]; + } + + threadgroup T& operator [] (size_t pos) threadgroup + { + return elements[pos]; + } + constexpr const threadgroup T& operator [] (size_t pos) const threadgroup + { + return elements[pos]; + } +}; + +struct type_UniformBuffer +{ + int2 Viewport; + uint Index; +}; + +constant spvUnsafeArray _188 = spvUnsafeArray({ float2(0.0), float2(1.0, 0.0), float2(0.0, 1.0), float2(0.0, 1.0), float2(1.0, 0.0), float2(1.0) }); + +struct main0_out +{ + float2 out_var_TEXCOORD0 [[user(locn0)]]; + uint out_var_TEXCOORD1 [[user(locn1)]]; + uint out_var_TEXCOORD2 [[user(locn2)]]; + float4 gl_Position [[position]]; +}; + +vertex main0_out main0(constant type_UniformBuffer& UniformBuffer [[buffer(0)]], uint gl_VertexIndex [[vertex_id]], uint gl_InstanceIndex [[instance_id]]) +{ + main0_out out = {}; + float _220 = precise::max(float(UniformBuffer.Viewport.x) * 0.0007812500116415321826934814453125, float(UniformBuffer.Viewport.y) * 0.001388888922519981861114501953125); + bool _224 = gl_InstanceIndex == 0u; + float2 _268; + float2 _269; + if (_224) + { + float2 _231 = float2(10.0) * _220; + _268 = _231 + float2(50.0 * _220); + _269 = _231; + } + else + { + float2 _248 = float2(UniformBuffer.Viewport) * 0.5; + float2 _258 = select(float2(2.0, 8.0), float2(8.0, 2.0), bool2(gl_InstanceIndex == 1u)) * _220; + _268 = _248 + _258; + _269 = _248 - _258; + } + out.gl_Position = float4(((mix(_269, _268, _188[gl_VertexIndex]) / float2(UniformBuffer.Viewport)) * 2.0) - float2(1.0), 0.0, 1.0); + out.out_var_TEXCOORD0 = float2(_188[gl_VertexIndex].x, 1.0 - _188[gl_VertexIndex].y); + out.out_var_TEXCOORD1 = UniformBuffer.Index; + out.out_var_TEXCOORD2 = uint(_224); + return out; +} + diff --git a/shaders/bin/ui.vert.spv b/shaders/bin/ui.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..93a3d076d989c55f33122b0ac28f3c3e999f6f34 GIT binary patch literal 10280 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 L1-z~sd!F!rzD~yT literal 0 HcmV?d00001 diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index f8f1f6d1..b302477f 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -11,7 +11,6 @@ struct Block { uint IsSprite; uint HasOcclusion; - uint HasShadow; uint IsFullbright; uint Indices[6]; }; diff --git a/shaders/shadow.vert b/shaders/shadow.vert index ba270d9d..a1e1fb30 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -1,7 +1,5 @@ #include "shader.hlsl" -StructuredBuffer blockBuffer : register(t0, space0); - cbuffer UniformBuffer : register(b0, space1) { float4x4 Proj; @@ -25,7 +23,6 @@ struct Input struct Output { float4 Position : SV_Position; - float ClipDistance : SV_ClipDistance0; }; Output main(Input input) @@ -33,8 +30,6 @@ Output main(Input input) Output output; int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); float3 position = GetPosition(input.Voxel) + chunkPosition; - Block block = blockBuffer[GetBlock(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); - output.ClipDistance = block.HasShadow ? 1.0f : -1.0f; return output; } diff --git a/shaders/ui.comp b/shaders/ui.comp deleted file mode 100644 index 033811dc..00000000 --- a/shaders/ui.comp +++ /dev/null @@ -1,68 +0,0 @@ -Texture2DArray atlasTexture : register(t0, space0); -SamplerState atlasSampler : register(s0, space0); -[[vk::image_format("rgba8")]] -RWTexture2D colorTexture : register(u0, space1); - -cbuffer UniformBuffer : register(b0, space2) -{ - int2 Viewport; -}; - -cbuffer UniformBuffer : register(b1, space2) -{ - uint Index; -}; - -static const float kEpsilon = 0.001f; -static const float kWidth = 1280.0f; -static const float kHeight = 720.0f; - -[numthreads(8, 8, 1)] -void main(uint3 threadID : SV_DispatchThreadID) -{ - uint width; - uint height; - colorTexture.GetDimensions(width, height); - if (threadID.x >= width || threadID.y >= height) - { - return; - } - float2 ratio = float2(Viewport) / float2(kWidth, kHeight); - float scale = max(ratio.x, ratio.y); - float blockWidth = 50.0f * scale; - float2 blockStart = float2(10.0f * scale, 10.0f * scale); - float2 blockEnd = blockStart + blockWidth; - float2 pixel = float2(threadID.x, Viewport.y - threadID.y); - if (pixel.x > blockStart.x && pixel.x < blockEnd.x && - pixel.y > blockStart.y && pixel.y < blockEnd.y) - { - float x = (pixel.x - blockStart.x) / blockWidth; - float y = (pixel.y - blockStart.y) / blockWidth; - float4 src = atlasTexture.SampleLevel(atlasSampler, float3(x, 1.0f - y, Index), 0); - if (src.a > kEpsilon) - { - float4 dst = colorTexture[threadID.xy]; - float srcA = saturate(src.a); - float dstA = dst.a; - float3 color = src.rgb * srcA + dst.rgb * (1.0f - srcA); - float alpha = srcA + dstA * (1.0f - srcA); - colorTexture[threadID.xy] = float4(color, alpha); - return; - } - } - float crossWidth = 8.0f * scale; - float crossThickness = 2.0f * scale; - float2 crossCenter = float2(Viewport) * 0.5f; - float2 crossStart1 = crossCenter - float2(crossWidth, crossThickness); - float2 crossEnd1 = crossCenter + float2(crossWidth, crossThickness); - float2 crossStart2 = crossCenter - float2(crossThickness, crossWidth); - float2 crossEnd2 = crossCenter + float2(crossThickness, crossWidth); - if ((pixel.x > crossStart1.x && pixel.y > crossStart1.y && - pixel.x < crossEnd1.x && pixel.y < crossEnd1.y) || - (pixel.x > crossStart2.x && pixel.y > crossStart2.y && - pixel.x < crossEnd2.x && pixel.y < crossEnd2.y)) - { - colorTexture[threadID.xy] = float4(1.0f, 1.0f, 1.0f, 1.0f); - return; - } -} diff --git a/shaders/ui.frag b/shaders/ui.frag new file mode 100644 index 00000000..160939a1 --- /dev/null +++ b/shaders/ui.frag @@ -0,0 +1,25 @@ +Texture2DArray atlasTexture : register(t0, space2); +SamplerState atlasSampler : register(s0, space2); + +struct Input +{ + float2 Texcoord : TEXCOORD0; + nointerpolation uint Index : TEXCOORD1; + nointerpolation uint IsTexture : TEXCOORD2; +}; + +static const float kEpsilon = 0.001f; + +float4 main(Input input) : SV_Target0 +{ + if (!input.IsTexture) + { + return float4(1.0f, 1.0f, 1.0f, 1.0f); + } + float4 color = atlasTexture.Sample(atlasSampler, float3(input.Texcoord, input.Index)); + if (color.a <= kEpsilon) + { + discard; + } + return color; +} diff --git a/shaders/ui.vert b/shaders/ui.vert new file mode 100644 index 00000000..74084211 --- /dev/null +++ b/shaders/ui.vert @@ -0,0 +1,53 @@ +cbuffer UniformBuffer : register(b0, space1) +{ + int2 Viewport; + uint Index; +}; + +struct Output +{ + float4 Position : SV_Position; + float2 Texcoord : TEXCOORD0; + nointerpolation uint Index : TEXCOORD1; + nointerpolation uint IsTexture : TEXCOORD2; +}; + +static const float kWidth = 1280.0f; +static const float kHeight = 720.0f; + +static const float2 kPositions[6] = +{ + float2(0.0f, 0.0f), + float2(1.0f, 0.0f), + float2(0.0f, 1.0f), + float2(0.0f, 1.0f), + float2(1.0f, 0.0f), + float2(1.0f, 1.0f), +}; + +Output main(uint vertexID : SV_VertexID, uint instanceID : SV_InstanceID) +{ + float scale = max(Viewport.x / kWidth, Viewport.y / kHeight); + float2 start; + float2 end; + if (instanceID == 0) + { + start = float2(10.0f, 10.0f) * scale; + end = start + 50.0f * scale; + } + else + { + float2 center = float2(Viewport) * 0.5f; + float2 size = instanceID == 1 ? float2(8.0f, 2.0f) : float2(2.0f, 8.0f); + start = center - size * scale; + end = center + size * scale; + } + float2 position = lerp(start, end, kPositions[vertexID]); + position = position / float2(Viewport) * 2.0f - 1.0f; + Output output; + output.Position = float4(position, 0.0f, 1.0f); + output.Texcoord = float2(kPositions[vertexID].x, 1.0f - kPositions[vertexID].y); + output.Index = Index; + output.IsTexture = instanceID == 0; + return output; +} diff --git a/src/block.c b/src/block.c index bce6b610..ce55e894 100644 --- a/src/block.c +++ b/src/block.c @@ -10,10 +10,9 @@ struct bool is_sprite; bool is_solid; bool has_occlusion; - bool has_shadow; bool is_fullbright; int indices[6]; - light_t light; + Light light; } static const BLOCKS[BLOCK_COUNT] = { @@ -23,7 +22,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {2, 2, 2, 2, 1, 3}, .light = {0, 0, 0, 0}, }, @@ -33,7 +31,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {3, 3, 3, 3, 3, 3}, .light = {0, 0, 0, 0}, }, @@ -43,7 +40,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {5, 5, 5, 5, 5, 5}, .light = {0, 0, 0, 0}, }, @@ -53,7 +49,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {6, 6, 6, 6, 6, 6}, .light = {0, 0, 0, 0}, }, @@ -63,7 +58,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {4, 4, 4, 4, 4, 4}, .light = {0, 0, 0, 0}, }, @@ -73,7 +67,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {8, 8, 8, 8, 7, 7}, .light = {0, 0, 0, 0}, }, @@ -83,7 +76,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {10, 10, 10, 10, 10, 10}, .light = {0, 0, 0, 0}, }, @@ -93,7 +85,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = false, - .has_shadow = false, .is_fullbright = true, .indices = {9, 9, 9, 9, 9, 9}, .light = {0, 0, 0, 0}, @@ -104,7 +95,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {15, 15, 15, 15, 15, 15}, .light = {0, 0, 0, 0}, }, @@ -114,7 +104,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {13, 13, 13, 13, 13, 13}, .light = {0, 0, 0, 0}, }, @@ -124,7 +113,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {12, 12, 12, 12, 12, 12}, .light = {0, 0, 0, 0}, }, @@ -134,7 +122,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {11, 11, 11, 11, 11, 11}, .light = {0, 0, 0, 0}, }, @@ -144,7 +131,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {14, 14, 14, 14, 14, 14}, .light = {0, 0, 0, 0}, }, @@ -154,7 +140,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {16, 16, 16, 16, 16, 16}, .light = {0, 0, 0, 0}, }, @@ -164,7 +149,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {17, 17, 17, 17, 17, 17}, .light = {236, 39, 63, TORCH_INTENSITY}, }, @@ -174,7 +158,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {18, 18, 18, 18, 18, 18}, .light = {90, 181, 82, TORCH_INTENSITY}, }, @@ -184,7 +167,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {19, 19, 19, 19, 19, 19}, .light = {51, 136, 222, TORCH_INTENSITY}, }, @@ -194,7 +176,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {20, 20, 20, 20, 20, 20}, .light = {243, 168, 51, TORCH_INTENSITY}, }, @@ -204,7 +185,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {21, 21, 21, 21, 21, 21}, .light = {54, 197, 244, TORCH_INTENSITY}, }, @@ -214,7 +194,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {22, 22, 22, 22, 22, 22}, .light = {250, 110, 121, TORCH_INTENSITY}, }, @@ -224,7 +203,6 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = true, .is_solid = false, .has_occlusion = false, - .has_shadow = false, .indices = {23, 23, 23, 23, 23, 23}, .light = {255, 255, 255, TORCH_INTENSITY}, }, @@ -234,84 +212,79 @@ static const BLOCKS[BLOCK_COUNT] = .is_sprite = false, .is_solid = true, .has_occlusion = true, - .has_shadow = true, .indices = {24, 24, 24, 24, 24, 24}, .light = {0, 0, 0, 0}, }, }; -static cpu_buffer_t cpu_blocks; -static gpu_buffer_t gpu_blocks; - -bool block_init(SDL_GPUDevice* device) +SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device) { - SDL_COMPILE_TIME_ASSERT("", sizeof(block_gpu_t) == sizeof(Uint32) * 10); - cpu_buffer_init(&cpu_blocks, device, sizeof(block_gpu_t)); - gpu_buffer_init(&gpu_blocks, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); - if (!gpu_buffer_begin_upload(&gpu_blocks)) + SDL_COMPILE_TIME_ASSERT("", sizeof(BlockGPU) == sizeof(Uint32) * 9); + CPUBuffer cpu_blocks; + GPUBuffer gpu_blocks; + CPUBuffer_Init(&cpu_blocks, device, sizeof(BlockGPU)); + GPUBuffer_Init(&gpu_blocks, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); + if (!GPUBuffer_BeginUpload(&gpu_blocks)) { - return false; + CPUBuffer_Free(&cpu_blocks); + GPUBuffer_Free(&gpu_blocks); + return NULL; } for (int i = 0; i < BLOCK_COUNT; i++) { - block_gpu_t block = {0}; + BlockGPU block = {0}; block.is_sprite = BLOCKS[i].is_sprite; block.has_occlusion = BLOCKS[i].has_occlusion; - block.has_shadow = BLOCKS[i].has_shadow; block.is_fullbright = BLOCKS[i].is_fullbright; for (int j = 0; j < DIRECTION_COUNT; j++) { block.indices[j] = BLOCKS[i].indices[j]; } - cpu_buffer_append(&cpu_blocks, &block); + CPUBuffer_Append(&cpu_blocks, &block); } - gpu_buffer_upload(&gpu_blocks, &cpu_blocks); - gpu_buffer_end_upload(&gpu_blocks); - return gpu_blocks.size == BLOCK_COUNT; -} - -void block_free() -{ - cpu_buffer_free(&cpu_blocks); - gpu_buffer_free(&gpu_blocks); -} - -SDL_GPUBuffer* block_get_buffer() -{ - return gpu_blocks.buffer; + GPUBuffer_Upload(&gpu_blocks, &cpu_blocks); + GPUBuffer_EndUpload(&gpu_blocks); + SDL_GPUBuffer* buffer = gpu_blocks.size == BLOCK_COUNT ? gpu_blocks.buffer : NULL; + if (buffer) + { + gpu_blocks.buffer = NULL; + } + CPUBuffer_Free(&cpu_blocks); + GPUBuffer_Free(&gpu_blocks); + return buffer; } -bool block_is_opaque(block_t block) +bool Block_IsOpaque(Block block) { return BLOCKS[block].is_opaque; } -bool block_is_sprite(block_t block) +bool Block_IsSprite(Block block) { return BLOCKS[block].is_sprite; } -bool block_is_solid(block_t block) +bool Block_IsSolid(Block block) { return BLOCKS[block].is_solid; } -bool block_has_occlusion(block_t block) +bool Block_HasOcclusion(Block block) { return BLOCKS[block].has_occlusion; } -int block_get_index(block_t block, direction_t direction) +int Block_GetIndex(Block block, Direction direction) { return BLOCKS[block].indices[direction]; } -bool block_is_light(block_t block) +bool Block_IsLight(Block block) { return BLOCKS[block].light.radius > 0; } -light_t block_get_light(block_t block) +Light Block_GetLight(Block block) { return BLOCKS[block].light; } diff --git a/src/block.h b/src/block.h index bcd2feb1..925f2a22 100644 --- a/src/block.h +++ b/src/block.h @@ -4,8 +4,8 @@ #include "direction.h" -typedef Uint8 block_t; -enum // block_t +typedef Uint8 Block; +enum // Block { BLOCK_EMPTY, @@ -35,7 +35,7 @@ enum // block_t BLOCK_COUNT, }; -typedef struct light +typedef struct Light { Uint8 red; Uint8 green; @@ -45,26 +45,23 @@ typedef struct light Sint32 y; Sint32 z; } -light_t; +Light; -typedef struct block_gpu +typedef struct BlockGPU { Uint32 is_sprite; Uint32 has_occlusion; - Uint32 has_shadow; Uint32 is_fullbright; Uint32 indices[DIRECTION_COUNT]; } -block_gpu_t; +BlockGPU; -bool block_init(SDL_GPUDevice* device); -void block_free(); -SDL_GPUBuffer* block_get_buffer(); +SDL_GPUBuffer* Block_GetBuffer(SDL_GPUDevice* device); -bool block_is_opaque(block_t block); -bool block_is_sprite(block_t block); -bool block_is_solid(block_t block); -bool block_has_occlusion(block_t block); -int block_get_index(block_t block, direction_t direction); -bool block_is_light(block_t block); -light_t block_get_light(block_t block); +bool Block_IsOpaque(Block block); +bool Block_IsSprite(Block block); +bool Block_IsSolid(Block block); +bool Block_HasOcclusion(Block block); +int Block_GetIndex(Block block, Direction direction); +bool Block_IsLight(Block block); +Light Block_GetLight(Block block); diff --git a/src/buffer.c b/src/buffer.c index fd34abea..b05d0169 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1,14 +1,13 @@ #include #include "buffer.h" -#include "check.h" static _Thread_local SDL_GPUCommandBuffer* cbuf; static _Thread_local SDL_GPUCopyPass* pass; -void cpu_buffer_init(cpu_buffer_t* cpu, SDL_GPUDevice* device, Uint32 stride) +void CPUBuffer_Init(CPUBuffer* cpu, SDL_GPUDevice* device, Uint32 stride) { - CHECK(stride); + SDL_assert(stride); cpu->device = device; cpu->buffer = NULL; cpu->data = NULL; @@ -17,7 +16,7 @@ void cpu_buffer_init(cpu_buffer_t* cpu, SDL_GPUDevice* device, Uint32 stride) cpu->stride = stride; } -void cpu_buffer_free(cpu_buffer_t* cpu) +void CPUBuffer_Free(CPUBuffer* cpu) { SDL_ReleaseGPUTransferBuffer(cpu->device, cpu->buffer); cpu->device = NULL; @@ -28,11 +27,11 @@ void cpu_buffer_free(cpu_buffer_t* cpu) cpu->stride = 0; } -void cpu_buffer_append(cpu_buffer_t* cpu, void* item) +void CPUBuffer_Append(CPUBuffer* cpu, void* item) { if (!cpu->data && cpu->buffer) { - CHECK(!cpu->size); + SDL_assert(!cpu->size); cpu->data = SDL_MapGPUTransferBuffer(cpu->device, cpu->buffer, true); if (!cpu->data) { @@ -40,7 +39,7 @@ void cpu_buffer_append(cpu_buffer_t* cpu, void* item) return; } } - CHECK(cpu->size <= cpu->capacity); + SDL_assert(cpu->size <= cpu->capacity); if (cpu->size == cpu->capacity) { int capacity = SDL_max(64, cpu->size * 2); @@ -70,17 +69,17 @@ void cpu_buffer_append(cpu_buffer_t* cpu, void* item) cpu->buffer = buffer; cpu->data = data; } - CHECK(cpu->data); + SDL_assert(cpu->data); SDL_memcpy(cpu->data + cpu->size * cpu->stride, item, cpu->stride); cpu->size++; } -void cpu_buffer_clear(cpu_buffer_t* cpu) +void CPUBuffer_Clear(CPUBuffer* cpu) { cpu->size = 0; } -void gpu_buffer_init(gpu_buffer_t* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage) +void GPUBuffer_Init(GPUBuffer* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage) { gpu->device = device; gpu->usage = usage; @@ -89,7 +88,7 @@ void gpu_buffer_init(gpu_buffer_t* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsag gpu->size = 0; } -void gpu_buffer_free(gpu_buffer_t* gpu) +void GPUBuffer_Free(GPUBuffer* gpu) { SDL_ReleaseGPUBuffer(gpu->device, gpu->buffer); gpu->usage = 0; @@ -98,10 +97,10 @@ void gpu_buffer_free(gpu_buffer_t* gpu) gpu->size = 0; } -void gpu_buffer_upload(gpu_buffer_t* gpu, cpu_buffer_t* cpu) +void GPUBuffer_Upload(GPUBuffer* gpu, CPUBuffer* cpu) { - CHECK(cbuf); - CHECK(pass); + SDL_assert(cbuf); + SDL_assert(pass); gpu->size = 0; if (cpu->data) { @@ -140,15 +139,15 @@ void gpu_buffer_upload(gpu_buffer_t* gpu, cpu_buffer_t* cpu) gpu->size = size; } -void gpu_buffer_clear(gpu_buffer_t* gpu) +void GPUBuffer_Clear(GPUBuffer* gpu) { gpu->size = 0; } -bool gpu_buffer_begin_upload(gpu_buffer_t* gpu) +bool GPUBuffer_BeginUpload(GPUBuffer* gpu) { - CHECK(!cbuf); - CHECK(!pass); + SDL_assert(!cbuf); + SDL_assert(!pass); cbuf = SDL_AcquireGPUCommandBuffer(gpu->device); if (!cbuf) { @@ -166,10 +165,10 @@ bool gpu_buffer_begin_upload(gpu_buffer_t* gpu) return true; } -void gpu_buffer_end_upload(gpu_buffer_t* gpu) +void GPUBuffer_EndUpload(GPUBuffer* gpu) { - CHECK(pass); - CHECK(cbuf); + SDL_assert(pass); + SDL_assert(cbuf); SDL_EndGPUCopyPass(pass); SDL_SubmitGPUCommandBuffer(cbuf); pass = NULL; diff --git a/src/buffer.h b/src/buffer.h index ad961bc1..a84a06ab 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -2,7 +2,7 @@ #include -typedef struct cpu_buffer +typedef struct CPUBuffer { SDL_GPUDevice* device; SDL_GPUTransferBuffer* buffer; @@ -11,14 +11,14 @@ typedef struct cpu_buffer Uint32 capacity; Uint32 stride; } -cpu_buffer_t; +CPUBuffer; -void cpu_buffer_init(cpu_buffer_t* cpu, SDL_GPUDevice* device, Uint32 stride); -void cpu_buffer_free(cpu_buffer_t* cpu); -void cpu_buffer_append(cpu_buffer_t* cpu, void* item); -void cpu_buffer_clear(cpu_buffer_t* cpu); +void CPUBuffer_Init(CPUBuffer* cpu, SDL_GPUDevice* device, Uint32 stride); +void CPUBuffer_Free(CPUBuffer* cpu); +void CPUBuffer_Append(CPUBuffer* cpu, void* item); +void CPUBuffer_Clear(CPUBuffer* cpu); -typedef struct gpu_buffer +typedef struct GPUBuffer { SDL_GPUDevice* device; SDL_GPUBufferUsageFlags usage; @@ -26,11 +26,11 @@ typedef struct gpu_buffer Uint32 size; Uint32 capacity; } -gpu_buffer_t; +GPUBuffer; -void gpu_buffer_init(gpu_buffer_t* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage); -void gpu_buffer_free(gpu_buffer_t* gpu); -void gpu_buffer_upload(gpu_buffer_t* gpu, cpu_buffer_t* cpu); -void gpu_buffer_clear(gpu_buffer_t* gpu); -bool gpu_buffer_begin_upload(gpu_buffer_t* gpu); -void gpu_buffer_end_upload(gpu_buffer_t* gpu); +void GPUBuffer_Init(GPUBuffer* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage); +void GPUBuffer_Free(GPUBuffer* gpu); +void GPUBuffer_Upload(GPUBuffer* gpu, CPUBuffer* cpu); +void GPUBuffer_Clear(GPUBuffer* gpu); +bool GPUBuffer_BeginUpload(GPUBuffer* gpu); +void GPUBuffer_EndUpload(GPUBuffer* gpu); diff --git a/src/camera.c b/src/camera.c index 369dd92e..a5f31af6 100644 --- a/src/camera.c +++ b/src/camera.c @@ -1,12 +1,11 @@ #include #include "camera.h" -#include "check.h" #define DEGREES(rad) ((rad) * 180.0f / SDL_PI_F) #define RADIANS(deg) ((deg) * SDL_PI_F / 180.0f) -static void multiply(float matrix[4][4], float a[4][4], float b[4][4]) +static void Multiply(float matrix[4][4], float a[4][4], float b[4][4]) { float c[4][4] = {0}; for (int i = 0; i < 4; i++) @@ -24,7 +23,7 @@ static void multiply(float matrix[4][4], float a[4][4], float b[4][4]) } } -static void perspective(float matrix[4][4], float aspect, float fov, float near, float far) +static void Perspective(float matrix[4][4], float aspect, float fov, float near, float far) { matrix[0][0] = (1.0f / SDL_tanf(fov / 2.0f)) / aspect; matrix[0][1] = 0.0f; @@ -42,7 +41,7 @@ static void perspective(float matrix[4][4], float aspect, float fov, float near, matrix[3][3] = 0.0f; } -static void ortho(float matrix[4][4], float left, float right, float bottom, float top, float near, float far) +static void Ortho(float matrix[4][4], float left, float right, float bottom, float top, float near, float far) { matrix[0][0] = 2.0f / (right - left); matrix[0][1] = 0.0f; @@ -62,7 +61,7 @@ static void ortho(float matrix[4][4], float left, float right, float bottom, flo matrix[3][3] = 1.0f; } -static void translate(float matrix[4][4], float x, float y, float z) +static void Translate(float matrix[4][4], float x, float y, float z) { matrix[0][0] = 1.0f; matrix[0][1] = 0.0f; @@ -82,7 +81,7 @@ static void translate(float matrix[4][4], float x, float y, float z) matrix[3][3] = 1.0f; } -static void frustum(float planes[6][4], float a[4][4]) +static void Frustum(float planes[6][4], float a[4][4]) { planes[0][0] = a[0][3] + a[0][0]; planes[0][1] = a[1][3] + a[1][0]; @@ -126,7 +125,7 @@ static void frustum(float planes[6][4], float a[4][4]) } } -static void rotate(float matrix[4][4], float x, float y, float z, float angle) +static void Rotate(float matrix[4][4], float x, float y, float z, float angle) { float s = SDL_sinf(angle); float c = SDL_cosf(angle); @@ -149,7 +148,7 @@ static void rotate(float matrix[4][4], float x, float y, float z, float angle) matrix[3][3] = 1.0f; } -void camera_init(camera_t* camera, camera_type_t type) +void Camera_Init(Camera* camera, CameraType type) { camera->type = type; camera->x = 0.0f; @@ -165,31 +164,31 @@ void camera_init(camera_t* camera, camera_type_t type) camera->ortho = 100.0f; } -void camera_update(camera_t* camera) +void Camera_Update(Camera* camera) { float s = SDL_sinf(camera->yaw); float c = SDL_cosf(camera->yaw); - translate(camera->view, -camera->x, -camera->y, -camera->z); - rotate(camera->proj, c, 0.0f, s, camera->pitch); - multiply(camera->view, camera->proj, camera->view); - rotate(camera->proj, 0.0f, 1.0f, 0.0f, -camera->yaw); - multiply(camera->view, camera->proj, camera->view); + Translate(camera->view, -camera->x, -camera->y, -camera->z); + Rotate(camera->proj, c, 0.0f, s, camera->pitch); + Multiply(camera->view, camera->proj, camera->view); + Rotate(camera->proj, 0.0f, 1.0f, 0.0f, -camera->yaw); + Multiply(camera->view, camera->proj, camera->view); float aspect = (float) camera->width / camera->height; if (camera->type == CAMERA_TYPE_PERSPECTIVE) { - perspective(camera->proj, aspect, camera->fov, camera->near, camera->far); + Perspective(camera->proj, aspect, camera->fov, camera->near, camera->far); } else { float ox = camera->ortho * aspect; float oy = camera->ortho; - ortho(camera->proj, -ox, ox, -oy, oy, -camera->far, camera->far); + Ortho(camera->proj, -ox, ox, -oy, oy, -camera->far, camera->far); } - multiply(camera->matrix, camera->proj, camera->view); - frustum(camera->planes, camera->matrix); + Multiply(camera->matrix, camera->proj, camera->view); + Frustum(camera->planes, camera->matrix); } -void camera_move(camera_t* camera, float x, float y, float z) +void Camera_Move(Camera* camera, float x, float y, float z) { float sy = SDL_sinf(camera->yaw); float cy = SDL_cosf(camera->yaw); @@ -201,15 +200,15 @@ void camera_move(camera_t* camera, float x, float y, float z) camera->y = SDL_clamp(camera->y, -camera->far, camera->far); } -void camera_resize(camera_t* camera, int width, int height) +void Camera_Resize(Camera* camera, int width, int height) { - CHECK(width > 0.0f); - CHECK(height > 0.0f); + SDL_assert(width > 0.0f); + SDL_assert(height > 0.0f); camera->width = width; camera->height = height; } -void camera_rotate(camera_t* camera, float pitch, float yaw) +void Camera_Rotate(Camera* camera, float pitch, float yaw) { static const float PITCH = SDL_PI_F / 2.0f - SDL_FLT_EPSILON; camera->pitch += RADIANS(pitch); @@ -217,7 +216,7 @@ void camera_rotate(camera_t* camera, float pitch, float yaw) camera->pitch = SDL_clamp(camera->pitch, -PITCH, PITCH); } -void camera_get_vector(const camera_t* camera, float* x, float* y, float* z) +void Camera_GetVector(const Camera* camera, float* x, float* y, float* z) { float c = SDL_cosf(camera->pitch); *x = SDL_cosf(camera->yaw - RADIANS(90.0f)) * c; @@ -225,7 +224,7 @@ void camera_get_vector(const camera_t* camera, float* x, float* y, float* z) *z = SDL_sinf(camera->yaw - RADIANS(90.0f)) * c; } -bool camera_get_vis(const camera_t* camera, float x, float y, float z, float sx, float sy, float sz) +bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float sx, float sy, float sz) { float x2 = x + sx; float y2 = y + sy; diff --git a/src/camera.h b/src/camera.h index 4f8e704f..f6108ac6 100644 --- a/src/camera.h +++ b/src/camera.h @@ -2,17 +2,17 @@ #include -typedef enum camera_type +typedef enum CameraType { CAMERA_TYPE_ORTHO, CAMERA_TYPE_PERSPECTIVE, CAMERA_TYPE_COUNT, } -camera_type_t; +CameraType; -typedef struct camera +typedef struct Camera { - camera_type_t type; + CameraType type; float view[4][4]; float proj[4][4]; float matrix[4][4]; @@ -43,12 +43,12 @@ typedef struct camera float far; float ortho; } -camera_t; +Camera; -void camera_init(camera_t* camera, camera_type_t type); -void camera_update(camera_t* camera); -void camera_move(camera_t* camera, float x, float y, float z); -void camera_resize(camera_t* camera, int width, int height); -void camera_rotate(camera_t* camera, float pitch, float yaw); -void camera_get_vector(const camera_t* camera, float* x, float* y, float* z); -bool camera_get_vis(const camera_t* camera, float x, float y, float z, float sx, float sy, float sz); +void Camera_Init(Camera* camera, CameraType type); +void Camera_Update(Camera* camera); +void Camera_Move(Camera* camera, float x, float y, float z); +void Camera_Resize(Camera* camera, int width, int height); +void Camera_Rotate(Camera* camera, float pitch, float yaw); +void Camera_GetVector(const Camera* camera, float* x, float* y, float* z); +bool Camera_GetVisibility(const Camera* camera, float x, float y, float z, float sx, float sy, float sz); diff --git a/src/check.h b/src/check.h deleted file mode 100644 index 7e2c2c4d..00000000 --- a/src/check.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -// TODO: remove this file. replace CHECK with SDL_assert and add appropriate SDL defs in CMakeLists to remove in Release builds -#ifndef NDEBUG -#define CHECK(x) SDL_assert_always(x) -#else -#define CHECK(x) -#endif diff --git a/src/direction.h b/src/direction.h index 5ffc7a48..1067882f 100644 --- a/src/direction.h +++ b/src/direction.h @@ -1,6 +1,6 @@ #pragma once -typedef enum direction +typedef enum Direction { DIRECTION_NORTH, DIRECTION_SOUTH, @@ -10,7 +10,7 @@ typedef enum direction DIRECTION_DOWN, DIRECTION_COUNT, } -direction_t; +Direction; static const int DIRECTIONS[DIRECTION_COUNT][3] = { diff --git a/src/main.c b/src/main.c index 30a5f1c3..bd3ba94b 100644 --- a/src/main.c +++ b/src/main.c @@ -4,7 +4,6 @@ #include "block.h" #include "camera.h" -#include "check.h" #include "player.h" #include "save.h" #include "shader.h" @@ -29,23 +28,23 @@ static SDL_GPUGraphicsPipeline* depth_pipeline; static SDL_GPUGraphicsPipeline* shadow_pipeline; static SDL_GPUGraphicsPipeline* sky_pipeline; static SDL_GPUGraphicsPipeline* raycast_pipeline; -static SDL_GPUComputePipeline* ui_pipeline; +static SDL_GPUGraphicsPipeline* ui_pipeline; static SDL_Surface* atlas_surface; static SDL_GPUTexture* atlas_texture; static SDL_GPUTexture* depth_texture; static SDL_GPUTexture* position_texture; -static SDL_GPUTexture* composite_texture; static SDL_GPUTexture* multisample_color_texture; static SDL_GPUTexture* multisample_position_texture; static SDL_GPUTexture* shadow_texture; +static SDL_GPUBuffer* block_buffer; static SDL_GPUSampler* nearest_sampler; static SDL_GPUSampler* shadow_sampler; -static sky_t sky; -static player_t player; +static Sky sky; +static Player player; static Uint64 ticks1; static Uint64 ticks2; -static bool create_atlas() +static bool CreateAtlas() { char path[512] = {0}; SDL_snprintf(path, sizeof(path), "%satlas.png", SDL_GetBasePath()); @@ -151,7 +150,7 @@ static bool create_atlas() return true; } -static void set_window_icon(block_t block) +static void SetWindowIcon(Block block) { if (!atlas_surface) { @@ -164,7 +163,7 @@ static void set_window_icon(block_t block) return; } SDL_Rect src; - src.x = block_get_index(block, DIRECTION_NORTH) * BLOCK_WIDTH; + src.x = Block_GetIndex(block, DIRECTION_NORTH) * BLOCK_WIDTH; src.y = 0; src.w = BLOCK_WIDTH; src.h = BLOCK_WIDTH; @@ -183,7 +182,7 @@ static void set_window_icon(block_t block) SDL_DestroySurface(icon); } -static bool create_opaque_pipeline() +static bool CreateOpaquePipeline() { SDL_GPUColorTargetDescription color_targets[2] = {0}; color_targets[0].format = color_format; @@ -193,8 +192,8 @@ static bool create_opaque_pipeline() vertex_attributes[0].format = SDL_GPU_VERTEXELEMENTFORMAT_UINT; vertex_buffers[0].pitch = 4; SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = shader_load(device, "opaque.vert"); - info.fragment_shader = shader_load(device, "opaque.frag"); + info.vertex_shader = Shader_Load(device, "opaque.vert"); + info.fragment_shader = Shader_Load(device, "opaque.frag"); info.target_info.num_color_targets = 2; info.target_info.color_target_descriptions = color_targets; info.target_info.has_depth_stencil_target = true; @@ -218,15 +217,15 @@ static bool create_opaque_pipeline() return opaque_pipeline != NULL; } -static bool create_depth_pipeline() +static bool CreateDepthPipeline() { SDL_GPUVertexAttribute vertex_attributes[1] = {0}; SDL_GPUVertexBufferDescription vertex_buffers[1] = {0}; vertex_attributes[0].format = SDL_GPU_VERTEXELEMENTFORMAT_UINT; vertex_buffers[0].pitch = 4; SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = shader_load(device, "depth.vert"); - info.fragment_shader = shader_load(device, "depth.frag"); + info.vertex_shader = Shader_Load(device, "depth.vert"); + info.fragment_shader = Shader_Load(device, "depth.frag"); info.target_info.has_depth_stencil_target = true; info.target_info.depth_stencil_format = depth_format; info.vertex_input_state.num_vertex_attributes = 1; @@ -248,7 +247,7 @@ static bool create_depth_pipeline() return depth_pipeline != NULL; } -static bool create_transparent_pipeline() +static bool CreateTransparentPipeline() { SDL_GPUColorTargetDescription color_targets[1] = {0}; color_targets[0].format = color_format; @@ -264,8 +263,8 @@ static bool create_transparent_pipeline() vertex_attributes[0].format = SDL_GPU_VERTEXELEMENTFORMAT_UINT; vertex_buffers[0].pitch = 4; SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = shader_load(device, "transparent.vert"); - info.fragment_shader = shader_load(device, "transparent.frag"); + info.vertex_shader = Shader_Load(device, "transparent.vert"); + info.fragment_shader = Shader_Load(device, "transparent.frag"); info.target_info.num_color_targets = 1; info.target_info.color_target_descriptions = color_targets; info.target_info.has_depth_stencil_target = true; @@ -288,15 +287,15 @@ static bool create_transparent_pipeline() return transparent_pipeline != NULL; } -static bool create_shadow_pipeline() +static bool CreateShadowPipeline() { SDL_GPUVertexAttribute vertex_attributes[1] = {0}; SDL_GPUVertexBufferDescription vertex_buffers[1] = {0}; vertex_attributes[0].format = SDL_GPU_VERTEXELEMENTFORMAT_UINT; vertex_buffers[0].pitch = 4; SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = shader_load(device, "shadow.vert"); - info.fragment_shader = shader_load(device, "shadow.frag"); + info.vertex_shader = Shader_Load(device, "shadow.vert"); + info.fragment_shader = Shader_Load(device, "shadow.frag"); info.target_info.has_depth_stencil_target = true; info.target_info.depth_stencil_format = depth_format; info.vertex_input_state.num_vertex_attributes = 1; @@ -320,14 +319,14 @@ static bool create_shadow_pipeline() return shadow_pipeline != NULL; } -static bool create_sky_pipeline() +static bool CreateSkyPipeline() { SDL_GPUColorTargetDescription color_targets[2] = {0}; color_targets[0].format = color_format; color_targets[1].format = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT; SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = shader_load(device, "sky.vert"); - info.fragment_shader = shader_load(device, "sky.frag"); + info.vertex_shader = Shader_Load(device, "sky.vert"); + info.fragment_shader = Shader_Load(device, "sky.frag"); info.target_info.num_color_targets = 2; info.target_info.color_target_descriptions = color_targets; info.target_info.has_depth_stencil_target = true; @@ -342,7 +341,7 @@ static bool create_sky_pipeline() return sky_pipeline != NULL; } -static bool create_raycast_pipeline() +static bool CreateRaycastPipeline() { SDL_GPUColorTargetDescription color_targets[1] = {0}; color_targets[0].format = color_format; @@ -354,8 +353,8 @@ static bool create_raycast_pipeline() color_targets[0].blend_state.color_blend_op = SDL_GPU_BLENDOP_ADD; color_targets[0].blend_state.alpha_blend_op = SDL_GPU_BLENDOP_ADD; SDL_GPUGraphicsPipelineCreateInfo info = {0}; - info.vertex_shader = shader_load(device, "raycast.vert"); - info.fragment_shader = shader_load(device, "raycast.frag"); + info.vertex_shader = Shader_Load(device, "raycast.vert"); + info.fragment_shader = Shader_Load(device, "raycast.frag"); info.target_info.num_color_targets = 1; info.target_info.color_target_descriptions = color_targets; info.target_info.has_depth_stencil_target = true; @@ -372,7 +371,33 @@ static bool create_raycast_pipeline() return raycast_pipeline != NULL; } -static bool create_samplers() +static bool CreateUIPipeline() +{ + SDL_GPUColorTargetDescription color_target = {0}; + color_target.format = color_format; + color_target.blend_state.enable_blend = true; + color_target.blend_state.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_SRC_ALPHA; + color_target.blend_state.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; + color_target.blend_state.src_color_blendfactor = SDL_GPU_BLENDFACTOR_SRC_ALPHA; + color_target.blend_state.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; + color_target.blend_state.color_blend_op = SDL_GPU_BLENDOP_ADD; + color_target.blend_state.alpha_blend_op = SDL_GPU_BLENDOP_ADD; + SDL_GPUGraphicsPipelineCreateInfo info = {0}; + info.vertex_shader = Shader_Load(device, "ui.vert"); + info.fragment_shader = Shader_Load(device, "ui.frag"); + info.target_info.num_color_targets = 1; + info.target_info.color_target_descriptions = &color_target; + info.multisample_state.sample_count = SDL_GPU_SAMPLECOUNT_1; + if (info.vertex_shader && info.fragment_shader) + { + ui_pipeline = SDL_CreateGPUGraphicsPipeline(device, &info); + } + SDL_ReleaseGPUShader(device, info.vertex_shader); + SDL_ReleaseGPUShader(device, info.fragment_shader); + return ui_pipeline != NULL; +} + +static bool CreateSamplers() { SDL_GPUSamplerCreateInfo info = {0}; info.min_filter = SDL_GPU_FILTER_LINEAR; @@ -402,7 +427,7 @@ static bool create_samplers() return true; } -static bool create_textures() +static bool CreateTextures() { SDL_GPUTextureCreateInfo info = {0}; info.type = SDL_GPU_TEXTURETYPE_2D; @@ -454,73 +479,73 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) return false; } SDL_SetGPUSwapchainParameters(device, window, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_IMMEDIATE); - color_format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM; + color_format = SDL_GetGPUSwapchainTextureFormat(device, window); depth_format = SDL_GPU_TEXTUREFORMAT_D32_FLOAT; - if (!create_atlas()) + if (!CreateAtlas()) { SDL_Log("Failed to create atlas: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_samplers()) + if (!CreateSamplers()) { SDL_Log("Failed to create samplers: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_textures()) + if (!CreateTextures()) { SDL_Log("Failed to create textures: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_opaque_pipeline()) + if (!CreateOpaquePipeline()) { SDL_Log("Failed to create opaque pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_transparent_pipeline()) + if (!CreateTransparentPipeline()) { SDL_Log("Failed to create transparent pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_depth_pipeline()) + if (!CreateDepthPipeline()) { SDL_Log("Failed to create predepth pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_shadow_pipeline()) + if (!CreateShadowPipeline()) { SDL_Log("Failed to create shadow pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_sky_pipeline()) + if (!CreateSkyPipeline()) { SDL_Log("Failed to create sky pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!create_raycast_pipeline()) + if (!CreateRaycastPipeline()) { SDL_Log("Failed to create raycast pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - ui_pipeline = shader_load(device, "ui.comp"); - if (!ui_pipeline) + if (!CreateUIPipeline()) { - SDL_Log("Failed to load ui pipeline"); + SDL_Log("Failed to create ui pipeline: %s", SDL_GetError()); return SDL_APP_FAILURE; } - if (!block_init(device)) + block_buffer = Block_GetBuffer(device); + if (!block_buffer) { - SDL_Log("Failed to initialize blocks"); + SDL_Log("Failed to create block buffer"); return SDL_APP_FAILURE; } SDL_ShowWindow(window); SDL_SetWindowResizable(window, true); SDL_FlashWindow(window, SDL_FLASH_BRIEFLY); - set_window_icon(BLOCK_GRASS); - save_init(SAVE_PATH); - sky_save_or_load(&sky, false); - world_init(device); - player_save_or_load(&player, PLAYER_ID, false); - world_update(&player.camera); + SetWindowIcon(BLOCK_GRASS); + Save_Init(SAVE_PATH); + Sky_Load(&sky); + World_Init(device); + Player_Load(&player, PLAYER_ID); + World_Update(&player.camera); ticks2 = SDL_GetTicks(); ticks1 = ticks2; return SDL_APP_CONTINUE; @@ -529,22 +554,21 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) { SDL_HideWindow(window); - world_free(); - block_free(); - player_save_or_load(&player, PLAYER_ID, true); - sky_save_or_load(&sky, true); - save_free(); + World_Free(); + Player_Save(&player, PLAYER_ID); + Sky_Save(&sky); + Save_Free(); SDL_ReleaseGPUSampler(device, nearest_sampler); SDL_ReleaseGPUSampler(device, shadow_sampler); SDL_ReleaseGPUTexture(device, shadow_texture); SDL_ReleaseGPUTexture(device, multisample_position_texture); SDL_ReleaseGPUTexture(device, multisample_color_texture); - SDL_ReleaseGPUTexture(device, composite_texture); SDL_ReleaseGPUTexture(device, position_texture); SDL_ReleaseGPUTexture(device, depth_texture); SDL_ReleaseGPUTexture(device, atlas_texture); + SDL_ReleaseGPUBuffer(device, block_buffer); SDL_DestroySurface(atlas_surface); - SDL_ReleaseGPUComputePipeline(device, ui_pipeline); + SDL_ReleaseGPUGraphicsPipeline(device, ui_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, raycast_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, sky_pipeline); SDL_ReleaseGPUGraphicsPipeline(device, shadow_pipeline); @@ -557,16 +581,14 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) SDL_Quit(); } -static bool resize(int width, int height) +static bool Resize(int width, int height) { SDL_ReleaseGPUTexture(device, depth_texture); SDL_ReleaseGPUTexture(device, position_texture); - SDL_ReleaseGPUTexture(device, composite_texture); SDL_ReleaseGPUTexture(device, multisample_color_texture); SDL_ReleaseGPUTexture(device, multisample_position_texture); depth_texture = NULL; position_texture = NULL; - composite_texture = NULL; multisample_color_texture = NULL; multisample_position_texture = NULL; SDL_GPUTextureCreateInfo info = {0}; @@ -594,13 +616,6 @@ static bool resize(int width, int height) return false; } info.format = color_format; - info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE | SDL_GPU_TEXTUREUSAGE_SAMPLER; - composite_texture = SDL_CreateGPUTexture(device, &info); - if (!composite_texture) - { - SDL_Log("Failed to create composite texture: %s", SDL_GetError()); - return false; - } info.sample_count = SAMPLE_COUNT; info.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; multisample_color_texture = SDL_CreateGPUTexture(device, &info); @@ -616,11 +631,11 @@ static bool resize(int width, int height) SDL_Log("Failed to create multisample position texture: %s", SDL_GetError()); return false; } - camera_resize(&player.camera, width, height); + Camera_Resize(&player.camera, width, height); return true; } -static void render_shadow(SDL_GPUCommandBuffer* cbuf) +static void RenderShadow(SDL_GPUCommandBuffer* cbuf) { if (!sky.has_sun) { @@ -640,15 +655,13 @@ static void render_shadow(SDL_GPUCommandBuffer* cbuf) return; } SDL_BindGPUGraphicsPipeline(pass, shadow_pipeline); - SDL_GPUBuffer* block_buffer = block_get_buffer(); - SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); SDL_PushGPUDebugGroup(cbuf, "shadow"); - world_render(&sky.shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); + World_Render(&sky.shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); SDL_PopGPUDebugGroup(cbuf); SDL_EndGPURenderPass(pass); } -static void render_sky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void RenderSky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_PushGPUDebugGroup(cbuf, "sky"); SDL_BindGPUGraphicsPipeline(pass, sky_pipeline); @@ -659,7 +672,7 @@ static void render_sky(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_PopGPUDebugGroup(cbuf); } -static void render_opaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void RenderOpaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_GPUTextureSamplerBinding sampler_bindings[2] = {0}; sampler_bindings[0].texture = atlas_texture; @@ -672,11 +685,12 @@ static void render_opaque(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 2); - world_render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); + SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); + World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_OPAQUE | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); } -static void render_opaque_forward(SDL_GPUCommandBuffer* cbuf) +static void RenderOpaqueForward(SDL_GPUCommandBuffer* cbuf) { SDL_GPUColorTargetInfo color_info[2] = {0}; color_info[0].load_op = SDL_GPU_LOADOP_CLEAR; @@ -702,12 +716,12 @@ static void render_opaque_forward(SDL_GPUCommandBuffer* cbuf) SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } - render_sky(cbuf, pass); - render_opaque(cbuf, pass); + RenderSky(cbuf, pass); + RenderOpaque(cbuf, pass); SDL_EndGPURenderPass(pass); } -static void render_depth(SDL_GPUCommandBuffer* cbuf) +static void RenderDepth(SDL_GPUCommandBuffer* cbuf) { SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_LOAD; @@ -721,12 +735,12 @@ static void render_depth(SDL_GPUCommandBuffer* cbuf) } SDL_PushGPUDebugGroup(cbuf, "depth"); SDL_BindGPUGraphicsPipeline(pass, depth_pipeline); - world_render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT); + World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT); SDL_PopGPUDebugGroup(cbuf); SDL_EndGPURenderPass(pass); } -static void render_transparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void RenderTransparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { SDL_GPUTextureSamplerBinding sampler_bindings[3] = {0}; sampler_bindings[0].texture = atlas_texture; @@ -741,11 +755,12 @@ static void render_transparent(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pa SDL_PushGPUFragmentUniformData(cbuf, 2, player.camera.position, 12); SDL_PushGPUFragmentUniformData(cbuf, 3, &sky.render, sizeof(sky.render)); SDL_BindGPUFragmentSamplers(pass, 0, sampler_bindings, 3); - world_render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT | WORLD_FLAGS_LIGHT); + SDL_BindGPUFragmentStorageBuffers(pass, 0, &block_buffer, 1); + World_Render(&player.camera, cbuf, pass, WORLD_FLAGS_TRANSPARENT | WORLD_FLAGS_LIGHT); SDL_PopGPUDebugGroup(cbuf); } -static void render_raycast(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) +static void RenderRaycast(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) { if (player.query.block == BLOCK_EMPTY) { @@ -759,14 +774,13 @@ static void render_raycast(SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass) SDL_PopGPUDebugGroup(cbuf); } -static void render_forward(SDL_GPUCommandBuffer* cbuf) +static void RenderForward(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) { SDL_GPUColorTargetInfo color_info = {0}; color_info.load_op = SDL_GPU_LOADOP_LOAD; color_info.texture = multisample_color_texture; color_info.store_op = SDL_GPU_STOREOP_RESOLVE; - color_info.resolve_texture = composite_texture; - color_info.cycle_resolve_texture = true; + color_info.resolve_texture = swapchain_texture; SDL_GPUDepthStencilTargetInfo depth_info = {0}; depth_info.load_op = SDL_GPU_LOADOP_LOAD; depth_info.store_op = SDL_GPU_STOREOP_STORE; @@ -777,52 +791,45 @@ static void render_forward(SDL_GPUCommandBuffer* cbuf) SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } - render_transparent(cbuf, pass); - render_raycast(cbuf, pass); + RenderTransparent(cbuf, pass); + RenderRaycast(cbuf, pass); SDL_EndGPURenderPass(pass); } -static void render_ui(SDL_GPUCommandBuffer* cbuf) +static void RenderUI(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) { - SDL_GPUStorageTextureReadWriteBinding write_textures[1] = {0}; - write_textures[0].texture = composite_texture; - SDL_GPUComputePass* compute_pass = SDL_BeginGPUComputePass(cbuf, write_textures, 1, NULL, 0); - if (!compute_pass) + SDL_GPUColorTargetInfo color_info = {0}; + color_info.load_op = SDL_GPU_LOADOP_LOAD; + color_info.store_op = SDL_GPU_STOREOP_STORE; + color_info.texture = swapchain_texture; + SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cbuf, &color_info, 1, NULL); + if (!pass) { - SDL_Log("Failed to begin compute pass: %s", SDL_GetError()); + SDL_Log("Failed to begin render pass: %s", SDL_GetError()); return; } - SDL_GPUTextureSamplerBinding read_textures[1] = {0}; - read_textures[0].texture = atlas_texture; - read_textures[0].sampler = nearest_sampler; - Sint32 index = block_get_index(player.block, DIRECTION_NORTH); - int groups_x = (player.camera.width + 8 - 1) / 8; - int groups_y = (player.camera.height + 8 - 1) / 8; + SDL_GPUTextureSamplerBinding sampler_binding = {0}; + sampler_binding.texture = atlas_texture; + sampler_binding.sampler = nearest_sampler; + struct + { + int viewport[2]; + Uint32 index; + } + uniform; + uniform.viewport[0] = player.camera.width; + uniform.viewport[1] = player.camera.height; + uniform.index = Block_GetIndex(player.block, DIRECTION_NORTH); SDL_PushGPUDebugGroup(cbuf, "ui"); - SDL_BindGPUComputePipeline(compute_pass, ui_pipeline); - SDL_BindGPUComputeSamplers(compute_pass, 0, read_textures, 1); - SDL_PushGPUComputeUniformData(cbuf, 0, player.camera.size, 8); - SDL_PushGPUComputeUniformData(cbuf, 1, &index, 4); - SDL_DispatchGPUCompute(compute_pass, groups_x, groups_y, 1); - SDL_EndGPUComputePass(compute_pass); + SDL_BindGPUGraphicsPipeline(pass, ui_pipeline); + SDL_BindGPUFragmentSamplers(pass, 0, &sampler_binding, 1); + SDL_PushGPUVertexUniformData(cbuf, 0, &uniform, sizeof(uniform)); + SDL_DrawGPUPrimitives(pass, 6, 3, 0, 0); SDL_PopGPUDebugGroup(cbuf); + SDL_EndGPURenderPass(pass); } -static void render_swapchain(SDL_GPUCommandBuffer* cbuf, SDL_GPUTexture* swapchain_texture) -{ - SDL_GPUBlitInfo info = {0}; - info.source.texture = composite_texture; - info.source.w = player.camera.width; - info.source.h = player.camera.height; - info.destination.texture = swapchain_texture; - info.destination.w = player.camera.width; - info.destination.h = player.camera.height; - info.load_op = SDL_GPU_LOADOP_DONT_CARE; - info.filter = SDL_GPU_FILTER_NEAREST; - SDL_BlitGPUTexture(cbuf, &info); -} - -static void render() +static void Render() { SDL_GPUCommandBuffer* cbuf = SDL_AcquireGPUCommandBuffer(device); if (!cbuf) @@ -844,18 +851,17 @@ static void render() SDL_SubmitGPUCommandBuffer(cbuf); return; } - if ((width != player.camera.width || height != player.camera.height) && !resize(width, height)) + if ((width != player.camera.width || height != player.camera.height) && !Resize(width, height)) { SDL_SubmitGPUCommandBuffer(cbuf); return; } - camera_update(&player.camera); - render_shadow(cbuf); - render_opaque_forward(cbuf); - render_depth(cbuf); - render_forward(cbuf); - render_ui(cbuf); - render_swapchain(cbuf, swapchain_texture); + Camera_Update(&player.camera); + RenderShadow(cbuf); + RenderOpaqueForward(cbuf); + RenderDepth(cbuf); + RenderForward(cbuf, swapchain_texture); + RenderUI(cbuf, swapchain_texture); SDL_SubmitGPUCommandBuffer(cbuf); } @@ -864,15 +870,15 @@ SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) ticks2 = SDL_GetTicks(); float dt = ticks2 - ticks1; ticks1 = ticks2; - sky_update(&sky, dt / 1000.0f); + Sky_Update(&sky, dt / 1000.0f); if (SDL_GetWindowRelativeMouseMode(window)) { - player_move(&player, dt); - player_save_or_load(&player, PLAYER_ID, true); + Player_Move(&player, dt); + Player_Save(&player, PLAYER_ID); } - sky_update_shadow(&sky, &player.camera, SHADOW_RESOLUTION); - world_update(&player.camera); - render(); + Sky_UpdateShadow(&sky, &player.camera, SHADOW_RESOLUTION); + World_Update(&player.camera); + Render(); return SDL_APP_CONTINUE; } @@ -885,7 +891,7 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) case SDL_EVENT_MOUSE_MOTION: if (SDL_GetWindowRelativeMouseMode(window)) { - player_rotate(&player, event->motion.yrel, event->motion.xrel); + Player_Rotate(&player, event->motion.yrel, event->motion.xrel); } break; case SDL_EVENT_KEY_DOWN: @@ -896,7 +902,7 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) } else if (event->key.scancode == SDL_SCANCODE_F5) { - player_toggle_controller(&player); + Player_ToggleController(&player); } else if (event->key.scancode == SDL_SCANCODE_F11) { @@ -921,20 +927,20 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) { if (event->button.button == SDL_BUTTON_LEFT) { - player_break_block(&player); + Player_BreakBlock(&player); } else if (event->button.button == SDL_BUTTON_MIDDLE) { - player_select_block(&player); + Player_SelectBlock(&player); } else if (event->button.button == SDL_BUTTON_RIGHT) { - player_place_block(&player); + Player_PlaceBlock(&player); } } break; case SDL_EVENT_MOUSE_WHEEL: - player_change_block(&player, event->wheel.y); + Player_ChangeBlock(&player, event->wheel.y); break; } return SDL_APP_CONTINUE; diff --git a/src/map.c b/src/map.c deleted file mode 100644 index 3d483aea..00000000 --- a/src/map.c +++ /dev/null @@ -1,160 +0,0 @@ -#include - -#include "check.h" -#include "map.h" - -static const int EMPTY = 0; -static const int TOMBSTONE = 255; -static const float MAX_LOAD_FACTOR = 0.75f; - -static int hash_int(int x) -{ - x += (x << 10); - x ^= (x >> 6); - x += (x << 3); - x ^= (x >> 11); - x += (x << 15); - return x; -} - -static int hash_xyz(int x, int y, int z) -{ - return hash_int(x) ^ hash_int(y) ^ hash_int(z); -} - -static bool is_equal(const map_row_t row, int x, int y, int z) -{ - return row.x == x && row.y == y && row.z == z; -} - -static void grow(map_t* map) -{ - map_t old_map = *map; - map_init(map, old_map.capacity * 2); - for (Uint32 i = 0; i < old_map.capacity; ++i) - { - if (map_is_row_valid(&old_map, i)) - { - map_row_t row = old_map.rows[i]; - map_set(map, row.x, row.y, row.z, row.value); - } - } - map_free(&old_map); -} - -void map_init(map_t* map, int capacity) -{ - CHECK(SDL_HasExactlyOneBitSet32(capacity)); - map->rows = SDL_calloc(capacity, sizeof(map_row_t)); - map->capacity = capacity; - map->size = 0; -} - -void map_free(map_t* map) -{ - SDL_free(map->rows); - map->rows = NULL; - map->size = 0; - map->capacity = 0; -} - -void map_set(map_t* map, int x, int y, int z, int value) -{ - CHECK(value <= SDL_MAX_UINT8); - CHECK(value != EMPTY && value != TOMBSTONE); - if (((float) (map->size + 1) / map->capacity) > MAX_LOAD_FACTOR) - { - grow(map); - } - Uint32 mask = map->capacity - 1; - Uint32 index = hash_xyz(x, y, z) & mask; - Uint32 tombstone = SDL_MAX_UINT32; - for (;;) - { - map_row_t* row = &map->rows[index]; - if (row->value == EMPTY) - { - if (tombstone != SDL_MAX_UINT32) - { - row = &map->rows[tombstone]; - } - row->x = x; - row->y = y; - row->z = z; - row->value = value; - map->size++; - return; - } - if (row->value == TOMBSTONE) - { - if (tombstone == SDL_MAX_UINT32) - { - tombstone = index; - } - } - else if (is_equal(*row, x, y, z)) - { - row->value = value; - return; - } - index = (index + 1) & mask; - } -} - -int map_get(const map_t* map, int x, int y, int z) -{ - Uint32 mask = map->capacity - 1; - Uint32 index = hash_xyz(x, y, z) & mask; - for (;;) - { - const map_row_t row = map->rows[index]; - if (row.value == EMPTY) - { - return EMPTY; - } - if (row.value != TOMBSTONE && is_equal(row, x, y, z)) - { - return row.value; - } - index = (index + 1) & mask; - } -} - -void map_remove(map_t* map, int x, int y, int z) -{ - Uint32 mask = map->capacity - 1; - Uint32 index = hash_xyz(x, y, z) & mask; - for (;;) - { - map_row_t* row = &map->rows[index]; - if (row->value == EMPTY) - { - return; - } - if (row->value != TOMBSTONE && is_equal(*row, x, y, z)) - { - row->value = TOMBSTONE; - map->size--; - return; - } - index = (index + 1) & mask; - } -} - -void map_clear(map_t* map) -{ - SDL_memset(map->rows, 0, map->capacity * sizeof(map_row_t)); - map->size = 0; -} - -bool map_is_row_valid(const map_t* map, Uint32 index) -{ - map_row_t row = map->rows[index]; - return row.value != EMPTY && row.value != TOMBSTONE; -} - -map_row_t map_get_row(const map_t* map, Uint32 index) -{ - CHECK(map_is_row_valid(map, index)); - return map->rows[index]; -} diff --git a/src/map.h b/src/map.h deleted file mode 100644 index 201b6bd3..00000000 --- a/src/map.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -typedef struct map_row -{ - Uint8 x; - Uint8 y; - Uint8 z; - Uint8 value; -} -map_row_t; - -typedef struct map -{ - map_row_t* rows; - Uint32 size; - Uint32 capacity; -} -map_t; - -void map_init(map_t* map, int capacity); -void map_free(map_t* map); -void map_set(map_t* map, int x, int y, int z, int value); -int map_get(const map_t* map, int x, int y, int z); -void map_remove(map_t* map, int x, int y, int z); -void map_clear(map_t* map); -bool map_is_row_valid(const map_t* map, Uint32 index); -map_row_t map_get_row(const map_t* map, Uint32 index); diff --git a/src/player.c b/src/player.c index f6ddccc3..eb915a96 100644 --- a/src/player.c +++ b/src/player.c @@ -6,12 +6,23 @@ #include "save.h" #include "world.h" -typedef struct aabb +typedef struct AABB { float min[3]; float max[3]; } -aabb_t; +AABB; + +typedef struct PlayerSave +{ + float x; + float y; + float z; + float pitch; + float yaw; + Block block; +} +PlayerSave; static const float PHYSICS_EPSILON = 0.001f; static const float WALK_SPEED = 5.0f; @@ -29,19 +40,19 @@ static const float COLLISION_RADIUS = 0.3f; static const float COLLISION_HEIGHT = 1.8f; static const float EYE_OFFSET = 1.62f; -static aabb_t get_aabb() +static AABB GetAABB() { - return (aabb_t) {{-COLLISION_RADIUS, -EYE_OFFSET, -COLLISION_RADIUS}, + return (AABB) {{-COLLISION_RADIUS, -EYE_OFFSET, -COLLISION_RADIUS}, {COLLISION_RADIUS, COLLISION_HEIGHT - EYE_OFFSET, COLLISION_RADIUS}}; } -static bool is_solid(const float position[3]) +static bool IsSolid(const float position[3]) { int index[3] = {position[0], position[1], position[2]}; - return block_is_solid(world_get_block(index)); + return Block_IsSolid(World_GetBlock(index)); } -static bool is_colliding(const aabb_t *aabb, const float position[3]) +static bool IsColliding(const AABB *aabb, const float position[3]) { int min[3]; int max[3]; @@ -55,7 +66,7 @@ static bool is_colliding(const aabb_t *aabb, const float position[3]) for (int bz = min[2]; bz <= max[2]; bz++) { float location[3] = {bx, by, bz}; - if (is_solid(location)) + if (IsSolid(location)) { return true; } @@ -63,7 +74,7 @@ static bool is_colliding(const aabb_t *aabb, const float position[3]) return false; } -static void bisect(const aabb_t* aabb, float position[3], int axis, float step) +static void Bisect(const AABB* aabb, float position[3], int axis, float step) { float start[3] = {position[0], position[1], position[2]}; float lower = 0.0f; @@ -73,7 +84,7 @@ static void bisect(const aabb_t* aabb, float position[3], int axis, float step) float t = (lower + upper) * 0.5f; float location[3] = {start[0], start[1], start[2]}; location[axis] += step * t; - if (is_colliding(aabb, location)) + if (IsColliding(aabb, location)) { upper = t; } @@ -85,7 +96,7 @@ static void bisect(const aabb_t* aabb, float position[3], int axis, float step) position[axis] = start[axis] + step * lower; } -static bool move(const aabb_t* aabb, float position[3], int axis, float delta) +static bool Move(const AABB* aabb, float position[3], int axis, float delta) { if (SDL_fabsf(delta) <= SDL_FLT_EPSILON) { @@ -98,9 +109,9 @@ static bool move(const aabb_t* aabb, float position[3], int axis, float delta) { float location[3] = {position[0], position[1], position[2]}; location[axis] += step; - if (is_colliding(aabb, location)) + if (IsColliding(aabb, location)) { - bisect(aabb, position, axis, step); + Bisect(aabb, position, axis, step); return true; } SDL_memcpy(position, location, 12); @@ -108,36 +119,16 @@ static bool move(const aabb_t* aabb, float position[3], int axis, float delta) return false; } -void player_save_or_load(player_t* player, int id, bool save) +void Player_Load(Player* player, int id) { - struct - { - float x; - float y; - float z; - float pitch; - float yaw; - block_t block; - } - data; - if (save) - { - data.x = player->camera.x; - data.y = player->camera.y; - data.z = player->camera.z; - data.pitch = player->camera.pitch; - data.yaw = player->camera.yaw; - data.block = player->block; - save_set_player(id, &data, sizeof(data)); - return; - } - camera_init(&player->camera, CAMERA_TYPE_PERSPECTIVE); + PlayerSave data; + Camera_Init(&player->camera, CAMERA_TYPE_PERSPECTIVE); player->camera.x = -200.0f; player->camera.y = 50.0f; player->camera.z = 0.0f; player->controller = PLAYER_CONTROLLER_WALK; player->block = BLOCK_YELLOW_TORCH; - if (save_get_player(id, &data, sizeof(data))) + if (Save_GetPlayer(id, &data, sizeof(data))) { player->block = data.block; player->camera.x = data.x; @@ -146,27 +137,39 @@ void player_save_or_load(player_t* player, int id, bool save) player->camera.pitch = data.pitch; player->camera.yaw = data.yaw; } - player->query = world_raycast(&player->camera, REACH); + player->query = World_Raycast(&player->camera, REACH); +} + +void Player_Save(const Player* player, int id) +{ + PlayerSave data; + data.x = player->camera.x; + data.y = player->camera.y; + data.z = player->camera.z; + data.pitch = player->camera.pitch; + data.yaw = player->camera.yaw; + data.block = player->block; + Save_SetPlayer(id, &data, sizeof(data)); } -void player_toggle_controller(player_t* player) +void Player_ToggleController(Player* player) { player->controller++; player->controller %= PLAYER_CONTROLLER_COUNT; } -void player_rotate(player_t* player, float pitch, float yaw) +void Player_Rotate(Player* player, float pitch, float yaw) { - camera_rotate(&player->camera, pitch * -SENSITIVITY, yaw * SENSITIVITY); - player->query = world_raycast(&player->camera, REACH); + Camera_Rotate(&player->camera, pitch * -SENSITIVITY, yaw * SENSITIVITY); + player->query = World_Raycast(&player->camera, REACH); } -void player_move(player_t* player, float dt) +void Player_Move(Player* player, float dt) { const bool* keys = SDL_GetKeyboardState(NULL); if (player->controller == PLAYER_CONTROLLER_WALK) { - const aabb_t aabb = get_aabb(); + const AABB aabb = GetAABB(); dt = SDL_min(dt * 0.001f, 0.05f); float input_x = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; float input_z = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; @@ -205,7 +208,7 @@ void player_move(player_t* player, float dt) bool hits[3]; for (int i = 0; i < 3; i++) { - hits[i] = move(&aabb, player->camera.position, i, player->velocity[i] * dt); + hits[i] = Move(&aabb, player->camera.position, i, player->velocity[i] * dt); } if (hits[0]) { @@ -234,36 +237,36 @@ void player_move(player_t* player, float dt) float dx = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; float dy = (keys[SDL_SCANCODE_E] || keys[SDL_SCANCODE_SPACE]) - (keys[SDL_SCANCODE_Q] || keys[SDL_SCANCODE_LSHIFT]); float dz = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; - camera_move(&player->camera, dx * speed * dt, dy * speed * dt, dz * speed * dt); + Camera_Move(&player->camera, dx * speed * dt, dy * speed * dt, dz * speed * dt); } - player->query = world_raycast(&player->camera, REACH); + player->query = World_Raycast(&player->camera, REACH); } -void player_place_block(const player_t* player) +void Player_PlaceBlock(const Player* player) { if (player->query.block == BLOCK_EMPTY) { return; } - if (!block_is_solid(player->block)) + if (!Block_IsSolid(player->block)) { - world_set_block(player->query.previous, player->block); + World_SetBlock(player->query.previous, player->block); return; } - const aabb_t aabb = get_aabb(); + const AABB aabb = GetAABB(); for (int i = 0; i < 3; i++) { float min = player->camera.position[i] + aabb.min[i] + PHYSICS_EPSILON; float max = player->camera.position[i] + aabb.max[i] - PHYSICS_EPSILON; if (max <= player->query.previous[i] || min >= player->query.previous[i] + 1.0f) { - world_set_block(player->query.previous, player->block); + World_SetBlock(player->query.previous, player->block); break; } } } -void player_select_block(player_t* player) +void Player_SelectBlock(Player* player) { if (player->query.block != BLOCK_EMPTY) { @@ -271,15 +274,15 @@ void player_select_block(player_t* player) } } -void player_break_block(const player_t* player) +void Player_BreakBlock(const Player* player) { if (player->query.block != BLOCK_EMPTY) { - world_set_block(player->query.current, BLOCK_EMPTY); + World_SetBlock(player->query.current, BLOCK_EMPTY); } } -void player_change_block(player_t* player, int dy) +void Player_ChangeBlock(Player* player, int dy) { static const int COUNT = BLOCK_COUNT - BLOCK_EMPTY - 1; int block = player->block - (BLOCK_EMPTY + 1) + dy; diff --git a/src/player.h b/src/player.h index 07ce1e12..93bed987 100644 --- a/src/player.h +++ b/src/player.h @@ -6,30 +6,31 @@ #include "camera.h" #include "world.h" -typedef enum player_controller +typedef enum PlayerController { PLAYER_CONTROLLER_WALK, PLAYER_CONTROLLER_FLY, PLAYER_CONTROLLER_COUNT, } -player_controller_t; +PlayerController; -typedef struct player +typedef struct Player { - camera_t camera; - player_controller_t controller; + Camera camera; + PlayerController controller; float velocity[3]; bool is_on_ground; - world_query_t query; - block_t block; + WorldQuery query; + Block block; } -player_t; +Player; -void player_save_or_load(player_t* player, int id, bool save); -void player_toggle_controller(player_t* player); -void player_rotate(player_t* player, float pitch, float yaw); -void player_move(player_t* player, float dt); -void player_place_block(const player_t* player); -void player_select_block(player_t* player); -void player_break_block(const player_t* player); -void player_change_block(player_t* player, int dy); +void Player_Load(Player* player, int id); +void Player_Save(const Player* player, int id); +void Player_ToggleController(Player* player); +void Player_Rotate(Player* player, float pitch, float yaw); +void Player_Move(Player* player, float dt); +void Player_PlaceBlock(const Player* player); +void Player_SelectBlock(Player* player); +void Player_BreakBlock(const Player* player); +void Player_ChangeBlock(Player* player, int dy); diff --git a/src/rand.c b/src/rand.c index 4ef14344..21414999 100644 --- a/src/rand.c +++ b/src/rand.c @@ -4,7 +4,7 @@ #include "rand.h" #include "world.h" -void rand_get_blocks(void* userdata, int cx, int cz, rand_set_block_t function) +void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock function) { for (int a = 0; a < CHUNK_WIDTH; a++) for (int b = 0; b < CHUNK_WIDTH; b++) @@ -24,8 +24,8 @@ void rand_get_blocks(void* userdata, int cx, int cz, rand_set_block_t function) low = true; } float biome = stb_perlin_fbm_noise3(x * 0.2f, 0.0f, z * 0.2f, 2.0f, 0.5f, 6); - block_t top; - block_t bottom; + Block top; + Block bottom; if (height + biome < 31) { top = BLOCK_SAND; @@ -89,7 +89,7 @@ void rand_get_blocks(void* userdata, int cx, int cz, rand_set_block_t function) else if (plant > 0.52f) { int value = SDL_max(((int) (plant * 1000.0f)) % 4, 0); - block_t flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; + Block flowers[] = {BLOCK_BLUEBELL, BLOCK_GARDENIA, BLOCK_LAVENDER, BLOCK_ROSE}; function(userdata, x, y + 1, z, flowers[value]); } } diff --git a/src/rand.h b/src/rand.h index f5d7d380..63c8f64d 100644 --- a/src/rand.h +++ b/src/rand.h @@ -4,6 +4,6 @@ #include "block.h" -typedef void (*rand_set_block_t)(void* userdata, int bx, int by, int bz, block_t block); +typedef void (*RandSetBlock)(void* userdata, int bx, int by, int bz, Block block); -void rand_get_blocks(void* userdata, int cx, int cz, rand_set_block_t function); +void Rand_GetBlocks(void* userdata, int cx, int cz, RandSetBlock function); diff --git a/src/save.c b/src/save.c index d04cb1fb..098f2b18 100644 --- a/src/save.c +++ b/src/save.c @@ -40,7 +40,7 @@ static sqlite3_stmt* set_block; static sqlite3_stmt* get_blocks; static SDL_Mutex* mutex; -bool save_init(const char* path) +bool Save_Init(const char* path) { if (sqlite3_open(path, &handle)) { @@ -107,7 +107,7 @@ bool save_init(const char* path) return true; } -void save_free() +void Save_Free() { SDL_DestroyMutex(mutex); sqlite3_exec(handle, "COMMIT;", NULL, NULL, NULL); @@ -128,7 +128,7 @@ void save_free() mutex = NULL; } -void save_commit() +void Save_Commit() { if (!handle) { @@ -139,7 +139,7 @@ void save_commit() SDL_UnlockMutex(mutex); } -void save_set_player(int id, const void* data, int size) +void Save_SetPlayer(int id, const void* data, int size) { if (!handle) { @@ -156,7 +156,7 @@ void save_set_player(int id, const void* data, int size) SDL_UnlockMutex(mutex); } -bool save_get_player(int id, void* data, int size) +bool Save_GetPlayer(int id, void* data, int size) { if (!handle) { @@ -183,7 +183,7 @@ bool save_get_player(int id, void* data, int size) return has_player; } -void save_set_sky(float time_of_day) +void Save_SetSky(float time_of_day) { if (!handle) { @@ -199,7 +199,7 @@ void save_set_sky(float time_of_day) SDL_UnlockMutex(mutex); } -bool save_get_sky(float* time_of_day) +bool Save_GetSky(float* time_of_day) { if (!handle) { @@ -216,7 +216,7 @@ bool save_get_sky(float* time_of_day) return has_sky; } -void save_set_block(int cx, int cz, int bx, int by, int bz, block_t block) +void Save_SetBlock(int cx, int cz, int bx, int by, int bz, Block block) { if (!handle) { @@ -237,7 +237,7 @@ void save_set_block(int cx, int cz, int bx, int by, int bz, block_t block) SDL_UnlockMutex(mutex); } -void save_get_blocks(void* userdata, int cx, int cz, save_set_block_t function) +void Save_GetBlocks(void* userdata, int cx, int cz, SaveSetBlock function) { if (!handle) { @@ -251,7 +251,7 @@ void save_get_blocks(void* userdata, int cx, int cz, save_set_block_t function) int bx = sqlite3_column_int(get_blocks, 0); int by = sqlite3_column_int(get_blocks, 1); int bz = sqlite3_column_int(get_blocks, 2); - block_t block = sqlite3_column_int(get_blocks, 3); + Block block = sqlite3_column_int(get_blocks, 3); function(userdata, bx, by, bz, block); } sqlite3_reset(get_blocks); diff --git a/src/save.h b/src/save.h index ea0e514a..8396d773 100644 --- a/src/save.h +++ b/src/save.h @@ -4,14 +4,14 @@ #include "block.h" -typedef void (*save_set_block_t)(void* userdata, int bx, int by, int bz, block_t block); +typedef void (*SaveSetBlock)(void* userdata, int bx, int by, int bz, Block block); -bool save_init(const char* path); -void save_free(); -void save_commit(); -void save_set_player(int id, const void* data, int size); -bool save_get_player(int id, void* data, int size); -void save_set_sky(float time_of_day); -bool save_get_sky(float* time_of_day); -void save_set_block(int cx, int cz, int bx, int by, int bz, block_t block); -void save_get_blocks(void* userdata, int cx, int cz, save_set_block_t function); +bool Save_Init(const char* path); +void Save_Free(); +void Save_Commit(); +void Save_SetPlayer(int id, const void* data, int size); +bool Save_GetPlayer(int id, void* data, int size); +void Save_SetSky(float time_of_day); +bool Save_GetSky(float* time_of_day); +void Save_SetBlock(int cx, int cz, int bx, int by, int bz, Block block); +void Save_GetBlocks(void* userdata, int cx, int cz, SaveSetBlock function); diff --git a/src/shader.c b/src/shader.c index 6baa3dc2..d7448b5b 100644 --- a/src/shader.c +++ b/src/shader.c @@ -1,10 +1,63 @@ #include #include -#include "check.h" #include "shader.h" -void* shader_load(SDL_GPUDevice* device, const char* name) +static bool TokenIs(const char* json, const jsmntok_t* token, const char* string) +{ + int size = token->end - token->start; + return size == SDL_strlen(string) && !SDL_memcmp(json + token->start, string, size); +} + +static Uint32 TokenGetUint(const char* json, const jsmntok_t* token) +{ + Uint32 value = 0; + for (int i = token->start; i < token->end; i++) + { + SDL_assert(json[i] >= '0' && json[i] <= '9'); + value = value * 10 + json[i] - '0'; + } + return value; +} + +static bool GetResources(const char* json, size_t size, SDL_GPUShaderCreateInfo* info) +{ + jsmn_parser parser; + jsmntok_t tokens[128] = {0}; + jsmn_init(&parser); + int count = jsmn_parse(&parser, json, size, tokens, SDL_arraysize(tokens)); + if (count <= 0) + { + return false; + } + for (int i = 1; i + 1 < count; i += 2) + { + if (tokens[i].type != JSMN_STRING) + { + continue; + } + Uint32 value = TokenGetUint(json, &tokens[i + 1]); + if (TokenIs(json, &tokens[i], "samplers")) + { + info->num_samplers = value; + } + else if (TokenIs(json, &tokens[i], "storage_textures")) + { + info->num_storage_textures = value; + } + else if (TokenIs(json, &tokens[i], "storage_buffers")) + { + info->num_storage_buffers = value; + } + else if (TokenIs(json, &tokens[i], "uniform_buffers")) + { + info->num_uniform_buffers = value; + } + } + return true; +} + +SDL_GPUShader* Shader_Load(SDL_GPUDevice* device, const char* name) { SDL_GPUShaderFormat format = SDL_GetGPUShaderFormats(device); const char* entrypoint; @@ -29,7 +82,9 @@ void* shader_load(SDL_GPUDevice* device, const char* name) } else { - CHECK(false); + SDL_assert(false); + SDL_Log("Unsupported shader format"); + return NULL; } char shader_path[512] = {0}; char shader_json_path[512] = {0}; @@ -38,142 +93,43 @@ void* shader_load(SDL_GPUDevice* device, const char* name) size_t shader_size; size_t shader_json_size; Uint8* shader_data = SDL_LoadFile(shader_path, &shader_size); + char* shader_json_data = NULL; + SDL_GPUShader* shader = NULL; if (!shader_data) { SDL_Log("Failed to load shader: %s", shader_path); return NULL; } - char* shader_json_data = SDL_LoadFile(shader_json_path, &shader_json_size); + shader_json_data = SDL_LoadFile(shader_json_path, &shader_json_size); if (!shader_json_data) { SDL_Log("Failed to load shader json: %s", shader_json_path); - return NULL; + goto cleanup; } - jsmn_parser json_parser; - jsmntok_t json_tokens[128] = {0}; - jsmn_init(&json_parser); - int tokens = jsmn_parse(&json_parser, shader_json_data, shader_json_size, json_tokens, 128); - if (tokens <= 0) + SDL_GPUShaderCreateInfo info = {0}; + if (!GetResources(shader_json_data, shader_json_size, &info)) { SDL_Log("Failed to parse json: %s", shader_json_path); - return NULL; + goto cleanup; } - void* shader = NULL; - if (SDL_strstr(name, ".comp")) + info.code = shader_data; + info.code_size = shader_size; + info.entrypoint = entrypoint; + info.format = format; + if (SDL_strstr(name, ".frag")) { - SDL_GPUComputePipelineCreateInfo info = {0}; - for (int i = 1; i < tokens; i += 2) - { - if (json_tokens[i].type != JSMN_STRING) - { - continue; - } - char* key_string = shader_json_data + json_tokens[i + 0].start; - char* value_string = shader_json_data + json_tokens[i + 1].start; - int key_size = json_tokens[i + 0].end - json_tokens[i + 0].start; - Uint32* value; - if (!SDL_memcmp("samplers", key_string, key_size)) - { - value = &info.num_samplers; - } - else if (!SDL_memcmp("readonly_storage_textures", key_string, key_size)) - { - value = &info.num_readonly_storage_textures; - } - else if (!SDL_memcmp("readonly_storage_buffers", key_string, key_size)) - { - value = &info.num_readonly_storage_buffers; - } - else if (!SDL_memcmp("readwrite_storage_textures", key_string, key_size)) - { - value = &info.num_readwrite_storage_textures; - } - else if (!SDL_memcmp("readwrite_storage_buffers", key_string, key_size)) - { - value = &info.num_readwrite_storage_buffers; - } - else if (!SDL_memcmp("uniform_buffers", key_string, key_size)) - { - value = &info.num_uniform_buffers; - } - else if (!SDL_memcmp("threadcount_x", key_string, key_size)) - { - value = &info.threadcount_x; - } - else if (!SDL_memcmp("threadcount_y", key_string, key_size)) - { - value = &info.threadcount_y; - } - else if (!SDL_memcmp("threadcount_z", key_string, key_size)) - { - value = &info.threadcount_z; - } - else - { - continue; - } - *value = *value_string - '0'; - } - info.code = shader_data; - info.code_size = shader_size; - info.entrypoint = entrypoint; - info.format = format; - shader = SDL_CreateGPUComputePipeline(device, &info); + info.stage = SDL_GPU_SHADERSTAGE_FRAGMENT; } else { - SDL_GPUShaderCreateInfo info = {0}; - for (int i = 1; i < tokens; i += 2) - { - if (json_tokens[i].type != JSMN_STRING) - { - continue; - } - char* key_string = shader_json_data + json_tokens[i + 0].start; - char* value_string = shader_json_data + json_tokens[i + 1].start; - int key_size = json_tokens[i + 0].end - json_tokens[i + 0].start; - Uint32* value; - if (!SDL_memcmp("samplers", key_string, key_size)) - { - value = &info.num_samplers; - } - else if (!SDL_memcmp("storage_textures", key_string, key_size)) - { - value = &info.num_storage_textures; - } - else if (!SDL_memcmp("storage_buffers", key_string, key_size)) - { - value = &info.num_storage_buffers; - } - else if (!SDL_memcmp("uniform_buffers", key_string, key_size)) - { - value = &info.num_uniform_buffers; - } - else - { - continue; - } - *value = *value_string - '0'; - } - info.code = shader_data; - info.code_size = shader_size; - info.entrypoint = entrypoint; - info.format = format; - if (SDL_strstr(name, ".frag")) - { - info.stage = SDL_GPU_SHADERSTAGE_FRAGMENT; - } - else - { - info.stage = SDL_GPU_SHADERSTAGE_VERTEX; - } - shader = SDL_CreateGPUShader(device, &info); + info.stage = SDL_GPU_SHADERSTAGE_VERTEX; } + shader = SDL_CreateGPUShader(device, &info); if (!shader) { SDL_Log("Failed to create shader: %s", SDL_GetError()); - return NULL; } +cleanup: SDL_free(shader_data); SDL_free(shader_json_data); return shader; diff --git a/src/shader.h b/src/shader.h index b246f2d1..6287d2e9 100644 --- a/src/shader.h +++ b/src/shader.h @@ -2,4 +2,4 @@ #include -void* shader_load(SDL_GPUDevice* device, const char* path); \ No newline at end of file +SDL_GPUShader* Shader_Load(SDL_GPUDevice* device, const char* path); diff --git a/src/sky.c b/src/sky.c index cdf2cd04..abbfda76 100644 --- a/src/sky.c +++ b/src/sky.c @@ -25,7 +25,7 @@ static const float SUNSET_SKY_HORIZON[3] = {1.0f, 0.5f, 0.2f}; static const float NIGHT_AMBIENT[3] = {0.05f, 0.05f, 0.1f}; static const float DAY_AMBIENT[3] = {1.0f, 1.0f, 1.0f}; -static void lerp_color(float output[4], const float a[3], const float b[3], float t) +static void LerpColor(float output[4], const float a[3], const float b[3], float t) { output[0] = a[0] + (b[0] - a[0]) * t; output[1] = a[1] + (b[1] - a[1]) * t; @@ -33,7 +33,7 @@ static void lerp_color(float output[4], const float a[3], const float b[3], floa output[3] = 0.0f; } -static void update_render(sky_t* sky) +static void UpdateRender(Sky* sky) { float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; float sunrise_end = SUNRISE_LENGTH / total_length; @@ -44,30 +44,30 @@ static void update_render(sky_t* sky) if (sky->time_of_day < sunrise_end) { t = sky->time_of_day / sunrise_end; - lerp_color(sky->render.top, NIGHT_SKY_TOP, SUNRISE_SKY_TOP, t); - lerp_color(sky->render.horizon, NIGHT_SKY_HORIZON, SUNRISE_SKY_HORIZON, t); - lerp_color(ambient, NIGHT_AMBIENT, DAY_AMBIENT, t); + LerpColor(sky->render.top, NIGHT_SKY_TOP, SUNRISE_SKY_TOP, t); + LerpColor(sky->render.horizon, NIGHT_SKY_HORIZON, SUNRISE_SKY_HORIZON, t); + LerpColor(ambient, NIGHT_AMBIENT, DAY_AMBIENT, t); } else if (sky->time_of_day < day_end) { t = (sky->time_of_day - sunrise_end) / (day_end - sunrise_end); - lerp_color(sky->render.top, SUNRISE_SKY_TOP, DAY_SKY_TOP, t); - lerp_color(sky->render.horizon, SUNRISE_SKY_HORIZON, DAY_SKY_HORIZON, t); - lerp_color(ambient, DAY_AMBIENT, DAY_AMBIENT, t); + LerpColor(sky->render.top, SUNRISE_SKY_TOP, DAY_SKY_TOP, t); + LerpColor(sky->render.horizon, SUNRISE_SKY_HORIZON, DAY_SKY_HORIZON, t); + LerpColor(ambient, DAY_AMBIENT, DAY_AMBIENT, t); } else if (sky->time_of_day < sunset_end) { t = (sky->time_of_day - day_end) / (sunset_end - day_end); - lerp_color(sky->render.top, DAY_SKY_TOP, SUNSET_SKY_TOP, t); - lerp_color(sky->render.horizon, DAY_SKY_HORIZON, SUNSET_SKY_HORIZON, t); - lerp_color(ambient, DAY_AMBIENT, NIGHT_AMBIENT, t); + LerpColor(sky->render.top, DAY_SKY_TOP, SUNSET_SKY_TOP, t); + LerpColor(sky->render.horizon, DAY_SKY_HORIZON, SUNSET_SKY_HORIZON, t); + LerpColor(ambient, DAY_AMBIENT, NIGHT_AMBIENT, t); } else { t = (sky->time_of_day - sunset_end) / (1.0f - sunset_end); - lerp_color(sky->render.top, SUNSET_SKY_TOP, NIGHT_SKY_TOP, t); - lerp_color(sky->render.horizon, SUNSET_SKY_HORIZON, NIGHT_SKY_HORIZON, t); - lerp_color(ambient, NIGHT_AMBIENT, NIGHT_AMBIENT, t); + LerpColor(sky->render.top, SUNSET_SKY_TOP, NIGHT_SKY_TOP, t); + LerpColor(sky->render.horizon, SUNSET_SKY_HORIZON, NIGHT_SKY_HORIZON, t); + LerpColor(ambient, NIGHT_AMBIENT, NIGHT_AMBIENT, t); } float angle = sky->time_of_day * 2.0f * SDL_PI_F; float sun_height = -SDL_cosf(angle); @@ -85,15 +85,10 @@ static void update_render(sky_t* sky) sky->render.ambient[3] = 0.0f; } -void sky_save_or_load(sky_t* sky, bool save) +void Sky_Load(Sky* sky) { - SDL_COMPILE_TIME_ASSERT("", sizeof(sky_render_t) == sizeof(float) * 16); - if (save) - { - save_set_sky(sky->time_of_day); - return; - } - camera_init(&sky->shadow_camera, CAMERA_TYPE_ORTHO); + SDL_COMPILE_TIME_ASSERT("", sizeof(SkyRender) == sizeof(float) * 16); + Camera_Init(&sky->shadow_camera, CAMERA_TYPE_ORTHO); sky->shadow_camera.ortho = SHADOW_ORTHO; sky->shadow_camera.far = SHADOW_FAR; sky->shadow_frame = 0; @@ -102,24 +97,29 @@ void sky_save_or_load(sky_t* sky, bool save) float day_end = sunrise_end + DAY_LENGTH / total_length; sky->time_of_day = sunrise_end + (day_end - sunrise_end) / 2.0f; float saved_time; - if (save_get_sky(&saved_time) && saved_time >= 0.0f && saved_time < 1.0f) + if (Save_GetSky(&saved_time) && saved_time >= 0.0f && saved_time < 1.0f) { sky->time_of_day = saved_time; } - update_render(sky); + UpdateRender(sky); } -void sky_update(sky_t* sky, float dt) +void Sky_Update(Sky* sky, float dt) { float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; sky->time_of_day += dt * SPEED / total_length; sky->time_of_day = SDL_fmodf(sky->time_of_day, 1.0f); - update_render(sky); + UpdateRender(sky); +} + +void Sky_Save(const Sky* sky) +{ + Save_SetSky(sky->time_of_day); } -void sky_update_shadow(sky_t* sky, const camera_t* camera, int resolution) +void Sky_UpdateShadow(Sky* sky, const Camera* camera, int resolution) { - camera_t* shadow = &sky->shadow_camera; + Camera* shadow = &sky->shadow_camera; if (sky->shadow_frame == 0) { shadow->pitch = SDL_asinf(sky->render.sun[1]); @@ -129,7 +129,7 @@ void sky_update_shadow(sky_t* sky, const camera_t* camera, int resolution) shadow->x = camera->x; shadow->y = SHADOW_Y; shadow->z = camera->z; - camera_update(shadow); + Camera_Update(shadow); float texel_size = SHADOW_ORTHO * 2.0f / resolution; float light_x = shadow->view[0][0] * shadow->x + shadow->view[1][0] * shadow->y + shadow->view[2][0] * shadow->z; float light_y = shadow->view[0][1] * shadow->x + shadow->view[1][1] * shadow->y + shadow->view[2][1] * shadow->z; @@ -138,5 +138,5 @@ void sky_update_shadow(sky_t* sky, const camera_t* camera, int resolution) shadow->x += shadow->view[0][0] * delta_x + shadow->view[0][1] * delta_y; shadow->y += shadow->view[1][0] * delta_x + shadow->view[1][1] * delta_y; shadow->z += shadow->view[2][0] * delta_x + shadow->view[2][1] * delta_y; - camera_update(shadow); + Camera_Update(shadow); } diff --git a/src/sky.h b/src/sky.h index d81a7877..dd037e46 100644 --- a/src/sky.h +++ b/src/sky.h @@ -4,25 +4,26 @@ #include "camera.h" -typedef struct sky_render +typedef struct SkyRender { float sun[4]; float top[4]; float horizon[4]; float ambient[4]; } -sky_render_t; +SkyRender; -typedef struct sky +typedef struct Sky { float time_of_day; bool has_sun; - sky_render_t render; - camera_t shadow_camera; + SkyRender render; + Camera shadow_camera; int shadow_frame; } -sky_t; +Sky; -void sky_save_or_load(sky_t* sky, bool save); -void sky_update(sky_t* sky, float dt); -void sky_update_shadow(sky_t* sky, const camera_t* camera, int resolution); +void Sky_Load(Sky* sky); +void Sky_Save(const Sky* sky); +void Sky_Update(Sky* sky, float dt); +void Sky_UpdateShadow(Sky* sky, const Camera* camera, int resolution); diff --git a/src/voxel.c b/src/voxel.c index 50e270ee..7947ed53 100644 --- a/src/voxel.c +++ b/src/voxel.c @@ -1,7 +1,6 @@ #include #include "block.h" -#include "check.h" #include "direction.h" #include "voxel.h" #include "voxel.inc" @@ -16,7 +15,7 @@ static const int CUBE_POSITIONS[][4][3] = {{0, 0, 0}, {0, 0, 1}, {1, 0, 0}, {1, 0, 1}}, }; -static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_t direction, int ao) +static Voxel Pack(Block block, int x, int y, int z, int u, int v, Direction direction, int ao) { SDL_COMPILE_TIME_ASSERT("", AO_OFFSET + AO_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", X_OFFSET + X_BITS <= 32); @@ -26,16 +25,16 @@ static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_ SDL_COMPILE_TIME_ASSERT("", V_OFFSET + V_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", DIRECTION_OFFSET + DIRECTION_BITS <= 32); SDL_COMPILE_TIME_ASSERT("", BLOCK_OFFSET + BLOCK_BITS <= 32); - CHECK(direction < DIRECTION_COUNT); - CHECK(block <= BLOCK_MASK); - CHECK(x <= X_MASK); - CHECK(y <= Y_MASK); - CHECK(z <= Z_MASK); - CHECK(u <= U_MASK); - CHECK(v <= V_MASK); - CHECK(direction <= DIRECTION_MASK); - CHECK(ao <= AO_MASK); - voxel_t voxel = 0; + SDL_assert(direction < DIRECTION_COUNT); + SDL_assert(block <= BLOCK_MASK); + SDL_assert(x <= X_MASK); + SDL_assert(y <= Y_MASK); + SDL_assert(z <= Z_MASK); + SDL_assert(u <= U_MASK); + SDL_assert(v <= V_MASK); + SDL_assert(direction <= DIRECTION_MASK); + SDL_assert(ao <= AO_MASK); + Voxel voxel = 0; voxel |= direction << DIRECTION_OFFSET; voxel |= block << BLOCK_OFFSET; voxel |= ao << AO_OFFSET; @@ -47,12 +46,12 @@ static voxel_t pack(block_t block, int x, int y, int z, int u, int v, direction_ return voxel; } -voxel_t voxel_pack_sprite(block_t block, int x, int y, int z, direction_t direction, int i) +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int i) { - CHECK(block > BLOCK_EMPTY); - CHECK(block < BLOCK_COUNT); - CHECK(direction < 4); - CHECK(i < 4); + SDL_assert(block > BLOCK_EMPTY); + SDL_assert(block < BLOCK_COUNT); + SDL_assert(direction < 4); + SDL_assert(i < 4); static const int POSITIONS[][4][3] = { {{0, 0, 0}, {0, 1, 0}, {1, 0, 1}, {1, 1, 1}}, @@ -72,15 +71,15 @@ voxel_t voxel_pack_sprite(block_t block, int x, int y, int z, direction_t direct int c = POSITIONS[direction][i][2] + z; int d = TEXCOORDS[direction][i][0]; int e = TEXCOORDS[direction][i][1]; - return pack(block, a, b, c, d, e, direction, AO_MASK); + return Pack(block, a, b, c, d, e, direction, AO_MASK); } -voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t direction, int i, int ao) +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int i, int ao) { - CHECK(block > BLOCK_EMPTY); - CHECK(block < BLOCK_COUNT); - CHECK(direction < 6); - CHECK(i < 4); + SDL_assert(block > BLOCK_EMPTY); + SDL_assert(block < BLOCK_COUNT); + SDL_assert(direction < 6); + SDL_assert(i < 4); static const int TEXCOORDS[][4][2] = { {{1, 1}, {1, 0}, {0, 1}, {0, 0}}, @@ -95,12 +94,12 @@ voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t directio int c = CUBE_POSITIONS[direction][i][2] + z; int d = TEXCOORDS[direction][i][0]; int e = TEXCOORDS[direction][i][1]; - return pack(block, a, b, c, d, e, direction, ao); + return Pack(block, a, b, c, d, e, direction, ao); } -void voxel_get_cube_position(direction_t direction, int i, int position[3]) +void Voxel_GetCubePosition(Direction direction, int i, int position[3]) { - CHECK(direction < 6); - CHECK(i < 4); + SDL_assert(direction < 6); + SDL_assert(i < 4); SDL_memcpy(position, CUBE_POSITIONS[direction][i], sizeof(int) * 3); } diff --git a/src/voxel.h b/src/voxel.h index 605d5e2b..3f526b70 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -5,8 +5,8 @@ #include "block.h" #include "direction.h" -typedef Uint32 voxel_t; +typedef Uint32 Voxel; -voxel_t voxel_pack_sprite(block_t block, int x, int y, int z, direction_t direction, int i); -voxel_t voxel_pack_cube(block_t block, int x, int y, int z, direction_t direction, int i, int ao); -void voxel_get_cube_position(direction_t direction, int i, int position[3]); +Voxel Voxel_PackSprite(Block block, int x, int y, int z, Direction direction, int i); +Voxel Voxel_PackCube(Block block, int x, int y, int z, Direction direction, int i, int ao); +void Voxel_GetCubePosition(Direction direction, int i, int position[3]); diff --git a/src/world.c b/src/world.c index 3c08d139..25ba140b 100644 --- a/src/world.c +++ b/src/world.c @@ -3,8 +3,6 @@ #include "block.h" #include "buffer.h" #include "camera.h" -#include "check.h" -#include "map.h" #include "rand.h" #include "save.h" #include "voxel.h" @@ -14,7 +12,7 @@ static const int AO_LEVEL_CLEAR = 3; -typedef enum job_type +typedef enum JobType { JOB_TYPE_NONE, JOB_TYPE_QUIT, @@ -22,44 +20,44 @@ typedef enum job_type JOB_TYPE_VOXELS, JOB_TYPE_LIGHTS, } -job_type_t; +JobType; -typedef enum job_state +typedef enum JobState { JOB_STATE_REQUESTED, JOB_STATE_RUNNING, JOB_STATE_COMPLETED, } -job_state_t; +JobState; -typedef enum mesh_type +typedef enum MeshType { MESH_TYPE_OPAQUE, MESH_TYPE_TRANSPARENT, MESH_TYPE_COUNT, } -mesh_type_t; +MeshType; -typedef struct job +typedef struct Job { - job_type_t type; + JobType type; int x; int z; } -job_t; +Job; -typedef struct worker +typedef struct Worker { SDL_Thread* thread; SDL_Mutex* mutex; SDL_Condition* condition; - job_t job; - cpu_buffer_t voxels[MESH_TYPE_COUNT]; - cpu_buffer_t lights; + Job job; + CPUBuffer voxels[MESH_TYPE_COUNT]; + CPUBuffer lights; } -worker_t; +Worker; -typedef struct chunk +typedef struct Chunk { SDL_AtomicInt block_state; SDL_AtomicInt voxel_state; @@ -73,66 +71,68 @@ typedef struct chunk }; Sint32 position[2]; }; - block_t blocks[CHUNK_WIDTH][CHUNK_HEIGHT][CHUNK_WIDTH]; - map_t lights; - gpu_buffer_t gpu_voxels[MESH_TYPE_COUNT]; - gpu_buffer_t gpu_lights; + Block blocks[CHUNK_WIDTH][CHUNK_HEIGHT][CHUNK_WIDTH]; + Light* lights; + int light_size; + int light_capacity; + GPUBuffer gpu_voxels[MESH_TYPE_COUNT]; + GPUBuffer gpu_lights; } -chunk_t; +Chunk; static SDL_GPUDevice* device; static int world_x; static int world_z; static bool is_moving; -static worker_t workers[WORKERS]; -static cpu_buffer_t cpu_indices; -static gpu_buffer_t gpu_indices; -static cpu_buffer_t cpu_empty_lights; -static gpu_buffer_t gpu_empty_lights; -static cpu_buffer_t cpu_voxels[MESH_TYPE_COUNT]; -static chunk_t* chunks[WORLD_WIDTH][WORLD_WIDTH]; +static Worker workers[WORKERS]; +static CPUBuffer cpu_indices; +static GPUBuffer gpu_indices; +static CPUBuffer cpu_empty_lights; +static GPUBuffer gpu_empty_lights; +static CPUBuffer cpu_voxels[MESH_TYPE_COUNT]; +static Chunk* chunks[WORLD_WIDTH][WORLD_WIDTH]; static int sorted_chunks[WORLD_WIDTH][WORLD_WIDTH][2]; static SDL_Mutex* mutex; -static bool is_block_local(int bx, int by, int bz) +static bool IsBlockLocal(int bx, int by, int bz) { - CHECK(by >= 0 && by < CHUNK_HEIGHT); - CHECK(bx >= -1 && bz >= -1 && bx <= CHUNK_WIDTH && bz <= CHUNK_WIDTH);; + SDL_assert(by >= 0 && by < CHUNK_HEIGHT); + SDL_assert(bx >= -1 && bz >= -1 && bx <= CHUNK_WIDTH && bz <= CHUNK_WIDTH); return bx >= 0 && bz >= 0 && bx < CHUNK_WIDTH && bz < CHUNK_WIDTH; } -static void world_to_chunk(const chunk_t* chunk, int* bx, int* by, int* bz) +static void WorldToChunk(const Chunk* chunk, int* bx, int* by, int* bz) { *bx -= chunk->x; *bz -= chunk->z; - CHECK(is_block_local(*bx, *by, *bz)); + SDL_assert(IsBlockLocal(*bx, *by, *bz)); } -static void chunk_to_world(const chunk_t* chunk, int* bx, int* by, int* bz) +static void ChunkToWorld(const Chunk* chunk, int* bx, int* by, int* bz) { - CHECK(*by >= 0 && *by < CHUNK_HEIGHT); + SDL_assert(*by >= 0 && *by < CHUNK_HEIGHT); *bx += chunk->x; *bz += chunk->z; } -static bool is_chunk_local(int cx, int cz) +static bool IsChunkLocal(int cx, int cz) { return cx >= 0 && cz >= 0 && cx < WORLD_WIDTH && cz < WORLD_WIDTH; } -static bool is_chunk_on_border(int cx, int cz) +static bool IsChunkOnBorder(int cx, int cz) { return cx == 0 || cz == 0 || cx == WORLD_WIDTH - 1 || cz == WORLD_WIDTH - 1; } -static int floor_chunk_index(float index) +static int FloorChunkIndex(float index) { return SDL_floorf(index / CHUNK_WIDTH); } -static chunk_t* get_chunk(int cx, int cz) +static Chunk* GetChunk(int cx, int cz) { - if (is_chunk_local(cx, cz)) + if (IsChunkLocal(cx, cz)) { return chunks[cx][cz]; } @@ -142,19 +142,19 @@ static chunk_t* get_chunk(int cx, int cz) } } -static void get_neighborhood(int cx, int cz, chunk_t* neighborhood[3][3]) +static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) { for (int i = -1; i <= 1; i++) for (int j = -1; j <= 1; j++) { int x = cx + i; int z = cz + j; - neighborhood[i + 1][j + 1] = get_chunk(x, z); - CHECK(neighborhood[i + 1][j + 1]); + neighborhood[i + 1][j + 1] = GetChunk(x, z); + SDL_assert(neighborhood[i + 1][j + 1]); } } -static mesh_type_t get_mesh_for_flags(world_flags_t flags) +static MeshType GetMeshForFlags(WorldFlags flags) { if (flags & WORLD_FLAGS_OPAQUE) { @@ -166,9 +166,9 @@ static mesh_type_t get_mesh_for_flags(world_flags_t flags) } } -static mesh_type_t get_mesh_for_block(block_t block) +static MeshType GetMeshForBlock(Block block) { - if (block_is_opaque(block)) + if (Block_IsOpaque(block)) { return MESH_TYPE_OPAQUE; } @@ -178,9 +178,9 @@ static mesh_type_t get_mesh_for_block(block_t block) } } -static chunk_t* create_chunk() +static Chunk* CreateChunk() { - chunk_t* chunk = SDL_malloc(sizeof(chunk_t)); + Chunk* chunk = SDL_malloc(sizeof(Chunk)); if (!chunk) { SDL_Log("Failed to allocate chunk"); @@ -190,72 +190,104 @@ static chunk_t* create_chunk() SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); chunk->x = 0; chunk->z = 0; - map_init(&chunk->lights, 8); + chunk->lights = NULL; + chunk->light_size = 0; + chunk->light_capacity = 0; for (int i = 0; i < MESH_TYPE_COUNT; i++) { - gpu_buffer_init(&chunk->gpu_voxels[i], device, SDL_GPU_BUFFERUSAGE_VERTEX); + GPUBuffer_Init(&chunk->gpu_voxels[i], device, SDL_GPU_BUFFERUSAGE_VERTEX); } - gpu_buffer_init(&chunk->gpu_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); + GPUBuffer_Init(&chunk->gpu_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); return chunk; } -static void free_chunk(chunk_t* chunk) +static void FreeChunk(Chunk* chunk) { - gpu_buffer_free(&chunk->gpu_lights); + GPUBuffer_Free(&chunk->gpu_lights); for (int i = 0; i < MESH_TYPE_COUNT; i++) { - gpu_buffer_free(&chunk->gpu_voxels[i]); + GPUBuffer_Free(&chunk->gpu_voxels[i]); } SDL_memset(chunk->blocks, 0, sizeof(chunk->blocks)); - map_free(&chunk->lights); + SDL_free(chunk->lights); SDL_free(chunk); } -static block_t set_chunk_block(chunk_t* chunk, int bx, int by, int bz, block_t block) +static Block SetChunkBlock(Chunk* chunk, int bx, int by, int bz, Block block) { SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_REQUESTED); - world_to_chunk(chunk, &bx, &by, &bz); + WorldToChunk(chunk, &bx, &by, &bz); + Block old_block = chunk->blocks[bx][by][bz]; chunk->blocks[bx][by][bz] = block; - block_t old_block = map_get(&chunk->lights, bx, by, bz); - if (!block_is_light(block) && !block_is_light(old_block)) + if (!Block_IsLight(block) && !Block_IsLight(old_block)) { return old_block; } SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); - if (block_is_light(block)) + int light_index = -1; + for (int i = 0; i < chunk->light_size; i++) { - map_set(&chunk->lights, bx, by, bz, block); + Light* light = &chunk->lights[i]; + if (light->x == chunk->x + bx && light->y == by && light->z == chunk->z + bz) + { + light_index = i; + break; + } } - else + if (Block_IsLight(block)) + { + if (light_index < 0) + { + if (chunk->light_size == chunk->light_capacity) + { + int capacity = SDL_max(8, chunk->light_capacity * 2); + Light* lights = SDL_realloc(chunk->lights, capacity * sizeof(Light)); + if (!lights) + { + SDL_Log("Failed to allocate chunk lights"); + return old_block; + } + chunk->lights = lights; + chunk->light_capacity = capacity; + } + light_index = chunk->light_size++; + } + Light light = Block_GetLight(block); + light.x = chunk->x + bx; + light.y = by; + light.z = chunk->z + bz; + chunk->lights[light_index] = light; + } + else if (light_index >= 0) { - map_remove(&chunk->lights, bx, by, bz); + chunk->lights[light_index] = chunk->lights[--chunk->light_size]; } return old_block; } -static void set_chunk_block_function(void* userdata, int bx, int by, int bz, block_t block) +static void SetChunkBlockFunction(void* userdata, int bx, int by, int bz, Block block) { - chunk_t* chunk = userdata; - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); - set_chunk_block(userdata, bx, by, bz, block); + Chunk* chunk = userdata; + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); + SetChunkBlock(userdata, bx, by, bz, block); } -static block_t get_chunk_block(chunk_t* chunk, int bx, int by, int bz) +static Block GetChunkBlock(Chunk* chunk, int bx, int by, int bz) { - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - world_to_chunk(chunk, &bx, &by, &bz); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); + WorldToChunk(chunk, &bx, &by, &bz); return chunk->blocks[bx][by][bz]; } -static block_t get_neighborhood_block(chunk_t* chunks[3][3], int bx, int by, int bz, int dx, int dy, int dz) +static Block GetNeighborhoodBlock(Chunk* chunks[3][3], int bx, int by, int bz, int dx, int dy, int dz) { - CHECK(dx >= -1 && dx <= 1); - CHECK(dy >= -1 && dy <= 1); - CHECK(dz >= -1 && dz <= 1); + SDL_assert(dx >= -1 && dx <= 1); + SDL_assert(dy >= -1 && dy <= 1); + SDL_assert(dz >= -1 && dz <= 1); bx += dx; by += dy; bz += dz; - const chunk_t* chunk = chunks[1][1]; + const Chunk* chunk = chunks[1][1]; if (by == CHUNK_HEIGHT) { return BLOCK_EMPTY; @@ -264,11 +296,11 @@ static block_t get_neighborhood_block(chunk_t* chunks[3][3], int bx, int by, int { return BLOCK_GRASS; } - else if (is_block_local(bx, by, bz)) + else if (IsBlockLocal(bx, by, bz)) { return chunk->blocks[bx][by][bz]; } - chunk_to_world(chunk, &bx, &by, &bz); + ChunkToWorld(chunk, &bx, &by, &bz); int cx = 1; int cz = 1; if (bx < chunk->x) @@ -287,74 +319,74 @@ static block_t get_neighborhood_block(chunk_t* chunks[3][3], int bx, int by, int { cz++; } - chunk_t* neighbor = chunks[cx][cz]; - CHECK(neighbor); - return get_chunk_block(neighbor, bx, by, bz); + Chunk* neighbor = chunks[cx][cz]; + SDL_assert(neighbor); + return GetChunkBlock(neighbor, bx, by, bz); } -static void upload_voxels(chunk_t* chunk, cpu_buffer_t voxels[MESH_TYPE_COUNT]) +static void UploadVoxels(Chunk* chunk, CPUBuffer voxels[MESH_TYPE_COUNT]) { - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - CHECK(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); bool has_voxels = false; for (int i = 0; i < MESH_TYPE_COUNT; i++) { - gpu_buffer_clear(&chunk->gpu_voxels[i]); + GPUBuffer_Clear(&chunk->gpu_voxels[i]); has_voxels |= voxels[i].size > 0; } if (!has_voxels) { return; } - if (!gpu_buffer_begin_upload(&chunk->gpu_voxels[0])) + if (!GPUBuffer_BeginUpload(&chunk->gpu_voxels[0])) { return; } for (int i = 0; i < MESH_TYPE_COUNT; i++) { - gpu_buffer_upload(&chunk->gpu_voxels[i], &voxels[i]); + GPUBuffer_Upload(&chunk->gpu_voxels[i], &voxels[i]); } - gpu_buffer_end_upload(&chunk->gpu_voxels[0]); + GPUBuffer_EndUpload(&chunk->gpu_voxels[0]); } -static void upload_lights(chunk_t* chunk, cpu_buffer_t* lights) +static void UploadLights(Chunk* chunk, CPUBuffer* lights) { - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - CHECK(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); - gpu_buffer_clear(&chunk->gpu_lights); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); + GPUBuffer_Clear(&chunk->gpu_lights); if (!lights->size) { return; } - if (!gpu_buffer_begin_upload(&chunk->gpu_lights)) + if (!GPUBuffer_BeginUpload(&chunk->gpu_lights)) { return; } - gpu_buffer_upload(&chunk->gpu_lights, lights); - gpu_buffer_end_upload(&chunk->gpu_lights); + GPUBuffer_Upload(&chunk->gpu_lights, lights); + GPUBuffer_EndUpload(&chunk->gpu_lights); } -static bool is_visible(block_t block, block_t neighbor) +static bool IsVisible(Block block, Block neighbor) { if (neighbor == BLOCK_EMPTY) { return true; } - if (block_is_sprite(neighbor)) + if (Block_IsSprite(neighbor)) { return true; } - if (block_is_opaque(block) && !block_is_opaque(neighbor)) + if (Block_IsOpaque(block) && !Block_IsOpaque(neighbor)) { return true; } return false; } -static int get_ao(chunk_t* chunks[3][3], int bx, int by, int bz, direction_t direction, int vertex) +static int GetAO(Chunk* chunks[3][3], int bx, int by, int bz, Direction direction, int vertex) { int position[3]; - voxel_get_cube_position(direction, vertex, position); + Voxel_GetCubePosition(direction, vertex, position); int side1[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int side2[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; int corner[3] = {DIRECTIONS[direction][0], DIRECTIONS[direction][1], DIRECTIONS[direction][2]}; @@ -376,10 +408,10 @@ static int get_ao(chunk_t* chunks[3][3], int bx, int by, int bz, direction_t dir } corner[i] = offset; } - CHECK(side == 2); - bool has_side1 = block_has_occlusion(get_neighborhood_block(chunks, bx, by, bz, side1[0], side1[1], side1[2])); - bool has_side2 = block_has_occlusion(get_neighborhood_block(chunks, bx, by, bz, side2[0], side2[1], side2[2])); - bool has_corner = block_has_occlusion(get_neighborhood_block(chunks, bx, by, bz, corner[0], corner[1], corner[2])); + SDL_assert(side == 2); + bool has_side1 = Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side1[0], side1[1], side1[2])); + bool has_side2 = Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, side2[0], side2[1], side2[2])); + bool has_corner = Block_HasOcclusion(GetNeighborhoodBlock(chunks, bx, by, bz, corner[0], corner[1], corner[2])); if (has_side1 && has_side2) { return 0; @@ -387,16 +419,16 @@ static int get_ao(chunk_t* chunks[3][3], int bx, int by, int bz, direction_t dir return AO_LEVEL_CLEAR - has_side1 - has_side2 - has_corner; } -static void gen_chunk_blocks(chunk_t* chunk) +static void GenerateChunkBlocks(Chunk* chunk) { - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); - CHECK(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED); - CHECK(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); + SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED); + SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED); SDL_memset(chunk->blocks, 0, sizeof(chunk->blocks)); - map_clear(&chunk->lights); - rand_get_blocks(chunk, chunk->x, chunk->z, set_chunk_block_function); - save_get_blocks(chunk, chunk->x, chunk->z, set_chunk_block_function); - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); + chunk->light_size = 0; + Rand_GetBlocks(chunk, chunk->x, chunk->z, SetChunkBlockFunction); + Save_GetBlocks(chunk, chunk->x, chunk->z, SetChunkBlockFunction); + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_RUNNING); SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_COMPLETED); if (SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_REQUESTED) { @@ -404,27 +436,27 @@ static void gen_chunk_blocks(chunk_t* chunk) } } -static void gen_chunk_voxels(chunk_t* chunks[3][3], cpu_buffer_t voxels[MESH_TYPE_COUNT]) +static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_COUNT]) { - chunk_t* chunk = chunks[1][1]; - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - CHECK(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); + Chunk* chunk = chunks[1][1]; + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_RUNNING); for (int bx = 0; bx < CHUNK_WIDTH; bx++) for (int by = 0; by < CHUNK_HEIGHT; by++) for (int bz = 0; bz < CHUNK_WIDTH; bz++) { - block_t block = chunk->blocks[bx][by][bz]; + Block block = chunk->blocks[bx][by][bz]; if (block == BLOCK_EMPTY) { continue; } - if (block_is_sprite(block)) + if (Block_IsSprite(block)) { for (int j = 0; j < 4; j++) for (int k = 0; k < 4; k++) { - voxel_t voxel = voxel_pack_sprite(block, bx, by, bz, j, k); - cpu_buffer_append(&voxels[MESH_TYPE_OPAQUE], &voxel); + Voxel voxel = Voxel_PackSprite(block, bx, by, bz, j, k); + CPUBuffer_Append(&voxels[MESH_TYPE_OPAQUE], &voxel); } continue; } @@ -433,8 +465,8 @@ static void gen_chunk_voxels(chunk_t* chunks[3][3], cpu_buffer_t voxels[MESH_TYP int dx = DIRECTIONS[j][0]; int dy = DIRECTIONS[j][1]; int dz = DIRECTIONS[j][2]; - block_t neighbor = get_neighborhood_block(chunks, bx, by, bz, dx, dy, dz); - if (!is_visible(block, neighbor)) + Block neighbor = GetNeighborhoodBlock(chunks, bx, by, bz, dx, dy, dz); + if (!IsVisible(block, neighbor)) { continue; } @@ -442,7 +474,7 @@ static void gen_chunk_voxels(chunk_t* chunks[3][3], cpu_buffer_t voxels[MESH_TYP int order[] = {0, 1, 2, 3}; for (int k = 0; k < 4; k++) { - ao[k] = get_ao(chunks, bx, by, bz, j, k); + ao[k] = GetAO(chunks, bx, by, bz, j, k); } if (ao[0] + ao[3] > ao[1] + ao[2]) { @@ -454,67 +486,56 @@ static void gen_chunk_voxels(chunk_t* chunks[3][3], cpu_buffer_t voxels[MESH_TYP for (int k = 0; k < 4; k++) { int vertex = order[k]; - voxel_t voxel = voxel_pack_cube(block, bx, by, bz, j, vertex, ao[vertex]); - cpu_buffer_append(&voxels[get_mesh_for_block(block)], &voxel); + Voxel voxel = Voxel_PackCube(block, bx, by, bz, j, vertex, ao[vertex]); + CPUBuffer_Append(&voxels[GetMeshForBlock(block)], &voxel); } } } - upload_voxels(chunk, voxels); + UploadVoxels(chunk, voxels); SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_COMPLETED); } -static void regen_chunk_voxels(int x, int z) +static void RegenerateChunkVoxels(int x, int z) { - CHECK(!is_chunk_on_border(x, z)); - chunk_t* chunks[3][3] = {0}; - get_neighborhood(x, z, chunks); + SDL_assert(!IsChunkOnBorder(x, z)); + Chunk* chunks[3][3] = {0}; + GetNeighborhood(x, z, chunks); SDL_SetAtomicInt(&chunks[1][1]->voxel_state, JOB_STATE_RUNNING); - gen_chunk_voxels(chunks, cpu_voxels); + GenerateChunkVoxels(chunks, cpu_voxels); } -static void gen_chunk_lights(chunk_t* chunks[3][3], cpu_buffer_t* lights) +static void GenerateChunkLights(Chunk* chunks[3][3], CPUBuffer* lights) { - chunk_t* chunk = chunks[1][1]; - CHECK(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); - CHECK(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); + Chunk* chunk = chunks[1][1]; + SDL_assert(SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED); + SDL_assert(SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_RUNNING); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { - const chunk_t* neighbor = chunks[i][j]; - CHECK(neighbor); - for (Uint32 i = 0; i < neighbor->lights.capacity; i++) + const Chunk* neighbor = chunks[i][j]; + SDL_assert(neighbor); + for (int k = 0; k < neighbor->light_size; k++) { - if (!map_is_row_valid(&neighbor->lights, i)) - { - continue; - } - map_row_t row = map_get_row(&neighbor->lights, i); - CHECK(row.value != BLOCK_EMPTY); - CHECK(block_is_light(row.value)); - light_t light = block_get_light(row.value); - light.x = neighbor->x + row.x; - light.y = row.y; - light.z = neighbor->z + row.z; - cpu_buffer_append(lights, &light); + CPUBuffer_Append(lights, &neighbor->lights[k]); } } - upload_lights(chunk, lights); + UploadLights(chunk, lights); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); } -static void gen_lights() +static void GenerateLights() { - if (!gpu_buffer_begin_upload(&gpu_empty_lights)) + if (!GPUBuffer_BeginUpload(&gpu_empty_lights)) { return; } - light_t light = {0}; - cpu_buffer_append(&cpu_empty_lights, &light); - gpu_buffer_upload(&gpu_empty_lights, &cpu_empty_lights); - gpu_buffer_end_upload(&gpu_empty_lights); + Light light = {0}; + CPUBuffer_Append(&cpu_empty_lights, &light); + GPUBuffer_Upload(&gpu_empty_lights, &cpu_empty_lights); + GPUBuffer_EndUpload(&gpu_empty_lights); } -static void gen_indices(Uint32 size) +static void GenerateIndices(Uint32 size) { SDL_LockMutex(mutex); size *= 1.5; @@ -523,7 +544,7 @@ static void gen_indices(Uint32 size) SDL_UnlockMutex(mutex); return; } - if (!gpu_buffer_begin_upload(&gpu_indices)) + if (!GPUBuffer_BeginUpload(&gpu_indices)) { SDL_UnlockMutex(mutex); return; @@ -533,14 +554,14 @@ static void gen_indices(Uint32 size) for (Uint32 j = 0; j < 6; j++) { Uint32 index = i * 4 + INDICES[j]; - cpu_buffer_append(&cpu_indices, &index); + CPUBuffer_Append(&cpu_indices, &index); } - gpu_buffer_upload(&gpu_indices, &cpu_indices); - gpu_buffer_end_upload(&gpu_indices); + GPUBuffer_Upload(&gpu_indices, &cpu_indices); + GPUBuffer_EndUpload(&gpu_indices); SDL_UnlockMutex(mutex); } -static void wait_for_job(worker_t* worker) +static void WaitForJob(Worker* worker) { SDL_LockMutex(worker->mutex); while (worker->job.type == JOB_TYPE_NONE) @@ -550,7 +571,7 @@ static void wait_for_job(worker_t* worker) SDL_UnlockMutex(worker->mutex); } -static void wait_for_job_finish(const worker_t* worker) +static void WaitForJobFinish(const Worker* worker) { SDL_LockMutex(worker->mutex); while (worker->job.type != JOB_TYPE_NONE) @@ -560,7 +581,7 @@ static void wait_for_job_finish(const worker_t* worker) SDL_UnlockMutex(worker->mutex); } -static int clear_job(worker_t* worker) +static int ClearJob(Worker* worker) { SDL_LockMutex(worker->mutex); SDL_assert(worker->job.type != JOB_TYPE_NONE); @@ -570,50 +591,50 @@ static int clear_job(worker_t* worker) return 0; } -static int worker_function(void* args) +static int WorkerFunction(void* args) { - worker_t* worker = args; + Worker* worker = args; while (true) { - wait_for_job(worker); - job_t job = worker->job; + WaitForJob(worker); + Job job = worker->job; if (job.type == JOB_TYPE_QUIT) { - return clear_job(worker); + return ClearJob(worker); } - chunk_t* chunk = get_chunk(job.x, job.z); - CHECK(chunk); + Chunk* chunk = GetChunk(job.x, job.z); + SDL_assert(chunk); if (job.type == JOB_TYPE_BLOCKS) { - gen_chunk_blocks(chunk); + GenerateChunkBlocks(chunk); } else { - chunk_t* chunks[3][3]; - get_neighborhood(job.x, job.z, chunks); + Chunk* chunks[3][3]; + GetNeighborhood(job.x, job.z, chunks); if (job.type == JOB_TYPE_VOXELS) { - gen_chunk_voxels(chunks, worker->voxels); + GenerateChunkVoxels(chunks, worker->voxels); for (int i = 0; i < MESH_TYPE_COUNT; i++) { - gen_indices(chunk->gpu_voxels[i].size); + GenerateIndices(chunk->gpu_voxels[i].size); } } else if (job.type == JOB_TYPE_LIGHTS) { - gen_chunk_lights(chunks, &worker->lights); + GenerateChunkLights(chunks, &worker->lights); } else { - CHECK(false); + SDL_assert(false); } } - clear_job(worker); + ClearJob(worker); } return 0; } -static bool is_job_running(const worker_t* worker) +static bool IsJobRunning(const Worker* worker) { SDL_LockMutex(worker->mutex); if (worker->job.type != JOB_TYPE_NONE) @@ -628,7 +649,7 @@ static bool is_job_running(const worker_t* worker) } } -static SDL_AtomicInt* get_job_state(chunk_t* chunk, job_type_t type) +static SDL_AtomicInt* GetJobState(Chunk* chunk, JobType type) { switch (type) { @@ -643,32 +664,32 @@ static SDL_AtomicInt* get_job_state(chunk_t* chunk, job_type_t type) } } -static void dispatch_job(worker_t* worker, const job_t* job) +static void DispatchJob(Worker* worker, const Job* job) { if (job->type != JOB_TYPE_QUIT) { - CHECK(!is_job_running(worker)); - chunk_t* chunk = get_chunk(job->x, job->z); - SDL_SetAtomicInt(get_job_state(chunk, job->type), JOB_STATE_RUNNING); + SDL_assert(!IsJobRunning(worker)); + Chunk* chunk = GetChunk(job->x, job->z); + SDL_SetAtomicInt(GetJobState(chunk, job->type), JOB_STATE_RUNNING); } else { - wait_for_job_finish(worker); + WaitForJobFinish(worker); } SDL_LockMutex(worker->mutex); - CHECK(worker->job.type == JOB_TYPE_NONE); + SDL_assert(worker->job.type == JOB_TYPE_NONE); worker->job = *job; SDL_SignalCondition(worker->condition); SDL_UnlockMutex(worker->mutex); } -static void start_worker(worker_t* worker) +static void StartWorker(Worker* worker) { for (int i = 0; i < MESH_TYPE_COUNT; i++) { - cpu_buffer_init(&worker->voxels[i], device, sizeof(voxel_t)); + CPUBuffer_Init(&worker->voxels[i], device, sizeof(Voxel)); } - cpu_buffer_init(&worker->lights, device, sizeof(light_t)); + CPUBuffer_Init(&worker->lights, device, sizeof(Light)); worker->mutex = SDL_CreateMutex(); if (!worker->mutex) { @@ -679,18 +700,18 @@ static void start_worker(worker_t* worker) { SDL_Log("Failed to create condition variable: %s", SDL_GetError()); } - worker->thread = SDL_CreateThread(worker_function, "worker", worker); + worker->thread = SDL_CreateThread(WorkerFunction, "worker", worker); if (!worker->thread) { SDL_Log("Failed to create thread: %s", SDL_GetError()); } } -static void stop_worker(worker_t* worker) +static void StopWorker(Worker* worker) { - job_t job = {0}; + Job job = {0}; job.type = JOB_TYPE_QUIT; - dispatch_job(worker, &job); + DispatchJob(worker, &job); SDL_WaitThread(worker->thread, NULL); SDL_DestroyMutex(worker->mutex); SDL_DestroyCondition(worker->condition); @@ -699,12 +720,12 @@ static void stop_worker(worker_t* worker) worker->condition = NULL; for (int i = 0; i < MESH_TYPE_COUNT; i++) { - cpu_buffer_free(&worker->voxels[i]); + CPUBuffer_Free(&worker->voxels[i]); } - cpu_buffer_free(&worker->lights); + CPUBuffer_Free(&worker->lights); } -static int sort_function(void* userdata, const void* lhs, const void* rhs) +static int SortFunction(void* userdata, const void* lhs, const void* rhs) { int w = WORLD_WIDTH / 2; const int* l = lhs; @@ -722,7 +743,7 @@ static int sort_function(void* userdata, const void* lhs, const void* rhs) return 0; } -void world_init(SDL_GPUDevice* handle) +void World_Init(SDL_GPUDevice* handle) { mutex = SDL_CreateMutex(); if (!mutex) @@ -732,58 +753,58 @@ void world_init(SDL_GPUDevice* handle) device = handle; world_x = SDL_MAX_SINT32; world_z = SDL_MAX_SINT32; - cpu_buffer_init(&cpu_indices, device, sizeof(Uint32)); - gpu_buffer_init(&gpu_indices, device, SDL_GPU_BUFFERUSAGE_INDEX); - cpu_buffer_init(&cpu_empty_lights, device, sizeof(light_t)); - gpu_buffer_init(&gpu_empty_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); + CPUBuffer_Init(&cpu_indices, device, sizeof(Uint32)); + GPUBuffer_Init(&gpu_indices, device, SDL_GPU_BUFFERUSAGE_INDEX); + CPUBuffer_Init(&cpu_empty_lights, device, sizeof(Light)); + GPUBuffer_Init(&gpu_empty_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); for (int i = 0; i < MESH_TYPE_COUNT; i++) { - cpu_buffer_init(&cpu_voxels[i], device, sizeof(voxel_t)); + CPUBuffer_Init(&cpu_voxels[i], device, sizeof(Voxel)); } for (int i = 0; i < WORKERS; i++) { - start_worker(&workers[i]); + StartWorker(&workers[i]); } for (int x = 0; x < WORLD_WIDTH; x++) for (int z = 0; z < WORLD_WIDTH; z++) { - chunks[x][z] = create_chunk(); + chunks[x][z] = CreateChunk(); sorted_chunks[x][z][0] = x; sorted_chunks[x][z][1] = z; } - SDL_qsort_r(sorted_chunks, WORLD_WIDTH * WORLD_WIDTH, sizeof(int) * 2, sort_function, NULL); - gen_lights(); - gen_indices(1000000); + SDL_qsort_r(sorted_chunks, WORLD_WIDTH * WORLD_WIDTH, sizeof(int) * 2, SortFunction, NULL); + GenerateLights(); + GenerateIndices(1000000); } -void world_free() +void World_Free() { for (int i = 0; i < WORKERS; i++) { - stop_worker(&workers[i]); + StopWorker(&workers[i]); } for (int x = 0; x < WORLD_WIDTH; x++) for (int z = 0; z < WORLD_WIDTH; z++) { - free_chunk(chunks[x][z]); + FreeChunk(chunks[x][z]); } - cpu_buffer_free(&cpu_indices); - gpu_buffer_free(&gpu_indices); - cpu_buffer_free(&cpu_empty_lights); - gpu_buffer_free(&gpu_empty_lights); + CPUBuffer_Free(&cpu_indices); + GPUBuffer_Free(&gpu_indices); + CPUBuffer_Free(&cpu_empty_lights); + GPUBuffer_Free(&gpu_empty_lights); for (int i = 0; i < MESH_TYPE_COUNT; i++) { - cpu_buffer_free(&cpu_voxels[i]); + CPUBuffer_Free(&cpu_voxels[i]); } SDL_DestroyMutex(mutex); } -static int get_running_count() +static int GetRunningCount() { int num_running = 0; for (int i = 0; i < WORKERS; i++) { - if (is_job_running(&workers[i])) + if (IsJobRunning(&workers[i])) { num_running++; } @@ -791,12 +812,12 @@ static int get_running_count() return num_running; } -static int get_workers(worker_t* local_workers[WORKERS]) +static int GetWorkers(Worker* local_workers[WORKERS]) { int num_workers = 0; for (int i = 0; i < WORKERS; i++) { - if (!is_job_running(&workers[i])) + if (!IsJobRunning(&workers[i])) { local_workers[num_workers++] = &workers[i]; } @@ -804,20 +825,20 @@ static int get_workers(worker_t* local_workers[WORKERS]) return num_workers; } -static void shuffle(int offset_x, int offset_z) +static void Shuffle(int offset_x, int offset_z) { world_x += offset_x; world_z += offset_z; - chunk_t* in[WORLD_WIDTH][WORLD_WIDTH] = {0}; - chunk_t* out[WORLD_WIDTH * WORLD_WIDTH] = {0}; + Chunk* in[WORLD_WIDTH][WORLD_WIDTH] = {0}; + Chunk* out[WORLD_WIDTH * WORLD_WIDTH] = {0}; int size = 0; for (int x = 0; x < WORLD_WIDTH; x++) for (int z = 0; z < WORLD_WIDTH; z++) { - CHECK(chunks[x][z]); + SDL_assert(chunks[x][z]); const int a = x - offset_x; const int b = z - offset_z; - if (is_chunk_local(a, b)) + if (IsChunkLocal(a, b)) { in[a][b] = chunks[x][z]; } @@ -833,54 +854,54 @@ static void shuffle(int offset_x, int offset_z) { if (!chunks[x][z]) { - CHECK(size > 0); - chunk_t* chunk = out[--size]; + SDL_assert(size > 0); + Chunk* chunk = out[--size]; SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_REQUESTED); chunks[x][z] = chunk; } - chunk_t* chunk = chunks[x][z]; + Chunk* chunk = chunks[x][z]; chunk->x = (world_x + x) * CHUNK_WIDTH; chunk->z = (world_z + z) * CHUNK_WIDTH; } - CHECK(!size); + SDL_assert(!size); is_moving = false; } -static void move_chunks(const camera_t* camera) +static void MoveChunks(const Camera* camera) { const int offset_x = camera->x / CHUNK_WIDTH - WORLD_WIDTH / 2 - world_x; const int offset_z = camera->z / CHUNK_WIDTH - WORLD_WIDTH / 2 - world_z; if (offset_x || offset_z) { is_moving = true; - if (!get_running_count()) + if (!GetRunningCount()) { - shuffle(offset_x, offset_z); + Shuffle(offset_x, offset_z); } } } -static bool try_update_blocks(int x, int z, worker_t* worker) +static bool TryUpdateBlocks(int x, int z, Worker* worker) { - CHECK(is_chunk_local(x, z)); - chunk_t* chunk = chunks[x][z]; + SDL_assert(IsChunkLocal(x, z)); + Chunk* chunk = chunks[x][z]; if (SDL_GetAtomicInt(&chunk->block_state) != JOB_STATE_REQUESTED) { return false; } - job_t job = {JOB_TYPE_BLOCKS, x, z}; - CHECK(!is_job_running(worker)); - dispatch_job(worker, &job); + Job job = {JOB_TYPE_BLOCKS, x, z}; + SDL_assert(!IsJobRunning(worker)); + DispatchJob(worker, &job); return true; } -static bool try_update_voxels_or_lights(int x, int z, worker_t* worker) +static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) { - CHECK(is_chunk_local(x, z)); - chunk_t* chunk = chunks[x][z]; - if (is_chunk_on_border(x, z)) + SDL_assert(IsChunkLocal(x, z)); + Chunk* chunk = chunks[x][z]; + if (IsChunkOnBorder(x, z)) { return false; } @@ -890,8 +911,8 @@ static bool try_update_voxels_or_lights(int x, int z, worker_t* worker) { return false;; } - chunk_t* neighborhood[3][3]; - get_neighborhood(x, z, neighborhood); + Chunk* neighborhood[3][3]; + GetNeighborhood(x, z, neighborhood); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { @@ -900,32 +921,32 @@ static bool try_update_voxels_or_lights(int x, int z, worker_t* worker) return false; } } - job_t job; + Job job; if (do_voxel) { - job = (job_t) {JOB_TYPE_VOXELS, x, z}; + job = (Job) {JOB_TYPE_VOXELS, x, z}; } else if (do_light) { - job = (job_t) {JOB_TYPE_LIGHTS, x, z}; + job = (Job) {JOB_TYPE_LIGHTS, x, z}; } else { - CHECK(false); + SDL_assert(false); } - dispatch_job(worker, &job); + DispatchJob(worker, &job); return true; } -void world_update(const camera_t* camera) +void World_Update(const Camera* camera) { - move_chunks(camera); + MoveChunks(camera); if (is_moving) { return; } - worker_t* local_workers[WORKERS] = {0}; - int num_workers = get_workers(local_workers); + Worker* local_workers[WORKERS] = {0}; + int num_workers = GetWorkers(local_workers); for (int x = 0; x < WORLD_WIDTH; x++) for (int z = 0; z < WORLD_WIDTH; z++) { @@ -935,21 +956,21 @@ void world_update(const camera_t* camera) } int a = sorted_chunks[x][z][0]; int b = sorted_chunks[x][z][1]; - worker_t* worker = local_workers[num_workers - 1]; - if (try_update_blocks(a, b, worker)) + Worker* worker = local_workers[num_workers - 1]; + if (TryUpdateBlocks(a, b, worker)) { num_workers--; } - else if (try_update_voxels_or_lights(a, b, worker)) + else if (TryUpdateVoxelsOrLights(a, b, worker)) { num_workers--; } } } -static void render(chunk_t* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, world_flags_t flags) +static void Render(Chunk* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, WorldFlags flags) { - gpu_buffer_t* gpu_voxels = &chunk->gpu_voxels[get_mesh_for_flags(flags)]; + GPUBuffer* gpu_voxels = &chunk->gpu_voxels[GetMeshForFlags(flags)]; if (gpu_voxels->size == 0) { return; @@ -972,9 +993,8 @@ static void render(chunk_t* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass light_binding = gpu_empty_lights.buffer; light_count = 0; } - SDL_GPUBuffer* bindings[] = {block_get_buffer(), light_binding}; SDL_PushGPUFragmentUniformData(cbuf, 0, &light_count, 4); - SDL_BindGPUFragmentStorageBuffers(pass, 0, bindings, 2); + SDL_BindGPUFragmentStorageBuffers(pass, 1, &light_binding, 1); } SDL_PushGPUVertexUniformData(cbuf, 2, chunk->position, 12); SDL_BindGPUVertexBuffers(pass, 0, &voxel_binding, 1); @@ -982,7 +1002,7 @@ static void render(chunk_t* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass SDL_DrawGPUIndexedPrimitives(pass, gpu_voxels->size * 1.5, 1, 0, 0, 0); } -void world_render(const camera_t* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, world_flags_t flags) +void World_Render(const Camera* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, WorldFlags flags) { SDL_PushGPUVertexUniformData(cbuf, 0, camera->proj, 64); SDL_PushGPUVertexUniformData(cbuf, 1, camera->view, 64); @@ -991,11 +1011,11 @@ void world_render(const camera_t* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURen { int a = sorted_chunks[x][y][0]; int b = sorted_chunks[x][y][1]; - if (is_chunk_on_border(a, b)) + if (IsChunkOnBorder(a, b)) { continue; } - chunk_t* chunk = chunks[a][b]; + Chunk* chunk = chunks[a][b]; if (SDL_GetAtomicInt(&chunk->voxel_state) != JOB_STATE_COMPLETED) { continue; @@ -1003,76 +1023,65 @@ void world_render(const camera_t* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURen float sx = CHUNK_WIDTH; float sy = CHUNK_HEIGHT; float sz = CHUNK_WIDTH; - if (!camera_get_vis(camera, chunk->x, 0.0f, chunk->z, sx, sy, sz)) + if (!Camera_GetVisibility(camera, chunk->x, 0.0f, chunk->z, sx, sy, sz)) { continue; } - render(chunk, cbuf, pass, flags); + Render(chunk, cbuf, pass, flags); } } -block_t world_get_block(const int position[3]) +static Chunk* GetWorldChunk(const int position[3], int* chunk_x, int* chunk_z) { if (position[1] < 0 || position[1] >= CHUNK_HEIGHT) { - return BLOCK_EMPTY; + return NULL; } - int chunk_x = floor_chunk_index(position[0] - world_x * CHUNK_WIDTH); - int chunk_z = floor_chunk_index(position[2] - world_z * CHUNK_WIDTH); - chunk_t* chunk = get_chunk(chunk_x, chunk_z); + *chunk_x = FloorChunkIndex(position[0] - world_x * CHUNK_WIDTH); + *chunk_z = FloorChunkIndex(position[2] - world_z * CHUNK_WIDTH); + Chunk* chunk = GetChunk(*chunk_x, *chunk_z); if (chunk) { - CHECK(chunk->x == (world_x + chunk_x) * CHUNK_WIDTH); - CHECK(chunk->z == (world_z + chunk_z) * CHUNK_WIDTH); + SDL_assert(chunk->x == (world_x + *chunk_x) * CHUNK_WIDTH); + SDL_assert(chunk->z == (world_z + *chunk_z) * CHUNK_WIDTH); } else { - SDL_Log("Bad chunk position: %d, %d", chunk_x, chunk_z); - return BLOCK_EMPTY; + SDL_Log("Bad chunk position: %d, %d", *chunk_x, *chunk_z); + return NULL; } bool has_blocks = SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED; bool has_voxels = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_COMPLETED; - if (has_blocks && has_voxels) - { - return get_chunk_block(chunk, position[0], position[1], position[2]); - } - else + if (!has_blocks || !has_voxels) { - return BLOCK_EMPTY; + return NULL; } + return chunk; } -void world_set_block(const int position[3], block_t block) +Block World_GetBlock(const int position[3]) { - if (position[1] < 0 || position[1] >= CHUNK_HEIGHT) - { - return; - } - int chunk_x = floor_chunk_index(position[0] - world_x * CHUNK_WIDTH); - int chunk_z = floor_chunk_index(position[2] - world_z * CHUNK_WIDTH); - chunk_t* chunk = get_chunk(chunk_x, chunk_z); - if (chunk) - { - CHECK(chunk->x == (world_x + chunk_x) * CHUNK_WIDTH); - CHECK(chunk->z == (world_z + chunk_z) * CHUNK_WIDTH); - } - else - { - SDL_Log("Bad chunk position: %d, %d", chunk_x, chunk_z); - return; - } - bool has_blocks = SDL_GetAtomicInt(&chunk->block_state) == JOB_STATE_COMPLETED; - bool has_voxels = SDL_GetAtomicInt(&chunk->voxel_state) == JOB_STATE_COMPLETED; - if (!has_blocks || !has_voxels) + int chunk_x; + int chunk_z; + Chunk* chunk = GetWorldChunk(position, &chunk_x, &chunk_z); + return chunk ? GetChunkBlock(chunk, position[0], position[1], position[2]) : BLOCK_EMPTY; +} + +void World_SetBlock(const int position[3], Block block) +{ + int chunk_x; + int chunk_z; + Chunk* chunk = GetWorldChunk(position, &chunk_x, &chunk_z); + if (!chunk) { return; } - save_set_block(chunk->x, chunk->z, position[0], position[1], position[2], block); + Save_SetBlock(chunk->x, chunk->z, position[0], position[1], position[2], block); int local_x = position[0]; int local_y = position[1]; int local_z = position[2]; - world_to_chunk(chunk, &local_x, &local_y, &local_z); - block_t old_block = set_chunk_block(chunk, position[0], position[1], position[2], block); + WorldToChunk(chunk, &local_x, &local_y, &local_z); + Block old_block = SetChunkBlock(chunk, position[0], position[1], position[2], block); int min_x = local_x == 0 ? -1 : 0; int max_x = local_x == CHUNK_WIDTH - 1 ? 1 : 0; int min_z = local_z == 0 ? -1 : 0; @@ -1082,14 +1091,14 @@ void world_set_block(const int position[3], block_t block) { int cx = chunk_x + x; int cz = chunk_z + z; - if (is_chunk_local(cx, cz) && !is_chunk_on_border(cx, cz)) + if (IsChunkLocal(cx, cz) && !IsChunkOnBorder(cx, cz)) { - regen_chunk_voxels(cx, cz); + RegenerateChunkVoxels(cx, cz); } } - chunk_t* neighborhood[3][3] = {0}; - get_neighborhood(chunk_x, chunk_z, neighborhood); - if (block_is_light(block) || block_is_light(old_block)) + Chunk* neighborhood[3][3] = {0}; + GetNeighborhood(chunk_x, chunk_z, neighborhood); + if (Block_IsLight(block) || Block_IsLight(old_block)) { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) @@ -1099,14 +1108,14 @@ void world_set_block(const int position[3], block_t block) } } -world_query_t world_raycast(const camera_t* camera, float length) +WorldQuery World_Raycast(const Camera* camera, float length) { - world_query_t query = {0}; + WorldQuery query = {0}; float direction[3] = {0}; float distances[3] = {0}; int steps[3] = {0}; float deltas[3] = {0}; - camera_get_vector(camera, &direction[0], &direction[1], &direction[2]); + Camera_GetVector(camera, &direction[0], &direction[1], &direction[2]); for (int i = 0; i < 3; i++) { query.current[i] = SDL_floorf(camera->position[i]); @@ -1133,8 +1142,8 @@ world_query_t world_raycast(const camera_t* camera, float length) float traveled = 0.0f; while (traveled <= length) { - query.block = world_get_block(query.current); - if (block_is_solid(query.block)) + query.block = World_GetBlock(query.current); + if (Block_IsSolid(query.block)) { return query; } diff --git a/src/world.h b/src/world.h index aa376466..b2f67c15 100644 --- a/src/world.h +++ b/src/world.h @@ -8,28 +8,28 @@ #define CHUNK_HEIGHT 240 #define WORLD_WIDTH 20 -typedef struct camera camera_t; +typedef struct Camera Camera; -typedef enum world_flags +typedef enum WorldFlags { WORLD_FLAGS_OPAQUE = 0x01, WORLD_FLAGS_TRANSPARENT = 0x02, WORLD_FLAGS_LIGHT = 0x04, } -world_flags_t; +WorldFlags; -typedef struct world_query +typedef struct WorldQuery { - block_t block; + Block block; int current[3]; int previous[3]; } -world_query_t; +WorldQuery; -void world_init(SDL_GPUDevice* device); -void world_free(); -void world_update(const camera_t* camera); -void world_render(const camera_t* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, world_flags_t flags); -block_t world_get_block(const int position[3]); -void world_set_block(const int position[3], block_t block); -world_query_t world_raycast(const camera_t* camera, float length); +void World_Init(SDL_GPUDevice* device); +void World_Free(); +void World_Update(const Camera* camera); +void World_Render(const Camera* camera, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, WorldFlags flags); +Block World_GetBlock(const int position[3]); +void World_SetBlock(const int position[3], Block block); +WorldQuery World_Raycast(const Camera* camera, float length); From 31feca4262c7e0598406c42208f66a2344f3ba6a Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 10:09:45 -0400 Subject: [PATCH 14/39] fix shadows again --- shaders/bin/shadow.vert.json | 2 +- shaders/bin/shadow.vert.msl | 20 +++++++++++++++++++- shaders/bin/shadow.vert.spv | Bin 17460 -> 21052 bytes shaders/shadow.vert | 5 +++++ src/main.c | 5 +++-- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/shaders/bin/shadow.vert.json b/shaders/bin/shadow.vert.json index 51723fc4..2f29e06e 100644 --- a/shaders/bin/shadow.vert.json +++ b/shaders/bin/shadow.vert.json @@ -1 +1 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 3 } +{ "samplers": 0, "storage_textures": 0, "storage_buffers": 1, "uniform_buffers": 3 } diff --git a/shaders/bin/shadow.vert.msl b/shaders/bin/shadow.vert.msl index c9562b8a..036467cd 100644 --- a/shaders/bin/shadow.vert.msl +++ b/shaders/bin/shadow.vert.msl @@ -3,6 +3,19 @@ using namespace metal; +struct Block +{ + uint IsSprite; + uint HasOcclusion; + uint IsFullbright; + uint Indices[6]; +}; + +struct type_StructuredBuffer_Block +{ + Block _m0[1]; +}; + struct type_UniformBuffer { float4x4 Proj; @@ -21,6 +34,8 @@ struct type_UniformBuffer_2 struct main0_out { float4 gl_Position [[position]]; + float gl_ClipDistance [[clip_distance]] [1]; + float gl_ClipDistance_0 [[user(clip0)]]; }; struct main0_in @@ -28,10 +43,13 @@ struct main0_in uint in_var_TEXCOORD0 [[attribute(0)]]; }; -vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]]) +vertex main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(3)]]) { main0_out out = {}; + uint _411 = (in.in_var_TEXCOORD0 >> 3u) & 31u; out.gl_Position = UniformBuffer.Proj * (UniformBuffer_1.View * float4(float3(float((in.in_var_TEXCOORD0 >> 10u) & 31u), float((in.in_var_TEXCOORD0 >> 15u) & 255u), float((in.in_var_TEXCOORD0 >> 23u) & 31u)) + float3(int3(float3(float(UniformBuffer_2.ChunkPosition.x), 0.0, float(UniformBuffer_2.ChunkPosition.y)))), 1.0)); + out.gl_ClipDistance[0u] = (blockBuffer._m0[_411].HasOcclusion != 0u) ? 1.0 : (-1.0); + out.gl_ClipDistance_0 = out.gl_ClipDistance[0]; return out; } diff --git a/shaders/bin/shadow.vert.spv b/shaders/bin/shadow.vert.spv index 5740262af1d3daea614401b32838e66a91455833..2065b92e2b210fd8f73e14d33cd4952183b54262 100644 GIT binary patch literal 21052 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 literal 17460 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 diff --git a/shaders/shadow.vert b/shaders/shadow.vert index a1e1fb30..4c02ab8c 100644 --- a/shaders/shadow.vert +++ b/shaders/shadow.vert @@ -1,5 +1,7 @@ #include "shader.hlsl" +StructuredBuffer blockBuffer : register(t0, space0); + cbuffer UniformBuffer : register(b0, space1) { float4x4 Proj; @@ -23,6 +25,7 @@ struct Input struct Output { float4 Position : SV_Position; + float ClipDistance : SV_ClipDistance0; }; Output main(Input input) @@ -30,6 +33,8 @@ Output main(Input input) Output output; int3 chunkPosition = float3(ChunkPosition.x, 0.0f, ChunkPosition.y); float3 position = GetPosition(input.Voxel) + chunkPosition; + Block block = blockBuffer[GetBlock(input.Voxel)]; output.Position = mul(Proj, mul(View, float4(position, 1.0f))); + output.ClipDistance = block.HasOcclusion ? 1.0f : -1.0f; return output; } diff --git a/src/main.c b/src/main.c index bd3ba94b..e31df843 100644 --- a/src/main.c +++ b/src/main.c @@ -15,7 +15,7 @@ static const int PLAYER_ID = 0; static const float ATLAS_WIDTH = 512.0f; static const int ATLAS_MIP_LEVELS = 4; static const float BLOCK_WIDTH = 16.0f; -static const int SHADOW_RESOLUTION = 4096.0f; +static const int SHADOW_RESOLUTION = 2048.0f; static const SDL_GPUSampleCount SAMPLE_COUNT = SDL_GPU_SAMPLECOUNT_4; static SDL_Window* window; @@ -478,7 +478,7 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) SDL_Log("Failed to claim window: %s", SDL_GetError()); return false; } - SDL_SetGPUSwapchainParameters(device, window, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_IMMEDIATE); + SDL_SetGPUSwapchainParameters(device, window, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_MAILBOX); color_format = SDL_GetGPUSwapchainTextureFormat(device, window); depth_format = SDL_GPU_TEXTUREFORMAT_D32_FLOAT; if (!CreateAtlas()) @@ -655,6 +655,7 @@ static void RenderShadow(SDL_GPUCommandBuffer* cbuf) return; } SDL_BindGPUGraphicsPipeline(pass, shadow_pipeline); + SDL_BindGPUVertexStorageBuffers(pass, 0, &block_buffer, 1); SDL_PushGPUDebugGroup(cbuf, "shadow"); World_Render(&sky.shadow_camera, cbuf, pass, WORLD_FLAGS_OPAQUE); SDL_PopGPUDebugGroup(cbuf); From 2070a18d9a0634b9164c8f642843060a5713d46c Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 10:23:58 -0400 Subject: [PATCH 15/39] refactor --- CMakeLists.txt | 1 - shaders/bin/shadow.frag.json | 1 - shaders/bin/shadow.frag.msl | 9 -- shaders/bin/shadow.frag.spv | Bin 828 -> 0 bytes shaders/shadow.frag | 3 - src/block.c | 62 ++----------- src/block.h | 9 -- src/buffer.c | 5 -- src/buffer.h | 1 - src/camera.h | 1 - src/main.c | 2 +- src/save.c | 82 ++++++------------ src/save.h | 1 - src/world.c | 163 +++++++++++++---------------------- 14 files changed, 95 insertions(+), 245 deletions(-) delete mode 100644 shaders/bin/shadow.frag.json delete mode 100644 shaders/bin/shadow.frag.msl delete mode 100644 shaders/bin/shadow.frag.spv delete mode 100644 shaders/shadow.frag diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c978915..c4aa1c03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,7 +93,6 @@ add_shader(opaque.frag shaders/shader.hlsl src/voxel.inc) add_shader(opaque.vert shaders/shader.hlsl src/voxel.inc) add_shader(raycast.frag shaders/shader.hlsl src/voxel.inc) add_shader(raycast.vert shaders/shader.hlsl src/voxel.inc) -add_shader(shadow.frag shaders/shader.hlsl src/voxel.inc) add_shader(shadow.vert shaders/shader.hlsl src/voxel.inc) add_shader(sky.frag shaders/shader.hlsl src/voxel.inc) add_shader(sky.vert shaders/shader.hlsl src/voxel.inc) diff --git a/shaders/bin/shadow.frag.json b/shaders/bin/shadow.frag.json deleted file mode 100644 index ec4afe4f..00000000 --- a/shaders/bin/shadow.frag.json +++ /dev/null @@ -1 +0,0 @@ -{ "samplers": 0, "storage_textures": 0, "storage_buffers": 0, "uniform_buffers": 0 } diff --git a/shaders/bin/shadow.frag.msl b/shaders/bin/shadow.frag.msl deleted file mode 100644 index 92ac1d9f..00000000 --- a/shaders/bin/shadow.frag.msl +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -using namespace metal; - -fragment void main0() -{ -} - diff --git a/shaders/bin/shadow.frag.spv b/shaders/bin/shadow.frag.spv deleted file mode 100644 index bb2e909a9a050dd66d07731cedf921e68a45b51b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 828 zcmYjPO;6iE5M2UkAaN5uTPPP-T&Svz6M<+z;#81`kWfXSS8J1Oz$C1#T_;gh^?!4z z#Cwh{Wuupw@w}NgJN9bns3OFQ5TY)=;Gbtpl(HvPu`YVQeuuX=_o0bR==7^HX*38U zGm62h;m69m*!1#Lv-hlq+BUCrfBMt~t=Vq1*t0HHX)=C8l*JnS67Z@b!{?jGGsZAL zBV+%(2p*lbE_hMOxFE6diyovd=uhIo*aa?=TG)8r99i|m+Dg`Y7Dq#$&5yrT|5pE1 zsliMcw$Q9VtKKO|X z&%%~3T@u-uFGnt!$ch@VWCM-h$6v6!8vx>U~9*Pq5VTum##0z+T)3 zb(V7<^V|_E^{L@uOXSo6))AbCGmuYh4_R`y0p@oB?w?xZkWa7&-w|~=W6_&@){O!7 zAdmC${hZ-u?9Kb|@IG&dKEoDw+K1124X~bE4^^x?0GPw)l+8kIqL}GFvK`size++; } -void CPUBuffer_Clear(CPUBuffer* cpu) -{ - cpu->size = 0; -} - void GPUBuffer_Init(GPUBuffer* gpu, SDL_GPUDevice* device, SDL_GPUBufferUsageFlags usage) { gpu->device = device; diff --git a/src/buffer.h b/src/buffer.h index a84a06ab..8721640d 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -16,7 +16,6 @@ CPUBuffer; void CPUBuffer_Init(CPUBuffer* cpu, SDL_GPUDevice* device, Uint32 stride); void CPUBuffer_Free(CPUBuffer* cpu); void CPUBuffer_Append(CPUBuffer* cpu, void* item); -void CPUBuffer_Clear(CPUBuffer* cpu); typedef struct GPUBuffer { diff --git a/src/camera.h b/src/camera.h index f6108ac6..c8586ed2 100644 --- a/src/camera.h +++ b/src/camera.h @@ -6,7 +6,6 @@ typedef enum CameraType { CAMERA_TYPE_ORTHO, CAMERA_TYPE_PERSPECTIVE, - CAMERA_TYPE_COUNT, } CameraType; diff --git a/src/main.c b/src/main.c index e31df843..0ff1f2b6 100644 --- a/src/main.c +++ b/src/main.c @@ -295,7 +295,7 @@ static bool CreateShadowPipeline() vertex_buffers[0].pitch = 4; SDL_GPUGraphicsPipelineCreateInfo info = {0}; info.vertex_shader = Shader_Load(device, "shadow.vert"); - info.fragment_shader = Shader_Load(device, "shadow.frag"); + info.fragment_shader = Shader_Load(device, "depth.frag"); info.target_info.has_depth_stencil_target = true; info.target_info.depth_stencil_format = depth_format; info.vertex_input_state.num_vertex_attributes = 1; diff --git a/src/save.c b/src/save.c index 098f2b18..7c87c0de 100644 --- a/src/save.c +++ b/src/save.c @@ -40,61 +40,44 @@ static sqlite3_stmt* set_block; static sqlite3_stmt* get_blocks; static SDL_Mutex* mutex; -bool Save_Init(const char* path) +static bool Execute(const char* sql, const char* name) { - if (sqlite3_open(path, &handle)) - { - SDL_Log("Failed to open %s database: %s", path, sqlite3_errmsg(handle)); - return false; - } - if (sqlite3_exec(handle, PLAYER_TABLE, NULL, NULL, NULL)) - { - SDL_Log("Failed to create player table: %s", sqlite3_errmsg(handle)); - return false; - } - if (sqlite3_exec(handle, BLOCK_TABLE, NULL, NULL, NULL)) - { - SDL_Log("Failed to create block table: %s", sqlite3_errmsg(handle)); - return false; - } - if (sqlite3_exec(handle, SKY_TABLE, NULL, NULL, NULL)) - { - SDL_Log("Failed to create sky table: %s", sqlite3_errmsg(handle)); - return false; - } - if (sqlite3_prepare_v2(handle, SET_PLAYER, -1, &set_player, NULL)) - { - SDL_Log("Failed to prepare set player: %s", sqlite3_errmsg(handle)); - return false; - } - if (sqlite3_prepare_v2(handle, GET_PLAYER, -1, &get_player, NULL)) - { - SDL_Log("Failed to prepare get player: %s", sqlite3_errmsg(handle)); - return false; - } - if (sqlite3_prepare_v2(handle, SET_SKY, -1, &set_sky, NULL)) - { - SDL_Log("Failed to prepare set sky: %s", sqlite3_errmsg(handle)); - return false; - } - if (sqlite3_prepare_v2(handle, GET_SKY, -1, &get_sky, NULL)) + if (sqlite3_exec(handle, sql, NULL, NULL, NULL)) { - SDL_Log("Failed to prepare get sky: %s", sqlite3_errmsg(handle)); + SDL_Log("Failed to %s: %s", name, sqlite3_errmsg(handle)); return false; } - if (sqlite3_prepare_v2(handle, SET_BLOCK, -1, &set_block, NULL)) + return true; +} + +static bool Prepare(sqlite3_stmt** statement, const char* sql, const char* name) +{ + if (sqlite3_prepare_v2(handle, sql, -1, statement, NULL)) { - SDL_Log("Failed to prepare set block: %s", sqlite3_errmsg(handle)); + SDL_Log("Failed to prepare %s: %s", name, sqlite3_errmsg(handle)); return false; } - if (sqlite3_prepare_v2(handle, GET_BLOCKS, -1, &get_blocks, NULL)) + return true; +} + +bool Save_Init(const char* path) +{ + if (sqlite3_open(path, &handle)) { - SDL_Log("Failed to prepare get blocks: %s", sqlite3_errmsg(handle)); + SDL_Log("Failed to open %s database: %s", path, sqlite3_errmsg(handle)); return false; } - if (sqlite3_exec(handle, BLOCK_INDEX, NULL, NULL, NULL)) + if (!Execute(PLAYER_TABLE, "create player table") || + !Execute(BLOCK_TABLE, "create block table") || + !Execute(SKY_TABLE, "create sky table") || + !Execute(BLOCK_INDEX, "create block index") || + !Prepare(&set_player, SET_PLAYER, "set player") || + !Prepare(&get_player, GET_PLAYER, "get player") || + !Prepare(&set_sky, SET_SKY, "set sky") || + !Prepare(&get_sky, GET_SKY, "get sky") || + !Prepare(&set_block, SET_BLOCK, "set block") || + !Prepare(&get_blocks, GET_BLOCKS, "get blocks")) { - SDL_Log("Failed to create block index: %s", sqlite3_errmsg(handle)); return false; } mutex = SDL_CreateMutex(); @@ -128,17 +111,6 @@ void Save_Free() mutex = NULL; } -void Save_Commit() -{ - if (!handle) - { - return; - } - SDL_LockMutex(mutex); - sqlite3_exec(handle, "COMMIT; BEGIN;", NULL, NULL, NULL); - SDL_UnlockMutex(mutex); -} - void Save_SetPlayer(int id, const void* data, int size) { if (!handle) diff --git a/src/save.h b/src/save.h index 8396d773..9af901ad 100644 --- a/src/save.h +++ b/src/save.h @@ -8,7 +8,6 @@ typedef void (*SaveSetBlock)(void* userdata, int bx, int by, int bz, Block block bool Save_Init(const char* path); void Save_Free(); -void Save_Commit(); void Save_SetPlayer(int id, const void* data, int size); bool Save_GetPlayer(int id, void* data, int size); void Save_SetSky(float time_of_day); diff --git a/src/world.c b/src/world.c index 25ba140b..6777612f 100644 --- a/src/world.c +++ b/src/world.c @@ -11,6 +11,7 @@ #define WORKERS 4 static const int AO_LEVEL_CLEAR = 3; +static const Uint32 INDEX_COUNT = CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_WIDTH * DIRECTION_COUNT * 6; typedef enum JobType { @@ -83,16 +84,13 @@ Chunk; static SDL_GPUDevice* device; static int world_x; static int world_z; -static bool is_moving; static Worker workers[WORKERS]; -static CPUBuffer cpu_indices; static GPUBuffer gpu_indices; static CPUBuffer cpu_empty_lights; static GPUBuffer gpu_empty_lights; static CPUBuffer cpu_voxels[MESH_TYPE_COUNT]; static Chunk* chunks[WORLD_WIDTH][WORLD_WIDTH]; static int sorted_chunks[WORLD_WIDTH][WORLD_WIDTH][2]; -static SDL_Mutex* mutex; static bool IsBlockLocal(int bx, int by, int bz) { @@ -535,40 +533,25 @@ static void GenerateLights() GPUBuffer_EndUpload(&gpu_empty_lights); } -static void GenerateIndices(Uint32 size) +static void GenerateIndices() { - SDL_LockMutex(mutex); - size *= 1.5; - if (gpu_indices.size >= size) - { - SDL_UnlockMutex(mutex); - return; - } + CPUBuffer indices; + CPUBuffer_Init(&indices, device, sizeof(Uint32)); if (!GPUBuffer_BeginUpload(&gpu_indices)) { - SDL_UnlockMutex(mutex); + CPUBuffer_Free(&indices); return; } static const int INDICES[] = {0, 1, 2, 3, 2, 1}; - for (Uint32 i = 0; i < size; i++) + for (Uint32 i = 0; i < INDEX_COUNT / 6; i++) for (Uint32 j = 0; j < 6; j++) { Uint32 index = i * 4 + INDICES[j]; - CPUBuffer_Append(&cpu_indices, &index); + CPUBuffer_Append(&indices, &index); } - GPUBuffer_Upload(&gpu_indices, &cpu_indices); + GPUBuffer_Upload(&gpu_indices, &indices); GPUBuffer_EndUpload(&gpu_indices); - SDL_UnlockMutex(mutex); -} - -static void WaitForJob(Worker* worker) -{ - SDL_LockMutex(worker->mutex); - while (worker->job.type == JOB_TYPE_NONE) - { - SDL_WaitCondition(worker->condition, worker->mutex); - } - SDL_UnlockMutex(worker->mutex); + CPUBuffer_Free(&indices); } static void WaitForJobFinish(const Worker* worker) @@ -581,55 +564,53 @@ static void WaitForJobFinish(const Worker* worker) SDL_UnlockMutex(worker->mutex); } -static int ClearJob(Worker* worker) -{ - SDL_LockMutex(worker->mutex); - SDL_assert(worker->job.type != JOB_TYPE_NONE); - worker->job.type = JOB_TYPE_NONE; - SDL_SignalCondition(worker->condition); - SDL_UnlockMutex(worker->mutex); - return 0; -} - static int WorkerFunction(void* args) { Worker* worker = args; while (true) { - WaitForJob(worker); - Job job = worker->job; - if (job.type == JOB_TYPE_QUIT) - { - return ClearJob(worker); - } - Chunk* chunk = GetChunk(job.x, job.z); - SDL_assert(chunk); - if (job.type == JOB_TYPE_BLOCKS) + SDL_LockMutex(worker->mutex); + while (worker->job.type == JOB_TYPE_NONE) { - GenerateChunkBlocks(chunk); + SDL_WaitCondition(worker->condition, worker->mutex); } - else + Job job = worker->job; + SDL_UnlockMutex(worker->mutex); + if (job.type != JOB_TYPE_QUIT) { - Chunk* chunks[3][3]; - GetNeighborhood(job.x, job.z, chunks); - if (job.type == JOB_TYPE_VOXELS) + Chunk* chunk = GetChunk(job.x, job.z); + SDL_assert(chunk); + if (job.type == JOB_TYPE_BLOCKS) { - GenerateChunkVoxels(chunks, worker->voxels); - for (int i = 0; i < MESH_TYPE_COUNT; i++) - { - GenerateIndices(chunk->gpu_voxels[i].size); - } - } - else if (job.type == JOB_TYPE_LIGHTS) - { - GenerateChunkLights(chunks, &worker->lights); + GenerateChunkBlocks(chunk); } else { - SDL_assert(false); + Chunk* chunks[3][3]; + GetNeighborhood(job.x, job.z, chunks); + if (job.type == JOB_TYPE_VOXELS) + { + GenerateChunkVoxels(chunks, worker->voxels); + } + else if (job.type == JOB_TYPE_LIGHTS) + { + GenerateChunkLights(chunks, &worker->lights); + } + else + { + SDL_assert(false); + } } } - ClearJob(worker); + SDL_LockMutex(worker->mutex); + SDL_assert(worker->job.type != JOB_TYPE_NONE); + worker->job.type = JOB_TYPE_NONE; + SDL_SignalCondition(worker->condition); + SDL_UnlockMutex(worker->mutex); + if (job.type == JOB_TYPE_QUIT) + { + return 0; + } } return 0; } @@ -637,16 +618,9 @@ static int WorkerFunction(void* args) static bool IsJobRunning(const Worker* worker) { SDL_LockMutex(worker->mutex); - if (worker->job.type != JOB_TYPE_NONE) - { - SDL_UnlockMutex(worker->mutex); - return true; - } - else - { - SDL_UnlockMutex(worker->mutex); - return false; - } + bool running = worker->job.type != JOB_TYPE_NONE; + SDL_UnlockMutex(worker->mutex); + return running; } static SDL_AtomicInt* GetJobState(Chunk* chunk, JobType type) @@ -745,15 +719,9 @@ static int SortFunction(void* userdata, const void* lhs, const void* rhs) void World_Init(SDL_GPUDevice* handle) { - mutex = SDL_CreateMutex(); - if (!mutex) - { - SDL_Log("Failed to create mutex: %s", SDL_GetError()); - } device = handle; world_x = SDL_MAX_SINT32; world_z = SDL_MAX_SINT32; - CPUBuffer_Init(&cpu_indices, device, sizeof(Uint32)); GPUBuffer_Init(&gpu_indices, device, SDL_GPU_BUFFERUSAGE_INDEX); CPUBuffer_Init(&cpu_empty_lights, device, sizeof(Light)); GPUBuffer_Init(&gpu_empty_lights, device, SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ); @@ -774,7 +742,7 @@ void World_Init(SDL_GPUDevice* handle) } SDL_qsort_r(sorted_chunks, WORLD_WIDTH * WORLD_WIDTH, sizeof(int) * 2, SortFunction, NULL); GenerateLights(); - GenerateIndices(1000000); + GenerateIndices(); } void World_Free() @@ -788,7 +756,6 @@ void World_Free() { FreeChunk(chunks[x][z]); } - CPUBuffer_Free(&cpu_indices); GPUBuffer_Free(&gpu_indices); CPUBuffer_Free(&cpu_empty_lights); GPUBuffer_Free(&gpu_empty_lights); @@ -796,20 +763,6 @@ void World_Free() { CPUBuffer_Free(&cpu_voxels[i]); } - SDL_DestroyMutex(mutex); -} - -static int GetRunningCount() -{ - int num_running = 0; - for (int i = 0; i < WORKERS; i++) - { - if (IsJobRunning(&workers[i])) - { - num_running++; - } - } - return num_running; } static int GetWorkers(Worker* local_workers[WORKERS]) @@ -866,21 +819,23 @@ static void Shuffle(int offset_x, int offset_z) chunk->z = (world_z + z) * CHUNK_WIDTH; } SDL_assert(!size); - is_moving = false; } -static void MoveChunks(const Camera* camera) +static bool MoveChunks(const Camera* camera) { const int offset_x = camera->x / CHUNK_WIDTH - WORLD_WIDTH / 2 - world_x; const int offset_z = camera->z / CHUNK_WIDTH - WORLD_WIDTH / 2 - world_z; - if (offset_x || offset_z) + if (!offset_x && !offset_z) { - is_moving = true; - if (!GetRunningCount()) - { - Shuffle(offset_x, offset_z); - } + return false; + } + Worker* local_workers[WORKERS]; + if (GetWorkers(local_workers) != WORKERS) + { + return true; } + Shuffle(offset_x, offset_z); + return false; } static bool TryUpdateBlocks(int x, int z, Worker* worker) @@ -892,7 +847,6 @@ static bool TryUpdateBlocks(int x, int z, Worker* worker) return false; } Job job = {JOB_TYPE_BLOCKS, x, z}; - SDL_assert(!IsJobRunning(worker)); DispatchJob(worker, &job); return true; } @@ -909,7 +863,7 @@ static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) bool do_light = SDL_GetAtomicInt(&chunk->light_state) == JOB_STATE_REQUESTED; if (!do_voxel && !do_light) { - return false;; + return false; } Chunk* neighborhood[3][3]; GetNeighborhood(x, z, neighborhood); @@ -940,8 +894,7 @@ static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) void World_Update(const Camera* camera) { - MoveChunks(camera); - if (is_moving) + if (MoveChunks(camera)) { return; } From ad9cee4e46d924ee6777f03fcd5595a33083b206 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 10:36:48 -0400 Subject: [PATCH 16/39] better shadows --- shaders/bin/depth.vert.spv | Bin 17476 -> 17548 bytes shaders/bin/opaque.frag.msl | 193 ++++++++++++++++--------------- shaders/bin/opaque.frag.spv | Bin 53880 -> 54464 bytes shaders/bin/opaque.vert.spv | Bin 20996 -> 21068 bytes shaders/bin/raycast.vert.spv | Bin 14588 -> 14660 bytes shaders/bin/shadow.vert.spv | Bin 21052 -> 21124 bytes shaders/bin/sky.frag.spv | Bin 17388 -> 17460 bytes shaders/bin/sky.vert.spv | Bin 14736 -> 14808 bytes shaders/bin/transparent.frag.msl | 191 +++++++++++++++--------------- shaders/bin/transparent.frag.spv | Bin 54100 -> 54684 bytes shaders/bin/transparent.vert.spv | Bin 20836 -> 20908 bytes shaders/shader.hlsl | 3 +- 12 files changed, 195 insertions(+), 192 deletions(-) diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index d179cdd317dc5ad893abcd7190df4f6dd5b2d7aa..cc01a7160f29fe442ab8abe0578fca675426ed7a 100644 GIT binary patch delta 104 zcmX@o!PwKuxM3L! _664 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _668 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -114,176 +114,177 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _746 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _772 = spvUnsafeArray({ blockBuffer._m0[_746].Indices[0], blockBuffer._m0[_746].Indices[1], blockBuffer._m0[_746].Indices[2], blockBuffer._m0[_746].Indices[3], blockBuffer._m0[_746].Indices[4], blockBuffer._m0[_746].Indices[5] }); - spvUnsafeArray _675 = _772; - bool _801 = blockBuffer._m0[_746].IsSprite != 0u; - uint _815; - if (_801) + uint _750 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _776 = spvUnsafeArray({ blockBuffer._m0[_750].Indices[0], blockBuffer._m0[_750].Indices[1], blockBuffer._m0[_750].Indices[2], blockBuffer._m0[_750].Indices[3], blockBuffer._m0[_750].Indices[4], blockBuffer._m0[_750].Indices[5] }); + spvUnsafeArray _679 = _776; + bool _805 = blockBuffer._m0[_750].IsSprite != 0u; + uint _819; + if (_805) { - _815 = 0u; + _819 = 0u; } else { - _815 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + _819 = (in.in_var_TEXCOORD2 >> 0u) & 7u; } - float3 _829 = float3(in.in_var_TEXCOORD1, float(_675[_815])); - float4 _839 = atlasTexture.sample(atlasSampler, _829.xy, uint(rint(_829.z))); - if (_839.w < 0.001000000047497451305389404296875) + float3 _833 = float3(in.in_var_TEXCOORD1, float(_679[_819])); + float4 _843 = atlasTexture.sample(atlasSampler, _833.xy, uint(rint(_833.z))); + if (_843.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _854 = _839.xyz; - uint _889 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_801 ? 6 : 0); - uint _905 = uint(UniformBuffer.LightCount); - float3 _922; - float3 _925; - _922 = _673; - _925 = float3(0.0); - float3 _923; + float3 _858 = _843.xyz; + uint _893 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_805 ? 6 : 0); + uint _909 = uint(UniformBuffer.LightCount); float3 _926; - for (uint _927 = 0u; _927 < _905; _922 = _923, _925 = _926, _927++) + float3 _929; + _926 = _677; + _929 = float3(0.0); + float3 _927; + float3 _930; + for (uint _931 = 0u; _931 < _909; _926 = _927, _929 = _930, _931++) { - float _963 = float((lightBuffer._m0[_927].Color & 4278190080u) >> 24u); - float3 _981 = (float3(float(lightBuffer._m0[_927].X), float(lightBuffer._m0[_927].Y), float(lightBuffer._m0[_927].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _985 = length(_981); - bool _999; - if (!(_985 >= _963)) + float _967 = float((lightBuffer._m0[_931].Color & 4278190080u) >> 24u); + float3 _985 = (float3(float(lightBuffer._m0[_931].X), float(lightBuffer._m0[_931].Y), float(lightBuffer._m0[_931].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _989 = length(_985); + bool _1003; + if (!(_989 >= _967)) { - _999 = _963 <= 0.0; + _1003 = _967 <= 0.0; } else { - _999 = true; + _1003 = true; } - if (_999) + if (_1003) { - _923 = _922; - _926 = _925; + _927 = _926; + _930 = _929; continue; } - float _1014 = fast::clamp(dot(_664[_889], _981 / float3(_985)), 0.0, 1.0); - if (_1014 <= 0.0) + float _1018 = fast::clamp(dot(_668[_893], _985 / float3(_989)), 0.0, 1.0); + if (_1018 <= 0.0) { - _923 = _922; - _926 = _925; + _927 = _926; + _930 = _929; continue; } - float3 _1060 = float3(float((lightBuffer._m0[_927].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _923 = _1060; - _926 = _925 + ((_1060 * _1014) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_985 / _963, 0.0, 1.0)))); + float3 _1064 = float3(float((lightBuffer._m0[_931].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_931].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_931].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _927 = _1064; + _930 = _929 + ((_1064 * _1018) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_989 / _967, 0.0, 1.0)))); } - float _1401; + float _1416; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1401 = 0.0; + _1416 = 0.0; break; } - float _1173; - if (blockBuffer._m0[_746].HasOcclusion != 0u) + float _1177; + if (blockBuffer._m0[_750].HasOcclusion != 0u) { - _1173 = fast::clamp(-dot(_664[_889], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1177 = fast::clamp(-dot(_668[_893], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1173 = 0.7070000171661376953125; + _1177 = 0.7070000171661376953125; } - if (_1173 <= 0.0) + if (_1177 <= 0.0) { - _1401 = 0.0; + _1416 = 0.0; break; } - float4 _1192 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1202 = _1192.xyz / float3(_1192.w); - float2 _1212 = (_1202.xy * 0.5) + float2(0.5); - float _1218 = 1.0 - _1212.y; - float2 _1220 = _1212; - _1220.y = _1218; - float _1224 = _1212.x; - bool _1236; - if (!(_1224 < 0.0)) + float4 _1196 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1206 = _1196.xyz / float3(_1196.w); + float2 _1216 = (_1206.xy * 0.5) + float2(0.5); + float _1222 = 1.0 - _1216.y; + float2 _1224 = _1216; + _1224.y = _1222; + float _1228 = _1216.x; + bool _1240; + if (!(_1228 < 0.0)) { - _1236 = _1224 > 1.0; + _1240 = _1228 > 1.0; } else { - _1236 = true; + _1240 = true; } - bool _1246; - if (!_1236) + bool _1250; + if (!_1240) { - _1246 = _1218 < 0.0; + _1250 = _1222 < 0.0; } else { - _1246 = true; + _1250 = true; } - bool _1256; - if (!_1246) + bool _1260; + if (!_1250) { - _1256 = _1218 > 1.0; + _1260 = _1222 > 1.0; } else { - _1256 = true; + _1260 = true; } - bool _1268; - if (!_1256) + bool _1272; + if (!_1260) { - _1268 = _1202.z < 0.0; + _1272 = _1206.z < 0.0; } else { - _1268 = true; + _1272 = true; } - bool _1280; - if (!_1268) + bool _1284; + if (!_1272) { - _1280 = _1202.z > 1.0; + _1284 = _1206.z > 1.0; } else { - _1280 = true; + _1284 = true; } - if (_1280) + if (_1284) { - _1401 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173; + _1416 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1177; break; } - uint2 _1291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1307 = float2(1.0) / float2(float(_1291.x), float(_1291.y)); - float _1315 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1173)); - float _1324; - int _1327; - _1324 = 0.0; - _1327 = -1; - float _1325; - for (; _1327 <= 1; _1324 = _1325, _1327++) + uint2 _1295 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1311 = float2(1.0) / float2(float(_1295.x), float(_1295.y)); + float _1320 = (abs(_668[_893].y) < 0.5) ? 2.0 : 1.0; + float _1328 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1177)); + float _1337; + int _1340; + _1337 = 0.0; + _1340 = -1; + float _1338; + for (; _1340 <= 1; _1337 = _1338, _1340++) { - _1325 = _1324; - for (int _1343 = -1; _1343 <= 1; ) + _1338 = _1337; + for (int _1356 = -1; _1356 <= 1; ) { - _1325 += shadowTexture.sample_compare(shadowSampler, (_1220 + (float2(float(_1327), float(_1343)) * _1307)), _1202.z - _1315, level(0.0)); - _1343++; + _1338 += shadowTexture.sample_compare(shadowSampler, (_1224 + ((float2(float(_1340), float(_1356)) * _1311) * _1320)), _1206.z - _1328, level(0.0)); + _1356++; continue; } } - _1401 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173) * mix(1.0, _1324 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1416 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1177) * mix(1.0, _1337 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1427; - if (blockBuffer._m0[_746].IsFullbright != 0u) + float3 _1442; + if (blockBuffer._m0[_750].IsFullbright != 0u) { - _1427 = _854; + _1442 = _858; } else { - _1427 = _854 * (((_925 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1401)); + _1442 = _858 * (((_929 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1416)); } - float3 _1434 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_1427, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1434.y, length(float2(_1434.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _1449 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_1442, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1449.y, length(float2(_1449.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index f08b23a024e260c30bde49537de1fc5aac8e4060..070526ee6afde22e5d8bb890bb497f08b1e44cae 100644 GIT binary patch literal 54464 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�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 delta 42 xcmX@Jgt27_{gt~GhSxPxI@W==_JQBYz^W@)j4twLf_u|{5gQEp<6 wUZtjjje>!mX_|t)f{~sTr92yBYo05>qluixq4Y5|fHG z^74yv6La(`H5F_W4D?LX6zmm@^bFDztP~7^)a3KxpZFED6p%G;J}6PiwAe=48~_&B BB-a1{ delta 42 xcmZo!%D86<_dkbQn~rmDQ)IV4dpAp7j*nX27Pj2AYmY8;ma02M1TVgLXD delta 110 zcmdne!T6?~alN4s46db7D?0#$Ud|Ap=vi1{gt~GhSxPxI@W==_JQBYz^W@)j4twLf_u|{5gQEp<6 wUZtjjje>!mX_|t)f{~sn+a delta 40 vcmcanJfV2QG8V?=o0qek5n|+>Tr92yB _667 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _671 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -113,167 +113,168 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _756 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_756].Indices[0], blockBuffer._m0[_756].Indices[1], blockBuffer._m0[_756].Indices[2], blockBuffer._m0[_756].Indices[3], blockBuffer._m0[_756].Indices[4], blockBuffer._m0[_756].Indices[5] }); - uint _826 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _830 = blockBuffer._m0[_756].IsSprite != 0u; - uint _835 = _826 + uint(_830 ? 6 : 0); - spvUnsafeArray _681 = _782; - uint _853 = _830 ? 0u : _826; - float3 _867 = float3(in.in_var_TEXCOORD1, float(_681[_853])); - float4 _877 = atlasTexture.sample(atlasSampler, _867.xy, uint(rint(_867.z))); - float _885 = _877.w; - uint _897 = uint(UniformBuffer.LightCount); - float3 _914; - float3 _917; - _914 = _678; - _917 = float3(0.0); - float3 _915; + uint _760 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _786 = spvUnsafeArray({ blockBuffer._m0[_760].Indices[0], blockBuffer._m0[_760].Indices[1], blockBuffer._m0[_760].Indices[2], blockBuffer._m0[_760].Indices[3], blockBuffer._m0[_760].Indices[4], blockBuffer._m0[_760].Indices[5] }); + uint _830 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _834 = blockBuffer._m0[_760].IsSprite != 0u; + uint _839 = _830 + uint(_834 ? 6 : 0); + spvUnsafeArray _685 = _786; + uint _857 = _834 ? 0u : _830; + float3 _871 = float3(in.in_var_TEXCOORD1, float(_685[_857])); + float4 _881 = atlasTexture.sample(atlasSampler, _871.xy, uint(rint(_871.z))); + float _889 = _881.w; + uint _901 = uint(UniformBuffer.LightCount); float3 _918; - for (uint _919 = 0u; _919 < _897; _914 = _915, _917 = _918, _919++) + float3 _921; + _918 = _682; + _921 = float3(0.0); + float3 _919; + float3 _922; + for (uint _923 = 0u; _923 < _901; _918 = _919, _921 = _922, _923++) { - float _955 = float((lightBuffer._m0[_919].Color & 4278190080u) >> 24u); - float3 _973 = (float3(float(lightBuffer._m0[_919].X), float(lightBuffer._m0[_919].Y), float(lightBuffer._m0[_919].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _977 = length(_973); - bool _991; - if (!(_977 >= _955)) + float _959 = float((lightBuffer._m0[_923].Color & 4278190080u) >> 24u); + float3 _977 = (float3(float(lightBuffer._m0[_923].X), float(lightBuffer._m0[_923].Y), float(lightBuffer._m0[_923].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _981 = length(_977); + bool _995; + if (!(_981 >= _959)) { - _991 = _955 <= 0.0; + _995 = _959 <= 0.0; } else { - _991 = true; + _995 = true; } - if (_991) + if (_995) { - _915 = _914; - _918 = _917; + _919 = _918; + _922 = _921; continue; } - float _1006 = fast::clamp(dot(_667[_835], _973 / float3(_977)), 0.0, 1.0); - if (_1006 <= 0.0) + float _1010 = fast::clamp(dot(_671[_839], _977 / float3(_981)), 0.0, 1.0); + if (_1010 <= 0.0) { - _915 = _914; - _918 = _917; + _919 = _918; + _922 = _921; continue; } - float3 _1052 = float3(float((lightBuffer._m0[_919].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _915 = _1052; - _918 = _917 + ((_1052 * _1006) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_977 / _955, 0.0, 1.0)))); + float3 _1056 = float3(float((lightBuffer._m0[_923].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_923].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_923].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _919 = _1056; + _922 = _921 + ((_1056 * _1010) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_981 / _959, 0.0, 1.0)))); } - float _1393; + float _1408; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1393 = 0.0; + _1408 = 0.0; break; } - float _1165; - if (blockBuffer._m0[_756].HasOcclusion != 0u) + float _1169; + if (blockBuffer._m0[_760].HasOcclusion != 0u) { - _1165 = fast::clamp(-dot(_667[_835], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1169 = fast::clamp(-dot(_671[_839], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1165 = 0.7070000171661376953125; + _1169 = 0.7070000171661376953125; } - if (_1165 <= 0.0) + if (_1169 <= 0.0) { - _1393 = 0.0; + _1408 = 0.0; break; } - float4 _1184 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1194 = _1184.xyz / float3(_1184.w); - float2 _1204 = (_1194.xy * 0.5) + float2(0.5); - float _1210 = 1.0 - _1204.y; - float2 _1212 = _1204; - _1212.y = _1210; - float _1216 = _1204.x; - bool _1228; - if (!(_1216 < 0.0)) + float4 _1188 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1198 = _1188.xyz / float3(_1188.w); + float2 _1208 = (_1198.xy * 0.5) + float2(0.5); + float _1214 = 1.0 - _1208.y; + float2 _1216 = _1208; + _1216.y = _1214; + float _1220 = _1208.x; + bool _1232; + if (!(_1220 < 0.0)) { - _1228 = _1216 > 1.0; + _1232 = _1220 > 1.0; } else { - _1228 = true; + _1232 = true; } - bool _1238; - if (!_1228) + bool _1242; + if (!_1232) { - _1238 = _1210 < 0.0; + _1242 = _1214 < 0.0; } else { - _1238 = true; + _1242 = true; } - bool _1248; - if (!_1238) + bool _1252; + if (!_1242) { - _1248 = _1210 > 1.0; + _1252 = _1214 > 1.0; } else { - _1248 = true; + _1252 = true; } - bool _1260; - if (!_1248) + bool _1264; + if (!_1252) { - _1260 = _1194.z < 0.0; + _1264 = _1198.z < 0.0; } else { - _1260 = true; + _1264 = true; } - bool _1272; - if (!_1260) + bool _1276; + if (!_1264) { - _1272 = _1194.z > 1.0; + _1276 = _1198.z > 1.0; } else { - _1272 = true; + _1276 = true; } - if (_1272) + if (_1276) { - _1393 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165; + _1408 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1169; break; } - uint2 _1283 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1299 = float2(1.0) / float2(float(_1283.x), float(_1283.y)); - float _1307 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1165)); - float _1316; - int _1319; - _1316 = 0.0; - _1319 = -1; - float _1317; - for (; _1319 <= 1; _1316 = _1317, _1319++) + uint2 _1287 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1303 = float2(1.0) / float2(float(_1287.x), float(_1287.y)); + float _1312 = (abs(_671[_839].y) < 0.5) ? 2.0 : 1.0; + float _1320 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1169)); + float _1329; + int _1332; + _1329 = 0.0; + _1332 = -1; + float _1330; + for (; _1332 <= 1; _1329 = _1330, _1332++) { - _1317 = _1316; - for (int _1335 = -1; _1335 <= 1; ) + _1330 = _1329; + for (int _1348 = -1; _1348 <= 1; ) { - _1317 += shadowTexture.sample_compare(shadowSampler, (_1212 + (float2(float(_1319), float(_1335)) * _1299)), _1194.z - _1307, level(0.0)); - _1335++; + _1330 += shadowTexture.sample_compare(shadowSampler, (_1216 + ((float2(float(_1332), float(_1348)) * _1303) * _1312)), _1198.z - _1320, level(0.0)); + _1348++; continue; } } - _1393 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165) * mix(1.0, _1316 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1408 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1169) * mix(1.0, _1329 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1401 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - spvUnsafeArray _680 = _782; - float _1502; - if (_680[_853] == 16u) + float3 _1416 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + spvUnsafeArray _684 = _786; + float _1517; + if (_684[_857] == 16u) { - float4 _1482 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); - _1502 = _885 + ((in.in_var_TEXCOORD0.y - _1482.y) * 0.100000001490116119384765625); + float4 _1497 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); + _1517 = _889 + ((in.in_var_TEXCOORD0.y - _1497.y) * 0.100000001490116119384765625); } else { - _1502 = _885; + _1517 = _889; } - out.out_var_SV_Target0 = float4(mix(_877.xyz * (((_917 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1393)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1401.y, length(float2(_1401.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1502); + out.out_var_SV_Target0 = float4(mix(_881.xyz * (((_921 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1408)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1416.y, length(float2(_1416.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1517); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index 6282492d7ad908412a18a0510df987bc513e9fa5..f0178d8cca6f1ad71eba59b29f53e8410887876d 100644 GIT binary patch literal 54684 zcmch=2b`7F@&A8;1rrbvDZYSu`6Q1 z5))G_F$tK&7LC!EVvHu5#HcC8#2(A<^M1~md*>eZZv4Jp|JVP9;W;zsGjrz5>F0Sc z-Ma3!K`z%Nm&)TTg{Wi;W%_KaBitm}*FgJbL%-M%dI&yYXbJOhB!lJsSwuZU0 z8=C5ymA`SWM}|Lm%JeCQjLnX7*MLlbiN?xG$dIV_KIxlM%t1HXZ|jr1J1-=L#f3oWgK zPO7VGY8|w=rTL`7+_u(1a~hlHE^HmtnibzVsI5i0i|bknO>MRHEp_uVeX9Qj^=oSf zwYJP1w4`}ip|Q51X|D92Rc&**-5Tnf<`wGmGp8OiVan{uhmY&Io7je?f|C?QW2eqO zX!4Bd`JqM0_{m337&l|`)Wbu@uwuqRQ>KnPGzdo&g~z0VSwXN*5pisaI4TH+6cIC1 zLCJ-w6DLleFe6_*xPK8H+^~%Gpab$H5j86*s;Z_{W@A9URI?KLm?F5OHy|IwRf5eb z!iow5@*yZC(6L2O5k4Rv0#yPXRRk5`1M(qwCD6zVe)VnxN_(*Wgf(MltX5fL1Hw@A;*?MVl2ubN0mWh zB+4N(%OIh%^$(DqyA_(|HPrXi*s03((%5NlXlm0#e4kuzJ-^^s3}d=>L1Swpx({{V zM7lN(r%xI?e!`KnCuwTxUF^kW!rnax4azTQYg^p9-=IPB8`>7M f;yl7Bk!<^Q6 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 diff --git a/shaders/shader.hlsl b/shaders/shader.hlsl index b302477f..3c0e7141 100644 --- a/shaders/shader.hlsl +++ b/shaders/shader.hlsl @@ -176,12 +176,13 @@ float GetSunLight(Texture2D texture, SamplerComparisonState state, float4 uint height; texture.GetDimensions(width, height); float2 texelSize = 1.0f / float2(width, height); + float filterRadius = abs(normal.y) < 0.5f ? 2.0f : 1.0f; float bias = 0.0003f + 0.001f * (1.0f - ratio); float visibility = 0.0f; for (int x = -1; x <= 1; x++) for (int y = -1; y <= 1; y++) { - visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); + visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize * filterRadius, shadowPosition.z - bias); } visibility /= 9.0f; float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); From 18f88e53ccfeecf884713bfa2e24332720f1b8b0 Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 11:13:15 -0400 Subject: [PATCH 17/39] shadows again again --- README.md | 2 + shaders/bin/depth.vert.spv | Bin 17548 -> 17524 bytes shaders/bin/opaque.frag.msl | 193 +++++++++++++++---------------- shaders/bin/opaque.frag.spv | Bin 54464 -> 53928 bytes shaders/bin/opaque.vert.spv | Bin 21068 -> 21044 bytes shaders/bin/raycast.vert.spv | Bin 14660 -> 14636 bytes shaders/bin/shadow.vert.spv | Bin 21124 -> 21100 bytes shaders/bin/sky.frag.spv | Bin 17460 -> 17436 bytes shaders/bin/sky.vert.spv | Bin 14808 -> 14784 bytes shaders/bin/transparent.frag.msl | 191 +++++++++++++++--------------- shaders/bin/transparent.frag.spv | Bin 54684 -> 54148 bytes shaders/bin/transparent.vert.spv | Bin 20908 -> 20884 bytes shaders/shader.hlsl | 3 +- src/main.c | 6 +- src/sky.c | 7 ++ src/sky.h | 1 + 16 files changed, 207 insertions(+), 196 deletions(-) diff --git a/README.md b/README.md index 4036115d..bc56bba7 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Tiny Minecraft clone in C and HLSL using the new SDL3 GPU API - Directional shadows - Clustered dynamic lighting - Blocks and sprites +- Day and night cycle ### Building @@ -59,6 +60,7 @@ To build locally, add [SDL_shadercross](https://github.com/libsdl-org/SDL_shader - `Scroll` to change blocks - `F11` to toggle fullscreen - `LControl` to sprint +- `T` to reset the time of day ### Passes diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index cc01a7160f29fe442ab8abe0578fca675426ed7a..9f33298acc05f900aa73d5e7170f51f91dfa6921 100644 GIT binary patch delta 414 zcmeC_Wc<>>xM3L!rQD#Z1HIkS|VzGa6a!zS+ zW_}*BxM#6jX--a3QD%BZ35s}LN@j9uakN>i_2gJ~+0D#sfvl6ib4g9k;g)9O<*Mc7 z;+@>ZEe{kD*t~=L6Eh?4=2iR`nHYH|R}1+AIj4kPF-~^km!5o9gbyfqTSQ$9;+o7f z1&!j;JkPw6)V$)%lFG@;MJ+e`i2h>)s`3)o1d_$#T0nBHxG9k2moSls=u6AVPb^U= z%Ph`J%FF@kQ?OMq&@)K0=AE1%p#)UfB%#CsQCZD9d6h)iWPV9$s6Z|6WCKYFpc)TJ zJ0RI62{L)Nqyx+!|0Gq#;UQR*T2fk+r;wbVlV1ch++1oB3rKGAX(?%-u4hu_KvGuP b3`hn`s|i3tf=f9S7+h(*TnwArq}en9*rjs{ delta 476 zcmey;!PwKuxM3L!}(;dOkCBIL$GD<#7$(8Oeo7N&P>Y8$ty8$63i)m z5@8++S}0cOC=_QTrsS6gFvVpka _668 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _664 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -114,177 +114,176 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _750 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _776 = spvUnsafeArray({ blockBuffer._m0[_750].Indices[0], blockBuffer._m0[_750].Indices[1], blockBuffer._m0[_750].Indices[2], blockBuffer._m0[_750].Indices[3], blockBuffer._m0[_750].Indices[4], blockBuffer._m0[_750].Indices[5] }); - spvUnsafeArray _679 = _776; - bool _805 = blockBuffer._m0[_750].IsSprite != 0u; - uint _819; - if (_805) + uint _746 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _772 = spvUnsafeArray({ blockBuffer._m0[_746].Indices[0], blockBuffer._m0[_746].Indices[1], blockBuffer._m0[_746].Indices[2], blockBuffer._m0[_746].Indices[3], blockBuffer._m0[_746].Indices[4], blockBuffer._m0[_746].Indices[5] }); + spvUnsafeArray _675 = _772; + bool _801 = blockBuffer._m0[_746].IsSprite != 0u; + uint _815; + if (_801) { - _819 = 0u; + _815 = 0u; } else { - _819 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + _815 = (in.in_var_TEXCOORD2 >> 0u) & 7u; } - float3 _833 = float3(in.in_var_TEXCOORD1, float(_679[_819])); - float4 _843 = atlasTexture.sample(atlasSampler, _833.xy, uint(rint(_833.z))); - if (_843.w < 0.001000000047497451305389404296875) + float3 _829 = float3(in.in_var_TEXCOORD1, float(_675[_815])); + float4 _839 = atlasTexture.sample(atlasSampler, _829.xy, uint(rint(_829.z))); + if (_839.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _858 = _843.xyz; - uint _893 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_805 ? 6 : 0); - uint _909 = uint(UniformBuffer.LightCount); + float3 _854 = _839.xyz; + uint _889 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_801 ? 6 : 0); + uint _905 = uint(UniformBuffer.LightCount); + float3 _922; + float3 _925; + _922 = _673; + _925 = float3(0.0); + float3 _923; float3 _926; - float3 _929; - _926 = _677; - _929 = float3(0.0); - float3 _927; - float3 _930; - for (uint _931 = 0u; _931 < _909; _926 = _927, _929 = _930, _931++) + for (uint _927 = 0u; _927 < _905; _922 = _923, _925 = _926, _927++) { - float _967 = float((lightBuffer._m0[_931].Color & 4278190080u) >> 24u); - float3 _985 = (float3(float(lightBuffer._m0[_931].X), float(lightBuffer._m0[_931].Y), float(lightBuffer._m0[_931].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _989 = length(_985); - bool _1003; - if (!(_989 >= _967)) + float _963 = float((lightBuffer._m0[_927].Color & 4278190080u) >> 24u); + float3 _981 = (float3(float(lightBuffer._m0[_927].X), float(lightBuffer._m0[_927].Y), float(lightBuffer._m0[_927].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _985 = length(_981); + bool _999; + if (!(_985 >= _963)) { - _1003 = _967 <= 0.0; + _999 = _963 <= 0.0; } else { - _1003 = true; + _999 = true; } - if (_1003) + if (_999) { - _927 = _926; - _930 = _929; + _923 = _922; + _926 = _925; continue; } - float _1018 = fast::clamp(dot(_668[_893], _985 / float3(_989)), 0.0, 1.0); - if (_1018 <= 0.0) + float _1014 = fast::clamp(dot(_664[_889], _981 / float3(_985)), 0.0, 1.0); + if (_1014 <= 0.0) { - _927 = _926; - _930 = _929; + _923 = _922; + _926 = _925; continue; } - float3 _1064 = float3(float((lightBuffer._m0[_931].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_931].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_931].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _927 = _1064; - _930 = _929 + ((_1064 * _1018) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_989 / _967, 0.0, 1.0)))); + float3 _1060 = float3(float((lightBuffer._m0[_927].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _923 = _1060; + _926 = _925 + ((_1060 * _1014) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_985 / _963, 0.0, 1.0)))); } - float _1416; + float _1401; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1416 = 0.0; + _1401 = 0.0; break; } - float _1177; - if (blockBuffer._m0[_750].HasOcclusion != 0u) + float _1173; + if (blockBuffer._m0[_746].HasOcclusion != 0u) { - _1177 = fast::clamp(-dot(_668[_893], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1173 = fast::clamp(-dot(_664[_889], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1177 = 0.7070000171661376953125; + _1173 = 0.7070000171661376953125; } - if (_1177 <= 0.0) + if (_1173 <= 0.0) { - _1416 = 0.0; + _1401 = 0.0; break; } - float4 _1196 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1206 = _1196.xyz / float3(_1196.w); - float2 _1216 = (_1206.xy * 0.5) + float2(0.5); - float _1222 = 1.0 - _1216.y; - float2 _1224 = _1216; - _1224.y = _1222; - float _1228 = _1216.x; - bool _1240; - if (!(_1228 < 0.0)) + float4 _1192 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1202 = _1192.xyz / float3(_1192.w); + float2 _1212 = (_1202.xy * 0.5) + float2(0.5); + float _1218 = 1.0 - _1212.y; + float2 _1220 = _1212; + _1220.y = _1218; + float _1224 = _1212.x; + bool _1236; + if (!(_1224 < 0.0)) { - _1240 = _1228 > 1.0; + _1236 = _1224 > 1.0; } else { - _1240 = true; + _1236 = true; } - bool _1250; - if (!_1240) + bool _1246; + if (!_1236) { - _1250 = _1222 < 0.0; + _1246 = _1218 < 0.0; } else { - _1250 = true; + _1246 = true; } - bool _1260; - if (!_1250) + bool _1256; + if (!_1246) { - _1260 = _1222 > 1.0; + _1256 = _1218 > 1.0; } else { - _1260 = true; + _1256 = true; } - bool _1272; - if (!_1260) + bool _1268; + if (!_1256) { - _1272 = _1206.z < 0.0; + _1268 = _1202.z < 0.0; } else { - _1272 = true; + _1268 = true; } - bool _1284; - if (!_1272) + bool _1280; + if (!_1268) { - _1284 = _1206.z > 1.0; + _1280 = _1202.z > 1.0; } else { - _1284 = true; + _1280 = true; } - if (_1284) + if (_1280) { - _1416 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1177; + _1401 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173; break; } - uint2 _1295 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1311 = float2(1.0) / float2(float(_1295.x), float(_1295.y)); - float _1320 = (abs(_668[_893].y) < 0.5) ? 2.0 : 1.0; - float _1328 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1177)); - float _1337; - int _1340; - _1337 = 0.0; - _1340 = -1; - float _1338; - for (; _1340 <= 1; _1337 = _1338, _1340++) + uint2 _1291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1307 = float2(1.0) / float2(float(_1291.x), float(_1291.y)); + float _1315 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1173)); + float _1324; + int _1327; + _1324 = 0.0; + _1327 = -1; + float _1325; + for (; _1327 <= 1; _1324 = _1325, _1327++) { - _1338 = _1337; - for (int _1356 = -1; _1356 <= 1; ) + _1325 = _1324; + for (int _1343 = -1; _1343 <= 1; ) { - _1338 += shadowTexture.sample_compare(shadowSampler, (_1224 + ((float2(float(_1340), float(_1356)) * _1311) * _1320)), _1206.z - _1328, level(0.0)); - _1356++; + _1325 += shadowTexture.sample_compare(shadowSampler, (_1220 + (float2(float(_1327), float(_1343)) * _1307)), _1202.z - _1315, level(0.0)); + _1343++; continue; } } - _1416 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1177) * mix(1.0, _1337 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1401 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173) * mix(1.0, _1324 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1442; - if (blockBuffer._m0[_750].IsFullbright != 0u) + float3 _1427; + if (blockBuffer._m0[_746].IsFullbright != 0u) { - _1442 = _858; + _1427 = _854; } else { - _1442 = _858 * (((_929 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1416)); + _1427 = _854 * (((_925 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1401)); } - float3 _1449 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_1442, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1449.y, length(float2(_1449.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _1434 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_1427, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1434.y, length(float2(_1434.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index 070526ee6afde22e5d8bb890bb497f08b1e44cae..ab247811989395f4ea35afb16cf133e5ac51310e 100644 GIT binary patch literal 53928 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 H_ZR&id7xFL literal 54464 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 delta 476 zcmdn8gz?N0#tqw87OH!>7LLQ05{>jNXrNx=~ zdDfFJu!>6{5@%vH-Zc^S9-=40H9 zESpd8Uu2p*OUQroE1_46AQcPwC3&0@i&GVB6%6zY(yT!Olf^~(Caa0cv4QQVp8P;m z48pA4oF&S^G`Uz@bMjnqt;r|EO>MzS(sJ?>OBB*Fb4pT+f)Z0QON)WVB_YAVq5(UrV;DVyel2mIXF^|Mz|K#MH(&Ehg zJY;dtVz<(qoTQ@6^o$Y|@w}AG$0IYB}RsIo~yi36gtns@RliLlB1lG0FtTHeV9k`h2Q9+GxI zvP}|X@@`27m_PnWs*1xyuqd^pv?xy@IX@@A2xz#u)Fc*=+~m_z(m-9$q|AY&th5=B a43<_CfP@5>aw;&m(s;QTHn&OdlLY{A>2r4g delta 474 zcmZ2ebfjp*G8V?2lb5r+)Zwb;QUHR|%)Al>&*I>MqRf(1YlM(TVzGa6a!zS+W`3Ua z&b?!qMO;-LRgu&swc;D8!~g%a!sDbEx&miHzUjD z9sC!WCU*(>Z@wk;iV>t@BEKY$Q(|$df~|sqoAg& zwVR_vIhZCVi)&8q71x@)L)_FBtRyWbKe0q1Ei+Gr2qt_nRz7&p2fihMVTe3*1VG!vWiQh$hei} z;?`Q;$vTn} zKxr3AJ0RI43DUe>(gEhSUy`cga4#37mXsFdDJ19TA}}msS&i_?b&NH7_MIjhBmIbCWcaIRM-mV=Mpw delta 517 zcmaE}gt28Q#}xEWbCZ{felG`UU4fAck=SBxM7 z{Q1Qv-xlEm(E$qC!5N7u`Q-|>3I=*6X%H7=rYUF?m*#oqm89kYO|4Y00m&MqX@Y%I z4JJWeElMpZEy`2Kc1kRU`m}a)m?#I+4-V&LQl64G*D=~^&ZmRX#cl$ir^zP_!3CD=3>NxR9>lBSa diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index 5ffc1b6be1bc3fdd482a3b2728befffc6008660d..1dc4bb6ab9fda6410111919a3fda0a6e534a1138 100644 GIT binary patch delta 477 zcmdne!8oUbal&*I>MqRf(1Ya}s`#A5&C^4dnmJ1nWY>8~2biaXq*TS>fmf7TQd*R!ker{BUj%fyx6~vSklf_^Qqn+O zzog88q@lDKkW80W6MzH@mvSmF?9zC-7&gz6{>G_zih+San}LO4F_3lw;?qccS0MY` dq5(UrV;DVyel2mJikVj&%e{yn8X>n$L z9+I$Uv0G_QPEt{3dPWJda9&Dga%yq3S*$fzt@Y$uc8Se$Y=NvyT-B3{xeb}QYPlw_ z;+Efhikp#T^BMk&Oq1sc`EPzF^okLr;*N+a5KB&$7Ui3)B`U`Tc0~2$08udrvvzZy zCf)_dkbQpgOjUWob4a3IK=#?qCsn(d M7%yxN)i^E<09dP*e*gdg diff --git a/shaders/bin/sky.vert.spv b/shaders/bin/sky.vert.spv index 28f9edc105839f49714eda6adec7de5cc202d2e3..6fb92b3bb99ca72a639919174dd1d59c973ed7e2 100644 GIT binary patch delta 412 zcmcane4u#4G8V?olb5r+jOFF3=H*fVg3`>q5(UrV;DVyel2mIXF^|Mz|K#MH(&Ehg zJY;dtVz<(qoTQ@6^o$Y|@w}AG$0IYB}RsIo~yi36gtns@RliLlB1lG0FtTHeV9k`h2Q9+GxI zvP}|X@@`27m_PnWs*1xyuqd^pv?xy@IX@@A2xz#u)Fc*=+~m_z(m-9$q|AY&th5=B a43<_CfP@5>aw;&m(s;QTHn&L!$pHYgeseYe delta 474 zcmX?5e4}{7G8V?2lb5r+)Zwb;QUHR|%)Al>&*I>MqRf(1YlM(TVzGa6a!zS+W`3Ua z&b?!qMO;-LRgu&swc;D8!~g%a!sDbEx&miHzUjD z9sC!WCU*(>Z@wk;iV>t@BEKY$Q(|$df~|sqoAg& zwVR_vIhZCVi)&8q71x@)L)_FBtRyWbKe0q1Ei _671 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _667 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -113,168 +113,167 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _760 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _786 = spvUnsafeArray({ blockBuffer._m0[_760].Indices[0], blockBuffer._m0[_760].Indices[1], blockBuffer._m0[_760].Indices[2], blockBuffer._m0[_760].Indices[3], blockBuffer._m0[_760].Indices[4], blockBuffer._m0[_760].Indices[5] }); - uint _830 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _834 = blockBuffer._m0[_760].IsSprite != 0u; - uint _839 = _830 + uint(_834 ? 6 : 0); - spvUnsafeArray _685 = _786; - uint _857 = _834 ? 0u : _830; - float3 _871 = float3(in.in_var_TEXCOORD1, float(_685[_857])); - float4 _881 = atlasTexture.sample(atlasSampler, _871.xy, uint(rint(_871.z))); - float _889 = _881.w; - uint _901 = uint(UniformBuffer.LightCount); + uint _756 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_756].Indices[0], blockBuffer._m0[_756].Indices[1], blockBuffer._m0[_756].Indices[2], blockBuffer._m0[_756].Indices[3], blockBuffer._m0[_756].Indices[4], blockBuffer._m0[_756].Indices[5] }); + uint _826 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _830 = blockBuffer._m0[_756].IsSprite != 0u; + uint _835 = _826 + uint(_830 ? 6 : 0); + spvUnsafeArray _681 = _782; + uint _853 = _830 ? 0u : _826; + float3 _867 = float3(in.in_var_TEXCOORD1, float(_681[_853])); + float4 _877 = atlasTexture.sample(atlasSampler, _867.xy, uint(rint(_867.z))); + float _885 = _877.w; + uint _897 = uint(UniformBuffer.LightCount); + float3 _914; + float3 _917; + _914 = _678; + _917 = float3(0.0); + float3 _915; float3 _918; - float3 _921; - _918 = _682; - _921 = float3(0.0); - float3 _919; - float3 _922; - for (uint _923 = 0u; _923 < _901; _918 = _919, _921 = _922, _923++) + for (uint _919 = 0u; _919 < _897; _914 = _915, _917 = _918, _919++) { - float _959 = float((lightBuffer._m0[_923].Color & 4278190080u) >> 24u); - float3 _977 = (float3(float(lightBuffer._m0[_923].X), float(lightBuffer._m0[_923].Y), float(lightBuffer._m0[_923].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _981 = length(_977); - bool _995; - if (!(_981 >= _959)) + float _955 = float((lightBuffer._m0[_919].Color & 4278190080u) >> 24u); + float3 _973 = (float3(float(lightBuffer._m0[_919].X), float(lightBuffer._m0[_919].Y), float(lightBuffer._m0[_919].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _977 = length(_973); + bool _991; + if (!(_977 >= _955)) { - _995 = _959 <= 0.0; + _991 = _955 <= 0.0; } else { - _995 = true; + _991 = true; } - if (_995) + if (_991) { - _919 = _918; - _922 = _921; + _915 = _914; + _918 = _917; continue; } - float _1010 = fast::clamp(dot(_671[_839], _977 / float3(_981)), 0.0, 1.0); - if (_1010 <= 0.0) + float _1006 = fast::clamp(dot(_667[_835], _973 / float3(_977)), 0.0, 1.0); + if (_1006 <= 0.0) { - _919 = _918; - _922 = _921; + _915 = _914; + _918 = _917; continue; } - float3 _1056 = float3(float((lightBuffer._m0[_923].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_923].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_923].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _919 = _1056; - _922 = _921 + ((_1056 * _1010) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_981 / _959, 0.0, 1.0)))); + float3 _1052 = float3(float((lightBuffer._m0[_919].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _915 = _1052; + _918 = _917 + ((_1052 * _1006) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_977 / _955, 0.0, 1.0)))); } - float _1408; + float _1393; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1408 = 0.0; + _1393 = 0.0; break; } - float _1169; - if (blockBuffer._m0[_760].HasOcclusion != 0u) + float _1165; + if (blockBuffer._m0[_756].HasOcclusion != 0u) { - _1169 = fast::clamp(-dot(_671[_839], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1165 = fast::clamp(-dot(_667[_835], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1169 = 0.7070000171661376953125; + _1165 = 0.7070000171661376953125; } - if (_1169 <= 0.0) + if (_1165 <= 0.0) { - _1408 = 0.0; + _1393 = 0.0; break; } - float4 _1188 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1198 = _1188.xyz / float3(_1188.w); - float2 _1208 = (_1198.xy * 0.5) + float2(0.5); - float _1214 = 1.0 - _1208.y; - float2 _1216 = _1208; - _1216.y = _1214; - float _1220 = _1208.x; - bool _1232; - if (!(_1220 < 0.0)) + float4 _1184 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1194 = _1184.xyz / float3(_1184.w); + float2 _1204 = (_1194.xy * 0.5) + float2(0.5); + float _1210 = 1.0 - _1204.y; + float2 _1212 = _1204; + _1212.y = _1210; + float _1216 = _1204.x; + bool _1228; + if (!(_1216 < 0.0)) { - _1232 = _1220 > 1.0; + _1228 = _1216 > 1.0; } else { - _1232 = true; + _1228 = true; } - bool _1242; - if (!_1232) + bool _1238; + if (!_1228) { - _1242 = _1214 < 0.0; + _1238 = _1210 < 0.0; } else { - _1242 = true; + _1238 = true; } - bool _1252; - if (!_1242) + bool _1248; + if (!_1238) { - _1252 = _1214 > 1.0; + _1248 = _1210 > 1.0; } else { - _1252 = true; + _1248 = true; } - bool _1264; - if (!_1252) + bool _1260; + if (!_1248) { - _1264 = _1198.z < 0.0; + _1260 = _1194.z < 0.0; } else { - _1264 = true; + _1260 = true; } - bool _1276; - if (!_1264) + bool _1272; + if (!_1260) { - _1276 = _1198.z > 1.0; + _1272 = _1194.z > 1.0; } else { - _1276 = true; + _1272 = true; } - if (_1276) + if (_1272) { - _1408 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1169; + _1393 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165; break; } - uint2 _1287 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1303 = float2(1.0) / float2(float(_1287.x), float(_1287.y)); - float _1312 = (abs(_671[_839].y) < 0.5) ? 2.0 : 1.0; - float _1320 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1169)); - float _1329; - int _1332; - _1329 = 0.0; - _1332 = -1; - float _1330; - for (; _1332 <= 1; _1329 = _1330, _1332++) + uint2 _1283 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1299 = float2(1.0) / float2(float(_1283.x), float(_1283.y)); + float _1307 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1165)); + float _1316; + int _1319; + _1316 = 0.0; + _1319 = -1; + float _1317; + for (; _1319 <= 1; _1316 = _1317, _1319++) { - _1330 = _1329; - for (int _1348 = -1; _1348 <= 1; ) + _1317 = _1316; + for (int _1335 = -1; _1335 <= 1; ) { - _1330 += shadowTexture.sample_compare(shadowSampler, (_1216 + ((float2(float(_1332), float(_1348)) * _1303) * _1312)), _1198.z - _1320, level(0.0)); - _1348++; + _1317 += shadowTexture.sample_compare(shadowSampler, (_1212 + (float2(float(_1319), float(_1335)) * _1299)), _1194.z - _1307, level(0.0)); + _1335++; continue; } } - _1408 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1169) * mix(1.0, _1329 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1393 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165) * mix(1.0, _1316 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1416 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - spvUnsafeArray _684 = _786; - float _1517; - if (_684[_857] == 16u) + float3 _1401 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + spvUnsafeArray _680 = _782; + float _1502; + if (_680[_853] == 16u) { - float4 _1497 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); - _1517 = _889 + ((in.in_var_TEXCOORD0.y - _1497.y) * 0.100000001490116119384765625); + float4 _1482 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); + _1502 = _885 + ((in.in_var_TEXCOORD0.y - _1482.y) * 0.100000001490116119384765625); } else { - _1517 = _889; + _1502 = _885; } - out.out_var_SV_Target0 = float4(mix(_881.xyz * (((_921 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1408)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1416.y, length(float2(_1416.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1517); + out.out_var_SV_Target0 = float4(mix(_877.xyz * (((_917 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1393)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1401.y, length(float2(_1401.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1502); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index f0178d8cca6f1ad71eba59b29f53e8410887876d..a971bcf8d441f4a674f44e6b886d575d30bcdc8e 100644 GIT binary patch literal 54148 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 literal 54684 zcmch=2b`7F@&A8;1rrbvDZYSu`6Q1 z5))G_F$tK&7LC!EVvHu5#HcC8#2(A<^M1~md*>eZZv4Jp|JVP9;W;zsGjrz5>F0Sc z-Ma3!K`z%Nm&)TTg{Wi;W%_KaBitm}*FgJbL%-M%dI&yYXbJOhB!lJsSwuZU0 z8=C5ymA`SWM}|Lm%JeCQjLnX7*MLlbiN?xG$dIV_KIxlM%t1HXZ|jr1J1-=L#f3oWgK zPO7VGY8|w=rTL`7+_u(1a~hlHE^HmtnibzVsI5i0i|bknO>MRHEp_uVeX9Qj^=oSf zwYJP1w4`}ip|Q51X|D92Rc&**-5Tnf<`wGmGp8OiVan{uhmY&Io7je?f|C?QW2eqO zX!4Bd`JqM0_{m337&l|`)Wbu@uwuqRQ>KnPGzdo&g~z0VSwXN*5pisaI4TH+6cIC1 zLCJ-w6DLleFe6_*xPK8H+^~%Gpab$H5j86*s;Z_{W@A9URI?KLm?F5OHy|IwRf5eb z!iow5@*yZC(6L2O5k4Rv0#yPXRRk5`1M(qwCD6zVe)VnxN_(*Wgf(MltX5fL1Hw@A;*?MVl2ubN0mWh zB+4N(%OIh%^$(DqyA_(|HPrXi*s03((%5NlXlm0#e4kuzJ-^^s3}d=>L1Swpx({{V zM7lN(r%xI?e!`KnCuwTxUF^kW!rnax4azTQYg^p9-=IPB8`>7M f;yl7Bk!<^Q6 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 C@jl$ltp3H2z@nV>Kz%Ph`J%FM|usZ`Ln zRj`COBSz8=Xyzful delta 449 zcmbQTm~qWw#tpkz7OH!>7LLQ05{>jNXrNx=~ zc}T*Z#criJIY~vC=@})+!g(o~$*INBX0g^>wbqks*(Em1u?4a+aaB()<~C&Js^yxz zid%m3DQ-rV&1d*8GEJT*L?Uv zB&Ot-2jmxLmH texture, SamplerComparisonState state, float4 uint height; texture.GetDimensions(width, height); float2 texelSize = 1.0f / float2(width, height); - float filterRadius = abs(normal.y) < 0.5f ? 2.0f : 1.0f; float bias = 0.0003f + 0.001f * (1.0f - ratio); float visibility = 0.0f; for (int x = -1; x <= 1; x++) for (int y = -1; y <= 1; y++) { - visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize * filterRadius, shadowPosition.z - bias); + visibility += texture.SampleCmpLevelZero(state, uv + float2(x, y) * texelSize, shadowPosition.z - bias); } visibility /= 9.0f; float shadowFade = smoothstep(0.05f, 0.2f, sunIntensity); diff --git a/src/main.c b/src/main.c index 0ff1f2b6..68d51c9c 100644 --- a/src/main.c +++ b/src/main.c @@ -308,7 +308,7 @@ static bool CreateShadowPipeline() info.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_BACK; info.rasterizer_state.front_face = SDL_GPU_FRONTFACE_CLOCKWISE; info.rasterizer_state.depth_bias_constant_factor = 1.0f; - info.rasterizer_state.depth_bias_slope_factor = 1.0f; + info.rasterizer_state.depth_bias_slope_factor = 2.0f; info.rasterizer_state.enable_depth_bias = true; if (info.vertex_shader && info.fragment_shader) { @@ -905,6 +905,10 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) { Player_ToggleController(&player); } + else if (event->key.scancode == SDL_SCANCODE_T) + { + Sky_Reset(&sky); + } else if (event->key.scancode == SDL_SCANCODE_F11) { if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) diff --git a/src/sky.c b/src/sky.c index abbfda76..3ef685f5 100644 --- a/src/sky.c +++ b/src/sky.c @@ -104,6 +104,13 @@ void Sky_Load(Sky* sky) UpdateRender(sky); } +void Sky_Reset(Sky* sky) +{ + sky->time_of_day = 3.0f / 8.0f; + sky->shadow_frame = 0; + UpdateRender(sky); +} + void Sky_Update(Sky* sky, float dt) { float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; diff --git a/src/sky.h b/src/sky.h index dd037e46..0745c936 100644 --- a/src/sky.h +++ b/src/sky.h @@ -24,6 +24,7 @@ typedef struct Sky Sky; void Sky_Load(Sky* sky); +void Sky_Reset(Sky* sky); void Sky_Save(const Sky* sky); void Sky_Update(Sky* sky, float dt); void Sky_UpdateShadow(Sky* sky, const Camera* camera, int resolution); From f79882f2dbb7fea3e33fdc6aefc0fb44726b36cc Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 11:26:21 -0400 Subject: [PATCH 18/39] refactor --- src/camera.h | 11 ++----- src/main.c | 21 ++++--------- src/player.c | 51 +++++++++++-------------------- src/player.h | 4 +-- src/save.c | 12 ++++---- src/save.h | 4 +-- src/sky.c | 56 ++++++++++++++--------------------- src/world.c | 84 ++++++++++------------------------------------------ 8 files changed, 73 insertions(+), 170 deletions(-) diff --git a/src/camera.h b/src/camera.h index c8586ed2..45ef444e 100644 --- a/src/camera.h +++ b/src/camera.h @@ -28,15 +28,8 @@ typedef struct Camera }; float pitch; float yaw; - union - { - struct - { - Sint32 width; - Sint32 height; - }; - Sint32 size[2]; - }; + Sint32 width; + Sint32 height; float fov; float near; float far; diff --git a/src/main.c b/src/main.c index 68d51c9c..8cac1046 100644 --- a/src/main.c +++ b/src/main.c @@ -11,11 +11,10 @@ #include "world.h" static const char* SAVE_PATH = "blocks.sqlite3"; -static const int PLAYER_ID = 0; static const float ATLAS_WIDTH = 512.0f; static const int ATLAS_MIP_LEVELS = 4; static const float BLOCK_WIDTH = 16.0f; -static const int SHADOW_RESOLUTION = 2048.0f; +static const int SHADOW_RESOLUTION = 2048; static const SDL_GPUSampleCount SAMPLE_COUNT = SDL_GPU_SAMPLECOUNT_4; static SDL_Window* window; @@ -544,7 +543,7 @@ SDL_AppResult SDLCALL SDL_AppInit(void** appstate, int argc, char** argv) Save_Init(SAVE_PATH); Sky_Load(&sky); World_Init(device); - Player_Load(&player, PLAYER_ID); + Player_Load(&player); World_Update(&player.camera); ticks2 = SDL_GetTicks(); ticks1 = ticks2; @@ -555,7 +554,7 @@ void SDLCALL SDL_AppQuit(void* appstate, SDL_AppResult result) { SDL_HideWindow(window); World_Free(); - Player_Save(&player, PLAYER_ID); + Player_Save(&player); Sky_Save(&sky); Save_Free(); SDL_ReleaseGPUSampler(device, nearest_sampler); @@ -875,7 +874,6 @@ SDL_AppResult SDLCALL SDL_AppIterate(void* appstate) if (SDL_GetWindowRelativeMouseMode(window)) { Player_Move(&player, dt); - Player_Save(&player, PLAYER_ID); } Sky_UpdateShadow(&sky, &player.camera, SHADOW_RESOLUTION); World_Update(&player.camera); @@ -911,16 +909,9 @@ SDL_AppResult SDLCALL SDL_AppEvent(void* appstate, SDL_Event* event) } else if (event->key.scancode == SDL_SCANCODE_F11) { - if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) - { - SDL_SetWindowFullscreen(window, false); - SDL_SetWindowRelativeMouseMode(window, false); - } - else - { - SDL_SetWindowFullscreen(window, true); - SDL_SetWindowRelativeMouseMode(window, true); - } + bool fullscreen = !(SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN); + SDL_SetWindowFullscreen(window, fullscreen); + SDL_SetWindowRelativeMouseMode(window, fullscreen); } break; case SDL_EVENT_MOUSE_BUTTON_DOWN: diff --git a/src/player.c b/src/player.c index eb915a96..1bb6b4e6 100644 --- a/src/player.c +++ b/src/player.c @@ -36,37 +36,24 @@ static const float FLY_SPEED = 0.01f; static const float FLY_FAST_SPEED = 0.1f; static const float COLLISION_STEP = 0.1f; static const float GROUND_OFFSET = 0.002f; -static const float COLLISION_RADIUS = 0.3f; -static const float COLLISION_HEIGHT = 1.8f; -static const float EYE_OFFSET = 1.62f; -static AABB GetAABB() -{ - return (AABB) {{-COLLISION_RADIUS, -EYE_OFFSET, -COLLISION_RADIUS}, - {COLLISION_RADIUS, COLLISION_HEIGHT - EYE_OFFSET, COLLISION_RADIUS}}; -} - -static bool IsSolid(const float position[3]) -{ - int index[3] = {position[0], position[1], position[2]}; - return Block_IsSolid(World_GetBlock(index)); -} +static const AABB PLAYER_AABB = {{-0.3f, -1.62f, -0.3f}, {0.3f, 1.8f - 1.62f, 0.3f}}; -static bool IsColliding(const AABB *aabb, const float position[3]) +static bool IsColliding(const float position[3]) { int min[3]; int max[3]; for (int i = 0; i < 3; i++) { - min[i] = SDL_floorf(position[i] + aabb->min[i] + PHYSICS_EPSILON); - max[i] = SDL_floorf(position[i] + aabb->max[i] - PHYSICS_EPSILON); + min[i] = SDL_floorf(position[i] + PLAYER_AABB.min[i] + PHYSICS_EPSILON); + max[i] = SDL_floorf(position[i] + PLAYER_AABB.max[i] - PHYSICS_EPSILON); } for (int bx = min[0]; bx <= max[0]; bx++) for (int by = min[1]; by <= max[1]; by++) for (int bz = min[2]; bz <= max[2]; bz++) { - float location[3] = {bx, by, bz}; - if (IsSolid(location)) + int position[3] = {bx, by, bz}; + if (Block_IsSolid(World_GetBlock(position))) { return true; } @@ -74,7 +61,7 @@ static bool IsColliding(const AABB *aabb, const float position[3]) return false; } -static void Bisect(const AABB* aabb, float position[3], int axis, float step) +static void Bisect(float position[3], int axis, float step) { float start[3] = {position[0], position[1], position[2]}; float lower = 0.0f; @@ -84,7 +71,7 @@ static void Bisect(const AABB* aabb, float position[3], int axis, float step) float t = (lower + upper) * 0.5f; float location[3] = {start[0], start[1], start[2]}; location[axis] += step * t; - if (IsColliding(aabb, location)) + if (IsColliding(location)) { upper = t; } @@ -96,7 +83,7 @@ static void Bisect(const AABB* aabb, float position[3], int axis, float step) position[axis] = start[axis] + step * lower; } -static bool Move(const AABB* aabb, float position[3], int axis, float delta) +static bool Move(float position[3], int axis, float delta) { if (SDL_fabsf(delta) <= SDL_FLT_EPSILON) { @@ -109,9 +96,9 @@ static bool Move(const AABB* aabb, float position[3], int axis, float delta) { float location[3] = {position[0], position[1], position[2]}; location[axis] += step; - if (IsColliding(aabb, location)) + if (IsColliding(location)) { - Bisect(aabb, position, axis, step); + Bisect(position, axis, step); return true; } SDL_memcpy(position, location, 12); @@ -119,7 +106,7 @@ static bool Move(const AABB* aabb, float position[3], int axis, float delta) return false; } -void Player_Load(Player* player, int id) +void Player_Load(Player* player) { PlayerSave data; Camera_Init(&player->camera, CAMERA_TYPE_PERSPECTIVE); @@ -128,7 +115,7 @@ void Player_Load(Player* player, int id) player->camera.z = 0.0f; player->controller = PLAYER_CONTROLLER_WALK; player->block = BLOCK_YELLOW_TORCH; - if (Save_GetPlayer(id, &data, sizeof(data))) + if (Save_GetPlayer(&data, sizeof(data))) { player->block = data.block; player->camera.x = data.x; @@ -140,7 +127,7 @@ void Player_Load(Player* player, int id) player->query = World_Raycast(&player->camera, REACH); } -void Player_Save(const Player* player, int id) +void Player_Save(const Player* player) { PlayerSave data; data.x = player->camera.x; @@ -149,7 +136,7 @@ void Player_Save(const Player* player, int id) data.pitch = player->camera.pitch; data.yaw = player->camera.yaw; data.block = player->block; - Save_SetPlayer(id, &data, sizeof(data)); + Save_SetPlayer(&data, sizeof(data)); } void Player_ToggleController(Player* player) @@ -169,7 +156,6 @@ void Player_Move(Player* player, float dt) const bool* keys = SDL_GetKeyboardState(NULL); if (player->controller == PLAYER_CONTROLLER_WALK) { - const AABB aabb = GetAABB(); dt = SDL_min(dt * 0.001f, 0.05f); float input_x = keys[SDL_SCANCODE_D] - keys[SDL_SCANCODE_A]; float input_z = keys[SDL_SCANCODE_W] - keys[SDL_SCANCODE_S]; @@ -208,7 +194,7 @@ void Player_Move(Player* player, float dt) bool hits[3]; for (int i = 0; i < 3; i++) { - hits[i] = Move(&aabb, player->camera.position, i, player->velocity[i] * dt); + hits[i] = Move(player->camera.position, i, player->velocity[i] * dt); } if (hits[0]) { @@ -253,11 +239,10 @@ void Player_PlaceBlock(const Player* player) World_SetBlock(player->query.previous, player->block); return; } - const AABB aabb = GetAABB(); for (int i = 0; i < 3; i++) { - float min = player->camera.position[i] + aabb.min[i] + PHYSICS_EPSILON; - float max = player->camera.position[i] + aabb.max[i] - PHYSICS_EPSILON; + float min = player->camera.position[i] + PLAYER_AABB.min[i] + PHYSICS_EPSILON; + float max = player->camera.position[i] + PLAYER_AABB.max[i] - PHYSICS_EPSILON; if (max <= player->query.previous[i] || min >= player->query.previous[i] + 1.0f) { World_SetBlock(player->query.previous, player->block); diff --git a/src/player.h b/src/player.h index 93bed987..543b30e9 100644 --- a/src/player.h +++ b/src/player.h @@ -25,8 +25,8 @@ typedef struct Player } Player; -void Player_Load(Player* player, int id); -void Player_Save(const Player* player, int id); +void Player_Load(Player* player); +void Player_Save(const Player* player); void Player_ToggleController(Player* player); void Player_Rotate(Player* player, float pitch, float yaw); void Player_Move(Player* player, float dt); diff --git a/src/save.c b/src/save.c index 7c87c0de..f2830811 100644 --- a/src/save.c +++ b/src/save.c @@ -23,8 +23,8 @@ static const char* SKY_TABLE = " id INTEGER PRIMARY KEY NOT NULL," " time_of_day REAL NOT NULL" ");"; -static const char* SET_PLAYER = "INSERT OR REPLACE INTO players (id, data) VALUES (?, ?);"; -static const char* GET_PLAYER = "SELECT data FROM players WHERE id = ?;"; +static const char* SET_PLAYER = "INSERT OR REPLACE INTO players (id, data) VALUES (0, ?);"; +static const char* GET_PLAYER = "SELECT data FROM players WHERE id = 0;"; static const char* SET_SKY = "INSERT OR REPLACE INTO sky (id, time_of_day) VALUES (0, ?);"; static const char* GET_SKY = "SELECT time_of_day FROM sky WHERE id = 0;"; static const char* SET_BLOCK = "INSERT OR REPLACE INTO blocks (cx, cz, bx, by, bz, block) VALUES (?, ?, ?, ?, ?, ?);"; @@ -111,15 +111,14 @@ void Save_Free() mutex = NULL; } -void Save_SetPlayer(int id, const void* data, int size) +void Save_SetPlayer(const void* data, int size) { if (!handle) { return; } SDL_LockMutex(mutex); - sqlite3_bind_int(set_player, 1, id); - sqlite3_bind_blob(set_player, 2, data, size, SQLITE_TRANSIENT); + sqlite3_bind_blob(set_player, 1, data, size, SQLITE_TRANSIENT); if (sqlite3_step(set_player) != SQLITE_DONE) { SDL_Log("Failed to set player: %s", sqlite3_errmsg(handle)); @@ -128,14 +127,13 @@ void Save_SetPlayer(int id, const void* data, int size) SDL_UnlockMutex(mutex); } -bool Save_GetPlayer(int id, void* data, int size) +bool Save_GetPlayer(void* data, int size) { if (!handle) { return false; } SDL_LockMutex(mutex); - sqlite3_bind_int(get_player, 1, id); bool has_player = sqlite3_step(get_player) == SQLITE_ROW; if (has_player) { diff --git a/src/save.h b/src/save.h index 9af901ad..537f6e11 100644 --- a/src/save.h +++ b/src/save.h @@ -8,8 +8,8 @@ typedef void (*SaveSetBlock)(void* userdata, int bx, int by, int bz, Block block bool Save_Init(const char* path); void Save_Free(); -void Save_SetPlayer(int id, const void* data, int size); -bool Save_GetPlayer(int id, void* data, int size); +void Save_SetPlayer(const void* data, int size); +bool Save_GetPlayer(void* data, int size); void Save_SetSky(float time_of_day); bool Save_GetSky(float* time_of_day); void Save_SetBlock(int cx, int cz, int bx, int by, int bz, Block block); diff --git a/src/sky.c b/src/sky.c index 3ef685f5..95d260af 100644 --- a/src/sky.c +++ b/src/sky.c @@ -3,10 +3,10 @@ #include "save.h" #include "sky.h" -static const float SUNRISE_LENGTH = 30.0f; -static const float DAY_LENGTH = 60.0f; -static const float SUNSET_LENGTH = 30.0f; -static const float NIGHT_LENGTH = 60.0f; +static const float TOTAL_LENGTH = 180.0f; +static const float SUNRISE_END = 30.0f / 180.0f; +static const float DAY_END = 90.0f / 180.0f; +static const float SUNSET_END = 120.0f / 180.0f; static const float SPEED = 0.1f; static const float AMBIENT_SCALE = 0.5f; static const float SHADOW_Y = 30.0f; @@ -16,12 +16,10 @@ static const int SHADOW_UPDATE_FRAMES = 300; static const float NIGHT_SKY_TOP[3] = {0.02f, 0.02f, 0.1f}; static const float NIGHT_SKY_HORIZON[3] = {0.05f, 0.05f, 0.2f}; -static const float SUNRISE_SKY_TOP[3] = {0.5f, 0.2f, 0.1f}; -static const float SUNRISE_SKY_HORIZON[3] = {1.0f, 0.5f, 0.2f}; +static const float TWILIGHT_SKY_TOP[3] = {0.5f, 0.2f, 0.1f}; +static const float TWILIGHT_SKY_HORIZON[3] = {1.0f, 0.5f, 0.2f}; static const float DAY_SKY_TOP[3] = {0.5f, 0.7f, 1.0f}; static const float DAY_SKY_HORIZON[3] = {0.8f, 0.9f, 1.0f}; -static const float SUNSET_SKY_TOP[3] = {0.5f, 0.2f, 0.1f}; -static const float SUNSET_SKY_HORIZON[3] = {1.0f, 0.5f, 0.2f}; static const float NIGHT_AMBIENT[3] = {0.05f, 0.05f, 0.1f}; static const float DAY_AMBIENT[3] = {1.0f, 1.0f, 1.0f}; @@ -35,38 +33,34 @@ static void LerpColor(float output[4], const float a[3], const float b[3], float static void UpdateRender(Sky* sky) { - float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; - float sunrise_end = SUNRISE_LENGTH / total_length; - float day_end = sunrise_end + DAY_LENGTH / total_length; - float sunset_end = day_end + SUNSET_LENGTH / total_length; float ambient[4]; float t; - if (sky->time_of_day < sunrise_end) + if (sky->time_of_day < SUNRISE_END) { - t = sky->time_of_day / sunrise_end; - LerpColor(sky->render.top, NIGHT_SKY_TOP, SUNRISE_SKY_TOP, t); - LerpColor(sky->render.horizon, NIGHT_SKY_HORIZON, SUNRISE_SKY_HORIZON, t); + t = sky->time_of_day / SUNRISE_END; + LerpColor(sky->render.top, NIGHT_SKY_TOP, TWILIGHT_SKY_TOP, t); + LerpColor(sky->render.horizon, NIGHT_SKY_HORIZON, TWILIGHT_SKY_HORIZON, t); LerpColor(ambient, NIGHT_AMBIENT, DAY_AMBIENT, t); } - else if (sky->time_of_day < day_end) + else if (sky->time_of_day < DAY_END) { - t = (sky->time_of_day - sunrise_end) / (day_end - sunrise_end); - LerpColor(sky->render.top, SUNRISE_SKY_TOP, DAY_SKY_TOP, t); - LerpColor(sky->render.horizon, SUNRISE_SKY_HORIZON, DAY_SKY_HORIZON, t); + t = (sky->time_of_day - SUNRISE_END) / (DAY_END - SUNRISE_END); + LerpColor(sky->render.top, TWILIGHT_SKY_TOP, DAY_SKY_TOP, t); + LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, DAY_SKY_HORIZON, t); LerpColor(ambient, DAY_AMBIENT, DAY_AMBIENT, t); } - else if (sky->time_of_day < sunset_end) + else if (sky->time_of_day < SUNSET_END) { - t = (sky->time_of_day - day_end) / (sunset_end - day_end); - LerpColor(sky->render.top, DAY_SKY_TOP, SUNSET_SKY_TOP, t); - LerpColor(sky->render.horizon, DAY_SKY_HORIZON, SUNSET_SKY_HORIZON, t); + t = (sky->time_of_day - DAY_END) / (SUNSET_END - DAY_END); + LerpColor(sky->render.top, DAY_SKY_TOP, TWILIGHT_SKY_TOP, t); + LerpColor(sky->render.horizon, DAY_SKY_HORIZON, TWILIGHT_SKY_HORIZON, t); LerpColor(ambient, DAY_AMBIENT, NIGHT_AMBIENT, t); } else { - t = (sky->time_of_day - sunset_end) / (1.0f - sunset_end); - LerpColor(sky->render.top, SUNSET_SKY_TOP, NIGHT_SKY_TOP, t); - LerpColor(sky->render.horizon, SUNSET_SKY_HORIZON, NIGHT_SKY_HORIZON, t); + t = (sky->time_of_day - SUNSET_END) / (1.0f - SUNSET_END); + LerpColor(sky->render.top, TWILIGHT_SKY_TOP, NIGHT_SKY_TOP, t); + LerpColor(sky->render.horizon, TWILIGHT_SKY_HORIZON, NIGHT_SKY_HORIZON, t); LerpColor(ambient, NIGHT_AMBIENT, NIGHT_AMBIENT, t); } float angle = sky->time_of_day * 2.0f * SDL_PI_F; @@ -92,10 +86,7 @@ void Sky_Load(Sky* sky) sky->shadow_camera.ortho = SHADOW_ORTHO; sky->shadow_camera.far = SHADOW_FAR; sky->shadow_frame = 0; - float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; - float sunrise_end = SUNRISE_LENGTH / total_length; - float day_end = sunrise_end + DAY_LENGTH / total_length; - sky->time_of_day = sunrise_end + (day_end - sunrise_end) / 2.0f; + sky->time_of_day = SUNRISE_END + (DAY_END - SUNRISE_END) / 2.0f; float saved_time; if (Save_GetSky(&saved_time) && saved_time >= 0.0f && saved_time < 1.0f) { @@ -113,8 +104,7 @@ void Sky_Reset(Sky* sky) void Sky_Update(Sky* sky, float dt) { - float total_length = SUNRISE_LENGTH + DAY_LENGTH + SUNSET_LENGTH + NIGHT_LENGTH; - sky->time_of_day += dt * SPEED / total_length; + sky->time_of_day += dt * SPEED / TOTAL_LENGTH; sky->time_of_day = SDL_fmodf(sky->time_of_day, 1.0f); UpdateRender(sky); } diff --git a/src/world.c b/src/world.c index 6777612f..e5f40d60 100644 --- a/src/world.c +++ b/src/world.c @@ -152,33 +152,9 @@ static void GetNeighborhood(int cx, int cz, Chunk* neighborhood[3][3]) } } -static MeshType GetMeshForFlags(WorldFlags flags) -{ - if (flags & WORLD_FLAGS_OPAQUE) - { - return MESH_TYPE_OPAQUE; - } - else - { - return MESH_TYPE_TRANSPARENT; - } -} - -static MeshType GetMeshForBlock(Block block) -{ - if (Block_IsOpaque(block)) - { - return MESH_TYPE_OPAQUE; - } - else - { - return MESH_TYPE_TRANSPARENT; - } -} - static Chunk* CreateChunk() { - Chunk* chunk = SDL_malloc(sizeof(Chunk)); + Chunk* chunk = SDL_calloc(1, sizeof(Chunk)); if (!chunk) { SDL_Log("Failed to allocate chunk"); @@ -186,11 +162,6 @@ static Chunk* CreateChunk() SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_REQUESTED); SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_COMPLETED); SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_COMPLETED); - chunk->x = 0; - chunk->z = 0; - chunk->lights = NULL; - chunk->light_size = 0; - chunk->light_capacity = 0; for (int i = 0; i < MESH_TYPE_COUNT; i++) { GPUBuffer_Init(&chunk->gpu_voxels[i], device, SDL_GPU_BUFFERUSAGE_VERTEX); @@ -206,7 +177,6 @@ static void FreeChunk(Chunk* chunk) { GPUBuffer_Free(&chunk->gpu_voxels[i]); } - SDL_memset(chunk->blocks, 0, sizeof(chunk->blocks)); SDL_free(chunk->lights); SDL_free(chunk); } @@ -458,6 +428,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ } continue; } + MeshType mesh = Block_IsOpaque(block) ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; for (int j = 0; j < 6; j++) { int dx = DIRECTIONS[j][0]; @@ -485,7 +456,7 @@ static void GenerateChunkVoxels(Chunk* chunks[3][3], CPUBuffer voxels[MESH_TYPE_ { int vertex = order[k]; Voxel voxel = Voxel_PackCube(block, bx, by, bz, j, vertex, ao[vertex]); - CPUBuffer_Append(&voxels[GetMeshForBlock(block)], &voxel); + CPUBuffer_Append(&voxels[mesh], &voxel); } } } @@ -554,16 +525,6 @@ static void GenerateIndices() CPUBuffer_Free(&indices); } -static void WaitForJobFinish(const Worker* worker) -{ - SDL_LockMutex(worker->mutex); - while (worker->job.type != JOB_TYPE_NONE) - { - SDL_WaitCondition(worker->condition, worker->mutex); - } - SDL_UnlockMutex(worker->mutex); -} - static int WorkerFunction(void* args) { Worker* worker = args; @@ -623,33 +584,8 @@ static bool IsJobRunning(const Worker* worker) return running; } -static SDL_AtomicInt* GetJobState(Chunk* chunk, JobType type) -{ - switch (type) - { - case JOB_TYPE_BLOCKS: - return &chunk->block_state; - case JOB_TYPE_VOXELS: - return &chunk->voxel_state; - case JOB_TYPE_LIGHTS: - return &chunk->light_state; - default: - return NULL; - } -} - static void DispatchJob(Worker* worker, const Job* job) { - if (job->type != JOB_TYPE_QUIT) - { - SDL_assert(!IsJobRunning(worker)); - Chunk* chunk = GetChunk(job->x, job->z); - SDL_SetAtomicInt(GetJobState(chunk, job->type), JOB_STATE_RUNNING); - } - else - { - WaitForJobFinish(worker); - } SDL_LockMutex(worker->mutex); SDL_assert(worker->job.type == JOB_TYPE_NONE); worker->job = *job; @@ -683,6 +619,12 @@ static void StartWorker(Worker* worker) static void StopWorker(Worker* worker) { + SDL_LockMutex(worker->mutex); + while (worker->job.type != JOB_TYPE_NONE) + { + SDL_WaitCondition(worker->condition, worker->mutex); + } + SDL_UnlockMutex(worker->mutex); Job job = {0}; job.type = JOB_TYPE_QUIT; DispatchJob(worker, &job); @@ -847,6 +789,7 @@ static bool TryUpdateBlocks(int x, int z, Worker* worker) return false; } Job job = {JOB_TYPE_BLOCKS, x, z}; + SDL_SetAtomicInt(&chunk->block_state, JOB_STATE_RUNNING); DispatchJob(worker, &job); return true; } @@ -879,10 +822,12 @@ static bool TryUpdateVoxelsOrLights(int x, int z, Worker* worker) if (do_voxel) { job = (Job) {JOB_TYPE_VOXELS, x, z}; + SDL_SetAtomicInt(&chunk->voxel_state, JOB_STATE_RUNNING); } else if (do_light) { job = (Job) {JOB_TYPE_LIGHTS, x, z}; + SDL_SetAtomicInt(&chunk->light_state, JOB_STATE_RUNNING); } else { @@ -923,7 +868,8 @@ void World_Update(const Camera* camera) static void Render(Chunk* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* pass, WorldFlags flags) { - GPUBuffer* gpu_voxels = &chunk->gpu_voxels[GetMeshForFlags(flags)]; + MeshType mesh = flags & WORLD_FLAGS_OPAQUE ? MESH_TYPE_OPAQUE : MESH_TYPE_TRANSPARENT; + GPUBuffer* gpu_voxels = &chunk->gpu_voxels[mesh]; if (gpu_voxels->size == 0) { return; @@ -949,7 +895,7 @@ static void Render(Chunk* chunk, SDL_GPUCommandBuffer* cbuf, SDL_GPURenderPass* SDL_PushGPUFragmentUniformData(cbuf, 0, &light_count, 4); SDL_BindGPUFragmentStorageBuffers(pass, 1, &light_binding, 1); } - SDL_PushGPUVertexUniformData(cbuf, 2, chunk->position, 12); + SDL_PushGPUVertexUniformData(cbuf, 2, chunk->position, 8); SDL_BindGPUVertexBuffers(pass, 0, &voxel_binding, 1); SDL_BindGPUIndexBuffer(pass, &index_binding, SDL_GPU_INDEXELEMENTSIZE_32BIT); SDL_DrawGPUIndexedPrimitives(pass, gpu_voxels->size * 1.5, 1, 0, 0, 0); From 150e9e8acfaeabb6c6698ee1aba11e89948d0fac Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 11:35:37 -0400 Subject: [PATCH 19/39] fix water double perspective divide bug --- shaders/bin/transparent.frag.msl | 2 +- shaders/bin/transparent.frag.spv | Bin 54148 -> 54172 bytes shaders/bin/transparent.vert.spv | Bin 20884 -> 20908 bytes shaders/transparent.frag | 3 +-- shaders/transparent.vert | 2 +- 5 files changed, 3 insertions(+), 4 deletions(-) diff --git a/shaders/bin/transparent.frag.msl b/shaders/bin/transparent.frag.msl index 60fb738f..ec40828a 100644 --- a/shaders/bin/transparent.frag.msl +++ b/shaders/bin/transparent.frag.msl @@ -107,7 +107,7 @@ struct main0_in float4 in_var_TEXCOORD0 [[user(locn0)]]; float2 in_var_TEXCOORD1 [[user(locn1)]]; uint in_var_TEXCOORD2 [[user(locn2)]]; - float2 in_var_TEXCOORD3 [[user(locn3)]]; + float2 in_var_TEXCOORD3 [[user(locn3), center_no_perspective]]; }; fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index a971bcf8d441f4a674f44e6b886d575d30bcdc8e..c49ea57ce3a01ad195e93c812247178d924f88bb 100644 GIT binary patch delta 61 zcmV-D0K)%-rvsd)1F-HO0avr{AX@|tZf|g9a&vHHV{~bDWwS{o@dUFxDvk&T0{{mA T000fM#WLG40*V2%qGRH3(mWP! delta 41 zcmV+^0M`GUrvrqi1F-HO0aUZ^AX@~pSS9cT0RXc{Dvt=W;xg7S0^0zyx?|#RViOTm diff --git a/shaders/bin/transparent.vert.spv b/shaders/bin/transparent.vert.spv index bcbb94a670a74e9d5c27ee94e727b3276d414359..d9412aa691f30eb5803e20099b6d6ab849b66689 100644 GIT binary patch delta 60 zcmV-C0K@;3qXDd=0kGB^0VcE88{+{DZf|g9a&vHHV{~bDWwW^*r2?~HAl?H90{{pB S000fMIV5Kg0baAAH1izAi4{%& delta 40 ycmV+@0N4MlqXCqo0kGB^0VA{58{+}9$Q`5t0RXdWAm0PCRwQB&0b8@VH1ix$G7sPY diff --git a/shaders/transparent.frag b/shaders/transparent.frag index 7c9ee96b..9c44e7ab 100644 --- a/shaders/transparent.frag +++ b/shaders/transparent.frag @@ -37,7 +37,7 @@ struct Input float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float2 Fragment : TEXCOORD3; + noperspective float2 Fragment : TEXCOORD3; }; static const uint kWater = 16; @@ -58,7 +58,6 @@ float4 main(Input input) : SV_Target0 float fog = GetFog(distance(position.xz, PlayerPosition.xz)); if (GetIndex(input.Voxel, block) == kWater) { - // TODO: Causes bug where alpha is 0 or 1 as camera approaches water float3 groundPosition = positionTexture.Sample(positionSampler, input.Fragment).xyz; alpha += (input.WorldPosition.y - groundPosition.y) / 10.0f; } diff --git a/shaders/transparent.vert b/shaders/transparent.vert index be897696..01a736b4 100644 --- a/shaders/transparent.vert +++ b/shaders/transparent.vert @@ -26,7 +26,7 @@ struct Output float4 WorldPosition : TEXCOORD0; float2 Texcoord : TEXCOORD1; nointerpolation uint Voxel : TEXCOORD2; - float2 Fragment : TEXCOORD3; + noperspective float2 Fragment : TEXCOORD3; }; Output main(Input input) From e51d236bf04b1dbf3b86b8aeb58049fadc5ac17b Mon Sep 17 00:00:00 2001 From: Jaan Soulier Date: Sat, 18 Jul 2026 11:48:31 -0400 Subject: [PATCH 20/39] refactor --- shaders/bin/depth.vert.spv | Bin 17524 -> 17328 bytes shaders/bin/opaque.frag.msl | 195 +++++++++++++++---------------- shaders/bin/opaque.frag.spv | Bin 53928 -> 52708 bytes shaders/bin/opaque.vert.spv | Bin 21044 -> 20848 bytes shaders/bin/raycast.vert.spv | Bin 14636 -> 14440 bytes shaders/bin/shadow.vert.spv | Bin 21100 -> 20904 bytes shaders/bin/sky.frag.spv | Bin 17436 -> 17240 bytes shaders/bin/sky.vert.spv | Bin 14784 -> 14588 bytes shaders/bin/transparent.frag.msl | 192 +++++++++++++++--------------- shaders/bin/transparent.frag.spv | Bin 54172 -> 52676 bytes shaders/bin/transparent.vert.spv | Bin 20908 -> 20712 bytes shaders/opaque.frag | 2 +- shaders/shader.hlsl | 19 +-- shaders/transparent.frag | 7 +- src/block.c | 2 +- src/buffer.c | 5 +- src/buffer.h | 4 +- src/main.c | 22 ++-- src/save.c | 22 +++- src/shader.c | 187 +++++++++++++++++------------ src/voxel.c | 26 ++--- src/world.c | 76 ++++-------- 22 files changed, 373 insertions(+), 386 deletions(-) diff --git a/shaders/bin/depth.vert.spv b/shaders/bin/depth.vert.spv index 9f33298acc05f900aa73d5e7170f51f91dfa6921..699779cfaabf477bd76a4f4de29f88af45017695 100644 GIT binary patch delta 90 zcmey;!MLHFalAI^-pjAM`89tMBctZ#M8Ww?jMkI6MXpU|7v-BQCThlN qpl6U~Jvmsk7sA^7Tr`w%@+wJLM(fSV;`U5HrZy8-?Pe*dC@lbi@Emdg delta 244 zcmdnc&iJK+al@_!^H>VsR=^y8%$U_2fJ*smXIh z_!xO7uM#n1&j!f>l|2>dg|Ro6i-t0?f%RxlJ|(6AwC$CcJrhDiezKb+pDQm{EiV@@ zS6WVfVu`VWduoYeZc=7yUJ2M@4XAK(eolUoCNEbtFP8!k6s4Aw7Ud~`MXf;wYz~u* G(gFaHD@;)U diff --git a/shaders/bin/opaque.frag.msl b/shaders/bin/opaque.frag.msl index be92196e..349e94b1 100644 --- a/shaders/bin/opaque.frag.msl +++ b/shaders/bin/opaque.frag.msl @@ -93,9 +93,9 @@ struct type_UniformBuffer_3 float4 Ambient; }; -constant float3 _673 = {}; +constant float3 _659 = {}; -constant spvUnsafeArray _664 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _650 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -114,176 +114,167 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]]) { main0_out out = {}; - uint _746 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _772 = spvUnsafeArray({ blockBuffer._m0[_746].Indices[0], blockBuffer._m0[_746].Indices[1], blockBuffer._m0[_746].Indices[2], blockBuffer._m0[_746].Indices[3], blockBuffer._m0[_746].Indices[4], blockBuffer._m0[_746].Indices[5] }); - spvUnsafeArray _675 = _772; - bool _801 = blockBuffer._m0[_746].IsSprite != 0u; - uint _815; - if (_801) + uint _732 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _758 = spvUnsafeArray({ blockBuffer._m0[_732].Indices[0], blockBuffer._m0[_732].Indices[1], blockBuffer._m0[_732].Indices[2], blockBuffer._m0[_732].Indices[3], blockBuffer._m0[_732].Indices[4], blockBuffer._m0[_732].Indices[5] }); + spvUnsafeArray _661 = _758; + bool _787 = blockBuffer._m0[_732].IsSprite != 0u; + uint _801; + if (_787) { - _815 = 0u; + _801 = 0u; } else { - _815 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + _801 = (in.in_var_TEXCOORD2 >> 0u) & 7u; } - float3 _829 = float3(in.in_var_TEXCOORD1, float(_675[_815])); - float4 _839 = atlasTexture.sample(atlasSampler, _829.xy, uint(rint(_829.z))); - if (_839.w < 0.001000000047497451305389404296875) + float3 _815 = float3(in.in_var_TEXCOORD1, float(_661[_801])); + float4 _825 = atlasTexture.sample(atlasSampler, _815.xy, uint(rint(_815.z))); + if (_825.w < 0.001000000047497451305389404296875) { discard_fragment(); } - float3 _854 = _839.xyz; - uint _889 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_801 ? 6 : 0); - uint _905 = uint(UniformBuffer.LightCount); - float3 _922; - float3 _925; - _922 = _673; - _925 = float3(0.0); - float3 _923; - float3 _926; - for (uint _927 = 0u; _927 < _905; _922 = _923, _925 = _926, _927++) + float3 _840 = _825.xyz; + uint _875 = ((in.in_var_TEXCOORD2 >> 0u) & 7u) + uint(_787 ? 6 : 0); + uint _891 = uint(UniformBuffer.LightCount); + float3 _906; + float3 _909; + _906 = _659; + _909 = float3(0.0); + float3 _907; + float3 _910; + for (uint _911 = 0u; _911 < _891; _906 = _907, _909 = _910, _911++) { - float _963 = float((lightBuffer._m0[_927].Color & 4278190080u) >> 24u); - float3 _981 = (float3(float(lightBuffer._m0[_927].X), float(lightBuffer._m0[_927].Y), float(lightBuffer._m0[_927].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _985 = length(_981); - bool _999; - if (!(_985 >= _963)) + float _947 = float((lightBuffer._m0[_911].Color & 4278190080u) >> 24u); + float3 _965 = (float3(float(lightBuffer._m0[_911].X), float(lightBuffer._m0[_911].Y), float(lightBuffer._m0[_911].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _969 = length(_965); + if (_969 >= _947) { - _999 = _963 <= 0.0; - } - else - { - _999 = true; - } - if (_999) - { - _923 = _922; - _926 = _925; + _907 = _906; + _910 = _909; continue; } - float _1014 = fast::clamp(dot(_664[_889], _981 / float3(_985)), 0.0, 1.0); - if (_1014 <= 0.0) + float _988 = fast::clamp(dot(_650[_875], _965 / float3(_969)), 0.0, 1.0); + if (_988 <= 0.0) { - _923 = _922; - _926 = _925; + _907 = _906; + _910 = _909; continue; } - float3 _1060 = float3(float((lightBuffer._m0[_927].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_927].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _923 = _1060; - _926 = _925 + ((_1060 * _1014) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_985 / _963, 0.0, 1.0)))); + float3 _1034 = float3(float((lightBuffer._m0[_911].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_911].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_911].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _907 = _1034; + _910 = _909 + ((_1034 * _988) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_969 / _947, 0.0, 1.0)))); } - float _1401; + float _1369; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1401 = 0.0; + _1369 = 0.0; break; } - float _1173; - if (blockBuffer._m0[_746].HasOcclusion != 0u) + float _1141; + if (blockBuffer._m0[_732].HasOcclusion != 0u) { - _1173 = fast::clamp(-dot(_664[_889], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1141 = fast::clamp(-dot(_650[_875], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1173 = 0.7070000171661376953125; + _1141 = 0.7070000171661376953125; } - if (_1173 <= 0.0) + if (_1141 <= 0.0) { - _1401 = 0.0; + _1369 = 0.0; break; } - float4 _1192 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1202 = _1192.xyz / float3(_1192.w); - float2 _1212 = (_1202.xy * 0.5) + float2(0.5); - float _1218 = 1.0 - _1212.y; - float2 _1220 = _1212; - _1220.y = _1218; - float _1224 = _1212.x; - bool _1236; - if (!(_1224 < 0.0)) + float4 _1160 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1170 = _1160.xyz / float3(_1160.w); + float2 _1180 = (_1170.xy * 0.5) + float2(0.5); + float _1186 = 1.0 - _1180.y; + float2 _1188 = _1180; + _1188.y = _1186; + float _1192 = _1180.x; + bool _1204; + if (!(_1192 < 0.0)) { - _1236 = _1224 > 1.0; + _1204 = _1192 > 1.0; } else { - _1236 = true; + _1204 = true; } - bool _1246; - if (!_1236) + bool _1214; + if (!_1204) { - _1246 = _1218 < 0.0; + _1214 = _1186 < 0.0; } else { - _1246 = true; + _1214 = true; } - bool _1256; - if (!_1246) + bool _1224; + if (!_1214) { - _1256 = _1218 > 1.0; + _1224 = _1186 > 1.0; } else { - _1256 = true; + _1224 = true; } - bool _1268; - if (!_1256) + bool _1236; + if (!_1224) { - _1268 = _1202.z < 0.0; + _1236 = _1170.z < 0.0; } else { - _1268 = true; + _1236 = true; } - bool _1280; - if (!_1268) + bool _1248; + if (!_1236) { - _1280 = _1202.z > 1.0; + _1248 = _1170.z > 1.0; } else { - _1280 = true; + _1248 = true; } - if (_1280) + if (_1248) { - _1401 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173; + _1369 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1141; break; } - uint2 _1291 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1307 = float2(1.0) / float2(float(_1291.x), float(_1291.y)); - float _1315 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1173)); - float _1324; - int _1327; - _1324 = 0.0; - _1327 = -1; - float _1325; - for (; _1327 <= 1; _1324 = _1325, _1327++) + uint2 _1259 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1275 = float2(1.0) / float2(float(_1259.x), float(_1259.y)); + float _1283 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1141)); + float _1292; + int _1295; + _1292 = 0.0; + _1295 = -1; + float _1293; + for (; _1295 <= 1; _1292 = _1293, _1295++) { - _1325 = _1324; - for (int _1343 = -1; _1343 <= 1; ) + _1293 = _1292; + for (int _1311 = -1; _1311 <= 1; ) { - _1325 += shadowTexture.sample_compare(shadowSampler, (_1220 + (float2(float(_1327), float(_1343)) * _1307)), _1202.z - _1315, level(0.0)); - _1343++; + _1293 += shadowTexture.sample_compare(shadowSampler, (_1188 + (float2(float(_1295), float(_1311)) * _1275)), _1170.z - _1283, level(0.0)); + _1311++; continue; } } - _1401 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1173) * mix(1.0, _1324 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1369 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1141) * mix(1.0, _1292 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1427; - if (blockBuffer._m0[_746].IsFullbright != 0u) + float3 _1395; + if (blockBuffer._m0[_732].IsFullbright != 0u) { - _1427 = _854; + _1395 = _840; } else { - _1427 = _854 * (((_925 * 1.0) + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1401)); + _1395 = _840 * ((_909 + (UniformBuffer_3.Ambient.xyz * in.in_var_TEXCOORD3)) + float3(_1369)); } - float3 _1434 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - out.out_var_SV_Target0 = float4(mix(_1427, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1434.y, length(float2(_1434.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); + float3 _1402 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + out.out_var_SV_Target0 = float4(mix(_1395, mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1402.y, length(float2(_1402.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), 1.0); out.out_var_SV_Target1 = in.in_var_TEXCOORD0; return out; } diff --git a/shaders/bin/opaque.frag.spv b/shaders/bin/opaque.frag.spv index ab247811989395f4ea35afb16cf133e5ac51310e..751576e5531e336b7b28a804896f773a28c3f04d 100644 GIT binary patch literal 52708 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 literal 53928 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 H_ZR&id7xFL diff --git a/shaders/bin/opaque.vert.spv b/shaders/bin/opaque.vert.spv index cbbff9d40ba94335da6639b1fade10f206fa156e..108e7643a6f9816f2466cb507e779883d3c6e468 100644 GIT binary patch delta 90 zcmdn8gz>{7#tqw87@Ib4XL-*x`7FQg=HL8DjEtI_3kByhF934jh delta 244 zcmeych;hpj#tqw87&mX;&hnmXatoITk56WLMu~#0f}x&4+T{8CCXBqBFY_lcaw*i* zC=?~8WR@0BelF-bIbVQ%bA@0m6SsnvLN-{BHSgqW!q<455{pxT+6{o(ttZ!UNljiO z!pF!vd6$S8dp1Z8sO+mqFO0ppT{M)D4Xj6d@+~n1pl!dz?3oZE@{_|P`CNIqYI(VM zxzcj-6HAO0+*3;&bCWVt^Gd)LYe0pQ^K9kG8V?oo0qe^=bBu?CBoyAnVwOiV5?xLXOK3zpWlR$ck^NXBt|ZUni_?o z#FWg^;>p(qT_?v2uy4)~jAi0h&{D_->#^pYd`$Qnk5giCDp0!tP`mZyJT9rpb42(U zc_*(DF=NjL$pMu;73qbsHY8$t&bN@8jQS?mx-9M zXM@CnN*;>z!q}UOMMD|c!0NRp9}`mm+VV`yo(Ul$9}G0SEVDQ>DKjUtq|%y~tCp9G zmn$tNKe5DE!9BIaF*hkQHLnD0y#`b`IX@@ANRyYVnwLuf2#QimN{jLoz@lISHU~+D GSpWdHR8B4c diff --git a/shaders/bin/sky.frag.spv b/shaders/bin/sky.frag.spv index 1dc4bb6ab9fda6410111919a3fda0a6e534a1138..a74bb11f7a58cfecdde220368c022ca77ac8a4be 100644 GIT binary patch delta 162 zcmbQ!!FZ#MalAI^zR0h;`9FUWBctYI10n0p8w69B7_BGEi(H#5Ey_1p zOVo_jK+hn}dUCpGFNC%Ew`eHiBv+Rb`WUfha@85kI}8CVz= o18FB9K7zz|1+tG%o~bG?cnnF@3&=jY`J`$$6XS`^p&G}f0h38A1poj5 delta 320 zcmcc7#yF>gal$E#mfbDnz4d=YKdcRQf6vi3D}VuP~qhKoctn9Uao3hE(IVcN-ZfZ$^&`|C~6Hd zU~`tF7q{Xm1_lOg1{Q|JK-vk2Pb2YNf$VdWud2uko<$P%0xKGVm!ZjqWW=Z E06KJEDF6Tf diff --git a/shaders/bin/sky.vert.spv b/shaders/bin/sky.vert.spv index 6fb92b3bb99ca72a639919174dd1d59c973ed7e2..35c3ebca7961c2b67a6ca40c843b7405ec66a673 100644 GIT binary patch delta 88 zcmX?5{HJikG8V?B&C6Ndb4}jMuep(qT_?v2uy4)~jAi0h&{D_->#^pYd`$Qnk5giCDp0!tP`mZyJT9rpb42(U zc_*(DF=NjL$pMu;73qbsH _667 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); +constant spvUnsafeArray _653 = spvUnsafeArray({ float3(0.0, 0.0, 1.0), float3(0.0, 0.0, -1.0), float3(1.0, 0.0, 0.0), float3(-1.0, 0.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, -1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0), float3(0.0, 1.0, 0.0) }); struct main0_out { @@ -113,167 +113,157 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_UniformBuffer& UniformBuffer [[buffer(0)]], constant type_UniformBuffer_1& UniformBuffer_1 [[buffer(1)]], constant type_UniformBuffer_2& UniformBuffer_2 [[buffer(2)]], constant type_UniformBuffer_3& UniformBuffer_3 [[buffer(3)]], const device type_StructuredBuffer_Block& blockBuffer [[buffer(4)]], const device type_StructuredBuffer_Light& lightBuffer [[buffer(5)]], texture2d_array atlasTexture [[texture(0)]], depth2d shadowTexture [[texture(1)]], texture2d positionTexture [[texture(2)]], sampler atlasSampler [[sampler(0)]], sampler shadowSampler [[sampler(1)]], sampler positionSampler [[sampler(2)]]) { main0_out out = {}; - uint _756 = (in.in_var_TEXCOORD2 >> 3u) & 31u; - spvUnsafeArray _782 = spvUnsafeArray({ blockBuffer._m0[_756].Indices[0], blockBuffer._m0[_756].Indices[1], blockBuffer._m0[_756].Indices[2], blockBuffer._m0[_756].Indices[3], blockBuffer._m0[_756].Indices[4], blockBuffer._m0[_756].Indices[5] }); - uint _826 = (in.in_var_TEXCOORD2 >> 0u) & 7u; - bool _830 = blockBuffer._m0[_756].IsSprite != 0u; - uint _835 = _826 + uint(_830 ? 6 : 0); - spvUnsafeArray _681 = _782; - uint _853 = _830 ? 0u : _826; - float3 _867 = float3(in.in_var_TEXCOORD1, float(_681[_853])); - float4 _877 = atlasTexture.sample(atlasSampler, _867.xy, uint(rint(_867.z))); - float _885 = _877.w; - uint _897 = uint(UniformBuffer.LightCount); - float3 _914; - float3 _917; - _914 = _678; - _917 = float3(0.0); - float3 _915; - float3 _918; - for (uint _919 = 0u; _919 < _897; _914 = _915, _917 = _918, _919++) + uint _739 = (in.in_var_TEXCOORD2 >> 3u) & 31u; + spvUnsafeArray _765 = spvUnsafeArray({ blockBuffer._m0[_739].Indices[0], blockBuffer._m0[_739].Indices[1], blockBuffer._m0[_739].Indices[2], blockBuffer._m0[_739].Indices[3], blockBuffer._m0[_739].Indices[4], blockBuffer._m0[_739].Indices[5] }); + uint _809 = (in.in_var_TEXCOORD2 >> 0u) & 7u; + bool _813 = blockBuffer._m0[_739].IsSprite != 0u; + uint _818 = _809 + uint(_813 ? 6 : 0); + spvUnsafeArray _666 = _765; + uint _836 = _813 ? 0u : _809; + float3 _852 = float3(in.in_var_TEXCOORD1, float(_666[_836])); + float4 _862 = atlasTexture.sample(atlasSampler, _852.xy, uint(rint(_852.z))); + float _870 = _862.w; + uint _882 = uint(UniformBuffer.LightCount); + float3 _897; + float3 _900; + _897 = _664; + _900 = float3(0.0); + float3 _898; + float3 _901; + for (uint _902 = 0u; _902 < _882; _897 = _898, _900 = _901, _902++) { - float _955 = float((lightBuffer._m0[_919].Color & 4278190080u) >> 24u); - float3 _973 = (float3(float(lightBuffer._m0[_919].X), float(lightBuffer._m0[_919].Y), float(lightBuffer._m0[_919].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; - float _977 = length(_973); - bool _991; - if (!(_977 >= _955)) + float _938 = float((lightBuffer._m0[_902].Color & 4278190080u) >> 24u); + float3 _956 = (float3(float(lightBuffer._m0[_902].X), float(lightBuffer._m0[_902].Y), float(lightBuffer._m0[_902].Z)) + float3(0.5, 0.75, 0.5)) - in.in_var_TEXCOORD0.xyz; + float _960 = length(_956); + if (_960 >= _938) { - _991 = _955 <= 0.0; - } - else - { - _991 = true; - } - if (_991) - { - _915 = _914; - _918 = _917; + _898 = _897; + _901 = _900; continue; } - float _1006 = fast::clamp(dot(_667[_835], _973 / float3(_977)), 0.0, 1.0); - if (_1006 <= 0.0) + float _979 = fast::clamp(dot(_653[_818], _956 / float3(_960)), 0.0, 1.0); + if (_979 <= 0.0) { - _915 = _914; - _918 = _917; + _898 = _897; + _901 = _900; continue; } - float3 _1052 = float3(float((lightBuffer._m0[_919].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_919].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); - _915 = _1052; - _918 = _917 + ((_1052 * _1006) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_977 / _955, 0.0, 1.0)))); + float3 _1025 = float3(float((lightBuffer._m0[_902].Color & 255u) >> 0u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_902].Color & 65280u) >> 8u) * 0.0039215688593685626983642578125, float((lightBuffer._m0[_902].Color & 16711680u) >> 16u) * 0.0039215688593685626983642578125); + _898 = _1025; + _901 = _900 + ((_1025 * _979) * (1.0 - smoothstep(0.0, 1.0, fast::clamp(_960 / _938, 0.0, 1.0)))); } - float _1393; + float _1360; do { if (UniformBuffer_3.Sun.w <= 0.0) { - _1393 = 0.0; + _1360 = 0.0; break; } - float _1165; - if (blockBuffer._m0[_756].HasOcclusion != 0u) + float _1132; + if (blockBuffer._m0[_739].HasOcclusion != 0u) { - _1165 = fast::clamp(-dot(_667[_835], UniformBuffer_3.Sun.xyz), 0.0, 1.0); + _1132 = fast::clamp(-dot(_653[_818], UniformBuffer_3.Sun.xyz), 0.0, 1.0); } else { - _1165 = 0.7070000171661376953125; + _1132 = 0.7070000171661376953125; } - if (_1165 <= 0.0) + if (_1132 <= 0.0) { - _1393 = 0.0; + _1360 = 0.0; break; } - float4 _1184 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); - float3 _1194 = _1184.xyz / float3(_1184.w); - float2 _1204 = (_1194.xy * 0.5) + float2(0.5); - float _1210 = 1.0 - _1204.y; - float2 _1212 = _1204; - _1212.y = _1210; - float _1216 = _1204.x; - bool _1228; - if (!(_1216 < 0.0)) + float4 _1151 = UniformBuffer_1.ShadowTransform * float4(in.in_var_TEXCOORD0.xyz, 1.0); + float3 _1161 = _1151.xyz / float3(_1151.w); + float2 _1171 = (_1161.xy * 0.5) + float2(0.5); + float _1177 = 1.0 - _1171.y; + float2 _1179 = _1171; + _1179.y = _1177; + float _1183 = _1171.x; + bool _1195; + if (!(_1183 < 0.0)) { - _1228 = _1216 > 1.0; + _1195 = _1183 > 1.0; } else { - _1228 = true; + _1195 = true; } - bool _1238; - if (!_1228) + bool _1205; + if (!_1195) { - _1238 = _1210 < 0.0; + _1205 = _1177 < 0.0; } else { - _1238 = true; + _1205 = true; } - bool _1248; - if (!_1238) + bool _1215; + if (!_1205) { - _1248 = _1210 > 1.0; + _1215 = _1177 > 1.0; } else { - _1248 = true; + _1215 = true; } - bool _1260; - if (!_1248) + bool _1227; + if (!_1215) { - _1260 = _1194.z < 0.0; + _1227 = _1161.z < 0.0; } else { - _1260 = true; + _1227 = true; } - bool _1272; - if (!_1260) + bool _1239; + if (!_1227) { - _1272 = _1194.z > 1.0; + _1239 = _1161.z > 1.0; } else { - _1272 = true; + _1239 = true; } - if (_1272) + if (_1239) { - _1393 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165; + _1360 = (0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1132; break; } - uint2 _1283 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); - float2 _1299 = float2(1.0) / float2(float(_1283.x), float(_1283.y)); - float _1307 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1165)); - float _1316; - int _1319; - _1316 = 0.0; - _1319 = -1; - float _1317; - for (; _1319 <= 1; _1316 = _1317, _1319++) + uint2 _1250 = uint2(shadowTexture.get_width(), shadowTexture.get_height()); + float2 _1266 = float2(1.0) / float2(float(_1250.x), float(_1250.y)); + float _1274 = 0.0003000000142492353916168212890625 + (0.001000000047497451305389404296875 * (1.0 - _1132)); + float _1283; + int _1286; + _1283 = 0.0; + _1286 = -1; + float _1284; + for (; _1286 <= 1; _1283 = _1284, _1286++) { - _1317 = _1316; - for (int _1335 = -1; _1335 <= 1; ) + _1284 = _1283; + for (int _1302 = -1; _1302 <= 1; ) { - _1317 += shadowTexture.sample_compare(shadowSampler, (_1212 + (float2(float(_1319), float(_1335)) * _1299)), _1194.z - _1307, level(0.0)); - _1335++; + _1284 += shadowTexture.sample_compare(shadowSampler, (_1179 + (float2(float(_1286), float(_1302)) * _1266)), _1161.z - _1274, level(0.0)); + _1302++; continue; } } - _1393 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1165) * mix(1.0, _1316 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); + _1360 = ((0.4000000059604644775390625 * UniformBuffer_3.Sun.w) * _1132) * mix(1.0, _1283 * 0.111111111938953399658203125, smoothstep(0.0500000007450580596923828125, 0.20000000298023223876953125, UniformBuffer_3.Sun.w)); break; } while(false); - float3 _1401 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; - spvUnsafeArray _680 = _782; - float _1502; - if (_680[_853] == 16u) + float3 _1368 = in.in_var_TEXCOORD0.xyz - UniformBuffer_2.PlayerPosition; + float _1464; + if (_666[_836] == 16u) { - float4 _1482 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); - _1502 = _885 + ((in.in_var_TEXCOORD0.y - _1482.y) * 0.100000001490116119384765625); + float4 _1444 = positionTexture.sample(positionSampler, in.in_var_TEXCOORD3); + _1464 = _870 + ((in.in_var_TEXCOORD0.y - _1444.y) * 0.100000001490116119384765625); } else { - _1502 = _885; + _1464 = _870; } - out.out_var_SV_Target0 = float4(mix(_877.xyz * (((_917 * 1.0) + UniformBuffer_3.Ambient.xyz) + float3(_1393)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1401.y, length(float2(_1401.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1502); + out.out_var_SV_Target0 = float4(mix(_862.xyz * ((_900 + UniformBuffer_3.Ambient.xyz) + float3(_1360)), mix(UniformBuffer_3.SkyHorizon.xyz, UniformBuffer_3.SkyTop.xyz, float3((precise::atan2(_1368.y, length(float2(_1368.xz))) + 1.57079637050628662109375) * 0.3183098733425140380859375)), float3(precise::min(powr(distance(in.in_var_TEXCOORD0.xz, UniformBuffer_2.PlayerPosition.xz) * 0.0040000001899898052215576171875, 2.5), 1.0))), _1464); return out; } diff --git a/shaders/bin/transparent.frag.spv b/shaders/bin/transparent.frag.spv index c49ea57ce3a01ad195e93c812247178d924f88bb..92864534bb0f8aed6908656dc840d06c5aa2888d 100644 GIT binary patch literal 52676 zcmchgcYu|})&H-ufFOvyqgSykvMdV=2qGv|Pz0n&5piMf!pgFXTc{Q+*u~x(tFc6l z#@G^jVr+>eJ+G!~Vv6a;7?T)(-_J91?mhQm@5cB2<9Ea1nRDiQ&YU?jb7r2o7t>|i ze%&*fZ8Dk64w<`q=%LR}nQapZ&mrP_X12@BnlX3rag%2*Zft5?+>%>a)7V4HjPr;l1JQyIz1n)*iM@LfgSL~>XjWimSo0S3OiINTq9#GpAXx#pHZr`FUo zwhUU;+;nPgX=}@%B@InWSF{XjNt$mN)Y`1tRW;4I#@5QZ=9*=Re$UUYUs*Y*rFrR~ z)lF-24VCqcOQrv&dYj4gtFLRU&DCY+PMf$NW#`o+ew!SgvBze);>5IornLR5z zBrlmTW#+{3v!_g-7AmUq72~E(AAejB4$BMYr3LeYU_>6VAdQ$41cUR4xoJVch3S(f z&6+qnTVB;aj}C5F#a7S(*@B3k6%^G~(<-ttAY15J0X;7dF6a%&#&8v2^YgI0!hmcD zN&&PW56Z&_WJ90|pgDO^9zGx&f>!{|&4cpr0of4H0!U6CKX%q}+4Azi*&~n4`k))z4NoUNZ7mQph4N?t*xtCjutt@SBYH1l%-_p{SYZ)|T@L<{0>ThVP&1DZv=Y#`$_w3!XrL{(xGP|^?v86Rz z*U(hcnq4t*RZD$CQ)6~?wyLtKYH;1Cj$t$Eg{ZC^Jaq7|kwbjCfBq~Un=)n>YEz9d`iotwuXi!&GpNcw-(7YAWL&C z3x_X~^bAo)o>ga8OlxXhS<}$6aB$V4?C883N%yMD=~Z1t{Clv<+5Q#5rw#xEI|Lv! z3s_5ANVGZwxYh$KZ6N@hosI$7f+zpK0G)(=eA|-TjHZ_QRt;y%!Vw+BeqdGQu(}HO zcL!d77J$NIu(X9>{J#PmEN#K*GC0Gw8r}eKf2S=tOE(dmOwZX4dY$Bh70i|?aY0uXb-Jn|JGde{M1CfJSI6Z! ztRg$KB71m6Rt5b%Jc=a~t~#mI--k!BEC@F|F{QtUM6nPuEP)F8+t4y1v~*O^-&K}g zLP|U)*E)83dE$0*r0So~DIMj{vC|h0)fi?sR87P9Wh7ENQ$&Or?I3Qmp)HmzUs72PHOVMt@W?|nhm@dd@A>BZd zzCW9Be_F!l!a2ZK(JDA?fSZI<~d-9~Cs3 znzLag8tb7$ss|H7_Y5uHd!1K zD|zDs^TSfPcHR24TDG=cgVMM(M^AH&%UYM02RjyYx?5kDEzje|jE)`epAW}|LS%sJ z6`-}gvCYosh_vbO;1fqNaWbFc)OvJ(P~M}hT%A_i)H+qjmKtq$HLbaF@#SHP#X#ll z^-sGWbdOA4MC#&@{6k=EK$z+2pOk4G%rnNQK*rvCocJnPDi18zA@jk7|W$@;nS&vuWVMR%D0-DVPa02luXU4{z@%Fh7FSo z&dZ>_tfV@#J5e9eiTaWf>S1Xl>Vt=OsPERdvV7u9_ONUiz{9dGc+urJw`?cNXNOVY zs1w$z()_Hp#;GK*a&3s3K)E3kj!f#tWR>d?RAgt>tX$QQYaZXUQa5JxExOIqOKmPo z+EQ(T9=djDHn~%)Q*O&Ax|X)a{M?JetYlLfHPU*ES(gWvNRcJB#;x;Zb_Mr}O=}cg z&V(V&u|9ok+2VQb=6DPeDK@Ca;DsP*QPnreayVP~S8AO~@-uv(Uv|FZ{rj^4R~}w< zxXmUU3r7EM9u3WM8PT*RpUg&QSGF~jr{h1gybxBFO@8$kYm@)7gOoptY*wy`^C*eI zkZjv(MIZ%PyG}DOd4CIOIBK-5u3RT@T)}X$f_{r#tKEiBXHP#}X2p&P*ubtUu3hJ9 zQ_Zh;$gQe^&8>H_IMg;@4lA0E>P|8)MUx;oM69W=ZC!5t;}o$x=k8A8N~uhaXe*i9 zdOt5ubSfg!@>2|_G;$5Il)x-dgTgu*(ur1fNqr6bs$y4FRb7|teOw>O>+%@v#QUPA zva9P`>X+0vXtf1Zn}k}Z*>ZZaR`P*^N9n2A$TPqB=OL&9(by!Ab$Q5!!VcydQi8IO zgxoQH<*KQ<)wzZRx#p(wm^U<|23V)pR%F-pS3mM$sYuVY_1X;RzjZFIP}iuY@W?{O z4of#oi%I&*K|LtmOTsZ~hz?UeN0@nMmlHtqswBb{E}G^c#!c%pO)hn_U|reR4xF61 zCp9fA51y|r91o+_mGzBU&}+)qCYw_@4i3@fN&oQHiw_ElKfTUcv2HwjU@%#oKk?+# zZfn!3e0h0ObN%|J#zM2fk6Omw@<@Iq$2z7?JRT*IA^D6`sS(XsI9| zhtyWqudG>?3-Z2_r^E?9|WvohM*KX0cc?CMdT)ibeE5GTGIAi2GS ztC-k6P*1-Nn!KM1{$@GI%Q6Qc53l6XFUuS(ejFFrdeYxR^i+&z#gj-PJ5;j5>IK&& zQ!be@R#NV-vO<|)57V=-q>z&ztJbyvdjpu9L6F)5==O}$yU$I5#qz#Nx#BYCPzP23)dqv3O%M+2^eub zQkW#EBsyI(qxGB@%VYGMAInGSxgaT*WscU<8X}fs#V6~s@N%8RYMkWB!B$V^#dtm4 z!B(>FnF*3@efkGqmYJx!Nqv{hR6XmHa@Wl9dKQlD0Y6Q$_^zsUx@M+}PufXdy#r>3$uxVx zoFHEDN^a6rOk^|lthMX1D4V6HaMP0Og(#aHWVYO-J967Ok`=zTVpi)LdA>e7uxHQN z_7*Ui#Hq+UNzNr9?kjN&)JQyN#bwZ`#_KAhOp+)(R6Fni*>@zbZzoKWSg56Nn_ zCl}x{Z-Bu8(AcDjpfhii4iDVMByT`-`KgP;4l(R1{n};~Uze=T#p8T-l73O6*C0GM z)74?>uubK^4o~c^I8hrHmokHgYih+F@T;Hlq-WWB`o}ButhtM4*EBE7wN}O6CJQO7 zBdI5wY?$N=l?0PYz28W=GI72CBG-GngOy%BVR~>yFc*g-@w1-qF#*h8W#5obxkIVhdkWtj4sNzl_ACGw5%K)(~XY5(Y)8M&ek+6$<=aMkr=9M zUbe*bTD9Te9V%;FRpFLey1~z)S>&MAx{6FT?huTkEAnI~3xiPMGD+cGpu#S{iwxGp zi9R|Tr+jiJTUZLbqJ`G%j96Z@Q7G;C)UO+>;w&RUTO&3@VNJoGAPfhJ4o9(N1usCF zBzDS=)1)Xm$rZ}LRPIq*NiK-(=GQ#DAGB;;6PJo=g10|Am$)}6d0m{L;d z`yGa5onG3D+pW}V{-Eq&chi>m8DH?i>Mu{;^Wsd_-G)uK0a=?T1DFtc@73Vw{k3VC zit$BIuhX25x@G3-j8im5@jP^*p0)y26t*lmza}{%VmQNEe+|P~b_$V5FlCvAdfIOj zY40TQ#a+dAm&_u`k+0KpO>@mEWozNPW|oOxGW77lgGW^Jx**v;ndN$B2Tsh=uk64n z$)Zwn&kmfOUDdL9_~NSUz?N0@&8xEm>snT=9$2UCK^M6Ln{zEqZOuz_18X=k3ZB%~ z@(a(=tJ@k@)HDuUqn}j`45*~7vgC{$=4*)4sgi4vCVk<(Fsz->U;V5LKJJ;Jzr4@J zWFejI8Ga<1yt@<~cffYb@Eg^XIFYZCym(~={ArS>GKlb9GtH70jz_^aUNBwO6Ru~5 zIa1<%E7_J*EnJUGo1PuNZv_}_>h&|@wzkCYHIk*4X(HD(LtY+Nbs}FUc~OECPh8gL z<%SOO4U+rKMy&ALWlq;K^vmubDw81(_1!aPsF3t0RZUxGs?NVe1f6b~vsCck7n^*e z$-~iSJ0~ATPpp$()O9M!od9X3nD=e|V>&BwaI`kU5>MLY^;KM}6q3 zK3t%>bRUpkXgV$VD-~Jqmbu9Aanlx?$S*d$#VN`!(KC!wVLY&NXc{v9?0spO>_#sG88LoT@$@7 z)W!QC#^FlwevaeoRg!h=YqA2RRhGG0n7{?w@O;K|>8WS8h`~?pD2&H9a=h{QLw?7X zYxMN%nK^N-WQi}SBtm?sm*CTWxadmddWMs73#2+&OO+>p@h8~JF!O{ zpLCAH-c6Es|EV&)0?}&X%+B;TG{7`A{Z#ePiY7 zn&wJ-eW;QsiC@>P>$rkT>bh-RH^l0?Z(Ubyb=#@Xq%#f;7Tz+jS*9Jlu+KAow~9~V z6V`hEE|$96O4J=AEBLm9h%&zPPReC!A(Pop#OD}s^bel6!lMUIOySXm$1iw%_xj|h z14V|1KS0C>JUPkN!~1%2kgtcQ-uxjK`FeO?Pfqgn@YHWBqJ46cuZQ>bx z{_H27kI85cna9xvGRD+!*hSV$g#W*f_792}aylO{d?pKHvOUE!-{7%>P0Nu5e2}I6 z0hjg%8FtV$fBq2t*-G01+tiaU`B=S|u@*wRWqDkf z2VD~0Y*-#N8?=GU>MgHXJ#AQSLuP%m+=eVGGF%sxkyVMXZMfZ4{-ffPm3)B4h4P<7 zO*@}^gz}zj`{H~mG#N{@o(|Sj12clz#V1w{v#fl z;Y|K%lv|z28BDNg`8H8*b%x(oa>Md8d6y_h=H+G1KJwi(9$h8NCfy7Dg}*b!-z{G7 zBp%eisj?n<{tGHIp2UIrdsSu+F#aBunbXGaBxB5b;Rkrrw zyVJNn;NiCuAu_&)7?1BM-uw5UD)|o4@Y}1N_IH()UMeGJj`mhLli4`N;<|%)<^^(| z{bdz=ACX~pjCIsQ*diu7iS+r@_{YSMON`%H^`AO^7w{5T{d;1`smAY`*!wi$@pU)x zufO)%80z777yq|Uh9+xn50#OjQlXK7-&0hWA3?U4WUL9l2KSb1=9F7UVwYI&Bl=Vy zYiD2aufH~RwDEldpZ8-w@fyLSsV5Hi!HJB2TV-8$=)2*v%>Jq;A0V^(zT(*@_R@L! zd_C!h{v>_j$;X~q*~ljCWfJV(LS3kOU`1_;0JckK^A` znX`!L|5#WX(%nbjr%8aS;|5o{nj{lF!4>~?0U)f^} zzpeQD9A75>9>;eRf0yI86Mu)}dy3!U_+H|9Co=mxh-V%fzl(U*tns^vU+?%m#Me1~ zFY&V-zmNC{jwkjljz3U*tK<8L@8S4^#kV>BQ1RTUnLme#-{|=M;!kt@Ao1%QKScbQ zjvp$Xd}a1Vh~Mn^Bg9|g_#?&h&Sm&9;>oMVA1!{9pCf)R$Db&^#_{vT&v5)g@uMBTNPLy!PZ2-I@ipS-I=)u? ziH@%me}Ll~#4mAtllVOxf13E?9N#Q{s^iy+KiKi>#UJAM)5Ra^_%p=s?f8x2fA09R z#Fsn%9P#}eze)T+$Dc30((xCIALIB-#gB6QX7NWj{tEFU9e=g>!ySLE_~DMfUi>h} z-za{l<8KyU?f6^84{`kM;s-na4)KE=|2gryIR0Mo0~~*!_`Z&RK>U7=e@J{L(Ftdo zhgBxVHa{Pse%k{7g!tW^{!`+2a{Qa(cXs?+;&&5&fOf<|vg7x{D)Hk~$9ZJ1%Iu%_ zi)RlVqH=eYZBMO^yzS*f#p_S9*7uQZa^Cq-cUY|Jrl<8|xXMSV-uT1CPjUPR@zbOJ zNR{;`zuzAbdCnN7KT75K5r1T?=Zs?Yqa{1Z*&ic5=lG+CtoSwJiN!dT z^(Q&UnEmk*Om_GQ;ukx9qWHrcKS}(N;)&I5dS2}6j#1rM$4?f2pyQ{AKi=`jieKvZ zKoDr>lh6Md3GyVke=Q)0+c*ff5XNmXy znJxZOS3gJmm5!e){wl|xDE?~4&l7)*w5 zf2ZRYi@)3Pr-=W&<7>oEbo>(WO^#nGo^@mG*NT5gJZI;e%B&&%$=BD3dED{K#4mIF za`7u1UoZa4jz3lWla5~@{wc>dh<`==D7Bwe`2v;s!1M0He#-}*_mWEjo3Cf=_*ngA zfz8*mpYx%f_YlTbkA&yFg0VCHU=^-&JnsiLIG%Tcn;g&CpRv^=vB%lJOyzAN&)L7L z<2n0xb3FCTcf<28u$}lWBG$voSkL<*<3)~Y6w!w9P2y?8_*LSuY5Zy8v1xp>_#TdL z5#Q7Ct>U+Le4BVXqtpIsQEykjM*I$rUn{(5!@ZI1!JQDkQf__IZOI{Z1}?TkeIxgt9=z@I1D$Kf}LCqG$x=Zm*J z68r@s+auvG6z%Wu7m3e0{$lY5IQ|mx2Ri;z@tjF26lKQ!G7et!%4X^OsL!iMRca<3qVnY;tGhzwk(=Mm-&Tyo*Zo$@+TOGxqhGM zeo<&+yTr}|;;CmXeL;i{WIjBoGWGbt`e03%eex@H-Usl(haD38UyK;$I_rn_z&tF% zZ)~uRX!}bdv;Bz5*k(TSTG#Fb97i9=&cN+NNKW7ImGsVVm5P-HqkRv8`eX`P=)W;*>;Hl3fUjLy$Q1)b2ZpG$^LR}pyf zr}^*;mCfEkD*s$Wtlkk}?_JR^MIlZ*C$adIcyxM-4i;H_!M`UWzQ}(qLXX(cSA3_v zUK(Ly`Wq2;Y+Vy`#+C6S-pn;*JR#b(G5)Q}=(5%i5n&6ze<#8pe6XDSzRI@Nf3Grn zw$`Zwk3Czve^43B-l9WA_<-#{ie3_7gYh?;e^S}o{ImFbMc@qcmxuvZE@F(Z!Mw0` z|EjXJ+h1jLX!ipV<6CGqlF&?ZP z=Caq>(di6T9qZS0@ZEHFQrX(s+3EPbhIY8`HXWb8c6B<#gtPdd!=1S45Cdyxcc(L4 za_`$7PA9DKkl*)oI)_V#{AB&v%jtwX8Fcn`IwOStzSH6U-Fyq{BD(>3<-+}5Rp^xjVJVwXq0G+$osc{)Z1S2BSoJVp_i4MHG}SbBCm6R(;2Ng z%Q**1&UXah(>ez^oiR>_?-0-_-m^j+4skk1IUT-dKrgMYNwOFJ?9(g2mo4ShuWiLkpxPajh|hg3xD4q#PA*X#_8b=#?q z_Lyhji8HwY-o~&pV#(uUMd;GrAU){^zT1ArytaL%N@btNr~{8Z!wgPg_^yTZfUf1| z>WCrNjT7M;?ejg%FcCJwdI-63xWkVZ&ek34^d0eO{NWBi!QuH{rx+jd*vN>t+{pJm zj5~JC=TQ-Z&l8XTcq)`9DbU^^F8An5qNT(?QwG*-tWKUlM_Yc2mA>>g}E@# z>9GHjqbvu_cRGGQSm1P~3vd0VorO;4P1TuiCpn!Nl9LmyokdQEJZ3rUG(0N9@>G-%Tk2)3?=21E>^$|l{W{J=tF6^P{xG*;?E~iF4 ziwkw&v1f5v5i#kwG)PWdu;Jsf(&2qv@P+dYw$pKGbUHpR=rlQ<5SMVjwJPe+=h>nM zMD+PI$;&*V*87=BbXk zL_2(+e};&=fb{w9Os6wn_14Z=QD>u`g?7SO?d+&So?aj#R|yO%jvW%9Jmf8v5|%L(Vjdgj4G5qR3!B%)2)v2)e=D%+S`pfYxu2jHm#k3GX& zn8J|n7&CNjeOweVdrN+ji1mrRi$%jk*kHU3e~Eb8cNR(hc*I{S`AaHe+v6{D_>)y{ z_BTt;yh!6OclgDsH~Uve-jV$)9sU$&|2366vVWDs*Esyul6Qo^#^G(xAwJiZz+dO^ zyUV`$f4$@#`G14MFLD0dSi=5I4nI!#ABgbh<`Vc@9Db>@e`^W+Z4O^6ysfX>C4XCd zdc3wc{7`3~eX^r?wmZD#SNy+2R2-kM=ilk@IoW6JfMZ>V~*OI zyFIB3dH3#E$9k(1fi-*B*m}K%^V2<1k9ATnvbfwUIewt`p5&GfKOgbr!&5~zPWMSp zTsq2!_dA^xPUnHBLq3FjKKz2yX>d9ZMxBQ`(D|a%S?P4hoA~x{kxs~mUy3^9!$uLY zB5vQ-v!9;yANeDC;vfB|Kln#`mhT=_nX%bf)Fi@g+79wtL_VI6MLpuVN@RKDF_kTz z@2VVP6Yg&xk2-0epOD=9Ya*^TEgS z*{GBDllXf-O^-Ir&*!49`H3ys^SbzXohbMj*6Z_5uSIp7#nB@d&C!#2hy0q9-d81O zp5be&i2iWC;t4$@Y7=b{g+7LS^R=i)Tn-Si&e6k9+ANMs(0Re>94L(G{5a|m4~vQA zhp#)Geolw@(+=m6f=)Q2y%=@6M*RJHn!T5ty@MnNi{I~vu=lQrvr*`4Sko^@9b$B_ z=xz}@;28sAgxt1&JMGy$(km(x>pr6WMA+S;r;oSg=2s(j2h}r1=-M3lMyz9w ztQLV~teIOj*2u3E`8o1Ur?*CR-xr|=hIleZkZ%@wz1N)HTGf3|gx*df%jw83OX