1111
1212import com .mojang .blaze3d .buffers .GpuBufferSlice ;
1313import com .mojang .blaze3d .resource .GraphicsResourceAllocator ;
14- import com .mojang .blaze3d .systems .RenderSystem ;
1514import com .mojang .blaze3d .vertex .PoseStack ;
16- import com .mojang .blaze3d .vertex .VertexConsumer ;
1715import net .minecraft .client .Camera ;
1816import net .minecraft .client .DeltaTracker ;
1917import net .minecraft .client .Minecraft ;
2018import net .minecraft .client .renderer .LevelRenderer ;
21- import net .minecraft .client .renderer .state .BlockOutlineRenderState ;
22- import org .enginehub .worldeditcui .callback .BlockOutlineRenderCallback ;
2319import org .enginehub .worldeditcui .callback .WorldRenderCallback ;
2420import org .enginehub .worldeditcui .render .WecuiRenderContext ;
2521import org .joml .Matrix4f ;
3127import org .spongepowered .asm .mixin .injection .Inject ;
3228import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
3329
30+ /**
31+ * Mixin to LevelRenderer to inject our world render callbacks.
32+ * Temporary until Fabric finishes their new rendering API.
33+ */
3434@ Mixin (LevelRenderer .class )
3535public abstract class LevelRendererMixin {
3636 @ Shadow @ Final private Minecraft minecraft ;
3737
38- // START (old START)
39- @ Inject (method = "renderLevel" , at = @ At ("HEAD" ))
40- private void wecui$start (
41- GraphicsResourceAllocator gfx , DeltaTracker delta , boolean renderBlockOutline ,
42- Camera camera , Matrix4f modelView , Matrix4f projection , Matrix4f inverseProjection ,
43- GpuBufferSlice slice , Vector4f clearColor , boolean renderSky , CallbackInfo ci
44- ) {
45- PoseStack pose = new PoseStack ();
46- pose .last ().pose ().set (modelView ); // copy modelView for parity with old ctx
47- WorldRenderCallback .START .invoker ()
48- .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
49- }
50-
5138 // LAST (old LAST)
5239 @ Inject (method = "renderLevel" , at = @ At ("TAIL" ))
5340 private void wecui$last (
@@ -61,156 +48,6 @@ public abstract class LevelRendererMixin {
6148 .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
6249 }
6350
64- // BEFORE_ENTITIES → right BEFORE extractVisibleEntities(...)
65- @ Inject (
66- method = "renderLevel" ,
67- at = @ At (
68- value = "INVOKE" ,
69- target = "Lnet/minecraft/client/renderer/LevelRenderer;extractVisibleEntities(" +
70- "Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/culling/Frustum;" +
71- "Lnet/minecraft/client/DeltaTracker;Lnet/minecraft/client/renderer/state/LevelRenderState;)V"
72- )
73- )
74- private void wecui$beforeEntities (
75- GraphicsResourceAllocator gfx , DeltaTracker delta , boolean renderBlockOutline ,
76- Camera camera , Matrix4f modelView , Matrix4f projection , Matrix4f inverseProjection ,
77- GpuBufferSlice slice , Vector4f clearColor , boolean renderSky ,
78- CallbackInfo ci
79- ) {
80- var pose = new PoseStack ();
81- pose .last ().pose ().set (modelView );
82- WorldRenderCallback .BEFORE_ENTITY_EXTRACT .invoker ()
83- .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
84- }
85-
86- // AFTER_ENTITIES → right AFTER extractVisibleEntities(...)
87- @ Inject (
88- method = "renderLevel" ,
89- at = @ At (
90- value = "INVOKE" ,
91- target = "Lnet/minecraft/client/renderer/LevelRenderer;extractVisibleEntities(" +
92- "Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/culling/Frustum;" +
93- "Lnet/minecraft/client/DeltaTracker;Lnet/minecraft/client/renderer/state/LevelRenderState;)V" ,
94- shift = At .Shift .AFTER
95- )
96- )
97- private void wecui$afterEntities (
98- GraphicsResourceAllocator gfx , DeltaTracker delta , boolean renderBlockOutline ,
99- Camera camera , Matrix4f modelView , Matrix4f projection , Matrix4f inverseProjection ,
100- GpuBufferSlice slice , Vector4f clearColor , boolean renderSky ,
101- CallbackInfo ci
102- ) {
103- var pose = new PoseStack ();
104- pose .last ().pose ().set (modelView );
105- WorldRenderCallback .AFTER_ENTITY_EXTRACT .invoker ()
106- .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
107- }
108-
109- // BEFORE_BLOCK_ENTITY_EXTRACT
110- @ Inject (
111- method = "renderLevel" ,
112- at = @ At (
113- value = "INVOKE" ,
114- target = "Lnet/minecraft/client/renderer/LevelRenderer;extractVisibleBlockEntities(" +
115- "Lnet/minecraft/client/Camera;FLnet/minecraft/client/renderer/state/LevelRenderState;)V"
116- )
117- )
118- private void wecui$beforeBlockEntityExtract (
119- GraphicsResourceAllocator gfx , DeltaTracker delta , boolean renderBlockOutline ,
120- Camera camera , Matrix4f modelView , Matrix4f projection , Matrix4f inverseProjection ,
121- GpuBufferSlice slice , Vector4f clearColor , boolean renderSky ,
122- CallbackInfo ci
123- ) {
124- var pose = new PoseStack ();
125- pose .last ().pose ().set (modelView );
126- WorldRenderCallback .BEFORE_BLOCK_ENTITY_EXTRACT .invoker ()
127- .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
128- }
129-
130- // AFTER_BLOCK_ENTITY_EXTRACT
131- @ Inject (
132- method = "renderLevel" ,
133- at = @ At (
134- value = "INVOKE" ,
135- target = "Lnet/minecraft/client/renderer/LevelRenderer;extractVisibleBlockEntities(" +
136- "Lnet/minecraft/client/Camera;FLnet/minecraft/client/renderer/state/LevelRenderState;)V" ,
137- shift = At .Shift .AFTER
138- )
139- )
140- private void wecui$afterBlockEntityExtract (
141- GraphicsResourceAllocator gfx , DeltaTracker delta , boolean renderBlockOutline ,
142- Camera camera , Matrix4f modelView , Matrix4f projection , Matrix4f inverseProjection ,
143- GpuBufferSlice slice , Vector4f clearColor , boolean renderSky ,
144- CallbackInfo ci
145- ) {
146- var pose = new PoseStack ();
147- pose .last ().pose ().set (modelView );
148- WorldRenderCallback .AFTER_BLOCK_ENTITY_EXTRACT .invoker ()
149- .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
150- }
151-
152- @ Inject (
153- method = "renderLevel" ,
154- at = @ At (
155- value = "INVOKE" ,
156- target = "Lnet/minecraft/client/renderer/LevelRenderer;extractBlockOutline(" +
157- "Lnet/minecraft/client/Camera;" +
158- "Lnet/minecraft/client/renderer/state/LevelRenderState;)V"
159- )
160- )
161- private void wecui$beforeBlockOutlineExtract (
162- GraphicsResourceAllocator gfx , DeltaTracker delta , boolean renderBlockOutline ,
163- Camera camera , Matrix4f modelView , Matrix4f projection , Matrix4f inverseProjection ,
164- GpuBufferSlice slice , Vector4f clearColor , boolean renderSky ,
165- CallbackInfo ci
166- ) {
167- var pose = new PoseStack ();
168- pose .last ().pose ().set (modelView );
169- WorldRenderCallback .BEFORE_BLOCK_OUTLINE_EXTRACT .invoker ()
170- .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
171- }
172-
173- @ Inject (method = "renderHitOutline" , at = @ At ("HEAD" ), cancellable = true )
174- private void wecui$blockOutline (
175- PoseStack pose , VertexConsumer consumer ,
176- double camX , double camY , double camZ ,
177- BlockOutlineRenderState state , int packedLight ,
178- CallbackInfo ci
179- ) {
180- var ctx = new BlockOutlineRenderCallback .Context (
181- this .minecraft ,
182- this .minecraft .gameRenderer .getMainCamera (),
183- pose ,
184- RenderSystem .getProjectionMatrixBuffer (),
185- consumer ,
186- camX , camY , camZ ,
187- state
188- );
189- if (BlockOutlineRenderCallback .EVENT .invoker ().render (ctx )) {
190- ci .cancel (); // fully replace vanilla outline
191- }
192- }
193-
194- @ Inject (
195- method = "renderLevel" ,
196- at = @ At (
197- value = "INVOKE" ,
198- target = "Lnet/minecraft/client/renderer/LevelRenderer;addMainPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/renderer/culling/Frustum;Lorg/joml/Matrix4f;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZLnet/minecraft/client/renderer/state/LevelRenderState;Lnet/minecraft/client/DeltaTracker;Lnet/minecraft/util/profiling/ProfilerFiller;)V" ,
199- shift = At .Shift .AFTER
200- )
201- )
202- private void wecui$afterMainPassScheduled (
203- GraphicsResourceAllocator gfx , DeltaTracker delta , boolean renderBlockOutline ,
204- Camera camera , Matrix4f modelView , Matrix4f projection , Matrix4f inverseProjection ,
205- GpuBufferSlice slice , Vector4f clearColor , boolean renderSky ,
206- CallbackInfo ci
207- ) {
208- var pose = new PoseStack ();
209- pose .last ().pose ().set (modelView );
210- WorldRenderCallback .AFTER_MAIN_PASS_SCHEDULED .invoker ()
211- .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
212- }
213-
21451 // AFTER_TRANSLUCENT — fires immediately after translucent pass queued/executed
21552 @ Inject (
21653 method = "renderLevel" ,
@@ -230,5 +67,4 @@ public abstract class LevelRendererMixin {
23067 WorldRenderCallback .AFTER_TRANSLUCENT .invoker ()
23168 .render (new WecuiRenderContext (this .minecraft , camera , delta , pose , projection ));
23269 }
233-
23470}
0 commit comments