From d38ce455afd950ef82ea1a296a9e6318d0cbac2d Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Sat, 13 Apr 2024 00:51:28 -0400 Subject: [PATCH] add a cube --- Makefile | 5 +- src/main.c | 135 +++++++++++++++++++++++++++-------------------------- 2 files changed, 71 insertions(+), 69 deletions(-) diff --git a/Makefile b/Makefile index 5a7f6c0..3700046 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,10 @@ SRCS = $(shell find ./src -type f -name *.c) build: gcc -Wall -std=c99 $(SRCS) -lSDL2 -o renderer + ./renderer run: build ./renderer clean: - rm renderer - -all: clean build run + rm renderer \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7b82d17..ca5944c 100644 --- a/src/main.c +++ b/src/main.c @@ -10,102 +10,105 @@ #define N_POINTS (9 * 9 * 9) vec3_t cube_points[N_POINTS]; vec2_t projected_points[N_POINTS]; -float fov_factor = 128; + +vec3_t camera_position = {0, 0, -5}; +float fov_factor = 640; bool is_running = false; void setup(void) { - // Allocate the required memory in bytes to hold color buffer - color_buffer = (uint32_t *) malloc(sizeof(uint32_t) * window_width * window_height); + // Allocate the required memory in bytes to hold color buffer + color_buffer = (uint32_t *) malloc(sizeof(uint32_t) * window_width * window_height); - // Creating the SDL Texture that is uses to display the color buffer - color_buffer_texture = SDL_CreateTexture( - renderer, - SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STREAMING, - window_width, - window_height - ); - int point_count = 0; - for (float x = -1; x <= 1; x += 0.25) { - for (float y = -1; y <= 1; y += 0.25) { - for (float z = -1; z <= 1; z += 0.25) { - vec3_t new_point = { .x = x, .y = y, .z = z }; - cube_points[point_count++] = new_point; - } - } - } + // Creating the SDL Texture that is uses to display the color buffer + color_buffer_texture = SDL_CreateTexture( + renderer, + SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STREAMING, + window_width, + window_height + ); + int point_count = 0; + for (float x = -1; x <= 1; x += 0.25) { + for (float y = -1; y <= 1; y += 0.25) { + for (float z = -1; z <= 1; z += 0.25) { + vec3_t new_point = { .x = x, .y = y, .z = z }; + cube_points[point_count++] = new_point; + } + } + } } void process_input(void) { - SDL_Event event; - SDL_PollEvent(&event); + SDL_Event event; + SDL_PollEvent(&event); - switch (event.type) { - case SDL_QUIT: - is_running = false; - break; - case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) { - is_running = false; - } - break; - } + switch (event.type) { + case SDL_QUIT: + is_running = false; + break; + case SDL_KEYDOWN: + if (event.key.keysym.sym == SDLK_ESCAPE) { + is_running = false; + } + break; + } } //////////////////////////////////////////////////////////////////////////////// // Function that receives a 3d Vector and returns a 2d projected point //////////////////////////////////////////////////////////////////////////////// vec2_t project(vec3_t point) { - vec2_t projected_point = { - .x = (fov_factor * point.x), - .y = (fov_factor * point.y), - }; - return projected_point; + vec2_t projected_point = { + .x = (fov_factor * point.x) / point.z, + .y = (fov_factor * point.y) / point.z, + }; + return projected_point; } void update(void) { - for (int i = 0; i < N_POINTS; i++){ - vec3_t point = cube_points[i]; - vec2_t projected_point = project(point); - - projected_points[i] = projected_point; - } + for (int i = 0; i < N_POINTS; i++){ + vec3_t point = cube_points[i]; + point.z -= camera_position.z; + vec2_t projected_point = project(point); + + projected_points[i] = projected_point; + } } void render(void) { - draw_grid(); + draw_grid(); - for (int i = 0; i < N_POINTS; i++){ - vec2_t projected_point = projected_points[i]; - draw_rect( - projected_point.x + (window_width/2), - projected_point.y + (window_height/2), - 4, - 4, - 0xFFFFFF00 - ); - } + for (int i = 0; i < N_POINTS; i++){ + vec2_t projected_point = projected_points[i]; + draw_rect( + projected_point.x + (window_width/2), + projected_point.y + (window_height/2), + 4, + 4, + 0xFFFFFF00 + ); + } - render_color_buffer(); - clear_color_buffer(0xFF000000); + render_color_buffer(); + clear_color_buffer(0xFF000000); - SDL_RenderPresent(renderer); + SDL_RenderPresent(renderer); } int main(void) { - is_running = initialize_window(); - setup(); + is_running = initialize_window(); + setup(); - while (is_running) { - process_input(); - update(); - render(); - } - destroy_window(); - return 0; + while (is_running) { + process_input(); + update(); + render(); + } + destroy_window(); + return 0; }