You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.5 KiB
64 lines
1.5 KiB
#pragma once
|
|
|
|
#include <SFML/Graphics.hpp>
|
|
#include <SFML/System/Clock.hpp>
|
|
#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<RGBA[]> $pixels = nullptr;
|
|
|
|
int $width;
|
|
int $height;
|
|
int $screen_pos_x = RAY_VIEW_X;
|
|
int $screen_pos_y = RAY_VIEW_Y;
|
|
std::unordered_map<DinkyECS::Entity, textures::SpriteTexture> $sprites;
|
|
|
|
GameLevel $level;
|
|
Matrix $map;
|
|
std::vector<double> $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<int>& order, std::vector<double>& 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();
|
|
};
|
|
|