From 70dfb5d5eefa6e6b771cccd25239e3ad6bd4a1db Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 14 Jul 2024 17:56:01 +0100 Subject: [PATCH] Calculate the triangle normal from midpoint --- src/rasteriser/rasteriser.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c index 778c9c6..b86def6 100644 --- a/src/rasteriser/rasteriser.c +++ b/src/rasteriser/rasteriser.c @@ -415,16 +415,28 @@ internal void cull_back_faces(Arena *arena, const rasteriser_scene_t *scene, list_uint64_t *to_remove = list_create_with_capacity(u64, arena, model->triangles->count); vec3f_t normal; - scene_triangle_t triangle; + scene_triangle_t *triangle; vertex_t v0; + vertex_t v1; + vertex_t v2; + vec3f_t sum; + vec3f_t midpoint; vec3f_t viewing_vector; f32 dot_product; for (u64 i = 0; i < model->triangles->count; ++i) { - triangle = list_get(model->triangles, i); - v0 = list_get(model->vertices, triangle.idx0); - normal = calculate_triangle_normal(model, &triangle); - viewing_vector = vec_sub(vec3f_t, v0.position, scene->camera->position); + triangle = &(list_get(model->triangles, i)); + + v0 = list_get(model->vertices, triangle->idx0); + v1 = list_get(model->vertices, triangle->idx1); + v2 = list_get(model->vertices, triangle->idx2); + + sum = vec_add(vec3f_t, v0.position, + vec_add(vec3f_t, v1.position, v2.position)); + midpoint = vec_div_num(vec3f_t, sum, 3); + + normal = calculate_triangle_normal(model, triangle); + viewing_vector = vec_sub(vec3f_t, midpoint, scene->camera->position); dot_product = vec_dot(vec3f_t, normal, viewing_vector); if (dot_product <= 0.0f) {