Implement game state interpolation (WIP)
[neverball] / share / vec3.h
index e386fc6..d540bae 100644 (file)
     (u)[2] = (p)[2] + (v)[2] * (t); \
 } while (0)
 
-/*---------------------------------------------------------------------------*/
+#define v_lerp(u, v, w, a) {                       \
+    (u)[0] = (v)[0] * (1.0f - (a)) + (w)[0] * (a); \
+    (u)[1] = (v)[1] * (1.0f - (a)) + (w)[1] * (a); \
+    (u)[2] = (v)[2] * (1.0f - (a)) + (w)[2] * (a); \
+}
+
+#define e_cpy(d, e) {      \
+    v_cpy((d)[0], (e)[0]); \
+    v_cpy((d)[1], (e)[1]); \
+    v_cpy((d)[2], (e)[2]); \
+}
+
+#define e_lerp(c, d, e, a) {           \
+    v_lerp((c)[0], (d)[0], (e)[0], a); \
+    v_lerp((c)[1], (d)[1], (e)[1], a); \
+    v_lerp((c)[2], (d)[2], (e)[2], a); \
+}
 
+/*---------------------------------------------------------------------------*/
 
 void   v_nrm(float *, const float *);
 void   v_crs(float *, const float *, const float *);
@@ -117,8 +134,21 @@ void   m_view(float *, const float *,
     (q)[3] = (r)[3];     \
 } while (0)
 
-void q_axisangle(const float q[4], float u[3], float *a);
+#define q_conj(q, r) do { \
+    (q)[0] =  (r)[0];     \
+    (q)[1] = -(r)[1];     \
+    (q)[2] = -(r)[2];     \
+    (q)[3] = -(r)[3];     \
+} while (0)
+
+void q_as_axisangle(const float q[4], float u[3], float *a);
+void q_by_axisangle(float q[4], const float u[3], float a);
+
 void q_nrm(float q[4], const float r[4]);
+void q_mul(float q[4], const float a[4], const float b[4]);
+void q_rot(float v[3], const float r[4], const float w[3]);
+
 void q_euler(float v[3], const float q[4]);
+void q_slerp(float q[4], const float a[4], const float b[4], float t);
 
 #endif