diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 8a5c30e6..e7b6aa3f 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -2019,7 +2019,7 @@ void V_TickForever(WaveLaneCtx *lane) - if (0) + // if (0) { for (P_Ent *bullet = P_FirstEnt(local_frame); !P_IsEntNil(bullet); bullet = P_NextEnt(bullet)) { diff --git a/src/pp/pp_vis/pp_vis_gpu.g b/src/pp/pp_vis/pp_vis_gpu.g index 8b1e4e2a..c02dfe88 100644 --- a/src/pp/pp_vis/pp_vis_gpu.g +++ b/src/pp/pp_vis/pp_vis_gpu.g @@ -75,6 +75,46 @@ ComputeShader(V_ClearParticlesCS, 64) } } +//////////////////////////////////////////////////////////// +//~ Quads + +////////////////////////////// +//- Vertex shader + +VertexShader(V_QuadVS, V_QuadPSInput) +{ + V_GpuParams params = G_Dereference(V_ShaderConst_Params)[0]; + StructuredBuffer quads = G_Dereference(params.quads); + + V_Quad quad = quads[SV_InstanceID]; + + Vec2 rect_uv = RectUvFromVertexId(SV_VertexID); + // Vec2 tex_uv = lerp(quad.tex_uv0, quad.tex_uv1, rect_uv); + // Vec2 screen_pos = lerp(quad.p0, quad.p1, rect_uv); + Vec2 screen_pos = 0; + + V_QuadPSInput result; + result.sv_position = Vec4(NdcFromPos(screen_pos, params.screen_dims).xy, 0, 1); + result.quad_idx = SV_InstanceID; + return result; +} + +////////////////////////////// +//- Pixel shader + +PixelShader(V_QuadPS, V_QuadPSOutput, V_QuadPSInput input) +{ + V_GpuParams params = G_Dereference(V_ShaderConst_Params)[0]; + StructuredBuffer quads = G_Dereference(params.quads); + V_Quad quad = quads[input.quad_idx]; + + Vec4 final_color = 0; + + V_QuadPSOutput output; + output.sv_target0 = final_color; + return output; +} + //////////////////////////////////////////////////////////// //~ Backdrop @@ -285,46 +325,6 @@ ComputeShader(V_ClearParticlesCS, 64) // } // } -//////////////////////////////////////////////////////////// -//~ Quads - -////////////////////////////// -//- Vertex shader - -VertexShader(V_QuadVS, V_QuadPSInput) -{ - V_GpuParams params = G_Dereference(V_ShaderConst_Params)[0]; - StructuredBuffer quads = G_Dereference(params.quads); - - V_Quad quad = quads[SV_InstanceID]; - - Vec2 rect_uv = RectUvFromVertexId(SV_VertexID); - // Vec2 tex_uv = lerp(quad.tex_uv0, quad.tex_uv1, rect_uv); - // Vec2 screen_pos = lerp(quad.p0, quad.p1, rect_uv); - Vec2 screen_pos = 0; - - V_QuadPSInput result; - result.sv_position = Vec4(NdcFromPos(screen_pos, params.screen_dims).xy, 0, 1); - result.quad_idx = SV_InstanceID; - return result; -} - -////////////////////////////// -//- Pixel shader - -PixelShader(V_QuadPS, V_QuadPSOutput, V_QuadPSInput input) -{ - V_GpuParams params = G_Dereference(V_ShaderConst_Params)[0]; - StructuredBuffer quads = G_Dereference(params.quads); - V_Quad quad = quads[input.quad_idx]; - - Vec4 final_color = 0; - - V_QuadPSOutput output; - output.sv_target0 = final_color; - return output; -} - //////////////////////////////////////////////////////////// //~ Particle simulation @@ -484,6 +484,8 @@ ComputeShader2D(V_ShadeCS, 8, 8) RWTexture2D shade_tex = G_Dereference(params.shade_rw); Texture2D albedo_tex = G_Dereference(params.albedo_ro); Texture2D tiles = G_Dereference(params.tiles); + RWTexture2D stains = G_Dereference(params.stains); + RWTexture2D drynesses = G_Dereference(params.drynesses); SamplerState wrap_sampler = G_Dereference(params.pt_wrap_sampler); Vec2 shade_pos = SV_DispatchThreadID + Vec2(0.5, 0.5); @@ -571,10 +573,22 @@ ComputeShader2D(V_ShadeCS, 8, 8) } } + //- Albedo tex color + Vec4 albedo_tex_color = albedo_tex.Load(Vec3(shade_pos, 0)); + + //- Stain color + Vec4 stain_color = 0; + { + f32 dryness = drynesses.Load(cell_pos); + stain_color = V_DryColor(stains.Load(cell_pos), dryness); + stain_color.rgb *= 1.0 - (0.75 * tile_is_wall); // Darken wall stains + } + //- Composite albedo albedo = BlendPremul(!tile_is_wall * tile_color, albedo); // Blend floor tile - albedo = BlendPremul(albedo_tex.Load(Vec3(shade_pos, 0)), albedo); + albedo = BlendPremul(albedo_tex_color, albedo); albedo = BlendPremul(tile_is_wall * tile_color, albedo); // Blend wall tile + albedo = BlendPremul(stain_color, albedo); } ////////////////////////////// @@ -710,6 +724,7 @@ PixelShader(V_CompositePS, V_CompositePSOutput, V_CompositePSInput input) overlay_color = grid_color; } } + // Axis if (V_ShaderConst_GpuFlags & V_GpuFlag_DebugDraw) { @@ -728,6 +743,7 @@ PixelShader(V_CompositePS, V_CompositePSOutput, V_CompositePSInput input) overlay_color = y_axis_color; } } + // World bounds { const Vec4 bounds_color = LinearFromSrgb(Vec4(0.75, 0.75, 0, 1)); @@ -741,6 +757,7 @@ PixelShader(V_CompositePS, V_CompositePSOutput, V_CompositePSInput input) overlay_color = bounds_color; } } + // Premultiply overlay_color.rgb *= overlay_color.a; }