From 6b8af9cf83851c075c6c9514b1deaa931c2b19a4 Mon Sep 17 00:00:00 2001 From: Thomas Guillermo Albers Raviola Date: Fri, 16 Jan 2026 23:02:32 +0100 Subject: Initial commit --- 08-august/src/math/math_util.c | 10 ++ 08-august/src/math/math_util.h | 9 ++ 08-august/src/math/matrix4x4.c | 325 +++++++++++++++++++++++++++++++++++++++++ 08-august/src/math/matrix4x4.h | 40 +++++ 08-august/src/math/vector2f.c | 54 +++++++ 08-august/src/math/vector2f.h | 19 +++ 08-august/src/math/vector3f.c | 59 ++++++++ 08-august/src/math/vector3f.h | 19 +++ 08-august/src/math/vector4f.c | 53 +++++++ 08-august/src/math/vector4f.h | 18 +++ 10 files changed, 606 insertions(+) create mode 100644 08-august/src/math/math_util.c create mode 100644 08-august/src/math/math_util.h create mode 100644 08-august/src/math/matrix4x4.c create mode 100644 08-august/src/math/matrix4x4.h create mode 100644 08-august/src/math/vector2f.c create mode 100644 08-august/src/math/vector2f.h create mode 100644 08-august/src/math/vector3f.c create mode 100644 08-august/src/math/vector3f.h create mode 100644 08-august/src/math/vector4f.c create mode 100644 08-august/src/math/vector4f.h (limited to '08-august/src/math') diff --git a/08-august/src/math/math_util.c b/08-august/src/math/math_util.c new file mode 100644 index 0000000..f58e447 --- /dev/null +++ b/08-august/src/math/math_util.c @@ -0,0 +1,10 @@ +#include "math_util.h" + +float baryCentric(vec3_t *p1, vec3_t *p2, vec3_t *p3, vec2_t *pos) +{ + float det = (p2->z - p3->z) * (p1->x - p3->x) + (p3->x - p2->x) * (p1->z - p3->z); + float l1 = ((p2->z - p3->z) * (pos->x - p3->x) + (p3->x - p2->x) * (pos->y - p3->z)) / det; + float l2 = ((p3->z - p1->z) * (pos->x - p3->x) + (p1->x - p3->x) * (pos->y - p3->z)) / det; + float l3 = 1.0f - l1 - l2; + return l1 * p1->y + l2 * p2->y + l3 * p3->y; +} diff --git a/08-august/src/math/math_util.h b/08-august/src/math/math_util.h new file mode 100644 index 0000000..28a5464 --- /dev/null +++ b/08-august/src/math/math_util.h @@ -0,0 +1,9 @@ +#ifndef MATH_UTIL_H +#define MATH_UTIL_H + +#include "vector3f.h" +#include "vector2f.h" + +extern float baryCentric(vec3_t *p1, vec3_t *p2, vec3_t *p3, vec2_t *pos); + +#endif // MATH_UTIL_H diff --git a/08-august/src/math/matrix4x4.c b/08-august/src/math/matrix4x4.c new file mode 100644 index 0000000..1888727 --- /dev/null +++ b/08-august/src/math/matrix4x4.c @@ -0,0 +1,325 @@ +#include "matrix4x4.h" +#include "../util/util.h" +#include + +void mat4_identity(mat4_t *a) +{ + int i; + for(i = 0; i < 4*4; i++) + { + a->data[i] = 0.0f; + } + a->data[0 + 0 * 4] = 1.0f; + a->data[1 + 1 * 4] = 1.0f; + a->data[2 + 2 * 4] = 1.0f; + a->data[3 + 3 * 4] = 1.0f; +} + +/** TODO: Preprocess these operation (1 + 1 * 4) -> 5 **/ +mat4_t mat4_inverse(const mat4_t *a) +{ + mat4_t inv; + int i; + + /** Remember that inverted matrix is (1/det) * cofactor(transposed) **/ + inv.data[0 + 0 * 4] = (a->data[1 + 1 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] + + a->data[2 + 1 * 4] * a->data[3 + 2 * 4] * a->data[1 + 3 * 4] + + a->data[3 + 1 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] - + a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 1 * 4] - + a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[1 + 1 * 4] - + a->data[3 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 1 * 4]); + + inv.data[0 + 1 * 4] = -(a->data[0 + 1 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] + + a->data[2 + 1 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] + + a->data[3 + 1 * 4] * a->data[0 + 2 * 4] * a->data[2 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 1 * 4] - + a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 1 * 4] - + a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[2 + 1 * 4]); + + inv.data[0 + 2 * 4] = (a->data[0 + 1 * 4] * a->data[1 + 2 * 4] * a->data[3 + 3 * 4] + + a->data[1 + 1 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] + + a->data[3 + 1 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[3 + 1 * 4] - + a->data[1 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 1 * 4] - + a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 1 * 4]); + + inv.data[0 + 3 * 4] = -(a->data[0 + 1 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] + + a->data[1 + 1 * 4] * a->data[2 + 2 * 4] * a->data[0 + 3 * 4] + + a->data[2 + 1 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 1 * 4] - + a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[0 + 1 * 4] - + a->data[2 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 1 * 4]); + + inv.data[1 + 0 * 4] = -(a->data[1 + 0 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] + + a->data[2 + 0 * 4] * a->data[3 + 2 * 4] * a->data[1 + 3 * 4] + + a->data[3 + 0 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] - + a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 0 * 4] - + a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[1 + 0 * 4] - + a->data[3 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 0 * 4]); + + inv.data[1 + 1 * 4] = (a->data[0 + 0 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] + + a->data[2 + 0 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] + + a->data[3 + 0 * 4] * a->data[0 + 2 * 4] * a->data[2 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 0 * 4] - + a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 0 * 4] - + a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[2 + 0 * 4]); + + inv.data[1 + 2 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 2 * 4] * a->data[3 + 3 * 4] + + a->data[1 + 0 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] + + a->data[3 + 0 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[3 + 0 * 4] - + a->data[1 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 0 * 4] - + a->data[3 + 3 + 4] * a->data[0 + 2 * 4] * a->data[1 + 0 * 4]); + + inv.data[1 + 3 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] + + a->data[1 + 0 * 4] * a->data[2 + 2 * 4] * a->data[0 + 3 * 4] + + a->data[2 + 0 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 0 * 4] - + a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[0 + 0 * 4] - + a->data[2 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 0 * 4]); + + inv.data[2 + 0 * 4] = (a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 3 * 4] + + a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[1 + 3 * 4] + + a->data[3 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 3 * 4] - + a->data[1 + 3 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] - + a->data[2 + 3 * 4] * a->data[3 + 1 * 4] * a->data[1 + 0 * 4] - + a->data[3 + 3 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4]); + + inv.data[2 + 1 * 4] = -(a->data[0 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 3 * 4] + + a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 3 * 4] + + a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[2 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] - + a->data[2 + 3 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] - + a->data[3 + 3 * 4] * a->data[0 + 1 * 4] * a->data[2 + 0 * 4]); + + inv.data[2 + 2 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[3 + 3 * 4] + + a->data[1 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 3 * 4] + + a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[1 + 1 * 4] * a->data[3 + 0 * 4] - + a->data[1 + 3 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] - + a->data[3 + 3 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]); + + inv.data[2 + 3 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 3 * 4] + + a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[0 + 3 * 4] + + a->data[2 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 3 * 4] - + a->data[0 + 3 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4] - + a->data[1 + 3 * 4] * a->data[2 + 1 * 4] * a->data[0 + 0 * 4] - + a->data[2 + 3 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]); + + inv.data[3 + 0 * 4] = -(a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 2 * 4] + + a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[1 + 2 * 4] + + a->data[3 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 2 * 4] - + a->data[1 + 2 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] - + a->data[2 + 2 * 4] * a->data[3 + 1 * 4] * a->data[1 + 0 * 4] - + a->data[3 + 2 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4]); + + inv.data[3 + 1 * 4] = (a->data[0 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 2 * 4] + + a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 2 * 4] + + a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[2 + 2 * 4] - + a->data[0 + 2 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] - + a->data[2 + 2 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] - + a->data[3 + 2 * 4] * a->data[0 + 1 * 4] * a->data[2 + 0 * 4]); + + inv.data[3 + 2 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[3 + 2 * 4] + + a->data[1 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 2 * 4] + + a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 2 * 4] - + a->data[0 + 2 * 4] * a->data[1 + 1 * 4] * a->data[3 + 0 * 4] - + a->data[1 + 2 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] - + a->data[3 + 2 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]); + + inv.data[3 + 3 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 2 * 4] + + a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[0 + 2 * 4] + + a->data[2 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 2 * 4] - + a->data[0 + 2 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4] - + a->data[1 + 2 * 4] * a->data[2 + 1 * 4] * a->data[0 + 0 * 4] - + a->data[2 + 2 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]); + + /** Remember that our matrix is already transposed and we also got the minors(inside each "inv" entry), + so we just use them. We use a->data[0 + 1 * 4] * inv.data[1 + 0 * 4] becouse inv.data is transposed **/ + float det = a->data[0 + 0 * 4] * inv.data[0 + 0 * 4] + a->data[0 + 1 * 4] * inv.data[1 + 0 * 4] + + a->data[0 + 2 * 4] * inv.data[2 + 0 * 4] + a->data[0 + 3 * 4] * inv.data[3 + 0 * 4]; + + if(det == 0.0f) + return *a; + + det = 1.0f / det; + + for(i = 0; i < 16; i++) + inv.data[i] *= det; + + return inv; +} + +mat4_t mat4_mul(const mat4_t* a, const mat4_t* b) +{ + int i, j, k; + GLfloat sum = 0.0f; + mat4_t c; + mat4_identity(&c); + for(i = 0; i < 4; i++) + for(j = 0; j < 4; j++){ + for(k = 0; k < 4; k++){ + sum += a->data[i + k * 4] * b->data[k + j * 4]; + } + c.data[i + j * 4] = sum; + sum = 0.0f; + } + + return c; +} + +mat4_t mat4_translate(const vec3_t *a) +{ + mat4_t b; + mat4_identity(&b); + b.data[0 + 3 * 4] = a->x; + b.data[1 + 3 * 4] = a->y; + b.data[2 + 3 * 4] = a->z; + return b; +} + +mat4_t mat4_scale(GLfloat x, GLfloat y, GLfloat z) +{ + mat4_t b; + mat4_identity(&b); + b.data[0 + 0 * 4] = x; + b.data[1 + 1 * 4] = y; + b.data[2 + 2 * 4] = z; + return b; +} + +mat4_t mat4_rotate(GLfloat degrees, const vec3_t* a) +{ + mat4_t b; + mat4_identity(&b); + GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees)), o = 1-c; + b.data[0 + 0 * 4] = a->x * a->x * o + c; + b.data[0 + 1 * 4] = a->x * a->y * o - a->z * s; + b.data[0 + 2 * 4] = a->x * a->z * o + a->y * s; + + b.data[1 + 0 * 4] = a->x * a->y * o + a->z * s; + b.data[1 + 1 * 4] = a->y * a->y * o + c; + b.data[1 + 2 * 4] = a->y * a->z * o - a->x * s; + + b.data[2 + 0 * 4] = a->x * a->z * o - a->y * s; + b.data[2 + 1 * 4] = a->y * a->z * o + a->x * s; + b.data[2 + 2 * 4] = a->z * a->z * o + c; + return b; +} + +mat4_t mat4_rotate_x(GLfloat degrees) +{ + mat4_t a; + mat4_identity(&a); + GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees)); + a.data[1 + 1 * 4] = c; + a.data[2 + 1 * 4] = s; + a.data[1 + 2 * 4] = -s; + a.data[2 + 2 * 4] = c; + return a; +} + +mat4_t mat4_rotate_y(GLfloat degrees) +{ + mat4_t a; + mat4_identity(&a); + GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees)); + a.data[0 + 0 * 4] = c; + a.data[2 + 0 * 4] = -s; + a.data[0 + 2 * 4] = s; + a.data[2 + 2 * 4] = c; + return a; +} + +mat4_t mat4_rotate_z(GLfloat degrees) +{ + mat4_t a; + mat4_identity(&a); + GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees)); + a.data[0 + 0 * 4] = c; + a.data[1 + 0 * 4] = s; + a.data[0 + 1 * 4] = -s; + a.data[1 + 1 * 4] = c; + return a; +} + +mat4_t mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar) +{ + mat4_t a; + GLubyte i, j; + for(i = 0; i < 4; i++) + for(j = 0; j < 4; j++) + a.data[i + j * 4] = 0.0f; + fov = toRadians(fov); // To radians + + a.data[0 + 0 * 4] = ( (1.0f / SDL_tanf( fov/2.0f )) / aspect); + a.data[1 + 1 * 4] = (1.0f / SDL_tanf( fov/2.0f )); + a.data[2 + 2 * 4] = -( (zFar + zNear) / (zFar - zNear) ); + a.data[2 + 3 * 4] = -( ( 2.0f * zFar * zNear) / (zFar - zNear) ); + a.data[3 + 2 * 4] = -1.0f; + + return a; +} + +mat4_t +mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top) +{ + mat4_t a; + mat4_identity(&a); + a.data[0 + 0 * 4] = 2.0f / (right - left); + a.data[1 + 1 * 4] = 2.0f / (top - bottom); + a.data[2 + 2 * 4] = -1.0f; + + a.data[0 + 3 * 4] = (left + right) / (left - right); + a.data[1 + 3 * 4] = (bottom + top) / (bottom - top); + + return a; +} + +mat4_t mat4_lookAt(vec3_t* eye, vec3_t* center, vec3_t* up) +{ + vec3_t temp = vec3_sub(center, eye); + + vec3_t f = vec3_normalize(&temp); + vec3_t u = vec3_normalize(up); + temp = vec3_cross_mul(&f, &u); + vec3_t s = vec3_normalize(&temp); + u = vec3_cross_mul(&s, &f); + + mat4_t a; + mat4_identity(&a); + + a.data[0 + 0 * 4] = s.x; + a.data[0 + 1 * 4] = s.y; + a.data[0 + 2 * 4] = s.z; + a.data[1 + 0 * 4] = u.x; + a.data[1 + 1 * 4] = u.y; + a.data[1 + 2 * 4] = u.z; + a.data[2 + 0 * 4] =-f.x; + a.data[2 + 1 * 4] =-f.y; + a.data[2 + 2 * 4] =-f.z; + a.data[0 + 3 * 4] =-vec3_dot_mul(&s, eye); + a.data[1 + 3 * 4] =-vec3_dot_mul(&u, eye); + a.data[2 + 3 * 4] = vec3_dot_mul(&f, eye); + + return a; +} + +vec3_t mat4_mul_vec3(const mat4_t* a, const vec3_t* b) +{ + vec3_t c; + c.x = a->data[0 + 0 * 4] * b->x + a->data[0 + 1 * 4] * b->y + a->data[0 + 2 * 4] * b->z + a->data[0 + 3 * 4]; + c.y = a->data[1 + 0 * 4] * b->x + a->data[1 + 1 * 4] * b->y + a->data[1 + 2 * 4] * b->z + a->data[1 + 3 * 4]; + c.z = a->data[2 + 0 * 4] * b->x + a->data[2 + 1 * 4] * b->y + a->data[2 + 2 * 4] * b->z + a->data[2 + 3 * 4]; + return c; +} + +vec4_t mat4_mul_vec4(const mat4_t *a, const vec4_t *b) +{ + vec4_t c; + c.x = a->data[0 + 0 * 4] * b->x + a->data[0 + 1 * 4] * b->y + a->data[0 + 2 * 4] * b->z + a->data[0 + 3 * 4] * b->w; + c.y = a->data[1 + 0 * 4] * b->x + a->data[1 + 1 * 4] * b->y + a->data[1 + 2 * 4] * b->z + a->data[1 + 3 * 4] * b->w; + c.z = a->data[2 + 0 * 4] * b->x + a->data[2 + 1 * 4] * b->y + a->data[2 + 2 * 4] * b->z + a->data[2 + 3 * 4] * b->w; + c.w = a->data[3 + 0 * 4] * b->x + a->data[3 + 1 * 4] * b->y + a->data[3 + 2 * 4] * b->z + a->data[3 + 3 * 4] * b->w; + return c; +} diff --git a/08-august/src/math/matrix4x4.h b/08-august/src/math/matrix4x4.h new file mode 100644 index 0000000..b7d54aa --- /dev/null +++ b/08-august/src/math/matrix4x4.h @@ -0,0 +1,40 @@ +#ifndef MATRIX4X4_H +#define MATRIX4X4_H + +#include +#include "vector3f.h" +#include "vector4f.h" + +/* accesing data: row + column * width */ +typedef struct +{ + GLfloat data[16]; +} mat4_t; + +extern void mat4_identity(mat4_t *a); +extern mat4_t mat4_inverse(const mat4_t *a); +extern mat4_t mat4_mul(const mat4_t *a, const mat4_t *b); + +extern mat4_t mat4_translate(const vec3_t *a); +extern mat4_t mat4_scale(GLfloat x, GLfloat y, GLfloat z); +extern mat4_t mat4_rotate_x(GLfloat degrees); +extern mat4_t mat4_rotate_y(GLfloat degrees); +extern mat4_t mat4_rotate_z(GLfloat degrees); +extern mat4_t mat4_rotate(GLfloat degrees, const vec3_t *a); + +extern mat4_t +mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar); + +extern mat4_t +mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top); + +extern mat4_t +mat4_lookAt(vec3_t *eye, vec3_t *center, vec3_t *up); + +extern vec3_t +mat4_mul_vec3(const mat4_t *a, const vec3_t *b); + +extern vec4_t +mat4_mul_vec4(const mat4_t *a, const vec4_t *b); + +#endif // MATRIX4X4_H diff --git a/08-august/src/math/vector2f.c b/08-august/src/math/vector2f.c new file mode 100644 index 0000000..37ffa9c --- /dev/null +++ b/08-august/src/math/vector2f.c @@ -0,0 +1,54 @@ +#include "vector2f.h" +#include + +vec2_t vec2_add(const vec2_t* a, const vec2_t* b) +{ + vec2_t c; + c.x = a->x + b->x; + c.y = a->y + b->y; + return c; +} + +vec2_t vec2_sub(const vec2_t* a, const vec2_t* b) +{ + vec2_t c; + c.x = a->x - b->x; + c.y = a->y - b->y; + return c; +} + +vec2_t vec2_scalar_mul(const vec2_t* a, GLfloat scalar) +{ + vec2_t c; + c.x = a->x * scalar; + c.y = a->y * scalar; + return c; +} + +GLfloat vec2_dot_mul(const vec2_t* a, const vec2_t* b) +{ + return ( (a->x * b->x) + (a->y * b->y) ); +} + + +vec2_t vec2_cross_mul(const vec2_t* a, const vec2_t* b) +{ + vec2_t c; + c.x = (a->x * b->y) - (a->y * b->x); + c.y = (a->y * b->x) - (a->x * b->y); + return c; +} + +GLfloat vec2_length(vec2_t* a) +{ + return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) ); +} + +vec2_t vec2_normalize(vec2_t* a) +{ + vec2_t b; + GLfloat length = vec2_length(a); + b.x = a->x / length; + b.y = a->y / length; + return b; +} diff --git a/08-august/src/math/vector2f.h b/08-august/src/math/vector2f.h new file mode 100644 index 0000000..bc1d0bc --- /dev/null +++ b/08-august/src/math/vector2f.h @@ -0,0 +1,19 @@ +#ifndef VECTOR2F_H +#define VECTOR2F_H + +#include + +typedef struct +{ + GLfloat x, y; +} vec2_t; + +extern vec2_t vec2_add(const vec2_t* a, const vec2_t* b); +extern vec2_t vec2_sub(const vec2_t* a, const vec2_t* b); +extern vec2_t vec2_scalar_mul(const vec2_t* a, GLfloat scalar); +extern GLfloat vec2_dot_mul(const vec2_t* a, const vec2_t* b); +extern vec2_t vec2_cross_mul(const vec2_t* a, const vec2_t* b); +extern GLfloat vec2_length(vec2_t* a); +extern vec2_t vec2_normalize(vec2_t* a); + +#endif // VECTOR2F_H diff --git a/08-august/src/math/vector3f.c b/08-august/src/math/vector3f.c new file mode 100644 index 0000000..2c2878c --- /dev/null +++ b/08-august/src/math/vector3f.c @@ -0,0 +1,59 @@ +#include "vector3f.h" +#include + +vec3_t vec3_add(const vec3_t* a, const vec3_t* b) +{ + vec3_t c; + c.x = a->x + b->x; + c.y = a->y + b->y; + c.z = a->z + b->z; + return c; +} + +vec3_t vec3_sub(const vec3_t* a, const vec3_t* b) +{ + vec3_t c; + c.x = a->x - b->x; + c.y = a->y - b->y; + c.z = a->z - b->z; + return c; +} + +vec3_t vec3_scalar_mul(const vec3_t* a, GLfloat scalar) +{ + vec3_t c; + c.x = a->x * scalar; + c.y = a->y * scalar; + c.z = a->z * scalar; + return c; +} + +GLfloat vec3_dot_mul(const vec3_t* a, const vec3_t* b) +{ + return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) ); +} + + +vec3_t vec3_cross_mul(const vec3_t* a, const vec3_t* b) +{ + vec3_t c; + c.x = (a->y * b->z) - (a->z * b->y); + c.y = (a->z * b->x) - (a->x * b->z); + c.z = (a->x * b->y) - (a->y * b->x); + return c; +} + +GLfloat vec3_length(vec3_t* a) +{ + return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f)); +} + +vec3_t vec3_normalize(vec3_t* a) +{ + vec3_t b; + GLfloat length = vec3_length(a); + b.x = a->x / length; + b.y = a->y / length; + b.z = a->z / length; + return b; +} diff --git a/08-august/src/math/vector3f.h b/08-august/src/math/vector3f.h new file mode 100644 index 0000000..ab89cb8 --- /dev/null +++ b/08-august/src/math/vector3f.h @@ -0,0 +1,19 @@ +#ifndef VECTOR3F_H +#define VECTOR3F_H + +#include + +typedef struct +{ + GLfloat x, y, z; +} vec3_t; + +extern vec3_t vec3_add(const vec3_t* a, const vec3_t* b); +extern vec3_t vec3_sub(const vec3_t* a, const vec3_t* b); +extern vec3_t vec3_scalar_mul(const vec3_t* a, GLfloat scalar); +extern GLfloat vec3_dot_mul(const vec3_t* a, const vec3_t* b); +extern vec3_t vec3_cross_mul(const vec3_t* a, const vec3_t* b); +extern GLfloat vec3_length(vec3_t* a); +extern vec3_t vec3_normalize(vec3_t* a); + +#endif // VECTOR3F_H diff --git a/08-august/src/math/vector4f.c b/08-august/src/math/vector4f.c new file mode 100644 index 0000000..57e4925 --- /dev/null +++ b/08-august/src/math/vector4f.c @@ -0,0 +1,53 @@ +#include "vector4f.h" +#include + +vec4_t vec4_add(const vec4_t* a, const vec4_t* b) +{ + vec4_t c; + c.x = a->x + b->x; + c.y = a->y + b->y; + c.z = a->z + b->z; + c.w = a->w + b->w; + return c; +} + +vec4_t vec4_sub(const vec4_t* a, const vec4_t* b) +{ + vec4_t c; + c.x = a->x - b->x; + c.y = a->y - b->y; + c.z = a->z - b->z; + c.w = a->w - b->w; + return c; +} + +vec4_t vec4_scalar_mul(const vec4_t* a, GLfloat scalar) +{ + vec4_t c; + c.x = a->x * scalar; + c.y = a->y * scalar; + c.z = a->z * scalar; + c.w = a->w * scalar; + return c; +} + +GLfloat vec4_dot_mul(const vec4_t* a, const vec4_t* b) +{ + return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) + (a->w * b->w) ); +} + +GLfloat vec4_length(vec4_t* a) +{ + return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f) + SDL_pow(a->w, 2.0f) ); +} + +vec4_t vec4_normalize(vec4_t* a) +{ + vec4_t b; + GLfloat length = vec4_length(a); + b.x = a->x / length; + b.y = a->y / length; + b.z = a->z / length; + b.w = a->w / length; + return b; +} diff --git a/08-august/src/math/vector4f.h b/08-august/src/math/vector4f.h new file mode 100644 index 0000000..9a2f149 --- /dev/null +++ b/08-august/src/math/vector4f.h @@ -0,0 +1,18 @@ +#ifndef VECTOR4F_H +#define VECTOR4F_H + +#include + +typedef struct +{ + GLfloat x, y, z, w; +} vec4_t; + +extern vec4_t vec4_add(const vec4_t *a, const vec4_t *b); +extern vec4_t vec4_sub(const vec4_t *a, const vec4_t *b); +extern vec4_t vec4_scalar_mul(const vec4_t *a, GLfloat scalar); +extern GLfloat vec4_dot_mul(const vec4_t *a, const vec4_t *b); +extern GLfloat vec4_length(vec4_t *a); +extern vec4_t vec4_normalize(vec4_t *a); + +#endif // VECTOR4F_H -- cgit v1.2.3