Closed Pessimistress closed 6 years ago
This expression is transpiled incorrectly:
// Expression A gl_Position = uProjection * uView * uModel * positions;
I can work around it by adding parentheses:
// Expression B gl_Position = uProjection * (uView * (uModel * positions)); // Expression C gl_Position = (uProjection * (uView * uModel)) * positions;
Comparing the compiler output (only the first element of the vec4):
// Expression A, incorrect uProjection[0] * uView[0] + uProjection[4] * uView[1] + uProjection[8] * uView[2] + uProjection[12] * uView[3] * uModel[0] + uProjection[0] * uView[4] + uProjection[4] * uView[5] + uProjection[8] * uView[6] + uProjection[12] * uView[7] * uModel[1] + uProjection[0] * uView[8] + uProjection[4] * uView[9] + uProjection[8] * uView[10] + uProjection[12] * uView[11] * uModel[2] + uProjection[0] * uView[12] + uProjection[4] * uView[13] + uProjection[8] * uView[14] + uProjection[12] * uView[15] * uModel[3] * position[0] + uProjection[0] * uView[0] + uProjection[4] * uView[1] + uProjection[8] * uView[2] + uProjection[12] * uView[3] * uModel[4] + uProjection[0] * uView[4] + uProjection[4] * uView[5] + uProjection[8] * uView[6] + uProjection[12] * uView[7] * uModel[5] + uProjection[0] * uView[8] + uProjection[4] * uView[9] + uProjection[8] * uView[10] + uProjection[12] * uView[11] * uModel[6] + uProjection[0] * uView[12] + uProjection[4] * uView[13] + uProjection[8] * uView[14] + uProjection[12] * uView[15] * uModel[7] * position[1] + uProjection[0] * uView[0] + uProjection[4] * uView[1] + uProjection[8] * uView[2] + uProjection[12] * uView[3] * uModel[8] + uProjection[0] * uView[4] + uProjection[4] * uView[5] + uProjection[8] * uView[6] + uProjection[12] * uView[7] * uModel[9] + uProjection[0] * uView[8] + uProjection[4] * uView[9] + uProjection[8] * uView[10] + uProjection[12] * uView[11] * uModel[10] + uProjection[0] * uView[12] + uProjection[4] * uView[13] + uProjection[8] * uView[14] + uProjection[12] * uView[15] * uModel[11] * position[2] + uProjection[0] * uView[0] + uProjection[4] * uView[1] + uProjection[8] * uView[2] + uProjection[12] * uView[3] * uModel[12] + uProjection[0] * uView[4] + uProjection[4] * uView[5] + uProjection[8] * uView[6] + uProjection[12] * uView[7] * uModel[13] + uProjection[0] * uView[8] + uProjection[4] * uView[9] + uProjection[8] * uView[10] + uProjection[12] * uView[11] * uModel[14] + uProjection[0] * uView[12] + uProjection[4] * uView[13] + uProjection[8] * uView[14] + uProjection[12] * uView[15] * uModel[15] * position[3] // Expression B, correct uProjection[0] * (uView[0] * (uModel[0] * position[0] + uModel[4] * position[1] + uModel[8] * position[2] + uModel[12] * position[3]) + uView[4] * (uModel[1] * position[0] + uModel[5] * position[1] + uModel[9] * position[2] + uModel[13] * position[3]) + uView[8] * (uModel[2] * position[0] + uModel[6] * position[1] + uModel[10] * position[2] + uModel[14] * position[3]) + uView[12] * (uModel[3] * position[0] + uModel[7] * position[1] + uModel[11] * position[2] + uModel[15] * position[3])) + uProjection[4] * (uView[1] * (uModel[0] * position[0] + uModel[4] * position[1] + uModel[8] * position[2] + uModel[12] * position[3]) + uView[5] * (uModel[1] * position[0] + uModel[5] * position[1] + uModel[9] * position[2] + uModel[13] * position[3]) + uView[9] * (uModel[2] * position[0] + uModel[6] * position[1] + uModel[10] * position[2] + uModel[14] * position[3]) + uView[13] * (uModel[3] * position[0] + uModel[7] * position[1] + uModel[11] * position[2] + uModel[15] * position[3])) + uProjection[8] * (uView[2] * (uModel[0] * position[0] + uModel[4] * position[1] + uModel[8] * position[2] + uModel[12] * position[3]) + uView[6] * (uModel[1] * position[0] + uModel[5] * position[1] + uModel[9] * position[2] + uModel[13] * position[3]) + uView[10] * (uModel[2] * position[0] + uModel[6] * position[1] + uModel[10] * position[2] + uModel[14] * position[3]) + uView[14] * (uModel[3] * position[0] + uModel[7] * position[1] + uModel[11] * position[2] + uModel[15] * position[3])) + uProjection[12] * (uView[3] * (uModel[0] * position[0] + uModel[4] * position[1] + uModel[8] * position[2] + uModel[12] * position[3]) + uView[7] * (uModel[1] * position[0] + uModel[5] * position[1] + uModel[9] * position[2] + uModel[13] * position[3]) + uView[11] * (uModel[2] * position[0] + uModel[6] * position[1] + uModel[10] * position[2] + uModel[14] * position[3]) + uView[15] * (uModel[3] * position[0] + uModel[7] * position[1] + uModel[11] * position[2] + uModel[15] * position[3])) // Expression C, correct (uProjection[0] * (uView[0] * uModel[0] + uView[4] * uModel[1] + uView[8] * uModel[2] + uView[12] * uModel[3]) + uProjection[4] * (uView[1] * uModel[0] + uView[5] * uModel[1] + uView[9] * uModel[2] + uView[13] * uModel[3]) + uProjection[8] * (uView[2] * uModel[0] + uView[6] * uModel[1] + uView[10] * uModel[2] + uView[14] * uModel[3]) + uProjection[12] * (uView[3] * uModel[0] + uView[7] * uModel[1] + uView[11] * uModel[2] + uView[15] * uModel[3])) * position[0] + (uProjection[0] * (uView[0] * uModel[4] + uView[4] * uModel[5] + uView[8] * uModel[6] + uView[12] * uModel[7]) + uProjection[4] * (uView[1] * uModel[4] + uView[5] * uModel[5] + uView[9] * uModel[6] + uView[13] * uModel[7]) + uProjection[8] * (uView[2] * uModel[4] + uView[6] * uModel[5] + uView[10] * uModel[6] + uView[14] * uModel[7]) + uProjection[12] * (uView[3] * uModel[4] + uView[7] * uModel[5] + uView[11] * uModel[6] + uView[15] * uModel[7])) * position[1] + (uProjection[0] * (uView[0] * uModel[8] + uView[4] * uModel[9] + uView[8] * uModel[10] + uView[12] * uModel[11]) + uProjection[4] * (uView[1] * uModel[8] + uView[5] * uModel[9] + uView[9] * uModel[10] + uView[13] * uModel[11]) + uProjection[8] * (uView[2] * uModel[8] + uView[6] * uModel[9] + uView[10] * uModel[10] + uView[14] * uModel[11]) + uProjection[12] * (uView[3] * uModel[8] + uView[7] * uModel[9] + uView[11] * uModel[10] + uView[15] * uModel[11])) * position[2] + (uProjection[0] * (uView[0] * uModel[12] + uView[4] * uModel[13] + uView[8] * uModel[14] + uView[12] * uModel[15]) + uProjection[4] * (uView[1] * uModel[12] + uView[5] * uModel[13] + uView[9] * uModel[14] + uView[13] * uModel[15]) + uProjection[8] * (uView[2] * uModel[12] + uView[6] * uModel[13] + uView[10] * uModel[14] + uView[14] * uModel[15]) + uProjection[12] * (uView[3] * uModel[12] + uView[7] * uModel[13] + uView[11] * uModel[14] + uView[15] * uModel[15])) * position[3]
Good catch! Should be fixed in 1.6.1. Thanks!
Just tried 1.7.0. Still seeing some bugs, detailed with https://github.com/stackgl/glsl-transpiler/pull/37
This expression is transpiled incorrectly:
I can work around it by adding parentheses:
Comparing the compiler output (only the first element of the vec4):