Skip to content

Commit 8f90f80

Browse files
TechLord22bruberuserenibyss
authored
Optimize JEI multiblock preview allocations (#2629)
Co-authored-by: bruberu <[email protected]> Co-authored-by: Maya <[email protected]>
1 parent 7dd3cad commit 8f90f80

File tree

4 files changed

+31
-64
lines changed

4 files changed

+31
-64
lines changed

src/main/java/gregtech/client/renderer/scene/ISceneRenderHook.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/main/java/gregtech/client/renderer/scene/WorldSceneRenderer.java

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import net.minecraftforge.fml.relauncher.SideOnly;
2626

2727
import codechicken.lib.vec.Vector3;
28+
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
29+
import org.jetbrains.annotations.Nullable;
2830
import org.lwjgl.opengl.GL11;
2931
import org.lwjgl.util.glu.GLU;
3032

@@ -33,8 +35,6 @@
3335
import java.nio.FloatBuffer;
3436
import java.nio.IntBuffer;
3537
import java.util.Collection;
36-
import java.util.LinkedHashMap;
37-
import java.util.Map;
3838
import java.util.function.Consumer;
3939

4040
import 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();

src/main/java/gregtech/common/items/behaviors/monitorplugin/AdvancedMonitorPluginBehavior.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ private void createWorldScene() {
104104
TrackedDummyWorld dummyWorld = new TrackedDummyWorld(world);
105105
dummyWorld.setRenderFilter(pos -> validPos.contains(pos));
106106
worldSceneRenderer = new FBOWorldSceneRenderer(dummyWorld, FBO);
107-
worldSceneRenderer.addRenderedBlocks(validPos, null);
107+
worldSceneRenderer.addRenderedBlocks(validPos);
108108
center = new Vector3f((minX + maxX) / 2f + 0.5f, (minY + maxY) / 2f + 0.5f, (minZ + maxZ) / 2f + 0.5f);
109109
worldSceneRenderer.setCameraLookAt(center, 10 / scale, Math.toRadians(rotationPitch),
110110
Math.toRadians(rotationYaw));

src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ private void setNextLayer(int newLayer) {
217217
if (renderer != null) {
218218
TrackedDummyWorld world = ((TrackedDummyWorld) renderer.world);
219219
resetCenter(world);
220-
renderer.renderedBlocksMap.clear();
220+
renderer.renderedBlocks.clear();
221221
int minY = (int) world.getMinPos().getY();
222222
Collection<BlockPos> renderBlocks;
223223
if (newLayer == -1) {
@@ -226,7 +226,7 @@ private void setNextLayer(int newLayer) {
226226
renderBlocks = world.renderedBlocks.stream().filter(pos -> pos.getY() - minY == newLayer)
227227
.collect(Collectors.toSet());
228228
}
229-
renderer.addRenderedBlocks(renderBlocks, null);
229+
renderer.addRenderedBlocks(renderBlocks);
230230
}
231231
}
232232

@@ -593,7 +593,7 @@ private MBPattern initializePattern(@NotNull MultiblockShapeInfo shapeInfo, @Not
593593
Vector3f minPos = world.getMinPos();
594594
center = new Vector3f(minPos.x + size.x / 2, minPos.y + size.y / 2, minPos.z + size.z / 2);
595595

596-
worldSceneRenderer.addRenderedBlocks(world.renderedBlocks, null);
596+
worldSceneRenderer.addRenderedBlocks(world.renderedBlocks);
597597
worldSceneRenderer.setOnLookingAt(ray -> {});
598598

599599
worldSceneRenderer.setAfterWorldRender(renderer -> {
@@ -607,8 +607,7 @@ private MBPattern initializePattern(@NotNull MultiblockShapeInfo shapeInfo, @Not
607607
renderBlockOverLay(selected, 255, 0, 0);
608608
});
609609
world.updateEntities();
610-
world.setRenderFilter(
611-
pos -> worldSceneRenderer.renderedBlocksMap.keySet().stream().anyMatch(c -> c.contains(pos)));
610+
world.setRenderFilter(worldSceneRenderer.renderedBlocks::contains);
612611

613612
Map<BlockPos, TraceabilityPredicate> predicateMap = new HashMap<>();
614613
if (controllerBase != null) {

0 commit comments

Comments
 (0)