diff options
| author | KonAki <konaki@anokonaki.org> | 2026-10-11 22:16:09 +0800 |
|---|---|---|
| committer | KonAki <konaki@anokonaki.org> | 2026-10-11 22:16:09 +0800 |
| commit | a4b7011ac9d5ccf012a99bd8a7769fcd45bac53e (patch) | |
| tree | b04f98585b2cd303e7d6e501be6b44ce29e5de49 /kon/konmath.h | |
| parent | 20bbe2731a2d04b6dde65e9f893ad360915a889b (diff) | |
konsofren: kon_lightPass, point and spot lights from the depth buffer
Diffstat (limited to 'kon/konmath.h')
| -rw-r--r-- | kon/konmath.h | 34 |
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, |
