From 74f4f7c7ebbd70a3fd3894a212a8c8068e101435 Mon Sep 17 00:00:00 2001 From: PedroEdiaz Date: Tue, 22 Oct 2024 18:58:15 -0600 Subject: [PATCH] Finall G-S MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Observaciones: * Agregé CGLM_ALL_UNALIGNED para evitar el Segfault. * Cambie la estructura de G-S a una más ordenada. * Cambié el nombre de las variables a unas más intuitivas. * Cambié lado3, a uno que garantiza G-S. En lo general muy bien!!, Felicidades. --- src/main.c | 77 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/src/main.c b/src/main.c index 1323418..3118a4f 100755 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,11 @@ #include "main.h" #include "data/axis.h" #include "data/shaders.h" + #include #include + +#define CGLM_ALL_UNALIGNED #include #include @@ -20,51 +23,67 @@ unsigned char palette[] = 0x7A,0x1C,0xAC,0xff, }; -void calc_normal(float* v1, float* v2, float* v3,float* normal, unsigned char n) +void calc_normal(float* p1, float* p2, float* p3,float* normal, unsigned char n) { - vec4 lado1, lado2, lado3; - vec4 u1, u2, u3; + float alpha; + vec4 v1, v2, v3; + vec4 u1, u2, u3; switch (n) { case 3: - glm_vec3_sub(v2, v1, lado1); - glm_vec3_sub(v3, v1, lado2); + glm_vec3_sub(p2, p1, v1); + glm_vec3_sub(p3, p1, v2); - glm_vec3_cross(lado1, lado2, normal); + glm_vec3_cross(v1, v2, normal); glm_vec3_normalize(normal); return; case 4: - glm_vec4_sub(v2, v1, lado1); - glm_vec4_sub(v3, v1, lado2); - glm_vec4_sub(v3, v2, lado3); - - glm_vec4_copy(lado1, u1); + /* + In Grant-Shmidth we need 3 linearly independian vector that forms a basis, + so we can have a ortonormal version of that basis, since, we must have + v1 = p3 - p1 + v2 = p2 - p1 + Then v3 = p1, will most certantly be linerly independiant to v1 and v2. + */ + glm_vec4_sub(p2, p1, v1); + glm_vec4_sub(p3, p1, v2); + glm_vec4_copy(p1, v3); + + /* Setup U1 */ + { + glm_vec4_copy(v1, u1); + } - float alpha = glm_vec4_dot(lado2, u1) / glm_vec4_dot(u1, u1); - vec4 proj_u1; - glm_vec4_scale(u1, alpha, proj_u1); - glm_vec4_sub(lado2, proj_u1, u2); + /* Setup U2 */ + { + vec4 proj; - glm_vec4_normalize(u2); + alpha = glm_vec4_dot(v2, u1) / glm_vec4_dot(u1, u1); + glm_vec4_scale(u1, alpha, proj); - float beta = glm_vec4_dot(lado3, u1) / glm_vec4_dot(u1, u1); - vec4 proj_u1_lado3; - glm_vec4_scale(u1, beta, proj_u1_lado3); - - float gamma = glm_vec4_dot(lado3, u2) / glm_vec4_dot(u2, u2); - vec4 proj_u2; - glm_vec4_scale(u2, gamma, proj_u2); - - glm_vec4_sub(lado3, proj_u1_lado3, u3); - glm_vec4_sub(u3, proj_u2, u3); - - glm_vec4_normalize(u3); + glm_vec4_sub(v2, proj, u2); + } - glm_vec4_copy(u3, normal); + /* Setup U3 */ + { + vec4 proj1, proj2; + + alpha = glm_vec4_dot(v3, u1) / glm_vec4_dot(u1, u1); + glm_vec4_scale(u1, alpha, proj1); + + alpha = glm_vec4_dot(v3, u2) / glm_vec4_dot(u2, u2); + glm_vec4_scale(u2, alpha, proj2); + + glm_vec4_sub(v3, proj1, u3); + glm_vec4_sub(u3, proj2, u3); + } + + glm_vec4_copy(u3, normal); + glm_vec4_normalize(normal); return; } }