diff --git a/src/ragar/ragar_main.c b/src/ragar/ragar_main.c index eb983c3..75fb1a5 100644 --- a/src/ragar/ragar_main.c +++ b/src/ragar/ragar_main.c @@ -10,9 +10,21 @@ #define POINTS (9 * 9 * 9) Vec3F32 cube_points[POINTS]; Vec2F32 g_projected_points[POINTS]; +Vec3F32 camera_position = {.x = 0, .y = 0, .z = -5}; int is_running; +// Perspective Projection +// Perspective divide formula +// P'x = Px/Pz +// +// P'y = Py/Pz +Vec2F32 perspective_projection(Vec3F32 points) { + Vec2F32 projected_point = {.x = (field_of_view_factor * points.x) / points.z, + .y = (field_of_view_factor * points.y) / points.z}; + return projected_point; +} + // Orthographic Projection - convert 3D points into a 2D projected point Vec2F32 orthographic_projection(Vec3F32 points) { Vec2F32 projected_point = {.x = (field_of_view_factor * points.x), .y = (field_of_view_factor * points.y)}; @@ -58,8 +70,11 @@ void update(void) { for (s32 i = 0; i < POINTS; i++) { Vec3F32 point = cube_points[i]; + // Move things away from the camera + point.z -= camera_position.z; + // Project the current point - Vec2F32 projected_point = orthographic_projection(point); + Vec2F32 projected_point = perspective_projection(point); // Save the projected 2D vector in the global array of projected points g_projected_points[i] = projected_point; diff --git a/src/renderer/display.c b/src/renderer/display.c index d960f40..03d5f82 100644 --- a/src/renderer/display.c +++ b/src/renderer/display.c @@ -10,8 +10,8 @@ int initialize_window(void) { // window_width = display_mode.w; // window_height = display_mode.h; - window = SDL_CreateWindow("Ragar: 3D Software Renderer", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - window_width, window_height, 0); + window = SDL_CreateWindow("Ragar: 3D Software Renderer", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, window_width, + window_height, 0); if (!window) { fprintf(stderr, "SDL could not create a window.\n"); return false; diff --git a/src/renderer/display.h b/src/renderer/display.h index bf7eb3a..0e53977 100644 --- a/src/renderer/display.h +++ b/src/renderer/display.h @@ -9,7 +9,7 @@ SDL_Texture *colour_buffer_texture = NULL; global s32 window_width = 800; global s32 window_height = 600; -global f32 field_of_view_factor = 128; +global f32 field_of_view_factor = 940; global u32 *colour_buffer; int initialize_window(void);