From 975fc3148df63820b68d013d2c731da4546f48e9 Mon Sep 17 00:00:00 2001 From: gniftygnome Date: Thu, 8 Feb 2024 02:12:43 -0800 Subject: [PATCH] Review and update mixins. - Improve mixin compatibility * Review and update mixins where needed * Use MixinExtras mixins where beneficial * Restore the outline "feature" --- .../vistas/mixin/GameRendererMixin.java | 1 - .../vistas/mixin/LogoDrawerMixin.java | 63 ++++++++++++------- .../vistas/mixin/MinecraftClientMixin.java | 10 ++- .../vistas/mixin/SplashTextRendererMixin.java | 31 +++++---- .../SplashTextResourceSupplierMixin.java | 29 ++++----- .../vistas/mixin/TitleScreenMixin.java | 24 ++++--- .../resources/assets/vistas/panoramas.json | 2 +- 7 files changed, 95 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/terraformersmc/vistas/mixin/GameRendererMixin.java b/src/main/java/com/terraformersmc/vistas/mixin/GameRendererMixin.java index 04d8339..477b1ea 100644 --- a/src/main/java/com/terraformersmc/vistas/mixin/GameRendererMixin.java +++ b/src/main/java/com/terraformersmc/vistas/mixin/GameRendererMixin.java @@ -165,5 +165,4 @@ private void takeScreenshot(Path folder, int id, Framebuffer buffer) { @Shadow public abstract void setRenderHand(boolean renderHand); - } diff --git a/src/main/java/com/terraformersmc/vistas/mixin/LogoDrawerMixin.java b/src/main/java/com/terraformersmc/vistas/mixin/LogoDrawerMixin.java index fa2e82c..87d7914 100644 --- a/src/main/java/com/terraformersmc/vistas/mixin/LogoDrawerMixin.java +++ b/src/main/java/com/terraformersmc/vistas/mixin/LogoDrawerMixin.java @@ -1,5 +1,9 @@ package com.terraformersmc.vistas.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import com.terraformersmc.vistas.Vistas; import com.terraformersmc.vistas.panorama.LogoControl; import com.terraformersmc.vistas.panorama.Panorama; @@ -17,7 +21,8 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.function.BiConsumer; @Environment(EnvType.CLIENT) @Mixin(LogoDrawer.class) @@ -29,7 +34,7 @@ public abstract class LogoDrawerMixin implements LogoDrawerAccessor { @Unique private boolean isVistas = false; - @Redirect( + @WrapOperation( method = "draw(Lnet/minecraft/client/gui/DrawContext;IFI)V", at = @At( value = "INVOKE", @@ -37,7 +42,8 @@ public abstract class LogoDrawerMixin implements LogoDrawerAccessor { ordinal = 0 ) ) - private void vistas$render$drawOutline(DrawContext context, Identifier texture, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight, DrawContext _context, int screenWidth) { + @SuppressWarnings("unused") + private void vistas$render$drawOutline(DrawContext instance, Identifier texture, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight, Operation operation, DrawContext context, int screenWidth) { Panorama panorama = VistasTitle.CURRENT.getValue(); LogoControl logo = panorama.getLogoControl(); MatrixStack matrices = context.getMatrices(); @@ -50,35 +56,36 @@ public abstract class LogoDrawerMixin implements LogoDrawerAccessor { matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees((float) logo.getLogoRot())); matrices.translate(-(screenWidth / 2.0D), -(y * 2.0D) + (y / 2.0D), 0.0D); - // TODO: Outline rendering no longer works if (!logo.getLogoId().equals(LOGO_TEXTURE) || this.isVistas) { Identifier logoTexture = this.isVistas ? Vistas.id("textures/vistas_logo.png") : logo.getLogoId(); int rx = (screenWidth / 2) - 256; int ry = 52 - 256; -// BiConsumer render = (ix, iy) -> Screen.drawTexture(matrices, ix, iy, 0, 0, 0, 512, 512, 512, 512); -// if (logo.isOutlined()) { -// DrawableHelper.drawWithOutline(rx, ry, render); -// } else { -// render.accept(rx, ry); -// } + BiConsumer render = (ix, iy) -> context.drawTexture(logoTexture, ix, iy, 0, 0, 0, 512, 512, 512, 512); + + if (logo.isOutlined()) { + vistas$drawWithOutline(rx, ry, render); + } else { + render.accept(rx, ry); + } - context.drawTexture(logoTexture, rx, ry, 0, 0, 512, 512, 512, 512, 512); + operation.call(instance, logoTexture, rx, ry, 0, 0, 512, 512, 512, 512, 512); } else { -// if (logo.isOutlined()) { -// DrawableHelper.drawWithOutline(x, y, renderAction); -// } else { -// renderAction.accept(x, y); -// } - - // TODO: This mixin would be better as a WrapOperation - context.drawTexture(logo.getLogoId(), x, y, u, v, width, height, textureWidth, textureHeight); + BiConsumer render = (ix, iy) -> context.drawTexture(logo.getLogoId(), ix, iy, u, v, width, height, textureWidth, textureHeight); + + if (logo.isOutlined()) { + vistas$drawWithOutline(x, y, render); + } else { + render.accept(x, y); + } + + operation.call(instance, logo.getLogoId(), x, y, u, v, width, height, textureWidth, textureHeight); } matrices.pop(); } - @Redirect( + @WrapOperation( method = "draw(Lnet/minecraft/client/gui/DrawContext;IFI)V", at = @At( value = "INVOKE", @@ -86,7 +93,8 @@ public abstract class LogoDrawerMixin implements LogoDrawerAccessor { ordinal = 1 ) ) - private void vistas$render(DrawContext context, Identifier texture, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight, DrawContext _context, int screenWidth) { + @SuppressWarnings("unused") + private void vistas$render(DrawContext instance, Identifier texture, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight, Operation operation, DrawContext context, int screenWidth) { Panorama panorama = VistasTitle.CURRENT.getValue(); LogoControl logo = panorama.getLogoControl(); MatrixStack matrices = context.getMatrices(); @@ -103,7 +111,7 @@ public abstract class LogoDrawerMixin implements LogoDrawerAccessor { matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees((float) logo.getLogoRot())); matrices.translate(-(screenWidth / 2.0D), -45, 0.0D); - context.drawTexture(texture, x, y, u, v, width, height, textureWidth, textureHeight); + operation.call(instance, texture, x, y, u, v, width, height, textureWidth, textureHeight); matrices.pop(); } @@ -112,4 +120,15 @@ public abstract class LogoDrawerMixin implements LogoDrawerAccessor { public void vistas$setIsVistas(boolean value) { this.isVistas = value; } + + @Unique + private static void vistas$drawWithOutline(int x, int y, BiConsumer renderAction) { + RenderSystem.blendFuncSeparate(GlStateManager.SrcFactor.ZERO, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA); + renderAction.accept(x + 1, y); + renderAction.accept(x - 1, y); + renderAction.accept(x, y + 1); + renderAction.accept(x, y - 1); + RenderSystem.defaultBlendFunc(); + renderAction.accept(x, y); + } } diff --git a/src/main/java/com/terraformersmc/vistas/mixin/MinecraftClientMixin.java b/src/main/java/com/terraformersmc/vistas/mixin/MinecraftClientMixin.java index baf56d5..5cdb4e3 100644 --- a/src/main/java/com/terraformersmc/vistas/mixin/MinecraftClientMixin.java +++ b/src/main/java/com/terraformersmc/vistas/mixin/MinecraftClientMixin.java @@ -35,7 +35,15 @@ public class MinecraftClientMixin implements MinecraftClientAccess { @Shadow public ClientPlayerEntity player; - @Inject(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/resource/ReloadableResourceManagerImpl;registerReloader(Lnet/minecraft/resource/ResourceReloader;)V", ordinal = 2, shift = Shift.AFTER)) + @Inject( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/resource/ReloadableResourceManagerImpl;registerReloader(Lnet/minecraft/resource/ResourceReloader;)V", + ordinal = 2, + shift = Shift.AFTER + ) + ) private void vistas$init$registerPanoramaReloader(RunArgs args, CallbackInfo ci) { this.panoramaResourceReloader = new PanoramaResourceReloader(); this.resourceManager.registerReloader(panoramaResourceReloader); diff --git a/src/main/java/com/terraformersmc/vistas/mixin/SplashTextRendererMixin.java b/src/main/java/com/terraformersmc/vistas/mixin/SplashTextRendererMixin.java index 6559788..9f818d0 100644 --- a/src/main/java/com/terraformersmc/vistas/mixin/SplashTextRendererMixin.java +++ b/src/main/java/com/terraformersmc/vistas/mixin/SplashTextRendererMixin.java @@ -1,32 +1,37 @@ package com.terraformersmc.vistas.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.terraformersmc.vistas.panorama.LogoControl; import com.terraformersmc.vistas.panorama.Panorama; import com.terraformersmc.vistas.title.VistasTitle; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.SplashTextRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.RotationAxis; +import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Environment(EnvType.CLIENT) @Mixin(SplashTextRenderer.class) public abstract class SplashTextRendererMixin { - @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/RotationAxis;rotationDegrees(F)Lorg/joml/Quaternionf;")) - private float vistas$render$changeAngle(float in) { - return (float) VistasTitle.CURRENT.getValue().getLogoControl().getSplashRot(); - } - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;multiply(Lorg/joml/Quaternionf;)V", shift = At.Shift.BEFORE)) - private void vistas$render(DrawContext context, int screenWidth, TextRenderer textRenderer, int alpha, CallbackInfo ci) { + @WrapOperation( + method = "render", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/util/math/MatrixStack;multiply(Lorg/joml/Quaternionf;)V" + ) + ) + @SuppressWarnings("unused") + private void vistas$render(MatrixStack instance, Quaternionf quaternion, Operation operation) { Panorama panorama = VistasTitle.CURRENT.getValue(); LogoControl logo = panorama.getLogoControl(); - context.getMatrices().translate(logo.getSplashX(), logo.getSplashY(), 0.0D); + float rotation = (float) VistasTitle.CURRENT.getValue().getLogoControl().getSplashRot(); + + instance.translate(logo.getSplashX(), logo.getSplashY(), 0.0D); + operation.call(instance, RotationAxis.POSITIVE_Z.rotationDegrees(rotation)); } } diff --git a/src/main/java/com/terraformersmc/vistas/mixin/SplashTextResourceSupplierMixin.java b/src/main/java/com/terraformersmc/vistas/mixin/SplashTextResourceSupplierMixin.java index 1427e6a..8577096 100644 --- a/src/main/java/com/terraformersmc/vistas/mixin/SplashTextResourceSupplierMixin.java +++ b/src/main/java/com/terraformersmc/vistas/mixin/SplashTextResourceSupplierMixin.java @@ -1,5 +1,6 @@ package com.terraformersmc.vistas.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.terraformersmc.vistas.access.MinecraftClientAccess; import com.terraformersmc.vistas.resource.PanoramaResourceReloader; import com.terraformersmc.vistas.title.VistasTitle; @@ -11,29 +12,29 @@ import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.Slice; @Environment(EnvType.CLIENT) @Mixin(SplashTextResourceSupplier.class) public class SplashTextResourceSupplierMixin { - @Inject(method = "get", at = @At(value = "RETURN", ordinal = 4), cancellable = true) - private void vistas$get$4(CallbackInfoReturnable ci) { - vistas$get(ci); - } - - @Inject(method = "get", at = @At(value = "RETURN", ordinal = 5), cancellable = true) - private void vistas$get$5(CallbackInfoReturnable ci) { - vistas$get(ci); - } - - private void vistas$get(CallbackInfoReturnable ci) { + @ModifyReturnValue( + method = "get", + at = @At(value = "RETURN"), + slice = @Slice( + from = @At(value = "INVOKE", target = "Ljava/util/List;isEmpty()Z"), + to = @At(value = "TAIL") + ) + ) + @SuppressWarnings("unused") + private SplashTextRenderer vistas$getRenderer(SplashTextRenderer original) { MinecraftClient client = MinecraftClient.getInstance(); PanoramaResourceReloader resourceReloader = ((MinecraftClientAccess) client).getPanoramaResourceReloader(); Identifier panoramaId = VistasTitle.PANORAMAS_INVERT.get(VistasTitle.CURRENT.getValue()); if (resourceReloader != null && panoramaId != null) { - ci.setReturnValue(new SplashTextRenderer(resourceReloader.get())); + return new SplashTextRenderer(resourceReloader.get()); } + + return original; } } diff --git a/src/main/java/com/terraformersmc/vistas/mixin/TitleScreenMixin.java b/src/main/java/com/terraformersmc/vistas/mixin/TitleScreenMixin.java index 3252026..ce7510c 100644 --- a/src/main/java/com/terraformersmc/vistas/mixin/TitleScreenMixin.java +++ b/src/main/java/com/terraformersmc/vistas/mixin/TitleScreenMixin.java @@ -1,5 +1,7 @@ package com.terraformersmc.vistas.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.terraformersmc.vistas.Vistas; @@ -26,10 +28,8 @@ import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; 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.Random; @@ -74,31 +74,29 @@ protected TitleScreenMixin(Text title) { } } - @Inject( + @WrapOperation( method = "render", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/gui/RotatingCubeMapRenderer;render(FF)V", - shift = Shift.BEFORE - ), - locals = LocalCapture.CAPTURE_FAILHARD + target = "Lnet/minecraft/client/gui/RotatingCubeMapRenderer;render(FF)V" + ) ) - private void vistas$render(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci, float f) { + @SuppressWarnings("unused") + private void vistas$render(RotatingCubeMapRenderer instance, float delta, float fade, Operation operation, DrawContext context) { assert this.client != null; PanoramaRenderer.time += delta; VistasTitle.CURRENT.getValue().getCubemaps().forEach((cubemap) -> { PanoramaRenderer panoramaRenderer = new PanoramaRenderer(cubemap); - panoramaRenderer.render(delta, MathHelper.clamp(f, 0.0F, 1.0F)); + panoramaRenderer.render(delta, fade); Identifier overlayId = new Identifier(panoramaRenderer.getCubemap().getCubemapId() + "_overlay.png"); if (this.client.getResourceManager().getResource(overlayId).isPresent()) { - // TODO: Some of these functions may be redundant. -// RenderSystem.setShader(GameRenderer::getPositionTexProgram); -// RenderSystem.setShaderTexture(0, overlayId); RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.doBackgroundFade ? (float) MathHelper.ceil(MathHelper.clamp(f, 0.0F, 1.0F)) : 1.0F); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.doBackgroundFade ? (float) MathHelper.ceil(fade) : 1.0F); context.drawTexture(overlayId, 0, 0, this.width, this.height, 0.0F, 0.0F, 16, 128, 16, 128); } }); + + operation.call(instance, delta, fade); } } diff --git a/src/main/resources/assets/vistas/panoramas.json b/src/main/resources/assets/vistas/panoramas.json index 4a47312..f81aea9 100644 --- a/src/main/resources/assets/vistas/panoramas.json +++ b/src/main/resources/assets/vistas/panoramas.json @@ -13,7 +13,7 @@ "logoX": 0.0, "logoY": 0.0, "logoRot": 0.0, - "outlined": true, + "outlined": false, "splashX": 0.0, "splashY": 0.0, "splashRot": -20.0,