first render
[nexus3d] / src / cgmath2 / cgmath2.h
index 0e34f38..ea6be7a 100644 (file)
@@ -4,7 +4,10 @@
 #include <math.h>
 #include <string.h>
 
-#define CGM_PI 3.141592653589793
+#define CGM_PI 3.141592653589793f
+#define CGM_HPI        (CGM_PI / 2.0f)
+#define CGM_QPI        (CGM_PI / 4.0f)
+#define CGM_2PI        (CGM_PI * 2.0f)
 
 typedef struct {
        float x, y;
@@ -71,7 +74,7 @@ static CGM_INLINE float cgm_vlength_sq(cgm_vec3 v);
 static CGM_INLINE float cgm_vdist(cgm_vec3 a, cgm_vec3 b);
 static CGM_INLINE float cgm_vdist_sq(cgm_vec3 a, cgm_vec3 b);
 
-static CGM_INLINE cgm_vec3 cgm_normalize(cgm_vec3 v);
+static CGM_INLINE cgm_vec3 cgm_vnormalize(cgm_vec3 v);
 
 static CGM_INLINE cgm_vec3 cgm_vreflect(cgm_vec3 v, cgm_vec3 n);
 static CGM_INLINE cgm_vec3 cgm_vrefract(cgm_vec3 v, cgm_vec3 n, float ior);
@@ -86,6 +89,53 @@ static CGM_INLINE cgm_vec3 cgm_vblend(cgm_vec3 a, float fa, cgm_vec3 b, float fb
 
 #define cgm_velem(v, idx)      ((&(v).x)[idx])
 
+/* --- operations on cgm_vec4 --- */
+static CGM_INLINE cgm_vec4 cgm_wcons(float x, float y, float z, float w);
+
+static CGM_INLINE cgm_vec4 cgm_wadd(cgm_vec4 a, cgm_vec4 b);
+static CGM_INLINE cgm_vec4 cgm_wsub(cgm_vec4 a, cgm_vec4 b);
+static CGM_INLINE cgm_vec4 cgm_wmul(cgm_vec4 a, cgm_vec4 b);
+static CGM_INLINE cgm_vec4 cgm_wscale(cgm_vec4 v, float s);
+
+static CGM_INLINE cgm_vec4 cgm_wmul_m4v4(const float *m, cgm_vec4 v);
+static CGM_INLINE cgm_vec4 cgm_wmul_v4m4(cgm_vec4 v, const float *m);
+static CGM_INLINE cgm_vec4 cgm_wmul_m34v4(const float *m, cgm_vec4 v); /* doesn't affect w */
+static CGM_INLINE cgm_vec4 cgm_wmul_v4m34(cgm_vec4 v, const float *m); /* doesn't affect w */
+static CGM_INLINE cgm_vec4 cgm_wmul_m3v4(const float *m, cgm_vec4 v); /* (m still 16 floats) */
+static CGM_INLINE cgm_vec4 cgm_wmul_v4m3(cgm_vec4 v, const float *m); /* (m still 16 floats) */
+
+static CGM_INLINE float cgm_wdot(cgm_vec4 a, cgm_vec4 b);
+
+static CGM_INLINE float cgm_wlength(cgm_vec4 v);
+static CGM_INLINE float cgm_wlength_sq(cgm_vec4 v);
+static CGM_INLINE float cgm_wdist(cgm_vec4 a, cgm_vec4 b);
+static CGM_INLINE float cgm_wdist_sq(cgm_vec4 a, cgm_vec4 b);
+static CGM_INLINE cgm_vec4 cgm_wnormalize(cgm_vec4 v);
+
+static CGM_INLINE cgm_vec4 cgm_wlerp(cgm_vec4 a, cgm_vec4 b, float t);
+
+#define cgm_welem(v, idx)      ((&(v).x)[idx])
+
+/* --- operations on quaternions --- */
+static CGM_INLINE cgm_quat cgm_qcons(float x, float y, float z, float w);
+
+static CGM_INLINE cgm_quat cgm_qneg(cgm_quat q);
+static CGM_INLINE cgm_quat cgm_qadd(cgm_quat a, cgm_quat b);
+static CGM_INLINE cgm_quat cgm_qsub(cgm_quat a, cgm_quat b);
+static CGM_INLINE cgm_quat cgm_qmul(cgm_quat a, cgm_quat b);
+
+static CGM_INLINE float cgm_qlength(cgm_quat q);
+static CGM_INLINE float cgm_qlength_sq(cgm_quat q);
+static CGM_INLINE cgm_quat cgm_qnormalize(cgm_quat q);
+static CGM_INLINE cgm_quat cgm_qconjugate(cgm_quat q);
+static CGM_INLINE cgm_quat cgm_qinvert(cgm_quat q);
+
+static CGM_INLINE cgm_quat cgm_qrotation(float angle, float x, float y, float z);
+static CGM_INLINE void cgm_qrotate(cgm_quat *q, float angle, float x, float y, float z);
+
+static CGM_INLINE cgm_quat cgm_qslerp(cgm_quat a, cgm_quat b, float t);
+static CGM_INLINE cgm_quat cgm_qlerp(cgm_quat a, cgm_quat b, float t);
+
 /* --- operations on matrices --- */
 static CGM_INLINE void cgm_mcopy(float *dest, const float *src);
 static CGM_INLINE void cgm_mzero(float *m);
@@ -182,8 +232,8 @@ static CGM_INLINE cgm_vec3 cgm_uvec_to_sph(cgm_vec3 v);
 static CGM_INLINE cgm_vec3 cgm_sph_to_uvec(float theta, float phi);
 
 #include "cgmvec3.inl"
-/*#include "cgmvec4.inl"
-#include "cgmquat.inl"*/
+#include "cgmvec4.inl"
+#include "cgmquat.inl"
 #include "cgmmat.inl"
 /*#include "cgmray.inl"*/
 #include "cgmmisc.inl"