#version 330 core
layout (location = 0) in vec3 vPos;
//layout (location = 1) in vec2 vNormal;
layout (location = 1) in vec2 vTexCoord;
//varying vec3 color;
uniform mat4 MVP;
uniform vec3 data; // time offset scale

// water 1 makes procedural direct to mesh (old)
// water 2 (this) takes a premade texture map instead
// (vert/frag_shader_water_height genereate this map)
// (.._water_depth and water 1 is currently not used)
uniform sampler2D waterHeightTex;

out vec3 FragPos;
out vec3 ourNormal;
out vec2 TexCoord;
out float time;
out float height;

// Simple 2D noise function
float noise3(vec2 p) {
    // A basic pseudo-random function (not true Perlin noise, but sufficient for perturbation)
    return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
}

// Smooth noise by interpolation (optional enhancement)
float smoothNoise(vec2 p) {
    vec2 i = floor(p);
    vec2 f = fract(p);
    vec2 u = f * f * (3.0 - 2.0 * f); // Smoothstep
    float a = noise3(i);
    float b = noise3(i + vec2(1.0, 0.0));
    float c = noise3(i + vec2(0.0, 1.0));
    float d = noise3(i + vec2(1.0, 1.0));
    return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
}

void main() {
    //vec3 pos = position;
    // Calculate relative position to origin

    float wlev = data.y-1.1;
    float heightScale = data.z * 2;
    float heightOffset = wlev;
    //heightOffset = 0;

    float phase=data.x;
    float scale=512.0;



    float twinkleSpeed = 86400.0 / 3;
   //-- float twinkle = sin(uTime * twinkleSpeed);

    //time = sin(phase * twinkleSpeed);

    time = phase / (2.0 * 3.14159) * twinkleSpeed;
    ///vec2 flame_uv = uv + vec2(0.0, offset_y);







    TexCoord = vTexCoord * scale - scale / 2.0;
    vec3 sPos = vec3(TexCoord.x, wlev, TexCoord.y);

    height = texture(waterHeightTex, vTexCoord).r;

    // Displace the vertex along the y-axis (assuming y-up)
    sPos.y += height * heightScale;

    // Compute approximate normal using finite differences
    float eps = 0.01;
    float h1 = 0.0, h2 = 0.0;
    vec3 dx = vec3(eps, h1 - height, 0.0);
    vec3 dz = vec3(0.0, h2 - height, eps);
    ourNormal = normalize(cross(dz, dx));

    gl_Position = MVP * vec4(sPos.x, sPos.y, sPos.z, 1.0);
    FragPos = vec3(MVP * vec4(sPos.x, sPos.y, sPos.z, 1.0));
}
