From 5bb0f85a90d62c1b86820295cf8a36ebcb81bbfc Mon Sep 17 00:00:00 2001 From: Suso Date: Thu, 7 Nov 2024 11:48:24 +0100 Subject: [PATCH 1/7] MC Version 1.21.3 --- gradle.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 848c5b6..5dad3a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,12 +2,12 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # https://modmuss50.me/fabric.html -minecraft_version=1.21 -yarn_mappings=1.21+build.7 -loader_version=0.15.11 -fabric_version=0.100.4+1.21 +minecraft_version=1.21.3 +yarn_mappings=1.21.3+build.2 +loader_version=0.16.9 +fabric_version=0.107.0+1.21.3 # Mod Properties -mod_version=1.12 +mod_version=1.13 maven_group=suso archives_base_name=shader-reload \ No newline at end of file From 77d8ae34ad612166c4a4b1d4b027cea750c97f21 Mon Sep 17 00:00:00 2001 From: Suso Date: Thu, 7 Nov 2024 12:31:14 +0100 Subject: [PATCH 2/7] Update keyboard mixin --- .../suso/shaderreload/mixin/KeyboardInvoker.java | 4 +++- .../java/suso/shaderreload/mixin/KeyboardMixin.java | 12 +++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java b/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java index fe607f4..4a818df 100644 --- a/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java +++ b/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java @@ -1,10 +1,12 @@ package suso.shaderreload.mixin; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Keyboard; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(Keyboard.class) +@Mixin(Keyboard.class) @Environment(EnvType.CLIENT) public interface KeyboardInvoker { @Invoker void invokeDebugLog(String key, Object ... args); diff --git a/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java b/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java index 3c1410b..f8e929c 100644 --- a/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java +++ b/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java @@ -1,5 +1,7 @@ package suso.shaderreload.mixin; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Keyboard; import net.minecraft.client.MinecraftClient; import net.minecraft.client.util.InputUtil; @@ -14,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import suso.shaderreload.ShaderReload; -@Mixin(Keyboard.class) +@Mixin(Keyboard.class) @Environment(EnvType.CLIENT) public abstract class KeyboardMixin { @Shadow @Final private MinecraftClient client; @@ -33,9 +35,7 @@ void onProcessF3(int key, CallbackInfoReturnable cir) { } } - @Inject(method = "onKey", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/gui/screen/Screen;wrapScreenError(Ljava/lang/Runnable;Ljava/lang/String;Ljava/lang/String;)V"), - cancellable = true) + @Inject(method = "onKey", at = @At(value = "HEAD"), cancellable = true) void onOnKey(long window, int key, int scancode, int action, int modifiers, CallbackInfo ci) { if (!InputUtil.isKeyPressed(window, GLFW.GLFW_KEY_F3) || key != ShaderReload.GLFW_KEY) return; if (action != 0) { @@ -44,9 +44,7 @@ void onOnKey(long window, int key, int scancode, int action, int modifiers, Call ci.cancel(); } - @Inject(method = "onChar", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/gui/screen/Screen;wrapScreenError(Ljava/lang/Runnable;Ljava/lang/String;Ljava/lang/String;)V", - ordinal = 0), cancellable = true) + @Inject(method = "onChar", at = @At(value = "HEAD"), cancellable = true) void onOnChar(long window, int codePoint, int modifiers, CallbackInfo ci) { if (InputUtil.isKeyPressed(window, GLFW.GLFW_KEY_F3) && InputUtil.isKeyPressed(window, ShaderReload.GLFW_KEY)) { ci.cancel(); From 01c67e733e08a548c278873851eea3dd181a78d5 Mon Sep 17 00:00:00 2001 From: Suso Date: Thu, 7 Nov 2024 12:32:32 +0100 Subject: [PATCH 3/7] Inject custom shader loader --- .../suso/shaderreload/CustomShaderLoader.java | 16 +++++++++++++ .../mixin/MinecraftClientMixin.java | 24 +++++++++++++++++++ src/main/resources/shaderreload.mixins.json | 3 ++- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/suso/shaderreload/CustomShaderLoader.java create mode 100644 src/main/java/suso/shaderreload/mixin/MinecraftClientMixin.java diff --git a/src/main/java/suso/shaderreload/CustomShaderLoader.java b/src/main/java/suso/shaderreload/CustomShaderLoader.java new file mode 100644 index 0000000..9708f01 --- /dev/null +++ b/src/main/java/suso/shaderreload/CustomShaderLoader.java @@ -0,0 +1,16 @@ +package suso.shaderreload; + +import net.minecraft.client.gl.ShaderLoader; +import net.minecraft.client.texture.TextureManager; + +public class CustomShaderLoader extends ShaderLoader { + public CustomShaderLoader(TextureManager textureManager) { + super(textureManager, CustomShaderLoader::onShaderError); + } + + + + static void onShaderError(Exception e) { + + } +} diff --git a/src/main/java/suso/shaderreload/mixin/MinecraftClientMixin.java b/src/main/java/suso/shaderreload/mixin/MinecraftClientMixin.java new file mode 100644 index 0000000..6e07173 --- /dev/null +++ b/src/main/java/suso/shaderreload/mixin/MinecraftClientMixin.java @@ -0,0 +1,24 @@ +package suso.shaderreload.mixin; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.ShaderLoader; +import net.minecraft.client.texture.TextureManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import suso.shaderreload.CustomShaderLoader; +import suso.shaderreload.ShaderReload; + +import java.util.function.Consumer; + +@Mixin(MinecraftClient.class) @Environment(EnvType.CLIENT) +public class MinecraftClientMixin { + @Redirect(method = "", at = @At(value = "NEW", target = "Lnet/minecraft/client/gl/ShaderLoader;")) + ShaderLoader replaceShaderLoader(TextureManager textureManager, Consumer onError) { + ShaderLoader loader = new CustomShaderLoader(textureManager); + ShaderReload.setShaderLoader(loader); + return loader; + } +} diff --git a/src/main/resources/shaderreload.mixins.json b/src/main/resources/shaderreload.mixins.json index 2428554..5bc1e7a 100644 --- a/src/main/resources/shaderreload.mixins.json +++ b/src/main/resources/shaderreload.mixins.json @@ -5,9 +5,10 @@ "compatibilityLevel": "JAVA_21", "client": [ "GameRendererMixin", + "GlProgramManagerMixin", "KeyboardInvoker", "KeyboardMixin", - "GlProgramManagerMixin", + "MinecraftClientMixin", "WorldRendererMixin" ], "injectors": { From 69eb055ab02428f3eb2f001e4351893957c9f280 Mon Sep 17 00:00:00 2001 From: Suso Date: Thu, 7 Nov 2024 12:51:56 +0100 Subject: [PATCH 4/7] Remove old injections --- .../shaderreload/mixin/GameRendererMixin.java | 57 --------------- .../mixin/GlProgramManagerMixin.java | 20 ------ .../mixin/WorldRendererMixin.java | 70 ------------------- src/main/resources/shaderreload.mixins.json | 5 +- 4 files changed, 1 insertion(+), 151 deletions(-) delete mode 100644 src/main/java/suso/shaderreload/mixin/GameRendererMixin.java delete mode 100644 src/main/java/suso/shaderreload/mixin/GlProgramManagerMixin.java delete mode 100644 src/main/java/suso/shaderreload/mixin/WorldRendererMixin.java diff --git a/src/main/java/suso/shaderreload/mixin/GameRendererMixin.java b/src/main/java/suso/shaderreload/mixin/GameRendererMixin.java deleted file mode 100644 index 0084f0e..0000000 --- a/src/main/java/suso/shaderreload/mixin/GameRendererMixin.java +++ /dev/null @@ -1,57 +0,0 @@ -package suso.shaderreload.mixin; - -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.PostEffectProcessor; -import net.minecraft.client.gl.ShaderProgram; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.resource.ResourceFactory; -import net.minecraft.resource.ResourceReloader; -import net.minecraft.util.Identifier; -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.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import suso.shaderreload.ShaderReload; - -import java.io.IOException; - -@Mixin(GameRenderer.class) -public abstract class GameRendererMixin { - @Shadow private boolean postProcessorEnabled; - - @Redirect(method = "loadPrograms", at = @At(value = "NEW", target = "Lnet/minecraft/client/gl/ShaderProgram;")) - ShaderProgram onLoadPrograms$new(ResourceFactory factory, String name, VertexFormat format) throws IOException { - return ShaderReload.onLoadShaders$new(factory, name, format); - } - - @Redirect(method = "loadPostProcessor(Lnet/minecraft/util/Identifier;)V", at = @At(value = "NEW", - target = "Lnet/minecraft/client/gl/PostEffectProcessor;")) - PostEffectProcessor onLoadPostProcessor$new(TextureManager textureManager, ResourceFactory resourceFactory, - Framebuffer framebuffer, Identifier location) throws IOException { - return ShaderReload.onLoadShader$new(textureManager, resourceFactory, framebuffer, location); - } - - @Inject(method = "loadPostProcessor(Lnet/minecraft/util/Identifier;)V", at = @At(value = "INVOKE", - target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", - remap = false), cancellable = true) - void onLoadPostProcessor$error(Identifier id, CallbackInfo ci) { - postProcessorEnabled = false; - ShaderReload.onLoadShader$end(); - ci.cancel(); - } - - @Inject(method = "loadPostProcessor(Lnet/minecraft/util/Identifier;)V", at = @At("TAIL")) - void onLoadPostProcessor$success(Identifier id, CallbackInfo ci) { - ShaderReload.onLoadShader$end(); - } - - @Inject(method = "createProgramReloader", at = @At("RETURN")) - void onCreateProgramReloader(CallbackInfoReturnable cir) { - ShaderReload.setShaderLoader(cir.getReturnValue()); - } -} diff --git a/src/main/java/suso/shaderreload/mixin/GlProgramManagerMixin.java b/src/main/java/suso/shaderreload/mixin/GlProgramManagerMixin.java deleted file mode 100644 index 36839e5..0000000 --- a/src/main/java/suso/shaderreload/mixin/GlProgramManagerMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package suso.shaderreload.mixin; - -import com.mojang.blaze3d.platform.GlStateManager; -import net.minecraft.client.gl.GlProgramManager; -import net.minecraft.client.gl.ShaderProgramSetupView; -import net.minecraft.util.InvalidHierarchicalFileException; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GlProgramManager.class) -public class GlProgramManagerMixin { - @Inject(method = "linkProgram", at = @At(value = "INVOKE", - target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", - remap = false)) - private static void onLinkProgram$error(ShaderProgramSetupView shader, CallbackInfo ci) throws InvalidHierarchicalFileException { - throw new InvalidHierarchicalFileException(GlStateManager.glGetProgramInfoLog(shader.getGlRef(), 32768)); - } -} diff --git a/src/main/java/suso/shaderreload/mixin/WorldRendererMixin.java b/src/main/java/suso/shaderreload/mixin/WorldRendererMixin.java deleted file mode 100644 index 4166c93..0000000 --- a/src/main/java/suso/shaderreload/mixin/WorldRendererMixin.java +++ /dev/null @@ -1,70 +0,0 @@ -package suso.shaderreload.mixin; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.PostEffectProcessor; -import net.minecraft.client.option.GraphicsMode; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.resource.ResourceFactory; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -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.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import suso.shaderreload.ShaderReload; - -import java.io.IOException; - -@Mixin(WorldRenderer.class) -public abstract class WorldRendererMixin { - @Shadow @Final private MinecraftClient client; - @Shadow private PostEffectProcessor entityOutlinePostProcessor; - @Shadow private Framebuffer entityOutlinesFramebuffer; - - @Redirect(method = "loadTransparencyPostProcessor", at = @At(value = "NEW", target = "Lnet/minecraft/client/gl/PostEffectProcessor;")) - PostEffectProcessor onLoadTransparencyPostProcessor$new(TextureManager textureManager, ResourceFactory resourceFactory, - Framebuffer framebuffer, Identifier location) throws IOException { - return ShaderReload.onLoadShader$new(textureManager, resourceFactory, framebuffer, location); - } - - @Inject(method = "loadTransparencyPostProcessor", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/render/WorldRenderer$ProgramInitException;(Ljava/lang/String;Ljava/lang/Throwable;)V"), - cancellable = true) - void onLoadTransparencyShader$error(CallbackInfo ci) { - client.options.getGraphicsMode().setValue(GraphicsMode.FANCY); - client.options.write(); - ShaderReload.onLoadShader$end(); - ci.cancel(); - } - - @Inject(method = "loadTransparencyPostProcessor", at = @At("TAIL")) - void onLoadTransparencyPostProcessor$success(CallbackInfo ci) { - ShaderReload.onLoadShader$end(); - } - - @Redirect(method = "loadEntityOutlinePostProcessor", at = @At(value = "NEW", target = "Lnet/minecraft/client/gl/PostEffectProcessor;")) - PostEffectProcessor onLoadEntityOutlinePostProcessor$new(TextureManager textureManager, ResourceFactory resourceFactory, - Framebuffer framebuffer, Identifier location) throws IOException { - return ShaderReload.onLoadShader$new(textureManager, resourceFactory, framebuffer, location); - } - - @Inject(method = "loadEntityOutlinePostProcessor", at = @At(value = "INVOKE", - target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", - remap = false), cancellable = true) - void onLoadEntityOutlinePostProcessor$error(CallbackInfo ci) { - entityOutlinePostProcessor = null; - entityOutlinesFramebuffer = null; - ShaderReload.onLoadShader$end(); - ci.cancel(); - } - - @Inject(method = "loadEntityOutlinePostProcessor", at = @At("TAIL")) - void onLoadEntityOutlinePostProcessor$success(CallbackInfo ci) { - ShaderReload.onLoadShader$end(); - } -} diff --git a/src/main/resources/shaderreload.mixins.json b/src/main/resources/shaderreload.mixins.json index 5bc1e7a..3818f5a 100644 --- a/src/main/resources/shaderreload.mixins.json +++ b/src/main/resources/shaderreload.mixins.json @@ -4,12 +4,9 @@ "package": "suso.shaderreload.mixin", "compatibilityLevel": "JAVA_21", "client": [ - "GameRendererMixin", - "GlProgramManagerMixin", "KeyboardInvoker", "KeyboardMixin", - "MinecraftClientMixin", - "WorldRendererMixin" + "MinecraftClientMixin" ], "injectors": { "defaultRequire": 1 From 0c7876b47041e8e9f4425a18091d358dfe4ed52d Mon Sep 17 00:00:00 2001 From: Suso Date: Thu, 7 Nov 2024 14:18:25 +0100 Subject: [PATCH 5/7] Custom loader implementation --- .../suso/shaderreload/CustomShaderLoader.java | 46 ++++++- .../java/suso/shaderreload/ShaderReload.java | 124 ++++++------------ 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/src/main/java/suso/shaderreload/CustomShaderLoader.java b/src/main/java/suso/shaderreload/CustomShaderLoader.java index 9708f01..cfcacbb 100644 --- a/src/main/java/suso/shaderreload/CustomShaderLoader.java +++ b/src/main/java/suso/shaderreload/CustomShaderLoader.java @@ -1,16 +1,60 @@ package suso.shaderreload; -import net.minecraft.client.gl.ShaderLoader; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.*; import net.minecraft.client.texture.TextureManager; +import net.minecraft.resource.DefaultResourcePack; +import net.minecraft.resource.Resource; +import net.minecraft.util.Identifier; + +import java.io.FileNotFoundException; +import java.util.Set; public class CustomShaderLoader extends ShaderLoader { + private final DefaultResourcePack defaultPack = MinecraftClient.getInstance().getDefaultResourcePack(); + public CustomShaderLoader(TextureManager textureManager) { super(textureManager, CustomShaderLoader::onShaderError); } + @Override + public ShaderProgram getOrCreateProgram(ShaderProgramKey key) { + ShaderProgram result = super.getOrCreateProgram(key); + if(result != null) return result; + + try { + return loadDefaultProgram(key); + } catch (Exception e) { + ShaderReload.printShaderException(e, true); + } + + return null; + } + + @Override + public PostEffectProcessor loadPostEffect(Identifier id, Set availableExternalTargets) { + PostEffectProcessor result = super.loadPostEffect(id, availableExternalTargets); + if(result != null) return result; + try { + return loadDefaultPostEffect(id, availableExternalTargets); + } catch (Exception e) { + ShaderReload.printShaderException(e, true); + } + + return null; + } static void onShaderError(Exception e) { + ShaderReload.tripError(); + ShaderReload.printShaderException(e, false); + } + + private ShaderProgram loadDefaultProgram(ShaderProgramKey key) throws FileNotFoundException { + return null; + } + private PostEffectProcessor loadDefaultPostEffect(Identifier id, Set availableExternalTargets) { + return null; } } diff --git a/src/main/java/suso/shaderreload/ShaderReload.java b/src/main/java/suso/shaderreload/ShaderReload.java index 3631d62..2df528b 100644 --- a/src/main/java/suso/shaderreload/ShaderReload.java +++ b/src/main/java/suso/shaderreload/ShaderReload.java @@ -1,15 +1,9 @@ package suso.shaderreload; -import com.google.gson.JsonSyntaxException; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.PostEffectProcessor; -import net.minecraft.client.gl.ShaderProgram; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.texture.TextureManager; import net.minecraft.resource.*; import net.minecraft.text.Text; import net.minecraft.util.*; @@ -18,21 +12,17 @@ import org.lwjgl.glfw.GLFW; import suso.shaderreload.mixin.KeyboardInvoker; -import java.io.IOException; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; -import static net.minecraft.resource.ResourceType.CLIENT_RESOURCES; - @Environment(EnvType.CLIENT) public class ShaderReload implements ClientModInitializer { public static final int GLFW_KEY = GLFW.GLFW_KEY_R; public static final Logger LOGGER = LogManager.getLogger("Shader Reload"); - private static final StopException STOP = new StopException(); private static boolean reloading = false; - private static boolean stopReloading = false; + private static boolean expectError = false; private static ResourceReloader shaderLoader; @Override @@ -41,95 +31,61 @@ public void onInitializeClient() { } public static void reloadShaders() { - if (reloading) return; - var client = MinecraftClient.getInstance(); + if(reloading) { + return; + } + reloading = true; - stopReloading = false; - SimpleResourceReload.start(client.getResourceManager(), List.of(shaderLoader, client.worldRenderer), - Util.getMainWorkerExecutor(), client, CompletableFuture.completedFuture(Unit.INSTANCE), false) - .whenComplete() - .whenComplete((result, throwable) -> { - reloading = false; - if (throwable == null) { - ((KeyboardInvoker) client.keyboard).invokeDebugLog("debug.reload_shaders.message"); - return; - } - if (throwable instanceof CompletionException ex && ex.getCause() != null) { - throwable = ex.getCause(); - } - if (!(throwable instanceof StopException)) { - ((KeyboardInvoker) client.keyboard).invokeDebugError("debug.reload_shaders.unknown_error"); - throwable.printStackTrace(); - } - }); + expectError = false; + MinecraftClient client = MinecraftClient.getInstance(); + + SimpleResourceReload.start(client.getResourceManager(), List.of(shaderLoader, client.worldRenderer), Util.getMainWorkerExecutor(), client, CompletableFuture.completedFuture(Unit.INSTANCE), false).whenComplete().whenComplete((result, throwable) -> { + reloading = false; + if(throwable == null) { + ((KeyboardInvoker) client.keyboard).invokeDebugLog("debug.reload_shaders.message"); + expectError = false; + return; + } + + if(throwable instanceof CompletionException ex && ex.getCause() != null) { + throwable = ex.getCause(); + } + + if(!expectError) { + ((KeyboardInvoker) client.keyboard).invokeDebugError("debug.reload_shaders.unknown_error"); + LOGGER.error(throwable); + } + + expectError = false; + }); } // Print a shader exception in chat. - private static void printShaderException(Exception exception, boolean builtin) { - var client = MinecraftClient.getInstance(); - var throwable = (Throwable) exception; + public static void printShaderException(Exception exception, boolean builtin) { + MinecraftClient client = MinecraftClient.getInstance(); + Throwable throwable = exception; while (!(throwable instanceof InvalidHierarchicalFileException)) { - var cause = throwable.getCause(); - if (cause != null) throwable = cause; - else { - var translationKey = "debug.reload_shaders.unknown_error" + (builtin ? ".builtin" : ""); + Throwable cause = throwable.getCause(); + if(cause != null) { + throwable = cause; + } else { + String translationKey = "debug.reload_shaders.unknown_error" + (builtin ? ".builtin" : ""); ((KeyboardInvoker) client.keyboard).invokeDebugError(translationKey); - throwable.printStackTrace(); + LOGGER.error(throwable); return; } } - var translationKey = "debug.reload_shaders.error" + (builtin ? ".builtin" : ""); + + String translationKey = "debug.reload_shaders.error" + (builtin ? ".builtin" : ""); ((KeyboardInvoker) client.keyboard).invokeDebugError(translationKey); client.inGameHud.getChatHud().addMessage(Text.literal(throwable.getMessage()).formatted(Formatting.GRAY)); } - // Try loading a core shader; if it fails, stop shader reloading or try loading a built-in core shader. - public static ShaderProgram onLoadShaders$new(ResourceFactory factory, String name, VertexFormat format) throws IOException { - try { - return new ShaderProgram(factory, name, format); - } catch (IOException e) { - printShaderException(e, false); - if (reloading) throw STOP; - } - try { - var defaultPack = MinecraftClient.getInstance().getDefaultResourcePack(); - return new ShaderProgram(defaultPack.getFactory(), name, format); - } catch (IOException e) { - printShaderException(e, true); - throw e; - } - } - - // Try loading a shader effect; if it fails, request stopping and try loading a built-in shader effect. - @SuppressWarnings("resource") - public static PostEffectProcessor onLoadShader$new(TextureManager textureManager, ResourceFactory resourceFactory, - Framebuffer framebuffer, Identifier location) throws IOException { - try { - return new PostEffectProcessor(textureManager, resourceFactory, framebuffer, location); - } catch (IOException | JsonSyntaxException e) { - printShaderException(e, false); - stopReloading = true; - } - try { - var defaultPack = MinecraftClient.getInstance().getDefaultResourcePack(); - resourceFactory = new LifecycledResourceManagerImpl(CLIENT_RESOURCES, List.of(defaultPack)); - return new PostEffectProcessor(textureManager, resourceFactory, framebuffer, location); - } catch (IOException | JsonSyntaxException e) { - printShaderException(e, true); - throw e; - } - } - - // Stop shader reloading if it's requested. - public static void onLoadShader$end() { - if (reloading && stopReloading) throw STOP; - } - public static void setShaderLoader(ResourceReloader value) { shaderLoader = value; } - private static class StopException extends RuntimeException { - private StopException() {} + public static void tripError() { + expectError = true; } } From f994878c44eab93405138af42abfbdd85ada7a3d Mon Sep 17 00:00:00 2001 From: Suso Date: Thu, 7 Nov 2024 14:18:40 +0100 Subject: [PATCH 6/7] Fix F3 feedback --- src/main/java/suso/shaderreload/mixin/KeyboardMixin.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java b/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java index f8e929c..4ae7d1d 100644 --- a/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java +++ b/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java @@ -30,18 +30,16 @@ public abstract class KeyboardMixin { @Inject(method = "processF3", at = @At("RETURN"), cancellable = true) void onProcessF3(int key, CallbackInfoReturnable cir) { if (key == ShaderReload.GLFW_KEY) { - ShaderReload.reloadShaders(); cir.setReturnValue(true); } } - @Inject(method = "onKey", at = @At(value = "HEAD"), cancellable = true) + @Inject(method = "onKey", at = @At(value = "HEAD")) void onOnKey(long window, int key, int scancode, int action, int modifiers, CallbackInfo ci) { if (!InputUtil.isKeyPressed(window, GLFW.GLFW_KEY_F3) || key != ShaderReload.GLFW_KEY) return; if (action != 0) { ShaderReload.reloadShaders(); } - ci.cancel(); } @Inject(method = "onChar", at = @At(value = "HEAD"), cancellable = true) From d9c4d3f1be853df5dfba58bcc2c9c442ef6a296e Mon Sep 17 00:00:00 2001 From: justorl <143778077+justorl@users.noreply.github.com> Date: Sat, 18 Oct 2025 04:01:01 +0300 Subject: [PATCH 7/7] port to 1.21.8 --- build.gradle | 2 +- gradle.properties | 8 ++++---- gradle/wrapper/gradle-wrapper.properties | 2 +- .../suso/shaderreload/CustomShaderLoader.java | 19 ++----------------- .../java/suso/shaderreload/ShaderReload.java | 8 ++++---- .../shaderreload/mixin/KeyboardInvoker.java | 8 +++----- .../shaderreload/mixin/KeyboardMixin.java | 9 ++------- 7 files changed, 17 insertions(+), 39 deletions(-) diff --git a/build.gradle b/build.gradle index d92e484..767ae81 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.7.+' + id 'fabric-loom' version '1.10.1' id 'io.github.juuxel.loom-quiltflower' version '1.8.0' id 'maven-publish' } diff --git a/gradle.properties b/gradle.properties index 5dad3a9..e990cf2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,10 +2,10 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # https://modmuss50.me/fabric.html -minecraft_version=1.21.3 -yarn_mappings=1.21.3+build.2 -loader_version=0.16.9 -fabric_version=0.107.0+1.21.3 +minecraft_version=1.21.8 +yarn_mappings=1.21.8+build.1 +loader_version=0.17.2 +fabric_version=0.133.4+1.21.8 # Mod Properties mod_version=1.13 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d8ab51..82d65ca 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1 +1 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip diff --git a/src/main/java/suso/shaderreload/CustomShaderLoader.java b/src/main/java/suso/shaderreload/CustomShaderLoader.java index cfcacbb..4feb9a3 100644 --- a/src/main/java/suso/shaderreload/CustomShaderLoader.java +++ b/src/main/java/suso/shaderreload/CustomShaderLoader.java @@ -4,7 +4,6 @@ import net.minecraft.client.gl.*; import net.minecraft.client.texture.TextureManager; import net.minecraft.resource.DefaultResourcePack; -import net.minecraft.resource.Resource; import net.minecraft.util.Identifier; import java.io.FileNotFoundException; @@ -17,20 +16,6 @@ public CustomShaderLoader(TextureManager textureManager) { super(textureManager, CustomShaderLoader::onShaderError); } - @Override - public ShaderProgram getOrCreateProgram(ShaderProgramKey key) { - ShaderProgram result = super.getOrCreateProgram(key); - if(result != null) return result; - - try { - return loadDefaultProgram(key); - } catch (Exception e) { - ShaderReload.printShaderException(e, true); - } - - return null; - } - @Override public PostEffectProcessor loadPostEffect(Identifier id, Set availableExternalTargets) { PostEffectProcessor result = super.loadPostEffect(id, availableExternalTargets); @@ -50,11 +35,11 @@ static void onShaderError(Exception e) { ShaderReload.printShaderException(e, false); } - private ShaderProgram loadDefaultProgram(ShaderProgramKey key) throws FileNotFoundException { + private ShaderProgram loadDefaultProgram(ShaderProgram key) throws FileNotFoundException { return null; } private PostEffectProcessor loadDefaultPostEffect(Identifier id, Set availableExternalTargets) { return null; } -} +} \ No newline at end of file diff --git a/src/main/java/suso/shaderreload/ShaderReload.java b/src/main/java/suso/shaderreload/ShaderReload.java index 2df528b..9927a2b 100644 --- a/src/main/java/suso/shaderreload/ShaderReload.java +++ b/src/main/java/suso/shaderreload/ShaderReload.java @@ -42,7 +42,7 @@ public static void reloadShaders() { SimpleResourceReload.start(client.getResourceManager(), List.of(shaderLoader, client.worldRenderer), Util.getMainWorkerExecutor(), client, CompletableFuture.completedFuture(Unit.INSTANCE), false).whenComplete().whenComplete((result, throwable) -> { reloading = false; if(throwable == null) { - ((KeyboardInvoker) client.keyboard).invokeDebugLog("debug.reload_shaders.message"); + ((KeyboardInvoker) client.keyboard).debugLog(Text.translatable("debug.reload_shaders.message")); expectError = false; return; } @@ -52,7 +52,7 @@ public static void reloadShaders() { } if(!expectError) { - ((KeyboardInvoker) client.keyboard).invokeDebugError("debug.reload_shaders.unknown_error"); + ((KeyboardInvoker) client.keyboard).debugLog(Text.translatable("debug.reload_shaders.unknown_error")); LOGGER.error(throwable); } @@ -70,14 +70,14 @@ public static void printShaderException(Exception exception, boolean builtin) { throwable = cause; } else { String translationKey = "debug.reload_shaders.unknown_error" + (builtin ? ".builtin" : ""); - ((KeyboardInvoker) client.keyboard).invokeDebugError(translationKey); + ((KeyboardInvoker) client.keyboard).debugLog(Text.translatable(translationKey)); LOGGER.error(throwable); return; } } String translationKey = "debug.reload_shaders.error" + (builtin ? ".builtin" : ""); - ((KeyboardInvoker) client.keyboard).invokeDebugError(translationKey); + ((KeyboardInvoker) client.keyboard).debugLog(Text.translatable(translationKey)); client.inGameHud.getChatHud().addMessage(Text.literal(throwable.getMessage()).formatted(Formatting.GRAY)); } diff --git a/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java b/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java index 4a818df..077ac74 100644 --- a/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java +++ b/src/main/java/suso/shaderreload/mixin/KeyboardInvoker.java @@ -3,14 +3,12 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Keyboard; +import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(Keyboard.class) @Environment(EnvType.CLIENT) public interface KeyboardInvoker { - @Invoker - void invokeDebugLog(String key, Object ... args); - - @Invoker - void invokeDebugError(String key, Object ... args); + @Invoker("debugLog") + void debugLog(Text text); } diff --git a/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java b/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java index 4ae7d1d..6eed9c5 100644 --- a/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java +++ b/src/main/java/suso/shaderreload/mixin/KeyboardMixin.java @@ -20,17 +20,12 @@ public abstract class KeyboardMixin { @Shadow @Final private MinecraftClient client; - @Inject(method = "processF3", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/gui/hud/ChatHud;addMessage(Lnet/minecraft/text/Text;)V", - ordinal = 10, shift = At.Shift.AFTER)) - private void onProcessF3$addHelp(int key, CallbackInfoReturnable cir) { - client.inGameHud.getChatHud().addMessage(Text.translatable("debug.reload_shaders.help")); - } - @Inject(method = "processF3", at = @At("RETURN"), cancellable = true) void onProcessF3(int key, CallbackInfoReturnable cir) { if (key == ShaderReload.GLFW_KEY) { cir.setReturnValue(true); + } else if (key == GLFW.GLFW_KEY_Q) { + client.inGameHud.getChatHud().addMessage(Text.translatable("debug.reload_shaders.help")); } }