Vecmat 0.2.3
C math and linear algebra library for 2D/3D graphics, physics, and science.
Loading...
Searching...
No Matches
matrix4i_ptr.c
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#include <vecmat.h>
6
13{
14 matrix4i m = {0};
15 m.v[0] = 1;
16 m.v[5] = 1;
17 m.v[10] = 1;
18 m.v[15] = 1;
19 *res = m;
20}
21
29void mat4i_mul_ptr(matrix4i *res, const matrix4i *a, const matrix4i *b)
30{
31 matrix4i r;
32 r.m11 = a->m11 * b->m11 + a->m12 * b->m21 + a->m13 * b->m31 + a->m14 * b->m41;
33 r.m21 = a->m21 * b->m11 + a->m22 * b->m21 + a->m23 * b->m31 + a->m24 * b->m41;
34 r.m31 = a->m31 * b->m11 + a->m32 * b->m21 + a->m33 * b->m31 + a->m34 * b->m41;
35 r.m41 = a->m41 * b->m11 + a->m42 * b->m21 + a->m43 * b->m31 + a->m44 * b->m41;
36
37 r.m12 = a->m11 * b->m12 + a->m12 * b->m22 + a->m13 * b->m32 + a->m14 * b->m42;
38 r.m22 = a->m21 * b->m12 + a->m22 * b->m22 + a->m23 * b->m32 + a->m24 * b->m42;
39 r.m32 = a->m31 * b->m12 + a->m32 * b->m22 + a->m33 * b->m32 + a->m34 * b->m42;
40 r.m42 = a->m41 * b->m12 + a->m42 * b->m22 + a->m43 * b->m32 + a->m44 * b->m42;
41
42 r.m13 = a->m11 * b->m13 + a->m12 * b->m23 + a->m13 * b->m33 + a->m14 * b->m43;
43 r.m23 = a->m21 * b->m13 + a->m22 * b->m23 + a->m23 * b->m33 + a->m24 * b->m43;
44 r.m33 = a->m31 * b->m13 + a->m32 * b->m23 + a->m33 * b->m33 + a->m34 * b->m43;
45 r.m43 = a->m41 * b->m13 + a->m42 * b->m23 + a->m43 * b->m33 + a->m44 * b->m43;
46
47 r.m14 = a->m11 * b->m14 + a->m12 * b->m24 + a->m13 * b->m34 + a->m14 * b->m44;
48 r.m24 = a->m21 * b->m14 + a->m22 * b->m24 + a->m23 * b->m34 + a->m24 * b->m44;
49 r.m34 = a->m31 * b->m14 + a->m32 * b->m24 + a->m33 * b->m34 + a->m34 * b->m44;
50 r.m44 = a->m41 * b->m14 + a->m42 * b->m24 + a->m43 * b->m34 + a->m44 * b->m44;
51 *res = r;
52}
53
62{
63 matrix4i r;
64 for (int i = 0; i < 4; i++) {
65 for (int j = 0; j < 4; j++) {
66 r.v[i * 4 + j] = m->v[j * 4 + i];
67 }
68 }
69 *res = r;
70}
71
82{
83 int inv[16];
84
85 inv[0] = m->v[5] * m->v[10] * m->v[15] - m->v[5] * m->v[14] * m->v[11] - m->v[9] * m->v[6] * m->v[15] + m->v[9] * m->v[14] * m->v[7] + m->v[13] * m->v[6] * m->v[11] - m->v[13] * m->v[10] * m->v[7];
86 inv[4] = -m->v[4] * m->v[10] * m->v[15] + m->v[4] * m->v[14] * m->v[11] + m->v[8] * m->v[6] * m->v[15] - m->v[8] * m->v[14] * m->v[7] - m->v[12] * m->v[6] * m->v[11] + m->v[12] * m->v[10] * m->v[7];
87 inv[8] = m->v[4] * m->v[9] * m->v[15] - m->v[4] * m->v[13] * m->v[11] - m->v[8] * m->v[5] * m->v[15] + m->v[8] * m->v[13] * m->v[7] + m->v[12] * m->v[5] * m->v[11] - m->v[12] * m->v[9] * m->v[7];
88 inv[12] = -m->v[4] * m->v[9] * m->v[14] + m->v[4] * m->v[13] * m->v[10] + m->v[8] * m->v[5] * m->v[14] - m->v[8] * m->v[13] * m->v[6] - m->v[12] * m->v[5] * m->v[10] + m->v[12] * m->v[9] * m->v[6];
89 inv[1] = -m->v[1] * m->v[10] * m->v[15] + m->v[1] * m->v[14] * m->v[11] + m->v[9] * m->v[2] * m->v[15] - m->v[9] * m->v[14] * m->v[3] - m->v[13] * m->v[2] * m->v[11] + m->v[13] * m->v[10] * m->v[3];
90 inv[5] = m->v[0] * m->v[10] * m->v[15] - m->v[0] * m->v[14] * m->v[11] - m->v[8] * m->v[2] * m->v[15] + m->v[8] * m->v[14] * m->v[3] + m->v[12] * m->v[2] * m->v[11] - m->v[12] * m->v[10] * m->v[3];
91 inv[9] = -m->v[0] * m->v[9] * m->v[15] + m->v[0] * m->v[13] * m->v[11] + m->v[8] * m->v[1] * m->v[15] - m->v[8] * m->v[13] * m->v[3] - m->v[12] * m->v[1] * m->v[11] + m->v[12] * m->v[9] * m->v[3];
92 inv[13] = m->v[0] * m->v[9] * m->v[14] - m->v[0] * m->v[13] * m->v[10] - m->v[8] * m->v[1] * m->v[14] + m->v[8] * m->v[13] * m->v[2] + m->v[12] * m->v[1] * m->v[10] - m->v[12] * m->v[9] * m->v[2];
93 inv[2] = m->v[1] * m->v[6] * m->v[15] - m->v[1] * m->v[14] * m->v[7] - m->v[5] * m->v[2] * m->v[15] + m->v[5] * m->v[14] * m->v[3] + m->v[13] * m->v[2] * m->v[7] - m->v[13] * m->v[6] * m->v[3];
94 inv[6] = -m->v[0] * m->v[6] * m->v[15] + m->v[0] * m->v[14] * m->v[7] + m->v[4] * m->v[2] * m->v[15] - m->v[4] * m->v[14] * m->v[3] - m->v[12] * m->v[2] * m->v[7] + m->v[12] * m->v[6] * m->v[3];
95 inv[10] = m->v[0] * m->v[5] * m->v[15] - m->v[0] * m->v[13] * m->v[7] - m->v[4] * m->v[1] * m->v[15] + m->v[4] * m->v[13] * m->v[3] + m->v[12] * m->v[1] * m->v[7] - m->v[12] * m->v[5] * m->v[3];
96 inv[14] = -m->v[0] * m->v[5] * m->v[14] + m->v[0] * m->v[13] * m->v[6] + m->v[4] * m->v[1] * m->v[14] - m->v[4] * m->v[13] * m->v[2] - m->v[12] * m->v[1] * m->v[6] + m->v[12] * m->v[5] * m->v[2];
97 inv[3] = -m->v[1] * m->v[6] * m->v[11] + m->v[1] * m->v[10] * m->v[7] + m->v[5] * m->v[2] * m->v[11] - m->v[5] * m->v[10] * m->v[3] - m->v[9] * m->v[2] * m->v[7] + m->v[9] * m->v[6] * m->v[3];
98 inv[7] = m->v[0] * m->v[6] * m->v[11] - m->v[0] * m->v[10] * m->v[7] - m->v[4] * m->v[2] * m->v[11] + m->v[4] * m->v[10] * m->v[3] + m->v[8] * m->v[2] * m->v[7] - m->v[8] * m->v[6] * m->v[3];
99 inv[11] = -m->v[0] * m->v[5] * m->v[11] + m->v[0] * m->v[9] * m->v[7] + m->v[4] * m->v[1] * m->v[11] - m->v[4] * m->v[9] * m->v[3] - m->v[8] * m->v[1] * m->v[7] + m->v[8] * m->v[5] * m->v[3];
100 inv[15] = m->v[0] * m->v[5] * m->v[10] - m->v[0] * m->v[9] * m->v[6] - m->v[4] * m->v[1] * m->v[10] + m->v[4] * m->v[9] * m->v[2] + m->v[8] * m->v[1] * m->v[6] - m->v[8] * m->v[5] * m->v[2];
101
102 const vm_int_t det = m->v[0] * inv[0] + m->v[1] * inv[4] + m->v[2] * inv[8] + m->v[3] * inv[12];
103 if (det == 0) {
104 matrix4i id = {0};
105 id.v[0] = 1;
106 id.v[5] = 1;
107 id.v[10] = 1;
108 id.v[15] = 1;
109 *res = id;
110 return;
111 }
112
113 const double fdet = 1.0f / (vm_float_t)det;
114
115 matrix4i result;
116 for (int i = 0; i < 16; i++) {
117 result.v[i] = (int)(inv[i] * fdet);
118 }
119 *res = result;
120}
121
129void mat4i_mul_vec4i_ptr(vector4i *res, const matrix4i *m, const vector4i *v)
130{
131 const vm_int_t x = v->x;
132 const vm_int_t y = v->y;
133 const vm_int_t z = v->z;
134 const vm_int_t w = v->w;
135 res->x = m->m11 * x + m->m12 * y + m->m13 * z + m->m14 * w;
136 res->y = m->m21 * x + m->m22 * y + m->m23 * z + m->m24 * w;
137 res->z = m->m31 * x + m->m32 * y + m->m33 * z + m->m34 * w;
138 res->w = m->m41 * x + m->m42 * y + m->m43 * z + m->m44 * w;
139}
140
149void mat4i_mul_vec3i_ptr(vector3i *res, const matrix4i *m, const vector3i *v, const vm_int_t w)
150{
151 const vm_int_t x = v->x;
152 const vm_int_t y = v->y;
153 const vm_int_t z = v->z;
154 res->x = m->m11 * x + m->m12 * y + m->m13 * z + m->m14 * w;
155 res->y = m->m21 * x + m->m22 * y + m->m23 * z + m->m24 * w;
156 res->z = m->m31 * x + m->m32 * y + m->m33 * z + m->m34 * w;
157}
void mat4i_mul_vec3i_ptr(vector3i *res, const matrix4i *m, const vector3i *v, const vm_int_t w)
Transforms a vector3i by a 4x4 integer matrix using homogeneous w.
void mat4i_mul_ptr(matrix4i *res, const matrix4i *a, const matrix4i *b)
Performs matrix multiplication of two 4x4 matrices and stores the result.
void mat4i_transpose_ptr(matrix4i *res, const matrix4i *m)
Transposes the given 4x4 integer matrix and stores the result in the provided matrix structure.
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.
void mat4i_identity_ptr(matrix4i *res)
Sets the given 4x4 integer matrix to the identity matrix.
void mat4i_mul_vec4i_ptr(vector4i *res, const matrix4i *m, const vector4i *v)
Multiplies a 4x4 integer matrix by a vector4i.
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_int_t x
Definition vecmat.h:174
vm_int_t y
Definition vecmat.h:175
vm_int_t z
Definition vecmat.h:176
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 x
Definition vecmat.h:185
double vm_float_t
Definition vecmat.h:79
int8_t vm_int_t
Definition vecmat.h:103