1 static CGM_INLINE cgm_vec3 cgm_vcons(float x, float y, float z)
10 static CGM_INLINE cgm_vec3 cgm_vadd(cgm_vec3 a, cgm_vec3 b)
12 return cgm_vcons(a.x + b.x, a.y + b.y, a.z + b.z);
15 static CGM_INLINE cgm_vec3 cgm_vsub(cgm_vec3 a, cgm_vec3 b)
17 return cgm_vcons(a.x - b.x, a.y - b.y, a.z - b.z);
20 static CGM_INLINE cgm_vec3 cgm_vmul(cgm_vec3 a, cgm_vec3 b)
22 return cgm_vcons(a.x * b.x, a.y * b.y, a.z * b.z);
25 static CGM_INLINE cgm_vec3 cgm_vscale(cgm_vec3 v, float s)
27 return cgm_vcons(a.x * s, a.y * s, a.z * s);
31 static CGM_INLINE cgm_vec3 cgm_vmul_m4v3(const float *m, cgm_vec3 v)
34 res.x = v.x * m[0] + v.y * m[4] + v.z * m[8] + m[12];
35 res.y = v.x * m[1] + v.y * m[5] + v.z * m[9] + m[13];
36 res.z = v.x * m[2] + v.y * m[6] + v.z * m[10] + m[14];
40 static CGM_INLINE cgm_vec3 cgm_vmul_v3m4(cgm_vec3 v, const float *m)
43 res.x = v.x * m[0] + v.y * m[1] + v.z * m[2] + m[3];
44 res.y = v.x * m[4] + v.y * m[5] + v.z * m[6] + m[7];
45 res.z = v.x * m[8] + v.y * m[9] + v.z * m[10] + m[11];
49 static CGM_INLINE cgm_vec3 cgm_vmul_m3v3(const float *m, cgm_vec3 v)
52 res.x = v.x * m[0] + v.y * m[4] + v.z * m[8];
53 res.y = v.x * m[1] + v.y * m[5] + v.z * m[9];
54 res.z = v.x * m[2] + v.y * m[6] + v.z * m[10];
58 static CGM_INLINE cgm_vec3 cgm_vmul_v3m3(cgm_vec3 v, const float *m)
61 res.x = v.x * m[0] + v.y * m[1] + v.z * m[2];
62 res.y = v.x * m[4] + v.y * m[5] + v.z * m[6];
63 res.z = v.x * m[8] + v.y * m[9] + v.z * m[10];
68 static CGM_INLINE float cgm_vdot(cgm_vec3 a, cgm_vec3 b)
70 return a.x * b.x + a.y * b.y + a.z * b.z;
73 static CGM_INLINE cgm_vec3 cgm_vcross(cgm_vec3 a, cgm_vec3 b)
76 res.x = a.y * b.z - a.z * b.y;
77 res.y = a.z * b.x - a.x * b.z;
78 res.z = a.x * b.y - a.y * b.x;
82 static CGM_INLINE float cgm_vlength(cgm_vec3 v)
84 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
87 static CGM_INLINE float cgm_vlength_sq(cgm_vec3 v)
89 return v.x * v.x + v.y * v.y + v.z * v.z;
92 static CGM_INLINE float cgm_vdist(cgm_vec3 a, cgm_vec3 b)
97 return sqrt(dx * dx + dy * dy + dz * dz);
100 static CGM_INLINE float cgm_vdist_sq(cgm_vec3 a, cgm_vec3 b)
102 float dx = a.x - b.x;
103 float dy = a.y - b.y;
104 float dz = a.z - b.z;
105 return dx * dx + dy * dy + dz * dz;
109 static CGM_INLINE cgm_vec3 cgm_normalize(cgm_vec3 v)
112 float len = cgm_vlength(v);
114 float s = 1.0f / len;
125 static CGM_INLINE cgm_vec3 cgm_vreflect(cgm_vec3 v, cgm_vec3 n)
127 float ndotv2 = cgm_vdot(v, n) * 2.0f;
128 return cgm_vcons(v.x - n.x * ndotv2, v.y - n.y * ndotv2, v.z - n.z * ndotv2);
131 static CGM_INLINE cgm_vec3 cgm_vrefract(cgm_vec3 v, cgm_vec3 n, float ior)
133 float ndotv = cgm_vdot(v, n);
134 float k = 1.0f - ior * ior * (1.0f - ndotv * ndotv);
136 return cgm_vreflect(v, n); /* TIR */
139 float sqrt_k = sqrt(k);
140 res.x = ior * v.x - (ior * ndotv + sqrt_k) * n.x;
141 res.y = ior * v.y - (ior * ndotv + sqrt_k) * n.y;
142 res.z = ior * v.z - (ior * ndotv + sqrt_k) * n.z;
148 static CGM_INLINE cgm_vec3 cgm_vrotate_quat(cgm_vec3 v, cgm_quat q)
150 cgm_quat vq, inv_q, tmp_q;
152 vq = cgm_qcons(v->x, v->y, v->z, 0.0f);
153 inv_q = cgm_qinvert(q);
154 tmp_q = cgm_qmul(q, vq);
155 tmp_q = cgm_qmul(tmp_q, inv_q);
156 return cgm_vcons(tmp_q.x, tmp_q.y, tmp_q.z);
159 static CGM_INLINE cgm_vec3 cgm_vrotate_axis(cgm_vec3 v, int axis, float angle)
162 cgm_mrotation_axis(m, axis, angle);
166 static CGM_INLINE cgm_vec3 cgm_vrotate(cgm_vec3 v, float angle, float x, float y, float z)
169 cgm_mrotation(m, angle, x, y, z);
173 static CGM_INLINE cgm_vec3 cgm_vrotate_euler(cgm_vec3 v, float a, float b, float c, enum cgm_euler_mode mode)
176 cgm_mrotation_euler(m, a, b, c, mode);
181 static CGM_INLINE cgm_vec3 cgm_vlerp(cgm_vec3 a, cgm_vec3 b, float t)
184 res.x = a.x + (b.x - a.x) * t;
185 res.y = a.y + (b.y - a.y) * t;
186 res.z = a.z + (b.z - a.z) * t;
190 static CGM_INLINE cgm_vec3 cgm_vblend(cgm_vec3 a, float fa, cgm_vec3 b, float fb)
193 res.x = a.x * fa + b.x * fb;
194 res.y = a.y * fa + b.y * fb;
195 res.z = a.z * fa + b.z * fb;