Refactor the raycaster to separate update from render.
This commit is contained in:
parent
36efdc91aa
commit
dd3952d5c1
3 changed files with 22 additions and 11 deletions
|
|
@ -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& lights = $level.lights->lighting();
|
||||||
auto world = $level.world;
|
auto world = $level.world;
|
||||||
$level.collision->distance_sorted($sprite_order, {(size_t)$pos_x, (size_t)$pos_y}, RENDER_DISTANCE);
|
$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
|
// after sorting the sprites, do the projection
|
||||||
for(auto& rec : $sprite_order) {
|
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 texture_height =(float)sprite_texture.frame_size.y;
|
||||||
int half_height = texture_height / 2;
|
int half_height = texture_height / 2;
|
||||||
|
|
||||||
auto& sf_sprite = sprite_texture.sprite;
|
auto sf_sprite = sprite_texture.sprite;
|
||||||
auto sprite_pos = world->get<components::Position>(rec.entity);
|
auto sprite_pos = world->get<components::Position>(rec.entity);
|
||||||
|
|
||||||
double sprite_x = double(sprite_pos.location.x) - rec.wiggle - $pos_x + 0.5;
|
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);
|
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();
|
draw_ceiling_floor();
|
||||||
cast_rays();
|
cast_rays();
|
||||||
draw_pixel_buffer();
|
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);
|
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) {
|
void Raycaster::update_sprite(DinkyECS::Entity ent, components::Sprite& sprite) {
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,8 @@ struct CameraLOL {
|
||||||
double target_plane_y = 0.0;
|
double target_plane_y = 0.0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using SpriteRender = std::pair<std::shared_ptr<sf::Sprite>, std::shared_ptr<sf::Shader>>;
|
||||||
|
|
||||||
struct Raycaster {
|
struct Raycaster {
|
||||||
int $pitch=0;
|
int $pitch=0;
|
||||||
sf::Clock $clock;
|
sf::Clock $clock;
|
||||||
|
|
@ -48,6 +50,8 @@ struct Raycaster {
|
||||||
int $screen_pos_x = RAY_VIEW_X;
|
int $screen_pos_x = RAY_VIEW_X;
|
||||||
int $screen_pos_y = RAY_VIEW_Y;
|
int $screen_pos_y = RAY_VIEW_Y;
|
||||||
std::unordered_map<DinkyECS::Entity, textures::SpriteTexture> $sprites;
|
std::unordered_map<DinkyECS::Entity, textures::SpriteTexture> $sprites;
|
||||||
|
// BUG: this can be way better I think
|
||||||
|
std::vector<SpriteRender> $sprites_to_render;
|
||||||
SortedEntities $sprite_order;
|
SortedEntities $sprite_order;
|
||||||
|
|
||||||
GameDB::Level $level;
|
GameDB::Level $level;
|
||||||
|
|
@ -60,9 +64,9 @@ struct Raycaster {
|
||||||
void cast_rays();
|
void cast_rays();
|
||||||
void draw_ceiling_floor();
|
void draw_ceiling_floor();
|
||||||
void draw_pixel_buffer();
|
void draw_pixel_buffer();
|
||||||
void sprite_casting(sf::RenderTarget& target);
|
void sprite_casting();
|
||||||
void render();
|
void update();
|
||||||
void draw(sf::RenderTarget& target);
|
void render(sf::RenderTarget& target);
|
||||||
|
|
||||||
void sort_sprites(std::vector<int>& order, std::vector<double>& dist, int amount);
|
void sort_sprites(std::vector<int>& order, std::vector<double>& dist, int amount);
|
||||||
void set_position(int x, int y);
|
void set_position(int x, int y);
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,9 @@ namespace gui {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainUI::render() {
|
void MainUI::render() {
|
||||||
if($needs_render) $rayview->render();
|
// BUG: bring back the $needs_render optimization
|
||||||
$rayview->draw($window);
|
$rayview->update();
|
||||||
|
$rayview->render($window);
|
||||||
|
|
||||||
if($mind_reading) render_mind_reading();
|
if($mind_reading) render_mind_reading();
|
||||||
$overlay_ui.render($window);
|
$overlay_ui.render($window);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue