|
@@ -42,4 +42,42 @@ out vec4 outFragColor;
|
|
|
# define isnan(val) !(val<0.0||val>0.0||val==0.0)
|
|
|
#endif
|
|
|
|
|
|
+#if __VERSION__ == 110
|
|
|
+mat3 mat3_sub(mat4 m) {
|
|
|
+ return mat3(m[0].xyz, m[1].xyz, m[2].xyz);
|
|
|
+}
|
|
|
+#else
|
|
|
+ #define mat3_sub mat3
|
|
|
+#endif
|
|
|
+
|
|
|
+#if __VERSION__ <= 140
|
|
|
+float determinant(mat2 m) {
|
|
|
+ return m[0][0] * m[1][1] - m[1][0] * m[0][1];
|
|
|
+}
|
|
|
+
|
|
|
+float determinant(mat3 m) {
|
|
|
+ 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]);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#if __VERSION__ <= 130
|
|
|
+mat2 inverse(mat2 m) {
|
|
|
+ return mat2(m[1][1], -m[0][1], -m[1][0], m[0][0]) / determinant(m);
|
|
|
+}
|
|
|
+
|
|
|
+mat3 inverse(mat3 m) {
|
|
|
+ return mat3(
|
|
|
+ + (m[1][1] * m[2][2] - m[2][1] * m[1][2]),
|
|
|
+ - (m[1][0] * m[2][2] - m[2][0] * m[1][2]),
|
|
|
+ + (m[1][0] * m[2][1] - m[2][0] * m[1][1]),
|
|
|
+ - (m[0][1] * m[2][2] - m[2][1] * m[0][2]),
|
|
|
+ + (m[0][0] * m[2][2] - m[2][0] * m[0][2]),
|
|
|
+ - (m[0][0] * m[2][1] - m[2][0] * m[0][1]),
|
|
|
+ + (m[0][1] * m[1][2] - m[1][1] * m[0][2]),
|
|
|
+ - (m[0][0] * m[1][2] - m[1][0] * m[0][2]),
|
|
|
+ + (m[0][0] * m[1][1] - m[1][0] * m[0][1])) / determinant(m);
|
|
|
+}
|
|
|
+#endif
|
|
|
|