aboutsummaryrefslogtreecommitdiff
path: root/vector.c
diff options
context:
space:
mode:
authorJulian T <julian@jtle.dk>2020-02-19 22:35:48 +0100
committerJulian T <julian@jtle.dk>2020-02-19 22:35:48 +0100
commit63a84080f9f0e3d719d5470e370584a5eff18a47 (patch)
tree58264ab5ee632218ab898f70a8a0170b29e595bf /vector.c
Viewpoint system and share/ray intersection working
Diffstat (limited to 'vector.c')
-rw-r--r--vector.c121
1 files changed, 121 insertions, 0 deletions
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 <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <stdio.h>
+
+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);
+}