uniform vec3 particleParams; // [энергия, масса, заряд]
uniform float time;
uniform float fieldIntensity;
uniform vec3 fieldColor;
uniform vec2 resolution;
uniform sampler2D noiseTexture;
uniform float spin;
uniform float particleType; // float для совместимости (было int)

varying vec2 vUv;
varying float vAlpha;
varying vec3 vPosition;
varying vec4 vColor;
varying vec3 vNormal;

// === ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ===

float hash(vec2 p) {
    return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
}

float noise(vec2 p) {
    vec2 i = floor(p);
    vec2 f = fract(p);
    f = f * f * (3.0 - 2.0 * f);
    float a = hash(i);
    float b = hash(i + vec2(1.0, 0.0));
    float c = hash(i + vec2(0.0, 1.0));
    float d = hash(i + vec2(1.0, 1.0));
    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
}

float fbm(vec2 p) {
    float v = 0.0;
    float a = 0.5;
    mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));
    for (int i = 0; i < 4; i++) { // Меньше итераций для мягкости
        v += a * noise(p);
        p = rot * p * 2.0 + vec2(1.3, 2.8);
        a *= 0.5;
    }
    return v;
}

void main() {
    float energy = particleParams.x;
    float mass = particleParams.y;
    float charge = particleParams.z;
    
    int pType = int(particleType + 0.1);
    
    vec2 uv = vUv;
    vec2 cUv = uv - 0.5;
    float dist = length(cUv);
    float angle = atan(cUv.y, cUv.x);
    
    // Мягкое затухание к краям сферы
    float sphereMask = smoothstep(0.5, 0.2, dist);
    
    vec3 color = fieldColor;
    float alpha = 0.0;
    
    // ==================================================================================
    // 8 УНИКАЛЬНЫХ ПОЛЕВЫХ ЭФФЕКТОВ ("АТМОСФЕРА")
    // ==================================================================================
    
    // 1. ЛЕПТОНЫ (1-3): ЭЛЕКТРИЧЕСКОЕ ОБЛАКО (Electric Haze)
    if (pType >= 1 && pType <= 3) {
        float n = fbm(uv * 8.0 + time * 2.0);
        float electricity = smoothstep(0.4, 0.6, n) * smoothstep(0.6, 0.4, n); // Тонкие линии
        float glow = fbm(uv * 3.0 - time);
        
        color = mix(fieldColor, vec3(0.5, 0.8, 1.0), electricity);
        alpha = (electricity * 0.8 + glow * 0.4) * sphereMask;
    }
    
    // 2. НЕЙТРИНО (4-6): ПРИЗРАЧНЫЙ ТУМАН (Ghost Smoke)
    else if (pType >= 4 && pType <= 6) {
        float n = fbm(uv * 5.0 + time * 0.5);
        float wave = sin(uv.y * 20.0 + time * 3.0) * 0.05;
        
        // Разные оттенки для разных типов нейтрино
        vec3 nuColor = vec3(0.8, 0.9, 1.0); // Nu_e (default)
        if (pType == 5) nuColor = vec3(0.8, 1.0, 0.9); // Nu_mu (Greenish)
        if (pType == 6) nuColor = vec3(1.0, 0.8, 0.9); // Nu_tau (Pinkish)
        
        color = nuColor;
        alpha = smoothstep(0.3, 0.7, n) * 0.3 * sphereMask;
        // Мерцание
        alpha *= 0.8 + 0.2 * sin(time * 10.0);
    }
    
    // 3. КВАРКИ (7-12): ХРОМАТИЧЕСКОЕ ОБЛАКО (Chromatic Cloud)
    else if (pType >= 7 && pType <= 12) {
        // Сдвиг каналов
        float r = fbm(uv * 4.0 + vec2(time * 0.1, 0.0));
        float g = fbm(uv * 4.0 + vec2(0.0, time * 0.15));
        float b = fbm(uv * 4.0 - vec2(time * 0.1, time * 0.1));
        
        color = vec3(r, g, b) * 1.5; // Яркие цвета
        alpha = (r + g + b) * 0.3 * sphereMask;
    }
    
    // 4. ФОТОН (13): СИЯЮЩЕЕ ГАЛО (Radiant Halo)
    else if (pType == 13) {
        float rays = max(0.0, sin(angle * 12.0 + time * 3.0));
        float coreGlow = smoothstep(0.5, 0.0, dist);
        
        color = fieldColor * 2.0; // Очень ярко
        alpha = (rays * 0.3 + coreGlow * 0.8) * sphereMask;
    }
    
    // 5. W/Z БОЗОНЫ (14): ТЯЖЕЛЫЙ ДЫМ (Heavy Smog)
    else if (pType == 14) {
        float n = fbm(uv * 6.0 + time * 0.2);
        float flow = sin(uv.x * 10.0 + n * 5.0 + time);
        
        color = mix(vec3(0.4, 0.2, 0.1), vec3(0.1), n); // Темный, грязный
        alpha = smoothstep(0.3, 0.8, n) * 0.6 * sphereMask;
    }
    
    // 6. ГЛЮОН (15): ПАУТИНА (Web / Flux)
    else if (pType == 15) {
        float n = noise(uv * 10.0);
        float web = smoothstep(0.45, 0.5, abs(sin(uv.x * 20.0 + n * 5.0 + time)));
        web += smoothstep(0.45, 0.5, abs(sin(uv.y * 20.0 + n * 5.0 - time)));
        
        color = vec3(0.6, 0.0, 1.0); // ЯРКО-ФИОЛЕТОВЫЙ (по просьбе пользователя)
        alpha = web * 0.4 * sphereMask;
    }
    
    // 7. ХИГГС (16): ИСКРЯЩЕЕСЯ ПОЛЕ (Sparkle Field)
    else if (pType == 16) {
        float sparkles = hash(uv * 30.0 + time);
        sparkles = step(0.97, sparkles);
        float cloud = fbm(uv * 3.0);
        
        color = vec3(1.0, 0.9, 0.6);
        alpha = (sparkles * 0.8 + cloud * 0.3) * sphereMask;
    }
    
    // 8. ГРАВИТОН (17): ИСКАЖЕННАЯ СЕТКА (Warped Grid)
    else if (pType == 17) {
        vec2 warped = uv + cUv * sin(dist * 10.0 - time);
        float grid = step(0.95, fract(warped.x * 10.0)) + step(0.95, fract(warped.y * 10.0));
        
        color = vec3(0.6, 0.0, 1.0);
        alpha = grid * 0.5 * sphereMask;
    }
    
    // ДЕФОЛТ
    else {
        float n = fbm(uv * 5.0 + time);
        color = fieldColor;
        alpha = n * 0.5 * sphereMask;
    }
    
    // === ФИНАЛЬНАЯ ОБРАБОТКА ===
    
    // Влияние заряда
    if (abs(charge) > 0.0) {
        vec3 chargeTint = charge > 0.0 ? vec3(1.0, 0.4, 0.2) : vec3(0.2, 0.4, 1.0);
        color = mix(color, chargeTint, 0.4);
    }
    
    // Интенсивность поля
    alpha *= fieldIntensity * (1.0 + energy);
    
    gl_FragColor = vec4(color, alpha);
} 