pikuma_graphics_from_scratch/src/main.c

112 lines
2.5 KiB
C
Raw Normal View History

2024-04-12 04:27:14 +00:00
#include <stdint.h>
#include <stdbool.h>
#include <SDL2/SDL.h>
#include "display.h"
2024-04-13 03:41:06 +00:00
#include "vector.h"
////////////////////////////////////////////////////////////
// Declare an array of points
////////////////////////////////////////////////////////////
#define N_POINTS (9 * 9 * 9)
vec3_t cube_points[N_POINTS];
2024-04-13 04:20:42 +00:00
vec2_t projected_points[N_POINTS];
float fov_factor = 128;
2024-04-13 03:41:06 +00:00
2024-04-12 04:27:14 +00:00
bool is_running = false;
void setup(void) {
2024-04-13 03:41:06 +00:00
// 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;
}
}
}
2024-04-12 04:27:14 +00:00
}
void process_input(void) {
2024-04-13 03:41:06 +00:00
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;
}
2024-04-12 04:27:14 +00:00
}
2024-04-13 04:20:42 +00:00
////////////////////////////////////////////////////////////////////////////////
// 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;
}
2024-04-12 04:27:14 +00:00
void update(void) {
2024-04-13 04:20:42 +00:00
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;
}
2024-04-12 04:27:14 +00:00
}
void render(void) {
2024-04-13 04:20:42 +00:00
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
);
}
2024-04-12 04:27:14 +00:00
2024-04-13 03:41:06 +00:00
render_color_buffer();
2024-04-13 04:20:42 +00:00
clear_color_buffer(0xFF000000);
2024-04-12 04:27:14 +00:00
2024-04-13 03:41:06 +00:00
SDL_RenderPresent(renderer);
2024-04-12 04:27:14 +00:00
}
int main(void) {
2024-04-13 03:41:06 +00:00
is_running = initialize_window();
setup();
while (is_running) {
process_input();
update();
render();
}
destroy_window();
return 0;
2024-04-12 04:27:14 +00:00
}