mirror of
https://github.com/architectury/architectury-api.git
synced 2026-03-28 11:57:01 -05:00
Add ClientReloadShadersEvent (#149)
This commit is contained in:
@@ -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<ClientReloadShadersEvent> EVENT = EventFactory.createLoop();
|
||||
|
||||
void reload(ResourceManager manager, ShadersSink sink);
|
||||
|
||||
@FunctionalInterface
|
||||
interface ShadersSink {
|
||||
void registerShader(ShaderInstance shader, Consumer<ShaderInstance> callback);
|
||||
}
|
||||
}
|
||||
@@ -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<Program> programs, List<Pair<ShaderInstance, Consumer<ShaderInstance>>> shaders) {
|
||||
ClientReloadShadersEvent.EVENT.invoker().reload(resourceManager, (shader, callback) -> {
|
||||
shaders.add(Pair.of(shader, callback));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user