in vec3 position; in vec2 texcoord; in vec4 color; in vec3 normal; uniform highp mat4 modelMatrix; uniform highp mat4 viewMatrix; uniform highp mat4 projMatrix; uniform highp mat4 extraMatrix; uniform highp mat4 normalMatrix; uniform highp vec3 cameraPos; uniform UBOOL textured; uniform UBOOL useVertexAlpha; uniform vec4 uniformColor; struct shadow_info { UBOOL _active; vec3 _color; vec3 _light; vec3 _point; vec3 _normal; }; uniform shadow_info shadow; out vec2 Texcoord; out vec4 Color; void main() { vec4 pos = vec4(position, 1.0); pos = modelMatrix * pos; // See http://en.wikipedia.org/wiki/Line-plane_intersection if (UBOOL_TEST(shadow._active)) { pos /= pos.w; vec3 l = pos.xyz - shadow._light; float d = dot(shadow._point - shadow._light, shadow._normal) / dot(l, shadow._normal); vec3 p = shadow._light + d * l; pos = vec4(p, 1.0); } pos -= vec4(cameraPos * pos.w, 0.0); pos = viewMatrix * pos; pos /= pos.w; pos.z *= -1.0; vec4 projectedPos = projMatrix * pos; gl_Position = projectedPos; if (UBOOL_TEST(shadow._active)) { Color = vec4(shadow._color, 1.0); } else { Color = color; } if (!UBOOL_TEST(useVertexAlpha)) Color.a = 1.0; Color *= uniformColor; if (UBOOL_TEST(textured)) { Texcoord = texcoord; } else { Texcoord = vec2(0.0, 0.0); } }