LodRenderer: Add support for underwater fog

This commit is contained in:
tom lee
2022-01-01 13:50:59 +08:00
parent 32e341fe4f
commit 4db3b7b729
3 changed files with 23 additions and 7 deletions
@@ -135,9 +135,15 @@ public class LodRenderProgram extends ShaderProgram {
setUniform(lightMapUniform, lightmapBindPoint);
}
public void fillUniformDataForFog(LodFogConfig fogSettings) {
public void fillUniformDataForFog(LodFogConfig fogSettings, boolean isUnderWater) {
super.bind();
if (fogSettings.fogDrawMode != FogDrawMode.FOG_DISABLED) {
if (isUnderWater) {
setUniform(fogEnabledUniform, true);
setUniform(nearFogEnabledUniform, false);
setUniform(farFogEnabledUniform, true);
setUniform(farFogStartUniform, 0.0f);
setUniform(farFogEndUniform, 0.0f);
} else if (fogSettings.fogDrawMode != FogDrawMode.FOG_DISABLED) {
setUniform(fogEnabledUniform, true);
setUniform(nearFogEnabledUniform, fogSettings.fogDistance != FogDistance.FAR);
setUniform(farFogEnabledUniform, fogSettings.fogDistance != FogDistance.NEAR);
@@ -270,9 +270,9 @@ public class LodRenderer
/*---------Fill uniform data--------*/
// Fill the uniform data. Note: GL33.GL_TEXTURE0 == texture bindpoint 0
shaderProgram.fillUniformData(modelViewMatrix, projectionMatrix, getTranslatedCameraPos(),
getFogColor(), (int) (MC.getSkyDarken(partialTicks) * 15), 0);
MC_RENDER.isFogStateInUnderWater() ? getUnderWaterFogColor(partialTicks) : getFogColor(partialTicks), (int) (MC.getSkyDarken(partialTicks) * 15), 0);
// Previous guy said fog setting may be different from region to region, but the fogSettings never changed... soooooo...
shaderProgram.fillUniformDataForFog(fogSettings);
shaderProgram.fillUniformDataForFog(fogSettings, MC_RENDER.isFogStateInUnderWater());
// Note: Since lightmapTexture is changing every frame, it's faster to recreate it than to reuse the old one.
lightmapTexture.fillData(MC_RENDER.getLightmapTextureWidth(), MC_RENDER.getLightmapTextureHeight(), MC_RENDER.getLightmapPixels());
@@ -370,17 +370,21 @@ public class LodRenderer
lodBufferBuilderFactory.setupBuffers(lodDim);
}
private Color getFogColor()
private Color getFogColor(float partialTicks)
{
Color fogColor;
if (CONFIG.client().graphics().fogQuality().getFogColorMode() == FogColorMode.USE_SKY_COLOR)
fogColor = MC_RENDER.getSkyColor();
else
fogColor = MC_RENDER.getFogColor();
fogColor = MC_RENDER.getFogColor(partialTicks);
return fogColor;
}
private Color getUnderWaterFogColor(float partialTicks)
{
return MC_RENDER.getUnderWaterFogColor(partialTicks);
}
/**
* Translate the camera relative to the LodDimension's center,
@@ -51,7 +51,9 @@ public interface IMinecraftRenderWrapper
double getGamma();
Color getFogColor();
Color getFogColor(float partialTicks);
default Color getUnderWaterFogColor(float partialTicks) {return getFogColor(partialTicks);}
Color getSkyColor();
@@ -131,4 +133,8 @@ public interface IMinecraftRenderWrapper
public default boolean tryDisableVanillaFog() {
return false;
}
public default boolean isFogStateInUnderWater() {
return false;
}
}