#pragma once #include #include #include #include #include #include "matrix.hpp" #include #include #include "dbc.hpp" #include #include "texture.hpp" #include #include "animator.hpp" #include "spatialmap.hpp" using matrix::Matrix; using RGBA = uint32_t; struct Raycaster { int $pitch=0; sf::Clock $clock; TexturePack &$textures; double $posX = 0; double $posY = 0; // initial direction vector double $dirX = -1; double $dirY = 0; // the 2d raycaster version of camera plane double $planeX = 0; double $planeY = 0.66; sf::Texture $view_texture; sf::Sprite $view_sprite; std::unique_ptr $pixels = nullptr; int $width; int $height; sf::RenderWindow& $window; Matrix& $map; SpatialMap $collision; std::vector $sprites; std::vector ZBuffer; // width Animator $anim; sf::Shader $paused; sf::Shader* $active_shader = nullptr; Raycaster(sf::RenderWindow& window, TexturePack &textures, Matrix &map, int width, int height); void draw_pixel_buffer(); void clear(); void cast_rays(); void draw_ceiling_floor(); void sprite_casting(); void sort_sprites(std::vector& order, std::vector& dist, int amount); void render(); bool empty_space(int new_x, int new_y); void run(double speed, int dir); void rotate(double speed, int dir); void position_camera(float player_x, float player_y); void set_position(int x, int y); void init_shaders(); DinkyECS::Entity position_sprite(Point pos, string name); inline size_t pixcoord(int x, int y) { if(!(x >=0 && x < $width)) { dbc::sentinel(fmt::format("pixcoord x={} but $width={}", x, $width)); } if(!(y >= 0 && y < $height)) { dbc::sentinel(fmt::format("pixcoord y={} but $height={}", y, $height)); } return ((y) * $width) + (x); } };