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;
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Minecraft.getInstance()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ARGB.alphaFloat(), ARGB.opaque(), ARGB.scaleRGB(), ARGB.srgbLerp()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.clamp(), Mth.clampedLerp(), Mth.sin()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置: