Now rendering at 1080p with no map, and can render the raycasting side at arbitrary dimensions.
This commit is contained in:
parent
eee66720b7
commit
0828fb584e
1 changed files with 22 additions and 41 deletions
|
@ -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();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue