diff --git a/src/api/java/meldexun/nothirium/api/renderer/chunk/ChunkRenderPass.java b/src/api/java/meldexun/nothirium/api/renderer/chunk/ChunkRenderPass.java new file mode 100644 index 00000000000..355ce0daa04 --- /dev/null +++ b/src/api/java/meldexun/nothirium/api/renderer/chunk/ChunkRenderPass.java @@ -0,0 +1,12 @@ +package meldexun.nothirium.api.renderer.chunk; + +/** + * Adapted and minimized from ChunkRenderPass.java + */ +public enum ChunkRenderPass { + ; + + public static final ChunkRenderPass[] ALL = ChunkRenderPass.values(); + +} diff --git a/src/main/java/gregtech/client/utils/BloomEffectUtil.java b/src/main/java/gregtech/client/utils/BloomEffectUtil.java index c4a4e0548ee..36671852320 100644 --- a/src/main/java/gregtech/client/utils/BloomEffectUtil.java +++ b/src/main/java/gregtech/client/utils/BloomEffectUtil.java @@ -18,23 +18,19 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.shader.Framebuffer; import net.minecraft.entity.Entity; -import net.minecraft.launchwrapper.Launch; import net.minecraft.util.BlockRenderLayer; import net.minecraft.world.World; -import net.minecraftforge.common.util.EnumHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.github.bsideup.jabel.Desugar; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.apache.commons.lang3.reflect.FieldUtils; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.opengl.GL11; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -336,24 +332,9 @@ public boolean test(BloomRenderTicket bloomRenderTicket) { }, validityChecker); } - @SuppressWarnings({ "rawtypes", "unchecked" }) public static void init() { - bloom = EnumHelper.addEnum(BlockRenderLayer.class, "BLOOM", new Class[] { String.class }, "Bloom"); + bloom = BlockRenderLayer.valueOf("BLOOM"); BLOOM = bloom; - if (Mods.Nothirium.isModLoaded()) { - try { - // Nothirium hard copies the BlockRenderLayer enum into a ChunkRenderPass enum. Add our BLOOM layer to - // that too. - Class crp = Class.forName("meldexun.nothirium.api.renderer.chunk.ChunkRenderPass", false, - Launch.classLoader); - EnumHelper.addEnum(crp, "BLOOM", new Class[] {}); - Field all = FieldUtils.getField(crp, "ALL", false); - FieldUtils.removeFinalModifier(all); - FieldUtils.writeStaticField(all, crp.getEnumConstants()); - } catch (ClassNotFoundException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } } // Calls injected via ASM diff --git a/src/main/java/gregtech/client/utils/BloomEffectVintagiumUtil.java b/src/main/java/gregtech/client/utils/BloomEffectVintagiumUtil.java index 0d63f22a2d4..68bd1469c38 100644 --- a/src/main/java/gregtech/client/utils/BloomEffectVintagiumUtil.java +++ b/src/main/java/gregtech/client/utils/BloomEffectVintagiumUtil.java @@ -11,14 +11,12 @@ @SideOnly(Side.CLIENT) public class BloomEffectVintagiumUtil { - public static BlockRenderPass bloom; - /** * @return {@link BlockRenderPass} instance for the bloom render layer. */ @NotNull @SuppressWarnings("unused") public static BlockRenderPass getBloomPass() { - return Objects.requireNonNull(bloom, "Bloom effect is not initialized yet"); + return Objects.requireNonNull(BlockRenderPass.valueOf("BLOOM"), "Bloom effect is not initialized yet"); } } diff --git a/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java b/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java index a582e924088..f429a9d749e 100644 --- a/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java +++ b/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java @@ -19,6 +19,7 @@ public List getMixinConfigs() { configs.add("mixins.gregtech.ccl.json"); configs.add("mixins.gregtech.littletiles.json"); configs.add("mixins.gregtech.vintagium.json"); + configs.add("mixins.gregtech.nothirium.json"); return configs; } @@ -31,6 +32,7 @@ public boolean shouldMixinConfigQueue(String mixinConfig) { case "mixin.gregtech.ctm.json" -> Mods.CTM.isModLoaded(); case "mixins.gregtech.littletiles.json" -> Mods.LittleTiles.isModLoaded(); case "mixins.gregtech.vintagium.json" -> Mods.Vintagium.isModLoaded(); + case "mixins.gregtech.nothirium.json" -> Mods.Nothirium.isModLoaded(); default -> true; }; } diff --git a/src/main/java/gregtech/mixins/minecraft/BlockRenderLayerMixin.java b/src/main/java/gregtech/mixins/minecraft/BlockRenderLayerMixin.java new file mode 100644 index 00000000000..d3c352a94dd --- /dev/null +++ b/src/main/java/gregtech/mixins/minecraft/BlockRenderLayerMixin.java @@ -0,0 +1,31 @@ +package gregtech.mixins.minecraft; + +import net.minecraft.util.BlockRenderLayer; + +import org.apache.commons.lang3.ArrayUtils; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BlockRenderLayer.class) +public class BlockRenderLayerMixin { + + @Final + @Shadow + @Mutable + private static BlockRenderLayer[] $VALUES; + + @SuppressWarnings("all") + @Invoker("") + private static BlockRenderLayer create(String name, int ordinal, String directoryName) { + throw new IllegalStateException("Unreachable"); + } + + static { + BlockRenderLayer bloom = create("BLOOM", $VALUES.length, "Bloom"); + + $VALUES = ArrayUtils.add($VALUES, bloom); + } +} diff --git a/src/main/java/gregtech/mixins/nothirium/ChunkRenderPassMixin.java b/src/main/java/gregtech/mixins/nothirium/ChunkRenderPassMixin.java new file mode 100644 index 00000000000..9785abe9978 --- /dev/null +++ b/src/main/java/gregtech/mixins/nothirium/ChunkRenderPassMixin.java @@ -0,0 +1,35 @@ +package gregtech.mixins.nothirium; + +import meldexun.nothirium.api.renderer.chunk.ChunkRenderPass; +import org.apache.commons.lang3.ArrayUtils; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ChunkRenderPass.class) +public class ChunkRenderPassMixin { + + @Final + @Mutable + @Shadow(remap = false) + public static ChunkRenderPass[] $VALUES; + + @Final + @Mutable + @Shadow(remap = false) + public static ChunkRenderPass[] ALL; + + @SuppressWarnings("all") + @Invoker(value = "") + private static ChunkRenderPass create(String name, int ordinal) { + throw new IllegalStateException("Unreachable"); + } + + static { + ChunkRenderPass bloom = create("BLOOM", $VALUES.length); + $VALUES = ArrayUtils.add($VALUES, bloom); + ALL = ChunkRenderPass.values(); + } +} diff --git a/src/main/java/gregtech/mixins/vintagium/BlockRenderPassMixin.java b/src/main/java/gregtech/mixins/vintagium/BlockRenderPassMixin.java index 5544bd8069e..731128ddca0 100644 --- a/src/main/java/gregtech/mixins/vintagium/BlockRenderPassMixin.java +++ b/src/main/java/gregtech/mixins/vintagium/BlockRenderPassMixin.java @@ -1,25 +1,26 @@ package gregtech.mixins.vintagium; import gregtech.client.utils.BloomEffectUtil; -import gregtech.client.utils.BloomEffectVintagiumUtil; import net.minecraft.util.BlockRenderLayer; -import net.minecraftforge.common.util.EnumHelper; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; import me.jellysquid.mods.sodium.client.util.BufferSizeUtil; -import me.jellysquid.mods.sodium.client.util.EnumUtil; +import org.apache.commons.lang3.ArrayUtils; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; 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 org.spongepowered.asm.mixin.gen.Invoker; @Mixin(BlockRenderPass.class) public abstract class BlockRenderPassMixin { + @Final + @Mutable + @Shadow(remap = false) + public static BlockRenderPass[] $VALUES; + @Final @Mutable @Shadow(remap = false) @@ -30,17 +31,17 @@ public abstract class BlockRenderPassMixin { @Shadow(remap = false) public static int COUNT; - @SuppressWarnings("UnresolvedMixinReference") - @Inject(method = "", - at = @At(value = "TAIL"), - remap = false) - private static void init(CallbackInfo ci) { - EnumUtil.LAYERS = BlockRenderLayer.values(); + @SuppressWarnings("all") + @Invoker("") + private static BlockRenderPass create(String name, int ordinal, BlockRenderLayer layer, boolean translucent) { + throw new IllegalStateException("Unreachable"); + } + + static { BufferSizeUtil.BUFFER_SIZES.put(BloomEffectUtil.getBloomLayer(), 131072); - var params = new Class[] { BlockRenderLayer.class, boolean.class }; - var values = new Object[] { BloomEffectUtil.getBloomLayer(), true }; - BloomEffectVintagiumUtil.bloom = EnumHelper.addEnum(BlockRenderPass.class, "BLOOM", params, values); + BlockRenderPass bloom = create("BLOOM", $VALUES.length, BloomEffectUtil.getBloomLayer(), true); + $VALUES = ArrayUtils.add($VALUES, bloom); VALUES = BlockRenderPass.values(); COUNT = VALUES.length; } diff --git a/src/main/resources/mixins.gregtech.minecraft.json b/src/main/resources/mixins.gregtech.minecraft.json index 3c9abf97778..50eeb75fb65 100644 --- a/src/main/resources/mixins.gregtech.minecraft.json +++ b/src/main/resources/mixins.gregtech.minecraft.json @@ -9,6 +9,7 @@ }, "mixins": [ "BlockConcretePowderMixin", + "BlockRenderLayerMixin", "DamageSourceMixin", "EnchantmentCanApplyMixin", "MinecraftMixin" diff --git a/src/main/resources/mixins.gregtech.nothirium.json b/src/main/resources/mixins.gregtech.nothirium.json new file mode 100644 index 00000000000..c3ffca3074e --- /dev/null +++ b/src/main/resources/mixins.gregtech.nothirium.json @@ -0,0 +1,12 @@ +{ + "package": "gregtech.mixins.nothirium", + "refmap": "mixins.gregtech.refmap.json", + "target": "@env(DEFAULT)", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "ChunkRenderPassMixin" + ], + "client": [], + "server": [] +}