Vecmat 0.2.3
C math and linear algebra library for 2D/3D graphics, physics, and science.
Loading...
Searching...
No Matches
vecmat.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025-2026 Igal Alkon
2// SPDX-FileCopyrightText: 2026 ALKONTEK <git@alkontek.com>
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifndef VECMAT_H
6#define VECMAT_H
7
8#include <math.h>
9#include <stdbool.h>
10#include <stdint.h>
11
12// Version macros
13#define VECMAT_VERSION_MAJOR 0
14#define VECMAT_VERSION_MINOR 2
15#define VECMAT_VERSION_PATCH 3
16
17#define VECMAT_STR_HELPER(x) #x
18#define VECMAT_STR(x) VECMAT_STR_HELPER(x)
19#define VECMAT_VERSION VECMAT_STR(VECMAT_VERSION_MAJOR) "." \
20 VECMAT_STR(VECMAT_VERSION_MINOR) "." VECMAT_STR(VECMAT_VERSION_PATCH)
21
22// Export macro for a shared library on Windows
23#ifdef _WIN32
24 #ifdef VEC_BUILD_SHARED
25 #define VEC_API __declspec(dllexport)
26 #else
27 #define VEC_API
28 #endif
29#else
30 #define VEC_API
31#endif
32
33/*******************************************************************************
34 * Mathematical constants
35 ******************************************************************************/
36
37#ifndef M_PI
38#define M_E 2.71828182845904523536 // e
39#define M_LOG2E 1.44269504088896340736 // log2(e)
40#define M_LOG10E 0.434294481903251827651 // log10(e)
41#define M_LN2 0.693147180559945309417 // ln(2)
42#define M_LN10 2.30258509299404568402 // ln(10)
43#define M_PI 3.14159265358979323846 // pi
44#define M_PI_2 1.57079632679489661923 // pi/2
45#define M_PI_4 0.785398163397448309616 // pi/4
46#define M_1_PI 0.318309886183790671538 // 1/pi
47#define M_2_PI 0.636619772367581343076 // 2/pi
48#define M_2_SQRTPI 1.12837916709551257390 // 2/sqrt(pi)
49#define M_SQRT2 1.41421356237309504880 // sqrt(2)
50#define M_SQRT1_2 0.707106781186547524401 // 1/sqrt(2)
51#endif
52
53static const float VM_DEG_TO_RAD_F32 = 0.017453292519943295769236907684886f;
54static const float VM_RAD_TO_DEG_F32 = 57.295779513082320876798154814105f;
55static const double VM_DEG_TO_RAD_F64 = 0.017453292519943295769236907684886;
56static const double VM_RAD_TO_DEG_F64 = 57.295779513082320876798154814105;
57
58#define VECMAT_FLT_MAX __FLT_MAX__
59#define VECMAT_DBL_MAX __DBL_MAX__
60
61#define VECMAT_FLT_MIN __FLT_MIN__
62#define VECMAT_DBL_MIN __DBL_MIN__
63
64#define VECMAT_VEC2_SIZE 2
65#define VECMAT_VEC3_SIZE 3
66#define VECMAT_VEC4_SIZE 4
67
68#define VECMAT_MAT2_SIZE 4
69#define VECMAT_MAT3_SIZE 9
70#define VECMAT_MAT4_SIZE 16
71
72#define VECMAT_QUAT_SIZE 4
73
74/*******************************************************************************
75 * Floating-point type
76 ******************************************************************************/
77
78#if defined(VECMAT_USE_F64)
79typedef double vm_float_t;
80#else
81typedef float vm_float_t;
82#endif
83
84#ifdef VECMAT_USE_F64
87#else
90#endif
91
92#ifdef VECMAT_USE_F64
93#define VM_F(x) x
94#else
95#define VM_F(x) x##f
96#endif
97
98/*******************************************************************************
99 * Integer type
100 ******************************************************************************/
101
102#if defined(VECMAT_USE_INT8)
103typedef int8_t vm_int_t;
104#define VEC_INT_MAX INT8_MAX
105#define VEC_INT_MIN INT8_MIN
106#elif defined(VECMAT_USE_INT16)
107typedef int16_t vm_int_t;
108#define VEC_INT_MAX INT16_MAX
109#define VEC_INT_MIN INT16_MIN
110#elif defined(VECMAT_USE_INT32)
111typedef int32_t vm_int_t;
112#define VEC_INT_MAX INT32_MAX
113#define VEC_INT_MIN INT32_MIN
114#else
115typedef int32_t vm_int_t;
116#define VEC_INT_MAX INT32_MAX
117#define VEC_INT_MIN INT32_MIN
118#endif
119
120/*******************************************************************************
121 * Floating-point vector types
122 ******************************************************************************/
123
124typedef struct {
125 union {
126 struct {
129 };
131 };
132} vector2;
133
134typedef struct {
135 union {
136 struct {
140 };
142 };
143} vector3;
144
145typedef struct {
146 union {
147 struct {
152 };
154 };
155} vector4;
156
157/*******************************************************************************
158 * Integer vector types
159 ******************************************************************************/
160
161typedef struct {
162 union {
163 struct {
166 };
168 };
169} vector2i;
170
171typedef struct {
172 union {
173 struct {
177 };
179 };
180} vector3i;
181
182typedef struct {
183 union {
184 struct {
189 };
191 };
192} vector4i;
193
194/*******************************************************************************
195 * Floating-point matrix types
196 ******************************************************************************/
197
198/*
199 * 2x2 MATRIX
200 * ---------------
201 * [0/m11] [2/m12]
202 * [1/m21] [3/m22]
203 * ---------------
204 */
205typedef struct {
206 union {
207 struct {
212 };
214 };
215} matrix2;
216
217/*
218 * 3X3 MATRIX
219 * -----------------------
220 * [0/m11] [3/m12] [6/m13]
221 * [1/m21] [4/m22] [7/m23]
222 * [2/m31] [5/m32] [8/m33]
223 * -----------------------
224 */
241
242/*
243 * 4x4 MATRIX
244 * -----------------------------------
245 * [ 0/m11] [ 4/m12] [ 8/m13] [12/m14]
246 * [ 1/m21] [ 5/m22] [ 9/m23] [13/m24]
247 * [ 2/m31] [ 6/m32] [10/m33] [14/m34]
248 * [ 3/m41] [ 7/m42] [11/m43] [15/m44]
249 * -----------------------------------
250 */
274
275/*******************************************************************************
276 * Integer matrix types
277 ******************************************************************************/
278
279/*
280 * 2x2 MATRIX
281 * ---------------
282 * [0/m11] [2/m12]
283 * [1/m21] [3/m22]
284 * ---------------
285 */
286typedef struct {
287 union {
288 struct {
293 };
295 };
296} matrix2i;
297
298/*
299 * 3X3 MATRIX
300 * -----------------------
301 * [0/m11] [3/m12] [6/m13]
302 * [1/m21] [4/m22] [7/m23]
303 * [2/m31] [5/m32] [8/m33]
304 * -----------------------
305 */
322
323/*
324 * 4x4 MATRIX
325 * -----------------------------------
326 * [ 0/m11] [ 4/m12] [ 8/m13] [12/m14]
327 * [ 1/m21] [ 5/m22] [ 9/m23] [13/m24]
328 * [ 2/m31] [ 6/m32] [10/m33] [14/m34]
329 * [ 3/m41] [ 7/m42] [11/m43] [15/m44]
330 * -----------------------------------
331 */
355
360typedef struct {
361 union {
362 struct {
367 };
369 };
370} quaternion;
371
372// Epsilon
373#define VECMAT_EPS_F32 1e-6f
374#define VECMAT_EPS_F64 1e-12
375
376#ifdef VECMAT_USE_F64
377#define VECMAT_EPSILON VECMAT_EPS_F64
378#else
379#define VECMAT_EPSILON VECMAT_EPS_F32
380#endif
381
390#define FLOAT_EQ(a, b, eps) (fabsf((a) - (b)) < (eps))
391
400#define DOUBLE_EQ(a, b, eps) (fabs((a) - (b)) < (eps))
401
402#ifdef VECMAT_USE_F64
403#define VECMAT_EQ(a, b, eps) DOUBLE_EQ((a), (b), (eps))
404#else
405#define VECMAT_EQ(a, b, eps) FLOAT_EQ((a), (b), (eps))
406#endif
407
408/*******************************************************************************
409 * Precision-selected <math.h> wrappers
410 ******************************************************************************/
411
412#ifdef VECMAT_USE_F64
413#define VECMAT_FABS(x) fabs((x))
414#define VECMAT_SQRT(x) sqrt((x))
415#define VECMAT_SIN(x) sin((x))
416#define VECMAT_COS(x) cos((x))
417#define VECMAT_TAN(x) tan((x))
418#define VECMAT_ASIN(x) asin((x))
419#define VECMAT_ACOS(x) acos((x))
420#define VECMAT_ATAN(x) atan((x))
421#define VECMAT_ATAN2(y, x) atan2((y), (x))
422#define VECMAT_FMIN(a, b) fmin((a), (b))
423#define VECMAT_FMAX(a, b) fmax((a), (b))
424#define VECMAT_FLOOR(x) floor((x))
425#define VECMAT_CEIL(x) ceil((x))
426#define VECMAT_ROUND(x) round((x))
427#define VECMAT_POW(x, y) pow((x), (y))
428#define VECMAT_COPYSIGN(x, y) copysign((x), (y))
429#else
430#define VECMAT_FABS(x) fabsf((x))
431#define VECMAT_SQRT(x) sqrtf((x))
432#define VECMAT_SIN(x) sinf((x))
433#define VECMAT_COS(x) cosf((x))
434#define VECMAT_TAN(x) tanf((x))
435#define VECMAT_ASIN(x) asinf((x))
436#define VECMAT_ACOS(x) acosf((x))
437#define VECMAT_ATAN(x) atanf((x))
438#define VECMAT_ATAN2(y, x) atan2f((y), (x))
439#define VECMAT_FMIN(a, b) fminf((a), (b))
440#define VECMAT_FMAX(a, b) fmaxf((a), (b))
441#define VECMAT_FLOOR(x) floorf((x))
442#define VECMAT_CEIL(x) ceilf((x))
443#define VECMAT_ROUND(x) roundf((x))
444#define VECMAT_POW(x, y) powf((x), (y))
445#define VECMAT_COPYSIGN(x, y) copysignf((x), (y))
446#endif
447
448/*******************************************************************************
449 * CPU feature detection and dispatch
450 ******************************************************************************/
451
452typedef uint32_t vm_cpu_features_t;
453
454enum {
455 VM_CPU_SCALAR = 1u << 0,
456 VM_CPU_AVX2 = 1u << 1,
457 VM_CPU_SVE = 1u << 2,
458 VM_CPU_AVX512 = 1u << 3,
459 VM_CPU_SVE2 = 1u << 4,
460 VM_CPU_AVX = 1u << 5
461};
462
466VEC_API const char *vm_cpu_name(vm_cpu_features_t features);
467VEC_API void vm_cpu_init(void);
468
469/*******************************************************************************
470 * Floating-point vector functions
471 ******************************************************************************/
472
473// vector2
515VEC_API vector2 vec2_move_toward(vector2 current, vector2 target, vm_float_t max_delta);
517
519
537
538// vector3
562VEC_API vector3 vec3_reflect(vector3 incident, vector3 normal);
579VEC_API vector3 vec3_move_toward(vector3 current, vector3 target, vm_float_t max_delta);
581
584
600
601// vector4
639
641
650
651/*******************************************************************************
652 * Floating-point vector pointer-based performance functions
653 ******************************************************************************/
654
655// vector2 pointer-based operations
656VEC_API void vec2_add_ptr(vector2 *res, const vector2 *a, const vector2 *b);
657VEC_API void vec2_sub_ptr(vector2 *res, const vector2 *a, const vector2 *b);
660VEC_API void vec2_mul_ptr(vector2 *res, const vector2 *a, const vector2 *b);
661VEC_API void vec2_neg_ptr(vector2 *res, const vector2 *v);
662VEC_API void vec2_abs_ptr(vector2 *res, const vector2 *v);
663VEC_API void vec2_normalize_ptr(vector2 *res, const vector2 *v);
664VEC_API void vec2_min_ptr(vector2 *res, const vector2 *a, const vector2 *b);
665VEC_API void vec2_max_ptr(vector2 *res, const vector2 *a, const vector2 *b);
666VEC_API void vec2_sign_ptr(vector2 *res, const vector2 *v);
667VEC_API void vec2_floor_ptr(vector2 *res, const vector2 *v);
668VEC_API void vec2_ceil_ptr(vector2 *res, const vector2 *v);
669VEC_API void vec2_round_ptr(vector2 *res, const vector2 *v);
670VEC_API void vec2_perpendicular_ptr(vector2 *res, const vector2 *v);
671VEC_API void vec2_scale_ptr(vector2 *res, const vector2 *v, vm_float_t s);
672VEC_API void vec2_cross_ptr(vector2 *res, const vector2 *a, const vector2 *b);
673VEC_API void vec2_reflect_ptr(vector2 *res, const vector2 *v, const vector2 *normal);
674VEC_API void vec2_project_ptr(vector2 *res, const vector2 *a, const vector2 *b);
675VEC_API void vec2_tangent_ptr(vector2 *res, const vector2 *v);
676VEC_API void vec2_rotate_ptr(vector2 *result, const vector2 *v, vm_float_t angle);
677VEC_API void vec2_slide_ptr(vector2 *result, const vector2 *v, const vector2 *normal);
678VEC_API void vec2_clamp_ptr(vector2 *res, const vector2 *v, const vector2 *min, const vector2 *max);
679VEC_API void vec2_lerp_ptr(vector2 *res, const vector2 *a, const vector2 *b, vm_float_t t);
680VEC_API void vec2_div_ptr(vector2 *res, const vector2 *a, const vector2 *b);
684VEC_API void vec2_saturate_ptr(vector2 *res, const vector2 *v);
685VEC_API void vec2_fract_ptr(vector2 *res, const vector2 *v);
686VEC_API void vec2_refract_ptr(vector2 *res, const vector2 *incident, const vector2 *normal, vm_float_t eta);
687VEC_API void vec2_reject_ptr(vector2 *res, const vector2 *a, const vector2 *b);
688VEC_API void vec2_rotate_around_ptr(vector2 *res, const vector2 *v, const vector2 *pivot, vm_float_t angle);
689VEC_API void vec2_move_toward_ptr(vector2 *res, const vector2 *current, const vector2 *target, vm_float_t max_delta);
690VEC_API void vec2_limit_length_ptr(vector2 *res, const vector2 *v, vm_float_t max_len);
691VEC_API void vec2_to_vec3_ptr(vector3 *res, const vector2 *v, vm_float_t z);
692
693// vector3 pointer-based operations
694VEC_API void vec3_add_ptr(vector3 *res, const vector3 *a, const vector3 *b);
695VEC_API void vec3_sub_ptr(vector3 *res, const vector3 *a, const vector3 *b);
698VEC_API void vec3_mul_ptr(vector3 *res, const vector3 *a, const vector3 *b);
699VEC_API void vec3_neg_ptr(vector3 *res, const vector3 *v);
700VEC_API void vec3_abs_ptr(vector3 *res, const vector3 *v);
701VEC_API void vec3_normalize_ptr(vector3 *res, const vector3 *v);
702VEC_API void vec3_cross_ptr(vector3 *res, const vector3 *a, const vector3 *b);
703VEC_API void vec3_min_ptr(vector3 *res, const vector3 *a, const vector3 *b);
704VEC_API void vec3_max_ptr(vector3 *res, const vector3 *a, const vector3 *b);
705VEC_API void vec3_sign_ptr(vector3 *res, const vector3 *v);
706VEC_API void vec3_floor_ptr(vector3 *res, const vector3 *v);
707VEC_API void vec3_ceil_ptr(vector3 *res, const vector3 *v);
708VEC_API void vec3_round_ptr(vector3 *res, const vector3 *v);
709VEC_API void vec3_reflect_ptr(vector3 *res, const vector3 *incident, const vector3 *normal);
710VEC_API void vec3_refract_ptr(vector3 *res, const vector3 *incident, const vector3 *normal, vm_float_t eta);
711VEC_API void vec3_lerp_ptr(vector3 *res, const vector3 *a, const vector3 *b, vm_float_t t);
712VEC_API void vec3_clamp_ptr(vector3 *res, const vector3 *v, const vector3 *min, const vector3 *max);
713VEC_API void vec3_scale_ptr(vector3 *res, const vector3 *v, vm_float_t s);
714VEC_API void vec3_div_ptr(vector3 *res, const vector3 *a, const vector3 *b);
718VEC_API void vec3_saturate_ptr(vector3 *res, const vector3 *v);
719VEC_API void vec3_fract_ptr(vector3 *res, const vector3 *v);
720VEC_API void vec3_project_ptr(vector3 *res, const vector3 *a, const vector3 *b);
721VEC_API void vec3_slide_ptr(vector3 *res, const vector3 *v, const vector3 *normal);
722VEC_API void vec3_reject_ptr(vector3 *res, const vector3 *a, const vector3 *b);
723VEC_API void vec3_rotate_axis_ptr(vector3 *res, const vector3 *v, const vector3 *axis, vm_float_t angle);
724VEC_API void vec3_from_vec2_ptr(vector3 *res, const vector2 *v, vm_float_t z);
725VEC_API void vec3_xy_ptr(vector2 *res, const vector3 *v);
726VEC_API void vec3_move_toward_ptr(vector3 *res, const vector3 *current, const vector3 *target, vm_float_t max_delta);
727VEC_API void vec3_limit_length_ptr(vector3 *res, const vector3 *v, vm_float_t max_len);
729
730// vector4 pointer-based operations
731VEC_API void vec4_add_ptr(vector4 *res, const vector4 *a, const vector4 *b);
732VEC_API void vec4_sub_ptr(vector4 *res, const vector4 *a, const vector4 *b);
735VEC_API void vec4_mul_ptr(vector4 *res, const vector4 *a, const vector4 *b);
736VEC_API void vec4_neg_ptr(vector4 *res, const vector4 *v);
737VEC_API void vec4_abs_ptr(vector4 *res, const vector4 *v);
738VEC_API void vec4_normalize_ptr(vector4 *res, const vector4 *v);
739VEC_API void vec4_min_ptr(vector4 *res, const vector4 *a, const vector4 *b);
740VEC_API void vec4_max_ptr(vector4 *res, const vector4 *a, const vector4 *b);
741VEC_API void vec4_sign_ptr(vector4 *res, const vector4 *v);
742VEC_API void vec4_floor_ptr(vector4 *res, const vector4 *v);
743VEC_API void vec4_ceil_ptr(vector4 *res, const vector4 *v);
744VEC_API void vec4_round_ptr(vector4 *res, const vector4 *v);
745VEC_API void vec4_lerp_ptr(vector4 *res, const vector4 *a, const vector4 *b, vm_float_t t);
746VEC_API void vec4_clamp_ptr(vector4 *res, const vector4 *v, const vector4 *min, const vector4 *max);
747VEC_API void vec4_homogenize_ptr(vector4 *res, const vector4 *v);
748VEC_API void vec4_div_ptr(vector4 *res, const vector4 *a, const vector4 *b);
752VEC_API void vec4_saturate_ptr(vector4 *res, const vector4 *v);
753VEC_API void vec4_fract_ptr(vector4 *res, const vector4 *v);
754VEC_API void vec4_project_ptr(vector4 *res, const vector4 *a, const vector4 *b);
755VEC_API void vec4_reject_ptr(vector4 *res, const vector4 *a, const vector4 *b);
756VEC_API void vec4_slide_ptr(vector4 *res, const vector4 *v, const vector4 *normal);
757VEC_API void vec4_to_vec3_ptr(vector3 *res, const vector4 *v);
758
759/*******************************************************************************
760 * Integer vector functions
761 ******************************************************************************/
762
763// vector2i
792
795
810
811// vector3i
842
845
858
859// vector4i
867
891
893
905
906/*******************************************************************************
907 * Integer vector (pointer-based) performance functions
908 ******************************************************************************/
909
910// vector2i pointer-based operations
911VEC_API void vec2i_add_ptr(vector2i *res, const vector2i *a, const vector2i *b);
912VEC_API void vec2i_sub_ptr(vector2i *res, const vector2i *a, const vector2i *b);
915VEC_API void vec2i_mul_ptr(vector2i *res, const vector2i *a, const vector2i *b);
916VEC_API void vec2i_neg_ptr(vector2i *res, const vector2i *v);
917VEC_API void vec2i_abs_ptr(vector2i *res, const vector2i *v);
918VEC_API void vec2i_normalize_ptr(vector2i *res, const vector2i *v);
919VEC_API void vec2i_min_ptr(vector2i *res, const vector2i *a, const vector2i *b);
920VEC_API void vec2i_max_ptr(vector2i *res, const vector2i *a, const vector2i *b);
921VEC_API void vec2i_sign_ptr(vector2i *res, const vector2i *v);
923VEC_API void vec2i_cross_ptr(vector2i *res, const vector2i *a, const vector2i *b);
924VEC_API void vec2i_lerp_ptr(vector2i *res, const vector2i *a, const vector2i *b, vm_float_t t);
925VEC_API void vec2i_clamp_ptr(vector2i *res, const vector2i *v, const vector2i *min, const vector2i *max);
926VEC_API void vec2i_div_ptr(vector2i *res, const vector2i *a, const vector2i *b);
929VEC_API void vec2i_mod_ptr(vector2i *res, const vector2i *a, const vector2i *b);
930VEC_API void vec2i_div_floor_ptr(vector2i *res, const vector2i *a, const vector2i *b);
931VEC_API void vec2i_wrap_ptr(vector2i *res, const vector2i *v, const vector2i *period);
932VEC_API void vec2i_to_vec3i_ptr(vector3i *res, const vector2i *v, vm_int_t z);
934
935// vector3i pointer-based operations
936VEC_API void vec3i_add_ptr(vector3i *res, const vector3i *a, const vector3i *b);
937VEC_API void vec3i_sub_ptr(vector3i *res, const vector3i *a, const vector3i *b);
940VEC_API void vec3i_mul_ptr(vector3i *res, const vector3i *a, const vector3i *b);
941VEC_API void vec3i_neg_ptr(vector3i *res, const vector3i *v);
942VEC_API void vec3i_abs_ptr(vector3i *res, const vector3i *v);
943VEC_API void vec3i_normalize_ptr(vector3i *res, const vector3i *v);
944VEC_API void vec3i_cross_ptr(vector3i *res, const vector3i *a, const vector3i *b);
945VEC_API void vec3i_min_ptr(vector3i *res, const vector3i *a, const vector3i *b);
946VEC_API void vec3i_max_ptr(vector3i *res, const vector3i *a, const vector3i *b);
947VEC_API void vec3i_sign_ptr(vector3i *res, const vector3i *v);
948VEC_API void vec3i_lerp_ptr(vector3i *res, const vector3i *a, const vector3i *b, vm_float_t t);
949VEC_API void vec3i_clamp_ptr(vector3i *res, const vector3i *v, const vector3i *min, const vector3i *max);
950VEC_API void vec3i_div_ptr(vector3i *res, const vector3i *a, const vector3i *b);
953VEC_API void vec3i_mod_ptr(vector3i *res, const vector3i *a, const vector3i *b);
954VEC_API void vec3i_div_floor_ptr(vector3i *res, const vector3i *a, const vector3i *b);
955VEC_API void vec3i_wrap_ptr(vector3i *res, const vector3i *v, const vector3i *period);
957VEC_API void vec3i_xy_ptr(vector2i *res, const vector3i *v);
959
960// vector4i pointer-based operations
961VEC_API void vec4i_add_ptr(vector4i *res, const vector4i *a, const vector4i *b);
962VEC_API void vec4i_sub_ptr(vector4i *res, const vector4i *a, const vector4i *b);
965VEC_API void vec4i_mul_ptr(vector4i *res, const vector4i *a, const vector4i *b);
966VEC_API void vec4i_neg_ptr(vector4i *res, const vector4i *v);
967VEC_API void vec4i_abs_ptr(vector4i *res, const vector4i *v);
968VEC_API void vec4i_normalize_ptr(vector4i *res, const vector4i *v);
969VEC_API void vec4i_min_ptr(vector4i *res, const vector4i *a, const vector4i *b);
970VEC_API void vec4i_max_ptr(vector4i *res, const vector4i *a, const vector4i *b);
971VEC_API void vec4i_sign_ptr(vector4i *res, const vector4i *v);
972VEC_API void vec4i_lerp_ptr(vector4i *res, const vector4i *a, const vector4i *b, vm_float_t t);
973VEC_API void vec4i_clamp_ptr(vector4i *res, const vector4i *v, const vector4i *min, const vector4i *max);
974VEC_API void vec4i_div_ptr(vector4i *res, const vector4i *a, const vector4i *b);
977VEC_API void vec4i_mod_ptr(vector4i *res, const vector4i *a, const vector4i *b);
978VEC_API void vec4i_div_floor_ptr(vector4i *res, const vector4i *a, const vector4i *b);
979VEC_API void vec4i_wrap_ptr(vector4i *res, const vector4i *v, const vector4i *period);
980VEC_API void vec4i_to_vec3i_ptr(vector3i *res, const vector4i *v);
981
982/*******************************************************************************
983 * Floating-point matrix functions
984 ******************************************************************************/
985
986// matrix2
994
996
998
999// matrix3
1010
1013
1015
1016// matrix4
1027VEC_API matrix4 mat4_trs(vector3 translation, quaternion rotation, vector3 scale);
1031VEC_API matrix4 mat4_look_at(vector3 position, vector3 target, vector3 up);
1034
1040
1042
1043/*******************************************************************************
1044 * Floating-point matrix pointer-based performance functions
1045 ******************************************************************************/
1046
1047// matrix2 pointer-based operations
1049VEC_API void mat2_mul_ptr(matrix2 *res, const matrix2 *a, const matrix2 *b);
1050VEC_API void mat2_transpose_ptr(matrix2 *res, const matrix2 *m);
1051VEC_API void mat2_inverse_ptr(matrix2 *res, const matrix2 *m);
1052VEC_API void mat2_rotation_z_ptr(matrix2 *res, vm_float_t degrees);
1053VEC_API void mat2_scale_ptr(matrix2 *res, const vector2 *s);
1054VEC_API void mat2_from_mat3_ptr(matrix2 *res, const matrix3 *m);
1055VEC_API void mat2_mul_vec2_ptr(vector2 *res, const matrix2 *m, const vector2 *v);
1056
1057// matrix3 pointer-based operations
1059VEC_API void mat3_mul_ptr(matrix3 *res, const matrix3 *a, const matrix3 *b);
1060VEC_API void mat3_transpose_ptr(matrix3 *res, const matrix3 *m);
1061VEC_API void mat3_inverse_ptr(matrix3 *res, const matrix3 *m);
1062VEC_API void mat3_rotation_x_ptr(matrix3 *res, vm_float_t degrees);
1063VEC_API void mat3_rotation_y_ptr(matrix3 *res, vm_float_t degrees);
1064VEC_API void mat3_rotation_z_ptr(matrix3 *res, vm_float_t degrees);
1065VEC_API void mat3_translate_ptr(matrix3 *res, const vector2 *t);
1066VEC_API void mat3_scale_ptr(matrix3 *res, const vector2 *s);
1067VEC_API void mat3_from_mat4_ptr(matrix3 *res, const matrix4 *m);
1068VEC_API void mat3_mul_vec3_ptr(vector3 *res, const matrix3 *m, const vector3 *v);
1069VEC_API void mat3_mul_vec2_ptr(vector2 *res, const matrix3 *m, const vector2 *v);
1070
1071// matrix4 pointer-based operations
1073VEC_API void mat4_mul_ptr(matrix4 *res, const matrix4 *a, const matrix4 *b);
1074VEC_API void mat4_transpose_ptr(matrix4 *res, const matrix4 *m);
1075VEC_API void mat4_inverse_ptr(matrix4 *res, const matrix4 *m);
1076VEC_API void mat4_translate_ptr(matrix4 *res, const vector3 *v);
1077VEC_API void mat4_scale_ptr(matrix4 *res, const vector3 *v);
1078VEC_API void mat4_rotation_ptr(matrix4 *res, const vector3 *axis, vm_float_t angle);
1079VEC_API void mat4_rotation_x_ptr(matrix4 *res, vm_float_t degrees);
1080VEC_API void mat4_rotation_y_ptr(matrix4 *res, vm_float_t degrees);
1081VEC_API void mat4_rotation_z_ptr(matrix4 *res, vm_float_t degrees);
1082VEC_API void mat4_trs_ptr(matrix4 *res, const vector3 *translation, const quaternion *rotation, const vector3 *scale);
1083VEC_API void mat4_from_mat3_ptr(matrix4 *res, const matrix3 *m);
1085VEC_API void mat4_extract_scale_ptr(vector3 *res, const matrix4 *m);
1088VEC_API void mat4_ortho_ptr(matrix4 *res, vm_float_t left, vm_float_t right, vm_float_t bottom, vm_float_t top, vm_float_t near, vm_float_t far);
1089VEC_API void mat4_look_at_ptr(matrix4 *res, const vector3 *position, const vector3 *target, const vector3 *up);
1092VEC_API void mat4_mul_vec4_ptr(vector4 *res, const matrix4 *m, const vector4 *v);
1093VEC_API void mat4_mul_vec3_ptr(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w);
1094
1095/*******************************************************************************
1096 * Integer matrix functions
1097 ******************************************************************************/
1098
1099// matrix2i
1104
1106
1108
1109// matrix3i
1114
1117
1119
1120// matrix4i
1125
1128
1130
1131/*******************************************************************************
1132 * Integer matrix pointer-based performance functions
1133 ******************************************************************************/
1134
1135// matrix2i pointer-based operations
1137VEC_API void mat2i_mul_ptr(matrix2i *res, const matrix2i *a, const matrix2i *b);
1138VEC_API void mat2i_transpose_ptr(matrix2i *res, const matrix2i *m);
1139VEC_API void mat2i_inverse_ptr(matrix2i *res, const matrix2i *m);
1140VEC_API void mat2i_mul_vec2i_ptr(vector2i *res, const matrix2i *m, const vector2i *v);
1141
1142// matrix3i pointer-based operations
1144VEC_API void mat3i_mul_ptr(matrix3i *res, const matrix3i *a, const matrix3i *b);
1145VEC_API void mat3i_transpose_ptr(matrix3i *res, const matrix3i *m);
1146VEC_API void mat3i_inverse_ptr(matrix3i *res, const matrix3i *m);
1147VEC_API void mat3i_mul_vec3i_ptr(vector3i *res, const matrix3i *m, const vector3i *v);
1148VEC_API void mat3i_mul_vec2i_ptr(vector2i *res, const matrix3i *m, const vector2i *v);
1149
1150// matrix4i pointer-based operations
1152VEC_API void mat4i_mul_ptr(matrix4i *res, const matrix4i *a, const matrix4i *b);
1153VEC_API void mat4i_transpose_ptr(matrix4i *res, const matrix4i *m);
1154VEC_API void mat4i_inverse_ptr(matrix4i *res, const matrix4i *m);
1155VEC_API void mat4i_mul_vec4i_ptr(vector4i *res, const matrix4i *m, const vector4i *v);
1156VEC_API void mat4i_mul_vec3i_ptr(vector3i *res, const matrix4i *m, const vector3i *v, vm_int_t w);
1157
1158/*******************************************************************************
1159 * Quaternion functions
1160 ******************************************************************************/
1161
1173
1177
1180
1183
1184/*******************************************************************************
1185 * Quaternion pointer-based performance functions
1186 ******************************************************************************/
1187
1189VEC_API void quat_mul_ptr(quaternion *res, const quaternion *a, const quaternion *b);
1190VEC_API void quat_normalize_ptr(quaternion *res, const quaternion *q);
1191VEC_API void quat_conjugate_ptr(quaternion *res, const quaternion *q);
1192VEC_API void quat_inverse_ptr(quaternion *res, const quaternion *q);
1193VEC_API void quat_from_euler_ptr(quaternion *res, const vector3 *euler);
1194VEC_API void quat_from_axis_angle_ptr(quaternion *res, const vector3 *axis, vm_float_t degrees);
1195VEC_API void quat_from_mat3_ptr(quaternion *res, const matrix3 *m);
1196VEC_API void quat_from_mat4_ptr(quaternion *res, const matrix4 *m);
1197VEC_API void quat_slerp_ptr(quaternion *res, const quaternion *a, const quaternion *b, vm_float_t t);
1198VEC_API void quat_nlerp_ptr(quaternion *res, const quaternion *a, const quaternion *b, vm_float_t t);
1199VEC_API void quat_rotate_vec3_ptr(vector3 *res, const quaternion *q, const vector3 *v);
1200VEC_API void quat_to_euler_ptr(vector3 *res, const quaternion *q);
1201VEC_API void quat_to_axis_angle_ptr(vector3 *axis, vm_float_t *degrees, const quaternion *q);
1202VEC_API void quat_to_mat4_ptr(matrix4 *res, const quaternion *q);
1203VEC_API void quat_to_mat3_ptr(matrix3 *res, const quaternion *q);
1204
1205/*******************************************************************************
1206 * Conversion functions
1207 ******************************************************************************/
1208
1217
1220
1221/*******************************************************************************
1222 * Assigment functions
1223 ******************************************************************************/
1224
1226VEC_API void vec2_assign(vector2 *dest, const vector2 *src);
1228VEC_API void vec2_add_assign(vector2 *dest, const vector2 *src);
1229
1231VEC_API void vec3_assign(vector3 *dest, const vector3 *src);
1233VEC_API void vec3_add_assign(vector3 *dest, const vector3 *src);
1234
1236VEC_API void vec2i_assign(vector2i *dest, const vector2i *src);
1238VEC_API void vec2i_add_assign(vector2i *dest, const vector2i *src);
1239
1241VEC_API void vec3i_assign(vector3i *dest, const vector3i *src);
1243VEC_API void vec3i_add_assign(vector3i *dest, const vector3i *src);
1244
1245/*******************************************************************************
1246 * Compare functions
1247 ******************************************************************************/
1248
1249VEC_API bool vec2_eq(vector2 a, vector2 b);
1250VEC_API bool vec3_eq(vector3 a, vector3 b);
1251VEC_API bool vec4_eq(vector4 a, vector4 b);
1252
1256
1257VEC_API bool mat2_eq(matrix2 a, matrix2 b);
1258VEC_API bool mat3_eq(matrix3 a, matrix3 b);
1259VEC_API bool mat4_eq(matrix4 a, matrix4 b);
1260
1264
1266
1267/*******************************************************************************
1268 * Easing functions
1269 ******************************************************************************/
1270
1271// Easing helper functions
1276
1277// Quadratic easing
1281
1282// Cubic easing
1286
1287// Quartic easing
1291
1292// Quintic easing
1296
1297// Sine easing
1301
1302// Circular easing
1306
1307// Exponential easing
1311
1312// Elastic easing
1316
1317// Back easing
1321
1322// Bounce easing
1326
1327#endif // VECMAT_H
vm_float_t v[VECMAT_MAT2_SIZE]
Definition vecmat.h:213
vm_float_t m12
Definition vecmat.h:210
vm_float_t m11
Definition vecmat.h:208
vm_float_t m21
Definition vecmat.h:209
vm_float_t m22
Definition vecmat.h:211
vm_int_t m11
Definition vecmat.h:289
vm_int_t v[VECMAT_MAT2_SIZE]
Definition vecmat.h:294
vm_int_t m22
Definition vecmat.h:292
vm_int_t m21
Definition vecmat.h:290
vm_int_t m12
Definition vecmat.h:291
vm_float_t v[VECMAT_MAT3_SIZE]
Definition vecmat.h:238
vm_float_t m13
Definition vecmat.h:234
vm_float_t m21
Definition vecmat.h:229
vm_float_t m32
Definition vecmat.h:233
vm_float_t m23
Definition vecmat.h:235
vm_float_t m12
Definition vecmat.h:231
vm_float_t m33
Definition vecmat.h:236
vm_float_t m11
Definition vecmat.h:228
vm_float_t m31
Definition vecmat.h:230
vm_float_t m22
Definition vecmat.h:232
vm_int_t m11
Definition vecmat.h:309
vm_int_t m13
Definition vecmat.h:315
vm_int_t m23
Definition vecmat.h:316
vm_int_t m31
Definition vecmat.h:311
vm_int_t v[VECMAT_MAT3_SIZE]
Definition vecmat.h:319
vm_int_t m21
Definition vecmat.h:310
vm_int_t m33
Definition vecmat.h:317
vm_int_t m32
Definition vecmat.h:314
vm_int_t m22
Definition vecmat.h:313
vm_int_t m12
Definition vecmat.h:312
vm_float_t m44
Definition vecmat.h:269
vm_float_t v[VECMAT_MAT4_SIZE]
Definition vecmat.h:271
vm_float_t m12
Definition vecmat.h:258
vm_float_t m41
Definition vecmat.h:257
vm_float_t m13
Definition vecmat.h:262
vm_float_t m33
Definition vecmat.h:264
vm_float_t m42
Definition vecmat.h:261
vm_float_t m23
Definition vecmat.h:263
vm_float_t m21
Definition vecmat.h:255
vm_float_t m43
Definition vecmat.h:265
vm_float_t m22
Definition vecmat.h:259
vm_float_t m32
Definition vecmat.h:260
vm_float_t m24
Definition vecmat.h:267
vm_float_t m11
Definition vecmat.h:254
vm_float_t m31
Definition vecmat.h:256
vm_float_t m14
Definition vecmat.h:266
vm_float_t m34
Definition vecmat.h:268
vm_int_t m41
Definition vecmat.h:338
vm_int_t m33
Definition vecmat.h:345
vm_int_t v[VECMAT_MAT4_SIZE]
Definition vecmat.h:352
vm_int_t m14
Definition vecmat.h:347
vm_int_t m13
Definition vecmat.h:343
vm_int_t m34
Definition vecmat.h:349
vm_int_t m44
Definition vecmat.h:350
vm_int_t m23
Definition vecmat.h:344
vm_int_t m11
Definition vecmat.h:335
vm_int_t m12
Definition vecmat.h:339
vm_int_t m22
Definition vecmat.h:340
vm_int_t m24
Definition vecmat.h:348
vm_int_t m31
Definition vecmat.h:337
vm_int_t m32
Definition vecmat.h:341
vm_int_t m43
Definition vecmat.h:346
vm_int_t m21
Definition vecmat.h:336
vm_int_t m42
Definition vecmat.h:342
vm_float_t y
Definition vecmat.h:364
vm_float_t x
Definition vecmat.h:363
vm_float_t z
Definition vecmat.h:365
vm_float_t w
Definition vecmat.h:366
vm_float_t v[VECMAT_QUAT_SIZE]
Definition vecmat.h:368
vm_float_t v[VECMAT_VEC2_SIZE]
Definition vecmat.h:130
vm_float_t y
Definition vecmat.h:128
vm_float_t x
Definition vecmat.h:127
vm_int_t y
Definition vecmat.h:165
vm_int_t x
Definition vecmat.h:164
vm_int_t v[VECMAT_VEC2_SIZE]
Definition vecmat.h:167
vm_float_t v[VECMAT_VEC3_SIZE]
Definition vecmat.h:141
vm_float_t z
Definition vecmat.h:139
vm_float_t y
Definition vecmat.h:138
vm_float_t x
Definition vecmat.h:137
vm_int_t x
Definition vecmat.h:174
vm_int_t y
Definition vecmat.h:175
vm_int_t v[VECMAT_VEC3_SIZE]
Definition vecmat.h:178
vm_int_t z
Definition vecmat.h:176
vm_float_t z
Definition vecmat.h:150
vm_float_t v[VECMAT_VEC4_SIZE]
Definition vecmat.h:153
vm_float_t x
Definition vecmat.h:148
vm_float_t y
Definition vecmat.h:149
vm_float_t w
Definition vecmat.h:151
vm_int_t z
Definition vecmat.h:187
vm_int_t y
Definition vecmat.h:186
vm_int_t w
Definition vecmat.h:188
vm_int_t v[VECMAT_VEC4_SIZE]
Definition vecmat.h:190
vm_int_t x
Definition vecmat.h:185
void vec2i_perpendicular_ptr(vector2i *res, const vector2i *v)
Computes the perpendicular vector to v (90 degrees counterclockwise rotation), storing the result in ...
vector3i vec3i_mod(vector3i a, vector3i b)
Component-wise floor modulo of a by b.
Definition vector3i.c:422
matrix3 mat3_mul(matrix3 a, matrix3 b)
Multiplies two 3x3 matrices.
Definition matrix3.c:30
void vec3_add_scalar_ptr(vector3 *res, const vector3 *v, vm_float_t s)
Adds a scalar to each component.
vm_int_t vec3i_max_component(vector3i v)
Returns the largest component.
Definition vector3i.c:593
vm_float_t vec2_distance_squared(vector2 a, vector2 b)
Returns the squared Euclidean distance between a and b.
Definition vector2.c:778
void mat4_mul_vec3_ptr(vector3 *res, const matrix4 *m, const vector3 *v, vm_float_t w)
vector3 vec3_limit_length(vector3 v, vm_float_t max_len)
Clamps the vector length to max_len.
Definition vector3.c:675
void vec3i_cross_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the cross-product of two vector3i.
vector4 vec4_z_axis(vm_float_t z)
Returns a vector4 along the z-axis.
Definition vector4.c:55
static const vm_float_t VM_DEG_TO_RAD
Definition vecmat.h:85
vector4i vec4i_div_floor(vector4i a, vector4i b)
Component-wise floored division of a by b.
Definition vector4i.c:443
void vec3_mul_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Component-wise multiplication of two vectors.
Definition vector3_ptr.c:74
void vec2_rotate_ptr(vector2 *result, const vector2 *v, vm_float_t angle)
Rotates the input vector counterclockwise by the given angle (radians).
void vec2i_assign(vector2i *dest, const vector2i *src)
Copies src into dest.
Definition vecmat.c:291
void vec3_abs_ptr(vector3 *res, const vector3 *v)
Computes the absolute value per component of a vector3.
void mat2i_transpose_ptr(matrix2i *res, const matrix2i *m)
Computes the transpose of the input integer 2x2 matrix and stores in res.
vm_int_t vec4i_distance_squared(vector4i a, vector4i b)
Returns the squared Euclidean distance between a and b.
Definition vector4i.c:497
vm_float_t vec2_distance(vector2 a, vector2 b)
Computes the Euclidean distance between two vectors (treated as points).
Definition vector2.c:476
void quat_mul_ptr(quaternion *res, const quaternion *a, const quaternion *b)
vector4 vec4_add(vector4 a, vector4 b)
Component-wise addition of two vectors.
Definition vector4.c:124
void mat2i_mul_ptr(matrix2i *res, const matrix2i *a, const matrix2i *b)
Multiplies two integer 2x2 matrices (a * b) using explicit loops and stores the result in res.
vm_float_t quadratic_ease_out(vm_float_t f)
Definition easing.c:32
matrix2i mat2i_identity(void)
Constructs the 2x2 integer identity matrix.
Definition matrix2i.c:14
vector2i vec2i_mul(vector2i a, vector2i b)
Multiplies two vectors component-wise (Hadamard product).
Definition vector2i.c:145
void vec3i_wrap_ptr(vector3i *res, const vector3i *v, const vector3i *period)
Wraps each component of v into [0, period).
matrix4 mat4_transpose(matrix4 m)
Computes the transpose of a 4x4 matrix.
Definition matrix4.c:45
void vec4i_div_scalar_ptr(vector4i *res, const vector4i *v, vm_int_t s)
Divides the components of a vector4i by a scalar and stores the result in res.
void mat4_ortho_ptr(matrix4 *res, vm_float_t left, vm_float_t right, vm_float_t bottom, vm_float_t top, vm_float_t near, vm_float_t far)
Sets the matrix to an orthographic projection matrix.
void mat4_rotation_x_ptr(matrix4 *res, vm_float_t degrees)
Builds a 4x4 rotation matrix around the X axis (degrees).
matrix4 mat4_rotation(vector3 axis, vm_float_t angle)
Constructs a rotation matrix around the given axis by the specified angle (in radians).
Definition matrix4.c:106
void vec4i_lerp_ptr(vector4i *res, const vector4i *a, const vector4i *b, vm_float_t t)
Linearly interpolates between two vector4i using an interpolation factor t (clamped to [0,...
vm_float_t vec4_dot(vector4 a, vector4 b)
Computes the dot product of two vector4.
Definition vector4.c:388
vm_float_t quadratic_ease_in(vm_float_t f)
Definition easing.c:37
vm_float_t vec4_length_squared(vector4 v)
Returns the squared Euclidean length.
Definition vector4.c:592
vector4 vec4_floor(vector4 v)
Applies the floor per component to a vector4.
Definition vector4.c:295
void vec3i_clamp_ptr(vector3i *res, const vector3i *v, const vector3i *min, const vector3i *max)
Clamps each component of a vector3i between corresponding min and max values.
vector2 vec2_move_toward(vector2 current, vector2 target, vm_float_t max_delta)
Moves current toward target by at most max_delta.
Definition vector2.c:699
void vec4_to_vec3_ptr(vector3 *res, const vector4 *v)
Copies the x, y, z components from a vector4 to a vector3.
vm_float_t vec2i_angle(vector2i a, vector2i b)
Computes the signed angle between two vectors (in radians, range [-PI, PI]) using atan2(cross,...
Definition vector2i.c:322
vector2 vec2_limit_length(vector2 v, vm_float_t max_len)
Clamps the vector length to max_len.
Definition vector2.c:715
matrix4 mat4_look_at(vector3 position, vector3 target, vector3 up)
Constructs a view matrix from eye position, target, and up vector.
Definition matrix4.c:162
vector2i vec2i_min(vector2i a, vector2i b)
Returns the component-wise minimum of two vectors.
Definition vector2i.c:206
vector4 vec4_clamp(vector4 v, vector4 min, vector4 max)
Clamps a vector4 between min and max per component.
Definition vector4.c:359
void vec2i_div_floor_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Component-wise floored division of a by b.
matrix3 quat_to_mat3(quaternion q)
Converts a quaternion to a 3x3 rotation matrix.
Definition quaternion.c:247
vector4 vec4_slide(vector4 v, vector4 normal)
Removes the component of v along normal.
Definition vector4.c:566
void vec2i_add_assign(vector2i *dest, const vector2i *src)
Adds src to dest in place.
Definition vecmat.c:316
void mat2i_mul_vec2i_ptr(vector2i *res, const matrix2i *m, const vector2i *v)
Multiplies a 2x2 integer matrix by a vector2i.
void vec3_min_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Component-wise minimum of two vectors.
vm_float_t vec3_min_component(vector3 v)
Returns the smallest component.
Definition vector3.c:777
vector3i vec3i_div(vector3i a, vector3i b)
Divides two vectors component-wise.
Definition vector3i.c:374
void vec2_min_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Computes the component-wise minimum of vectors a and b, storing the result in res.
static const float VM_DEG_TO_RAD_F32
Definition vecmat.h:53
bool vec3_eq(vector3 a, vector3 b)
Returns true if two vectors are equal within VECMAT_EPSILON.
Definition vecmat.c:50
vm_int_t vec3i_length_squared(vector3i v)
Returns the squared Euclidean length.
Definition vector3i.c:526
void vec4i_add_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Adds the components of two vector4i and stores the result in res.
void mat4i_mul_vec3i_ptr(vector3i *res, const matrix4i *m, const vector3i *v, vm_int_t w)
Transforms a vector3i by a 4x4 integer matrix using homogeneous w.
vector2 vec2_fract(vector2 v)
Returns the fractional part of each component.
Definition vector2.c:606
vm_float_t vec3_length_manhattan(vector3 v)
Returns the Manhattan (L1) length.
Definition vector3.c:726
void vec3i_mod_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Component-wise floor modulo of a by b.
void mat2_scale_ptr(matrix2 *res, const vector2 *s)
Builds a 2x2 scaling matrix from a vector2.
void mat3_identity_ptr(matrix3 *res)
Initializes the 3x3 matrix to identity (diagonal 1.0, others 0.0).
Definition matrix3_ptr.c:12
vector3i vec3i_div_scalar(vector3i v, vm_int_t s)
Component-wise division of vector by scalar.
Definition vector3i.c:150
void mat4i_mul_ptr(matrix4i *res, const matrix4i *a, const matrix4i *b)
Performs matrix multiplication of two 4x4 matrices and stores the result.
#define VECMAT_MAT2_SIZE
Definition vecmat.h:68
vm_int_t vec4i_length_chebyshev(vector4i v)
Returns the Chebyshev (L-inf) length.
Definition vector4i.c:523
void vec3_sign_ptr(vector3 *res, const vector3 *v)
Component-wise sign of a vector.
vm_cpu_features_t vm_cpu_compiled_features(void)
Definition cpu.c:130
void vec4i_to_vec3i_ptr(vector3i *res, const vector4i *v)
Copies the x, y, z components of a vector4i and stores the result in a vector3i.
void mat4_scale_ptr(matrix4 *res, const vector3 *v)
Sets the matrix to a scaling matrix using the provided scale vector.
void mat3_mul_vec2_ptr(vector2 *res, const matrix3 *m, const vector2 *v)
Applies a 3x3 affine transform to a vector2.
void mat4_mul_vec4_ptr(vector4 *res, const matrix4 *m, const vector4 *v)
vector2 vec2i_normalize_to_vec2(vector2i v)
Converts to a unit-length vector2.
Definition vector2i.c:513
vector2 vec2_sub_scalar(vector2 v, vm_float_t s)
Subtracts a scalar from each component.
Definition vector2.c:559
void vec2_clamp_ptr(vector2 *res, const vector2 *v, const vector2 *min, const vector2 *max)
Clamps vector v component-wise between min and max.
void vec3_clamp_ptr(vector3 *res, const vector3 *v, const vector3 *min, const vector3 *max)
Clamp vector components between min and max.
vector3 vec3_z_axis(vm_float_t z)
Returns a vector3 along the z-axis.
Definition vector3.c:55
vector3i vec4i_to_vec3i(vector4i v)
Converts a vector4i to a vector3i (discards the w component).
Definition vector4i.c:363
matrix4 mat4_perspective_infinite(vm_float_t fov_y, vm_float_t aspect, vm_float_t n)
Constructs an infinite far-plane perspective projection matrix.
Definition matrix4.c:199
void quat_rotate_vec3_ptr(vector3 *res, const quaternion *q, const vector3 *v)
Rotates a vector3 by a quaternion.
void mat3_translate_ptr(matrix3 *res, const vector2 *t)
Builds a 3x3 2D translation matrix.
vm_int_t vec4i_sum(vector4i v)
Returns the sum of all components.
Definition vector4i.c:571
#define VECMAT_QUAT_SIZE
Definition vecmat.h:72
void vec2i_sub_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Subtracts vector b from vector a component-wise, storing the result in res.
matrix4i mat4i_inverse(matrix4i m)
Computes the inverse of a 4x4 integer matrix.
Definition matrix4i.c:60
vector2i vec2i_div_floor(vector2i a, vector2i b)
Component-wise floored division of a by b.
Definition vector2i.c:453
void vec3_scale_ptr(vector3 *res, const vector3 *v, vm_float_t s)
Scales the vector by a scalar.
void vec4i_div_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Divides two vectors component-wise.
vector3 vec3_mul(vector3 a, vector3 b)
Component-wise multiplication of two vectors.
Definition vector3.c:166
vector3i vec3i_normalize(vector3i v)
Normalizes a vector3i to unit length.
Definition vector3i.c:227
void vec2_perpendicular_ptr(vector2 *res, const vector2 *v)
Computes the perpendicular vector to v (90 degrees counterclockwise rotation), storing the result in ...
bool vec4i_is_zero(vector4i v)
Returns true if every component is zero.
Definition vector4i.c:582
void vec4_sub_scalar_ptr(vector4 *res, const vector4 *v, vm_float_t s)
vm_float_t vec3i_distance(vector3i a, vector3i b)
Computes the Euclidean distance between two vector3i.
Definition vector3i.c:344
void mat3_from_mat4_ptr(matrix3 *res, const matrix4 *m)
Copies the upper-left 3x3 of a matrix4.
void vec4i_mod_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Component-wise floor modulo of a by b.
void mat2i_inverse_ptr(matrix2i *res, const matrix2i *m)
Computes the inverse of the input integer 2x2 matrix and stores in res.
vector2 vec2_x_axis(vm_float_t x)
Returns a vector2 along the x-axis (y = 0.0f).
Definition vector2.c:33
vector3i vec3i_splat(vm_int_t s)
Returns a vector with every component set to s.
Definition vector3i.c:469
void vec3_div_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Divides two vectors component-wise.
vector4 vec4_one(void)
Returns a vector4 with all components set to 1.0f.
Definition vector4.c:22
vector2i vec2i_mul_scalar(vector2i v, vm_int_t s)
Multiplies a vector by a scalar component-wise.
Definition vector2i.c:112
void vec4_div_ptr(vector4 *res, const vector4 *a, const vector4 *b)
vm_float_t vec3_length_squared(vector3 v)
Returns the squared Euclidean length.
Definition vector3.c:715
vector2 vec2_refract(vector2 incident, vector2 normal, vm_float_t eta)
Computes the refraction of incident across normal with ratio eta.
Definition vector2.c:623
void vec3_saturate_ptr(vector3 *res, const vector3 *v)
Clamps each component to the range [0, 1].
static const double VM_RAD_TO_DEG_F64
Definition vecmat.h:56
vector2 vec2_div(vector2 a, vector2 b)
Divides two vectors component-wise.
Definition vector2.c:527
vector3 vec3_mul_scalar(vector3 v, vm_float_t s)
Component-wise multiplication of vector by scalar.
Definition vector3.c:134
void mat4_extract_scale_ptr(vector3 *res, const matrix4 *m)
Extracts the scale vector from a matrix4.
void vec2_move_toward_ptr(vector2 *res, const vector2 *current, const vector2 *target, vm_float_t max_delta)
Moves current toward target by at most max_delta.
void vec3i_add_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise sum of two vector3i.
void vec4i_sub_scalar_ptr(vector4i *res, const vector4i *v, vm_int_t s)
Subtracts a scalar from each component.
void vec3_sub_scalar_ptr(vector3 *res, const vector3 *v, vm_float_t s)
Subtracts a scalar from each component.
vector2i vec2i_clamp(vector2i v, vector2i min, vector2i max)
Clamps each component between min and max.
Definition vector2i.c:373
void vec3i_sign_ptr(vector3i *res, const vector3i *v)
Computes the sign of each component of a vector3i (-1, 0, or 1).
vector3 vec3_x_scale(vm_float_t x)
Returns a vector3 for scaling along the x-axis.
Definition vector3.c:66
matrix2 mat2_inverse(matrix2 m)
Computes the inverse of a 2x2 matrix.
Definition matrix2.c:60
void mat2_mul_ptr(matrix2 *res, const matrix2 *a, const matrix2 *b)
Multiplies two 2x2 matrices (a * b) in column-major / column-vector convention.
Definition matrix2_ptr.c:26
vm_float_t bounce_ease_out(vm_float_t f)
Definition easing.c:177
void vec4i_abs_ptr(vector4i *res, const vector4i *v)
Computes the absolute value of each component of a vector4i and stores the result in res.
void mat3i_mul_ptr(matrix3i *res, const matrix3i *a, const matrix3i *b)
Multiplies two 3x3 integer matrices (standard matrix multiplication).
vector4 vec4_div(vector4 a, vector4 b)
Divides two vectors component-wise.
Definition vector4.c:439
vector3 vec3_one(void)
Returns a vector3 with all components set to 1.0f.
Definition vector3.c:22
vector3i vec3i_add_scalar(vector3i v, vm_int_t s)
Adds a scalar to each component.
Definition vector3i.c:390
bool vec3_is_zero(vector3 v)
Returns true if every component is zero.
Definition vector3.c:810
vector3 vec3_y_scale(vm_float_t y)
Returns a vector3 for scaling along the y-axis.
Definition vector3.c:77
void vec2_normalize_ptr(vector2 *res, const vector2 *v)
Normalizes vector v to unit length, storing the result in res.
vector3 vec3_lerp(vector3 a, vector3 b, vm_float_t t)
Linearly interpolates between two vector3.
Definition vector3.c:370
void vec3i_normalize_ptr(vector3i *res, const vector3i *v)
Normalizes a vector3i to approximate unit length.
vector4 mat4_mul_vec4(matrix4 m, vector4 v)
Multiplies a 4x4 matrix by a vector4.
Definition matrix4.c:240
vector4i vec4i_x_axis(vm_int_t x)
Returns a vector4i along the x-axis.
Definition vector4i.c:33
vector2i vec2i_sub_scalar(vector2i v, vm_int_t s)
Subtracts a scalar from each component.
Definition vector2i.c:421
vm_float_t mat4_determinant(matrix4 m)
Calculates the determinant of the given 4x4 matrix.
Definition matrix4.c:214
vector3 vec3_add_scalar(vector3 v, vm_float_t s)
Adds a scalar to each component.
Definition vector3.c:485
vm_float_t vec2i_distance(vector2i a, vector2i b)
Computes the Euclidean distance between two vectors (treated as points).
Definition vector2i.c:305
vm_float_t vec3_max_component(vector3 v)
Returns the largest component.
Definition vector3.c:788
void vec3i_max_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise maximum of two vector3i.
vm_float_t circular_ease_out(vm_float_t f)
Definition easing.c:107
vector4 vec4_x_axis(vm_float_t x)
Returns a vector4 along the x-axis.
Definition vector4.c:33
vector2i vec2i_one(void)
Returns a vector2i with both components set to 1.
Definition vector2i.c:22
bool vec3_near(vector3 a, vector3 b, vm_float_t eps)
Returns true if a and b are within eps of each other.
Definition vector3.c:836
void vec2_clamp_scalar_ptr(vector2 *res, const vector2 *v, vm_float_t min, vm_float_t max)
Clamps each component to the scalar range [min, max].
matrix4 mat4_perspective_fov(vm_float_t fov, vm_float_t w, vm_float_t h, vm_float_t n, vm_float_t f)
Constructs a perspective projection matrix using FOV, width, and height.
Definition matrix4.c:181
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.
vm_int_t vec2i_length_manhattan(vector2i v)
Returns the Manhattan (L1) length.
Definition vector2i.c:563
vector4 vec4_div_scalar(vector4 v, vm_float_t s)
Component-wise division of vector by scalar.
Definition vector4.c:172
vector2 vec2_clamp(vector2 v, vector2 min, vector2 max)
Clamps vector v component-wise between min and max.
Definition vector2.c:425
vm_int_t vec4i_length_manhattan(vector4i v)
Returns the Manhattan (L1) length.
Definition vector4i.c:508
vector3 vec3_move_toward(vector3 current, vector3 target, vm_float_t max_delta)
Moves current toward target by at most max_delta.
Definition vector3.c:659
vector3i vec3i_y_axis(vm_int_t y)
Returns a vector3i along the y-axis.
Definition vector3i.c:44
matrix2 mat2_identity(void)
Constructs the 2x2 identity matrix.
Definition matrix2.c:14
matrix4i mat4i_transpose(matrix4i m)
Computes the transpose of a 4x4 integer matrix.
Definition matrix4i.c:45
vector2 vec3_xy(vector3 v)
Returns the x and y components as a 2D vector.
Definition vector3.c:690
vector3i vec3i_one(void)
Returns a vector3i with all components set to 1.
Definition vector3i.c:22
vector3 vec3_ceil(vector3 v)
Applies ceil per component to a vector3.
Definition vector3.c:304
void mat3_inverse_ptr(matrix3 *res, const matrix3 *m)
Computes the inverse of the input 3x3 matrix using the adjugate method and stores in res.
Definition matrix3_ptr.c:78
vector2i vec2i(vm_int_t x, vm_int_t y)
Constructs a vector2i from x and y.
Definition vecmat.c:280
void mat4_look_at_ptr(matrix4 *res, const vector3 *position, const vector3 *target, const vector3 *up)
Constructs a view matrix for a camera positioned at the given location, looking towards a target,...
bool vec2i_eq(vector2i a, vector2i b)
Returns true if two vectors are exactly equal.
Definition vecmat.c:79
quaternion quat_from_euler(vector3 euler)
Constructs a quaternion from Euler angles (in radians, XYZ order).
Definition quaternion.c:60
vm_float_t vec3_signed_angle(vector3 a, vector3 b, vector3 axis)
Returns the signed angle from a to b around axis.
Definition vector3.c:765
void vec3i_div_floor_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Component-wise floored division of a by b.
vector2i vec2i_x_axis(vm_int_t x)
Returns a vector2i along the x-axis (y = 0).
Definition vector2i.c:33
vector4i vec4i_min(vector4i a, vector4i b)
Computes the component-wise minimum of two vector4i.
Definition vector4i.c:248
void vec3_from_vec2_ptr(vector3 *res, const vector2 *v, vm_float_t z)
Builds a higher-dimension vector from a vector2.
matrix4 mat4_perspective(vm_float_t fov, vm_float_t aspect, vm_float_t near, vm_float_t far)
Constructs a perspective projection matrix.
Definition matrix4.c:124
void vec3_move_toward_ptr(vector3 *res, const vector3 *current, const vector3 *target, vm_float_t max_delta)
Moves current toward target by at most max_delta.
void vec4i_clamp_ptr(vector4i *res, const vector4i *v, const vector4i *min, const vector4i *max)
Clamps the components of a vector4i to the range [min, max] and stores the result in res.
vector4i vec4i_lerp(vector4i a, vector4i b, vm_float_t t)
Linearly interpolates between two vector4i.
Definition vector4i.c:296
vector4i vec4i_div_scalar(vector4i v, vm_int_t s)
Component-wise division of vector by scalar.
Definition vector4i.c:171
vm_float_t cubic_ease_out(vm_float_t f)
Definition easing.c:47
matrix3 mat3_identity(void)
Constructs the 3x3 identity matrix.
Definition matrix3.c:14
vector3i vec3i_div_floor(vector3i a, vector3i b)
Component-wise floored division of a by b.
Definition vector3i.c:438
vm_float_t elastic_oscillation(vm_float_t f, vm_float_t exp_mult, vm_float_t sin_mult, vm_float_t sin_offset, vm_float_t period)
Definition easing.c:7
vector4 vec4_mul(vector4 a, vector4 b)
Component-wise multiplication of two vectors.
Definition vector4.c:188
vector2 vec2_add_scalar(vector2 v, vm_float_t s)
Adds a scalar to each component.
Definition vector2.c:543
void quat_from_mat4_ptr(quaternion *res, const matrix4 *m)
Builds a quaternion from the rotation of a 4x4 matrix.
vector2 vec2_abs(vector2 v)
Returns the absolute values of each component.
Definition vector2.c:190
void vec2i_div_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Divides two vectors component-wise.
bool vec4_near(vector4 a, vector4 b, vm_float_t eps)
Returns true if a and b are within eps of each other.
Definition vector4.c:639
vm_float_t quadratic_ease_in_out(vm_float_t f)
Definition easing.c:42
vector3i vec3i_from(const vector3 *v)
Converts a vector3 to a vector3i by truncation.
Definition vecmat.c:484
vector3 vec3_from_vec2(vector2 v, vm_float_t z)
Builds a vector3 from a vector2 and z.
Definition vector3.c:642
static const vm_float_t VM_RAD_TO_DEG
Definition vecmat.h:86
void mat2_transpose_ptr(matrix2 *res, const matrix2 *m)
Computes the transpose of the input 2x2 matrix and stores in res.
Definition matrix2_ptr.c:43
vector3i vec3i_wrap(vector3i v, vector3i period)
Wraps each component of v into [0, period).
Definition vector3i.c:454
void vec2_limit_length_ptr(vector2 *res, const vector2 *v, vm_float_t max_len)
Clamps the vector length to max_len.
vm_float_t vec3_dot(vector3 a, vector3 b)
Computes the dot product of two vector3.
Definition vector3.c:428
vm_float_t vec2_length_squared(vector2 v)
Returns the squared Euclidean length.
Definition vector2.c:744
vector4 vec4_zero(void)
Returns a zero-initialized vector4.
Definition vector4.c:12
vector3 quat_to_euler(quaternion q)
Converts a quaternion to Euler angles in degrees (XYZ).
Definition quaternion.c:216
void vec3_xy_ptr(vector2 *res, const vector3 *v)
Returns the x and y components as a 2D vector.
void mat3_mul_ptr(matrix3 *res, const matrix3 *a, const matrix3 *b)
Multiplies two 3x3 matrices (a * b) in column-major / column-vector convention.
Definition matrix3_ptr.c:34
bool vec2_is_zero(vector2 v)
Returns true if every component is zero.
Definition vector2.c:847
void vec2i_min_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Computes the component-wise minimum of vectors a and b, storing the result in res.
matrix2 mat2_mul(matrix2 a, matrix2 b)
Multiplies two 2x2 matrices (a * b).
Definition matrix2.c:30
vector4 vec4_fract(vector4 v)
Returns the fractional part of each component.
Definition vector4.c:518
matrix3 mat3_rotation_x(vm_float_t degrees)
Builds a 3x3 rotation matrix around the X axis (degrees).
Definition matrix3.c:135
vector4 vec4_y_axis(vm_float_t y)
Returns a vector4 along the y-axis.
Definition vector4.c:44
matrix3 mat3_inverse(matrix3 m)
Computes the inverse of a 3x3 matrix.
Definition matrix3.c:60
void vec4i_mul_scalar_ptr(vector4i *res, const vector4i *v, vm_int_t s)
Multiplies the components of a vector4i by a scalar and stores the result in res.
quaternion quat_normalize(quaternion q)
Normalizes a quaternion.
Definition quaternion.c:45
void vec2_mul_scalar_ptr(vector2 *res, const vector2 *v, vm_float_t s)
Multiplies vector v by scalar s component-wise, storing the result in res.
Definition vector2_ptr.c:40
void mat2i_identity_ptr(matrix2i *res)
Initializes the integer 2x2 matrix to identity (diagonal 1, others 0).
bool vec4i_eq(vector4i a, vector4i b)
Returns true if two vectors are exactly equal.
Definition vecmat.c:103
quaternion mat4_extract_rotation(matrix4 m)
Extracts the rotation quaternion from a matrix4.
Definition matrix4.c:379
void quat_from_mat3_ptr(quaternion *res, const matrix3 *m)
Builds a quaternion from a 3x3 rotation matrix.
bool mat3_eq(matrix3 a, matrix3 b)
Returns true if two matrices are equal within VECMAT_EPSILON.
Definition vecmat.c:130
vector3 quat_to_axis_angle(quaternion q, vm_float_t *degrees)
Converts a quaternion to an axis and an angle in degrees.
Definition quaternion.c:232
vector3 vec3_reflect(vector3 incident, vector3 normal)
Reflects an incident vector over normal.
Definition vector3.c:335
vm_float_t quintic_ease_in_out(vm_float_t f)
Definition easing.c:87
vector3i vec2i_to_vec3i(vector2i v, vm_int_t z)
Converts a vector2i to a vector3i using z.
Definition vector2i.c:498
void vec4_min_ptr(vector4 *res, const vector4 *a, const vector4 *b)
vector3 vec3_from(const vector3i *v)
Converts a vector3i to a vector3.
Definition vecmat.c:415
vm_float_t vec3_length(vector3 v)
Computes the length (magnitude) of a vector3.
Definition vector3.c:439
vector2i vec3i_xy(vector3i v)
Returns the x and y components as a 2D vector.
Definition vector3i.c:498
vector3 vec3_fract(vector3 v)
Returns the fractional part of each component.
Definition vector3.c:548
vector2i vec2i_from_floored(const vector2 *v)
Converts a vector2 to a vector2i by flooring each component.
Definition vecmat.c:339
vector2 vec2_normalize(vector2 v)
Normalizes the vector to unit length.
Definition vector2.c:221
void mat4_rotation_ptr(matrix4 *res, const vector3 *axis, vm_float_t angle)
Sets the matrix to a rotation matrix around the specified axis by the given angle.
bool mat3i_eq(matrix3i a, matrix3i b)
Returns true if two matrices are exactly equal.
Definition vecmat.c:175
void vec4_floor_ptr(vector4 *res, const vector4 *v)
vector4i vec4i_z_axis(vm_int_t z)
Returns a vector4i along the z-axis.
Definition vector4i.c:55
vm_float_t poly_ease_in(vm_float_t f, vm_float_t n)
Definition easing.c:17
vector4i vec4i_y_scale(vm_int_t y)
Returns a vector4i for scaling along the y-axis.
Definition vector4i.c:87
void vec2_round_ptr(vector2 *res, const vector2 *v)
Applies the round function to each component of vector v, storing the result in res.
vector4i vec4i_add_scalar(vector4i v, vm_int_t s)
Adds a scalar to each component.
Definition vector4i.c:395
vm_float_t elastic_ease_in_out(vm_float_t f)
Definition easing.c:151
vector3 vec3_z_scale(vm_float_t z)
Returns a vector3 for scaling along the z-axis.
Definition vector3.c:88
void quat_nlerp_ptr(quaternion *res, const quaternion *a, const quaternion *b, vm_float_t t)
Normalized-linearly interpolates from a to b by t.
vm_int_t vec3i_length_manhattan(vector3i v)
Returns the Manhattan (L1) length.
Definition vector3i.c:552
vector2 vec2_mul(vector2 a, vector2 b)
Multiplies two vectors component-wise (Hadamard product).
Definition vector2.c:160
vector4 vec4_normalize(vector4 v)
Normalizes a vector4 to unit length.
Definition vector4.c:233
#define VEC_API
Definition vecmat.h:30
vector4i vec4i_x_scale(vm_int_t x)
Returns a vector4i for scaling along the x-axis.
Definition vector4i.c:76
vector2 vec2_ceil(vector2 v)
Applies ceil to each component.
Definition vector2.c:298
vector3i vec3i_z_scale(vm_int_t z)
Returns a vector3i for scaling along the z-axis.
Definition vector3i.c:88
vm_int_t vec3i_min_component(vector3i v)
Returns the smallest component.
Definition vector3i.c:581
matrix2i mat2i_transpose(matrix2i m)
Computes the transpose of a 2x2 integer matrix.
Definition matrix2i.c:45
vm_float_t vec3i_angle(vector3i a, vector3i b)
Computes the angle between two non-zero vector3i in radians.
Definition vector3i.c:356
void vec4i_max_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Computes the component-wise maximum of two vector4i and stores the result in res.
void vec3_clamp_scalar_ptr(vector3 *res, const vector3 *v, vm_float_t min, vm_float_t max)
Clamps each component to the scalar range [min, max].
vector3 vec3_max(vector3 a, vector3 b)
Computes the component-wise maximum of two vector3.
Definition vector3.c:259
void mat3_mul_vec3_ptr(vector3 *res, const matrix3 *m, const vector3 *v)
Multiplies a 3x3 matrix by a vector3.
matrix4 mat4_rotation_z(vm_float_t degrees)
Builds a 4x4 rotation matrix around the Z axis (degrees).
Definition matrix4.c:302
static const double VM_DEG_TO_RAD_F64
Definition vecmat.h:55
void mat4_extract_rotation_ptr(quaternion *res, const matrix4 *m)
Extracts the rotation quaternion from a matrix4.
void vec4_sign_ptr(vector4 *res, const vector4 *v)
void vec4_lerp_ptr(vector4 *res, const vector4 *a, const vector4 *b, vm_float_t t)
vector3 vec3_zero(void)
Returns a zero-initialized vector3.
Definition vector3.c:12
void vec2_tangent_ptr(vector2 *res, const vector2 *v)
Computes a tangent vector perpendicular to the input (90 degrees clockwise).
vector2i vec2i_splat(vm_int_t s)
Returns a vector with every component set to s.
Definition vector2i.c:484
void vec3i_abs_ptr(vector3i *res, const vector3i *v)
Computes the absolute value of each component of a vector3i.
vm_float_t vec2_aspect_ratio(vector2 v)
Computes the aspect ratio of the vector (x / y).
Definition vector2.c:463
vector4i vec4i_mul(vector4i a, vector4i b)
Component-wise multiplication of two vectors.
Definition vector4i.c:187
void vec2i_neg_ptr(vector2i *res, const vector2i *v)
Negates the components of vector v, storing the result in res.
vm_int_t vec2i_distance_squared(vector2i a, vector2i b)
Returns the squared Euclidean distance between a and b.
Definition vector2i.c:550
bool vec2_eq(vector2 a, vector2 b)
Returns true if two vectors are equal within VECMAT_EPSILON.
Definition vecmat.c:37
vector4i vec4i_mod(vector4i a, vector4i b)
Component-wise floor modulo of a by b.
Definition vector4i.c:427
void mat3i_inverse_ptr(matrix3i *res, const matrix3i *m)
Computes the inverse of a 3x3 integer matrix using adjugate over determinant.
vector2 vec2_lerp(vector2 a, vector2 b, vm_float_t t)
Linearly interpolates from a to b by t.
Definition vector2.c:511
void vec2_div_scalar_ptr(vector2 *res, const vector2 *v, vm_float_t s)
Divides vector v by scalar s component-wise, storing the result in res.
Definition vector2_ptr.c:53
vector4i vec4i_splat(vm_int_t s)
Returns a vector with every component set to s.
Definition vector4i.c:474
matrix3 mat3_rotation_y(vm_float_t degrees)
Builds a 3x3 rotation matrix around the Y axis (degrees).
Definition matrix3.c:150
vector2i vec2i_wrap(vector2i v, vector2i period)
Wraps each component of v into [0, period).
Definition vector2i.c:469
void vec2_ceil_ptr(vector2 *res, const vector2 *v)
Applies the ceil function to each component of vector v, storing the result in res.
void vec3_rotate_axis_ptr(vector3 *res, const vector3 *v, const vector3 *axis, vm_float_t angle)
Rotates v around axis by angle radians.
matrix3 mat3_rotation_z(vm_float_t degrees)
Constructs the 3x3 rotation matrix around the Z-axis.
Definition matrix3.c:75
vector4 vec4_saturate(vector4 v)
Clamps each component to the range [0, 1].
Definition vector4.c:503
vector2 vec2_reject(vector2 a, vector2 b)
Returns the component of a orthogonal to b.
Definition vector2.c:639
vector2 vec2_project(vector2 a, vector2 b)
Projects the first vector onto the second.
Definition vector2.c:361
vm_float_t vec3_sum(vector3 v)
Returns the sum of all components.
Definition vector3.c:799
uint32_t vm_cpu_features_t
Definition vecmat.h:452
vm_float_t circular_ease_in_out(vm_float_t f)
Definition easing.c:117
vector4i vec4i_one(void)
Returns a vector4i with all components set to 1.
Definition vector4i.c:22
vector4i vec4i_w_scale(vm_int_t w)
Returns a vector4i for scaling along the w-axis.
Definition vector4i.c:109
vector2 vec2_scale(vector2 v, vm_float_t s)
Scales a vector by a scalar component-wise.
Definition vector2.c:80
vector2 vec2_sign(vector2 v)
Returns the sign of each component (+1.0f, -1.0f, or 0.0f).
Definition vector2.c:268
void vec2_scale_ptr(vector2 *res, const vector2 *v, vm_float_t s)
Scales a vector by a scalar component-wise, storing the result in res.
vector2 vec2(vm_float_t x, vm_float_t y)
Constructs a vector2 from x and y.
Definition vecmat.c:220
void vec3_add_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Component-wise addition of two vectors.
Definition vector3_ptr.c:14
vector3 vec3_project(vector3 a, vector3 b)
Projects a onto b.
Definition vector3.c:564
vector2 vec2_max(vector2 a, vector2 b)
Returns the component-wise maximum of two vectors.
Definition vector2.c:253
void vec2_saturate_ptr(vector2 *res, const vector2 *v)
Clamps each component to the range [0, 1].
void vec3i_div_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Scales a vector3i by the inverse of an integer scalar.
void vec2_assign(vector2 *dest, const vector2 *src)
Copies src into dest.
Definition vecmat.c:231
vector3 vec3i_normalize_to_vec3(vector3i v)
Converts to a unit-length vector3.
Definition vector3i.c:513
vector3 vec3_floor(vector3 v)
Applies the floor per component to a vector3.
Definition vector3.c:289
void vec2_abs_ptr(vector2 *res, const vector2 *v)
Computes the absolute values of the components of vector v, storing the result in res.
Definition vector2_ptr.c:95
vector3i vec3i_clamp(vector3i v, vector3i min, vector3i max)
Clamps a vector3i between min and max per component.
Definition vector3i.c:308
bool quat_eq(quaternion a, quaternion b)
Returns true if two quaternions are equal within VECMAT_EPSILON.
Definition vecmat.c:205
vm_float_t cubic_ease_in(vm_float_t f)
Definition easing.c:52
void vec4i_normalize_ptr(vector4i *res, const vector4i *v)
Normalizes a vector4i by dividing its components by the vector length and stores the result in res.
void vec3_sub_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Component-wise subtraction of two vectors.
Definition vector3_ptr.c:28
vector2i vec2i_add(vector2i a, vector2i b)
Adds two vectors component-wise.
Definition vector2i.c:80
vector3i vec3i_lerp(vector3i a, vector3i b, vm_float_t t)
Linearly interpolates between two vector3i.
Definition vector3i.c:291
void vec3_add_assign(vector3 *dest, const vector3 *src)
Adds src to dest in place.
Definition vecmat.c:402
vm_int_t mat3i_determinant(matrix3i m)
Computes the determinant of a 3x3 integer matrix.
Definition matrix3i.c:58
void vec3i_from_vec2i_ptr(vector3i *res, const vector2i *v, vm_int_t z)
Builds a vector3i from a vector2i and z.
vector3 vec3_clamp(vector3 v, vector3 min, vector3 max)
Clamps a vector3 between min and max per component.
Definition vector3.c:387
void vec2i_mul_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Multiplies vectors a and b component-wise (Hadamard product), storing the result in res.
vm_float_t quartic_ease_in_out(vm_float_t f)
Definition easing.c:72
void vec2i_assign_xy(vector2i *dest, vm_int_t x, vm_int_t y)
Assigns x and y to dest.
Definition vecmat.c:304
quaternion quat_from_mat4(matrix4 m)
Builds a quaternion from the rotation of a 4x4 matrix.
Definition quaternion.c:151
void vec3_round_ptr(vector3 *res, const vector3 *v)
Component-wise round of a vector.
vector2 vec2_x_scale(vm_float_t x)
Returns a vector2 representing x-axis scaling (y = 1.0f).
Definition vector2.c:55
void vec3_lerp_ptr(vector3 *res, const vector3 *a, const vector3 *b, vm_float_t t)
Linear interpolation between two vectors.
vector2i vec2i_max(vector2i a, vector2i b)
Returns the component-wise maximum of two vectors.
Definition vector2i.c:222
void vec4_homogenize_ptr(vector4 *res, const vector4 *v)
matrix3 mat3_transpose(matrix3 m)
Computes the transpose of a 3x3 matrix.
Definition matrix3.c:45
matrix3 mat3_translate(vector2 t)
Builds a 3x3 2D translation matrix.
Definition matrix3.c:165
matrix4i mat4i_identity(void)
Constructs the 4x4 identity matrix.
Definition matrix4i.c:14
quaternion quat_identity(void)
Constructs the identity quaternion.
Definition quaternion.c:14
vector2i vec2i_abs(vector2i v)
Returns the absolute values of each component.
Definition vector2i.c:175
void quat_to_euler_ptr(vector3 *res, const quaternion *q)
Converts a quaternion to Euler angles in degrees (XYZ).
void quat_slerp_ptr(quaternion *res, const quaternion *a, const quaternion *b, vm_float_t t)
Spherical-linearly interpolates from a to b by t.
void vec4_add_ptr(vector4 *res, const vector4 *a, const vector4 *b)
vm_float_t sine_ease_out(vm_float_t f)
Definition easing.c:92
vm_float_t vec4i_length(vector4i v)
Computes the length (magnitude) of a vector4i.
Definition vector4i.c:339
matrix4 mat4_identity(void)
Constructs the 4x4 identity matrix.
Definition matrix4.c:14
vector2 vec2_tangent(vector2 v)
Returns the tangent vector perpendicular to the input (90 degrees clockwise).
Definition vector2.c:376
void vec4_max_ptr(vector4 *res, const vector4 *a, const vector4 *b)
void vec2_add_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Adds vectors a and b component-wise, storing the result in res.
Definition vector2_ptr.c:14
vector3 vec3_abs(vector3 v)
Computes the absolute value per component of a vector3.
Definition vector3.c:196
void vec2i_sub_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Subtracts a scalar from each component.
matrix4 mat4_mul(matrix4 a, matrix4 b)
Multiplies two 4x4 matrices (a * b).
Definition matrix4.c:30
vector2i vec2i_add_scalar(vector2i v, vm_int_t s)
Adds a scalar to each component.
Definition vector2i.c:405
vector4 vec4_y_scale(vm_float_t y)
Returns a vector4 for scaling along the y-axis.
Definition vector4.c:88
vector4 vec4_sign(vector4 v)
Computes the sign per component of a vector4 (-1, 0, or 1).
Definition vector4.c:280
vector2 vec2_from(const vector2i *v)
Converts a vector2i to a vector2.
Definition vecmat.c:268
void vec3i_mul_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise product (Hadamard) of two vector3i.
void vec2i_abs_ptr(vector2i *res, const vector2i *v)
Computes the absolute values of the components of vector v (using int abs), storing the result in res...
vector2i vec2i_y_axis(vm_int_t y)
Returns a vector2i along the y-axis (x = 0).
Definition vector2i.c:44
bool vec4_is_zero(vector4 v)
Returns true if every component is zero.
Definition vector4.c:615
vector3i mat4i_mul_vec3i(matrix4i m, vector3i v, vm_int_t w)
Transforms a vector3i by a 4x4 integer matrix using homogeneous w.
Definition matrix4i.c:116
void mat3_scale_ptr(matrix3 *res, const vector2 *s)
Builds a 3x3 2D scaling matrix.
void mat2_rotation_z_ptr(matrix2 *res, vm_float_t degrees)
Sets res to a 2x2 rotation matrix for rotation around the Z-axis.
Definition matrix2_ptr.c:97
matrix3i mat3i_mul(matrix3i a, matrix3i b)
Multiplies two 3x3 integer matrices.
Definition matrix3i.c:30
vm_int_t vec2i_length_squared(vector2i v)
Returns the squared Euclidean length.
Definition vector2i.c:538
vm_float_t vec2_length_chebyshev(vector2 v)
Returns the Chebyshev (L-inf) length.
Definition vector2.c:766
void mat4_inverse_ptr(matrix4 *res, const matrix4 *m)
Computes the inverse of a 4x4 matrix.
Definition matrix4_ptr.c:98
vm_float_t elastic_ease_in(vm_float_t f)
Definition easing.c:145
vm_float_t vec3_distance_squared(vector3 a, vector3 b)
Returns the squared Euclidean distance between a and b.
Definition vector3.c:749
vector2 vec2_from_angle(vm_float_t angle)
Returns the unit vector at the given angle in radians.
Definition vector2.c:667
vector4i vec4i_sub(vector4i a, vector4i b)
Component-wise subtraction of two vectors.
Definition vector4i.c:139
vm_float_t elastic_ease_out(vm_float_t f)
Definition easing.c:139
void mat2_identity_ptr(matrix2 *res)
Initializes the 2x2 matrix to identity (diagonal 1.0, others 0.0).
Definition matrix2_ptr.c:12
quaternion quat_conjugate(quaternion q)
Returns the conjugate of a quaternion.
Definition quaternion.c:90
vector4i vec4i_normalize(vector4i v)
Normalizes a vector4i to unit length.
Definition vector4i.c:232
void vec3i_xy_ptr(vector2i *res, const vector3i *v)
Returns the x and y components as a 2D vector.
void vec3_max_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Component-wise maximum of two vectors.
void vec2i_mod_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Component-wise floor modulo of a by b.
vector2 vec2_min(vector2 a, vector2 b)
Returns the component-wise minimum of two vectors.
Definition vector2.c:237
void vec4_fract_ptr(vector4 *res, const vector4 *v)
vector3 vec3_clamp_scalar(vector3 v, vm_float_t min, vm_float_t max)
Clamps each component to the scalar range [min, max].
Definition vector3.c:518
void vec4_add_scalar_ptr(vector4 *res, const vector4 *v, vm_float_t s)
vector2i vec2i_perpendicular(vector2i v)
Returns the perpendicular vector (90 degrees counterclockwise).
Definition vector2i.c:252
matrix4 mat4_rotation_x(vm_float_t degrees)
Builds a 4x4 rotation matrix around the X axis (degrees).
Definition matrix4.c:272
vector3 mat3_mul_vec3(matrix3 m, vector3 v)
Multiplies a 3x3 matrix by a vector3.
Definition matrix3.c:104
matrix2 mat2_from_mat3(matrix3 m)
Copies the upper-left 2x2 of a matrix3.
Definition matrix2.c:132
vector3 quat_rotate_vec3(quaternion q, vector3 v)
Rotates a vector3 by a quaternion.
Definition quaternion.c:201
vector2 vec2_slide(vector2 v, vector2 normal)
Slides the input vector tangent to the normal (removes normal component).
Definition vector2.c:408
void vec3i_add_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Adds a scalar to each component.
void vec4_abs_ptr(vector4 *res, const vector4 *v)
void vec2_reject_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Returns the component of a orthogonal to b.
vector2 vec2_rotate(vector2 v, vm_float_t angle)
Rotates the input vector counterclockwise by the given angle (radians).
Definition vector2.c:392
vm_float_t vec3_distance(vector3 a, vector3 b)
Computes the Euclidean distance between two vector3.
Definition vector3.c:401
vector2 vec2_splat(vm_float_t s)
Returns a vector with every component set to s.
Definition vector2.c:654
void vec4_saturate_ptr(vector4 *res, const vector4 *v)
void mat3i_mul_vec2i_ptr(vector2i *res, const matrix3i *m, const vector2i *v)
Applies a 3x3 integer affine transform to a vector2i.
vector3 vec3_x_axis(vm_float_t x)
Returns a vector3 along the x-axis.
Definition vector3.c:33
vector3 vec3_div(vector3 a, vector3 b)
Divides two vectors component-wise.
Definition vector3.c:469
vector4 vec4_reject(vector4 a, vector4 b)
Returns the component of a orthogonal to b.
Definition vector4.c:550
void vec3_fract_ptr(vector3 *res, const vector3 *v)
Returns the fractional part of each component.
vector2 vec2_add(vector2 a, vector2 b)
Adds two vectors component-wise.
Definition vector2.c:96
vm_float_t rad_to_deg(vm_float_t radians)
Converts radians to degrees.
Definition vecmat.c:25
vm_float_t vec3_length_chebyshev(vector3 v)
Returns the Chebyshev (L-inf) length.
Definition vector3.c:737
void mat4_perspective_fov_ptr(matrix4 *res, vm_float_t fov, vm_float_t w, vm_float_t h, vm_float_t n, vm_float_t f)
Sets the matrix to a perspective projection matrix.
void vec2_sign_ptr(vector2 *res, const vector2 *v)
Sets each component of res to the sign of the corresponding component in v (+1, -1).
vector4 vec4_clamp_scalar(vector4 v, vm_float_t min, vm_float_t max)
Clamps each component to the scalar range [min, max].
Definition vector4.c:488
vm_float_t vec4_length(vector4 v)
Computes the length (magnitude) of a vector4.
Definition vector4.c:399
vector4i vec4i_mul_scalar(vector4i v, vm_int_t s)
Component-wise multiplication of vector by scalar.
Definition vector4i.c:155
void vec3i_assign(vector3i *dest, const vector3i *src)
Copies src into dest.
Definition vecmat.c:443
vector3 vec3_splat(vm_float_t s)
Returns a vector with every component set to s.
Definition vector3.c:628
vector2i vec2i_mod(vector2i a, vector2i b)
Component-wise floor modulo of a by b.
Definition vector2i.c:437
vector2i vec2i_x_scale(vm_int_t x)
Returns a vector2i representing x-axis scaling (y = 1).
Definition vector2i.c:55
vector2 vec2_y_scale(vm_float_t y)
Returns a vector2 representing y-axis scaling (x = 1.0f).
Definition vector2.c:66
vector3i vec3i_from_floored(const vector3 *v)
Converts a vector3 to a vector3i by flooring each component.
Definition vecmat.c:499
void vec2_neg_ptr(vector2 *res, const vector2 *v)
Negates the components of vector v, storing the result in res.
Definition vector2_ptr.c:82
vector2i vec2i_y_scale(vm_int_t y)
Returns a vector2i representing y-axis scaling (x = 1).
Definition vector2i.c:66
vector2 vec2_mul_scalar(vector2 v, vm_float_t s)
Multiplies a vector by a scalar component-wise.
Definition vector2.c:128
void quat_to_mat3_ptr(matrix3 *res, const quaternion *q)
Converts a quaternion to a 3x3 rotation matrix.
vector3 vec3(vm_float_t x, vm_float_t y, vm_float_t z)
Constructs a vector3 from x, y, and z.
Definition vecmat.c:363
void vec2_div_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Divides two vectors component-wise.
void vec2_rotate_around_ptr(vector2 *res, const vector2 *v, const vector2 *pivot, vm_float_t angle)
Rotates v around pivot by angle radians.
void vec4_div_scalar_ptr(vector4 *res, const vector4 *v, vm_float_t s)
void vec3_slide_ptr(vector3 *res, const vector3 *v, const vector3 *normal)
Removes the component of v along normal.
vm_int_t vec4i_length_squared(vector4i v)
Returns the squared Euclidean length.
Definition vector4i.c:485
void vec4_mul_scalar_ptr(vector4 *res, const vector4 *v, vm_float_t s)
void vec2i_normalize_ptr(vector2i *res, const vector2i *v)
Normalizes vector v to approximate unit length (float length computation, truncated to int),...
void vec3i_add_assign(vector3i *dest, const vector3i *src)
Adds src to dest in place.
Definition vecmat.c:471
void vec3i_div_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Divides two vectors component-wise.
matrix4 mat4_inverse(matrix4 m)
Computes the inverse of a 4x4 matrix.
Definition matrix4.c:60
vector2 vec2_one(void)
Returns a vector2 with both components set to 1.0f.
Definition vector2.c:22
void vec3i_mul_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Scales a vector3i by an integer scalar.
matrix4 mat4_rotation_y(vm_float_t degrees)
Builds a 4x4 rotation matrix around the Y axis (degrees).
Definition matrix4.c:287
vm_int_t vec2i_sum(vector2i v)
Returns the sum of all components.
Definition vector2i.c:611
void mat4_perspective_infinite_ptr(matrix4 *res, vm_float_t fov_y, vm_float_t aspect, vm_float_t n)
Sets the matrix to an infinite perspective projection matrix.
void vec2i_lerp_ptr(vector2i *res, const vector2i *a, const vector2i *b, vm_float_t t)
Linearly interpolates from a to b by t.
bool vec2i_is_zero(vector2i v)
Returns true if every component is zero.
Definition vector2i.c:622
vm_int_t vec3i_length_chebyshev(vector3i v)
Returns the Chebyshev (L-inf) length.
Definition vector3i.c:566
vm_int_t vec2i_dot(vector2i a, vector2i b)
Computes the dot product of two vectors.
Definition vector2i.c:282
vector4i mat4i_mul_vec4i(matrix4i m, vector4i v)
Multiplies a 4x4 integer matrix by a vector4i.
Definition matrix4i.c:99
void vec3_cross_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Compute cross-product of two vectors.
void vec2i_clamp_ptr(vector2i *res, const vector2i *v, const vector2i *min, const vector2i *max)
Clamps each component between min and max.
vector4 vec4_ceil(vector4 v)
Applies ceil per component to a vector4.
Definition vector4.c:310
void vec2_project_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Projects vector a onto vector b (scalar projection scaled by b).
vm_float_t quat_dot(quaternion a, quaternion b)
Returns the dot product of two quaternions.
Definition quaternion.c:261
void quat_from_axis_angle_ptr(quaternion *res, const vector3 *axis, vm_float_t degrees)
Builds a quaternion from an axis and an angle in degrees.
static const float VM_RAD_TO_DEG_F32
Definition vecmat.h:54
vector3 vec3_min(vector3 a, vector3 b)
Computes the component-wise minimum of two vector3.
Definition vector3.c:243
void vec3i_assign_xyz(vector3i *dest, vm_int_t x, vm_int_t y, vm_int_t z)
Assigns x, y, and z to dest.
Definition vecmat.c:458
void vec2_reflect_ptr(vector2 *res, const vector2 *v, const vector2 *normal)
Reflects vector v across the normal, storing the result in res.
vm_float_t vec2_min_component(vector2 v)
Returns the smallest component.
Definition vector2.c:814
void vec2i_add_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Adds vectors a and b component-wise, storing the result in res.
#define VECMAT_VEC2_SIZE
Definition vecmat.h:64
void vec4i_mul_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Multiplies the components of two vector4i and stores the result in res.
vector3 vec3_y_axis(vm_float_t y)
Returns a vector3 along the y-axis.
Definition vector3.c:44
#define VECMAT_VEC4_SIZE
Definition vecmat.h:66
vector2i vec2i_div(vector2i a, vector2i b)
Divides two vectors component-wise.
Definition vector2i.c:389
vector2 mat3_mul_vec2(matrix3 m, vector2 v)
Applies a 3x3 affine transform to a vector2.
Definition matrix3.c:120
vector3 vec3_refract(vector3 incident, vector3 normal, vm_float_t eta)
Refracts an incident vector across an interface with a given normal and ratio of refraction eta.
Definition vector3.c:353
void vec2i_mul_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Multiplies vector v by scalar s component-wise, storing the result in res.
void vec4_clamp_scalar_ptr(vector4 *res, const vector4 *v, vm_float_t min, vm_float_t max)
void vec2_max_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Computes the component-wise maximum of vectors a and b, storing the result in res.
void vec2i_add_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Adds a scalar to each component.
bool vec3i_is_zero(vector3i v)
Returns true if every component is zero.
Definition vector3i.c:616
matrix3 mat3_scale(vector2 s)
Builds a 3x3 2D scaling matrix.
Definition matrix3.c:180
quaternion quat_inverse(quaternion q)
Returns the inverse of a quaternion.
Definition quaternion.c:105
#define VECMAT_MAT4_SIZE
Definition vecmat.h:70
vm_float_t exponential_ease_out(vm_float_t f)
Definition easing.c:123
vm_float_t circular_ease_in(vm_float_t f)
Definition easing.c:112
void vec2_sub_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Subtracts vector b from vector a component-wise, storing the result in res.
Definition vector2_ptr.c:27
vector4 vec4_splat(vm_float_t s)
Returns a vector with every component set to s.
Definition vector4.c:581
void vec4i_add_scalar_ptr(vector4i *res, const vector4i *v, vm_int_t s)
Adds a scalar to each component.
void vec4i_neg_ptr(vector4i *res, const vector4i *v)
Negates the components of a vector4i and stores the result in res.
vm_int_t vec4i_min_component(vector4i v)
Returns the smallest component.
Definition vector4i.c:541
vector3i vec3i_add(vector3i a, vector3i b)
Component-wise addition of two vectors.
Definition vector3i.c:102
void mat4_rotation_z_ptr(matrix4 *res, vm_float_t degrees)
Builds a 4x4 rotation matrix around the Z axis (degrees).
void mat2_inverse_ptr(matrix2 *res, const matrix2 *m)
Computes the inverse of the input 2x2 matrix using determinant and stores in res.
Definition matrix2_ptr.c:60
void vec3_normalize_ptr(vector3 *res, const vector3 *v)
Normalize a vector to unit length.
vm_float_t mat3_determinant(matrix3 m)
Computes the determinant of a 3x3 matrix.
Definition matrix3.c:88
vector2 vec2_saturate(vector2 v)
Clamps each component to the range [0, 1].
Definition vector2.c:591
vector4 vec4_x_scale(vm_float_t x)
Returns avector4 for scaling along the x-axis.
Definition vector4.c:77
void mat4i_transpose_ptr(matrix4i *res, const matrix4i *m)
Transposes the given 4x4 integer matrix and stores the result in the provided matrix structure.
vector3i vec3i_sign(vector3i v)
Computes the sign per component of a vector3i (-1, 0, or 1).
Definition vector3i.c:274
vector2i vec2i_zero(void)
Returns a vector2i with both components set to 0.
Definition vector2i.c:12
matrix4i mat4i_mul(matrix4i a, matrix4i b)
Multiplies two 4x4 integer matrices.
Definition matrix4i.c:30
vector3i vec3i_z_axis(vm_int_t z)
Returns a vector3i along the z-axis.
Definition vector3i.c:55
vm_float_t vec4_distance_squared(vector4 a, vector4 b)
Returns the squared Euclidean distance between a and b.
Definition vector4.c:604
matrix4 quat_to_mat4(quaternion q)
Converts a quaternion to a 4x4 rotation matrix.
Definition quaternion.c:75
void vec4i_min_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Takes the component-wise minimum of two vector4i and stores the result in res.
vector2 vec2_neg(vector2 v)
Negates the vector (multiplies each component by -1.0f).
Definition vector2.c:175
vector4 vec4_neg(vector4 v)
Negation of a vector.
Definition vector4.c:203
void vec2_slide_ptr(vector2 *result, const vector2 *v, const vector2 *normal)
Slides the input vector tangent to the normal (removes normal component).
vector3 vec3_normalize(vector3 v)
Normalizes a vector3 to unit length.
Definition vector3.c:227
vector3 mat4_extract_scale(matrix4 m)
Extracts the scale vector from a matrix4.
Definition matrix4.c:364
const char * vm_cpu_name(vm_cpu_features_t features)
Definition cpu.c:193
void vec2_add_assign(vector2 *dest, const vector2 *src)
Adds src to dest in place.
Definition vecmat.c:256
vector2 vec2_clamp_scalar(vector2 v, vm_float_t min, vm_float_t max)
Clamps each component to the scalar range [min, max].
Definition vector2.c:576
void vec4i_sub_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Subtracts the components of the second vector from the first vector4i and stores the result in res.
void vec4_project_ptr(vector4 *res, const vector4 *a, const vector4 *b)
Projects a onto b.
vector2i mat2i_mul_vec2i(matrix2i m, vector2i v)
Multiplies a 2x2 integer matrix by a vector2i.
Definition matrix2i.c:87
void vec4_ceil_ptr(vector4 *res, const vector4 *v)
vector3i vec3i_mul_scalar(vector3i v, vm_int_t s)
Component-wise multiplication of vector by scalar.
Definition vector3i.c:134
void mat4i_inverse_ptr(matrix4i *res, const matrix4i *m)
Computes the inverse of the given 4x4 integer matrix and stores the result in the specified matrix.
matrix4 mat4_translate(vector3 v)
Constructs a translation matrix from the given vector.
Definition matrix4.c:75
vector4 vec4_sub(vector4 a, vector4 b)
Component-wise subtraction of two vectors.
Definition vector4.c:140
void vec2_to_vec3_ptr(vector3 *res, const vector2 *v, vm_float_t z)
Converts a vector2 to a vector3 with the given z.
vm_float_t exponential_ease_in(vm_float_t f)
Definition easing.c:128
vector4i vec4i_sign(vector4i v)
Computes the sign per component of a vector4i (-1, 0, or 1).
Definition vector4i.c:279
matrix2 mat2_transpose(matrix2 m)
Computes the transpose of a 2x2 matrix.
Definition matrix2.c:45
void vec4_reject_ptr(vector4 *res, const vector4 *a, const vector4 *b)
Returns the component of a orthogonal to b.
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.
vm_float_t cubic_ease_in_out(vm_float_t f)
Definition easing.c:57
vector3 vec4_to_vec3(vector4 v)
Converts a vector4 to a vector3 (discards the w component).
Definition vector4.c:423
bool vec2_is_normalized(vector2 v)
Returns true if the vector has unit length.
Definition vector2.c:858
vm_float_t vec3i_length(vector3i v)
Computes the length (magnitude) of a vector3i.
Definition vector3i.c:333
vector2 vec2_round(vector2 v)
Applies round to each component.
Definition vector2.c:313
vector3 vec3_sub_scalar(vector3 v, vm_float_t s)
Subtracts a scalar from each component.
Definition vector3.c:501
vector3 mat4_mul_vec3(matrix4 m, vector3 v, vm_float_t w)
Transforms a vector3 by a 4x4 matrix using homogeneous w.
Definition matrix4.c:257
vector3i vec3i_zero(void)
Returns a zero-initialized vector3i.
Definition vector3i.c:12
vector2i vec2i_from_rounded(const vector2 *v)
Converts a vector2 to a vector2i by rounding each component.
Definition vecmat.c:350
void mat3i_identity_ptr(matrix3i *res)
Fills the given 3x3 integer matrix with the identity matrix.
vector3 vec3_cross(vector3 a, vector3 b)
Computes the cross-product of two vector3.
Definition vector3.c:212
vector4 vec4_lerp(vector4 a, vector4 b, vm_float_t t)
Linearly interpolates between two vector4.
Definition vector4.c:342
quaternion quat_nlerp(quaternion a, quaternion b, vm_float_t t)
Normalized-linearly interpolates from a to b by t.
Definition quaternion.c:185
vm_float_t vec2_cross_scalar(vector2 a, vector2 b)
Returns the 2D cross product as a scalar (a.x*b.y - a.y*b.x).
Definition vector2.c:792
vector2 vec2_perpendicular(vector2 v)
Returns the perpendicular vector (90 degrees counterclockwise).
Definition vector2.c:329
void vec3_ceil_ptr(vector3 *res, const vector3 *v)
Component-wise ceil of a vector.
vector4 vec4_round(vector4 v)
Applies round per component to a vector4.
Definition vector4.c:325
vm_int_t vec2i_cross_scalar(vector2i a, vector2i b)
Returns the 2D cross product as a scalar (a.x*b.y - a.y*b.x).
Definition vector2i.c:527
vector3 vec3_div_scalar(vector3 v, vm_float_t s)
Component-wise division of vector by scalar.
Definition vector3.c:150
void mat3i_mul_vec3i_ptr(vector3i *res, const matrix3i *m, const vector3i *v)
Multiplies a 3x3 integer matrix by a vector3i.
double vm_float_t
Definition vecmat.h:79
void mat4_translate_ptr(matrix4 *res, const vector3 *v)
Sets the matrix to a translation matrix.
void mat4_extract_translation_ptr(vector3 *res, const matrix4 *m)
Extracts the translation vector from a matrix4.
void vec4_round_ptr(vector4 *res, const vector4 *v)
void quat_normalize_ptr(quaternion *res, const quaternion *q)
vector2 vec2_rotate_around(vector2 v, vector2 pivot, vm_float_t angle)
Rotates v around pivot by angle radians.
Definition vector2.c:682
void vec3_reject_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Returns the component of a orthogonal to b.
vector4i vec4i_wrap(vector4i v, vector4i period)
Wraps each component of v into [0, period).
Definition vector4i.c:459
vector3i vec3i_abs(vector3i v)
Computes the absolute value per component of a vector3i.
Definition vector3i.c:196
vm_float_t vec2_angle(vector2 a, vector2 b)
Computes the angle between two vectors (in radians, range [0, PI]).
Definition vector2.c:492
quaternion quat_slerp(quaternion a, quaternion b, vm_float_t t)
Spherical-linearly interpolates from a to b by t.
Definition quaternion.c:168
vm_float_t vec4_distance(vector4 a, vector4 b)
Computes the Euclidean distance between two vector4.
Definition vector4.c:411
void vec2_sub_scalar_ptr(vector2 *res, const vector2 *v, vm_float_t s)
Subtracts a scalar from each component.
void mat4i_identity_ptr(matrix4i *res)
Sets the given 4x4 integer matrix to the identity matrix.
void vec2_add_scalar_ptr(vector2 *res, const vector2 *v, vm_float_t s)
Adds a scalar to each component.
vector4 vec4_homogenize(vector4 v)
Homogenizes a vector4 (divides x, y, z by w).
Definition vector4.c:374
vector4 vec4_min(vector4 a, vector4 b)
Computes the component-wise minimum of two vector4.
Definition vector4.c:249
void mat3_transpose_ptr(matrix3 *res, const matrix3 *m)
Computes the transpose of the input 3x3 matrix and stores in res.
Definition matrix3_ptr.c:58
void vec3_orthonormal_basis_ptr(const vector3 *n, vector3 *t, vector3 *b)
Builds a tangent and bitangent orthonormal to n.
void vec4_neg_ptr(vector4 *res, const vector4 *v)
void vec2_refract_ptr(vector2 *res, const vector2 *incident, const vector2 *normal, vm_float_t eta)
Computes the refraction of incident across normal with ratio eta.
vector3 vec3_slide(vector3 v, vector3 normal)
Removes the component of v along normal.
Definition vector3.c:580
vector4i vec4i_y_axis(vm_int_t y)
Returns a vector4i along the y-axis.
Definition vector4i.c:44
matrix3i mat3i_inverse(matrix3i m)
Computes the inverse of a 3x3 integer matrix.
Definition matrix3i.c:73
vm_int_t mat4i_determinant(matrix4i m)
Computes the determinant of a 4x4 integer matrix (Laplace expansion along first row).
Definition matrix4i.c:73
void mat3_rotation_x_ptr(matrix3 *res, vm_float_t degrees)
Builds a 3x3 rotation matrix around the X axis (degrees).
void vec3i_lerp_ptr(vector3i *res, const vector3i *a, const vector3i *b, vm_float_t t)
Performs linear interpolation between two vector3i.
vector3i vec3i_x_axis(vm_int_t x)
Returns a vector3i along the x-axis.
Definition vector3i.c:33
vm_float_t vec2_max_component(vector2 v)
Returns the largest component.
Definition vector2.c:825
void vec3_div_scalar_ptr(vector3 *res, const vector3 *v, vm_float_t s)
Component-wise division of vector by scalar.
Definition vector3_ptr.c:56
matrix3 mat3_from_mat4(matrix4 m)
Copies the upper-left 3x3 of a matrix4.
Definition matrix3.c:195
matrix4 mat4_scale(vector3 v)
Constructs a scaling matrix from the given scale vector.
Definition matrix4.c:90
vector2i mat3i_mul_vec2i(matrix3i m, vector2i v)
Applies a 3x3 integer affine transform to a vector2i.
Definition matrix3i.c:105
void vec3i_min_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise minimum of two vector3i.
vector4 vec4_abs(vector4 v)
Computes the absolute value per component of a vector4.
Definition vector4.c:218
void vec4_normalize_ptr(vector4 *res, const vector4 *v)
void mat3i_transpose_ptr(matrix3i *res, const matrix3i *m)
Computes the transpose of a 3x3 integer matrix.
vector4i vec4i_w_axis(vm_int_t w)
Returns a vector4i along the w-axis.
Definition vector4i.c:65
vm_float_t vec2_heading(vector2 v)
Returns the heading angle of the vector in radians.
Definition vector2.c:803
void vec2i_normalize_to_vec2_ptr(vector2 *res, const vector2i *v)
Converts to a unit-length vector2.
void vec3i_neg_ptr(vector3i *res, const vector3i *v)
Negates a vector3i (multiplies by -1).
vector3i vec3i_from_rounded(const vector3 *v)
Converts a vector3 to a vector3i by rounding each component.
Definition vecmat.c:514
vector4 vec4_add_scalar(vector4 v, vm_float_t s)
Adds a scalar to each component.
Definition vector4.c:455
bool mat2i_eq(matrix2i a, matrix2i b)
Returns true if two matrices are exactly equal.
Definition vecmat.c:160
vector3i vec3i_sub_scalar(vector3i v, vm_int_t s)
Subtracts a scalar from each component.
Definition vector3i.c:406
vm_float_t vec2_dot(vector2 a, vector2 b)
Computes the dot product of two vectors.
Definition vector2.c:439
void vec2i_wrap_ptr(vector2i *res, const vector2i *v, const vector2i *period)
Wraps each component of v into [0, period).
vector3 vec3_scale(vector3 v, vm_float_t s)
Scales the vector by a scalar.
Definition vector3.c:453
void vec4i_div_floor_ptr(vector4i *res, const vector4i *a, const vector4i *b)
Component-wise floored division of a by b.
void vec2_mul_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Multiplies vectors a and b component-wise, storing the result in res.
Definition vector2_ptr.c:70
matrix4 mat4_ortho(vm_float_t left, vm_float_t right, vm_float_t bottom, vm_float_t top, vm_float_t near, vm_float_t far)
Constructs an orthographic projection matrix.
Definition matrix4.c:144
vector2 vec2_sub(vector2 a, vector2 b)
Subtracts the second vector from the first component-wise.
Definition vector2.c:112
vector2i vec2i_from(const vector2 *v)
Converts a vector2 to a vector2i by truncation.
Definition vecmat.c:328
vm_float_t vec2_sum(vector2 v)
Returns the sum of all components.
Definition vector2.c:836
vector2 vec2_cross(vector2 a, vector2 b)
Computes the 2D cross-product as a vector.
Definition vector2.c:206
void quat_conjugate_ptr(quaternion *res, const quaternion *q)
Writes the conjugate of a quaternion.
vector3 vec3_add(vector3 a, vector3 b)
Component-wise addition of two vectors.
Definition vector3.c:102
vm_float_t vec3_angle(vector3 a, vector3 b)
Computes the angle between two non-zero vector3 in radians.
Definition vector3.c:413
vector2 mat2_mul_vec2(matrix2 m, vector2 v)
Multiplies a 2x2 matrix by a vector2.
Definition matrix2.c:102
vector3 vec3_rotate_axis(vector3 v, vector3 axis, vm_float_t angle)
Rotates v around axis by angle radians.
Definition vector3.c:613
vector2 vec2_div_scalar(vector2 v, vm_float_t s)
Divides a vector by a scalar component-wise.
Definition vector2.c:144
void vec3_assign(vector3 *dest, const vector3 *src)
Copies src into dest.
Definition vecmat.c:374
vector4 vec4_w_axis(vm_float_t w)
Returns a vector4 along the w-axis.
Definition vector4.c:66
vm_float_t vec4i_distance(vector4i a, vector4i b)
Computes the Euclidean distance between two vector4i.
Definition vector4i.c:351
vector2i vec2i_lerp(vector2i a, vector2i b, vm_float_t t)
Linearly interpolates from a to b by t.
Definition vector2i.c:356
void vec2i_max_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Computes the component-wise maximum of vectors a and b, storing the result in res.
vm_int_t vec2i_length_chebyshev(vector2i v)
Returns the Chebyshev (L-inf) length.
Definition vector2i.c:576
vector2i vec2i_normalize(vector2i v)
Normalizes the vector to approximate unit length (float length, truncated to int).
Definition vector2i.c:190
void quat_to_mat4_ptr(matrix4 *res, const quaternion *q)
Converts a unit quaternion to a 4x4 rotation matrix and stores in res.
bool vec4_eq(vector4 a, vector4 b)
Returns true if two vectors are equal within VECMAT_EPSILON.
Definition vecmat.c:64
void vec3i_sub_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Subtracts a scalar from each component.
void vec3_mul_scalar_ptr(vector3 *res, const vector3 *v, vm_float_t s)
Component-wise multiplication of vector by scalar.
Definition vector3_ptr.c:42
vector3 vec3_neg(vector3 v)
Negation of a vector.
Definition vector3.c:181
quaternion quat_mul(quaternion a, quaternion b)
Multiplies two quaternions (a * b).
Definition quaternion.c:30
vm_float_t back_ease_in_out(vm_float_t f)
Definition easing.c:169
matrix4 mat4_from_mat3(matrix3 m)
Embeds a matrix3 into the upper-left of a matrix4.
Definition matrix4.c:334
vm_int_t vec4i_max_component(vector4i v)
Returns the largest component.
Definition vector4i.c:556
vector4i vec4i_div(vector4i a, vector4i b)
Divides two vectors component-wise.
Definition vector4i.c:379
void vec4_slide_ptr(vector4 *res, const vector4 *v, const vector4 *normal)
Removes the component of v along normal.
vector2 vec2_floor(vector2 v)
Applies floor to each component.
Definition vector2.c:283
vector4 vec4_sub_scalar(vector4 v, vm_float_t s)
Subtracts a scalar from each component.
Definition vector4.c:471
void mat4_transpose_ptr(matrix4 *res, const matrix4 *m)
Definition matrix4_ptr.c:79
vm_int_t mat2i_determinant(matrix2i m)
Calculates the determinant of the given 2x2 integer matrix.
Definition matrix2i.c:73
vector4i vec4i_abs(vector4i v)
Computes the absolute value per component of a vector4i.
Definition vector4i.c:217
vector4 vec4_mul_scalar(vector4 v, vm_float_t s)
Component-wise multiplication of vector by scalar.
Definition vector4.c:156
vector4 vec4_max(vector4 a, vector4 b)
Computes the component-wise maximum of two vector4.
Definition vector4.c:265
vm_float_t quartic_ease_out(vm_float_t f)
Definition easing.c:62
vm_float_t vec2_length(vector2 v)
Computes the length (magnitude) of the vector.
Definition vector2.c:450
vector4i vec4i_zero(void)
Returns a zero-initialized vector4i.
Definition vector4i.c:12
vector3 vec3_sign(vector3 v)
Computes the sign per component of a vector3 (-1, 0, or 1).
Definition vector3.c:274
bool vec3i_eq(vector3i a, vector3i b)
Returns true if two vectors are exactly equal.
Definition vecmat.c:91
vector3i vec3i_y_scale(vm_int_t y)
Returns a vector3i for scaling along the y-axis.
Definition vector3i.c:77
vector2i vec2i_sub(vector2i a, vector2i b)
Subtracts the second vector from the first component-wise.
Definition vector2i.c:96
void vec3_project_ptr(vector3 *res, const vector3 *a, const vector3 *b)
Projects a onto b.
vector3i vec3i_neg(vector3i v)
Negation of a vector.
Definition vector3i.c:181
vector3i vec3i_x_scale(vm_int_t x)
Returns a vector3i for scaling along the x-axis.
Definition vector3i.c:66
void vec3_floor_ptr(vector3 *res, const vector3 *v)
Component-wise floor of a vector.
bool quat_near(quaternion a, quaternion b, vm_float_t eps)
Returns true if a and b are within eps of each other.
Definition quaternion.c:274
void vec3_assign_xyz(vector3 *dest, vm_float_t x, vm_float_t y, vm_float_t z)
Assigns x, y, and z to dest.
Definition vecmat.c:389
vector3i vec3i_from_vec2i(vector2i v, vm_int_t z)
Builds a vector3i from a vector2i and z.
Definition vector3i.c:483
quaternion quat_from_mat3(matrix3 m)
Builds a quaternion from a 3x3 rotation matrix.
Definition quaternion.c:136
int8_t vm_int_t
Definition vecmat.h:103
bool mat4_eq(matrix4 a, matrix4 b)
Returns true if two matrices are equal within VECMAT_EPSILON.
Definition vecmat.c:145
vm_float_t deg_to_rad(vm_float_t degrees)
Converts degrees to radians.
Definition vecmat.c:14
matrix3i mat3i_identity(void)
Constructs the 3x3 identity matrix.
Definition matrix3i.c:14
vector3i vec3i_min(vector3i a, vector3i b)
Computes the component-wise minimum of two vector3i.
Definition vector3i.c:243
void vec2i_to_vec3i_ptr(vector3i *res, const vector2i *v, vm_int_t z)
Converts a vector4i to a vector3i by dropping w.
vector3i vec3i_max(vector3i a, vector3i b)
Computes the component-wise maximum of two vector3i.
Definition vector3i.c:259
void vec3_limit_length_ptr(vector3 *res, const vector3 *v, vm_float_t max_len)
Clamps the vector length to max_len.
void mat4_from_mat3_ptr(matrix4 *res, const matrix3 *m)
Embeds a matrix3 into the upper-left of a matrix4.
quaternion quat_from_axis_angle(vector3 axis, vm_float_t degrees)
Builds a quaternion from an axis and an angle in degrees.
Definition quaternion.c:121
vm_float_t back_ease_out(vm_float_t f)
Definition easing.c:159
void vec2i_cross_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Computes the 2D cross-product of a and b, storing the scalar value in res->x and 0 in res->y.
vm_float_t quartic_ease_in(vm_float_t f)
Definition easing.c:67
void vec4i_sign_ptr(vector4i *res, const vector4i *v)
Computes the sign (-1, 0, or 1) of each component of a vector4i and stores the result in res.
vector2 vec2_zero(void)
Returns a vector2 with both components set to 0.0f.
Definition vector2.c:12
vector4i vec4i_z_scale(vm_int_t z)
Returns a vector4i for scaling along the z-axis.
Definition vector4i.c:98
vm_float_t vec2i_aspect_ratio(vector2i v)
Computes the aspect ratio of the vector (x / y).
Definition vector2i.c:340
bool mat4i_eq(matrix4i a, matrix4i b)
Returns true if two matrices are exactly equal.
Definition vecmat.c:190
void vec4_mul_ptr(vector4 *res, const vector4 *a, const vector4 *b)
vm_int_t vec2i_min_component(vector2i v)
Returns the smallest component.
Definition vector2i.c:589
vm_float_t exponential_ease_in_out(vm_float_t f)
Definition easing.c:133
vector4 vec4_project(vector4 a, vector4 b)
Projects a onto b.
Definition vector4.c:534
vector4 vec4_w_scale(vm_float_t w)
Returns a vector4 for scaling along the w-axis.
Definition vector4.c:110
vector4i vec4i_sub_scalar(vector4i v, vm_int_t s)
Subtracts a scalar from each component.
Definition vector4i.c:411
vector2 vec2_reflect(vector2 v, vector2 normal)
Reflects vector v across the normal, storing the result in res.
Definition vector2.c:345
vm_int_t vec3i_sum(vector3i v)
Returns the sum of all components.
Definition vector3i.c:605
vector2i vec2i_cross(vector2i a, vector2i b)
Computes the 2D cross-product as a vector.
Definition vector2i.c:268
void mat4i_mul_vec4i_ptr(vector4i *res, const matrix4i *m, const vector4i *v)
Multiplies a 4x4 integer matrix by a vector4i.
vector4i vec4i_neg(vector4i v)
Negation of a vector.
Definition vector4i.c:202
vector3 vec3_reject(vector3 a, vector3 b)
Returns the component of a orthogonal to b.
Definition vector3.c:596
void mat3_rotation_z_ptr(matrix3 *res, vm_float_t degrees)
Sets the 3x3 matrix to a rotation around the Z-axis by the given angle in degrees.
void vec4i_wrap_ptr(vector4i *res, const vector4i *v, const vector4i *period)
Wraps each component of v into [0, period).
vm_float_t quintic_ease_in(vm_float_t f)
Definition easing.c:82
void mat4_mul_ptr(matrix4 *res, const matrix4 *a, const matrix4 *b)
Definition matrix4_ptr.c:69
vm_int_t vec3i_distance_squared(vector3i a, vector3i b)
Returns the squared Euclidean distance between a and b.
Definition vector3i.c:538
void vec3_refract_ptr(vector3 *res, const vector3 *incident, const vector3 *normal, vm_float_t eta)
Compute refraction of the incident vector through normal with eta.
bool vec3_is_normalized(vector3 v)
Returns true if the vector has unit length.
Definition vector3.c:823
vm_float_t sine_ease_in_out(vm_float_t f)
Definition easing.c:102
vector4i vec4i_max(vector4i a, vector4i b)
Computes the component-wise maximum of two vector4i.
Definition vector4i.c:264
vector3 vec3_saturate(vector3 v)
Clamps each component to the range [0, 1].
Definition vector3.c:533
matrix4 mat4_trs(vector3 translation, quaternion rotation, vector3 scale)
Builds a 4x4 TRS matrix from translation, rotation, and scale.
Definition matrix4.c:319
void vm_cpu_init(void)
Definition dispatch.c:77
#define VECMAT_VEC3_SIZE
Definition vecmat.h:65
vector3i vec3i(vm_int_t x, vm_int_t y, vm_int_t z)
Constructs a vector3i from x, y, and z.
Definition vecmat.c:432
void vec3_neg_ptr(vector3 *res, const vector3 *v)
Negation of a vector.
Definition vector3_ptr.c:87
void vec3_reflect_ptr(vector3 *res, const vector3 *incident, const vector3 *normal)
Compute reflection of the incident vector over normal.
void vec2_assign_xy(vector2 *dest, vm_float_t x, vm_float_t y)
Assigns x and y to dest.
Definition vecmat.c:244
@ VM_CPU_AVX
Definition vecmat.h:460
@ VM_CPU_SVE2
Definition vecmat.h:459
@ VM_CPU_AVX2
Definition vecmat.h:456
@ VM_CPU_SVE
Definition vecmat.h:457
@ VM_CPU_AVX512
Definition vecmat.h:458
@ VM_CPU_SCALAR
Definition vecmat.h:455
matrix2i mat2i_inverse(matrix2i m)
Computes the inverse of a 2x2 integer matrix.
Definition matrix2i.c:60
vector4 vec4_z_scale(vm_float_t z)
Returns a vector4for scaling along the z-axis.
Definition vector4.c:99
matrix2 mat2_scale(vector2 s)
Builds a 2x2 scaling matrix from a vector2.
Definition matrix2.c:117
void vec3i_sub_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise difference of two vector3i (a minus b).
vector3 vec2_to_vec3(vector2 v, vm_float_t z)
Converts a vector2 to a vector3 using z.
Definition vector2.c:731
#define VECMAT_MAT3_SIZE
Definition vecmat.h:69
vector4i vec4i_clamp(vector4i v, vector4i min, vector4i max)
Clamps each component of the input vector to the range defined by the minimum and maximum vectors.
Definition vector4i.c:314
void vec3i_normalize_to_vec3_ptr(vector3 *res, const vector3i *v)
Converts to a unit-length vector3.
matrix2 mat2_rotation_z(vm_float_t degrees)
Constructs a 2x2 Z-axis rotation matrix.
Definition matrix2.c:75
void mat4_perspective_ptr(matrix4 *res, vm_float_t fov, vm_float_t aspect, vm_float_t near, vm_float_t far)
Creates a perspective projection matrix.
vm_float_t bounce_ease_in_out(vm_float_t f)
Definition easing.c:200
vector3 mat4_extract_translation(matrix4 m)
Extracts the translation vector from a matrix4.
Definition matrix4.c:349
void vec2i_sign_ptr(vector2i *res, const vector2i *v)
Sets each component of res to the sign of the corresponding component in v (+1, -1,...
vm_int_t vec2i_max_component(vector2i v)
Returns the largest component.
Definition vector2i.c:600
vector3 vec3_sub(vector3 a, vector3 b)
Component-wise subtraction of two vectors.
Definition vector3.c:118
vm_float_t quintic_ease_out(vm_float_t f)
Definition easing.c:77
void vec2_fract_ptr(vector2 *res, const vector2 *v)
Returns the fractional part of each component.
void vec2_lerp_ptr(vector2 *res, const vector2 *a, const vector2 *b, vm_float_t t)
Linearly interpolates from a to b by t.
vm_float_t back_ease_in(vm_float_t f)
Definition easing.c:164
vm_float_t mat2_determinant(matrix2 m)
Calculates the determinant of the given 2x2 matrix.
Definition matrix2.c:88
void vec4_sub_ptr(vector4 *res, const vector4 *a, const vector4 *b)
vm_float_t vec2_length_manhattan(vector2 v)
Returns the Manhattan (L1) length.
Definition vector2.c:755
vector4i vec4i_add(vector4i a, vector4i b)
Component-wise addition of two vectors.
Definition vector4i.c:123
void quat_identity_ptr(quaternion *res)
Sets the quaternion to the identity quaternion (x=0, y=0, z=0, w=1).
bool mat2_eq(matrix2 a, matrix2 b)
Returns true if two matrices are equal within VECMAT_EPSILON.
Definition vecmat.c:115
void mat4_identity_ptr(matrix4 *res)
Sets the matrix to the identity matrix.
Definition matrix4_ptr.c:16
vector2i vec2i_sign(vector2i v)
Returns the sign of each component (+1, -1, or 0).
Definition vector2i.c:237
vector3 vec3_round(vector3 v)
Applies round per component to a vector3.
Definition vector3.c:319
vm_int_t vec3i_dot(vector3i a, vector3i b)
Computes the dot product of two vector3i.
Definition vector3i.c:322
void mat4_trs_ptr(matrix4 *res, const vector3 *translation, const quaternion *rotation, const vector3 *scale)
Builds a 4x4 TRS matrix from translation, rotation, and scale.
vm_cpu_features_t vm_cpu_runtime_features(void)
Definition cpu.c:151
void vec3_orthonormal_basis(vector3 n, vector3 *t, vector3 *b)
Builds a tangent and bitangent orthonormal to n.
Definition vector3.c:704
vm_float_t poly_ease_out(vm_float_t f, vm_float_t n)
Definition easing.c:22
vm_cpu_features_t vm_cpu_selected_features(void)
Definition cpu.c:175
vector2i vec2i_neg(vector2i v)
Negates the vector (multiplies each component by -1).
Definition vector2i.c:160
void mat2_mul_vec2_ptr(vector2 *res, const matrix2 *m, const vector2 *v)
Multiplies a 2x2 matrix by a vector2.
Definition matrix2_ptr.c:81
vm_float_t bounce_ease_in(vm_float_t f)
Definition easing.c:195
void quat_inverse_ptr(quaternion *res, const quaternion *q)
Writes the inverse of a quaternion.
void vec2_floor_ptr(vector2 *res, const vector2 *v)
Applies the floor function to each component of vector v, storing the result in res.
vm_int_t vec4i_dot(vector4i a, vector4i b)
Computes the dot product of two vector4i.
Definition vector4i.c:328
void mat3_rotation_y_ptr(matrix3 *res, vm_float_t degrees)
Builds a 3x3 rotation matrix around the Y axis (degrees).
vector3i vec3i_mul(vector3i a, vector3i b)
Component-wise multiplication of two vectors.
Definition vector3i.c:166
bool vec2_near(vector2 a, vector2 b, vm_float_t eps)
Returns true if a and b are within eps of each other.
Definition vector2.c:871
void mat2_from_mat3_ptr(matrix2 *res, const matrix3 *m)
Copies the upper-left 2x2 of a matrix3.
vector3i mat3i_mul_vec3i(matrix3i m, vector3i v)
Multiplies a 3x3 integer matrix by a vector3i.
Definition matrix3i.c:89
void mat4_rotation_y_ptr(matrix4 *res, vm_float_t degrees)
Builds a 4x4 rotation matrix around the Y axis (degrees).
matrix3i mat3i_transpose(matrix3i m)
Computes the transpose of a 3x3 integer matrix.
Definition matrix3i.c:45
vm_float_t sine_ease_in(vm_float_t f)
Definition easing.c:97
vm_float_t poly_ease_in_out(vm_float_t f, vm_float_t n)
Definition easing.c:27
bool vec4_is_normalized(vector4 v)
Returns true if the vector has unit length.
Definition vector4.c:626
void vec2i_div_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Divides vector v by scalar s component-wise (float division, truncated to int), storing the result in...
vector2i vec2i_div_scalar(vector2i v, vm_int_t s)
Divides a vector by a scalar component-wise (float division, truncated to int).
Definition vector2i.c:129
void vec4_clamp_ptr(vector4 *res, const vector4 *v, const vector4 *min, const vector4 *max)
vector3i vec3i_sub(vector3i a, vector3i b)
Component-wise subtraction of two vectors.
Definition vector3i.c:118
vector3i vec3i_cross(vector3i a, vector3i b)
Computes the cross-product of two vector3i.
Definition vector3i.c:212
vm_float_t vec2i_length(vector2i v)
Computes the length (magnitude) of the vector.
Definition vector2i.c:293
void vec2_cross_ptr(vector2 *res, const vector2 *a, const vector2 *b)
Computes the 2D cross-product of a and b, storing the scalar value in res->x and 0 in res->y.
vector2 vec2_y_axis(vm_float_t y)
Returns a vector2 along the y-axis (x = 0.0f).
Definition vector2.c:44
matrix2i mat2i_mul(matrix2i a, matrix2i b)
Multiplies two 2x2 integer matrices (a * b).
Definition matrix2i.c:30