From 3395572e90d56b623529f47a6ef65f83bfaecf4f Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Mon, 5 Jan 2026 20:49:37 +0000 Subject: [PATCH] feat: Add new shaders for floor, ceiling, and wall; update shader handling in cube creation --- scripts/cube_logic.lua | 35 +++++++++++++++++++---------- shaders/ceiling.frag | 46 +++++++++++++++++++++++++++++++++++++++ shaders/ceiling.frag.spv | Bin 0 -> 2852 bytes shaders/floor.frag | 46 +++++++++++++++++++++++++++++++++++++++ shaders/floor.frag.spv | Bin 0 -> 2780 bytes shaders/solid.frag | 4 ++-- shaders/solid.frag.spv | Bin 2672 -> 2656 bytes shaders/wall.frag | 46 +++++++++++++++++++++++++++++++++++++++ shaders/wall.frag.spv | Bin 0 -> 2852 bytes 9 files changed, 164 insertions(+), 13 deletions(-) create mode 100644 shaders/ceiling.frag create mode 100644 shaders/ceiling.frag.spv create mode 100644 shaders/floor.frag create mode 100644 shaders/floor.frag.spv create mode 100644 shaders/wall.frag create mode 100644 shaders/wall.frag.spv diff --git a/scripts/cube_logic.lua b/scripts/cube_logic.lua index 4aff96a..0873815 100644 --- a/scripts/cube_logic.lua +++ b/scripts/cube_logic.lua @@ -208,6 +208,18 @@ local shader_variants = { vertex = "shaders/solid.vert.spv", fragment = "shaders/solid.frag.spv", }, + floor = { + vertex = "shaders/solid.vert.spv", + fragment = "shaders/floor.frag.spv", + }, + wall = { + vertex = "shaders/solid.vert.spv", + fragment = "shaders/wall.frag.spv", + }, + ceiling = { + vertex = "shaders/solid.vert.spv", + fragment = "shaders/ceiling.frag.spv", + }, pbr = { vertex = "shaders/pbr.vert.spv", fragment = "shaders/pbr.frag.spv", @@ -514,19 +526,20 @@ local function apply_color_to_vertices(color) return colored_vertices end -local function create_static_cube(position, scale, color) +local function create_static_cube(position, scale, color, shader_key) local model = build_static_model_matrix(position, scale) local function compute_model_matrix() return model end local vertices = color and apply_color_to_vertices(color) or cube_vertices + local resolved_shader = shader_key or "solid" return { vertices = vertices, indices = cube_indices, compute_model_matrix = compute_model_matrix, - shader_key = "solid", -- Use solid shader for room geometry + shader_key = resolved_shader, } end @@ -563,23 +576,23 @@ 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.14, 0.19, 0.26} - local wall_color = {0.52, 0.36, 0.22} - local ceiling_color = {0.78, 0.8, 0.86} + 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 objects = { create_static_cube({0.0, floor_center_y, 0.0}, - {room.half_size, room.floor_half_thickness, room.half_size}, floor_color), + {room.half_size, room.floor_half_thickness, room.half_size}, floor_color, "floor"), create_static_cube({0.0, ceiling_y, 0.0}, - {room.half_size, room.floor_half_thickness, room.half_size}, ceiling_color), + {room.half_size, room.floor_half_thickness, room.half_size}, ceiling_color, "ceiling"), create_static_cube({0.0, wall_center_y, -wall_offset}, - {room.half_size, room.wall_height, room.wall_thickness}, wall_color), + {room.half_size, room.wall_height, room.wall_thickness}, wall_color, "wall"), create_static_cube({0.0, wall_center_y, wall_offset}, - {room.half_size, room.wall_height, room.wall_thickness}, wall_color), + {room.half_size, room.wall_height, room.wall_thickness}, wall_color, "wall"), create_static_cube({-wall_offset, wall_center_y, 0.0}, - {room.wall_thickness, room.wall_height, room.half_size}, wall_color), + {room.wall_thickness, room.wall_height, room.half_size}, wall_color, "wall"), create_static_cube({wall_offset, wall_center_y, 0.0}, - {room.wall_thickness, room.wall_height, room.half_size}, wall_color), + {room.wall_thickness, room.wall_height, room.half_size}, wall_color, "wall"), } -- Add lanterns in the four corners (adjusted for bigger room) diff --git a/shaders/ceiling.frag b/shaders/ceiling.frag new file mode 100644 index 0000000..d4a62b9 --- /dev/null +++ b/shaders/ceiling.frag @@ -0,0 +1,46 @@ +#version 450 + +layout(location = 0) in vec3 fragColor; +layout(location = 1) in vec3 fragWorldPos; +layout(location = 0) out vec4 outColor; + +const vec3 LIGHT_POSITIONS[8] = vec3[8]( + vec3(13.0, 4.5, 13.0), + vec3(-13.0, 4.5, 13.0), + vec3(13.0, 4.5, -13.0), + vec3(-13.0, 4.5, -13.0), + vec3(0.0, 4.5, 13.0), + vec3(0.0, 4.5, -13.0), + vec3(13.0, 4.5, 0.0), + vec3(-13.0, 4.5, 0.0) +); + +const vec3 LIGHT_COLOR = vec3(0.92, 0.96, 1.0); +const float LIGHT_INTENSITY = 0.85; +const float AMBIENT_STRENGTH = 0.38; + +float calculateAttenuation(float distance) { + const float kConstant = 1.0; + const float kLinear = 0.09; + const float kQuadratic = 0.032; + return 1.0 / (kConstant + kLinear * distance + kQuadratic * distance * distance); +} + +void main() { + vec3 baseColor = clamp(fragColor * 1.15, 0.0, 1.0); + vec3 ambient = AMBIENT_STRENGTH * baseColor; + vec3 lighting = vec3(0.0); + + for (int i = 0; i < 8; i++) { + vec3 lightDir = LIGHT_POSITIONS[i] - fragWorldPos; + float distance = length(lightDir); + lightDir = normalize(lightDir); + float attenuation = calculateAttenuation(distance); + lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation; + } + + vec3 finalColor = ambient + baseColor * lighting; + finalColor = clamp(finalColor, 0.0, 1.0); + + outColor = vec4(finalColor, 1.0); +} diff --git a/shaders/ceiling.frag.spv b/shaders/ceiling.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..650caec6d4654d3393338d180399903641efbdff GIT binary patch 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^ literal 0 HcmV?d00001 diff --git a/shaders/floor.frag b/shaders/floor.frag new file mode 100644 index 0000000..ad568f1 --- /dev/null +++ b/shaders/floor.frag @@ -0,0 +1,46 @@ +#version 450 + +layout(location = 0) in vec3 fragColor; +layout(location = 1) in vec3 fragWorldPos; +layout(location = 0) out vec4 outColor; + +const vec3 LIGHT_POSITIONS[8] = vec3[8]( + vec3(13.0, 4.5, 13.0), + vec3(-13.0, 4.5, 13.0), + vec3(13.0, 4.5, -13.0), + vec3(-13.0, 4.5, -13.0), + vec3(0.0, 4.5, 13.0), + vec3(0.0, 4.5, -13.0), + vec3(13.0, 4.5, 0.0), + vec3(-13.0, 4.5, 0.0) +); + +const vec3 LIGHT_COLOR = vec3(1.0, 0.92, 0.7); +const float LIGHT_INTENSITY = 1.0; +const float AMBIENT_STRENGTH = 0.3; + +float calculateAttenuation(float distance) { + const float kConstant = 1.0; + const float kLinear = 0.09; + const float kQuadratic = 0.032; + return 1.0 / (kConstant + kLinear * distance + kQuadratic * distance * distance); +} + +void main() { + vec3 baseColor = clamp(fragColor * 1.1, 0.0, 1.0); + vec3 ambient = AMBIENT_STRENGTH * baseColor; + vec3 lighting = vec3(0.0); + + for (int i = 0; i < 8; i++) { + vec3 lightDir = LIGHT_POSITIONS[i] - fragWorldPos; + float distance = length(lightDir); + lightDir = normalize(lightDir); + float attenuation = calculateAttenuation(distance); + lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation; + } + + vec3 finalColor = ambient + baseColor * lighting; + finalColor = clamp(finalColor, 0.0, 1.0); + + outColor = vec4(finalColor, 1.0); +} diff --git a/shaders/floor.frag.spv b/shaders/floor.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..464d0b09101602b1e661f9e087e612feae31e72a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/shaders/solid.frag b/shaders/solid.frag index cec1102..5e503b7 100644 --- a/shaders/solid.frag +++ b/shaders/solid.frag @@ -17,8 +17,8 @@ const vec3 LIGHT_POSITIONS[8] = vec3[8]( ); const vec3 LIGHT_COLOR = vec3(1.0, 0.9, 0.6); // Warm lantern color -const float LIGHT_INTENSITY = 0.8; -const float AMBIENT_STRENGTH = 0.08; // Low ambient for darker atmosphere +const float LIGHT_INTENSITY = 0.9; +const float AMBIENT_STRENGTH = 0.22; // Boost ambient to preserve surface color float calculateAttenuation(float distance) { // Quadratic attenuation: 1 / (constant + linear*d + quadratic*d^2) diff --git a/shaders/solid.frag.spv b/shaders/solid.frag.spv index b11bf6308746c24d62db9575f90a1eaedca78946..914c61365e8c5ee0562745b4d334c4e14e2a9312 100644 GIT binary patch delta 104 zcmew$@<4=_nMs+Qfq{{Mn}LI&Xd`bj6U#dHM7zx;OdL!qX=!Qp+6*iVYzzzxAwaAd q;}7SD0{MluT=tU}u%t-Nnki|o15_pj5(Hu%APxrNg3Y?D&a42^?-5e~ delta 120 zcmaDL@nteKMbIzVkwKz0!j^8j%H5EpKiWp!o+0L+sX Am;e9( diff --git a/shaders/wall.frag b/shaders/wall.frag new file mode 100644 index 0000000..71c2b9f --- /dev/null +++ b/shaders/wall.frag @@ -0,0 +1,46 @@ +#version 450 + +layout(location = 0) in vec3 fragColor; +layout(location = 1) in vec3 fragWorldPos; +layout(location = 0) out vec4 outColor; + +const vec3 LIGHT_POSITIONS[8] = vec3[8]( + vec3(13.0, 4.5, 13.0), + vec3(-13.0, 4.5, 13.0), + vec3(13.0, 4.5, -13.0), + vec3(-13.0, 4.5, -13.0), + vec3(0.0, 4.5, 13.0), + vec3(0.0, 4.5, -13.0), + vec3(13.0, 4.5, 0.0), + vec3(-13.0, 4.5, 0.0) +); + +const vec3 LIGHT_COLOR = vec3(1.0, 0.88, 0.6); +const float LIGHT_INTENSITY = 0.95; +const float AMBIENT_STRENGTH = 0.24; + +float calculateAttenuation(float distance) { + const float kConstant = 1.0; + const float kLinear = 0.09; + const float kQuadratic = 0.032; + return 1.0 / (kConstant + kLinear * distance + kQuadratic * distance * distance); +} + +void main() { + vec3 baseColor = clamp(fragColor * 1.05, 0.0, 1.0); + vec3 ambient = AMBIENT_STRENGTH * baseColor; + vec3 lighting = vec3(0.0); + + for (int i = 0; i < 8; i++) { + vec3 lightDir = LIGHT_POSITIONS[i] - fragWorldPos; + float distance = length(lightDir); + lightDir = normalize(lightDir); + float attenuation = calculateAttenuation(distance); + lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation; + } + + vec3 finalColor = ambient + baseColor * lighting; + finalColor = clamp(finalColor, 0.0, 1.0); + + outColor = vec4(finalColor, 1.0); +} diff --git a/shaders/wall.frag.spv b/shaders/wall.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..1ecb352a8ce876ab2f9b7ed0abba4d63bf33f332 GIT binary patch literal 2852 zcmZ9NS#y+C5QYy~FeG6KYoQS*paBJ=7*;VGi*bpVh=RL*NhV=*G6R{3qE}cJ7FX)6 z{s^nQ^H%gs;qUQVCW=X}%Iapa+twxqt)lfF!?-$3esNpM?p zJw0=6W~9+v965FRStE9&&OFeVo#b_)m6fbg({Tv7irhwa5vz|yusW%n(gPB^VcT=M z)3(%$Zy~ELtW~pSd8*kg*VeLTrCvL>bn*f&a*Rr8vC?Q}wS{tUgBbH!qkO4et*;hw z_OP^?EpKpLX&5eBnXi;<&AirA;A&<0X0uXT#)RukBj`$Qcc=5{+<&=Z**xb}bfvaf zzLU*YZJ?Voa<8s+qrO^QoUJ#2dF&i|bFbIovW=|~*OhL--O5(8l_Jl&OO;wyEt+@V zo@ITl8QV$Idjj_3IM$>?_iY>d1*;wG`l`!(XGK$A$s1%DAP z^7RLQ30rKuI{3@jhmp;7uC(!!*b)CCcGNd7_-X7(#5yg$FW>)5VE1Id7ZLk#P3v3B zJZJC<+8KCeF?;Xt79`H#UF^}(#`^5v10U?VzK-7q-}`M~B6|7&Y>sjItmAAK5bJs; z>uBfVx5qwip}n8-_96D&$VDHYWB)Xrt*?6r{NoP?*Vp|5+>aQi?+ov?1MM3Ato0{M zH`+CP2ZM3Z){bC1`;g!thx0r(q$jWO1YB#rt$OAgJI)Dt9{OYbW7u-B{*%~p zM-k&aFF9?`%6G5rIr*0V;=KK{^4!&bu&?LPqliEKr_lPA9Nne+49)#f|1dBk(SOTKuq;1yvB06V5NzU&0=4!^_y-z3|_}wugH~e-&(F?a{a$1@D=PcOu&h-ZPckg}9!+ t$lHx=y~x{xJ%GqZ%wFvFn0;X5