debugging the BSP
[dosdemo] / src / vmath.h
index d8c6be2..3cdbedf 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef VMATH_H_
 #define VMATH_H_
 
+#include <math.h>
+
 #ifdef __GNUC__
 #define INLINE __inline
 
@@ -11,6 +13,7 @@
 #define INLINE
 #endif
 
+typedef struct { float x, y; } vec2_t;
 typedef struct { float x, y, z; } vec3_t;
 typedef struct { float x, y, z, w; } vec4_t;
 
@@ -26,11 +29,38 @@ static INLINE vec3_t v3_cons(float x, float y, float z)
        return res;
 }
 
+static INLINE void v3_negate(vec3_t *v)
+{
+       v->x = -v->x;
+       v->y = -v->y;
+       v->z = -v->z;
+}
+
 static INLINE float v3_dot(vec3_t v1, vec3_t v2)
 {
        return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
 }
 
+static INLINE vec3_t v3_cross(vec3_t v1, vec3_t v2)
+{
+       vec3_t res;
+       res.x = v1.y * v2.z - v1.z * v2.y;
+       res.y = v1.z * v2.x - v1.x * v2.z;
+       res.z = v1.x * v2.y - v1.y * v2.x;
+       return res;
+}
+
+static INLINE void v3_normalize(vec3_t *v)
+{
+       float mag = sqrt(v->x * v->x + v->y * v->y + v->z * v->z);
+       if(mag != 0.0f) {
+               float s = 1.0f / mag;
+               v->x *= s;
+               v->y *= s;
+               v->z *= s;
+       }
+}
+
 /* quaternion functions */
 static INLINE quat_t quat_cons(float s, float x, float y, float z)
 {
@@ -96,4 +126,19 @@ static INLINE quat_t quat_rotate(quat_t q, float angle, float x, float y, float
        return quat_mul(q, rq);
 }
 
+static INLINE void mat4_transpose(float *mat)
+{
+       int i, j;
+
+       for(i=0; i<4; i++) {
+               for(j=0; j<i; j++) {
+                       int rowidx = i * 4 + j;
+                       int colidx = j * 4 + i;
+                       float tmp = mat[rowidx];
+                       mat[rowidx] = mat[colidx];
+                       mat[colidx] = tmp;
+               }
+       }
+}
+
 #endif /* VMATH_H_ */