31 res->
w = a->
w * b->
w - a->
x * b->
x - a->
y * b->
y - a->
z * b->
z;
32 res->
x = a->
w * b->
x + a->
x * b->
w + a->
y * b->
z - a->
z * b->
y;
33 res->
y = a->
w * b->
y - a->
x * b->
z + a->
y * b->
w + a->
z * b->
x;
34 res->
z = a->
w * b->
z + a->
x * b->
y - a->
y * b->
x + a->
z * b->
w;
39#ifdef VECMAT_RUNTIME_DISPATCH
41 quat_mul_ptr_(res, a, b);
60 res->
x = q->
x * inv_len;
61 res->
y = q->
y * inv_len;
62 res->
z = q->
z * inv_len;
63 res->
w = q->
w * inv_len;
74#ifdef VECMAT_RUNTIME_DISPATCH
76 quat_normalize_ptr_(res, q);
102 .x = sx * cy * cz - cx * sy * sz,
103 .y = cx * sy * cz + sx * cy * sz,
104 .z = cx * cy * sz - sx * sy * cz,
105 .w = cx * cy * cz + sx * sy * sz
132 res->
m11 = 1.0f - 2.0f * (yy + zz);
133 res->
m12 = 2.0f * (xy - wz);
134 res->
m13 = 2.0f * (xz + wy);
135 res->
m21 = 2.0f * (xy + wz);
136 res->
m22 = 1.0f - 2.0f * (xx + zz);
137 res->
m23 = 2.0f * (yz - wx);
138 res->
m31 = 2.0f * (xz - wy);
139 res->
m32 = 2.0f * (yz + wx);
140 res->
m33 = 1.0f - 2.0f * (xx + yy);
171 res->
x = -q->
x * inv;
172 res->
y = -q->
y * inv;
173 res->
z = -q->
z * inv;
207 res->
x = (m->
m32 - m->
m23) / s;
208 res->
y = (m->
m13 - m->
m31) / s;
209 res->
z = (m->
m21 - m->
m12) / s;
212 res->
w = (m->
m32 - m->
m23) / s;
214 res->
y = (m->
m12 + m->
m21) / s;
215 res->
z = (m->
m13 + m->
m31) / s;
216 }
else if (m->
m22 > m->
m33) {
218 res->
w = (m->
m13 - m->
m31) / s;
219 res->
x = (m->
m12 + m->
m21) / s;
221 res->
z = (m->
m23 + m->
m32) / s;
224 res->
w = (m->
m21 - m->
m12) / s;
225 res->
x = (m->
m13 + m->
m31) / s;
226 res->
y = (m->
m23 + m->
m32) / s;
241 .m11 = m->
m11, .m21 = m->
m21, .m31 = m->
m31,
242 .m12 = m->
m12, .m22 = m->
m22, .m32 = m->
m32,
243 .m13 = m->
m13, .m23 = m->
m23, .m33 = m->
m33
266 .x = a->
x + t * (bb.
x - a->
x),
267 .y = a->
y + t * (bb.
y - a->
y),
268 .z = a->
z + t * (bb.
z - a->
z),
269 .w = a->
w + t * (bb.
w - a->
w)
301 res->
x = a->
x * wa + bb.
x * wb;
302 res->
y = a->
y * wa + bb.
y * wb;
303 res->
z = a->
z * wa + bb.
z * wb;
304 res->
w = a->
w * wa + bb.
w * wb;
316 const quaternion p = {.x = v->
x, .y = v->
y, .z = v->
z, .w = 0.0f};
368 const vm_float_t w = (n.
w > 1.0f) ? 1.0f : (n.
w < -1.0f) ? -1.0f : n.
w;
#define VECMAT_SCALAR_API
void quat_mul_ptr(quaternion *res, const quaternion *a, const quaternion *b)
void quat_from_axis_angle_ptr(quaternion *res, const vector3 *axis, const vm_float_t degrees)
Builds a quaternion from an axis and an angle in degrees.
void quat_rotate_vec3_ptr(vector3 *res, const quaternion *q, const vector3 *v)
Rotates a vector3 by a quaternion.
void quat_to_axis_angle_ptr(vector3 *axis, vm_float_t *degrees, const quaternion *q)
Converts a quaternion to an axis and an angle in degrees.
void quat_from_mat4_ptr(quaternion *res, const matrix4 *m)
Builds a quaternion from the rotation of a 4x4 matrix.
void quat_from_mat3_ptr(quaternion *res, const matrix3 *m)
Builds a quaternion from a 3x3 rotation matrix.
VECMAT_SCALAR_API void quat_normalize_ptr_scalar(quaternion *res, const quaternion *q)
Normalizes the input quaternion and stores the result in res.
void quat_to_euler_ptr(vector3 *res, const quaternion *q)
Converts a quaternion to Euler angles in degrees (XYZ).
void quat_to_mat3_ptr(matrix3 *res, const quaternion *q)
Converts a quaternion to a 3x3 rotation matrix.
VECMAT_SCALAR_API void quat_mul_ptr_scalar(quaternion *res, const quaternion *a, const quaternion *b)
Multiplies two quaternions using Hamilton product (a * b) and stores the result in res.
void quat_slerp_ptr(quaternion *res, const quaternion *a, const quaternion *b, const vm_float_t t)
Spherical-linearly interpolates from a to b by t.
void quat_from_euler_ptr(quaternion *res, const vector3 *euler)
Converts Euler angles (in degrees, XYZ order: pitch, yaw, roll) to a quaternion and stores in res.
void quat_normalize_ptr(quaternion *res, const quaternion *q)
void quat_conjugate_ptr(quaternion *res, const quaternion *q)
Writes the conjugate of a quaternion.
void quat_nlerp_ptr(quaternion *res, const quaternion *a, const quaternion *b, const vm_float_t t)
Normalized-linearly interpolates from a to b by t.
void quat_to_mat4_ptr(matrix4 *res, const quaternion *q)
Converts a unit quaternion to a 4x4 rotation matrix and stores in res.
void quat_identity_ptr(quaternion *res)
Sets the quaternion to the identity quaternion (x=0, y=0, z=0, w=1).
void quat_inverse_ptr(quaternion *res, const quaternion *q)
Writes the inverse of a quaternion.
static const vm_float_t VM_RAD_TO_DEG
#define VECMAT_COPYSIGN(x, y)
vm_float_t rad_to_deg(vm_float_t radians)
Converts radians to degrees.
vm_float_t quat_dot(quaternion a, quaternion b)
Returns the dot product of two quaternions.
vector3 vec3_normalize(vector3 v)
Normalizes a vector3 to unit length.
vm_float_t deg_to_rad(vm_float_t degrees)
Converts degrees to radians.
#define VECMAT_ATAN2(y, x)
void mat4_identity_ptr(matrix4 *res)
Sets the matrix to the identity matrix.