stackgl / glsl-transpiler

Transpile GLSL to JS
http://stackgl.github.io/glsl-transpiler/
175 stars 21 forks source link

Stacked matrix operation not transpiled correctly #36

Closed Pessimistress closed 6 years ago

Pessimistress commented 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]
dy commented 6 years ago

Good catch! Should be fixed in 1.6.1. Thanks!

Pessimistress commented 6 years ago

Just tried 1.7.0. Still seeing some bugs, detailed with https://github.com/stackgl/glsl-transpiler/pull/37