AtmosphericFogEnvironment.java

net.minecraft.client.renderer.fog.environment.AtmosphericFogEnvironment

信息

  • 全限定名:net.minecraft.client.renderer.fog.environment.AtmosphericFogEnvironment
  • 类型:public class
  • 包:net.minecraft.client.renderer.fog.environment
  • 源码路径:src/main/java/net/minecraft/client/renderer/fog/environment/AtmosphericFogEnvironment.java
  • 起始行号:L22
  • 继承:FogEnvironment
  • 职责:

    TODO

字段/常量

  • MIN_RAIN_FOG_SKY_LIGHT

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L23
    • 说明:

      TODO

  • RAIN_FOG_START_OFFSET

    • 类型: float
    • 修饰符: private static final
    • 源码定位: L24
    • 说明:

      TODO

  • RAIN_FOG_END_OFFSET

    • 类型: float
    • 修饰符: private static final
    • 源码定位: L25
    • 说明:

      TODO

  • rainFogMultiplier

    • 类型: float
    • 修饰符: private
    • 源码定位: L26
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

public int getBaseColor(ClientLevel level, Camera camera, int renderDistance, float partialTicks) @ L28

  • 方法名:getBaseColor
  • 源码定位:L28
  • 返回类型:int
  • 修饰符:public

参数:

  • level: ClientLevel
  • camera: Camera
  • renderDistance: int
  • partialTicks: float

说明:

TODO

private static int applyWeatherDarken(int color, float rainLevel, float thunderLevel) @ L53

  • 方法名:applyWeatherDarken
  • 源码定位:L53
  • 返回类型:int
  • 修饰符:private static

参数:

  • color: int
  • rainLevel: float
  • thunderLevel: float

说明:

TODO

public void setupFog(FogData fog, Camera camera, ClientLevel level, float renderDistance, DeltaTracker deltaTracker) @ L67

  • 方法名:setupFog
  • 源码定位:L67
  • 返回类型:void
  • 修饰符:public

参数:

  • fog: FogData
  • camera: Camera
  • level: ClientLevel
  • renderDistance: float
  • deltaTracker: DeltaTracker

说明:

TODO

private void updateRainFogState(Camera camera, ClientLevel level, DeltaTracker deltaTracker) @ L89

  • 方法名:updateRainFogState
  • 源码定位:L89
  • 返回类型:void
  • 修饰符:private

参数:

  • camera: Camera
  • level: ClientLevel
  • deltaTracker: DeltaTracker

说明:

TODO

public boolean isApplicable(FogType fogType, Entity entity) @ L100

  • 方法名:isApplicable
  • 源码定位:L100
  • 返回类型:boolean
  • 修饰符:public

参数:

  • fogType: FogType
  • entity: Entity

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class AtmosphericFogEnvironment extends FogEnvironment {
    private static final int MIN_RAIN_FOG_SKY_LIGHT = 8;
    private static final float RAIN_FOG_START_OFFSET = -160.0F;
    private static final float RAIN_FOG_END_OFFSET = -256.0F;
    private float rainFogMultiplier;
 
    @Override
    public int getBaseColor(ClientLevel level, Camera camera, int renderDistance, float partialTicks) {
        int fogColor = camera.attributeProbe().getValue(EnvironmentAttributes.FOG_COLOR, partialTicks);
        if (renderDistance >= 4) {
            float sunAngle = camera.attributeProbe().getValue(EnvironmentAttributes.SUN_ANGLE, partialTicks) * (float) (Math.PI / 180.0);
            float sunX = Mth.sin(sunAngle) > 0.0F ? -1.0F : 1.0F;
            Vector3fc forwardVector = camera.isPanoramicMode() ? camera.panoramicForwards() : camera.forwardVector();
            float lookingAtTheSunFactor = forwardVector.dot(sunX, 0.0F, 0.0F);
            if (lookingAtTheSunFactor > 0.0F) {
                int color = camera.attributeProbe().getValue(EnvironmentAttributes.SUNRISE_SUNSET_COLOR, partialTicks);
                float alpha = ARGB.alphaFloat(color);
                if (alpha > 0.0F) {
                    fogColor = ARGB.srgbLerp(lookingAtTheSunFactor * alpha, fogColor, ARGB.opaque(color));
                }
            }
        }
 
        int skyColor = camera.attributeProbe().getValue(EnvironmentAttributes.SKY_COLOR, partialTicks);
        skyColor = applyWeatherDarken(skyColor, level.getRainLevel(partialTicks), level.getThunderLevel(partialTicks));
        float skyFogEnd = Math.min(camera.attributeProbe().getValue(EnvironmentAttributes.SKY_FOG_END_DISTANCE, partialTicks) / 16.0F, (float)renderDistance);
        float skyColorMixFactor = Mth.clampedLerp(skyFogEnd / 32.0F, 0.25F, 1.0F);
        skyColorMixFactor = 1.0F - (float)Math.pow(skyColorMixFactor, 0.25);
        return ARGB.srgbLerp(skyColorMixFactor, fogColor, skyColor);
    }
 
    private static int applyWeatherDarken(int color, float rainLevel, float thunderLevel) {
        if (rainLevel > 0.0F) {
            float rainColorModifier = 1.0F - rainLevel * 0.5F;
            float rainBlueColorModifier = 1.0F - rainLevel * 0.4F;
            color = ARGB.scaleRGB(color, rainColorModifier, rainColorModifier, rainBlueColorModifier);
        }
 
        if (thunderLevel > 0.0F) {
            color = ARGB.scaleRGB(color, 1.0F - thunderLevel * 0.5F);
        }
 
        return color;
    }
 
    @Override
    public void setupFog(FogData fog, Camera camera, ClientLevel level, float renderDistance, DeltaTracker deltaTracker) {
        this.updateRainFogState(camera, level, deltaTracker);
        float partialTicks = deltaTracker.getGameTimeDeltaPartialTick(false);
        fog.environmentalStart = camera.attributeProbe().getValue(EnvironmentAttributes.FOG_START_DISTANCE, partialTicks);
        fog.environmentalEnd = camera.attributeProbe().getValue(EnvironmentAttributes.FOG_END_DISTANCE, partialTicks);
        fog.environmentalStart = fog.environmentalStart + -160.0F * this.rainFogMultiplier;
        float minRainFogEnd = Math.min(96.0F, fog.environmentalEnd);
        fog.environmentalEnd = Math.max(minRainFogEnd, fog.environmentalEnd + -256.0F * this.rainFogMultiplier);
        fog.skyEnd = Math.min(renderDistance, camera.attributeProbe().getValue(EnvironmentAttributes.SKY_FOG_END_DISTANCE, partialTicks));
        fog.cloudEnd = Math.min(
            (float)(Minecraft.getInstance().options.cloudRange().get() * 16),
            camera.attributeProbe().getValue(EnvironmentAttributes.CLOUD_FOG_END_DISTANCE, partialTicks)
        );
        if (Minecraft.getInstance().gui.getBossOverlay().shouldCreateWorldFog()) {
            fog.environmentalStart = Math.min(fog.environmentalStart, 10.0F);
            fog.environmentalEnd = Math.min(fog.environmentalEnd, 96.0F);
            fog.skyEnd = fog.environmentalEnd;
            fog.cloudEnd = fog.environmentalEnd;
        }
    }
 
    private void updateRainFogState(Camera camera, ClientLevel level, DeltaTracker deltaTracker) {
        BlockPos blockPos = camera.blockPosition();
        Biome biome = level.getBiome(blockPos).value();
        float deltaTicks = deltaTracker.getGameTimeDeltaTicks();
        float partialTicks = deltaTracker.getGameTimeDeltaPartialTick(false);
        boolean rainsInBiome = biome.hasPrecipitation();
        float skyLightLevelMultiplier = Mth.clamp((level.getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(blockPos) - 8.0F) / 7.0F, 0.0F, 1.0F);
        float targetRainFogMultiplier = level.getRainLevel(partialTicks) * skyLightLevelMultiplier * (rainsInBiome ? 1.0F : 0.5F);
        this.rainFogMultiplier = this.rainFogMultiplier + (targetRainFogMultiplier - this.rainFogMultiplier) * deltaTicks * 0.2F;
    }
 
    @Override
    public boolean isApplicable(@Nullable FogType fogType, Entity entity) {
        return fogType == FogType.ATMOSPHERIC;
    }
}

引用的其他类

  • Camera

    • 引用位置: 参数
  • DeltaTracker

    • 引用位置: 参数
  • Minecraft

    • 引用位置: 方法调用
    • 关联成员: Minecraft.getInstance()
  • ClientLevel

    • 引用位置: 参数
  • FogData

    • 引用位置: 参数
  • FogEnvironment

    • 引用位置: 继承
  • ARGB

    • 引用位置: 方法调用
    • 关联成员: ARGB.alphaFloat(), ARGB.opaque(), ARGB.scaleRGB(), ARGB.srgbLerp()
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.clamp(), Mth.clampedLerp(), Mth.sin()
  • Entity

    • 引用位置: 参数
  • FogType

    • 引用位置: 参数