diff --git a/src/main/java/io/github/cadiboo/nocubes/hooks/MixinAsm.java b/src/main/java/io/github/cadiboo/nocubes/hooks/MixinAsm.java index 94f6ad04..0bd72d43 100644 --- a/src/main/java/io/github/cadiboo/nocubes/hooks/MixinAsm.java +++ b/src/main/java/io/github/cadiboo/nocubes/hooks/MixinAsm.java @@ -26,6 +26,7 @@ public final class MixinAsm { private static boolean transformChunkRendererRanAlready = false; private static boolean transformFluidRendererRanAlready = false; private static boolean transformSodiumChunkRendererRanAlready = false; + private static boolean transformSodiumFluidRendererRanAlready = false; private static boolean transformSodiumWorldRendererRanAlready = false; private static boolean transformSodiumLevelRendererRanAlready = false; @@ -262,6 +263,29 @@ public static void transformSodiumChunkRenderer(ClassNode classNode) { redirectBlockStateGetFluidStateSoExtendedFluidsWork(methodNode, blockPosLocalVarIndex); } + /** + * Same as {@link MixinAsm#transformFluidRenderer} but for Sodium. + */ + public static void transformSodiumFluidRenderer(ClassNode classNode) { + if (transformSodiumFluidRendererRanAlready) + return; + transformSodiumFluidRendererRanAlready = true; + + var methodNode = findMethodNode( + classNode, + "fluidHeight", + "(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;)F" + ); + + redirectBlockStateGetFluidStateSoExtendedFluidsWork( + methodNode, + // blockPosLocalVarIndex + 3 + ); + + // Not implemented yet - see comments in transformSodiumWorldRenderer + } + /** * Same as {@link io.github.cadiboo.nocubes.mixin.LevelRendererMixin#nocubes_setBlocksDirty} but for Sodium. */ diff --git a/src/main/java/io/github/cadiboo/nocubes/mixin/NoCubesMixinPlugin.java b/src/main/java/io/github/cadiboo/nocubes/mixin/NoCubesMixinPlugin.java index 6dd1c833..3af2b621 100644 --- a/src/main/java/io/github/cadiboo/nocubes/mixin/NoCubesMixinPlugin.java +++ b/src/main/java/io/github/cadiboo/nocubes/mixin/NoCubesMixinPlugin.java @@ -44,6 +44,7 @@ private static void transformClass(String mixinClassName, ClassNode classNode) { case "io.github.cadiboo.nocubes.mixin.RenderChunkRebuildTaskMixin" -> MixinAsm.transformChunkRenderer(classNode); case "io.github.cadiboo.nocubes.mixin.LiquidBlockRendererMixin" -> MixinAsm.transformFluidRenderer(classNode); case "io.github.cadiboo.nocubes.mixin.SodiumChunkBuilderMeshingTaskMixin" -> MixinAsm.transformSodiumChunkRenderer(classNode); + case "io.github.cadiboo.nocubes.mixin.SodiumFluidRendererMixin" -> MixinAsm.transformSodiumFluidRenderer(classNode); case "io.github.cadiboo.nocubes.mixin.SodiumWorldRendererMixin" -> MixinAsm.transformSodiumWorldRenderer(classNode); case "io.github.cadiboo.nocubes.mixin.SodiumLevelRendererMixin" -> MixinAsm.transformSodiumLevelRenderer(classNode); } diff --git a/src/main/java/io/github/cadiboo/nocubes/mixin/SodiumFluidRendererMixin.java b/src/main/java/io/github/cadiboo/nocubes/mixin/SodiumFluidRendererMixin.java new file mode 100644 index 00000000..b59b02c3 --- /dev/null +++ b/src/main/java/io/github/cadiboo/nocubes/mixin/SodiumFluidRendererMixin.java @@ -0,0 +1,33 @@ +package io.github.cadiboo.nocubes.mixin; + +import io.github.cadiboo.nocubes.hooks.Hooks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.fluids.FluidStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * There is more to this mixin, see the documentation in {@link io.github.cadiboo.nocubes.hooks.MixinAsm} + * and {@link io.github.cadiboo.nocubes.hooks.MixinAsm#transformSodiumLevelRenderer}. + */ +@Pseudo // Sodium may not be installed +@Mixin(targets = "me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.FluidRenderer") +public class SodiumFluidRendererMixin { + + @Redirect( + method = "isFluidOccluded", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/BlockAndTintGetter;getFluidState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/material/FluidState;" + ), + require = 2 // Redirect both calls to the function + ) + private FluidState nocubes_getFluidState(BlockAndTintGetter world, BlockPos adjPos) { + return Hooks.getRenderFluidState(adjPos, world.getBlockState(adjPos)); + } + +} diff --git a/src/main/resources/mixins.nocubes.json b/src/main/resources/mixins.nocubes.json index ec31c47b..60829672 100644 --- a/src/main/resources/mixins.nocubes.json +++ b/src/main/resources/mixins.nocubes.json @@ -24,6 +24,7 @@ "RenderChunkRegionMixin", "ScreenEffectRendererMixin", "SodiumChunkBuilderMeshingTaskMixin", + "SodiumFluidRendererMixin", "SodiumWorldRendererMixin", "SodiumLevelRendererMixin" ],