Files
2025-08-23 05:20:14 +02:00

257 lines
8.8 KiB
GLSL

#if MC_VERSION >= 11900
uniform float darknessFactor;
#endif
#ifdef OVERWORLD
#include "/lib/atmospherics/sunGlare.glsl"
#endif
vec3 Fog1(vec3 color, float lWorldPos, float lViewPos, vec3 nViewPos, vec3 extra, float NdotU) {
#if defined OVERWORLD && !defined ONESEVEN && !defined TWO
#if FOG1_TYPE < 2
float fog = lWorldPos / far * (1.0/FOG1_DISTANCE_M);
#else
float fog = lViewPos / far * (1.025/FOG1_DISTANCE_M);
#endif
fog *= fog;
fog *= fog;
fog *= fog * fog;
fog = 1.0 - exp(-6.0 * fog);
if (fog > 0.0) {
vec3 artificialFogColor = GetSkyColor(lightCol, NdotU, nViewPos, false);
artificialFogColor = SunGlare(artificialFogColor, nViewPos, lightCol);
#ifdef CAVE_SKY_FIX
artificialFogColor *= 1.0 - isEyeInCave;
#endif
color.rgb = mix(color.rgb, artificialFogColor, fog);
}
#endif
#if defined NETHER && defined NETHER_FOG // extra = nether smoke (if enabled)
#if FOG1_TYPE > 0
float fog = lViewPos / far * (1.0/FOG1_DISTANCE_M);
#else
float fog = lWorldPos / far * (1.0/FOG1_DISTANCE_M);
#endif
fog *= fog;
fog *= fog;
fog = 1.0 - exp(-8.0 * fog);
vec3 artificialFogColor = pow((netherCol * 2.5) / NETHER_I, vec3(2.2)) * 4;
#ifdef NETHER_SMOKE
artificialFogColor += extra * fog;
#endif
color.rgb = mix(color.rgb, artificialFogColor, fog);
#endif
#ifdef END // extra = ender nebula (if enabled)
float fog = lWorldPos / far * (1.5/FOG1_DISTANCE_M);
fog = 1.0 - exp(-0.1 * pow(fog, 10.0));
if (fog > 0.0) {
vec3 artificialFogColor = endCol * (0.035 + 0.02 * vsBrightness);
#ifdef ENDER_NEBULA
artificialFogColor += extra * fog;
#endif
color.rgb = mix(color.rgb, artificialFogColor, fog);
}
#endif
#ifdef TWO
float fog = lWorldPos / far * (4.0/FOG1_DISTANCE_M);
fog = 1.0 - exp(-0.1 * pow(fog, 3.0));
//float NdotU = 1.0 - max(dot(nViewPos, upVec), 0.0);
NdotU = 1.0 - max(NdotU, 0.0);
NdotU = NdotU * NdotU;
#ifndef ABYSS
vec3 midnightPurple = vec3(0.0003, 0.0004, 0.002) * 1.25;
vec3 midnightFogColor = fogColor * fogColor * 0.3;
#else
vec3 midnightPurple = skyColor * skyColor * 0.00075;
vec3 midnightFogColor = fogColor * fogColor * 0.09;
#endif
vec3 artificialFogColor = mix(midnightPurple, midnightFogColor, NdotU);
color.rgb = mix(color.rgb, artificialFogColor, fog);
#endif
#ifdef SEVEN
float fog = lWorldPos / far * (1.5/FOG1_DISTANCE_M);
fog = 1.0 - exp(-0.1 * pow(fog, 10.0));
float cosT = dot(nViewPos, upVec);
vec3 twilightPurple = vec3(0.005, 0.006, 0.018);
vec3 twilightGreen = vec3(0.015, 0.03, 0.02);
#ifdef TWENTY
twilightPurple = twilightGreen * 0.1;
#endif
vec3 artificialFogColor = 2 * (twilightPurple * 2 * clamp(pow(cosT, 0.7), 0.0, 1.0) + twilightGreen * (1-clamp(pow(cosT, 0.7), 0.0, 1.0)));
color.rgb = mix(color.rgb, artificialFogColor, fog);
#endif
#ifdef ONESEVEN
float fogoneseven = lWorldPos / 16 * (1.35-sunVisibility*0.35);
fogoneseven = 1.0 - exp(-0.1 * pow(fogoneseven, 3.0));
if (fogoneseven > 0.0) {
vec3 artificialFogColor = GetSkyColor(lightCol, NdotU, nViewPos, false);
artificialFogColor = SunGlare(artificialFogColor, nViewPos, lightCol);
color.rgb = mix(color.rgb, artificialFogColor, fogoneseven);
}
#endif
return color.rgb;
}
vec3 Fog2(vec3 color, float lViewPos, vec3 worldPos) {
#ifdef OVERWORLD
#ifdef FOG2_ALTITUDE_MODE
float altitudeFactor = (worldPos.y + eyeAltitude + 1000.0 - FOG2_ALTITUDE) * 0.001;
if (altitudeFactor > 0.965 && altitudeFactor < 1.0) altitudeFactor = pow(altitudeFactor, 1.0 - (altitudeFactor - 0.965) * 28.57);
altitudeFactor = clamp(pow(altitudeFactor, 20.0), 0.0, 1.0);
#endif
//duplicate 307309760
float fog2 = lViewPos / pow(far, 0.25) * 0.112 * (1.0 + rainStrengthS * FOG2_RAIN_DISTANCE_M)
* (1.0 - sunVisibility * 0.25 * (1.0 - rainStrengthS)) / FOG2_DISTANCE_M;
fog2 = (1.0 - (exp(-50.0 * pow(fog2*0.125, 3.25) * eBS)));
fog2 *= min(FOG2_OPACITY * (3.0 + rainStrengthS * FOG2_RAIN_OPACITY_M - sunVisibility * 2.0), 1.0);
#ifdef FOG2_ALTITUDE_MODE
fog2 *= pow(clamp((eyeAltitude - FOG2_ALTITUDE*0.2) / FOG2_ALTITUDE, 0.0, 1.0), 2.5 - FOG2_RAIN_ALTITUDE_M * rainStrengthS * 2.5);
fog2 *= 1.0 - altitudeFactor * (1.0 - FOG2_RAIN_ALTITUDE_M * rainStrengthS);
#endif
float sunVisibility2 = sunVisibility * sunVisibility;
float sunVisibility4 = sunVisibility2 * sunVisibility2;
float sunVisibility8 = sunVisibility4 * sunVisibility4;
float timeBrightness2 = sqrt1(timeBrightness);
vec3 fogColor2 = mix(lightCol*0.5, skyColor*skyMult*1.25, timeBrightness2);
fogColor2 = mix(ambientNight*ambientNight, fogColor2, sunVisibility8);
if (rainStrengthS > 0.0) {
float rainStrengthS2 = 1.0 - (1.0 - rainStrengthS) * (1.0 - rainStrengthS);
vec3 rainFogColor = FOG2_RAIN_BRIGHTNESS_M * skyColCustom * (0.01 + 0.05 * sunVisibility8 + 0.1 * timeBrightness2);
rainFogColor *= mix(SKY_RAIN_NIGHT, SKY_RAIN_DAY, sunVisibility);
fogColor2 = mix(fogColor2, rainFogColor, rainStrengthS2);
}
fogColor2 *= FOG2_BRIGHTNESS;
#ifdef CAVE_SKY_FIX
fogColor2 *= 1.0 - isEyeInCave;
#endif
color.rgb = mix(color.rgb, fogColor2, fog2);
#endif
#ifdef END
float fog2 = lViewPos / pow(far, 0.25) * 0.035 * (32.0/FOG2_END_DISTANCE_M);
fog2 = 1.0 - (exp(-50.0 * pow(fog2*0.125, 4.0)));
#ifdef FOG2_ALTITUDE_MODE
float altitudeFactor = clamp((worldPos.y + eyeAltitude + 100.0 - FOG2_END_ALTITUDE) * 0.01, 0.0, 1.0);
if (altitudeFactor > 0.75 && altitudeFactor < 1.0) altitudeFactor = pow(altitudeFactor, 1.0 - (altitudeFactor - 0.75) * 4.0);
fog2 *= 1.0 - altitudeFactor;
#endif
fog2 = clamp(fog2, 0.0, 0.125) * (7.0 + fog2);
fog2 = 1 - pow(1 - fog2, 2.0 - fog2);
vec3 fogColor2 = endCol * (0.035 + 0.02 * vsBrightness);
color.rgb = mix(color.rgb, fogColor2 * FOG2_END_BRIGHTNESS, fog2 * FOG2_END_OPACITY);
#endif
#if defined SEVEN && !defined TWENTY
float fog2 = lViewPos / pow(far, 0.25) * 0.035 * (1.0 + rainStrengthS) * (3.2/FOG2_DISTANCE_M);
fog2 = 1.0 - (exp(-50.0 * pow(fog2*0.125, 4.0) * eBS));
float altitudeFactor = (worldPos.y + eyeAltitude + 1000.0 - 90 * (1 + rainStrengthS*0.5)) * 0.001;
if (altitudeFactor > 0.965 && altitudeFactor < 1.0) altitudeFactor = pow(altitudeFactor, 1.0 - (altitudeFactor - 0.965) * 28.57);
fog2 *= 1.0 - altitudeFactor;
fog2 = clamp(fog2, 0.0, 0.125) * (7.0 + fog2);
vec3 fogColor2 = vec3(0.015, 0.03, 0.02);
color.rgb = mix(color.rgb, fogColor2, fog2 * 0.80);
#endif
return color.rgb;
}
vec3 WaterFog(vec3 color, float lViewPos, float fogrange) {
float fog = lViewPos / fogrange;
fog = 1.0 - exp(-3.0 * fog * fog);
color *= pow(max(underwaterColor.rgb, vec3(0.1)), vec3(0.5)) * 3.0;
color = mix(color, 0.8 * pow(underwaterColor.rgb * (1.0 - blindFactor), vec3(2.0)), fog);
return color.rgb;
}
vec3 LavaFog(vec3 color, float lViewPos) {
#ifndef LAVA_VISIBILITY
float fog = (lViewPos - gl_Fog.start) * gl_Fog.scale;
fog *= fog;
fog = 1.0 - exp(- fog);
fog = clamp(fog, 0.0, 1.0);
#else
float fog = lViewPos * 0.02;
fog = 1.0 - exp(-3.0 * fog);
#if MC_VERSION >= 11700
if (gl_Fog.start / far < 0.0) fog = min(lViewPos * 0.01, 1.0);
#endif
#endif
//duplicate 792763950
#ifndef VANILLA_UNDERLAVA_COLOR
vec3 lavaFogColor = vec3(0.6, 0.35, 0.15);
#else
vec3 lavaFogColor = pow(fogColor, vec3(2.2));
#endif
color.rgb = mix(color.rgb, lavaFogColor, fog);
return color.rgb;
}
vec3 SnowFog(vec3 color, float lViewPos) {
float fog = lViewPos * 0.3;
fog = (1.0 - exp(-4.0 * fog * fog * fog));
color.rgb = mix(color.rgb, vec3(0.1, 0.15, 0.2), fog);
return color.rgb;
}
vec3 BlindFog(vec3 color, float lViewPos) {
float fog = lViewPos *0.04* (5.0 / blindFactor);
fog = (1.0 - exp(-6.0 * fog * fog * fog)) * blindFactor;
color.rgb = mix(color.rgb, vec3(0.0), fog);
return color.rgb;
}
#if MC_VERSION >= 11900
vec3 DarknessFog(vec3 color, float lViewPos) {
float fog = lViewPos * 0.06;
fog = (1.0 - exp(-6.0 * fog * fog * fog)) * darknessFactor;
color.rgb = mix(color.rgb, darknessColor, fog);
return color.rgb;
}
#endif
vec3 startFog(vec3 color, vec3 nViewPos, float lViewPos, vec3 worldPos, vec3 extra, float NdotU) {
#if !defined GBUFFER_CODING
if (isEyeInWater == 0) {
#ifdef FOG2
color.rgb = Fog2(color.rgb, lViewPos, worldPos);
#endif
#ifdef FOG1
color.rgb = Fog1(color.rgb, length(worldPos.xz), lViewPos, nViewPos, extra, NdotU);
#endif
}
#endif
if (blindFactor < 0.001) {
if (isEyeInWater == 1) color.rgb = WaterFog(color.rgb, lViewPos, waterFog * (1.0 + eBS));
if (isEyeInWater == 2) color.rgb = LavaFog(color.rgb, lViewPos);
#if MC_VERSION >= 11700
if (isEyeInWater == 3) color.rgb = SnowFog(color.rgb, lViewPos);
#endif
} else color.rgb = BlindFog(color.rgb, lViewPos);
#if MC_VERSION >= 11900
if (darknessFactor > 0.001) color.rgb = DarknessFog(color.rgb, lViewPos);
#endif
return color.rgb;
}