render and culling options

This commit is contained in:
jb 2025-07-09 23:45:32 -07:00
parent 86ebc14924
commit 57699deea9
3 changed files with 78 additions and 25 deletions

View File

@ -17,6 +17,18 @@ extern SDL_Texture* color_buffer_texture;
extern int window_width;
extern int window_height;
enum render_methods {
RENDER_WIRE_VERTEX,
RENDER_WIRE,
RENDER_FILL_TRIANGLE,
RENDER_FILL_TRIANGLE_LINE,
};
enum cull_methods {
CULL_NONE,
CULL_BACKFACE,
};
bool initialize_window(void);
void draw_grid(void);
void draw_pixel(int x, int y, uint32_t color);

View File

@ -33,6 +33,10 @@ vec3_t camera_position = { 0, 0, 0 };
float fov_factor = 640;
bool is_running = false;
int cull_method = CULL_BACKFACE;
int render_method = RENDER_WIRE_VERTEX;
uint32_t previous_frame_time = 0;
void setup(void) {
@ -72,6 +76,26 @@ void process_input(void) {
if (event.key.keysym.sym == SDLK_RIGHT)
mesh.rotation.y += STEP;
break;
case SDL_KEYUP:
SDL_Keycode key = event.key.keysym.sym;
if (key == SDLK_c) {
cull_method = !cull_method;
}
if (key == SDLK_1) {
render_method = RENDER_WIRE_VERTEX;
}
if (key == SDLK_2) {
render_method = RENDER_WIRE;
}
if (key == SDLK_3) {
render_method = RENDER_FILL_TRIANGLE;
}
if (key == SDLK_4) {
render_method = RENDER_FILL_TRIANGLE_LINE;
}
break;
@ -132,6 +156,7 @@ void update(void) {
transformed_vertices[j] = transformed_vertex;
}
if (cull_method == CULL_BACKFACE) {
// check backface culling
vec3_t vector_a = transformed_vertices[0]; /* A */
vec3_t vector_b = transformed_vertices[1]; /* / \ */
@ -156,6 +181,7 @@ void update(void) {
if (dot_normal_camera < 0) {
continue;
}
}
triangle_t projected_triangle;
@ -188,13 +214,28 @@ void render(void) {
for (int i = 0; i < array_length(triangles_to_render); i++) {
triangle_t triangle = triangles_to_render[i];
draw_filled_triangle(triangle, 0xFF00FF00);
draw_triangle(triangle, 0x0000ff);
//draw_triangle(triangle, 0xFFFF0000);
//draw_rect(triangle.points[0].x, triangle.points[0].y, 3, 3, 0xFFFFFF00);
//draw_rect(triangle.points[1].x, triangle.points[1].y, 3, 3, 0xFFFFFF00);
//draw_rect(triangle.points[2].x, triangle.points[2].y, 3, 3, 0xFFFFFF00);
switch (render_method) {
case RENDER_WIRE:
draw_triangle(triangle, 0x0000ff);
break;
case RENDER_WIRE_VERTEX:
draw_triangle(triangle, 0x000055);
draw_rect(triangle.points[0].x, triangle.points[0].y, 3, 3, 0xFFFFFF00);
draw_rect(triangle.points[1].x, triangle.points[1].y, 3, 3, 0xFFFFFF00);
draw_rect(triangle.points[2].x, triangle.points[2].y, 3, 3, 0xFFFFFF00);
break;
case RENDER_FILL_TRIANGLE:
draw_filled_triangle(triangle, 0x0000ff);
break;
case RENDER_FILL_TRIANGLE_LINE:
draw_filled_triangle(triangle, 0xff00);
draw_triangle(triangle, 0x0000ff);
break;
default:
break;
}
}
//vec2_t m = triangle_midpoint(t);

View File

@ -75,7 +75,7 @@ void load_file(void) {
FILE* fp;
char* tok;
fp = fopen("..\\assets\\cube.obj", "r");
fp = fopen("..\\assets\\f22.obj", "r");
if (fp == NULL) {
exit(EXIT_FAILURE);