From 843aef30fa083f3556eb5cb8880f82538038136e Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Mon, 5 Jan 2026 20:58:42 +0000 Subject: [PATCH] feat: Update colors and add texture effects for floor, ceiling, and wall shaders --- scripts/cube_logic.lua | 6 +++--- shaders/ceiling.frag | 15 ++++++++++++++- shaders/ceiling.frag.spv | Bin 2852 -> 4212 bytes shaders/floor.frag | 16 +++++++++++++++- shaders/floor.frag.spv | Bin 2780 -> 4240 bytes shaders/wall.frag | 17 ++++++++++++++++- shaders/wall.frag.spv | Bin 2852 -> 4528 bytes 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/scripts/cube_logic.lua b/scripts/cube_logic.lua index 0873815..1cfe8f2 100644 --- a/scripts/cube_logic.lua +++ b/scripts/cube_logic.lua @@ -576,9 +576,9 @@ local function create_room_objects() local wall_outer_edge = wall_offset + room.wall_thickness log_debug("Room walls: inner=%.2f outer=%.2f", wall_inner_edge, wall_outer_edge) - local floor_color = {0.08, 0.26, 0.55} - local wall_color = {0.78, 0.38, 0.18} - local ceiling_color = {0.72, 0.9, 0.96} + local floor_color = {0.18, 0.45, 0.25} + local wall_color = {0.75, 0.35, 0.2} + local ceiling_color = {0.85, 0.85, 0.76} local objects = { create_static_cube({0.0, floor_center_y, 0.0}, diff --git a/shaders/ceiling.frag b/shaders/ceiling.frag index d4a62b9..0a3d455 100644 --- a/shaders/ceiling.frag +++ b/shaders/ceiling.frag @@ -4,6 +4,12 @@ layout(location = 0) in vec3 fragColor; layout(location = 1) in vec3 fragWorldPos; layout(location = 0) out vec4 outColor; +float hash(vec2 p) { + return fract(sin(dot(p, vec2(63.1, 157.9))) * 43758.5453123); +} + +const vec3 SURFACE_TINT = vec3(0.9, 0.93, 0.8); + const vec3 LIGHT_POSITIONS[8] = vec3[8]( vec3(13.0, 4.5, 13.0), vec3(-13.0, 4.5, 13.0), @@ -27,7 +33,14 @@ float calculateAttenuation(float distance) { } void main() { - vec3 baseColor = clamp(fragColor * 1.15, 0.0, 1.0); + vec3 baseColor = clamp(fragColor * 1.15 * SURFACE_TINT, 0.0, 1.0); + vec2 gridUv = fragWorldPos.xz * 0.45; + vec2 grid = abs(fract(gridUv) - 0.5); + float gridLine = step(0.48, max(grid.x, grid.y)); + float speckle = hash(floor(fragWorldPos.xz * 3.0)); + baseColor *= mix(0.94, 1.04, speckle); + baseColor *= mix(1.0, 0.84, gridLine); + vec3 ambient = AMBIENT_STRENGTH * baseColor; vec3 lighting = vec3(0.0); diff --git a/shaders/ceiling.frag.spv b/shaders/ceiling.frag.spv index 650caec6d4654d3393338d180399903641efbdff..83c01653e72c41e7073f05eefa384840be460302 100644 GIT binary patch literal 4212 zcmZ9O*K<^L7={ldOABBF+Xx0LBSjGlmV{6gOO#;4f@PEJCTo`6m~0SxP*D^W?7d^} z9WUitul)=3%JEJ|ozd}m&Yo|xlQZ+q_r32|e)XK)mZ`^2Pm(D~TQVd0KB+&4BvVlm zv}vi`(0yh1^3huV@-xmn&5XH8OPXlTLDaQk#nybOV&GKJ0X_!@lWUAY@LK4cBnK$W zp*Gj#P}+zM=0^t?Z!4aD9)6DeS=iy!pGmJI>C2b<#>)9xVNI=8sEp-nrD|nyafRvR z=a^5D^p{3!`AT0Qv}HKG`O(61*_b^Z_-n};XJo&E+)-7dC z*3Qpz)FbCe{KtMjWkc`<@FW>u9o#kjwrPJy@Z;dsLt8pr!xDVQ^{sG@OR%?&;X-?HaGXRNafcTEB3DU+3mL z9Mk^xvd%q!6ziVX_pE-WUxc5$;-bb`z68JJm!1ZH8UE6X*ER0&D{yPfGZts{7XB3A zyY?y8cdZpT?q^uvJ9Y24+;5Ot?ESa+$L<_zjQbsY&w;VVxclMes4oC#@tv58bqpVS z{e_alI)?A}GT?gU-lOv;@wH8S4!*w;kuSfhiCgdQL&WVrFo_Q}aqoAviJR~5L)3c~ zyPLScG156kbBnp_OssHPEKJN)_BaRGxd{XBQtmItAU#E@eG}>u{FSW7qFM- zrDiYV>wwy9<}F_joQMBEjP+!FF2wg6DIUnQ4fy68i~5W3t@jQYcTDeu`Wouo^UHu* zH*g-_>&t<9+c3n?bDiI(*0RE*p0Y@3i_ktk-$o0NQ}Mao+*8Sl3PXYTgC&ZwB^U z4z_?BfjKefTkyRTaVPWmYS!7`m|FDj!*|`$zaKyPdk=eoInlp>-`u|lSFcS6wT`HU3wZbZ20RAT%!xHVp6S7#NMrSPVF~^oV2-*y z@65Ewe-f_dz445n0-k|)+?X|cvFcItG=9`L#xuYg-$7$Bj=DAWeID4y*mD_=d-wwU zV4!aNS*%*rzKX9F_v$tLSAcrV>2>@eu!FsFPHzA;bM0yD4d9u1e(t;0de7`l;J%Mj zFMm7J-ojdMOs)A&cz!YdJNVwG;P2uuYvS+WJBRo-zmIQ@dd&F)eES%4%zaq3==mYO zT70uV!e7;d&_71={Rzak{1Y_K$^EgH_2$M{#$&86@EvOt`{DV03DkT-`wCypo}qo6 zX?~x2_#S?W{RUWXzH#T}n4e>f{Y!^cz~6btY6Ctq!P(@^z|I1m*=($HoQ^#-)1S%e z4$rjt*tpL};5)xLz_|PG7)JqPM}o*b8sA*UGX5XqsWs2dd+IY6I5+zq1f1I;Sm$Q{ zV>3O*Ylkn)bkEzIMZmpi2T^xCzWt)^1pMQGdgPpl-<)$2+&uN@eKNlNjqS?DTa52` K#$21+wfzs`_jMHj literal 2852 zcmZ9NTTh%-6oz*>R0{M!kBMRntwOaGMS8Sy>Orbv1*_I-)qcQ0#||?s3|hUaF-^R( zCSK{k@XlNLFWz}=)I{U+eDf_BnPg?H_g#m*_Fj8`)7ohw!S>`JY9pfS72YeOr`S-Gm?FmesKkL)2-J!t>?j&^3t7pxw?c2*P4dV<=k#h=h348Z z0haGZQhGQZcqi!h*!@Eu`~^OP?f&<3QfJZD zc?I2v_%lxI#Wb!L{3^P!mxkZHk0L3}Oh&(BIsSek`W*)wBd?CQ32gFyjkrnB1QKz< zUxbT%{lQ<9OLv^$Jx#! z*7Z)-(9XqgkA2)jdq3svL+rbei$1=USxy`F@)MdzOBe0;^}YV81)fe!n?^t>-sKJW7Aw z;Umalk=J+@t})+6J@btn#CXq3PTRBc-D`VJzU99-Z~v@3cl96a>t*x^;!po6w0^bgdRI;(*7%uy`|i&b zoZo}Li4hMY)-qQ+a$myQk*v80P)0xXf z{5#lk-OR%~eI4<9eRulI@gB%W&b!!=<6PfE%(;T-i*@A9vF-u;pTopJMw?<)f$D*v|0lV&56IoUzu_C+EzZpXaVN-f2JSzGtV;dtMJ%5I69eu9pdy$f-8ypPuR4;9WKe)GH!oru2<ibf02?PCwGU!jU*EUIdWW!GPv5`vD|T=H0X(MF_y7O^ diff --git a/shaders/floor.frag b/shaders/floor.frag index ad568f1..38adb52 100644 --- a/shaders/floor.frag +++ b/shaders/floor.frag @@ -4,6 +4,12 @@ layout(location = 0) in vec3 fragColor; layout(location = 1) in vec3 fragWorldPos; layout(location = 0) out vec4 outColor; +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); +} + +const vec3 SURFACE_TINT = vec3(0.35, 0.6, 0.35); + const vec3 LIGHT_POSITIONS[8] = vec3[8]( vec3(13.0, 4.5, 13.0), vec3(-13.0, 4.5, 13.0), @@ -27,7 +33,15 @@ float calculateAttenuation(float distance) { } void main() { - vec3 baseColor = clamp(fragColor * 1.1, 0.0, 1.0); + vec3 baseColor = clamp(fragColor * 1.1 * SURFACE_TINT, 0.0, 1.0); + float checkerScale = 0.55; + float cx = step(0.5, fract(fragWorldPos.x * checkerScale)); + float cz = step(0.5, fract(fragWorldPos.z * checkerScale)); + float checker = abs(cx - cz); + float grit = hash(floor(fragWorldPos.xz * 2.2)); + float pattern = mix(0.82, 1.08, checker) * mix(0.96, 1.04, grit); + baseColor *= pattern; + vec3 ambient = AMBIENT_STRENGTH * baseColor; vec3 lighting = vec3(0.0); diff --git a/shaders/floor.frag.spv b/shaders/floor.frag.spv index 464d0b09101602b1e661f9e087e612feae31e72a..40d4e62572ac7fb4269cd63b0ca1e0f400ef360b 100644 GIT binary patch literal 4240 zcmZ9OXLFQg6oy|Cf?y(ILD5kR*ce3=gJMeoR4k~8*bBHMn`BMcg=C}HgBlAWSg<7a zid_*4e$>zU1N;p-est6s9j|NiobXO|=FB) zTIIJ{e^zZ>=G|Nw8tmz;4C8{Y&#pA)e(jlAm-b|x8omkKH&m*kYWNQHmcmeBbHW>H znDq>mYyJUnVe_U^v0Mc=WEJpWsjt6UD)(W+)Mqv>)$E4sVRX%ZY02f)a(1Ij<(}fU z!lv3ntg{Dh`reGg6%KACQ8Tj%xP$XGWP8EArE*~~ZI-n>+sa5awl7;to_o3w@hA2U zh`lFbbHaZVH^IBGh_!f|w2#4>g>FWUCEhzD*4GT4jh0guf#;z0%j-W39Xa~vCcpfd zU}KL$T3Y^F9r$SQ#ILWdS<0Hsou6XlBW3~i&Ogpr8~8+UmW{Rtc1^!`9cT@_7+g8B zzST9HiEUrk=!{Fz_K_DaL(fR~;)LDDNp5oH<=|g_-Z|B;1>DlIzb*Q$08fk`*S?fa z);&)@BCn3PmDv6QUxNM1&rMTx+iKpdJ?8NIoMS$7b)cIOf97|fR|)vJj@4*mU2FKS z!mdkL{#Jy39npUyc!rkEAKaEV`9`J#MV^eq#JTX4r7VGw%aE&3( zy%pSyIGc0&fw=$j&Y`X%{sKRM?VUQB=^spd2l^32{si(y(eAZetYH)=lFd54)~~VUetdE zJLZ|>8?#Zkorr64UT1R-ds^RG=DFv)(C+yt5^H_~`=qgfsk3|&+|trAb%);q`<)r5 z&pglS17rr`x3v%Ly_$*G=WDdznY?#cygza0^L^K08|%-wzhD~B#`<0QcfvWvz8U^K z$m7;&_{wRxYZ~_5k9_Zq?|xwGZ^&W$4@|?p`w{QG9nN9nAI@R-*f&4ot-og)_N~wR zedhyPZ*Rh_tlzusAA8@TUF?$h+{7(Mk0tK>#QWxSruXLp?Dz)N!C#2&nT9m+HCgu} z#52{lp83YMaY~+ver?agH)|EWSEJV;?KPb7H+u4|yfpEFF9VzByxx_|5o6?=VC2>! z_V<4c{Y~tO{1u42`_P6M=N#SxeKE(?*v{d57k$@Z%Ll#&J3q&@U}NNCj_a^v4*fAl zXX0ZHL0FM1o|Pyc;r{c8JeMcb*q)i+x;}G!)8r%P73|2d$E%1re&70{kGwhFo!1cS=$lA5 z?&0g;d5FCJakO0IzKtyx=l%}%Tgcl;%=9j{XShAB`#o$qW38!A&NK7;+;_G4p4t0| z`#ws(_`}3~fHq&BT>egYe$oFUZ0}RxkFmXbfj_}^hIqq2#WqGhX8sJ@I{NIn7cCbx zKF5}exBUz3l{pFiOSltr5^w%jaGsNAW-arLjb8er*EiVq>S8}Uzi$yaf5Cl+EoaT( zzE4~ox|5e^ANl}dzVZ5<&7S+w`u?TD1&IGI*sBroHwRfs+-&rrh-cP>cE&@{M<#wx z$~z`;^U-mikHvPr!w~)P_8f<;Zvhgq$7367Fa7_~PcA>3_tf89#M!KSIO1$apqw7BoTY_yr KeXdRH+WrT_E_Y@C literal 2780 zcmZ9M+iz4=6o)sxU}?*xToXl@f&vOwuw2DnLF=VrD=OaQv@#eovqtPn-9?}=yUFW8D=S&v&~XI0fvh5Xh}Fj;pl&Ls^b3i-u$?)* zX-DeEx0uxzH|kldHq~m?8XH+FZ#GUXox6&Q9HUaI=IgDju~-Z4Fkm5DuU%`_n`>p9 zJuIzd%bQ$JIsuohEabIDtElxXc0FId)5;smK)CKSg3b%vo35Y>|MlFmMa~=Oyiu)v zl`Yh5pqDdpuda2gxmK^vHPm9@P3;#**j}IPJ!-_J>1LR;rW zbOrG`W-LqA10&U32bBJ)e$!dChzBno5GqzA};u8 zxX9NZ{57z)@#^5OgO4Fw>%82-Pl6-<6>!uyFZdboBx0R5KTz!dRc!ZUztf0)xTf{3 zWu7y59qkM}vzWd2cN-FC@FDo<{kxB5{}J}+=;%cB@G-Xc(KvnPIm-paI^Mws+Bx{I zaor}``zY_a+P)LHi@dWgw6T72f5P;ljrIQeud(m2Pi(RMr-a{oHqv36?>{B{o`L_9 zu+{!EI&J?Kowomqu&q}u?J@fE?j1#rAm7uq_HfBn&~xP*ISzJaA;CWd=Xq{QUs2;} zxb|Gy^~^VRoD=dq^vC+Az;dzvGhn%si1D76oY=GSy^1|2-{4=I_gS>(uKt64y?`D? z{Pdqk>sPz3GrxdX<01R@yiXKnaf4|+hDmt=HcDEiFm%#h(2??2lA2g4mfh0>$`|KzAJsP zj=VY6eIK!oKJSh86?)Y70n(4i>-V0?MeZkHxtQapVBed3^z<3n8Gc>v`!-n4SZnIL zjW{#s=eeuRcV-#lx!)sSd$Hse(B|ut>%0@rFV?Sty-#5;fxUZSFN5vje%aq0urcz{ za}KtSKG*a;$wiIN!E*6N?tVU~nyYAi|4`vF;y=&((2w}_A(x2rAF~5-W&>z@ zG;UYPd#2jEk)0*)nab@!Tu)!*?FCye^7es;5c!DN5AKXPfNh+7)IJEdzP@kE^$vku MPv5`vtL@(Y1HbRhTmS$7 diff --git a/shaders/wall.frag b/shaders/wall.frag index 71c2b9f..782bc23 100644 --- a/shaders/wall.frag +++ b/shaders/wall.frag @@ -4,6 +4,12 @@ layout(location = 0) in vec3 fragColor; layout(location = 1) in vec3 fragWorldPos; layout(location = 0) out vec4 outColor; +float hash(vec2 p) { + return fract(sin(dot(p, vec2(91.7, 127.3))) * 43758.5453123); +} + +const vec3 SURFACE_TINT = vec3(0.9, 0.55, 0.3); + const vec3 LIGHT_POSITIONS[8] = vec3[8]( vec3(13.0, 4.5, 13.0), vec3(-13.0, 4.5, 13.0), @@ -27,7 +33,16 @@ float calculateAttenuation(float distance) { } void main() { - vec3 baseColor = clamp(fragColor * 1.05, 0.0, 1.0); + vec3 baseColor = clamp(fragColor * 1.05 * SURFACE_TINT, 0.0, 1.0); + float axisSelector = step(abs(fragWorldPos.z), abs(fragWorldPos.x)); + float coord = mix(fragWorldPos.z, fragWorldPos.x, axisSelector); + float plankScale = 0.4; + float plank = abs(fract(coord * plankScale) - 0.5); + float groove = smoothstep(0.46, 0.5, plank); + float grain = hash(floor(vec2(coord * 1.2, fragWorldPos.y * 2.0))); + baseColor *= mix(0.92, 1.05, grain); + baseColor *= mix(1.0, 0.78, groove); + vec3 ambient = AMBIENT_STRENGTH * baseColor; vec3 lighting = vec3(0.0); diff --git a/shaders/wall.frag.spv b/shaders/wall.frag.spv index 1ecb352a8ce876ab2f9b7ed0abba4d63bf33f332..462ff5139489991c10d6c12e85e445a1193c6106 100644 GIT binary patch literal 4528 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 t$lHx=y~x{xJ%GqZ%wFvFn0;X5