From 218a8e24c35131fe0086bcc5ef79721f32ec665d Mon Sep 17 00:00:00 2001 From: Julius Ikkala Date: Sun, 22 Jun 2025 00:41:03 +0300 Subject: [PATCH] Add default implementation for determinant --- source/slang/hlsl.meta.slang | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index d71e57400e7..46d251298ed 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -8565,6 +8565,37 @@ T determinant(matrix m) OpExtInst $$T result glsl450 Determinant $m }; case wgsl: __intrinsic_asm "determinant"; + default: + static_assert(N >= 1 && N <= 4, "determinant is only implemented up to 4x4 matrices"); + if (N == 1) + { + return m[0][0]; + } + else if (N == 2) + { + return m[0][0] * m[1][1] - m[0][1] * m[1][0]; + } + else if (N == 3) + { + return + m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) + - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) + + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); + } + else// if (N == 4) + { + T a = m[2][2] * m[3][3] - m[2][3] * m[3][2]; + T b = m[2][1] * m[3][3] - m[2][3] * m[3][1]; + T c = m[2][1] * m[3][2] - m[2][2] * m[3][1]; + T d = m[2][0] * m[3][3] - m[2][3] * m[3][0]; + T e = m[2][0] * m[3][2] - m[2][2] * m[3][0]; + T f = m[2][0] * m[3][1] - m[2][1] * m[3][0]; + return + m[0][0] * (m[1][1] * a - m[1][2] * b + m[1][3] * c) + - m[0][1] * (m[1][0] * a - m[1][2] * d + m[1][3] * e) + + m[0][2] * (m[1][0] * b - m[1][1] * d + m[1][3] * f) + - m[0][3] * (m[1][0] * c - m[1][1] * e + m[1][2] * f); + } } }