add fabric 1.21.9 support

This commit is contained in:
James Seibel
2025-10-10 07:15:27 -05:00
parent 300ef3745f
commit c42f800db5
13 changed files with 242 additions and 220 deletions
@@ -7,7 +7,6 @@ import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPosMutable;
import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.util.FullDataPointUtil; import com.seibel.distanthorizons.core.util.FullDataPointUtil;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.ColorResolver;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
@@ -25,7 +25,6 @@ import java.util.concurrent.ConcurrentHashMap;
import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.NativeImage;
import com.seibel.distanthorizons.common.wrappers.WrapperFactory;
import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper;
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
@@ -72,7 +71,7 @@ import net.minecraft.world.phys.Vec3;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.joml.Vector4f; import org.joml.Vector4f;
#if MC_VER >= MC_1_21_5 && MC_VER < MC_1_21_9 #if MC_VER >= MC_1_21_5
import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.opengl.GlTexture;
#else #else
#endif #endif
@@ -344,7 +343,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
{ {
#if MC_VER < MC_1_21_5 #if MC_VER < MC_1_21_5
return this.getRenderTarget().getDepthTextureId(); return this.getRenderTarget().getDepthTextureId();
#elif MC_VER < MC_1_21_9 #else
try try
{ {
GlTexture glTexture = (GlTexture) this.getRenderTarget().getDepthTexture(); GlTexture glTexture = (GlTexture) this.getRenderTarget().getDepthTexture();
@@ -367,25 +366,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
} }
return 0; return 0;
} }
#else
try
{
throw new UnsupportedOperationException("Fabric get texture ID not implemented yet");
//GpuTexture depthTex = this.getRenderTarget().getDepthTexture();
//int id = ((GlTexture)depthTex.getClass().getMethod("getRealTexture").invoke(depthTex)).glId();
//return id;
}
catch (Exception e)
{
// only log this error once per session
if (!this.depthTextureCastFailLogged)
{
this.depthTextureCastFailLogged = true;
LOGGER.error("Unable to cast render Target depth texture to GlTexture. MC or a rendering mod may have changed the object type.", e);
}
return 0;
}
#endif #endif
} }
@Override @Override
@@ -393,7 +373,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
{ {
#if MC_VER < MC_1_21_5 #if MC_VER < MC_1_21_5
return this.getRenderTarget().getColorTextureId(); return this.getRenderTarget().getColorTextureId();
#elif MC_VER < MC_1_21_9 #else
try try
{ {
GlTexture glTexture = (GlTexture) this.getRenderTarget().getColorTexture(); GlTexture glTexture = (GlTexture) this.getRenderTarget().getColorTexture();
@@ -415,25 +395,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
} }
return 0; return 0;
} }
#else
try
{
throw new UnsupportedOperationException("Fabric get texture ID not implemented yet");
//GpuTexture colorTex = this.getRenderTarget().getColorTexture();
//int id = ((GlTexture)colorTex.getClass().getMethod("getRealTexture").invoke(colorTex)).glId();
//return id;
}
catch (Exception e)
{
// only log this error once per session
if (!this.colorTextureCastFailLogged)
{
this.colorTextureCastFailLogged = true;
LOGGER.error("Unable to cast render Target color texture to GlTexture. MC or a rendering mod may have changed the object type.", e);
}
return 0;
}
#endif #endif
} }
@@ -92,6 +92,24 @@ public class ClientLevelWrapper implements IClientLevelWrapper
// instance methods // // instance methods //
//==================// //==================//
/**
* can be used when speed is important and the same level is likely to be passed in,
* IE rendering.
*/
@Nullable
public static IClientLevelWrapper getWrapperIfDifferent(@Nullable IClientLevelWrapper levelWrapper, @NotNull ClientLevel level)
{
ClientLevelWrapper clientLevelWrapper = (ClientLevelWrapper)levelWrapper;
if (clientLevelWrapper == null
|| clientLevelWrapper.level != level)
{
return getWrapper(level);
}
return clientLevelWrapper;
}
@Nullable
public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level) { return getWrapper(level, false); } public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level) { return getWrapper(level, false); }
@Nullable @Nullable
@@ -104,13 +104,6 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
LOGGER.info("Registering Fabric Client Events"); LOGGER.info("Registering Fabric Client Events");
#if MC_VER < MC_1_21_9
// old versions still run like normal
#else
if (true)
throw new UnsupportedOperationException("DH doesn't support 1.21.9 yet because the Fabric Rendering API is missing required events. Please wait for the Fabric team to update their API.");
#endif
//========================// //========================//
// register mod accessors // // register mod accessors //
@@ -230,91 +223,77 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
#if MC_VER < MC_1_21_9 #if MC_VER < MC_1_21_9
WorldRenderEvents.AFTER_SETUP.register((renderContext) -> WorldRenderEvents.AFTER_SETUP.register((renderContext) ->
{ {
Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix());
Mat4f modelViewMatrix;
#if MC_VER < MC_1_20_6 #if MC_VER < MC_1_20_6
modelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose());
#else #else
modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix());
#endif #endif
#if MC_VER < MC_1_21_1
ClientApi.RENDER_STATE.frameTime = renderContext.tickDelta();
#else
ClientApi.RENDER_STATE.frameTime = renderContext.tickCounter().getGameTimeDeltaTicks();
#endif
//LOGGER.info("\n\n" + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, renderContext.world());
// "Level Render\n" +
// "Mc MVM: \n" + modelViewMatrix.toString() + "\n" +
// "Mc Proj: \n" + projectionMatrix.toString()
//);
this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()), this.clientApi.renderLods();
modelViewMatrix,
projectionMatrix,
#if MC_VER < MC_1_21_1
renderContext.tickDelta()
#else
renderContext.tickCounter().getGameTimeDeltaTicks()
#endif
);
}); });
WorldRenderEvents.AFTER_ENTITIES.register((renderContext) -> WorldRenderEvents.AFTER_ENTITIES.register((renderContext) ->
{ {
Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix());
Mat4f modelViewMatrix;
#if MC_VER < MC_1_20_6 #if MC_VER < MC_1_20_6
modelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose());
#else #else
modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix());
#endif #endif
this.clientApi.renderFadeOpaque( #if MC_VER < MC_1_21_1
modelViewMatrix, ClientApi.RENDER_STATE.frameTime = renderContext.tickDelta();
projectionMatrix, #else
#if MC_VER < MC_1_21_1 ClientApi.RENDER_STATE.frameTime = renderContext.tickCounter().getGameTimeDeltaTicks();
renderContext.tickDelta(), #endif
#else
renderContext.tickCounter().getGameTimeDeltaTicks(), ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, renderContext.world());
#endif
ClientLevelWrapper.getWrapper(renderContext.world())
); this.clientApi.renderFadeOpaque();
}); });
// TODO add to forge and neo
WorldRenderEvents.AFTER_TRANSLUCENT.register((renderContext) -> WorldRenderEvents.AFTER_TRANSLUCENT.register((renderContext) ->
{ {
Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix());
Mat4f modelViewMatrix;
#if MC_VER < MC_1_20_6 #if MC_VER < MC_1_20_6
modelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose());
#else #else
modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix());
#endif #endif
#if MC_VER < MC_1_21_1
ClientApi.RENDER_STATE.frameTime = renderContext.tickDelta();
#else
ClientApi.RENDER_STATE.frameTime = renderContext.tickCounter().getGameTimeDeltaTicks();
#endif
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, renderContext.world());
#if MC_VER < MC_1_21_6 #if MC_VER < MC_1_21_6
// rendered in MixinLevelRenderer // rendered in MixinLevelRenderer
#else #else
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(renderContext.world()), ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime
);
#endif #endif
this.clientApi.renderFade( this.clientApi.renderFade();
modelViewMatrix,
projectionMatrix,
#if MC_VER < MC_1_21_1
renderContext.tickDelta(),
#else
renderContext.tickCounter().getGameTimeDeltaTicks(),
#endif
ClientLevelWrapper.getWrapper(renderContext.world())
);
}); });
#endif #endif
@@ -0,0 +1,71 @@
/*
* This file is part of the Distant Horizons mod
* licensed under the GNU LGPL v3 License.
*
* Copyright (C) 2020 James Seibel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.fabric.mixins.client;
#if MC_VER < MC_1_21_9
import net.minecraft.world.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(Entity.class)
public class MixinChunkSectionsToRender
{ /* rendering before was handled via Fabric API events */ }
#else
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.chunk.ChunkSectionLayerGroup;
import net.minecraft.client.renderer.chunk.ChunkSectionsToRender;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ChunkSectionsToRender.class)
public class MixinChunkSectionsToRender
{
// needs to fire at HEAD otherwise it will be canceled by Sodium
@Inject(at = @At("HEAD"), method = "renderGroup")
private void renderGroup(ChunkSectionLayerGroup chunkSectionLayerGroup, CallbackInfo ci)
{
if (!ClientApi.RENDER_STATE.canRender()) // TODO is this needed?
{
return;
}
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, Minecraft.getInstance().levelRenderer.level);
if (chunkSectionLayerGroup == ChunkSectionLayerGroup.OPAQUE)
{
ClientApi.INSTANCE.renderFadeOpaque();
}
else if (chunkSectionLayerGroup == ChunkSectionLayerGroup.TRANSLUCENT)
{
ClientApi.INSTANCE.renderDeferredLodsForShaders();
}
}
}
#endif
@@ -12,12 +12,15 @@ import java.util.List;
@Mixin(DebugScreenOverlay.class) @Mixin(DebugScreenOverlay.class)
public class MixinDebugScreenOverlay public class MixinDebugScreenOverlay
{ {
#if MC_VER < MC_1_21_9
@Inject(method = "getSystemInformation", at = @At("RETURN")) @Inject(method = "getSystemInformation", at = @At("RETURN"))
private void addCustomF3(CallbackInfoReturnable<List<String>> cir) private void addCustomF3(CallbackInfoReturnable<List<String>> cir)
{ {
List<String> messages = cir.getReturnValue(); List<String> messages = cir.getReturnValue();
F3Screen.addStringToDisplay(messages); F3Screen.addStringToDisplay(messages);
} }
#else
// handled by DhDebugScreenEntry for MC versions after 1.21.9
#endif
} }
@@ -31,8 +31,19 @@ import com.mojang.blaze3d.vertex.PoseStack;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#else #else
import com.mojang.blaze3d.buffers.GpuBufferSlice;
import com.mojang.blaze3d.framegraph.FrameGraphBuilder;
import com.mojang.blaze3d.resource.GraphicsResourceAllocator;
import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.client.renderer.state.LevelRenderState;
import net.minecraft.util.profiling.ProfilerFiller;
import org.joml.Matrix4f;
import org.joml.Matrix4fc; import org.joml.Matrix4fc;
import org.joml.Vector4f;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
#endif #endif
@@ -41,11 +52,9 @@ import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.fabric.FabricClientProxy;
import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.util.math.Mat4f;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import com.seibel.distanthorizons.core.config.Config;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -57,6 +66,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@Mixin(LevelRenderer.class) @Mixin(LevelRenderer.class)
public class MixinLevelRenderer public class MixinLevelRenderer
{ {
@@ -92,9 +102,16 @@ public class MixinLevelRenderer
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V",
cancellable = true) cancellable = true)
private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback) private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback)
#else #elif MC_VER < MC_1_21_9
@Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true) @Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true)
private void prepareChunkRenders(Matrix4fc projectionMatrix, double d, double e, double f, CallbackInfoReturnable<ChunkSectionsToRender> callback) private void prepareChunkRenders(Matrix4fc projectionMatrix, double d, double e, double f, CallbackInfoReturnable<ChunkSectionsToRender> callback)
#else
@Inject(at = @At("HEAD"), method = "renderLevel")
private void renderLevel(
GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker,
boolean renderBlockOutline, Camera camera,
Matrix4f positionMatrix, Matrix4f projectionMatrix, Matrix4f idkMatrix, GpuBufferSlice gpuBufferSlice,
Vector4f skyColor, boolean thinFog, CallbackInfo callback)
#endif #endif
{ {
#if MC_VER == MC_1_16_5 #if MC_VER == MC_1_16_5
@@ -110,11 +127,14 @@ public class MixinLevelRenderer
// get the matrices directly from MC // get the matrices directly from MC
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
#else #elif MC_VER < MC_1_21_9
// MC combined the model view and projection matricies // MC combined the model view and projection matricies
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix);
ClientApi.RENDER_STATE.mcProjectionMatrix = new Mat4f(); ClientApi.RENDER_STATE.mcProjectionMatrix = new Mat4f();
ClientApi.RENDER_STATE.mcProjectionMatrix.setIdentity(); ClientApi.RENDER_STATE.mcProjectionMatrix.setIdentity();
#else
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(positionMatrix);
ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
#endif #endif
// TODO move this into a common place // TODO move this into a common place
@@ -126,28 +146,61 @@ public class MixinLevelRenderer
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks();
#endif #endif
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level);
//LOGGER.info("\n\n" +
// "Level Mixin\n" +
// "Mc MVM: \n" + mcModelViewMatrix.toString() + "\n" +
// "Mc Proj: \n" + mcProjectionMatrix.toString()
//);
#if MC_VER < MC_1_21_6 #if MC_VER < MC_1_21_6
if (renderType.equals(RenderType.translucent())) if (renderType.equals(RenderType.translucent()))
{ {
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), ClientApi.INSTANCE.renderDeferredLodsForShaders();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime
);
} }
#elif MC_VER < MC_1_21_9
// rendering handled via Fabric Api render event
#else #else
// rendering handled via Fabric Api render event // handled here and in MixinChunkSectionsToRender
#endif #endif
} }
#if MC_VER < MC_1_21_6
// rendering handled via Fabric Api render event
#else
@Inject(at = @At("HEAD"), method = "prepareChunkRenders")
private void prepareChunkRenders(Matrix4fc modelViewMatrix, double d, double e, double f, CallbackInfoReturnable<ChunkSectionsToRender> callback)
{
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix);
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level);
// only crash during development
if (ModInfo.IS_DEV_BUILD)
{
ClientApi.RENDER_STATE.canRenderOrThrow();
}
ClientApi.INSTANCE.renderLods();
}
@Inject(at = @At("RETURN"), method = "renderLevel")
private void postRenderLevel(GraphicsResourceAllocator graphicsResourceAllocator, DeltaTracker deltaTracker, boolean bl, Camera camera, Matrix4f matrix4f, Matrix4f matrix4f2, Matrix4f matrix4f3, GpuBufferSlice gpuBufferSlice, Vector4f vector4f, boolean bl2, CallbackInfo ci)
{
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level);
ClientApi.RENDER_STATE.frameTime = deltaTracker.getGameTimeDeltaTicks();
// only crash during development
if (ModInfo.IS_DEV_BUILD)
{
ClientApi.RENDER_STATE.canRenderOrThrow();
}
ClientApi.INSTANCE.renderFade();
}
#endif
} }
@@ -17,6 +17,7 @@
"client.MixinDebugScreenOverlay", "client.MixinDebugScreenOverlay",
"client.MixinFogRenderer", "client.MixinFogRenderer",
"client.MixinLevelRenderer", "client.MixinLevelRenderer",
"client.MixinChunkSectionsToRender",
"client.MixinLightTexture", "client.MixinLightTexture",
"client.MixinMinecraft", "client.MixinMinecraft",
"client.MixinOptionsScreen", "client.MixinOptionsScreen",
@@ -129,34 +129,35 @@ public class MixinLevelRenderer
// get the matrices from the OpenGL fixed pipeline // get the matrices from the OpenGL fixed pipeline
float[] mcProjMatrixRaw = new float[16]; float[] mcProjMatrixRaw = new float[16];
GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw); GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw);
Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); ClientApi.RENDER_STATE.mcProjectionMatrix = new Mat4f(mcProjMatrixRaw);
mcProjectionMatrix.transpose(); ClientApi.RENDER_STATE.mcProjectionMatrix.transpose();
Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
#else #else
// get the matrices directly from MC // get the matrices directly from MC
Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
#endif #endif
float frameTime;
#if MC_VER < MC_1_21_1 #if MC_VER < MC_1_21_1
frameTime = Minecraft.getInstance().getFrameTime(); ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getFrameTime();
#else #else
frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks();
#endif #endif
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level);
// only render before solid blocks // only render before solid blocks
if (renderType.equals(RenderType.solid())) if (renderType.equals(RenderType.solid()))
{ {
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime); ClientApi.INSTANCE.renderLods();
} }
else if (renderType.equals(RenderType.translucent())) else if (renderType.equals(RenderType.translucent()))
{ {
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime); ClientApi.INSTANCE.renderDeferredLodsForShaders();
} }
// render fade // render fade
@@ -165,21 +166,11 @@ public class MixinLevelRenderer
// we need to trigger for the renderType after those passes are done // we need to trigger for the renderType after those passes are done
if (renderType.equals(RenderType.cutout())) if (renderType.equals(RenderType.cutout()))
{ {
ClientApi.INSTANCE.renderFadeOpaque( ClientApi.INSTANCE.renderFadeOpaque();
mcModelViewMatrix,
mcProjectionMatrix,
frameTime,
ClientLevelWrapper.getWrapper(this.level)
);
} }
else if (renderType.equals(RenderType.tripwire())) else if (renderType.equals(RenderType.tripwire()))
{ {
ClientApi.INSTANCE.renderFade( ClientApi.INSTANCE.renderFade();
mcModelViewMatrix,
mcProjectionMatrix,
frameTime,
ClientLevelWrapper.getWrapper(this.level)
);
} }
} }
@@ -251,17 +251,12 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
public void afterLevelEntityRenderEvent(RenderLevelStageEvent.AfterEntities event) public void afterLevelEntityRenderEvent(RenderLevelStageEvent.AfterEntities event)
{ {
#if MC_VER < MC_1_21_9 #if MC_VER < MC_1_21_9
IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel()); ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel());
#else #else
IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper(event.getLevelRenderer().level); ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level);
#endif #endif
ClientApi.INSTANCE.renderFade( ClientApi.INSTANCE.renderFade();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime,
levelWrapper
);
} }
@@ -269,26 +264,21 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
public void afterLevelTranslucentRenderEvent(RenderLevelStageEvent.AfterTranslucentBlocks event) public void afterLevelTranslucentRenderEvent(RenderLevelStageEvent.AfterTranslucentBlocks event)
{ {
#if MC_VER < MC_1_21_9 #if MC_VER < MC_1_21_9
IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel()); ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel());
#else #else
IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper(event.getLevelRenderer().level); ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level);
#endif #endif
ClientApi.INSTANCE.renderDeferredLodsForShaders( ClientApi.INSTANCE.renderDeferredLodsForShaders();
levelWrapper,
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime
);
} }
@SubscribeEvent @SubscribeEvent
public void afterLevelRenderEvent(RenderLevelStageEvent.AfterLevel event) public void afterLevelRenderEvent(RenderLevelStageEvent.AfterLevel event)
{ {
#if MC_VER < MC_1_21_9 #if MC_VER < MC_1_21_9
IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel()); ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel());
#else #else
IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper(event.getLevelRenderer().level); ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level);
#endif #endif
@@ -305,24 +295,11 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
} }
ClientApi.INSTANCE.renderFadeOpaque( ClientApi.INSTANCE.renderFadeOpaque();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime,
levelWrapper
);
} }
#endif #endif
//================//
// helper methods //
//================//
private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); }
} }
@@ -66,15 +66,6 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/**
* This class is used to mix in DH's rendering code
* before Minecraft starts rendering blocks.
* If this wasn't done, and we used Forge's
* render last event, the LODs would render on top
* of the normal terrain. <br><br>
*
* This is also the mixin for rendering the clouds
*/
@Mixin(LevelRenderer.class) @Mixin(LevelRenderer.class)
public class MixinLevelRenderer public class MixinLevelRenderer
{ {
@@ -90,17 +81,17 @@ public class MixinLevelRenderer
#if MC_VER < MC_1_21_6 #if MC_VER < MC_1_21_6
@Inject(at = @At("HEAD"), method = "renderSectionLayer", cancellable = true) @Inject(at = @At("HEAD"), method = "renderSectionLayer")
private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback) private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback)
#elif MC_VER < MC_1_21_9 #elif MC_VER < MC_1_21_9
@Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) @Inject(at = @At("HEAD"), method = "renderLevel")
private void onRenderLevel( private void onRenderLevel(
GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker,
boolean renderBlockOutline, Camera camera, boolean renderBlockOutline, Camera camera,
Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice gpuBufferSlice, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice gpuBufferSlice,
Vector4f skyColor, boolean thinFog, CallbackInfo callback) Vector4f skyColor, boolean thinFog, CallbackInfo callback)
#else #else
@Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) @Inject(at = @At("HEAD"), method = "renderLevel")
private void renderLevel( private void renderLevel(
GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker,
boolean renderBlockOutline, Camera camera, boolean renderBlockOutline, Camera camera,
@@ -116,12 +107,6 @@ public class MixinLevelRenderer
ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
#endif #endif
//LOGGER.info("\n\n" +
// "Level Mixin\n" +
// "Mc MVM: \n" + ClientApi.RENDER_STATE.mcModelViewMatrix.toString() + "\n" +
// "Mc Proj: \n" + ClientApi.RENDER_STATE.mcProjectionMatrix.toString()
//);
#if MC_VER < MC_1_21_1 #if MC_VER < MC_1_21_1
@@ -132,6 +117,8 @@ public class MixinLevelRenderer
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks();
#endif #endif
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level);
#if MC_VER < MC_1_21_6 #if MC_VER < MC_1_21_6
@@ -144,17 +131,11 @@ public class MixinLevelRenderer
// render LODs // render LODs
if (renderType.equals(RenderType.solid())) if (renderType.equals(RenderType.solid()))
{ {
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), ClientApi.INSTANCE.renderLods();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime);
} }
else if (renderType.equals(RenderType.translucent())) else if (renderType.equals(RenderType.translucent()))
{ {
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), ClientApi.INSTANCE.renderDeferredLodsForShaders();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime);
} }
// render fade // render fade
@@ -163,21 +144,11 @@ public class MixinLevelRenderer
// we need to trigger for the renderType after those passes are done // we need to trigger for the renderType after those passes are done
if (renderType.equals(RenderType.cutout())) if (renderType.equals(RenderType.cutout()))
{ {
ClientApi.INSTANCE.renderFadeOpaque( ClientApi.INSTANCE.renderFadeOpaque();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime,
ClientLevelWrapper.getWrapper(this.level)
);
} }
else if (renderType.equals(RenderType.tripwire())) else if (renderType.equals(RenderType.tripwire()))
{ {
ClientApi.INSTANCE.renderFade( ClientApi.INSTANCE.renderFade();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime,
ClientLevelWrapper.getWrapper(this.level)
);
} }
#endif #endif
} }
@@ -188,21 +159,19 @@ public class MixinLevelRenderer
// formerly handled in renderChunkLayer() // formerly handled in renderChunkLayer()
#else #else
@Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true) @Inject(at = @At("HEAD"), method = "prepareChunkRenders")
private void renderChunkLayer(Matrix4fc modelViewMatrix, double d, double e, double f, CallbackInfoReturnable<ChunkSectionsToRender> callback) private void renderChunkLayer(Matrix4fc modelViewMatrix, double d, double e, double f, CallbackInfoReturnable<ChunkSectionsToRender> callback)
{ {
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix);
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level);
// only crash during development // only crash during development
if (ModInfo.IS_DEV_BUILD) if (ModInfo.IS_DEV_BUILD)
{ {
ClientApi.RENDER_STATE.canRenderOrThrow(); ClientApi.RENDER_STATE.canRenderOrThrow();
} }
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), ClientApi.INSTANCE.renderLods();
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime);
} }
#endif #endif
+2 -2
View File
@@ -12,8 +12,8 @@ netty_version=4.1.97.Final
# Fabric loader # Fabric loader
fabric_loader_version=0.17.2 fabric_loader_version=0.17.2
fabric_api_version=0.133.14+1.21.9 fabric_api_version=0.134.0+1.21.9
modmenu_version=15.0.0 modmenu_version=16.0.0-rc.1
starlight_version_fabric= starlight_version_fabric=
phosphor_version_fabric= phosphor_version_fabric=
lithium_version= lithium_version=