summaryrefslogtreecommitdiff
path: root/kon/konmath.h
diff options
context:
space:
mode:
authorKonAki <konaki@anokonaki.org>2026-10-11 22:16:09 +0800
committerKonAki <konaki@anokonaki.org>2026-10-11 22:16:09 +0800
commita4b7011ac9d5ccf012a99bd8a7769fcd45bac53e (patch)
treeb04f98585b2cd303e7d6e501be6b44ce29e5de49 /kon/konmath.h
parent20bbe2731a2d04b6dde65e9f893ad360915a889b (diff)
konsofren: kon_lightPass, point and spot lights from the depth buffer
Diffstat (limited to 'kon/konmath.h')
-rw-r--r--kon/konmath.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/kon/konmath.h b/kon/konmath.h
index 44f6571..f8aeceb 100644
--- a/kon/konmath.h
+++ b/kon/konmath.h
@@ -124,6 +124,40 @@ static inline kon_mat4_t kon_mat4Mul(kon_mat4_t a, kon_mat4_t b) {
return r;
}
+/* the matrix that undoes m. returns the identity and sets *ok to 0 if m can't be undone, ok can be NULL */
+static inline kon_mat4_t kon_mat4Inverse(kon_mat4_t a, int *ok) {
+ const float *m = a.m;
+ kon_mat4_t r;
+ float *o = r.m, det;
+ int i;
+
+ o[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10];
+ o[4] = -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10];
+ o[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9];
+ o[12] = -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9];
+ o[1] = -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10];
+ o[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10];
+ o[9] = -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9];
+ o[13] = m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9];
+ o[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6];
+ o[6] = -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6];
+ o[10] = m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5];
+ o[14] = -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5];
+ o[3] = -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6];
+ o[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6];
+ o[11] = -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5];
+ o[15] = m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5];
+
+ det = m[0] * o[0] + m[1] * o[4] + m[2] * o[8] + m[3] * o[12];
+ if (det > -1.0e-20f && det < 1.0e-20f) {
+ if (ok) *ok = 0;
+ return kon_mat4Identity();
+ }
+ for (i = 0; i < 16; i++) o[i] /= det;
+ if (ok) *ok = 1;
+ return r;
+}
+
static inline kon_vec4_t kon_mat4MulVec4(kon_mat4_t m, kon_vec4_t v) {
return (kon_vec4_t){
m.m[0] * v.x + m.m[4] * v.y + m.m[8] * v.z + m.m[12] * v.w,