55
66package meteordevelopment .meteorclient .utils .render ;
77
8+ import meteordevelopment .meteorclient .MeteorClient ;
89import net .fabricmc .fabric .api .client .render .fluid .v1 .FluidRenderHandlerRegistry ;
910import net .fabricmc .loader .api .FabricLoader ;
1011import net .minecraft .block .BlockRenderType ;
1112import net .minecraft .block .BlockState ;
13+ import net .minecraft .block .BlockWithEntity ;
1214import net .minecraft .block .Blocks ;
1315import net .minecraft .block .entity .BlockEntity ;
1416import net .minecraft .client .MinecraftClient ;
4547
4648public abstract class SimpleBlockRenderer {
4749 private static final boolean FABRIC_FLUID_RENDERER = FabricLoader .getInstance ().isModLoaded ("fabric-rendering-fluids-v1" );
48- private static final MatrixStack MATRICES = new MatrixStack ();
4950 private static final List <BlockModelPart > PARTS = new ArrayList <>();
5051 private static final Direction [] DIRECTIONS = Direction .values ();
5152 private static final Random RANDOM = Random .create ();
@@ -67,37 +68,86 @@ public abstract class SimpleBlockRenderer {
6768
6869 private SimpleBlockRenderer () {}
6970
70- public static void renderWithBlockEntity (BlockEntity blockEntity , float tickDelta , VertexConsumerProvider vertexConsumerProvider ) {
71- MATRICES .push ();
72- MATRICES .translate (blockEntity .getPos ().getX (), blockEntity .getPos ().getY (), blockEntity .getPos ().getZ ());
71+ public static void renderFlat (@ Nullable BlockRenderView renderView , BlockPos pos , BlockState state , @ Nullable BlockEntity blockEntity , MatrixStack matrices , float tickDelta , VertexConsumerProvider vertexConsumerProvider ) {
72+ matrices .push ();
73+ matrices .translate (pos .getX (), pos .getY (), pos .getZ ());
74+
75+ if (renderView == null ) {
76+ renderView = new StaticBlockRenderView (pos , state );
77+ }
7378
7479 // Render block model
75- var consumer = vertexConsumerProvider .getBuffer (RenderLayers .solid ());
76- SimpleBlockRenderer .renderFlat (blockEntity .getPos (), blockEntity .getCachedState (), MATRICES , consumer );
80+ if (state .getRenderType () == BlockRenderType .MODEL ) {
81+ VertexConsumer consumer = vertexConsumerProvider .getBuffer (RenderLayers .solid ());
82+
83+ BlockStateModel model = mc .getBlockRenderManager ().getModel (state );
84+ RANDOM .setSeed (state .getRenderingSeed (pos ));
85+ model .addParts (RANDOM , PARTS );
86+
87+ matrices .translate (state .getModelOffset (pos ));
88+ Matrix4f matrix4f = matrices .peek ().getPositionMatrix ();
89+
90+ for (BlockModelPart part : PARTS ) {
91+ for (Direction direction : DIRECTIONS ) {
92+ List <BakedQuad > quads = part .getQuads (direction );
93+ if (!quads .isEmpty ()) renderQuads (quads , matrix4f , consumer );
94+ }
95+
96+ List <BakedQuad > quads = part .getQuads (null );
97+ if (!quads .isEmpty ()) renderQuads (quads , matrix4f , consumer );
98+ }
99+
100+ PARTS .clear ();
101+ }
102+
103+ // Render fluid
104+ if (!state .getFluidState ().isEmpty ()) {
105+ VertexConsumer consumer = vertexConsumerProvider .getBuffer (RenderLayers .solid ());
106+ renderFluid (renderView , pos , state , consumer );
107+ }
77108
78109 // Render block entity
79- BlockEntityRenderer <BlockEntity , BlockEntityRenderState > renderer = mc .getBlockEntityRenderDispatcher ().get (blockEntity );
110+ if (blockEntity != null || state .getBlock () instanceof BlockWithEntity ) {
111+ if (blockEntity == null && state .getBlock () instanceof BlockWithEntity blockWithEntity ) {
112+ blockEntity = blockWithEntity .createBlockEntity (pos , state );
113+ }
80114
81- if (renderer != null && blockEntity .hasWorld () && blockEntity .getType ().supports (blockEntity .getCachedState ())) {
82- SimpleBlockRenderer .provider = vertexConsumerProvider ;
115+ if (blockEntity != null ) {
116+ BlockEntityRenderer <BlockEntity , BlockEntityRenderState > renderer = mc .getBlockEntityRenderDispatcher ().get (blockEntity );
117+ if (renderer != null && blockEntity .getType ().supports (blockEntity .getCachedState ())) {
118+ try {
119+ SimpleBlockRenderer .provider = vertexConsumerProvider ;
83120
84- BlockEntityRenderState state = renderer .createRenderState ();
85- renderer .updateRenderState (blockEntity , state , tickDelta , mc .gameRenderer .getCamera ().getCameraPos (), null );
86- renderer .render (state , MATRICES , renderCommandQueue , mc .gameRenderer .getEntityRenderStates ().cameraRenderState );
121+ BlockEntityRenderState renderState = renderer .createRenderState ();
122+ renderer .updateRenderState (blockEntity , renderState , tickDelta , mc .gameRenderer .getCamera ().getCameraPos (), null );
123+ renderer .render (renderState , matrices , renderCommandQueue , mc .gameRenderer .getEntityRenderStates ().cameraRenderState );
87124
88- renderDispatcher .render ();
89- renderCommandQueue .onNextFrame ();
125+ renderDispatcher .render ();
126+ renderCommandQueue .onNextFrame ();
90127
91- SimpleBlockRenderer .provider = null ;
128+ SimpleBlockRenderer .provider = null ;
129+ } catch (Throwable t ) {
130+ MeteorClient .LOG .error ("Oops! no render" , t );
131+ }
132+ }
133+ }
92134 }
93135
94- MATRICES .pop ();
136+ matrices .pop ();
95137 }
96138
97- public static void renderShaded (BlockPos pos , BlockState state , MatrixStack matrices , VertexConsumer consumer ) {
98- BlockRenderView renderView = new StaticBlockRenderView (pos , state );
139+ public static void renderFull (@ Nullable BlockRenderView renderView , BlockPos pos , BlockState state , @ Nullable BlockEntity blockEntity , MatrixStack matrices , float tickDelta , VertexConsumerProvider .Immediate vertexConsumerProvider ) {
140+ matrices .push ();
141+ matrices .translate (pos .getX (), pos .getY (), pos .getZ ());
99142
143+ if (renderView == null ) {
144+ renderView = new StaticBlockRenderView (pos , state );
145+ }
146+
147+ // Render block model
100148 if (state .getRenderType () == BlockRenderType .MODEL ) {
149+ VertexConsumer consumer = vertexConsumerProvider .getBuffer (RenderLayers .cutout ());
150+
101151 BlockStateModel model = mc .getBlockRenderManager ().getModel (state );
102152 RANDOM .setSeed (42L );
103153 model .addParts (RANDOM , PARTS );
@@ -116,48 +166,66 @@ public static void renderShaded(BlockPos pos, BlockState state, MatrixStack matr
116166 PARTS .clear ();
117167 }
118168
169+ // Render fluid
119170 if (!state .getFluidState ().isEmpty ()) {
120- if (FABRIC_FLUID_RENDERER ) {
121- FluidRenderHandlerRegistry .INSTANCE .get (state .getFluidState ().getFluid ()).renderFluid (
122- pos ,
123- renderView ,
124- consumer ,
125- state ,
126- state .getFluidState ()
127- );
128- } else {
129- MinecraftClient .getInstance ().getBlockRenderManager ().renderFluid (
130- pos ,
131- renderView ,
132- consumer ,
133- state ,
134- state .getFluidState ()
135- );
136- }
171+ VertexConsumer consumer = vertexConsumerProvider .getBuffer (RenderLayers .cutout ());
172+ renderFluid (renderView , pos , state , consumer );
137173 }
138- }
139-
140- public static void renderFlat (BlockPos pos , BlockState state , MatrixStack matrices , VertexConsumer consumer ) {
141- if (state .getRenderType () != BlockRenderType .MODEL ) return ;
142-
143- BlockStateModel model = mc .getBlockRenderManager ().getModel (state );
144- RANDOM .setSeed (state .getRenderingSeed (pos ));
145- model .addParts (RANDOM , PARTS );
146-
147- matrices .translate (state .getModelOffset (pos ));
148- Matrix4f matrix4f = matrices .peek ().getPositionMatrix ();
149174
150- for ( BlockModelPart part : PARTS ) {
151- for ( Direction direction : DIRECTIONS ) {
152- List < BakedQuad > quads = part . getQuads ( direction );
153- if (! quads . isEmpty ()) renderQuads ( quads , matrix4f , consumer );
175+ // Render block entity
176+ if ( blockEntity != null || state . getBlock () instanceof BlockWithEntity ) {
177+ if ( blockEntity == null && state . getBlock () instanceof BlockWithEntity blockWithEntity ) {
178+ blockEntity = blockWithEntity . createBlockEntity ( pos , state );
154179 }
155180
156- List <BakedQuad > quads = part .getQuads (null );
157- if (!quads .isEmpty ()) renderQuads (quads , matrix4f , consumer );
181+ if (blockEntity != null ) {
182+ BlockEntityRenderer <BlockEntity , BlockEntityRenderState > renderer = mc .getBlockEntityRenderDispatcher ().get (blockEntity );
183+ if (renderer != null && blockEntity .getType ().supports (blockEntity .getCachedState ())) {
184+ try {
185+ RenderDispatcher renderDispatcher = new RenderDispatcher (
186+ renderCommandQueue ,
187+ mc .getBlockRenderManager (),
188+ vertexConsumerProvider ,
189+ mc .getAtlasManager (),
190+ NoopOutlineVertexConsumerProvider .INSTANCE ,
191+ NoopImmediateVertexConsumerProvider .INSTANCE ,
192+ mc .textRenderer
193+ );
194+
195+ BlockEntityRenderState renderState = renderer .createRenderState ();
196+ renderer .updateRenderState (blockEntity , renderState , tickDelta , mc .gameRenderer .getCamera ().getCameraPos (), null );
197+ renderer .render (renderState , matrices , renderCommandQueue , mc .gameRenderer .getEntityRenderStates ().cameraRenderState );
198+
199+ renderDispatcher .render ();
200+ renderCommandQueue .onNextFrame ();
201+ } catch (Throwable t ) {
202+ MeteorClient .LOG .error ("Oops! no render" , t );
203+ }
204+ }
205+ }
158206 }
159207
160- PARTS .clear ();
208+ matrices .pop ();
209+ }
210+
211+ private static void renderFluid (BlockRenderView renderView , BlockPos pos , BlockState state , VertexConsumer consumer ) {
212+ if (FABRIC_FLUID_RENDERER ) {
213+ FluidRenderHandlerRegistry .INSTANCE .get (state .getFluidState ().getFluid ()).renderFluid (
214+ pos ,
215+ renderView ,
216+ consumer ,
217+ state ,
218+ state .getFluidState ()
219+ );
220+ } else {
221+ MinecraftClient .getInstance ().getBlockRenderManager ().renderFluid (
222+ pos ,
223+ renderView ,
224+ consumer ,
225+ state ,
226+ state .getFluidState ()
227+ );
228+ }
161229 }
162230
163231 private static void renderQuads (List <BakedQuad > quads , Matrix4f matrix4f , VertexConsumer consumer ) {
0 commit comments