in vec4 aPosition; in vec2 aTexCoord; in vec4 aColor; #ifndef SIMPLE // we do not need these for simple shaders in vec4 aVertex2; out vec4 pixelpos; out vec2 glowdist; #endif out vec4 vTexCoord; out vec4 vColor; void main() { #ifndef SIMPLE vec4 worldcoord = ModelMatrix * mix(aPosition, aVertex2, uInterpolationFactor); #else vec4 worldcoord = ModelMatrix * aPosition; #endif vec4 eyeCoordPos = ViewMatrix * worldcoord; vColor = aColor; #ifndef SIMPLE pixelpos.xyz = worldcoord.xyz; pixelpos.w = -eyeCoordPos.z/eyeCoordPos.w; glowdist.x = -((uGlowTopPlane.w + uGlowTopPlane.x * worldcoord.x + uGlowTopPlane.y * worldcoord.z) * uGlowTopPlane.z) - worldcoord.y; glowdist.y = worldcoord.y + ((uGlowBottomPlane.w + uGlowBottomPlane.x * worldcoord.x + uGlowBottomPlane.y * worldcoord.z) * uGlowBottomPlane.z); #endif #ifdef SPHEREMAP vec3 u = normalize(eyeCoordPos.xyz); vec4 n = normalize(TextureMatrix * vec4(aTexCoord.x, 0.0, aTexCoord.y, 0.0)); // use texture matrix and coordinates for our normal. Since this is only used on walls, the normal's y coordinate is always 0. vec3 r = reflect(u, n.xyz); float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + (r.z+1.0)*(r.z+1.0) ); vec2 sst = vec2(r.x/m + 0.5, r.y/m + 0.5); vTexCoord.xy = sst; #else vTexCoord = TextureMatrix * vec4(aTexCoord, 0.0, 1.0); #endif gl_Position = ProjectionMatrix * eyeCoordPos; // clip planes used for reflective flats if (uClipHeightBottom > -65536.0) { gl_ClipDistance[0] = worldcoord.y - uClipHeightBottom; } else if (uClipHeightTop < 65536.0) { gl_ClipDistance[0] = uClipHeightTop - worldcoord.y; } gl_ClipDistance[2] = worldcoord.y - uClipSplit.x; gl_ClipDistance[3] = uClipSplit.y - worldcoord.y; }