From 03b0adcf960c5e462fddc8e045b146a8c727670c Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 27 Aug 2022 13:23:37 +0900 Subject: Refactors to overlays and reiruntime --- .../client/gui/widget/basewidgets/ArrowWidget.java | 3 +- .../basewidgets/BatchedEntryRendererManager.java | 361 --------------------- .../gui/widget/basewidgets/BatchedSlotsImpl.java | 350 ++++++++++++++++++++ .../gui/widget/basewidgets/BurningFireWidget.java | 3 +- .../gui/widget/basewidgets/ButtonWidget.java | 5 +- .../client/gui/widget/basewidgets/EntryWidget.java | 4 +- .../client/gui/widget/basewidgets/LabelWidget.java | 7 +- .../client/gui/widget/basewidgets/PanelWidget.java | 2 +- .../widget/basewidgets/WidgetsProviderImpl.java | 2 +- 9 files changed, 365 insertions(+), 372 deletions(-) delete mode 100644 runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java create mode 100644 runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedSlotsImpl.java (limited to 'runtime-frontend/widgets/src/main/java') diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java index aba9ae7b8..8afb30220 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java @@ -29,6 +29,7 @@ import me.shedaniel.clothconfig2.api.animator.NumberAnimator; import me.shedaniel.clothconfig2.api.animator.ValueAnimator; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Arrow; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.util.Mth; @@ -41,7 +42,7 @@ final class ArrowWidget extends Arrow { private Rectangle bounds; private double animationDuration = -1; private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); public ArrowWidget(Rectangle bounds) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java deleted file mode 100644 index 8626c30fc..000000000 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package me.shedaniel.rei.impl.client.gui.widget.basewidgets; - -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; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import me.shedaniel.math.Point; -import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.entry.renderer.BatchedEntryRenderer; -import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; -import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; -import me.shedaniel.rei.api.client.gui.widgets.Slot; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; -import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.util.CrashReportUtils; -import net.minecraft.CrashReport; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.renderer.MultiBufferSource; -import org.apache.commons.lang3.mutable.MutableInt; -import org.apache.commons.lang3.mutable.MutableLong; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -final class BatchedEntryRendererManager extends BatchedSlots implements ForwardingList { - private final boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); - private final Int2ObjectMap> grouping = new Int2ObjectOpenHashMap<>(); - private final List toRender = new ArrayList<>(); - private final List delegateList = new DelegatedSlotList(); - private int size; - public boolean debug; - public MutableInt debugSize = new MutableInt(); - public MutableLong debugTime = new MutableLong(); - - public BatchedEntryRendererManager() { - } - - public BatchedEntryRendererManager(Collection widgets) { - addAll(widgets); - } - - public boolean isFastEntryRendering() { - return fastEntryRendering; - } - - @Override - public List delegate() { - return delegateList; - } - - @Override - public void addAllUnbatched(Collection slots) { - this.toRender.addAll(slots); - this.size += slots.size(); - } - - @Override - public boolean isBatched() { - return isFastEntryRendering(); - } - - @Override - public void addDebugger(MutableInt size, MutableLong time) { - this.debug = true; - this.debugSize = size; - this.debugTime = time; - } - - @Override - public void addUnbatched(Slot slot) { - this.toRender.add(slot); - this.size++; - } - - @Override - public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (this.debug) { - render(false, null, null, matrices, mouseX, mouseY, delta); - } else { - render(true, debugSize, debugTime, matrices, mouseX, mouseY, delta); - } - } - - public void render(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta) { - if (fastEntryRendering) { - for (List 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, groupingAsList(entries), extraData); - } - } - if (!toRender.isEmpty()) { - renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, toRender); - } - } - - public List groupingsAsList() { - return CollectionUtils.concatUnmodifiable((Iterable>) () -> new AbstractIterator<>() { - final Iterator> groups = grouping.values().iterator(); - - @Nullable - @Override - protected List computeNext() { - if (groups.hasNext()) { - return groupingAsList(groups.next()); - } - return endOfData(); - } - }); - } - - public List groupingAsList(List entries) { - return new AbstractList<>() { - @Override - public Slot get(int index) { - return (Slot) entries.get(index * 2); - } - - @Override - public Iterator iterator() { - return new AbstractIterator<>() { - public int i = 0; - - @Override - protected Slot computeNext() { - if (i >= entries.size()) { - return endOfData(); - } - Slot widget = (Slot) entries.get(i); - i += 2; - return widget; - } - }; - } - - @Override - public int size() { - return entries.size() / 2; - } - }; - } - - public static void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Collection entries) { - if (fastEntryRendering) { - Slot firstWidget = Iterables.getFirst(entries, null); - if (firstWidget == null) return; - EntryRenderer renderer = firstWidget.getCurrentEntry().getRenderer(); - if (renderer instanceof BatchedEntryRenderer) { - BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; - Object[] extraData = new Object[entries.size()]; - int i = 0; - for (Slot entry : entries) { - EntryStack currentEntry = entry.getCurrentEntry(); - extraData[i++] = ((BatchedEntryRenderer) currentEntry.getRenderer()).getExtraData(currentEntry.cast()); - } - renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, entries, extraData); - return; - } - } - renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, entries); - } - - private static void renderBatched(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries, Object[] extraData) { - Slot firstWidget = Iterables.getFirst(entries, null); - if (firstWidget == null) return; - @SuppressWarnings("rawtypes") - EntryStack first = firstWidget.getCurrentEntry(); - EntryRenderer renderer = first.getRenderer(); - BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; - matrices = firstRenderer.batchModifyMatrices(matrices); - long l = debugTime ? System.nanoTime() : 0; - MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); - int i = 0; - for (Slot entry : entries) { - try { - entry.drawBackground(matrices, mouseX, mouseY, delta); - } catch (Throwable throwable) { - CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry background"); - CrashReportUtils.renderer(report, entry); - CrashReportUtils.catchReport(report); - return; - } - } - firstRenderer.startBatch(first, extraData[0], matrices, delta); - for (Slot entry : entries) { - try { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = entry.getCurrentEntry(); - currentEntry.setZ(100); - firstRenderer.renderBase(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); - if (debugTime && !currentEntry.isEmpty()) size.increment(); - } catch (Throwable throwable) { - CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry base"); - CrashReportUtils.renderer(report, entry); - CrashReportUtils.catchReport(report); - return; - } - } - immediate.endBatch(); - firstRenderer.afterBase(first, extraData[0], matrices, delta); - i = 0; - for (Slot entry : entries) { - try { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = entry.getCurrentEntry(); - firstRenderer.renderOverlay(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); - } catch (Throwable throwable) { - CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry base"); - CrashReportUtils.renderer(report, entry); - CrashReportUtils.catchReport(report); - return; - } - } - immediate.endBatch(); - for (Slot entry : entries) { - try { - if (entry.containsMouse(mouseX, mouseY)) { - Tooltip tooltip = entry.getCurrentTooltip(TooltipContext.of(new Point(mouseX, mouseY))); - if (tooltip != null) { - tooltip.queue(); - } - - if (entry.isHighlightEnabled()) { - entry.drawHighlighted(matrices, mouseX, mouseY, delta); - } - } - - entry.drawExtra(matrices, mouseX, mouseY, delta); - } catch (Throwable throwable) { - CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry extra"); - CrashReportUtils.renderer(report, entry); - CrashReportUtils.catchReport(report); - return; - } - } - if (debugTime) time.add(System.nanoTime() - l); - firstRenderer.endBatch(first, extraData[0], matrices, delta); - } - - public static void renderSlow(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries) { - for (Slot entry : entries) { - if (entry.getCurrentEntry().isEmpty()) - continue; - try { - if (debugTime) { - size.increment(); - long l = System.nanoTime(); - entry.render(matrices, mouseX, mouseY, delta); - time.add(System.nanoTime() - l); - } else entry.render(matrices, mouseX, mouseY, delta); - } catch (Throwable throwable) { - CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry"); - CrashReportUtils.renderer(report, entry); - CrashReportUtils.catchReport(report); - return; - } - } - } - - @Override - public List children() { - return null; - } - - private class DelegatedSlotList extends AbstractList { - private final List unmodifiable = CollectionUtils.concatUnmodifiable(toRender, - groupingsAsList()); - - @Override - public void add(int index, Slot element) { - add(element); - } - - @Override - public int size() { - return size; - } - - @Override - public boolean add(Slot widget) { - if (fastEntryRendering) { - EntryStack currentEntry = widget.getCurrentEntry(); - try { - EntryRenderer renderer = currentEntry.getRenderer(); - if (renderer instanceof BatchedEntryRenderer) { - BatchedEntryRenderer batchedRenderer = (BatchedEntryRenderer) renderer; - EntryStack 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 entries = grouping.get(hash); - if (entries == null) { - grouping.put(hash, entries = new ArrayList<>()); - } - entries.add(widget); - entries.add(extraData); - size++; - return true; - } - } - } catch (Throwable throwable) { - CrashReport report = CrashReportUtils.essential(throwable, "Adding entry"); - CrashReportUtils.renderer(report, currentEntry); - CrashReportUtils.catchReport(report); - return false; - } - } - - addUnbatched(widget); - return true; - } - - @Override - public Slot get(int index) { - return unmodifiable.get(index); - } - - @Override - public boolean addAll(Collection widgets) { - if (fastEntryRendering) { - for (Slot widget : widgets) { - add(widget); - } - } else { - addAllUnbatched(widgets); - } - - return true; - } - } -} diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedSlotsImpl.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedSlotsImpl.java new file mode 100644 index 000000000..dc1b2e4dc --- /dev/null +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedSlotsImpl.java @@ -0,0 +1,350 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; + +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; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import me.shedaniel.math.Point; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.entry.renderer.BatchedEntryRenderer; +import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.util.CrashReportUtils; +import net.minecraft.CrashReport; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.renderer.MultiBufferSource; +import org.apache.commons.lang3.mutable.MutableInt; +import org.apache.commons.lang3.mutable.MutableLong; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +final class BatchedSlotsImpl extends BatchedSlots implements ForwardingList { + private final boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); + private final Int2ObjectMap> grouping = new Int2ObjectOpenHashMap<>(); + private final List toRender = new ArrayList<>(); + private final List delegateList = new DelegatedSlotList(); + private int size; + public boolean debug; + public MutableInt debugSize = new MutableInt(); + public MutableLong debugTime = new MutableLong(); + + @Override + public boolean isBatched() { + return fastEntryRendering; + } + + @Override + public List delegate() { + return delegateList; + } + + @Override + public void addAllUnbatched(Collection slots) { + this.toRender.addAll(slots); + this.size += slots.size(); + } + + @Override + public void addDebugger(MutableInt size, MutableLong time) { + this.debug = true; + this.debugSize = size; + this.debugTime = time; + } + + @Override + public void addUnbatched(Slot slot) { + this.toRender.add(slot); + this.size++; + } + + @Override + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (this.debug) { + render(false, null, null, matrices, mouseX, mouseY, delta); + } else { + render(true, debugSize, debugTime, matrices, mouseX, mouseY, delta); + } + } + + public void render(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta) { + if (fastEntryRendering) { + for (List 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, groupingAsList(entries), extraData); + } + } + if (!toRender.isEmpty()) { + renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, toRender); + } + } + + public List groupingsAsList() { + return CollectionUtils.concatUnmodifiable((Iterable>) () -> new AbstractIterator<>() { + final Iterator> groups = grouping.values().iterator(); + + @Nullable + @Override + protected List computeNext() { + if (groups.hasNext()) { + return groupingAsList(groups.next()); + } + return endOfData(); + } + }); + } + + public List groupingAsList(List entries) { + return new AbstractList<>() { + @Override + public Slot get(int index) { + return (Slot) entries.get(index * 2); + } + + @Override + public Iterator iterator() { + return new AbstractIterator<>() { + public int i = 0; + + @Override + protected Slot computeNext() { + if (i >= entries.size()) { + return endOfData(); + } + Slot widget = (Slot) entries.get(i); + i += 2; + return widget; + } + }; + } + + @Override + public int size() { + return entries.size() / 2; + } + }; + } + + public static void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Collection entries) { + if (fastEntryRendering) { + Slot firstWidget = Iterables.getFirst(entries, null); + if (firstWidget == null) return; + EntryRenderer renderer = firstWidget.getCurrentEntry().getRenderer(); + if (renderer instanceof BatchedEntryRenderer) { + BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; + Object[] extraData = new Object[entries.size()]; + int i = 0; + for (Slot entry : entries) { + EntryStack currentEntry = entry.getCurrentEntry(); + extraData[i++] = ((BatchedEntryRenderer) currentEntry.getRenderer()).getExtraData(currentEntry.cast()); + } + renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, entries, extraData); + return; + } + } + renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, entries); + } + + private static void renderBatched(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries, Object[] extraData) { + Slot firstWidget = Iterables.getFirst(entries, null); + if (firstWidget == null) return; + @SuppressWarnings("rawtypes") + EntryStack first = firstWidget.getCurrentEntry(); + EntryRenderer renderer = first.getRenderer(); + BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; + matrices = firstRenderer.batchModifyMatrices(matrices); + long l = debugTime ? System.nanoTime() : 0; + MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); + int i = 0; + for (Slot entry : entries) { + try { + entry.drawBackground(matrices, mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry background"); + CrashReportUtils.renderer(report, entry); + CrashReportUtils.catchReport(report); + return; + } + } + firstRenderer.startBatch(first, extraData[0], matrices, delta); + for (Slot entry : entries) { + try { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = entry.getCurrentEntry(); + currentEntry.setZ(100); + firstRenderer.renderBase(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); + if (debugTime && !currentEntry.isEmpty()) size.increment(); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry base"); + CrashReportUtils.renderer(report, entry); + CrashReportUtils.catchReport(report); + return; + } + } + immediate.endBatch(); + firstRenderer.afterBase(first, extraData[0], matrices, delta); + i = 0; + for (Slot entry : entries) { + try { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = entry.getCurrentEntry(); + firstRenderer.renderOverlay(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry base"); + CrashReportUtils.renderer(report, entry); + CrashReportUtils.catchReport(report); + return; + } + } + immediate.endBatch(); + for (Slot entry : entries) { + try { + if (entry.containsMouse(mouseX, mouseY)) { + Tooltip tooltip = entry.getCurrentTooltip(TooltipContext.of(new Point(mouseX, mouseY))); + if (tooltip != null) { + tooltip.queue(); + } + + if (entry.isHighlightEnabled()) { + entry.drawHighlighted(matrices, mouseX, mouseY, delta); + } + } + + entry.drawExtra(matrices, mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry extra"); + CrashReportUtils.renderer(report, entry); + CrashReportUtils.catchReport(report); + return; + } + } + if (debugTime) time.add(System.nanoTime() - l); + firstRenderer.endBatch(first, extraData[0], matrices, delta); + } + + public static void renderSlow(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries) { + for (Slot entry : entries) { + if (entry.getCurrentEntry().isEmpty()) + continue; + try { + if (debugTime) { + size.increment(); + long l = System.nanoTime(); + entry.render(matrices, mouseX, mouseY, delta); + time.add(System.nanoTime() - l); + } else entry.render(matrices, mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry"); + CrashReportUtils.renderer(report, entry); + CrashReportUtils.catchReport(report); + return; + } + } + } + + @Override + public List children() { + return null; + } + + private class DelegatedSlotList extends AbstractList { + private final List unmodifiable = CollectionUtils.concatUnmodifiable(toRender, + groupingsAsList()); + + @Override + public void add(int index, Slot element) { + add(element); + } + + @Override + public int size() { + return size; + } + + @Override + public boolean add(Slot widget) { + if (fastEntryRendering) { + EntryStack currentEntry = widget.getCurrentEntry(); + try { + EntryRenderer renderer = currentEntry.getRenderer(); + if (renderer instanceof BatchedEntryRenderer) { + BatchedEntryRenderer batchedRenderer = (BatchedEntryRenderer) renderer; + EntryStack 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 entries = grouping.get(hash); + if (entries == null) { + grouping.put(hash, entries = new ArrayList<>()); + } + entries.add(widget); + entries.add(extraData); + size++; + return true; + } + } + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Adding entry"); + CrashReportUtils.renderer(report, currentEntry); + CrashReportUtils.catchReport(report); + return false; + } + } + + addUnbatched(widget); + return true; + } + + @Override + public Slot get(int index) { + return unmodifiable.get(index); + } + + @Override + public boolean addAll(Collection widgets) { + if (fastEntryRendering) { + for (Slot widget : widgets) { + add(widget); + } + } else { + addAllUnbatched(widgets); + } + + return true; + } + } +} diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java index 550f98626..4140de261 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java @@ -29,6 +29,7 @@ import me.shedaniel.clothconfig2.api.animator.NumberAnimator; import me.shedaniel.clothconfig2.api.animator.ValueAnimator; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.BurningFire; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.util.Mth; @@ -41,7 +42,7 @@ final class BurningFireWidget extends BurningFire { private Rectangle bounds; private double animationDuration = -1; private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); public BurningFireWidget(Rectangle bounds) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java index f7efdc712..ae46a15d4 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java @@ -32,6 +32,7 @@ import me.shedaniel.math.Color; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Button; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import net.minecraft.client.gui.GuiComponent; @@ -78,7 +79,7 @@ final class ButtonWidget extends Button { this.bounds = Objects.requireNonNull(rectangle); this.text = Objects.requireNonNull(text); this.darkBackground = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFFFFFFF : 0x00FFFFFF), ValueAnimator.typicalTransitionTime()); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? 0xFFFFFFFF : 0x00FFFFFF), ValueAnimator.typicalTransitionTime()); this.alpha = ValueProvider.constant(1.0); } @@ -303,7 +304,7 @@ final class ButtonWidget extends Button { } protected void renderBackground(PoseStack matrices, int x, int y, int width, int height, int textureOffset) { - renderBackground(matrices, x, y, width, height, textureOffset, REIRuntime.getInstance().isDarkThemeEnabled(), Color.ofTransparent(0xFFFFFFFF)); + renderBackground(matrices, x, y, width, height, textureOffset, ConfigObject.getInstance().isUsingDarkTheme(), Color.ofTransparent(0xFFFFFFFF)); } protected void renderBackground(PoseStack matrices, int x, int y, int width, int height, int textureOffset, boolean dark, Color color) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java index b830b7d59..e3e6052b1 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java @@ -72,7 +72,7 @@ final class EntryWidget extends Slot implements DraggableStackProviderWidget { private static long stackDisplayOffset = 0; private final NumberAnimator darkHighlightedAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()); + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()); private final Rectangle bounds; @ApiStatus.Internal private byte noticeMark = Slot.UN_MARKED; @@ -267,7 +267,7 @@ final class EntryWidget extends Slot implements DraggableStackProviderWidget { } private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); @Override diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java index b38e3b7fa..dd2da618b 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java @@ -31,6 +31,7 @@ import me.shedaniel.math.Color; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Label; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widgets; @@ -57,9 +58,9 @@ final class LabelWidget extends Label { private boolean hasShadow = true; private boolean focusable = true; private ValueProvider color = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : -1), 50); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? 0xFFBBBBBB : -1), 50); private ValueProvider hoveredColor = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? -1 : 0xFF66FFCC), 50); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? -1 : 0xFF66FFCC), 50); private final ValueProvider finalColor = ValueAnimator.ofColor() .withConvention(() -> { if (!hovered) { @@ -169,7 +170,7 @@ final class LabelWidget extends Label { @Override public Label color(int lightModeColor, int darkModeColor) { this.color = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? darkModeColor : lightModeColor), ValueAnimator.typicalTransitionTime()); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? darkModeColor : lightModeColor), ValueAnimator.typicalTransitionTime()); this.color.completeImmediately(); this.finalColor.completeImmediately(); return this; diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java index 98f90d6bf..cce955efd 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java @@ -52,7 +52,7 @@ final class PanelWidget extends Panel { private int yTextureOffset = RecipeBorderType.DEFAULT.getYOffset(); private Predicate rendering = Predicates.alwaysTrue(); private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); public static boolean isRendering(Panel panel) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java index 818a037dc..cae2c165c 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java @@ -162,6 +162,6 @@ public class WidgetsProviderImpl implements WidgetsProvider { @Override public BatchedSlots createBatchedSlots() { - return new BatchedEntryRendererManager(); + return new BatchedSlotsImpl(); } } -- cgit