diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-06-22 16:07:37 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-06-22 16:07:37 +0800 |
| commit | abf54d61e6991267151bea3e487ea4cd80dc6740 (patch) | |
| tree | 394f02dd7a88fae454a24e68e01646834ea78d64 | |
| parent | 763ae8baad4acd70915556681e9648196d1913a8 (diff) | |
| download | RoughlyEnoughItems-abf54d61e6991267151bea3e487ea4cd80dc6740.tar.gz RoughlyEnoughItems-abf54d61e6991267151bea3e487ea4cd80dc6740.tar.bz2 RoughlyEnoughItems-abf54d61e6991267151bea3e487ea4cd80dc6740.zip | |
Combine two getExtraData
| -rw-r--r-- | runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java index 1fcd50f82..b4b213c7f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.widget; +import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -45,7 +46,7 @@ import java.util.List; public class BatchedEntryRendererManager { private boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); - private Int2ObjectMap<List<EntryWidget>> grouping = new Int2ObjectOpenHashMap<>(); + private Int2ObjectMap<List<Object>> grouping = new Int2ObjectOpenHashMap<>(); private List<EntryWidget> toRender = new ArrayList<>(); public BatchedEntryRendererManager() { @@ -68,20 +69,28 @@ public class BatchedEntryRendererManager { public void add(EntryWidget widget) { if (fastEntryRendering) { EntryStack<?> currentEntry = widget.getCurrentEntry(); - EntryRenderer<?> renderer = currentEntry.getRenderer(); - if (renderer instanceof BatchedEntryRenderer) { - BatchedEntryRenderer<Object, Object> batchedRenderer = (BatchedEntryRenderer<Object, Object>) renderer; - EntryStack<Object> cast = currentEntry.cast(); - if (batchedRenderer.isBatched(cast)) { - int hash = batchedRenderer.getBatchIdentifier(cast, widget.getBounds(), batchedRenderer.getExtraData(cast)) - ^ widget.getCurrentEntry().getType().hashCode(); - List<EntryWidget> entries = grouping.get(hash); - if (entries == null) { - grouping.put(hash, entries = new ArrayList<>()); + try { + EntryRenderer<?> renderer = currentEntry.getRenderer(); + if (renderer instanceof BatchedEntryRenderer) { + BatchedEntryRenderer<Object, Object> batchedRenderer = (BatchedEntryRenderer<Object, Object>) renderer; + EntryStack<Object> cast = currentEntry.cast(); + if (batchedRenderer.isBatched(cast)) { + Object extraData = batchedRenderer.getExtraData(cast); + int hash = batchedRenderer.getBatchIdentifier(cast, widget.getBounds(), extraData) + ^ widget.getCurrentEntry().getType().hashCode(); + List<Object> entries = grouping.get(hash); + if (entries == null) { + grouping.put(hash, entries = new ArrayList<>()); + } + entries.add(widget); + entries.add(extraData); + return; } - entries.add(widget); - return; } + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Adding entry"); + CrashReportUtils.renderer(report, currentEntry); + throw new ReportedException(report); } } toRender.add(widget); @@ -93,8 +102,24 @@ public class BatchedEntryRendererManager { public void render(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta) { if (fastEntryRendering) { - for (List<EntryWidget> entries : grouping.values()) { - renderEntries(debugTime, size, time, fastEntryRendering, matrices, mouseX, mouseY, delta, entries); + for (List<Object> entries : grouping.values()) { + Object[] extraData = new Object[entries.size() / 2]; + for (int i = 0; i < extraData.length; i++) { + extraData[i] = entries.get(i * 2 + 1); + } + renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, () -> new AbstractIterator<>() { + public int i = 0; + + @Override + protected EntryWidget computeNext() { + if (i >= entries.size()) { + return endOfData(); + } + EntryWidget widget = (EntryWidget) entries.get(i); + i += 2; + return widget; + } + }, extraData); } } if (!toRender.isEmpty()) { |
