Add ClientReloadShadersEvent (#149)

This commit is contained in:
shedaniel
2021-12-20 10:39:17 +08:00
committed by GitHub
parent 83a4ca436e
commit ae4ebbb736
4 changed files with 50 additions and 1 deletions

View File

@@ -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);
}
}

View File

@@ -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));
});
}
}

View File

@@ -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);
}
}
}

View File

@@ -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