// AuroraSkyFixed.glsl — Stable Northern Lights + Central Star Core
// Toha 2025 Edition
// Author: GPT-5

#include "/lib/Settings.glsl"

// Твои цвета
#define AURORA_COLOR1 vec3(AURORA_R1, AURORA_G1, AURORA_B1) / 255.0
#define AURORA_COLOR2 vec3(AURORA_R2, AURORA_G2, AURORA_B2) / 255.0
#define AURORA_COLOR3 vec3(AURORA_R3, AURORA_G3, AURORA_B3) / 255.0

uniform float frameTimeCounter;

uniform float patternSeed;

// ---------- Вспомогательные ----------
mat2 rot2(float a){float c=cos(a), s=sin(a);return mat2(c,s,-s,c);}
float hash21(vec2 p){return fract(sin(dot(p,vec2(27.619,57.583)))*43758.5453);}

float fbm(vec2 p){
    float f=0.0;
    f += sin(p.x*0.9 + p.y*1.1);
    f += 0.5*sin(p.x*1.8 - p.y*1.5);
    f += 0.25*cos(p.x*3.1 + p.y*2.9);
    return f*0.5;
}

// ---------- Основной паттерн авроры ----------
float auroraPattern(vec2 uv, float time){
    uv.x += fbm(uv*1.1 + vec2(0.0,time*0.04))*0.3;
    float wave = sin(uv.x*3.2 + fbm(uv*0.8)*2.0 + time*0.5);
    wave = abs(wave);
    wave = smoothstep(0.28, 0.05, wave);
    float fade = smoothstep(0.0, 0.5, uv.y) * exp(-uv.y*1.6);
    return wave * fade;
}

vec3 auroraColor(float h){
    if(h < 0.5)
        return mix(AURORA_COLOR1, AURORA_COLOR2, h*2.0);
    else
        return mix(AURORA_COLOR2, AURORA_COLOR3, (h-0.5)*2.0);
}

// ---------- Центральная звезда (glow) ----------
float starGlow(vec2 uv, float time){
    float r = length(uv);
    float pulse = 0.5 + 0.5*sin(time*0.7 + sin(time*0.3)*0.5);
    float glow = exp(-r*30.0) * (0.8 + 0.2*pulse);
    float rays = exp(-r*6.0) * (0.4 + 0.3*sin(time*0.5));
    return glow + rays;
}

// ---------- Финальный шейдер ----------
vec3 RenderAuroraSky(vec3 worldDir){
    // фиксированная небесная сфера, не зависящая от камеры
    float time = frameTimeCounter * 0.3 + patternSeed * 2.0;

    // проекция неба — угол по X,Z не зависит от камеры
    vec2 uv;
    uv.x = atan(worldDir.x, worldDir.z) / 3.14159; // долготный угол
    uv.y = clamp(worldDir.y, 0.0, 1.0);            // высота (0-низ, 1-зенит)

    // смещение по времени (но не по камере)
    uv.x += time * 0.025;
    uv.y += sin(time*0.2)*0.02;

    // базовые ленты сияния
    float a1 = auroraPattern(uv*2.0 + vec2(0.0,0.1), time);
    float a2 = auroraPattern(uv*2.4 + vec2(0.5,-0.2), time*0.8);
    float a3 = auroraPattern(uv*3.0 + vec2(-0.3,0.2), time*1.1);

    float combined = a1 + a2*0.8 + a3*0.6;
    float heightNorm = uv.y;
    vec3 color = auroraColor(heightNorm) * combined;

    // "дыхание" — лёгкая пульсация яркости
    float breathing = 0.75 + 0.25*sin(time*0.6 + sin(time*0.2));
    color *= breathing;

    // мягкое затухание у горизонта
    color *= smoothstep(0.05, 0.3, worldDir.y);

    // -------------------
    // Центральная звезда
    // -------------------
    vec2 starUV = worldDir.xy * 1.2;
    float star = starGlow(starUV, time);
    vec3 starColor = mix(AURORA_COLOR1, vec3(1.0), 0.5);
    color += starColor * star * 2.0;

    // Финальная коррекция
    color = pow(color, vec3(0.9));
    color = color / (1.0 + color);
    color *= auroraAmount * 1.3;

    return clamp(color, 0.0, 1.0);
}

// Основной вызов
vec3 NightAurora(vec3 worldDir){
    if(worldDir.y < 0.0) return vec3(0.0);
    return RenderAuroraSky(normalize(worldDir));
}
