|
|
|
@ -23,26 +23,23 @@ Matrix MAP{ |
|
|
|
|
{8,8,8,8,8,8,8,8,8} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const int SCREEN_HEIGHT=480; |
|
|
|
|
const int SCREEN_WIDTH=SCREEN_HEIGHT * 2; |
|
|
|
|
const int RAY_VIEW_WIDTH=1920; |
|
|
|
|
const int RAY_VIEW_HEIGHT=1080; |
|
|
|
|
const int RAY_VIEW_X=0; |
|
|
|
|
const int RAY_VIEW_Y=0; |
|
|
|
|
|
|
|
|
|
const int SCREEN_HEIGHT=RAY_VIEW_HEIGHT; |
|
|
|
|
const int SCREEN_WIDTH=1920; |
|
|
|
|
|
|
|
|
|
const int THREED_VIEW_WIDTH=480; |
|
|
|
|
const int THREED_VIEW_HEIGHT=480; |
|
|
|
|
const int MAP_SIZE=matrix::width(MAP); |
|
|
|
|
const int TILE_SIZE=(SCREEN_WIDTH/2) / MAP_SIZE; |
|
|
|
|
const float FOV = std::numbers::pi / 3.0; |
|
|
|
|
const float HALF_FOV = FOV / 2; |
|
|
|
|
const int CASTED_RAYS=120; |
|
|
|
|
const float STEP_ANGLE = FOV / CASTED_RAYS; |
|
|
|
|
const int MAX_DEPTH = MAP_SIZE * TILE_SIZE; |
|
|
|
|
const float SCALE = (SCREEN_WIDTH / 2) / CASTED_RAYS; |
|
|
|
|
const int TILE_SIZE=RAY_VIEW_HEIGHT / MAP_SIZE; |
|
|
|
|
int PITCH=0; |
|
|
|
|
// I chose fixed textures for this instead
|
|
|
|
|
const int floorTexture = 3; |
|
|
|
|
const int ceilingTexture = 6; |
|
|
|
|
|
|
|
|
|
float player_x = SCREEN_WIDTH / 4; |
|
|
|
|
float player_y = SCREEN_WIDTH / 4; |
|
|
|
|
float player_x = RAY_VIEW_HEIGHT / 2; |
|
|
|
|
float player_y = RAY_VIEW_HEIGHT / 2; |
|
|
|
|
|
|
|
|
|
// x and y start position
|
|
|
|
|
double posX = player_x / TILE_SIZE; |
|
|
|
@ -63,9 +60,9 @@ std::vector<uint32_t> texture[8]; |
|
|
|
|
#define texWidth 256 // must be power of two
|
|
|
|
|
#define texHeight 256 // must be power of two
|
|
|
|
|
|
|
|
|
|
#define pixcoord(X, Y) ((Y) * SCREEN_HEIGHT) + (X) |
|
|
|
|
#define pixcoord(X, Y) ((Y) * RAY_VIEW_WIDTH) + (X) |
|
|
|
|
|
|
|
|
|
uint32_t pixels[SCREEN_HEIGHT * SCREEN_HEIGHT] = {0}; |
|
|
|
|
uint32_t pixels[RAY_VIEW_WIDTH * RAY_VIEW_HEIGHT] = {0}; |
|
|
|
|
|
|
|
|
|
sf::Texture view_texture; |
|
|
|
|
sf::Sprite view_sprite; |
|
|
|
@ -100,22 +97,8 @@ void draw_sfml_rect(sf::RenderWindow &window, sf::Vector2f pos, sf::Vector2f siz |
|
|
|
|
window.draw(rect); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void draw_pixel_rect(sf::RenderWindow &window, Point pos, Point size, uint32_t color) { |
|
|
|
|
size_t x_start = size_t(pos.x - SCREEN_HEIGHT); |
|
|
|
|
size_t y_start = size_t(pos.y); |
|
|
|
|
size_t width = size_t(size.x); |
|
|
|
|
size_t height = size_t(size.y); |
|
|
|
|
|
|
|
|
|
for(size_t y = y_start; y < y_start + height; y++) { |
|
|
|
|
for(size_t x = x_start; x < x_start + width; x++) { |
|
|
|
|
size_t pixel_index = (y * SCREEN_HEIGHT) + x; |
|
|
|
|
pixels[pixel_index] = color; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void draw_pixel_buffer(sf::RenderWindow &window) { |
|
|
|
|
view_texture.update((uint8_t *)pixels, SCREEN_HEIGHT, SCREEN_HEIGHT, 0, 0); |
|
|
|
|
view_texture.update((uint8_t *)pixels, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT, 0, 0); |
|
|
|
|
// BUG: can I do this once and just update it?
|
|
|
|
|
window.draw(view_sprite); |
|
|
|
|
} |
|
|
|
@ -167,7 +150,7 @@ void draw_line(sf::RenderWindow &window, Point start, Point end, uint32_t color) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void clear(sf::RenderWindow &window) { |
|
|
|
|
std::fill_n(pixels, SCREEN_HEIGHT * SCREEN_HEIGHT, 0); |
|
|
|
|
std::fill_n(pixels, RAY_VIEW_WIDTH * RAY_VIEW_HEIGHT, 0); |
|
|
|
|
window.clear(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -176,8 +159,8 @@ void draw_map_blocks(sf::RenderWindow &window, int col, int row) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ray_casting(sf::RenderWindow &window, Matrix& map) { |
|
|
|
|
int w = THREED_VIEW_WIDTH; |
|
|
|
|
int h = THREED_VIEW_HEIGHT; |
|
|
|
|
int w = RAY_VIEW_WIDTH; |
|
|
|
|
int h = RAY_VIEW_HEIGHT; |
|
|
|
|
|
|
|
|
|
for(int x = 0; x < w; x++) { |
|
|
|
|
// calculate ray position and direction
|
|
|
|
@ -241,9 +224,7 @@ void ray_casting(sf::RenderWindow &window, Matrix& map) { |
|
|
|
|
perpWallDist = (sideDistY - deltaDistY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
draw_map_blocks(window, mapX, mapY); |
|
|
|
|
|
|
|
|
|
// TODO: player direction ray
|
|
|
|
|
// draw_map_blocks(window, mapX, mapY);
|
|
|
|
|
|
|
|
|
|
int lineHeight = int(h / perpWallDist); |
|
|
|
|
|
|
|
|
@ -287,8 +268,8 @@ void ray_casting(sf::RenderWindow &window, Matrix& map) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void draw_ceiling_floor(sf::RenderWindow &window) { |
|
|
|
|
int screenHeight = THREED_VIEW_HEIGHT; |
|
|
|
|
int screenWidth = THREED_VIEW_HEIGHT; |
|
|
|
|
int screenHeight = RAY_VIEW_HEIGHT; |
|
|
|
|
int screenWidth = RAY_VIEW_WIDTH; |
|
|
|
|
|
|
|
|
|
for(int y = screenHeight / 2 + 1; y < screenHeight; ++y) { |
|
|
|
|
// rayDir for leftmost ray (x=0) and rightmost (x = w)
|
|
|
|
@ -353,7 +334,7 @@ void draw_ceiling_floor(sf::RenderWindow &window) { |
|
|
|
|
|
|
|
|
|
void draw_everything(sf::RenderWindow &window) { |
|
|
|
|
clear(window); |
|
|
|
|
draw_map(window, MAP); |
|
|
|
|
// draw_map(window, MAP);
|
|
|
|
|
draw_ceiling_floor(window); |
|
|
|
|
ray_casting(window, MAP); |
|
|
|
|
draw_pixel_buffer(window); |
|
|
|
@ -374,9 +355,9 @@ int main() { |
|
|
|
|
sf::RenderWindow window(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "SFMLCaster"); |
|
|
|
|
|
|
|
|
|
window.setVerticalSyncEnabled(true); |
|
|
|
|
view_texture.create(SCREEN_HEIGHT, SCREEN_HEIGHT); |
|
|
|
|
view_texture.create(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT); |
|
|
|
|
view_sprite.setTexture(view_texture); |
|
|
|
|
view_sprite.setPosition(THREED_VIEW_WIDTH, 0); |
|
|
|
|
view_sprite.setPosition(RAY_VIEW_X, 0); |
|
|
|
|
|
|
|
|
|
load_textures(); |
|
|
|
|
|
|
|
|
|