From 20925252ee5a1c877ce8ed82162dac52a0e900f3 Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Sun, 19 Oct 2025 13:05:41 +1000 Subject: [PATCH 1/3] Initial 1.21.10 work --- build.gradle.kts | 2 +- gradle/libs.versions.toml | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a52dad60..0e454b76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ plugins { allprojects { group = "org.enginehub.worldeditcui" - version = "${rootProject.libs.versions.minecraft.get()}+02-SNAPSHOT" + version = "${rootProject.libs.versions.minecraft.get()}+01-SNAPSHOT" repositories { // mirrors: diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e6dec6c3..6b4f1149 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,23 +3,23 @@ format = { version = "1.1" } [versions] indra = "3.1.3" -minecraft = "1.21.7" -fabricLoader = "0.16.14" -fabricApi = "0.128.1+1.21.7" -modmenu = "15.0.0-beta.3" +minecraft = "1.21.10" +fabricLoader = "0.17.3" +fabricApi = "0.135.0+1.21.10" +modmenu = "16.0.0-rc.1" viafabricplus = "3.3.0" vineflower = "1.10.1" -cuiProtocol = "4.0.1" +cuiProtocol = "4.0.2" [libraries] minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } -parchment = { module = "org.parchmentmc.data:parchment-1.21.5", version = "2025.06.15" } +parchment = { module = "org.parchmentmc.data:parchment-1.21.9", version = "2025.10.05" } fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabricLoader" } fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabricApi" } fabric-api-bom = { module = "net.fabricmc.fabric-api:fabric-api-bom", version.ref = "fabricApi" } fabric-api-networking = { module = "net.fabricmc.fabric-api:fabric-networking-api-v1" } modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" } -neoforge = { module = "net.neoforged:neoforge", version = "21.7.1-beta"} +neoforge = { module = "net.neoforged:neoforge", version = "21.10.9-beta"} viafabricplus-api = { module = "de.florianmichael:ViaFabricPlus", version.ref = "viafabricplus" } viaversion = { module = "com.viaversion:viaversion-common", version = "5.0.5" } vineflower = { module = "org.vineflower:vineflower", version.ref = "vineflower" } @@ -31,7 +31,7 @@ curseForgeGradle = { id = "net.darkhax.curseforgegradle", version = "1.1.26" } indra-git = { id = "net.kyori.indra.git", version.ref = "indra" } indra-spotlessLicenser = { id = "net.kyori.indra.licenser.spotless", version.ref = "indra" } jvmConflictResolution = { id = "org.gradlex.jvm-dependency-conflict-resolution", version = "2.1.2" } -loom = { id = "dev.architectury.loom", version = "1.10.430" } +loom = { id = "dev.architectury.loom", version = "1.11.454" } minotaur = { id = "com.modrinth.minotaur", version = "2.8.7" } publishGithubRelease = { id = "ca.stellardrift.publish-github-release", version = "0.1.0" } shadow = { id = "com.gradleup.shadow", version = "8.3.5" } @@ -39,9 +39,9 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } versions = { id = "com.github.ben-manes.versions", version = "0.51.0" } [libraries.cuiProtocol-fabric] -module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-fabric-mc1.21.7" +module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-fabric-mc1.21.9" version.ref = "cuiProtocol" [libraries.cuiProtocol-neoforge] -module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-neoforge-mc1.21.7" +module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-neoforge-mc1.21.9" version.ref = "cuiProtocol" From 69d094e272d2d1efd99c4a684bf521fbc84b1d0e Mon Sep 17 00:00:00 2001 From: Brandon Woolworth Date: Sat, 8 Nov 2025 21:40:33 -0600 Subject: [PATCH 2/3] Add renderer mixin (#146) * Minor changes * Add render mixin * Updated keybinds to new namespace standard * Added refmap for loom * Fixed unnecessary warnings * Implement START callback for consistency * Removed 7.3.12 from breaking * Formatting and javadoc comments --- worldeditcui-fabric/build.gradle.kts | 4 ++ .../callback/BlockOutlineRenderCallback.java | 44 ++++++++++++ .../callback/WorldRenderCallback.java | 36 ++++++++++ .../fabric/FabricModWorldEditCUI.java | 34 ++++----- .../worldeditcui/gui/CUIConfigList.java | 59 +++++++++------- .../mixin/LevelRendererMixin.java | 70 +++++++++++++++++++ .../render/WecuiRenderContext.java | 41 +++++++++++ .../assets/worldeditcui/lang/de_de.json | 2 +- .../assets/worldeditcui/lang/en_us.json | 2 +- .../assets/worldeditcui/lang/fr_fr.json | 2 +- .../assets/worldeditcui/lang/nl_nl.json | 2 +- .../assets/worldeditcui/lang/ru_ru.json | 2 +- .../assets/worldeditcui/lang/uk_ua.json | 2 +- .../assets/worldeditcui/lang/zh_cn.json | 2 +- .../src/main/resources/fabric.mod.json | 7 +- .../main/resources/worldeditcui.mixins.json | 14 ++++ 16 files changed, 272 insertions(+), 51 deletions(-) create mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java create mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java create mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java create mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java create mode 100644 worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json diff --git a/worldeditcui-fabric/build.gradle.kts b/worldeditcui-fabric/build.gradle.kts index f3dfaa0c..27d25d07 100644 --- a/worldeditcui-fabric/build.gradle.kts +++ b/worldeditcui-fabric/build.gradle.kts @@ -32,6 +32,10 @@ loom { } } + mixin { + defaultRefmapName.set("worldeditcui-refmap.json") + } + accessWidenerPath.set(project.file("src/main/resources/worldeditcui.accesswidener")) } diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java new file mode 100644 index 00000000..8402639b --- /dev/null +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2011-2024 WorldEditCUI team and contributors + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.enginehub.worldeditcui.callback; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.state.BlockOutlineRenderState; + +public interface BlockOutlineRenderCallback { + record Context( + Minecraft client, + Camera camera, + PoseStack poseStack, + GpuBufferSlice projectionMatrixBuffer, + VertexConsumer vertexConsumer, + double camX, double camY, double camZ, + BlockOutlineRenderState state + ) {} + + /** + * Return true to cancel vanilla outline (replace it), false to let vanilla draw after you. + */ + boolean render(Context ctx); + + Event EVENT = + EventFactory.createArrayBacked(BlockOutlineRenderCallback.class, cbs -> ctx -> { + boolean cancel = false; + for (var cb : cbs) cancel |= cb.render(ctx); + return cancel; + }); +} + diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java new file mode 100644 index 00000000..89e95a0f --- /dev/null +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011-2024 WorldEditCUI team and contributors + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.enginehub.worldeditcui.callback; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import org.enginehub.worldeditcui.render.WecuiRenderContext; + +/** + * A re-implementation of the old world render events for Fabric. + * Temporary until Fabric finishes their new rendering API. + */ +public interface WorldRenderCallback { + void render(WecuiRenderContext ctx); + + /** + * Fires at the end of world rendering, after all other rendering is complete. + */ + Event LAST = EventFactory.createArrayBacked(WorldRenderCallback.class, cbs -> ctx -> { + for (var cb : cbs) cb.render(ctx); + }); + + /** + * Fires immediately after the translucent rendering pass. + */ + Event AFTER_TRANSLUCENT = EventFactory.createArrayBacked(WorldRenderCallback.class, cbs -> ctx -> { + for (var cb : cbs) cb.render(ctx); + }); +} diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java index 1d80e5d8..117890e5 100644 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java @@ -9,22 +9,21 @@ */ package org.enginehub.worldeditcui.fabric; -import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import org.enginehub.worldeditcui.WorldEditCUI; +import org.enginehub.worldeditcui.callback.WorldRenderCallback; import org.enginehub.worldeditcui.config.CUIConfiguration; import org.enginehub.worldeditcui.event.listeners.CUIListenerChannel; import org.enginehub.worldeditcui.event.listeners.CUIListenerWorldRender; @@ -33,6 +32,7 @@ import org.enginehub.worldeditcui.render.OptifinePipelineProvider; import org.enginehub.worldeditcui.render.PipelineProvider; import org.enginehub.worldeditcui.render.VanillaPipelineProvider; +import org.enginehub.worldeditcui.render.WecuiRenderContext; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.MixinEnvironment; @@ -49,10 +49,12 @@ public final class FabricModWorldEditCUI implements ModInitializer { public static final String MOD_ID = "worldeditcui"; private static FabricModWorldEditCUI instance; - private static final String KEYBIND_CATEGORY_WECUI = "key.categories.worldeditcui"; - private final KeyMapping keyBindToggleUI = key("toggle", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN); - private final KeyMapping keyBindClearSel = key("clear", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN); - private final KeyMapping keyBindChunkBorder = key("chunk", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN); + private static final KeyMapping.Category KEYBIND_CATEGORY_WECUI + = new KeyMapping.Category(ResourceLocation.fromNamespaceAndPath(MOD_ID, "general")); + + private final KeyMapping keyBindToggleUI = key("toggle", GLFW.GLFW_KEY_UNKNOWN); + private final KeyMapping keyBindClearSel = key("clear", GLFW.GLFW_KEY_UNKNOWN); + private final KeyMapping keyBindChunkBorder = key("chunk", GLFW.GLFW_KEY_UNKNOWN); private static final List RENDER_PIPELINES = List.of( new OptifinePipelineProvider(), @@ -73,12 +75,12 @@ public final class FabricModWorldEditCUI implements ModInitializer { * Register a key binding * * @param name id, will be used as a localization key under {@code key.worldeditcui.} - * @param type type * @param code default value * @return new, registered keybinding in the mod category */ - private static KeyMapping key(final String name, final InputConstants.Type type, final int code) { - return KeyBindingHelper.registerKeyBinding(new KeyMapping("key." + MOD_ID + '.' + name, type, code, KEYBIND_CATEGORY_WECUI)); + private static KeyMapping key(final String name, final int code) { + return KeyBindingHelper.registerKeyBinding( + new KeyMapping("key." + MOD_ID + '.' + name, code, KEYBIND_CATEGORY_WECUI)); } @Override @@ -94,11 +96,11 @@ public void onInitialize() { ClientLifecycleEvents.CLIENT_STARTED.register(this::onGameInitDone); CUINetworking.subscribeToCuiPacket(this::onPluginMessage); ClientPlayConnectionEvents.JOIN.register(this::onJoinGame); - WorldRenderEvents.AFTER_TRANSLUCENT.register(ctx -> { + WorldRenderCallback.AFTER_TRANSLUCENT.register(ctx -> { if (ctx.advancedTranslucency()) { try { RenderSystem.getModelViewStack().pushMatrix(); - RenderSystem.getModelViewStack().mul(ctx.matrixStack().last().pose()); + RenderSystem.getModelViewStack().mul(ctx.poseStack().last().pose()); // RenderSystem.applyModelViewMatrix(); //ctx.worldRenderer().getTranslucentTarget().bindWrite(false); this.onPostRenderEntities(ctx); @@ -108,11 +110,11 @@ public void onInitialize() { } } }); - WorldRenderEvents.LAST.register(ctx -> { + WorldRenderCallback.LAST.register(ctx -> { if (!ctx.advancedTranslucency()) { try { RenderSystem.getModelViewStack().pushMatrix(); - RenderSystem.getModelViewStack().mul(ctx.matrixStack().last().pose()); + RenderSystem.getModelViewStack().mul(ctx.poseStack().last().pose()); // RenderSystem.applyModelViewMatrix(); this.onPostRenderEntities(ctx); } finally { @@ -192,9 +194,9 @@ public void onJoinGame(final ClientPacketListener handler, final PacketSender se this.helo(handler); } - public void onPostRenderEntities(final WorldRenderContext ctx) { + public void onPostRenderEntities(final WecuiRenderContext ctx) { if (this.visible) { - this.worldRenderListener.onRender(ctx.tickCounter().getRealtimeDeltaTicks()); + this.worldRenderListener.onRender(ctx.delta().getRealtimeDeltaTicks()); } } diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java index cda0bae1..d611e003 100644 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java @@ -28,9 +28,11 @@ import net.minecraft.util.FormattedCharSequence; import org.enginehub.worldeditcui.config.CUIConfiguration; import org.enginehub.worldeditcui.config.Colour; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import java.util.List; +import java.util.Objects; public class CUIConfigList extends ContainerObjectSelectionList { private static final Logger LOGGER = LogUtils.getLogger(); @@ -87,21 +89,12 @@ public OnOffEntry(String tag) { } @Override - public void render(GuiGraphics gfx, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { - super.render(gfx, index, top, left, width, height, mouseX, mouseY, isMouseOver, partialTick); - - this.toggleBotton.setX(left + 105); - this.toggleBotton.setY(top); - this.toggleBotton.render(gfx, mouseX, mouseY, partialTick); - } - - @Override - public List children() { + public @NotNull List children() { return ImmutableList.of(this.resetButton, this.toggleBotton); } @Override - public List narratables() { + public @NotNull List narratables() { return ImmutableList.of(this.resetButton, this.toggleBotton); } @@ -109,6 +102,15 @@ public List narratables() { protected void updateFromConfig() { this.toggleBotton.setValue((Boolean)configuration.getConfigArray().get(tag)); } + + @Override + public void renderContent(GuiGraphics gfx, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { + super.renderContent(gfx, mouseX, mouseY, isMouseOver, partialTick); + + this.toggleBotton.setX(getRowLeft() + 105); + this.toggleBotton.setY(getY()); + this.toggleBotton.render(gfx, mouseX, mouseY, partialTick); + } } public class ColorConfigEntry extends ConfigEntry { @@ -127,7 +129,7 @@ public ColorConfigEntry(String tag) { configuration.changeValue(tag, tested); } }); - textField.setFormatter((string, integer) -> { + textField.addFormatter((string, integer) -> { final String colorSource = textField.getValue(); if (colorSource.length() != 9) { return FormattedCharSequence.forward(string, invalidFormat); @@ -155,20 +157,12 @@ public ColorConfigEntry(String tag) { } @Override - public void render(GuiGraphics gfx, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { - super.render(gfx, index, top, left, width, height, mouseX, mouseY, isMouseOver, partialTick); - this.textField.setX(left + 105); - this.textField.setY(top); - this.textField.render(gfx, mouseX, mouseY, partialTick); - } - - @Override - public List children() { + public @NotNull List children() { return ImmutableList.of(this.resetButton, this.textField); } @Override - public List narratables() { + public @NotNull List narratables() { return ImmutableList.of(this.resetButton, this.textField); } @@ -176,6 +170,14 @@ public List narratables() { protected void updateFromConfig() { this.textField.setValue(((Colour)configuration.getConfigArray().get(tag)).hexString()); } + + @Override + public void renderContent(GuiGraphics gfx, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { + super.renderContent(gfx, mouseX, mouseY, isMouseOver, partialTick); + this.textField.setX(getRowLeft() + 105); + this.textField.setY(getY()); + this.textField.render(gfx, mouseX, mouseY, partialTick); + } } public abstract class ConfigEntry extends ContainerObjectSelectionList.Entry { @@ -186,13 +188,14 @@ public abstract class ConfigEntry extends ContainerObjectSelectionList.Entry { + this.resetButton = Button.builder(Component.translatable("controls.reset"), button -> { configuration.changeValue(tag, configuration.getDefaultValue(tag)); updateFromConfig(); }).bounds(0, 0, 50, BUTTON_HEIGHT).build(); - textField = new StringWidget(configuration.getDescription(tag), minecraft.font); - textField.alignLeft(); + + textField = new StringWidget(Objects.requireNonNull(configuration.getDescription(tag)), minecraft.font); + //textField.alignLeft(); Component tooltip = configuration.getTooltip(tag); if (tooltip != null) { textField.setTooltip(Tooltip.create(tooltip)); @@ -200,7 +203,11 @@ public ConfigEntry(String tag) { } @Override - public void render(GuiGraphics gfx, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { + public void renderContent(GuiGraphics gfx, int mouseX, int mouseY, boolean hovered, float partialTick) { + // new API handles entry position internally + int left = this.getX(); + int top = this.getY(); // or getRowTop() + int textLeft = left + 90 - maxNameWidth; this.textField.setX(textLeft); diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java new file mode 100644 index 00000000..9d660a6f --- /dev/null +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2011-2024 WorldEditCUI team and contributors + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.enginehub.worldeditcui.mixin; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import org.enginehub.worldeditcui.callback.WorldRenderCallback; +import org.enginehub.worldeditcui.render.WecuiRenderContext; +import org.joml.Matrix4f; +import org.joml.Vector4f; +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; + +/** + * Mixin to LevelRenderer to inject our world render callbacks. + * Temporary until Fabric finishes their new rendering API. + */ +@Mixin(LevelRenderer.class) +public abstract class LevelRendererMixin { + @Shadow @Final private Minecraft minecraft; + + // LAST (old LAST) + @Inject(method = "renderLevel", at = @At("TAIL")) + private void wecui$last( + GraphicsResourceAllocator gfx, DeltaTracker delta, boolean renderBlockOutline, + Camera camera, Matrix4f modelView, Matrix4f projection, Matrix4f inverseProjection, + GpuBufferSlice slice, Vector4f clearColor, boolean renderSky, CallbackInfo ci + ) { + PoseStack pose = new PoseStack(); + pose.last().pose().set(modelView); + WorldRenderCallback.LAST.invoker() + .render(new WecuiRenderContext(this.minecraft, camera, delta, pose, projection)); + } + + // AFTER_TRANSLUCENT — fires immediately after translucent pass queued/executed + @Inject( + method = "renderLevel", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/LevelRenderer;addParticlesPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;)V" + ) + ) + private void wecui$afterTranslucent( + GraphicsResourceAllocator gfx, DeltaTracker delta, boolean renderBlockOutline, + Camera camera, Matrix4f modelView, Matrix4f projection, Matrix4f inverseProjection, + GpuBufferSlice slice, Vector4f clearColor, boolean renderSky, + CallbackInfo ci + ) { + var pose = new PoseStack(); + pose.last().pose().set(modelView); + WorldRenderCallback.AFTER_TRANSLUCENT.invoker() + .render(new WecuiRenderContext(this.minecraft, camera, delta, pose, projection)); + } +} diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java new file mode 100644 index 00000000..827767ea --- /dev/null +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2011-2024 WorldEditCUI team and contributors + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.enginehub.worldeditcui.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.GraphicsStatus; +import net.minecraft.client.Minecraft; +import org.joml.Matrix4f; + +/** + * Temporary record for render context information used to render elements through + * {@link org.enginehub.worldeditcui.callback.WorldRenderCallback} until Fabric provides + * a proper rendering API. + * + * @param client The Minecraft client instance. + * @param camera The current camera. + * @param delta The delta tracker for interpolation. + * @param poseStack The pose stack for rendering transformations. + * @param projectionMatrix The projection matrix used for rendering. + */ +public record WecuiRenderContext( + Minecraft client, + Camera camera, + DeltaTracker delta, + PoseStack poseStack, + Matrix4f projectionMatrix +) { + public boolean advancedTranslucency() { + var status = client.options.graphicsMode().get(); + return status == GraphicsStatus.FABULOUS; + } +} diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json index 0483f9f7..f4504c79 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json @@ -3,7 +3,7 @@ "key.worldeditcui.toggle": "CUI Sichtbarkeit An/Aus", "key.worldeditcui.clear": "WorldEdit Auswahl aufheben", "key.worldeditcui.chunk": "Chunkgrenzen An/Aus", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Quader Randfarbe", "worldeditcui.color.cuboidedge.tooltip": "Wähle die Farbe für den Rand einer Quader-Region aus", "worldeditcui.color.cuboidgrid": "Quader Rasterfarbe", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json index d2766435..8cb54396 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json @@ -3,7 +3,7 @@ "key.worldeditcui.toggle": "Toggle CUI visibility", "key.worldeditcui.clear": "Clear WorldEdit selection", "key.worldeditcui.chunk": "Toggle Chunk Border", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Cuboid Edge Color", "worldeditcui.color.cuboidedge.tooltip": "Select the color for the edge of a cuboid region", "worldeditcui.color.cuboidgrid": "Cuboid Grid Color", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json index 085eb37d..f1beee7e 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "Options WorldEditCUI", "key.worldeditcui.toggle": "Bascule Visibilité du CUI", "key.worldeditcui.clear": "Effacer la sélection WorldEdit", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Couleur des bordures du Cuboïde", "worldeditcui.color.cuboidgrid": "Couleur de la grille du Cuboïde", "worldeditcui.color.cuboidpoint1": "Couleur du premier point du Cuboïde", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json index a22f4f1c..c4cf90fa 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "WorldEditCUI Opties", "key.worldeditcui.toggle": "CUI zichtbaarheid omschakelen", "key.worldeditcui.clear": "WorldEdit selectie verwijderen", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Randkleur Balk", "worldeditcui.color.cuboidgrid": "Roosterkleur Balk", "worldeditcui.color.cuboidpoint1": "Eerste punt kleur Balk", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json index d614399f..f100b894 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "Настройки WorldEditCUI", "key.worldeditcui.toggle": "Переключить видимость CUI", "key.worldeditcui.clear": "Очистить выделение WorldEdit", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Цвет границ кубоида", "worldeditcui.color.cuboidgrid": "Цвет сетки кубоида", "worldeditcui.color.cuboidpoint1": "Цвет первой точки кубоида", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json index ec6ec3e7..85f27714 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "Налаштування WorldEditCUI", "key.worldeditcui.toggle": "Перемкнути видимість CUI", "key.worldeditcui.clear": "Очистити виділення", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Колір границі кубоїда", "worldeditcui.color.cuboidgrid": "Колір сітки кубоїда", "worldeditcui.color.cuboidpoint1": "Колір першої точки кубоїда", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json index 5548d40b..b73f0a55 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "WorldEditCUI选项", "key.worldeditcui.toggle": "显示/隐藏 WECUI", "key.worldeditcui.clear": "取消WorldEdit选择区域", - "key.categories.worldeditcui": "WorldEditCUI按键设置", + "key.category.worldeditcui.general": "WorldEditCUI按键设置", "worldeditcui.color.cuboidedge": "长方体边缘颜色", "worldeditcui.color.cuboidgrid": "长方体网格颜色", "worldeditcui.color.cuboidpoint1": "长方体第一点颜色", diff --git a/worldeditcui-fabric/src/main/resources/fabric.mod.json b/worldeditcui-fabric/src/main/resources/fabric.mod.json index 8573bacf..c1bfe189 100644 --- a/worldeditcui-fabric/src/main/resources/fabric.mod.json +++ b/worldeditcui-fabric/src/main/resources/fabric.mod.json @@ -33,6 +33,9 @@ "org.enginehub.worldeditcui.fabric.ConfigPanelFactory" ] }, + "mixins": [ + "worldeditcui.mixins.json" + ], "depends": { "worldeditcui_protocol": "*", "fabric-api-base": "*", @@ -43,10 +46,10 @@ "fabric-screen-api-v1": ">=1.0.9", "fabric-resource-loader-v0": ">=0.4.17", "fabric-transitive-access-wideners-v1": "*", - "minecraft": ">=1.21.5" + "minecraft": ">=1.21.9" }, "suggests": { - "worldedit": ">=7.3.12" + "worldedit": ">=7.3.17" }, "breaks": { "worldedit": ["7.3.1", "7.3.2", "7.3.3", "7.3.4-beta-01", "7.3.4", "7.3.5", "7.3.6", "7.3.7", "7.3.8", "7.3.9-beta-01", "7.3.9", "7.3.10-beta-01", "7.3.10", "7.3.11", "7.3.12-beta-01", "7.3.12-beta-02"] diff --git a/worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json b/worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json new file mode 100644 index 00000000..c53fdb27 --- /dev/null +++ b/worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "org.enginehub.worldeditcui.mixin", + "compatibilityLevel": "JAVA_17", + "refmap": "worldeditcui-refmap.json", + "mixins": [], + "client": [ + "LevelRendererMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} From f2a0b15d44853d1e74256495a1cd69ee9be102e9 Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Sun, 9 Nov 2025 15:06:11 +1000 Subject: [PATCH 3/3] Drop the mixin usage --- gradle/libs.versions.toml | 2 +- worldeditcui-fabric/build.gradle.kts | 4 -- .../callback/BlockOutlineRenderCallback.java | 44 ------------ .../callback/WorldRenderCallback.java | 36 ---------- .../fabric/FabricModWorldEditCUI.java | 47 +++++-------- .../mixin/LevelRendererMixin.java | 70 ------------------- .../render/WecuiRenderContext.java | 41 ----------- .../src/main/resources/fabric.mod.json | 3 - .../main/resources/worldeditcui.mixins.json | 14 ---- 9 files changed, 20 insertions(+), 241 deletions(-) delete mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java delete mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java delete mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java delete mode 100644 worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java delete mode 100644 worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6b4f1149..1685665d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ format = { version = "1.1" } indra = "3.1.3" minecraft = "1.21.10" fabricLoader = "0.17.3" -fabricApi = "0.135.0+1.21.10" +fabricApi = "0.138.0+1.21.10" modmenu = "16.0.0-rc.1" viafabricplus = "3.3.0" vineflower = "1.10.1" diff --git a/worldeditcui-fabric/build.gradle.kts b/worldeditcui-fabric/build.gradle.kts index 27d25d07..f3dfaa0c 100644 --- a/worldeditcui-fabric/build.gradle.kts +++ b/worldeditcui-fabric/build.gradle.kts @@ -32,10 +32,6 @@ loom { } } - mixin { - defaultRefmapName.set("worldeditcui-refmap.json") - } - accessWidenerPath.set(project.file("src/main/resources/worldeditcui.accesswidener")) } diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java deleted file mode 100644 index 8402639b..00000000 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/BlockOutlineRenderCallback.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2011-2024 WorldEditCUI team and contributors - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.enginehub.worldeditcui.callback; - -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.state.BlockOutlineRenderState; - -public interface BlockOutlineRenderCallback { - record Context( - Minecraft client, - Camera camera, - PoseStack poseStack, - GpuBufferSlice projectionMatrixBuffer, - VertexConsumer vertexConsumer, - double camX, double camY, double camZ, - BlockOutlineRenderState state - ) {} - - /** - * Return true to cancel vanilla outline (replace it), false to let vanilla draw after you. - */ - boolean render(Context ctx); - - Event EVENT = - EventFactory.createArrayBacked(BlockOutlineRenderCallback.class, cbs -> ctx -> { - boolean cancel = false; - for (var cb : cbs) cancel |= cb.render(ctx); - return cancel; - }); -} - diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java deleted file mode 100644 index 89e95a0f..00000000 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/callback/WorldRenderCallback.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2011-2024 WorldEditCUI team and contributors - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.enginehub.worldeditcui.callback; - -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import org.enginehub.worldeditcui.render.WecuiRenderContext; - -/** - * A re-implementation of the old world render events for Fabric. - * Temporary until Fabric finishes their new rendering API. - */ -public interface WorldRenderCallback { - void render(WecuiRenderContext ctx); - - /** - * Fires at the end of world rendering, after all other rendering is complete. - */ - Event LAST = EventFactory.createArrayBacked(WorldRenderCallback.class, cbs -> ctx -> { - for (var cb : cbs) cb.render(ctx); - }); - - /** - * Fires immediately after the translucent rendering pass. - */ - Event AFTER_TRANSLUCENT = EventFactory.createArrayBacked(WorldRenderCallback.class, cbs -> ctx -> { - for (var cb : cbs) cb.render(ctx); - }); -} diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java index 117890e5..4aa1a01c 100644 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java @@ -15,6 +15,8 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; +import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderEvents; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -23,7 +25,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import org.enginehub.worldeditcui.WorldEditCUI; -import org.enginehub.worldeditcui.callback.WorldRenderCallback; import org.enginehub.worldeditcui.config.CUIConfiguration; import org.enginehub.worldeditcui.event.listeners.CUIListenerChannel; import org.enginehub.worldeditcui.event.listeners.CUIListenerWorldRender; @@ -32,7 +33,6 @@ import org.enginehub.worldeditcui.render.OptifinePipelineProvider; import org.enginehub.worldeditcui.render.PipelineProvider; import org.enginehub.worldeditcui.render.VanillaPipelineProvider; -import org.enginehub.worldeditcui.render.WecuiRenderContext; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.MixinEnvironment; @@ -71,6 +71,8 @@ public final class FabricModWorldEditCUI implements ModInitializer { private boolean visible = true; private int delayedHelo = 0; + private float lastPartialTicks = 0.0f; + /** * Register a key binding * @@ -96,31 +98,20 @@ public void onInitialize() { ClientLifecycleEvents.CLIENT_STARTED.register(this::onGameInitDone); CUINetworking.subscribeToCuiPacket(this::onPluginMessage); ClientPlayConnectionEvents.JOIN.register(this::onJoinGame); - WorldRenderCallback.AFTER_TRANSLUCENT.register(ctx -> { - if (ctx.advancedTranslucency()) { - try { - RenderSystem.getModelViewStack().pushMatrix(); - RenderSystem.getModelViewStack().mul(ctx.poseStack().last().pose()); - // RenderSystem.applyModelViewMatrix(); - //ctx.worldRenderer().getTranslucentTarget().bindWrite(false); - this.onPostRenderEntities(ctx); - } finally { - //Minecraft.getInstance().getMainRenderTarget().bindWrite(false); - RenderSystem.getModelViewStack().popMatrix(); - } - } + WorldRenderEvents.END_EXTRACTION.register(ctx -> { + // MC now handles this separately to the actual render, due to it occurring across threads. + // We need to store this for later use during actual render. + lastPartialTicks = ctx.tickCounter().getRealtimeDeltaTicks(); }); - WorldRenderCallback.LAST.register(ctx -> { - if (!ctx.advancedTranslucency()) { - try { - RenderSystem.getModelViewStack().pushMatrix(); - RenderSystem.getModelViewStack().mul(ctx.poseStack().last().pose()); - // RenderSystem.applyModelViewMatrix(); - this.onPostRenderEntities(ctx); - } finally { - RenderSystem.getModelViewStack().popMatrix(); - // RenderSystem.applyModelViewMatrix(); - } + WorldRenderEvents.END_MAIN.register(ctx -> { + try { + RenderSystem.getModelViewStack().pushMatrix(); + RenderSystem.getModelViewStack().mul(ctx.matrices().last().pose()); + // RenderSystem.applyModelViewMatrix(); + this.onPostRenderEntities(ctx); + } finally { + RenderSystem.getModelViewStack().popMatrix(); + // RenderSystem.applyModelViewMatrix(); } }); } @@ -194,9 +185,9 @@ public void onJoinGame(final ClientPacketListener handler, final PacketSender se this.helo(handler); } - public void onPostRenderEntities(final WecuiRenderContext ctx) { + public void onPostRenderEntities(final WorldRenderContext ctx) { if (this.visible) { - this.worldRenderListener.onRender(ctx.delta().getRealtimeDeltaTicks()); + this.worldRenderListener.onRender(lastPartialTicks); } } diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java deleted file mode 100644 index 9d660a6f..00000000 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/mixin/LevelRendererMixin.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2011-2024 WorldEditCUI team and contributors - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.enginehub.worldeditcui.mixin; - -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import com.mojang.blaze3d.resource.GraphicsResourceAllocator; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Camera; -import net.minecraft.client.DeltaTracker; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; -import org.enginehub.worldeditcui.callback.WorldRenderCallback; -import org.enginehub.worldeditcui.render.WecuiRenderContext; -import org.joml.Matrix4f; -import org.joml.Vector4f; -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; - -/** - * Mixin to LevelRenderer to inject our world render callbacks. - * Temporary until Fabric finishes their new rendering API. - */ -@Mixin(LevelRenderer.class) -public abstract class LevelRendererMixin { - @Shadow @Final private Minecraft minecraft; - - // LAST (old LAST) - @Inject(method = "renderLevel", at = @At("TAIL")) - private void wecui$last( - GraphicsResourceAllocator gfx, DeltaTracker delta, boolean renderBlockOutline, - Camera camera, Matrix4f modelView, Matrix4f projection, Matrix4f inverseProjection, - GpuBufferSlice slice, Vector4f clearColor, boolean renderSky, CallbackInfo ci - ) { - PoseStack pose = new PoseStack(); - pose.last().pose().set(modelView); - WorldRenderCallback.LAST.invoker() - .render(new WecuiRenderContext(this.minecraft, camera, delta, pose, projection)); - } - - // AFTER_TRANSLUCENT — fires immediately after translucent pass queued/executed - @Inject( - method = "renderLevel", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/LevelRenderer;addParticlesPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;)V" - ) - ) - private void wecui$afterTranslucent( - GraphicsResourceAllocator gfx, DeltaTracker delta, boolean renderBlockOutline, - Camera camera, Matrix4f modelView, Matrix4f projection, Matrix4f inverseProjection, - GpuBufferSlice slice, Vector4f clearColor, boolean renderSky, - CallbackInfo ci - ) { - var pose = new PoseStack(); - pose.last().pose().set(modelView); - WorldRenderCallback.AFTER_TRANSLUCENT.invoker() - .render(new WecuiRenderContext(this.minecraft, camera, delta, pose, projection)); - } -} diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java deleted file mode 100644 index 827767ea..00000000 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/WecuiRenderContext.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2011-2024 WorldEditCUI team and contributors - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.enginehub.worldeditcui.render; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Camera; -import net.minecraft.client.DeltaTracker; -import net.minecraft.client.GraphicsStatus; -import net.minecraft.client.Minecraft; -import org.joml.Matrix4f; - -/** - * Temporary record for render context information used to render elements through - * {@link org.enginehub.worldeditcui.callback.WorldRenderCallback} until Fabric provides - * a proper rendering API. - * - * @param client The Minecraft client instance. - * @param camera The current camera. - * @param delta The delta tracker for interpolation. - * @param poseStack The pose stack for rendering transformations. - * @param projectionMatrix The projection matrix used for rendering. - */ -public record WecuiRenderContext( - Minecraft client, - Camera camera, - DeltaTracker delta, - PoseStack poseStack, - Matrix4f projectionMatrix -) { - public boolean advancedTranslucency() { - var status = client.options.graphicsMode().get(); - return status == GraphicsStatus.FABULOUS; - } -} diff --git a/worldeditcui-fabric/src/main/resources/fabric.mod.json b/worldeditcui-fabric/src/main/resources/fabric.mod.json index c1bfe189..579d7190 100644 --- a/worldeditcui-fabric/src/main/resources/fabric.mod.json +++ b/worldeditcui-fabric/src/main/resources/fabric.mod.json @@ -33,9 +33,6 @@ "org.enginehub.worldeditcui.fabric.ConfigPanelFactory" ] }, - "mixins": [ - "worldeditcui.mixins.json" - ], "depends": { "worldeditcui_protocol": "*", "fabric-api-base": "*", diff --git a/worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json b/worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json deleted file mode 100644 index c53fdb27..00000000 --- a/worldeditcui-fabric/src/main/resources/worldeditcui.mixins.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "org.enginehub.worldeditcui.mixin", - "compatibilityLevel": "JAVA_17", - "refmap": "worldeditcui-refmap.json", - "mixins": [], - "client": [ - "LevelRendererMixin" - ], - "injectors": { - "defaultRequire": 1 - } -}