diff --git a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java index 92ad5e4e..e2e8aac7 100644 --- a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java +++ b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java @@ -151,7 +151,8 @@ public class VoxyRenderSystem { public Viewport setupViewport(ChunkRenderMatrices matrices, FogParameters fogParameters, double cameraX, double cameraY, double cameraZ) { - if (IrisUtil.irisShadowActive()) { + var viewport = this.getViewport(); + if (viewport == null) { return null; } @@ -170,7 +171,6 @@ public class VoxyRenderSystem { int[] dims = new int[4]; glGetIntegerv(GL_VIEWPORT, dims); - var viewport = this.getViewport(); viewport .setVanillaProjection(matrices.projection()) .setProjection(projection) @@ -354,6 +354,9 @@ public class VoxyRenderSystem { } public Viewport getViewport() { + if (IrisUtil.irisShadowActive()) { + return null; + } return this.viewportSelector.getViewport(); } diff --git a/src/main/java/me/cortex/voxy/client/core/util/IrisUtil.java b/src/main/java/me/cortex/voxy/client/core/util/IrisUtil.java index 3ac71ebb..0c77ff64 100644 --- a/src/main/java/me/cortex/voxy/client/core/util/IrisUtil.java +++ b/src/main/java/me/cortex/voxy/client/core/util/IrisUtil.java @@ -1,10 +1,23 @@ package me.cortex.voxy.client.core.util; +import me.cortex.voxy.client.core.VoxyRenderSystem; +import me.cortex.voxy.client.core.rendering.Viewport; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import net.caffeinemc.mods.sodium.client.util.FogParameters; import net.fabricmc.loader.api.FabricLoader; +import net.irisshaders.iris.Iris; import net.irisshaders.iris.gl.IrisRenderSystem; import net.irisshaders.iris.shadows.ShadowRenderer; public class IrisUtil { + public record CapturedViewportParameters(ChunkRenderMatrices matrices, FogParameters parameters, double x, double y, double z) { + public Viewport apply(VoxyRenderSystem vrs) { + return vrs.setupViewport(this.matrices, this.parameters, this.x, this.y, this.z); + } + } + + public static CapturedViewportParameters CAPTURED_VIEWPORT_PARAMETERS; + public static final boolean IRIS_INSTALLED = FabricLoader.getInstance().isModLoaded("iris"); public static final boolean SHADER_SUPPORT = System.getProperty("voxy.enableExperimentalIrisPipeline", "false").equalsIgnoreCase("true"); @@ -26,4 +39,12 @@ public class IrisUtil { IrisRenderSystem.bindSamplerToUnit(i, 0); } } + + private static boolean irisShaderPackEnabled0() { + return Iris.isPackInUseQuick(); + } + + public static boolean irisShaderPackEnabled() { + return IRIS_INSTALLED && irisShaderPackEnabled0(); + } } diff --git a/src/main/java/me/cortex/voxy/client/mixin/iris/MixinIrisRenderingPipeline.java b/src/main/java/me/cortex/voxy/client/mixin/iris/MixinIrisRenderingPipeline.java index 0ba62874..8ec6d869 100644 --- a/src/main/java/me/cortex/voxy/client/mixin/iris/MixinIrisRenderingPipeline.java +++ b/src/main/java/me/cortex/voxy/client/mixin/iris/MixinIrisRenderingPipeline.java @@ -1,5 +1,6 @@ package me.cortex.voxy.client.mixin.iris; +import me.cortex.voxy.client.core.IGetVoxyRenderSystem; import me.cortex.voxy.client.core.util.IrisUtil; import me.cortex.voxy.client.iris.IGetIrisVoxyPipelineData; import me.cortex.voxy.client.iris.IGetVoxyPatchData; @@ -9,6 +10,7 @@ import net.irisshaders.iris.gl.buffer.ShaderStorageBufferHolder; import net.irisshaders.iris.pipeline.IrisRenderingPipeline; import net.irisshaders.iris.shaderpack.programs.ProgramSet; import net.irisshaders.iris.uniforms.custom.CustomUniforms; +import net.minecraft.client.MinecraftClient; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -39,6 +41,16 @@ public class MixinIrisRenderingPipeline implements IGetVoxyPatchData, IGetIrisVo } } + @Inject(method = "beginLevelRendering", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlStateManager;_activeTexture(I)V", shift = At.Shift.BEFORE), remap = true) + private void voxy$injectViewportSetup(CallbackInfo ci) { + if (IrisUtil.CAPTURED_VIEWPORT_PARAMETERS != null) { + var renderer = ((IGetVoxyRenderSystem) MinecraftClient.getInstance().worldRenderer).getVoxyRenderSystem(); + if (renderer != null) { + IrisUtil.CAPTURED_VIEWPORT_PARAMETERS.apply(renderer); + } + } + } + @Override public IrisShaderPatch voxy$getPatchData() { return this.patchData; diff --git a/src/main/java/me/cortex/voxy/client/mixin/iris/MixinWorldRenderer.java b/src/main/java/me/cortex/voxy/client/mixin/iris/MixinWorldRenderer.java new file mode 100644 index 00000000..10e7cb45 --- /dev/null +++ b/src/main/java/me/cortex/voxy/client/mixin/iris/MixinWorldRenderer.java @@ -0,0 +1,52 @@ +package me.cortex.voxy.client.mixin.iris; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import me.cortex.voxy.client.core.IGetVoxyRenderSystem; +import me.cortex.voxy.client.core.VoxyRenderSystem; +import me.cortex.voxy.client.core.util.IrisUtil; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import net.caffeinemc.mods.sodium.client.util.FogStorage; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.util.ObjectAllocator; +import org.joml.Matrix4f; +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static org.lwjgl.opengl.GL11C.glViewport; + +@Mixin(WorldRenderer.class) +public class MixinWorldRenderer { + @Shadow @Final private MinecraftClient client; + + @Inject(method = "render", at = @At("HEAD"), order = 100) + private void voxy$injectIrisCompat( + ObjectAllocator allocator, + RenderTickCounter tickCounter, + boolean renderBlockOutline, + Camera camera, + Matrix4f positionMatrix, + Matrix4f projectionMatrix, + GpuBufferSlice fog, + Vector4f fogColor, + boolean shouldRenderSky, + CallbackInfo ci) { + if (IrisUtil.irisShaderPackEnabled()) { + var renderer = ((IGetVoxyRenderSystem) this).getVoxyRenderSystem(); + if (renderer != null) { + //Fixthe fucking viewport dims, fuck iris + glViewport(0,0,MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight); + + var pos = camera.getCameraPos(); + IrisUtil.CAPTURED_VIEWPORT_PARAMETERS = new IrisUtil.CapturedViewportParameters(new ChunkRenderMatrices(projectionMatrix, positionMatrix), ((FogStorage) this.client.gameRenderer).sodium$getFogParameters(), pos.x, pos.y, pos.z); + } + } + } +} diff --git a/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java b/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java index 9f9bc61c..aef93ae5 100644 --- a/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java +++ b/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java @@ -1,6 +1,8 @@ package me.cortex.voxy.client.mixin.sodium; import me.cortex.voxy.client.core.IGetVoxyRenderSystem; +import me.cortex.voxy.client.core.rendering.Viewport; +import me.cortex.voxy.client.core.util.IrisUtil; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; import net.caffeinemc.mods.sodium.client.render.chunk.DefaultChunkRenderer; @@ -23,7 +25,13 @@ public class MixinDefaultChunkRenderer { if (renderPass == DefaultTerrainRenderPasses.CUTOUT) { var renderer = ((IGetVoxyRenderSystem) MinecraftClient.getInstance().worldRenderer).getVoxyRenderSystem(); if (renderer != null) { - renderer.renderOpaque(renderer.setupViewport(matrices, fogParameters, camera.x, camera.y, camera.z)); + Viewport viewport = null; + if (IrisUtil.irisShaderPackEnabled()) { + viewport = renderer.getViewport(); + } else { + viewport = renderer.setupViewport(matrices, fogParameters, camera.x, camera.y, camera.z); + } + renderer.renderOpaque(viewport); } } } diff --git a/src/main/resources/client.voxy.mixins.json b/src/main/resources/client.voxy.mixins.json index 63896bb9..796d8818 100644 --- a/src/main/resources/client.voxy.mixins.json +++ b/src/main/resources/client.voxy.mixins.json @@ -3,6 +3,7 @@ "package": "me.cortex.voxy.client.mixin", "compatibilityLevel": "JAVA_17", "client": [ + "iris.MixinWorldRenderer", "iris.MixinPackRenderTargetDirectives", "iris.CustomUniformsAccessor", "iris.IrisRenderingPipelineAccessor",