#pragma once #include #include #include "spatialmap.hpp" #include "levelmanager.hpp" #include "textures.hpp" using matrix::Matrix; using RGBA = uint32_t; struct Raycaster { int $pitch=0; sf::Clock $clock; sf::Shader $brightness; double $pos_x = 0; double $pos_y = 0; // initial direction vector double $dir_x = 1; double $dir_y = 0; // the 2d raycaster version of camera plane double $plane_x = 0; double $plane_y = 0.66; sf::Texture $view_texture; sf::Sprite $view_sprite; const uint32_t *$floor_texture = nullptr; const uint32_t *$ceiling_texture = nullptr; std::unique_ptr $pixels = nullptr; int $width; int $height; int $screen_pos_x = RAY_VIEW_X; int $screen_pos_y = RAY_VIEW_Y; std::unordered_map $sprites; GameLevel $level; Matrix $map; std::vector $zbuffer; // width Raycaster(int width, int height); 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 sort_sprites(std::vector& order, std::vector& dist, int amount); void position_camera(float player_x, float player_y); void set_position(int x, int y); inline size_t pixcoord(int x, int y) { return ((y) * $width) + (x); } void update_level(GameLevel level); void update_sprite(DinkyECS::Entity ent, components::Sprite& sprite); void init_shaders(); };