3
3
import com .mojang .blaze3d .pipeline .RenderPipeline ;
4
4
import com .mojang .blaze3d .platform .DepthTestFunction ;
5
5
import com .mojang .blaze3d .vertex .VertexConsumer ;
6
+ import net .earthcomputer .clientcommands .event .MoreWorldRenderEvents ;
6
7
import net .fabricmc .fabric .api .client .event .lifecycle .v1 .ClientTickEvents ;
7
8
import net .fabricmc .fabric .api .client .rendering .v1 .WorldRenderContext ;
8
- import net .fabricmc .fabric .api .client .rendering .v1 .WorldRenderEvents ;
9
9
import net .minecraft .client .Minecraft ;
10
+ import net .minecraft .client .renderer .LevelRenderer ;
10
11
import net .minecraft .client .renderer .RenderPipelines ;
11
12
import net .minecraft .client .renderer .RenderType ;
12
13
import net .minecraft .resources .ResourceLocation ;
13
14
import net .minecraft .world .phys .AABB ;
14
15
import net .minecraft .world .phys .Vec3 ;
15
16
17
+ import java .lang .invoke .MethodHandle ;
18
+ import java .lang .invoke .MethodHandles ;
16
19
import java .util .ArrayList ;
20
+ import java .util .Arrays ;
17
21
import java .util .EnumMap ;
18
22
import java .util .Iterator ;
19
23
import java .util .LinkedHashMap ;
@@ -39,9 +43,11 @@ public class RenderQueue {
39
43
.setLineState (new RenderType .LineStateShard (OptionalDouble .of (Line .THICKNESS )))
40
44
.createCompositeState (false ));
41
45
46
+ private static final MethodHandle WORLD_RENDER_CONTEXT_HANDLE = findWorldRenderContextHandle ();
47
+
42
48
static {
43
49
ClientTickEvents .START_CLIENT_TICK .register (RenderQueue ::tick );
44
- WorldRenderEvents . AFTER_TRANSLUCENT .register (context -> {
50
+ MoreWorldRenderEvents . END_MAIN_PASS .register (context -> {
45
51
RenderQueue .render (RenderQueue .Layer .ON_TOP , Objects .requireNonNull (context .consumers ()).getBuffer (RenderQueue .LINES_NO_DEPTH_LAYER ), context );
46
52
});
47
53
}
@@ -50,6 +56,30 @@ public static void register() {
50
56
// load class
51
57
}
52
58
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
+
53
83
public static void add (Layer layer , Object key , Shape shape , int life ) {
54
84
addQueue .add (new AddQueueEntry (layer , key , shape , life ));
55
85
}
0 commit comments