#version 330 in vec3 vertexPosition; in vec2 vertexTexCoord; in vec3 vertexNormal; in vec4 vertexColor; uniform mat4 mvp; uniform mat4 matNormal; uniform vec3 sun_direction; uniform vec3 sun_colour; uniform float sun_intensity; uniform vec3 moon_direction; uniform vec3 moon_colour; uniform float moon_intensity; uniform vec3 ambient_colour; uniform float ambient_intensity; uniform vec2 uv_tiling; uniform vec2 uv_offset; out vec2 frag_texcoord; out vec4 frag_colour; out vec3 frag_lighting; void main() { vec3 canopy_center = vec3(0.0, 4.0, 0.0); vec3 canopy_normal = vertexNormal; vec3 offset = vertexPosition - canopy_center; if (dot(offset, offset) > 0.0001) { canopy_normal = normalize(offset); } vec3 world_normal = normalize((matNormal * vec4(canopy_normal, 0.0)).xyz); float sun_facing = dot(world_normal, sun_direction); float moon_facing = dot(world_normal, moon_direction); float sun_diffuse = max(sun_facing, 0.0) + 0.1 * max(-sun_facing, 0.0); float moon_diffuse = max(moon_facing, 0.0) + 0.1 * max(-moon_facing, 0.0); vec3 ambient_light = ambient_colour * ambient_intensity; vec3 sun_light = sun_colour * sun_intensity * sun_diffuse; vec3 moon_light = moon_colour * moon_intensity * moon_diffuse; frag_lighting = ambient_light + sun_light + moon_light; frag_texcoord = vertexTexCoord * uv_tiling + uv_offset; frag_colour = vertexColor; gl_Position = mvp * vec4(vertexPosition, 1.0); }