From ae4ebbb736c64af9ce5036727a4e462dcfa89326 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 20 Dec 2021 10:39:17 +0800 Subject: [PATCH] Add ClientReloadShadersEvent (#149) --- .../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 4009fc68..ffabdc78 100644 --- a/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java +++ b/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java @@ -318,5 +318,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 bafde4bd..e6bd35f8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ archives_base_name_snapshot=architectury-snapshot base_version=2.8 maven_group=dev.architectury -fabric_loader_version=0.11.6 +fabric_loader_version=0.12.8 fabric_api_version=0.34.9+1.17 mod_menu_version=2.0.0-beta.7