33import com .mojang .blaze3d .pipeline .RenderPipeline ;
44import com .mojang .blaze3d .platform .DepthTestFunction ;
55import com .mojang .blaze3d .vertex .VertexConsumer ;
6+ import net .earthcomputer .clientcommands .event .MoreWorldRenderEvents ;
67import net .fabricmc .fabric .api .client .event .lifecycle .v1 .ClientTickEvents ;
78import net .fabricmc .fabric .api .client .rendering .v1 .WorldRenderContext ;
8- import net .fabricmc .fabric .api .client .rendering .v1 .WorldRenderEvents ;
99import net .minecraft .client .Minecraft ;
10+ import net .minecraft .client .renderer .LevelRenderer ;
1011import net .minecraft .client .renderer .RenderPipelines ;
1112import net .minecraft .client .renderer .RenderType ;
1213import net .minecraft .resources .ResourceLocation ;
1314import net .minecraft .world .phys .AABB ;
1415import net .minecraft .world .phys .Vec3 ;
1516
17+ import java .lang .invoke .MethodHandle ;
18+ import java .lang .invoke .MethodHandles ;
1619import java .util .ArrayList ;
20+ import java .util .Arrays ;
1721import java .util .EnumMap ;
1822import java .util .Iterator ;
1923import 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 }
0 commit comments