#pragma once #include #include #include #include #include #include #include "matrix.hpp" #include #include #include "dbc.hpp" #include using matrix::Matrix; #define TEXTURE_WIDTH 256 // must be power of two #define TEXTURE_HEIGHT 256 // must be power of two #define NUM_SPRITES 1 #define NUM_TEXTURES 11 struct Sprite { double x; double y; int texture; // ZED: this should be a separate transform parameter double elevation=0; int uDiv=1; int vDiv=1; }; #define RAY_VIEW_WIDTH 960 #define RAY_VIEW_HEIGHT 720 #define RAY_VIEW_X (1280 - RAY_VIEW_WIDTH) #define RAY_VIEW_Y 0 using RGBA = uint32_t; struct TexturePack { std::vector texture[NUM_TEXTURES]; std::vector SPRITE{{4.0, 3.55, 8}}; const int floor = 3; const int ceiling = 6; void load_textures(); void load_image(std::vector& texture, const char *filename); Sprite &get_sprite(size_t sprite_num); std::vector& get(size_t num); }; struct Raycaster { int $width=RAY_VIEW_WIDTH; int $height=RAY_VIEW_HEIGHT; 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; //ZED allocate this on the heap std::array ZBuffer; //ZED: USE smart pointer for this std::unique_ptr pixels = nullptr; //ZED: heap too? int spriteOrder[NUM_SPRITES]; double spriteDistance[NUM_SPRITES]; sf::Texture view_texture; sf::Sprite view_sprite; sf::RenderWindow& $window; Matrix& $map; int PITCH=0; Raycaster(sf::RenderWindow& window, Matrix &map); void draw_pixel_buffer(); void clear(); void cast_rays(); void sprite_casting(); void draw_ceiling_floor(); void render(); bool empty_space(int new_x, int new_y); void sort_sprites(int* order, double* dist, int amount); // ZED these can be one or two functions void run(double speed, int dir); void rotate(double speed, int dir); void position_camera(float player_x, float player_y); };