From 8ced3f838d69f86308d79d32ca2381cb154e94b7 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Tue, 13 Sep 2022 13:16:53 +1000 Subject: [PATCH] Added support for iris --- .../com/seibel/lod/FabricClientProxy.java | 22 ++++++-- .../com/seibel/lod/FabricMixinPlugin.java | 52 +++++++++++++++++++ .../mods/sodium/MixinSodiumChunkRenderer.java | 37 +++++++++++++ .../wrappers/modAccessor/SodiumAccessor.java | 7 +++ .../resources/DistantHorizons.mixins.json | 6 ++- 5 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 fabric/src/main/java/com/seibel/lod/FabricMixinPlugin.java create mode 100644 fabric/src/main/java/com/seibel/lod/mixins/mods/sodium/MixinSodiumChunkRenderer.java diff --git a/fabric/src/main/java/com/seibel/lod/FabricClientProxy.java b/fabric/src/main/java/com/seibel/lod/FabricClientProxy.java index 290cabac1..fee1708ca 100644 --- a/fabric/src/main/java/com/seibel/lod/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/lod/FabricClientProxy.java @@ -26,7 +26,10 @@ import com.seibel.lod.core.config.Config; import com.mojang.blaze3d.platform.InputConstants; import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; +import com.seibel.lod.core.dependencyInjection.ModAccessorInjector; import com.seibel.lod.core.logging.DhLoggerBuilder; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; +import com.seibel.lod.wrappers.modAccessor.SodiumAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents; @@ -98,13 +101,22 @@ public class FabricClientProxy // RendererStartupEvent - Done in MixinGameRenderer // RendererShutdownEvent - Done in MixinGameRenderer + SodiumAccessor sodiumAccessor = (SodiumAccessor) ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class); // ClientRenderLevelTerrainEvent - WorldRenderEvents.AFTER_SETUP.register((renderContext) -> - clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()), - McObjectConverter.Convert(renderContext.matrixStack().last().pose()), - McObjectConverter.Convert(renderContext.projectionMatrix()), - renderContext.tickDelta()) + WorldRenderEvents.AFTER_SETUP.register((renderContext) -> { + if (sodiumAccessor != null) { + sodiumAccessor.levelWrapper = ClientLevelWrapper.getWrapper(renderContext.world()); + sodiumAccessor.mcModelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); + sodiumAccessor.mcProjectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); + sodiumAccessor.partialTicks = renderContext.tickDelta(); + } else { + clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()), + McObjectConverter.Convert(renderContext.matrixStack().last().pose()), + McObjectConverter.Convert(renderContext.projectionMatrix()), + renderContext.tickDelta()); + } + } ); // Debug keyboard event diff --git a/fabric/src/main/java/com/seibel/lod/FabricMixinPlugin.java b/fabric/src/main/java/com/seibel/lod/FabricMixinPlugin.java new file mode 100644 index 000000000..3003b6494 --- /dev/null +++ b/fabric/src/main/java/com/seibel/lod/FabricMixinPlugin.java @@ -0,0 +1,52 @@ +package com.seibel.lod; + +import com.seibel.lod.core.dependencyInjection.ModAccessorInjector; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +public class FabricMixinPlugin implements IMixinConfigPlugin { + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (mixinClassName.startsWith("mods.sodium")) { + return ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class) != null; + } + return true; + } + + + @Override + public void onLoad(String mixinPackage) { + + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/seibel/lod/mixins/mods/sodium/MixinSodiumChunkRenderer.java b/fabric/src/main/java/com/seibel/lod/mixins/mods/sodium/MixinSodiumChunkRenderer.java new file mode 100644 index 000000000..627ef8665 --- /dev/null +++ b/fabric/src/main/java/com/seibel/lod/mixins/mods/sodium/MixinSodiumChunkRenderer.java @@ -0,0 +1,37 @@ +package com.seibel.lod.mixins.mods.sodium; + +import com.seibel.lod.core.api.internal.ClientApi; +import com.seibel.lod.core.dependencyInjection.ModAccessorInjector; +import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; +import com.seibel.lod.wrappers.modAccessor.SodiumAccessor; +import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.sodium.client.render.chunk.ChunkCameraContext; +import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderList; +import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import me.jellysquid.mods.sodium.client.render.chunk.RegionChunkRenderer; +import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(RegionChunkRenderer.class) +public class MixinSodiumChunkRenderer { + @Unique SodiumAccessor accessor = null; + @Inject(remap = false, method = "render", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/ShaderChunkRenderer;begin(Lme/jellysquid/mods/sodium/client/render/chunk/passes/BlockRenderPass;)V", shift = At.Shift.AFTER)) + private void injectDHLoDRendering(ChunkRenderMatrices matrices, CommandList commandList, ChunkRenderList list, BlockRenderPass pass, ChunkCameraContext camera, CallbackInfo ci) { + if (accessor == null) { + accessor = (SodiumAccessor)ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class); + } + if (pass.equals(BlockRenderPass.SOLID)) { + //TODO: use matrices.modelView() and matrices.projection() instead of + // SodiumAccessor.mcModelViewMatrix, + // SodiumAccessor.mcProjectionMatrix, + ClientApi.INSTANCE.renderLods(accessor.levelWrapper, + accessor.mcModelViewMatrix, + accessor.mcProjectionMatrix, + accessor.partialTicks); + } + } +} diff --git a/fabric/src/main/java/com/seibel/lod/wrappers/modAccessor/SodiumAccessor.java b/fabric/src/main/java/com/seibel/lod/wrappers/modAccessor/SodiumAccessor.java index 8c112e48f..7081f480d 100644 --- a/fabric/src/main/java/com/seibel/lod/wrappers/modAccessor/SodiumAccessor.java +++ b/fabric/src/main/java/com/seibel/lod/wrappers/modAccessor/SodiumAccessor.java @@ -24,11 +24,13 @@ import java.util.stream.Collectors; import com.seibel.lod.core.pos.DhChunkPos; import com.seibel.lod.core.dependencyInjection.SingletonInjector; +import com.seibel.lod.core.util.math.Mat4f; import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.lod.core.wrapperInterfaces.modAccessor.ISodiumAccessor; +import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; import net.minecraft.client.Minecraft; #if PRE_MC_1_17_1 @@ -46,6 +48,11 @@ public class SodiumAccessor implements ISodiumAccessor { private final IWrapperFactory factory = SingletonInjector.INSTANCE.get(IWrapperFactory.class); private final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + public IClientLevelWrapper levelWrapper; + public Mat4f mcModelViewMatrix; + public Mat4f mcProjectionMatrix; + public float partialTicks; + @Override public String getModName() { return "Sodium-Fabric"; diff --git a/fabric/src/main/resources/DistantHorizons.mixins.json b/fabric/src/main/resources/DistantHorizons.mixins.json index cd217246f..7efec5b92 100644 --- a/fabric/src/main/resources/DistantHorizons.mixins.json +++ b/fabric/src/main/resources/DistantHorizons.mixins.json @@ -17,9 +17,11 @@ "client.MixinLevelRenderer", "client.MixinLightmap", "client.MixinOptionsScreen", - "client.MixinMinecraft" + "client.MixinMinecraft", + "mods.sodium.MixinSodiumChunkRenderer" ], "injectors": { "defaultRequire": 1 - } + }, + "plugin": "com.seibel.lod.FabricMixinPlugin" }