33#define bj_quat_add bj_vec4_add
39#define bj_quat_sub bj_vec4_sub
45#define bj_quat_norm bj_vec4_normalize
51#define bj_quat_scale bj_vec4_scale
57#define bj_quat_dot bj_vec4_dot
97 for (
int i = 0; i < 3; ++i) {
129 bj_vec3 q_xyz = { q[0], q[1], q[2] };
130 bj_vec3 u = { q[0], q[1], q[2] };
158 res[0][0] = a2 + b2 - c2 - d2;
159 res[0][1] =
BJ_F(2.0) * (b * c + a * d);
160 res[0][2] =
BJ_F(2.0) * (b * d - a * c);
163 res[1][0] =
BJ_F(2) * (b * c - a * d);
164 res[1][1] = a2 - b2 + c2 - d2;
165 res[1][2] =
BJ_F(2.0) * (c * d + a * b);
168 res[2][0] =
BJ_F(2.0) * (b * d + a * c);
169 res[2][1] =
BJ_F(2.0) * (c * d - a * b);
170 res[2][2] = a2 - b2 - c2 + d2;
173 res[3][0] = res[3][1] = res[3][2] =
BJ_FZERO;
174 res[3][3] =
BJ_F(1.0);
189 R[3][0] = R[3][1] = R[3][2] =
BJ_FZERO;
207 int perm[] = { 0, 1, 2, 0, 1 };
210 for (i = 0; i < 3; i++) {
222 r =
bj_sqrt(
BJ_F(1.0) + M[i][i] - M[j][j] - M[k][k]);
224 if (r <
BJ_F(1e-6)) {
234 q[i] =
BJ_F(0.5) * r;
235 q[j] = (M[i][j] + M[j][i]) * inv;
236 q[k] = (M[k][i] + M[i][k]) * inv;
237 q[3] = (M[k][j] - M[j][k]) * inv;
General-purpose definitions for Banjo API.
#define BJ_INLINE
BJ_INLINE expands to an inline specifier appropriate for the toolchain.
Definition api.h:260
bj_real bj_vec3[3]
bj_vec3: 3D vector of bj_real values.
Definition vec.h:34
static void bj_mat4_from_quat(bj_mat4 res, const bj_quat q)
Convert unit quaternion to a 4×4 rotation matrix.
Definition quat.h:148
static void bj_vec3_add(bj_vec3 res, const bj_vec3 lhs, const bj_vec3 rhs)
Component-wise addition of two 3D vectors: res = lhs + rhs.
Definition vec.h:263
static void bj_quat_mul(bj_quat res, const bj_quat p, const bj_quat q)
Hamilton product: res = p * q.
Definition quat.h:76
static void bj_vec3_scale(bj_vec3 res, const bj_vec3 v, bj_real s)
Uniform scaling by scalar: res = v * s.
Definition vec.h:301
static void bj_quat_identity(bj_quat q)
Set quaternion to identity (no rotation).
Definition quat.h:63
static bj_real bj_vec3_dot(const bj_vec3 a, const bj_vec3 b)
Dot product of two 3D vectors.
Definition vec.h:313
#define bj_sin
Sine.
Definition math.h:221
bj_real bj_quat[4]
bj_quat: Quaternion stored as {x, y, z, w} with bj_real components.
Definition quat.h:27
bj_mat4x4 bj_mat4
bj_mat4: Alias for bj_mat4x4
Definition mat.h:50
#define BJ_FZERO
Zero constant in bj_real.
Definition math.h:64
static void bj_mat4_rotate_from_quat(bj_mat4 R, const bj_mat4 M, const bj_quat q)
Post-multiply matrix by rotation from quaternion: R = M * rot(q).
Definition quat.h:184
static void bj_quat_from_mat4(bj_quat q, const bj_mat4 M)
Extract a unit quaternion from a 4×4 rotation matrix.
Definition quat.h:203
#define bj_cos
Cosine.
Definition math.h:212
static void bj_quat_mul_vec3(bj_vec3 res, const bj_quat q, const bj_vec3 v)
Rotate a 3D vector by a unit quaternion.
Definition quat.h:127
static void bj_vec3_copy(bj_vec3 res, const bj_vec3 src)
Copy a 3D vector.
Definition vec.h:408
#define BJ_F(x)
Literal suffix helper for bj_real when float is selected.
Definition math.h:53
#define bj_sqrt
Square root.
Definition math.h:222
float bj_real
Selected real type for float configuration.
Definition math.h:51
static void bj_quat_rotation(bj_quat res, bj_real angle, const bj_vec3 axis)
Build a unit quaternion from axis-angle.
Definition quat.h:111
static void bj_vec3_cross(bj_vec3 res, const bj_vec3 l, const bj_vec3 r)
3D cross product: res = l × r (right-hand rule).
Definition vec.h:420
static void bj_quat_conjugate(bj_quat res, const bj_quat q)
Conjugate quaternion: (x,y,z,w) -> (-x,-y,-z,w).
Definition quat.h:95
static void bj_vec3_normalize(bj_vec3 res, const bj_vec3 v)
Normalize a 3D vector to unit length.
Definition vec.h:372
C99 math shim with bj_real precision type and scalar utilities.
C99 math shim with bj_real precision type and scalar utilities.