(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 *);
(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