51 lines
1.7 KiB
Plaintext
51 lines
1.7 KiB
Plaintext
|
|
uniform half4 colorGreen, colorRed;
|
||
|
|
uniform float4 testInputs; // equals (-1.25, 0, 0.75, 2.25)
|
||
|
|
|
||
|
|
const int plus = 1;
|
||
|
|
const int minus = 2;
|
||
|
|
const int star = 3;
|
||
|
|
const int slash = 4;
|
||
|
|
|
||
|
|
bool test(int op, float m11, float m12, float m21, float m22, float2x2 expected) {
|
||
|
|
|
||
|
|
float one = colorRed.r;
|
||
|
|
|
||
|
|
float2x2 m2 = float2x2(m11 * one, m12 * one, m21 * one, m22 * one);
|
||
|
|
switch (op) {
|
||
|
|
case plus: m2 += 1; break;
|
||
|
|
case minus: m2 -= 1; break;
|
||
|
|
case star: m2 *= 2; break;
|
||
|
|
case slash: m2 /= 2; break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return m2[0][0] == expected[0][0] &&
|
||
|
|
m2[0][1] == expected[0][1] &&
|
||
|
|
m2[1][0] == expected[1][0] &&
|
||
|
|
m2[1][1] == expected[1][1];
|
||
|
|
}
|
||
|
|
|
||
|
|
bool divisionTest() {
|
||
|
|
float ten = colorRed.r * 10.0;
|
||
|
|
float2x2 mat = float2x2(ten.xx, ten.xx);
|
||
|
|
float2x2 div = mat / testInputs.x; // `matrix / scalar` should become `matrix * (1 / scalar)`
|
||
|
|
mat /= testInputs.x; // `matrix /= scalar` should become `matrix *= (1 / scalar)`
|
||
|
|
|
||
|
|
return all(lessThan(abs(float4(div) + float4(8)), float4(0.01))) &&
|
||
|
|
all(lessThan(abs(float4(mat) + float4(8)), float4(0.01)));
|
||
|
|
}
|
||
|
|
|
||
|
|
half4 main(float2 coords) {
|
||
|
|
float f1 = 1 * colorGreen.g;
|
||
|
|
float f2 = 2 * colorGreen.g;
|
||
|
|
float f3 = 3 * colorGreen.g;
|
||
|
|
float f4 = 4 * colorGreen.g;
|
||
|
|
|
||
|
|
return true
|
||
|
|
&& test(plus, f1, f2, f3, f4, float2x2(f1+1, f2+1, f3+1, f4+1))
|
||
|
|
&& test(minus, f1, f2, f3, f4, float2x2(f1-1, f2-1, f3-1, f4-1))
|
||
|
|
&& test(star, f1, f2, f3, f4, float2x2(f1*2, f2*2, f3*2, f4*2))
|
||
|
|
&& test(slash, f1, f2, f3, f4, float2x2(f1/2, f2/2, f3/2, f4/2))
|
||
|
|
&& divisionTest()
|
||
|
|
? colorGreen : colorRed;
|
||
|
|
}
|