From 3986e6978e195e069c34ec1476f293160ffb6208 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Fri, 7 Feb 2025 13:50:50 -0500 Subject: [PATCH] Sprites now have a distance lighting calculation that's the same as the raycaster using a shader. --- gui.cpp | 5 ++--- raycaster.cpp | 13 ++++++++++++- raycaster.hpp | 3 ++- shaders/modal.frag | 8 +++++--- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/gui.cpp b/gui.cpp index c578a45..28472d8 100644 --- a/gui.cpp +++ b/gui.cpp @@ -1,4 +1,3 @@ -#define FSM_DEBUG 1 #include "gui.hpp" #include #include @@ -41,8 +40,8 @@ namespace gui { } void FSM::START(Event ) { - // ZED: this must die generate_map(); + $rayview.init_shaders(); $rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y); $rayview.position_camera($player.x + 0.5, $player.y + 0.5); state(State::IDLE); @@ -199,7 +198,7 @@ namespace gui { $stats.sample(1/elapsed.count()); draw_gui(); - draw_weapon(); + // draw_weapon(); $window.display(); } diff --git a/raycaster.cpp b/raycaster.cpp index a0eb5c7..346691f 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -136,7 +136,11 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) { $anim.step(*sf_sprite, texX, texY, texX_end - texX, textureHeight); sf_sprite->setPosition({x, y}); - target.draw(*sf_sprite); + $brightness.setUniform("offsetFactor", sf::Glsl::Vec2{0.0f, 0.0f}); + + float level = sqrt(rec.first); + $brightness.setUniform("darkness", level); + target.draw(*sf_sprite, &$brightness); } } } @@ -351,3 +355,10 @@ void Raycaster::set_level(GameLevel level) { } }); } + +void Raycaster::init_shaders() { + dbc::check(sf::Shader::isAvailable(), "no shaders?!"); + bool good = $brightness.loadFromFile("shaders/modal.frag", sf::Shader::Type::Fragment); + dbc::check(good, "shader could not be loaded"); + $brightness.setUniform("source", sf::Shader::CurrentTexture); +} diff --git a/raycaster.hpp b/raycaster.hpp index 01dc31a..b676a2d 100644 --- a/raycaster.hpp +++ b/raycaster.hpp @@ -13,7 +13,7 @@ using RGBA = uint32_t; struct Raycaster { int $pitch=0; sf::Clock $clock; - + sf::Shader $brightness; TexturePack &$textures; double $posX = 0; double $posY = 0; @@ -56,4 +56,5 @@ struct Raycaster { } void set_level(GameLevel level); + void init_shaders(); }; diff --git a/shaders/modal.frag b/shaders/modal.frag index 9c1a9b2..5045658 100644 --- a/shaders/modal.frag +++ b/shaders/modal.frag @@ -1,6 +1,6 @@ -uniform sampler2D source; +uniform sampler2D source; uniform sampler2D bloom; -uniform vec2 offsetFactor; +uniform vec2 offsetFactor; uniform float darkness; void main() @@ -19,5 +19,7 @@ void main() vec4 sourceFragment = texture2D(source, gl_TexCoord[0].xy); vec4 bloomFragment = texture2D(bloom, gl_TexCoord[0].xy); - gl_FragColor = color + sourceFragment - bloomFragment - darkness; + float alpha = color.a; + gl_FragColor = (color + sourceFragment - bloomFragment) / darkness; + gl_FragColor.a = alpha; }