From 06188feede6ea3207e6f2ab657799ab0d9b29d23 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Sat, 27 Sep 2025 17:35:06 +0800 Subject: [PATCH] refactor: real-time shader state check --- .../java/net/optifine/shaders/Shaders.java | 6 +++++ src/main/java/gregtech/api/util/Mods.java | 27 +++++++++++-------- .../pipeline/VertexLighterFlatSpecial.java | 2 +- .../VertexLighterSmoothAoSpecial.java | 6 ++--- .../client/utils/BloomEffectUtil.java | 8 +++--- .../java/gregtech/client/utils/CTMHooks.java | 4 +-- .../client/utils/DepthTextureUtil.java | 2 +- 7 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 src/api/java/net/optifine/shaders/Shaders.java diff --git a/src/api/java/net/optifine/shaders/Shaders.java b/src/api/java/net/optifine/shaders/Shaders.java new file mode 100644 index 00000000000..a54777ed326 --- /dev/null +++ b/src/api/java/net/optifine/shaders/Shaders.java @@ -0,0 +1,6 @@ +package net.optifine.shaders; + +/// Adapted and minimized from OptiFine +public class Shaders { + public static boolean shaderPackLoaded; +} diff --git a/src/main/java/gregtech/api/util/Mods.java b/src/main/java/gregtech/api/util/Mods.java index 4cbd4031fa3..4c73cbdb699 100644 --- a/src/main/java/gregtech/api/util/Mods.java +++ b/src/main/java/gregtech/api/util/Mods.java @@ -4,17 +4,19 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fml.client.FMLClientHandler; +import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.FMLLaunchHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import net.optifine.shaders.Shaders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -79,23 +81,26 @@ public enum Mods { Vintagium(Names.VINTAGIUM), Alfheim(Names.ALFHEIM), - // Special Optifine handler, but consolidated here for simplicity - Optifine(null) { + OptiFine(null) { @Override public boolean isModLoaded() { if (this.modLoaded == null) { - try { - Class c = Class.forName("net.optifine.shaders.Shaders"); - Field f = c.getDeclaredField("shaderPackLoaded"); - f.setAccessible(true); - this.modLoaded = f.getBoolean(null); - } catch (Exception ignored) { - this.modLoaded = false; - } + this.modLoaded = FMLCommonHandler.instance().getSide().isClient() && + FMLClientHandler.instance().hasOptifine(); } return this.modLoaded; } + }, + + // Special Optifine shader handler, but consolidated here for simplicity + ShadersMod(null) { + + @Override + public boolean isModLoaded() { + // Check shader pack state at real time instead of caching it + return OptiFine.isModLoaded() && Shaders.shaderPackLoaded; + } }; public static class Names { diff --git a/src/main/java/gregtech/client/model/pipeline/VertexLighterFlatSpecial.java b/src/main/java/gregtech/client/model/pipeline/VertexLighterFlatSpecial.java index 1f3bb2af589..ed4790ab4ea 100644 --- a/src/main/java/gregtech/client/model/pipeline/VertexLighterFlatSpecial.java +++ b/src/main/java/gregtech/client/model/pipeline/VertexLighterFlatSpecial.java @@ -134,7 +134,7 @@ protected void processQuad() { updateColor(normal[v], color[v], x, y, z, tint, multiplier); // When enabled this causes the rendering to be black with Optifine - if (!Mods.Optifine.isModLoaded() && diffuse) { + if (!Mods.ShadersMod.isModLoaded() && diffuse) { float d = LightUtil.diffuseLight(normal[v][0], normal[v][1], normal[v][2]); for (int i = 0; i < 3; i++) { color[v][i] *= d; diff --git a/src/main/java/gregtech/client/model/pipeline/VertexLighterSmoothAoSpecial.java b/src/main/java/gregtech/client/model/pipeline/VertexLighterSmoothAoSpecial.java index f1d6f852e3c..b303a75954f 100644 --- a/src/main/java/gregtech/client/model/pipeline/VertexLighterSmoothAoSpecial.java +++ b/src/main/java/gregtech/client/model/pipeline/VertexLighterSmoothAoSpecial.java @@ -15,7 +15,7 @@ public VertexLighterSmoothAoSpecial(BlockColors colors) { @Override protected void updateLightmap(float[] normal, float[] lightmap, float x, float y, float z) { - if (Mods.Optifine.isModLoaded()) { + if (Mods.ShadersMod.isModLoaded()) { super.updateLightmap(normal, lightmap, x, y, z); return; } @@ -28,7 +28,7 @@ protected void updateLightmap(float[] normal, float[] lightmap, float x, float y protected void updateColor(float[] normal, float[] color, float x, float y, float z, float tint, int multiplier) { super.updateColor(normal, color, x, y, z, tint, multiplier); - if (Mods.Optifine.isModLoaded()) { + if (Mods.ShadersMod.isModLoaded()) { return; } @@ -146,7 +146,7 @@ protected float getAo(float x, float y, float z) { @Override public void updateBlockInfo() { - if (Mods.Optifine.isModLoaded()) { + if (Mods.ShadersMod.isModLoaded()) { super.updateBlockInfo(); return; } diff --git a/src/main/java/gregtech/client/utils/BloomEffectUtil.java b/src/main/java/gregtech/client/utils/BloomEffectUtil.java index b660f3bc26f..233717fb192 100644 --- a/src/main/java/gregtech/client/utils/BloomEffectUtil.java +++ b/src/main/java/gregtech/client/utils/BloomEffectUtil.java @@ -83,7 +83,7 @@ public static BlockRenderLayer getEffectiveBloomLayer() { */ @Contract("null -> _; !null -> !null") public static BlockRenderLayer getEffectiveBloomLayer(BlockRenderLayer fallback) { - return Mods.Optifine.isModLoaded() ? fallback : bloom; + return Mods.ShadersMod.isModLoaded() ? fallback : bloom; } /** @@ -115,7 +115,7 @@ public static BlockRenderLayer getEffectiveBloomLayer(boolean isBloomActive) { */ @Contract("_, null -> _; _, !null -> !null") public static BlockRenderLayer getEffectiveBloomLayer(boolean isBloomActive, BlockRenderLayer fallback) { - return Mods.Optifine.isModLoaded() || !isBloomActive ? fallback : bloom; + return Mods.ShadersMod.isModLoaded() || !isBloomActive ? fallback : bloom; } /** @@ -253,7 +253,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { - if (Mods.Optifine.isModLoaded()) return BloomRenderTicket.INVALID; + if (Mods.ShadersMod.isModLoaded()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.lock(); try { @@ -302,7 +302,7 @@ public static int renderBloomBlockLayer(RenderGlobal renderGlobal, @NotNull Entity entity) { Minecraft.getMinecraft().profiler.endStartSection("BTLayer"); - if (Mods.Optifine.isModLoaded()) { + if (Mods.ShadersMod.isModLoaded()) { return renderGlobal.renderBlockLayer(blockRenderLayer, partialTicks, pass, entity); } diff --git a/src/main/java/gregtech/client/utils/CTMHooks.java b/src/main/java/gregtech/client/utils/CTMHooks.java index 12489186352..e6e2ea943a1 100644 --- a/src/main/java/gregtech/client/utils/CTMHooks.java +++ b/src/main/java/gregtech/client/utils/CTMHooks.java @@ -36,7 +36,7 @@ public class CTMHooks { public static ThreadLocal ENABLE = new ThreadLocal<>(); public static boolean checkLayerWithOptiFine(boolean canRenderInLayer, byte layers, BlockRenderLayer layer) { - if (Mods.Optifine.isModLoaded()) { + if (Mods.ShadersMod.isModLoaded()) { if (canRenderInLayer) { if (layer == BloomEffectUtil.getBloomLayer()) return false; } else if ((layers >> BloomEffectUtil.getBloomLayer().ordinal() & 1) == 1 && @@ -50,7 +50,7 @@ public static boolean checkLayerWithOptiFine(boolean canRenderInLayer, byte laye public static List getQuadsWithOptiFine(List ret, BlockRenderLayer layer, IBakedModel bakedModel, IBlockState state, EnumFacing side, long rand) { - if (Mods.Optifine.isModLoaded() && CTMHooks.ENABLE.get() == null) { + if (Mods.ShadersMod.isModLoaded() && CTMHooks.ENABLE.get() == null) { if (layer == BloomEffectUtil.getBloomLayer()) { return Collections.emptyList(); } else if (layer == BloomEffectUtil.getEffectiveBloomLayer()) { diff --git a/src/main/java/gregtech/client/utils/DepthTextureUtil.java b/src/main/java/gregtech/client/utils/DepthTextureUtil.java index d3bd1c4f06d..4034792a2c6 100644 --- a/src/main/java/gregtech/client/utils/DepthTextureUtil.java +++ b/src/main/java/gregtech/client/utils/DepthTextureUtil.java @@ -40,7 +40,7 @@ public class DepthTextureUtil { private static int lastWidth, lastHeight; private static boolean shouldRenderDepthTexture() { - return lastBind && !Mods.Optifine.isModLoaded() && ConfigHolder.client.hookDepthTexture && + return lastBind && !Mods.ShadersMod.isModLoaded() && ConfigHolder.client.hookDepthTexture && OpenGlHelper.isFramebufferEnabled(); }