Skip to content

Commit 63e6cf4

Browse files
committed
Fix rendering on top with iris (FAPI event injects into wrong place)
1 parent 20f64e0 commit 63e6cf4

File tree

5 files changed

+74
-5
lines changed

5 files changed

+74
-5
lines changed

src/main/java/net/earthcomputer/clientcommands/command/WaypointCommand.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
import com.mojang.logging.LogUtils;
1111
import com.mojang.serialization.Dynamic;
1212
import net.earthcomputer.clientcommands.ClientCommands;
13+
import net.earthcomputer.clientcommands.event.MoreWorldRenderEvents;
1314
import net.earthcomputer.clientcommands.render.RenderQueue;
1415
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
1516
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
16-
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
1717
import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry;
1818
import net.minecraft.ChatFormatting;
1919
import net.minecraft.SharedConstants;
@@ -283,7 +283,7 @@ private static Component formatCoordinates(BlockPos waypoint) {
283283

284284
public static void registerEvents() {
285285
HudElementRegistry.addLast(HUD_LAYER_ID, WaypointCommand::renderWaypointLabels);
286-
WorldRenderEvents.AFTER_ENTITIES.register(WaypointCommand::renderWaypointBoxes);
286+
MoreWorldRenderEvents.END_MAIN_PASS.register(WaypointCommand::renderWaypointBoxes);
287287
}
288288

289289
private static void renderWaypointLabels(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
@@ -413,7 +413,7 @@ private static void renderWaypointBoxes(WorldRenderContext context) {
413413
Font font = Minecraft.getInstance().font;
414414
int width = font.width(waypointName) / 2;
415415
int backgroundColour = (int) (Minecraft.getInstance().options.getBackgroundOpacity(0.25f) * 255.0f) << 24;
416-
font.drawInBatch(waypointName, -width, 0, 0xFFFFFF, false, stack.last().pose(), context.consumers(), Font.DisplayMode.SEE_THROUGH, backgroundColour, LightTexture.FULL_SKY);
416+
font.drawInBatch(waypointName, -width, 0, 0xFFFFFFFF, false, stack.last().pose(), context.consumers(), Font.DisplayMode.SEE_THROUGH, backgroundColour, LightTexture.FULL_SKY);
417417

418418
stack.popPose();
419419
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package net.earthcomputer.clientcommands.event;
2+
3+
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
4+
import net.fabricmc.fabric.api.event.Event;
5+
import net.fabricmc.fabric.api.event.EventFactory;
6+
7+
public final class MoreWorldRenderEvents {
8+
private MoreWorldRenderEvents() {
9+
}
10+
11+
public static final Event<EndMainPass> END_MAIN_PASS = EventFactory.createArrayBacked(EndMainPass.class, callbacks -> context -> {
12+
for (EndMainPass callback : callbacks) {
13+
callback.endMainPass(context);
14+
}
15+
});
16+
17+
@FunctionalInterface
18+
public interface EndMainPass {
19+
void endMainPass(WorldRenderContext context);
20+
}
21+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package net.earthcomputer.clientcommands.mixin.events;
2+
3+
import net.earthcomputer.clientcommands.event.MoreWorldRenderEvents;
4+
import net.earthcomputer.clientcommands.render.RenderQueue;
5+
import net.minecraft.client.renderer.LevelRenderer;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
10+
11+
@Mixin(LevelRenderer.class)
12+
public class LevelRendererMixin {
13+
@Inject(method = "lambda$addMainPass$2", at = @At(value = "INVOKE:LAST", target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V"))
14+
private void onEndMainPass(CallbackInfo ci) {
15+
MoreWorldRenderEvents.END_MAIN_PASS.invoker().endMainPass(RenderQueue.getWorldRenderContext((LevelRenderer) (Object) this));
16+
}
17+
}

src/main/java/net/earthcomputer/clientcommands/render/RenderQueue.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33
import com.mojang.blaze3d.pipeline.RenderPipeline;
44
import com.mojang.blaze3d.platform.DepthTestFunction;
55
import com.mojang.blaze3d.vertex.VertexConsumer;
6+
import net.earthcomputer.clientcommands.event.MoreWorldRenderEvents;
67
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
78
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
8-
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
99
import net.minecraft.client.Minecraft;
10+
import net.minecraft.client.renderer.LevelRenderer;
1011
import net.minecraft.client.renderer.RenderPipelines;
1112
import net.minecraft.client.renderer.RenderType;
1213
import net.minecraft.resources.ResourceLocation;
1314
import net.minecraft.world.phys.AABB;
1415
import net.minecraft.world.phys.Vec3;
1516

17+
import java.lang.invoke.MethodHandle;
18+
import java.lang.invoke.MethodHandles;
1619
import java.util.ArrayList;
20+
import java.util.Arrays;
1721
import java.util.EnumMap;
1822
import java.util.Iterator;
1923
import java.util.LinkedHashMap;
@@ -39,9 +43,11 @@ public class RenderQueue {
3943
.setLineState(new RenderType.LineStateShard(OptionalDouble.of(Line.THICKNESS)))
4044
.createCompositeState(false));
4145

46+
private static final MethodHandle WORLD_RENDER_CONTEXT_HANDLE = findWorldRenderContextHandle();
47+
4248
static {
4349
ClientTickEvents.START_CLIENT_TICK.register(RenderQueue::tick);
44-
WorldRenderEvents.AFTER_TRANSLUCENT.register(context -> {
50+
MoreWorldRenderEvents.END_MAIN_PASS.register(context -> {
4551
RenderQueue.render(RenderQueue.Layer.ON_TOP, Objects.requireNonNull(context.consumers()).getBuffer(RenderQueue.LINES_NO_DEPTH_LAYER), context);
4652
});
4753
}
@@ -50,6 +56,30 @@ public static void register() {
5056
// load class
5157
}
5258

59+
// TODO: remove this reflection by PRing to FAPI
60+
private static MethodHandle findWorldRenderContextHandle() {
61+
return Arrays.stream(LevelRenderer.class.getDeclaredFields())
62+
.filter(field -> WorldRenderContext.class.isAssignableFrom(field.getType()))
63+
.findFirst()
64+
.map(field -> {
65+
field.setAccessible(true);
66+
try {
67+
return MethodHandles.lookup().unreflectGetter(field);
68+
} catch (IllegalAccessException e) {
69+
throw new IllegalStateException("Unable to access WorldRenderContext field in LevelRenderer", e);
70+
}
71+
})
72+
.orElseThrow(() -> new IllegalStateException("Unable to find WorldRenderContext field in LevelRenderer"));
73+
}
74+
75+
public static WorldRenderContext getWorldRenderContext(LevelRenderer renderer) {
76+
try {
77+
return (WorldRenderContext) WORLD_RENDER_CONTEXT_HANDLE.invoke(renderer);
78+
} catch (Throwable e) {
79+
throw new IllegalStateException("Exception calling WorldRenderContext getter", e);
80+
}
81+
}
82+
5383
public static void add(Layer layer, Object key, Shape shape, int life) {
5484
addQueue.add(new AddQueueEntry(layer, key, shape, life));
5585
}

src/main/resources/mixins.clientcommands.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"commands.snap.MinecraftMixin",
7777
"dataqueryhandler.ClientPacketListenerMixin",
7878
"events.ClientPacketListenerMixin",
79+
"events.LevelRendererMixin",
7980
"lengthextender.ChatScreenMixin",
8081
"rngevents.ClientLevelMixin",
8182
"scrambletitle.MinecraftMixin",

0 commit comments

Comments
 (0)