From 63a84080f9f0e3d719d5470e370584a5eff18a47 Mon Sep 17 00:00:00 2001 From: Julian T Date: Wed, 19 Feb 2020 22:35:48 +0100 Subject: Viewpoint system and share/ray intersection working --- vector.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 vector.c (limited to 'vector.c') diff --git a/vector.c b/vector.c new file mode 100644 index 0000000..87eba37 --- /dev/null +++ b/vector.c @@ -0,0 +1,121 @@ +#include "vector.h" + +#include +#include +#include +#include + +static inline vector_t *vector_exists(vector_t *v) +{ + if (v) { + return v; + } + + return (vector_t *) malloc(sizeof(vector_t)); +} + +// Overwrites stuff in p. If p is null a new vector is created +vector_t *vector_set(vector_t *p, COORD_T x, COORD_T y, COORD_T z) +{ + p = vector_exists(p); + + p->x = x; + p->y = y; + p->z = z; + + return p; +} + +// Can also be used to create a vector by leaving v NULL +vector_t *vector_copy(vector_t *dest, vector_t *src) +{ + dest = vector_exists(dest); + + // If v exist copy it over + if (src) { + memcpy(dest, src, sizeof(vector_t)); + } + + return dest; +} + +COORD_T vector_len(vector_t *v) +{ + return sqrt( v->x * v->x + v->y * v->y + v->z * v->z ); +} + +vector_t *vector_add(vector_t *dest, vector_t *a, vector_t *b) +{ + dest = vector_exists(dest); + + dest->x = a->x + b->x; + dest->y = a->y + b->y; + dest->z = a->z + b->z; + + return dest; +} + +vector_t *vector_sub(vector_t *dest, vector_t *a, vector_t *b) +{ + dest = vector_exists(dest); + + dest->x = a->x - b->x; + dest->y = a->y - b->y; + dest->z = a->z - b->z; + + return dest; +} + +vector_t *vector_mult(vector_t *dest, vector_t *a, vector_t *b) +{ + dest = vector_exists(dest); + + dest->x = a->x * b->x; + dest->y = a->y * b->y; + dest->z = a->z * b->z; + + return dest; +} + +vector_t *vector_scale(vector_t *dest, vector_t *a, COORD_T b) +{ + dest = vector_exists(dest); + + dest->x = a->x * b; + dest->y = a->y * b; + dest->z = a->z * b; + + return dest; +} + +vector_t *vector_scale_inv(vector_t *dest, vector_t *a, COORD_T b) +{ + dest = vector_exists(dest); + + dest->x = a->x / b; + dest->y = a->y / b; + dest->z = a->z / b; + + return dest; +} + +COORD_T vector_dot(vector_t *a, vector_t *b) +{ + return a->x * b->x + a->y * b->y + a->z * b->z; +} + +vector_t *vector_cross(vector_t *dest, vector_t *a, vector_t *b) +{ + dest = vector_exists(dest); + + dest->x = a->y * b->z - a->z * b->y; + dest->y = a->z * b->x - a->x * b->z; + dest->z = a->x * b->y - a->y * b->x; + + return dest; +} + +void vector_print(vector_t *v) +{ + printf("[ %f, %f, %f ]\n", v->x, v->y, v->z); +} -- cgit v1.2.3