diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinGameRenderer013.java b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinGameRenderer013.java new file mode 100644 index 00000000..0499aa56 --- /dev/null +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinGameRenderer013.java @@ -0,0 +1,73 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.mixin.fabric.client; + +import com.mojang.blaze3d.platform.Window; +import com.mojang.blaze3d.shaders.Program; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.datafixers.util.Pair; +import com.mojang.math.Matrix4f; +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; +import org.spongepowered.asm.mixin.injection.At; +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(value = GameRenderer.class, priority = 1100) +public abstract class MixinGameRenderer013 { + @Shadow + @Final + private Minecraft minecraft; + + @Inject(method = "render(FJZ)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;render(Lcom/mojang/blaze3d/vertex/PoseStack;IIF)V", + ordinal = 0), locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true) + public void renderScreenPre(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window, Matrix4f matrix, PoseStack matrices) { + if (ClientGuiEvent.RENDER_PRE.invoker().render(minecraft.screen, matrices, mouseX, mouseY, minecraft.getDeltaFrameTime()).isFalse()) { + ci.cancel(); + } + } + + @Inject(method = "render(FJZ)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;render(Lcom/mojang/blaze3d/vertex/PoseStack;IIF)V", + shift = At.Shift.AFTER, ordinal = 0), locals = LocalCapture.CAPTURE_FAILEXCEPTION) + public void renderScreenPost(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window, Matrix4f matrix, 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/fabric/src/main/java/dev/architectury/plugin/fabric/ArchitecturyMixinPlugin.java b/fabric/src/main/java/dev/architectury/plugin/fabric/ArchitecturyMixinPlugin.java index 46e486d2..a4bdf3d7 100644 --- a/fabric/src/main/java/dev/architectury/plugin/fabric/ArchitecturyMixinPlugin.java +++ b/fabric/src/main/java/dev/architectury/plugin/fabric/ArchitecturyMixinPlugin.java @@ -19,7 +19,7 @@ package dev.architectury.plugin.fabric; -import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.*; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -38,10 +38,29 @@ public class ArchitecturyMixinPlugin implements IMixinConfigPlugin { return null; } + private boolean isLoader013() { + ModContainer fabricLoader = FabricLoader.getInstance().getModContainer("fabricloader") + .orElseThrow(() -> new IllegalStateException("Where is fabricloader?")); + Version version = fabricLoader.getMetadata().getVersion(); + if (version instanceof SemanticVersion) { + try { + return version.compareTo(SemanticVersion.parse("0.13-")) >= 0; + } catch (VersionParsingException e) { + throw new IllegalStateException("Failed to parse version", e); + } + } + System.err.println("FabricLoader is not a SemanticVersion, cannot determine if it is >= 0.13"); + return true; + } + @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { if ("dev.architectury.mixin.fabric.client.MixinEffectInstance".equals(mixinClassName)) { return !FabricLoader.getInstance().isModLoaded("satin"); + } else if ("dev.architectury.mixin.fabric.client.MixinGameRenderer".equals(mixinClassName)) { + return !isLoader013(); + } else if ("dev.architectury.mixin.fabric.client.MixinGameRenderer013".equals(mixinClassName)) { + return isLoader013(); } return true; } diff --git a/fabric/src/main/resources/architectury.mixins.json b/fabric/src/main/resources/architectury.mixins.json index 4738cb6c..41c61a3d 100644 --- a/fabric/src/main/resources/architectury.mixins.json +++ b/fabric/src/main/resources/architectury.mixins.json @@ -10,6 +10,7 @@ "client.MixinDebugScreenOverlay", "client.MixinEffectInstance", "client.MixinGameRenderer", + "client.MixinGameRenderer013", "client.MixinIntegratedServer", "client.MixinKeyboardHandler", "client.MixinMinecraft", diff --git a/forge/src/main/java/dev/architectury/mixin/forge/MixinMinecraft.java b/forge/src/main/java/dev/architectury/mixin/forge/MixinMinecraft.java index d98ec332..562414b1 100644 --- a/forge/src/main/java/dev/architectury/mixin/forge/MixinMinecraft.java +++ b/forge/src/main/java/dev/architectury/mixin/forge/MixinMinecraft.java @@ -1,3 +1,22 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + package dev.architectury.mixin.forge; import dev.architectury.event.events.client.ClientLifecycleEvent;