diff options
author | Tyler Murphy <tylerm@tylerm.dev> | 2023-04-22 21:47:58 -0400 |
---|---|---|
committer | Tyler Murphy <tylerm@tylerm.dev> | 2023-04-22 21:47:58 -0400 |
commit | f56f28c7218f465f4ad5579a6b0fe0f41ea13fd5 (patch) | |
tree | d96cd6845c56f9fd68cad404422bf4512ffbfc49 /src/renderer.c | |
parent | move raycastign to its own file (diff) | |
download | raycaster-f56f28c7218f465f4ad5579a6b0fe0f41ea13fd5.tar.gz raycaster-f56f28c7218f465f4ad5579a6b0fe0f41ea13fd5.tar.bz2 raycaster-f56f28c7218f465f4ad5579a6b0fe0f41ea13fd5.zip |
collision
Diffstat (limited to 'src/renderer.c')
-rw-r--r-- | src/renderer.c | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/src/renderer.c b/src/renderer.c index 6d8e1af..c64be51 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -3,14 +3,12 @@ #include "ray.h" #include <math.h> +#include <string.h> -#define PI 3.14159265358979323846 -#define PIH 1.57079632679489661923 -#define PI2 6.28318530718 void init_camera(Camera* camera) { - camera->x = 3; - camera->y = 3; + camera->pos.x = 3; + camera->pos.y = 3; camera->angle = PI / 4; } @@ -19,6 +17,8 @@ static double fov = PI / 4; #define MOVE_SPEED 1 #define ROTATE_SPEED PI / 2 #define FOV_CHANGE_SPEED 1 +#define PLAYER_SIZE .1 + void update_camera(Camera* camera, Screen* screen) { double rotate = 0; @@ -39,7 +39,7 @@ void update_camera(Camera* camera, Screen* screen) { v2 left = { forward.y, -forward.x }; v2 move = { 0, 0 }; - if (key_pressed(screen, SDL_SCANCODE_W)) { + if (key_pressed(screen, SDL_SCANCODE_W)) { move.x += forward.x; move.y += forward.y; } @@ -67,16 +67,17 @@ void update_camera(Camera* camera, Screen* screen) { fov -= FOV_CHANGE_SPEED * screen->delta; } - camera->x += move.x * MOVE_SPEED * screen->delta; - camera->y += move.y * MOVE_SPEED * screen->delta; -} + v2 hit_pos; + bool movex, movey; -v2 get_cam_right(const Camera* camera) { - v2 cam_right = { - -sin(camera->angle), - cos(camera->angle) - }; - return cam_right; + cast_ray(camera->pos, sign(move.x) == 1 ? 0 : PI, &hit_pos); + movex = v2_dist(hit_pos, camera->pos) > PLAYER_SIZE; + + cast_ray(camera->pos, sign(move.y) == 1 ? PIH : -PIH, &hit_pos); + movey = v2_dist(hit_pos, camera->pos) > PLAYER_SIZE; + + if (movex) camera->pos.x += move.x * MOVE_SPEED * screen->delta; + if (movey) camera->pos.y += move.y * MOVE_SPEED * screen->delta; } static void verline(Screen* screen, int x, int y0, int y1, uint32_t color) { @@ -85,29 +86,23 @@ static void verline(Screen* screen, int x, int y0, int y1, uint32_t color) { } } -#define min(a, b) ((a) < (b) ? (a) : (b)) -#define max(a, b) ((a) > (b) ? (a) : (b)) - void render(Screen* screen, const Camera* camera) { - const v2 pos = { - camera->x, - camera->y + const v2 cam_right = { + -sin(camera->angle), + cos(camera->angle) }; - const v2 cam_right = get_cam_right(camera); - - for (int sx = 0; sx < screen->width; sx++) { - - const float xcam = (2 * (sx / (float) (screen->width))) - 1; + for (int x = 0; x < screen->width; x++) { + const float xcam = (2 * (x / (float) (screen->width))) - 1; const float change = fov * atan(xcam); const float theta = camera->angle + change; v2 hit_pos; - uint32_t hit = cast_ray(pos, theta, &hit_pos); + uint32_t hit = cast_ray(camera->pos, theta, &hit_pos); - hit_pos.x -= pos.x; - hit_pos.y -= pos.y; + hit_pos.x -= camera->pos.x; + hit_pos.y -= camera->pos.y; float len = v2_cross(hit_pos, cam_right) / v2_len(cam_right); @@ -120,13 +115,14 @@ void render(Screen* screen, const Camera* camera) { case 5: color = 0x00FFFFFF; break; default: color = 0x000000FF; break; } + const int h = (int) (screen->height / len), y0 = max((screen->height / 2) - (h / 2), 0), y1 = min((screen->height / 2) + (h / 2), screen->height - 1); - verline(screen, sx, 0, y0, 0x202020FF); - verline(screen, sx, y0, y1, color); - verline(screen, sx, y1, screen->height - 1, 0x505050FF); + verline(screen, x, 0, y0, 0x202020FF); + verline(screen, x, y0, y1, color); + verline(screen, x, y1, screen->height - 1, 0x505050FF); } } |