#version 330 core

>noise4

in vec3 pos;
in float height;
in vec3 norm;

out vec4 color;

uniform vec3 lightDir;
uniform float lightStrength;
uniform vec3 impactLocation;
uniform float impactTimer;
uniform vec3 playerLookingDir;

float isNeg(float x) {
    return (1 - abs(x) / x) * 0.5;
}

float lengthSquared(vec3 v) {
    return dot(v, v);
}

void main() {
    float grey = height - 0.75 + gnoise(vec4(100 * pos, -271.8281828)) / 10 + gnoise(vec4(4 * pos, -2718.281828)) / 5;
    grey *= clamp(dot(lightDir, norm) * lightStrength, 0, 9) + 0.1;
    float dImpact = distance(impactLocation, pos) - impactTimer;
    float colorB = pow(2.718281828, dImpact) * isNeg(dImpact);
    colorB *= colorB * colorB / 2;
    colorB += lengthSquared(cross(norm, playerLookingDir)) * isNeg(dImpact) / 2;
    color = vec4(grey + colorB * impactTimer / 10, grey + colorB * (1 - impactTimer / 10), grey, 1);
}