diff --git a/src/main.o b/src/main.o new file mode 100644 index 0000000..36f5d06 Binary files /dev/null and b/src/main.o differ diff --git a/src/surface.c b/src/surface.c index 458c3dd..7e44329 100644 --- a/src/surface.c +++ b/src/surface.c @@ -82,6 +82,38 @@ float *generate_data_surface(int grid_size, unsigned char *m) return d_surface; } +/* pa' rearmar la funcion _calc_normal te entendi que creara las funciones de cglm artesanalmente, entonces ps eso hago xd */ + +void subtract(const float *v1, const float *v2, float *result, unsigned char n) +{ + for (unsigned char i = 0; i < n; i++) { + result[i] = v1[i] - v2[i]; + } +} + +float dot_product(const float *a, const float *b, unsigned char n) +{ + float result = 0.0f; + for (unsigned char i = 0; i < n; i++) { + result += a[i] * b[i]; + } + return result; +} + +void escalar_product(float a, const float *v1, float *result, unsigned char n) +{ + for (unsigned char i = 0; i < n; i++) { + result[i] = a * v1[i]; + } +} + +void norm(const float *v1, float *result, unsigned char n) +{ + float lenght = sqrtf(dot_product(v1, v1, n)); + float inv_lenght = 1.0f / lenght; + escalar_product(inv_lenght, v1, result, n); +} + static void __calculate_normal( float *p1, float *p2, float *p3, float *normal, unsigned char n) { @@ -190,7 +222,7 @@ static void __calculate_normal( return; } } - +/* float *generate_normals_surface(float *d, unsigned char m) { float *n; @@ -209,3 +241,34 @@ float *generate_normals_surface(float *d, unsigned char m) } return n; } +*/ + +// Ando bien perdido u.u + +float *generate_normals_surface(const float *d, unsigned char m) +{ + float *n = malloc((*d + 1) * sizeof(float)); + *n = *d; + float v1[m], v2[m], normal[m]; + for (int i = 0; i < *d; i += 3 * m) + { + const float *A = (d + 1) + i; + const float *B = (d + 1) + i + m; + const float *C = (d + 1) + i + 2 * m; + + subtract(B, A, v1, m); + subtract(C, A, v2, m); + + for (unsigned char j = 0; j < m; j++) { + normal[j] = v1[(j + 1) % m] * v2[(j + 2) % m] - v1[(j + 2) % m] * v2[(j + 1) % m]; + } + norm(normal, normal, m); + for (unsigned char j = 0; j < m; j++) { + (n + 1)[i + j] = normal[j]; + (n + 1)[i + m + j] = normal[j]; + (n + 1)[i + 2 * m + j] = normal[j]; + } + } + + return n; +}