11package gregtech .client .renderer .scene ;
22
3+ import gregtech .api .metatileentity .IFastRenderMetaTileEntity ;
4+ import gregtech .api .metatileentity .interfaces .IGregTechTileEntity ;
35import gregtech .api .util .Position ;
46import gregtech .api .util .PositionedRect ;
57import gregtech .api .util .Size ;
2527import net .minecraftforge .fml .relauncher .SideOnly ;
2628
2729import codechicken .lib .vec .Vector3 ;
30+ import it .unimi .dsi .fastutil .objects .Object2ObjectArrayMap ;
2831import it .unimi .dsi .fastutil .objects .ObjectOpenHashSet ;
2932import org .jetbrains .annotations .Nullable ;
3033import org .lwjgl .opengl .GL11 ;
3538import java .nio .FloatBuffer ;
3639import java .nio .IntBuffer ;
3740import java .util .Collection ;
41+ import java .util .Map ;
3842import java .util .function .Consumer ;
3943
4044import javax .vecmath .Vector3f ;
@@ -60,6 +64,8 @@ public abstract class WorldSceneRenderer {
6064 protected static final FloatBuffer OBJECT_POS_BUFFER = ByteBuffer .allocateDirect (3 * 4 )
6165 .order (ByteOrder .nativeOrder ()).asFloatBuffer ();
6266
67+ // In most cases this would be empty
68+ protected static final Map <BlockPos , TileEntity > TILE_ENTITIES = new Object2ObjectArrayMap <>();
6369 public final World world ;
6470 public final Collection <BlockPos > renderedBlocks = new ObjectOpenHashSet <>();
6571 protected Consumer <WorldSceneRenderer > beforeRender ;
@@ -88,6 +94,15 @@ public WorldSceneRenderer setAfterWorldRender(Consumer<WorldSceneRenderer> callb
8894 public WorldSceneRenderer addRenderedBlocks (@ Nullable Collection <BlockPos > blocks ) {
8995 if (blocks != null ) {
9096 this .renderedBlocks .addAll (blocks );
97+ TILE_ENTITIES .clear ();
98+ blocks .forEach (pos -> {
99+ TileEntity tile = world .getTileEntity (pos );
100+ if (tile != null && (!(tile instanceof IGregTechTileEntity gtte ) ||
101+ // Put MTEs only when it has FastRenderer
102+ gtte .getMetaTileEntity () instanceof IFastRenderMetaTileEntity )) {
103+ TILE_ENTITIES .put (pos , tile );
104+ }
105+ });
91106 }
92107 return this ;
93108 }
@@ -280,18 +295,17 @@ protected void renderBlockLayer(BlockRenderLayer layer) {
280295
281296 protected void renderTileEntities () {
282297 RenderHelper .enableStandardItemLighting ();
298+ var dispatcher = TileEntityRendererDispatcher .instance ;
283299 for (int pass = 0 ; pass < 2 ; pass ++) {
284300 ForgeHooksClient .setRenderPass (pass );
285301 setDefaultPassRenderState (pass );
286302
287- for (BlockPos pos : renderedBlocks ) { // This
288- TileEntity tile = world .getTileEntity (pos );
289- if (tile != null ) {
290- if (tile .shouldRenderInPass (pass )) {
291- TileEntityRendererDispatcher .instance .render (tile , pos .getX (), pos .getY (), pos .getZ (), 0 );
292- }
303+ int finalPass = pass ;
304+ TILE_ENTITIES .forEach ((pos , tile ) -> {
305+ if (tile .shouldRenderInPass (finalPass )) {
306+ dispatcher .render (tile , pos .getX (), pos .getY (), pos .getZ (), 0 );
293307 }
294- }
308+ });
295309 }
296310 ForgeHooksClient .setRenderPass (-1 );
297311 RenderHelper .disableStandardItemLighting ();
0 commit comments