Sprites now have a distance lighting calculation that's the same as the raycaster using a shader.

master
Zed A. Shaw 2 months ago
parent a19bc47904
commit 3986e6978e
  1. 5
      gui.cpp
  2. 13
      raycaster.cpp
  3. 3
      raycaster.hpp
  4. 8
      shaders/modal.frag

@ -1,4 +1,3 @@
#define FSM_DEBUG 1
#include "gui.hpp" #include "gui.hpp"
#include <iostream> #include <iostream>
#include <chrono> #include <chrono>
@ -41,8 +40,8 @@ namespace gui {
} }
void FSM::START(Event ) { void FSM::START(Event ) {
// ZED: this must die
generate_map(); generate_map();
$rayview.init_shaders();
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y); $rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
$rayview.position_camera($player.x + 0.5, $player.y + 0.5); $rayview.position_camera($player.x + 0.5, $player.y + 0.5);
state(State::IDLE); state(State::IDLE);
@ -199,7 +198,7 @@ namespace gui {
$stats.sample(1/elapsed.count()); $stats.sample(1/elapsed.count());
draw_gui(); draw_gui();
draw_weapon(); // draw_weapon();
$window.display(); $window.display();
} }

@ -136,7 +136,11 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) {
$anim.step(*sf_sprite, texX, texY, texX_end - texX, textureHeight); $anim.step(*sf_sprite, texX, texY, texX_end - texX, textureHeight);
sf_sprite->setPosition({x, y}); 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);
}

@ -13,7 +13,7 @@ using RGBA = uint32_t;
struct Raycaster { struct Raycaster {
int $pitch=0; int $pitch=0;
sf::Clock $clock; sf::Clock $clock;
sf::Shader $brightness;
TexturePack &$textures; TexturePack &$textures;
double $posX = 0; double $posX = 0;
double $posY = 0; double $posY = 0;
@ -56,4 +56,5 @@ struct Raycaster {
} }
void set_level(GameLevel level); void set_level(GameLevel level);
void init_shaders();
}; };

@ -1,6 +1,6 @@
uniform sampler2D source; uniform sampler2D source;
uniform sampler2D bloom; uniform sampler2D bloom;
uniform vec2 offsetFactor; uniform vec2 offsetFactor;
uniform float darkness; uniform float darkness;
void main() void main()
@ -19,5 +19,7 @@ void main()
vec4 sourceFragment = texture2D(source, gl_TexCoord[0].xy); vec4 sourceFragment = texture2D(source, gl_TexCoord[0].xy);
vec4 bloomFragment = texture2D(bloom, 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;
} }

Loading…
Cancel
Save