Skip to content

Commit

Permalink
Capture fog rendering state during setup
Browse files Browse the repository at this point in the history
Since Minecraft 1.21.2, this state is no longer globally
configured during terrain setup.
  • Loading branch information
jellysquid3 committed Feb 13, 2025
1 parent b85ea7b commit 3d954a7
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,7 @@
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderBuffers;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.state.EntityRenderState;
Expand Down Expand Up @@ -164,6 +161,7 @@ public boolean isTerrainRenderComplete() {
*/
public void setupTerrain(Camera camera,
Viewport viewport,
FogParameters fogParameters,
boolean spectator,
boolean updateChunksImmediately) {
NativeBuffer.reclaim(false);
Expand Down Expand Up @@ -228,7 +226,7 @@ public void setupTerrain(Camera camera,
if (this.renderSectionManager.needsUpdate()) {
profiler.popPush("chunk_render_lists");

this.renderSectionManager.update(camera, viewport, spectator);
this.renderSectionManager.update(camera, viewport, fogParameters, spectator);
}

profiler.popPush("chunk_update");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.FogParameters;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.core.BlockPos;
import net.minecraft.core.SectionPos;
Expand Down Expand Up @@ -128,18 +129,18 @@ public void updateCameraState(Vector3dc cameraPosition, Camera camera) {
this.cameraPosition = cameraPosition;
}

public void update(Camera camera, Viewport viewport, boolean spectator) {
public void update(Camera camera, Viewport viewport, FogParameters fogParameters, boolean spectator) {
this.lastUpdatedFrame += 1;

this.createTerrainRenderList(camera, viewport, this.lastUpdatedFrame, spectator);
this.createTerrainRenderList(camera, viewport, fogParameters, this.lastUpdatedFrame, spectator);

this.needsGraphUpdate = false;
}

private void createTerrainRenderList(Camera camera, Viewport viewport, int frame, boolean spectator) {
private void createTerrainRenderList(Camera camera, Viewport viewport, FogParameters fogParameters, int frame, boolean spectator) {
this.resetRenderLists();

final var searchDistance = this.getSearchDistance();
final var searchDistance = this.getSearchDistance(fogParameters);
final var useOcclusionCulling = this.shouldUseOcclusionCulling(camera, spectator);

var visitor = new VisibleChunkCollector(frame);
Expand All @@ -150,11 +151,11 @@ private void createTerrainRenderList(Camera camera, Viewport viewport, int frame
this.taskLists = visitor.getRebuildLists();
}

private float getSearchDistance() {
private float getSearchDistance(FogParameters fogParameters) {
float distance;

if (SodiumClientMod.options().performance.useFogOcclusion) {
distance = this.getEffectiveRenderDistance();
distance = this.getEffectiveRenderDistance(fogParameters);
} else {
distance = this.getRenderDistance();
}
Expand Down Expand Up @@ -627,9 +628,9 @@ private static boolean allowImportantRebuilds() {
return !SodiumClientMod.options().performance.alwaysDeferChunkUpdates;
}

private float getEffectiveRenderDistance() {
var alpha = RenderSystem.getShaderFog().alpha();
var distance = RenderSystem.getShaderFog().end();
private float getEffectiveRenderDistance(FogParameters fogParameters) {
var alpha = fogParameters.alpha();
var distance = fogParameters.end();

var renderDistance = this.getRenderDistance();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.caffeinemc.mods.sodium.mixin.core.render.world;

import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.mojang.blaze3d.vertex.PoseStack;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice;
Expand All @@ -12,7 +12,6 @@
import net.caffeinemc.mods.sodium.client.util.FlawlessFrames;
import net.caffeinemc.mods.sodium.client.world.LevelRendererExtension;
import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.Options;
import net.minecraft.client.multiplayer.ClientLevel;
Expand All @@ -25,6 +24,7 @@
import net.minecraft.world.level.block.entity.BlockEntity;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4f;
import org.joml.Vector4f;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
Expand Down Expand Up @@ -61,6 +61,9 @@ public abstract class LevelRendererMixin implements LevelRendererExtension {
@Unique
private SodiumWorldRenderer renderer;

@Unique
private FogParameters sodium$terrainFogParmaeters = FogParameters.NO_FOG;

@Override
public SodiumWorldRenderer sodium$getWorldRenderer() {
return this.renderer;
Expand Down Expand Up @@ -128,20 +131,31 @@ private void renderSectionLayer(RenderType renderLayer, double x, double y, doub
PlatformLevelRenderHooks.getInstance().runChunkLayerEvents(renderLayer, ((LevelRenderer) (Object) this), modelMatrix, projectionMatrix, this.ticks, this.minecraft.gameRenderer.getMainCamera(), this.cullingFrustum);
}

@WrapOperation(
method = "renderLevel",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/renderer/FogRenderer;setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;Lorg/joml/Vector4f;FZF)Lnet/minecraft/client/renderer/FogParameters;",
ordinal = 0
)
)
private FogParameters captureTerrainFogParameters(Camera camera, FogRenderer.FogMode fogMode, Vector4f fogColor, float renderDistance, boolean isFoggy, float partialTick, Operation<FogParameters> original) {
return (this.sodium$terrainFogParmaeters = original.call(camera, fogMode, fogColor, renderDistance, isFoggy, partialTick));
}

/**
* @reason Redirect the terrain setup phase to our renderer
* @author JellySquid
*/
@Overwrite
private void setupRender(Camera camera, Frustum frustum, boolean hasForcedFrustum, boolean spectator) {

var viewport = ((ViewportProvider) frustum).sodium$createViewport();
var updateChunksImmediately = FlawlessFrames.isActive();

RenderDevice.enterManagedCode();

try {
this.renderer.setupTerrain(camera, viewport, spectator, updateChunksImmediately);
this.renderer.setupTerrain(camera, viewport, this.sodium$terrainFogParmaeters, spectator, updateChunksImmediately);
} finally {
RenderDevice.exitManagedCode();
}
Expand Down

0 comments on commit 3d954a7

Please sign in to comment.