diff --git a/src/graphics/raycaster.cpp b/src/graphics/raycaster.cpp index fe2bb10..cb76218 100644 --- a/src/graphics/raycaster.cpp +++ b/src/graphics/raycaster.cpp @@ -117,10 +117,11 @@ inline void set_scale_position(sf::Sprite& sprite, sf::Vector2f& position, sf::V } -void Raycaster::sprite_casting(sf::RenderTarget &target) { +void Raycaster::sprite_casting() { auto& lights = $level.lights->lighting(); auto world = $level.world; $level.collision->distance_sorted($sprite_order, {(size_t)$pos_x, (size_t)$pos_y}, RENDER_DISTANCE); + $sprites_to_render.clear(); // after sorting the sprites, do the projection for(auto& rec : $sprite_order) { @@ -132,7 +133,7 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) { int texture_height =(float)sprite_texture.frame_size.y; int half_height = texture_height / 2; - auto& sf_sprite = sprite_texture.sprite; + auto sf_sprite = sprite_texture.sprite; auto sprite_pos = world->get(rec.entity); double sprite_x = double(sprite_pos.location.x) - rec.wiggle - $pos_x + 0.5; @@ -226,7 +227,7 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) { set_scale_position(*sf_sprite, position, scale, in_texture, origin); } - target.draw(*sf_sprite, effect.get()); + $sprites_to_render.emplace_back(sf_sprite, effect); } } } @@ -427,15 +428,20 @@ void Raycaster::draw_ceiling_floor() { } } -void Raycaster::render() { +void Raycaster::update() { draw_ceiling_floor(); cast_rays(); draw_pixel_buffer(); + sprite_casting(); } -void Raycaster::draw(sf::RenderTarget& target) { +// BUG: if target is a rendertarget then I can say it has to be the viewport only, then I can get rid of $screen_pos_x/y +void Raycaster::render(sf::RenderTarget& target) { target.draw($view_sprite); - sprite_casting(target); + + for(auto [sprite, effect] : $sprites_to_render) { + target.draw(*sprite, effect.get()); + } } void Raycaster::update_sprite(DinkyECS::Entity ent, components::Sprite& sprite) { diff --git a/src/graphics/raycaster.hpp b/src/graphics/raycaster.hpp index a63212e..3209326 100644 --- a/src/graphics/raycaster.hpp +++ b/src/graphics/raycaster.hpp @@ -21,6 +21,8 @@ struct CameraLOL { double target_plane_y = 0.0; }; +using SpriteRender = std::pair, std::shared_ptr>; + struct Raycaster { int $pitch=0; sf::Clock $clock; @@ -48,6 +50,8 @@ struct Raycaster { int $screen_pos_x = RAY_VIEW_X; int $screen_pos_y = RAY_VIEW_Y; std::unordered_map $sprites; + // BUG: this can be way better I think + std::vector $sprites_to_render; SortedEntities $sprite_order; GameDB::Level $level; @@ -60,9 +64,9 @@ struct Raycaster { void cast_rays(); void draw_ceiling_floor(); void draw_pixel_buffer(); - void sprite_casting(sf::RenderTarget& target); - void render(); - void draw(sf::RenderTarget& target); + void sprite_casting(); + void update(); + void render(sf::RenderTarget& target); void sort_sprites(std::vector& order, std::vector& dist, int amount); void set_position(int x, int y); diff --git a/src/gui/main_ui.cpp b/src/gui/main_ui.cpp index b25fc4e..1805f22 100644 --- a/src/gui/main_ui.cpp +++ b/src/gui/main_ui.cpp @@ -38,8 +38,9 @@ namespace gui { } void MainUI::render() { - if($needs_render) $rayview->render(); - $rayview->draw($window); + // BUG: bring back the $needs_render optimization + $rayview->update(); + $rayview->render($window); if($mind_reading) render_mind_reading(); $overlay_ui.render($window);