Revision control

++ uniform highp mat4 MVP;
++ uniform highp vec3 minBounds;
++ uniform highp vec3 maxBounds;
++ uniform highp vec3 cameraPositionRelativeToModel;
++
++ attribute highp vec3 vertexPosition_mdl;
++ attribute highp vec2 vertexUV;
++ attribute highp vec3 vertexNormal_mdl;
++
++ varying highp vec3 pos;
++ varying highp vec3 rayDir;
++
++ void main() {
++ gl_Position = MVP * vec4(vertexPosition_mdl, 1.0);
++
++ highp vec3 minBoundsNorm = minBounds;
++ highp vec3 maxBoundsNorm = maxBounds;
++
++ // Y and Z are flipped in bounds to be directly usable in texture calculations,
++ // so flip them back to normal for position calculations
++ minBoundsNorm.yz = -minBoundsNorm.yz;
++ maxBoundsNorm.yz = -maxBoundsNorm.yz;
++
++ minBoundsNorm = 0.5 * (minBoundsNorm + 1.0);
++ maxBoundsNorm = 0.5 * (maxBoundsNorm + 1.0);
++
++ pos = vertexPosition_mdl
++ + ((1.0 - vertexPosition_mdl) * minBoundsNorm)
++ - ((1.0 + vertexPosition_mdl) * (1.0 - maxBoundsNorm));
++
++ rayDir = -(cameraPositionRelativeToModel - pos);
++
++ // Flip Y and Z so QImage bits work directly for texture and first image is in the front
++ rayDir.yz = -rayDir.yz;
++ pos.yz = -pos.yz;
++ }