Had to fix the rendering so that each sprite is rendered separately in sprite_casting during the render phase.

This commit is contained in:
Zed A. Shaw 2026-03-30 10:51:21 -04:00
parent d22eaa554d
commit dfc86452fc
3 changed files with 9 additions and 10 deletions

View file

@ -203,6 +203,10 @@ void WorldBuilder::configure_starting_items(DinkyECS::World &world) {
auto healing = System::spawn_item(world, "REPAIR_KIT");
inventory.add("inv0", healing);
healing = System::spawn_item(world, "REPAIR_KIT");
inventory.add("inv1", healing);
world.make_constant(healing);
}

View file

@ -121,7 +121,7 @@ inline void set_scale_position(sf::Sprite& sprite, sf::Vector2f& position, sf::V
}
void Raycaster::sprite_casting() {
void Raycaster::sprite_casting(sf::RenderTarget& target) {
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);
@ -212,7 +212,6 @@ void Raycaster::sprite_casting() {
sf::Vector2f scale{sprite_scale_w, sprite_scale_h};
sf::Vector2f position{x + origin.x * scale.x, y + origin.y * scale.y};
sf::IntRect in_texture{ {tex_x, tex_y}, {tex_render_width, texture_height}};
shared_ptr<sf::Shader> effect = System::sprite_effect(rec.entity);
if(effect) {
@ -231,7 +230,7 @@ void Raycaster::sprite_casting() {
set_scale_position(*sf_sprite, position, scale, in_texture, origin);
}
$sprites_to_render.emplace_back(sf_sprite, effect);
target.draw(*sf_sprite, effect.get());
}
}
}
@ -438,16 +437,12 @@ void Raycaster::update() {
draw_ceiling_floor();
cast_rays();
draw_pixel_buffer();
sprite_casting();
}
// 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);
for(auto [sprite, effect] : $sprites_to_render) {
target.draw(*sprite, effect.get());
}
sprite_casting(target);
}
void Raycaster::update_sprite(DinkyECS::Entity ent, components::Sprite& sprite) {

View file

@ -21,7 +21,7 @@ struct CameraLOL {
double target_plane_y = 0.0;
};
using SpriteRender = std::pair<std::shared_ptr<sf::Sprite>, std::shared_ptr<sf::Shader>>;
using SpriteRender = std::pair<sf::Sprite, std::shared_ptr<sf::Shader>>;
struct Raycaster {
sf::Texture $view_texture;
@ -64,7 +64,7 @@ struct Raycaster {
void cast_rays();
void draw_ceiling_floor();
void draw_pixel_buffer();
void sprite_casting();
void sprite_casting(sf::RenderTarget& target);
void update();
void render(sf::RenderTarget& target);