From 3083c828436c5be0048c94100e4469e79e1622ab Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 20 Dec 2021 03:39:17 +0100 Subject: [PATCH] Add ClientReloadShadersEvent (#149) Signed-off-by: Max --- .../client/ClientReloadShadersEvent.java | 28 +++++++++++++++++++ .../fabric/client/MixinGameRenderer.java | 16 +++++++++++ .../event/forge/EventHandlerImplClient.java | 5 ++++ gradle.properties | 2 +- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/dev/architectury/event/events/client/ClientReloadShadersEvent.java diff --git a/common/src/main/java/dev/architectury/event/events/client/ClientReloadShadersEvent.java b/common/src/main/java/dev/architectury/event/events/client/ClientReloadShadersEvent.java new file mode 100644 index 00000000..83c63b76 --- /dev/null +++ b/common/src/main/java/dev/architectury/event/events/client/ClientReloadShadersEvent.java @@ -0,0 +1,28 @@ +package dev.architectury.event.events.client; + +import dev.architectury.event.Event; +import dev.architectury.event.EventFactory; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.server.packs.resources.ResourceManager; + +import java.util.function.Consumer; + +@Environment(EnvType.CLIENT) +@FunctionalInterface +public interface ClientReloadShadersEvent { + /** + * Invoked when client reloads shaders. + * + * @see net.minecraft.client.renderer.GameRenderer#reloadShaders(ResourceManager) + */ + Event EVENT = EventFactory.createLoop(); + + void reload(ResourceManager manager, ShadersSink sink); + + @FunctionalInterface + interface ShadersSink { + void registerShader(ShaderInstance shader, Consumer callback); + } +} diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinGameRenderer.java b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinGameRenderer.java index 8a5237f8..0686da1c 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinGameRenderer.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinGameRenderer.java @@ -19,10 +19,15 @@ package dev.architectury.mixin.fabric.client; +import com.mojang.blaze3d.shaders.Program; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.datafixers.util.Pair; import dev.architectury.event.events.client.ClientGuiEvent; +import dev.architectury.event.events.client.ClientReloadShadersEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.server.packs.resources.ResourceManager; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -31,6 +36,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import java.util.List; +import java.util.function.Consumer; + @Mixin(GameRenderer.class) public abstract class MixinGameRenderer { @Shadow @@ -52,4 +60,12 @@ public abstract class MixinGameRenderer { public void renderScreenPost(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, PoseStack matrices) { ClientGuiEvent.RENDER_POST.invoker().render(minecraft.screen, matrices, mouseX, mouseY, minecraft.getDeltaFrameTime()); } + + @Inject(method = "reloadShaders", + at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", ordinal = 0), locals = LocalCapture.CAPTURE_FAILEXCEPTION) + public void reloadShaders(ResourceManager resourceManager, CallbackInfo ci, List programs, List>> shaders) { + ClientReloadShadersEvent.EVENT.invoker().reload(resourceManager, (shader, callback) -> { + shaders.add(Pair.of(shader, callback)); + }); + } } \ No newline at end of file diff --git a/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java b/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java index 77561292..c22f592e 100644 --- a/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java +++ b/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java @@ -323,5 +323,10 @@ public class EventHandlerImplClient { public static void event(FMLClientSetupEvent event) { ClientLifecycleEvent.CLIENT_SETUP.invoker().stateChanged(Minecraft.getInstance()); } + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void event(RegisterShadersEvent event) { + ClientReloadShadersEvent.EVENT.invoker().reload(event.getResourceManager(), event::registerShader); + } } } diff --git a/gradle.properties b/gradle.properties index 026b4acf..b6163010 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ archives_base_name_snapshot=architectury-snapshot base_version=3.2 maven_group=dev.architectury -fabric_loader_version=0.12.5 +fabric_loader_version=0.12.8 fabric_api_version=0.43.1+1.18 mod_menu_version=3.0.0