2525import net .minecraftforge .fml .relauncher .SideOnly ;
2626
2727import codechicken .lib .vec .Vector3 ;
28+ import it .unimi .dsi .fastutil .objects .ObjectOpenHashSet ;
29+ import org .jetbrains .annotations .Nullable ;
2830import org .lwjgl .opengl .GL11 ;
2931import org .lwjgl .util .glu .GLU ;
3032
3335import java .nio .FloatBuffer ;
3436import java .nio .IntBuffer ;
3537import java .util .Collection ;
36- import java .util .LinkedHashMap ;
37- import java .util .Map ;
3838import java .util .function .Consumer ;
3939
4040import javax .vecmath .Vector3f ;
@@ -61,7 +61,7 @@ public abstract class WorldSceneRenderer {
6161 .order (ByteOrder .nativeOrder ()).asFloatBuffer ();
6262
6363 public final World world ;
64- public final Map < Collection <BlockPos >, ISceneRenderHook > renderedBlocksMap ;
64+ public final Collection <BlockPos > renderedBlocks = new ObjectOpenHashSet <>() ;
6565 private Consumer <WorldSceneRenderer > beforeRender ;
6666 private Consumer <WorldSceneRenderer > afterRender ;
6767 private Consumer <RayTraceResult > onLookingAt ;
@@ -73,7 +73,6 @@ public abstract class WorldSceneRenderer {
7373
7474 public WorldSceneRenderer (World world ) {
7575 this .world = world ;
76- renderedBlocksMap = new LinkedHashMap <>();
7776 }
7877
7978 public WorldSceneRenderer setBeforeWorldRender (Consumer <WorldSceneRenderer > callback ) {
@@ -86,9 +85,9 @@ public WorldSceneRenderer setAfterWorldRender(Consumer<WorldSceneRenderer> callb
8685 return this ;
8786 }
8887
89- public WorldSceneRenderer addRenderedBlocks (Collection <BlockPos > blocks , ISceneRenderHook renderHook ) {
88+ public WorldSceneRenderer addRenderedBlocks (@ Nullable Collection <BlockPos > blocks ) {
9089 if (blocks != null ) {
91- this .renderedBlocksMap . put (blocks , renderHook );
90+ this .renderedBlocks . addAll (blocks );
9291 }
9392 return this ;
9493 }
@@ -240,31 +239,24 @@ protected void drawWorld() {
240239 for (BlockRenderLayer layer : BlockRenderLayer .values ()) {
241240 ForgeHooksClient .setRenderLayer (layer );
242241 int pass = layer == BlockRenderLayer .TRANSLUCENT ? 1 : 0 ;
242+ setDefaultPassRenderState (pass );
243243
244- renderedBlocksMap .forEach ((renderedBlocks , hook ) -> {
245- if (hook != null ) {
246- hook .apply (false , pass , layer );
247- } else {
248- setDefaultPassRenderState (pass );
249- }
244+ BufferBuilder buffer = Tessellator .getInstance ().getBuffer ();
245+ buffer .begin (GL11 .GL_QUADS , DefaultVertexFormats .BLOCK );
246+ BlockRendererDispatcher blockrendererdispatcher = mc .getBlockRendererDispatcher ();
250247
251- BufferBuilder buffer = Tessellator .getInstance ().getBuffer ();
252- buffer .begin (GL11 .GL_QUADS , DefaultVertexFormats .BLOCK );
253- BlockRendererDispatcher blockrendererdispatcher = mc .getBlockRendererDispatcher ();
254-
255- for (BlockPos pos : renderedBlocks ) {
256- IBlockState state = world .getBlockState (pos );
257- Block block = state .getBlock ();
258- if (block == Blocks .AIR ) continue ;
259- state = state .getActualState (world , pos );
260- if (block .canRenderInLayer (state , layer )) {
261- blockrendererdispatcher .renderBlock (state , pos , world , buffer );
262- }
248+ for (BlockPos pos : renderedBlocks ) {
249+ IBlockState state = world .getBlockState (pos );
250+ Block block = state .getBlock ();
251+ if (block == Blocks .AIR ) continue ;
252+ state = state .getActualState (world , pos );
253+ if (block .canRenderInLayer (state , layer )) {
254+ blockrendererdispatcher .renderBlock (state , pos , world , buffer );
263255 }
256+ }
264257
265- Tessellator .getInstance ().draw ();
266- Tessellator .getInstance ().getBuffer ().setTranslation (0 , 0 , 0 );
267- });
258+ Tessellator .getInstance ().draw ();
259+ Tessellator .getInstance ().getBuffer ().setTranslation (0 , 0 , 0 );
268260 }
269261 } finally {
270262 ForgeHooksClient .setRenderLayer (oldRenderLayer );
@@ -276,22 +268,15 @@ protected void drawWorld() {
276268 // render TESR
277269 for (int pass = 0 ; pass < 2 ; pass ++) {
278270 ForgeHooksClient .setRenderPass (pass );
279- int finalPass = pass ;
280- renderedBlocksMap .forEach ((renderedBlocks , hook ) -> {
281- if (hook != null ) {
282- hook .apply (true , finalPass , null );
283- } else {
284- setDefaultPassRenderState (finalPass );
285- }
286- for (BlockPos pos : renderedBlocks ) {
287- TileEntity tile = world .getTileEntity (pos );
288- if (tile != null ) {
289- if (tile .shouldRenderInPass (finalPass )) {
290- TileEntityRendererDispatcher .instance .render (tile , pos .getX (), pos .getY (), pos .getZ (), 0 );
291- }
271+ setDefaultPassRenderState (pass );
272+ for (BlockPos pos : renderedBlocks ) {
273+ TileEntity tile = world .getTileEntity (pos );
274+ if (tile != null ) {
275+ if (tile .shouldRenderInPass (pass )) {
276+ TileEntityRendererDispatcher .instance .render (tile , pos .getX (), pos .getY (), pos .getZ (), 0 );
292277 }
293278 }
294- });
279+ }
295280 }
296281 ForgeHooksClient .setRenderPass (-1 );
297282 GlStateManager .enableDepth ();
0 commit comments