From 22383fd51e6fe7a13e4944ee0a0a6a74160e10a5 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 29 Jun 2024 13:57:41 -0700 Subject: [PATCH] Listless no longer - Visualizers return a list of visuals instead of just one - Simple*Visualizer's builders still only allow one visual per object, I'm not sure how best to expose adding multiple in a way that allows other mods to extend existing visualizers --- .../flywheel/api/visual/Effect.java | 4 +- .../visualization/BlockEntityVisualizer.java | 4 +- .../api/visualization/EntityVisualizer.java | 4 +- .../visual/SimpleBlockEntityVisualizer.java | 5 +- .../lib/visual/SimpleEntityVisualizer.java | 5 +- .../VisualizationManagerImpl.java | 17 +-- .../manager/BlockEntityStorage.java | 17 ++- .../visualization/manager/EffectStorage.java | 3 +- .../visualization/manager/EntityStorage.java | 10 +- .../manager/VisualManagerImpl.java | 2 +- .../impl/visualization/storage/Storage.java | 103 +++++++++++------- 11 files changed, 101 insertions(+), 73 deletions(-) diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visual/Effect.java b/common/src/api/java/dev/engine_room/flywheel/api/visual/Effect.java index 1b7e233e6..d75936c34 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visual/Effect.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visual/Effect.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.api.visual; +import java.util.List; + import dev.engine_room.flywheel.api.visualization.VisualizationContext; /** @@ -14,5 +16,5 @@ public interface Effect { * @param ctx The visualization context. * @return An arbitrary EffectVisual. */ - EffectVisual visualize(VisualizationContext ctx); + List> visualize(VisualizationContext ctx); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visualization/BlockEntityVisualizer.java b/common/src/api/java/dev/engine_room/flywheel/api/visualization/BlockEntityVisualizer.java index f24fd1dc5..bf5c2085d 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visualization/BlockEntityVisualizer.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visualization/BlockEntityVisualizer.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.api.visualization; +import java.util.List; + import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.world.level.block.entity.BlockEntity; @@ -16,7 +18,7 @@ public interface BlockEntityVisualizer { * @param blockEntity The block entity to construct a visual for. * @return The visual. */ - BlockEntityVisual createVisual(VisualizationContext ctx, T blockEntity); + List> createVisual(VisualizationContext ctx, T blockEntity); /** * Checks if the given block entity should not be rendered with the vanilla {@link BlockEntityRenderer}. diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visualization/EntityVisualizer.java b/common/src/api/java/dev/engine_room/flywheel/api/visualization/EntityVisualizer.java index f7128f811..2fb3d070d 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visualization/EntityVisualizer.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visualization/EntityVisualizer.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.api.visualization; +import java.util.List; + import dev.engine_room.flywheel.api.visual.EntityVisual; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.world.entity.Entity; @@ -16,7 +18,7 @@ public interface EntityVisualizer { * @param entity The entity to construct a visual for. * @return The visual. */ - EntityVisual createVisual(VisualizationContext ctx, T entity); + List> createVisual(VisualizationContext ctx, T entity); /** * Checks if the given entity should not render with the vanilla {@link EntityRenderer}. diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleBlockEntityVisualizer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleBlockEntityVisualizer.java index ab60f3d4c..882202ad3 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleBlockEntityVisualizer.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleBlockEntityVisualizer.java @@ -1,5 +1,6 @@ package dev.engine_room.flywheel.lib.visual; +import java.util.List; import java.util.Objects; import java.util.function.Predicate; @@ -23,8 +24,8 @@ public class SimpleBlockEntityVisualizer implements Block } @Override - public BlockEntityVisual createVisual(VisualizationContext ctx, T blockEntity) { - return visualFactory.create(ctx, blockEntity); + public List> createVisual(VisualizationContext ctx, T blockEntity) { + return List.of(visualFactory.create(ctx, blockEntity)); } @Override diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleEntityVisualizer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleEntityVisualizer.java index 4e908cdce..980d8d835 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleEntityVisualizer.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/SimpleEntityVisualizer.java @@ -1,5 +1,6 @@ package dev.engine_room.flywheel.lib.visual; +import java.util.List; import java.util.Objects; import java.util.function.Predicate; @@ -23,8 +24,8 @@ public class SimpleEntityVisualizer implements EntityVisualize } @Override - public EntityVisual createVisual(VisualizationContext ctx, T entity) { - return visualFactory.create(ctx, entity); + public List> createVisual(VisualizationContext ctx, T entity) { + return List.of(visualFactory.create(ctx, entity)); } @Override diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java index e0accaf2d..c9ac5d420 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -17,6 +17,7 @@ import dev.engine_room.flywheel.api.event.RenderStage; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.task.Plan; import dev.engine_room.flywheel.api.task.TaskExecutor; +import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visual.Effect; import dev.engine_room.flywheel.api.visual.TickableVisual; @@ -261,21 +262,23 @@ public class VisualizationManagerImpl implements VisualizationManager { continue; } - var visual = blockEntities.getStorage() + var visualList = blockEntities.getStorage() .visualAtPos(entry.getLongKey()); - if (visual == null) { + if (visualList == null || visualList.isEmpty()) { // The block doesn't have a visual, this is probably the common case. continue; } List instances = new ArrayList<>(); - visual.collectCrumblingInstances(instance -> { - if (instance != null) { - instances.add(instance); - } - }); + for (BlockEntityVisual visual : visualList) { + visual.collectCrumblingInstances(instance -> { + if (instance != null) { + instances.add(instance); + } + }); + } if (instances.isEmpty()) { // The visual doesn't want to render anything crumbling. diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/BlockEntityStorage.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/BlockEntityStorage.java index b61a3824f..d43e65e6c 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/BlockEntityStorage.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/BlockEntityStorage.java @@ -1,11 +1,11 @@ package dev.engine_room.flywheel.impl.visualization.manager; +import java.util.List; import java.util.function.Supplier; import org.jetbrains.annotations.Nullable; import dev.engine_room.flywheel.api.visual.BlockEntityVisual; -import dev.engine_room.flywheel.api.visual.Visual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.impl.visualization.storage.Storage; import dev.engine_room.flywheel.lib.visual.VisualizationHelper; @@ -17,14 +17,14 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; public class BlockEntityStorage extends Storage { - private final Long2ObjectMap> posLookup = new Long2ObjectOpenHashMap<>(); + private final Long2ObjectMap>> posLookup = new Long2ObjectOpenHashMap<>(); public BlockEntityStorage(Supplier visualizationContextSupplier) { super(visualizationContextSupplier); } @Nullable - public BlockEntityVisual visualAtPos(long pos) { + public List> visualAtPos(long pos) { return posLookup.get(pos); } @@ -53,19 +53,18 @@ public class BlockEntityStorage extends Storage { } @Override - @Nullable - protected Visual createRaw(BlockEntity obj) { + protected List> createRaw(BlockEntity obj) { var visualizer = VisualizationHelper.getVisualizer(obj); if (visualizer == null) { - return null; + return List.of(); } - var visual = visualizer.createVisual(visualizationContextSupplier.get(), obj); + var visualList = visualizer.createVisual(visualizationContextSupplier.get(), obj); BlockPos blockPos = obj.getBlockPos(); - posLookup.put(blockPos.asLong(), visual); + posLookup.put(blockPos.asLong(), visualList); - return visual; + return visualList; } @Override diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EffectStorage.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EffectStorage.java index 2d7816337..b25b383c9 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EffectStorage.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EffectStorage.java @@ -1,5 +1,6 @@ package dev.engine_room.flywheel.impl.visualization.manager; +import java.util.List; import java.util.function.Supplier; import dev.engine_room.flywheel.api.visual.Effect; @@ -13,7 +14,7 @@ public class EffectStorage extends Storage { } @Override - protected EffectVisual createRaw(Effect obj) { + protected List> createRaw(Effect obj) { return obj.visualize(visualizationContextSupplier.get()); } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EntityStorage.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EntityStorage.java index 0d5666880..c0e269d5a 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EntityStorage.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/EntityStorage.java @@ -1,10 +1,9 @@ package dev.engine_room.flywheel.impl.visualization.manager; +import java.util.List; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; - -import dev.engine_room.flywheel.api.visual.Visual; +import dev.engine_room.flywheel.api.visual.EntityVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.impl.visualization.storage.Storage; import dev.engine_room.flywheel.lib.visual.VisualizationHelper; @@ -17,11 +16,10 @@ public class EntityStorage extends Storage { } @Override - @Nullable - protected Visual createRaw(Entity obj) { + protected List> createRaw(Entity obj) { var visualizer = VisualizationHelper.getVisualizer(obj); if (visualizer == null) { - return null; + return List.of(); } return visualizer.createVisual(visualizationContextSupplier.get(), obj); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/VisualManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/VisualManagerImpl.java index 800714cb5..ea385a634 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/VisualManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/manager/VisualManagerImpl.java @@ -26,7 +26,7 @@ public class VisualManagerImpl> implements VisualManager @Override public int getVisualCount() { - return getStorage().getAllVisuals().size(); + return getStorage().visualCount(); } @Override diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java index 1c245e499..c81298150 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java @@ -1,13 +1,10 @@ package dev.engine_room.flywheel.impl.visualization.storage; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; - import dev.engine_room.flywheel.api.task.Plan; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visual.LitVisual; @@ -29,59 +26,50 @@ public abstract class Storage { protected final List simpleTickableVisuals = new ArrayList<>(); protected final LitVisualStorage litVisuals = new LitVisualStorage(); - private final Map visuals = new Reference2ObjectOpenHashMap<>(); + private final Map> visuals = new Reference2ObjectOpenHashMap<>(); public Storage(Supplier visualizationContextSupplier) { this.visualizationContextSupplier = visualizationContextSupplier; } - public Collection getAllVisuals() { - return visuals.values(); + public int visualCount() { + int out = 0; + for (var visualList : visuals.values()) { + out += visualList.size(); + } + return out; } public void add(T obj, float partialTick) { - Visual visual = visuals.get(obj); + var visualList = this.visuals.get(obj); - if (visual == null) { + if (visualList == null) { create(obj, partialTick); } } public void remove(T obj) { - Visual visual = visuals.remove(obj); + var visualList = this.visuals.remove(obj); - if (visual == null) { + if (visualList == null || visualList.isEmpty()) { return; } - if (visual instanceof TickableVisual tickable) { - if (visual instanceof SimpleTickableVisual simpleTickable) { - simpleTickableVisuals.remove(simpleTickable); - } else { - tickableVisuals.remove(tickable); - } + for (Visual visual : visualList) { + remove(visual); } - if (visual instanceof DynamicVisual dynamic) { - if (visual instanceof SimpleDynamicVisual simpleDynamic) { - simpleDynamicVisuals.remove(simpleDynamic); - } else { - dynamicVisuals.remove(dynamic); - } - } - if (visual instanceof LitVisual lit) { - litVisuals.remove(lit); - } - visual.delete(); } public void update(T obj, float partialTick) { - Visual visual = visuals.get(obj); + var visualList = visuals.get(obj); - if (visual == null) { + if (visualList == null || visualList.isEmpty()) { return; } - visual.update(partialTick); + for (Visual visual : visualList) { + visual.update(partialTick); + } } public void recreateAll(float partialTick) { @@ -90,13 +78,17 @@ public abstract class Storage { simpleTickableVisuals.clear(); simpleDynamicVisuals.clear(); litVisuals.clear(); - visuals.replaceAll((obj, visual) -> { - visual.delete(); + visuals.replaceAll((obj, visuals) -> { + visuals.forEach(Visual::delete); - Visual out = createRaw(obj); + var out = createRaw(obj); - if (out != null) { - setup(out, partialTick); + if (out.isEmpty()) { + return null; + } + + for (Visual visual : out) { + setup(visual, partialTick); } return out; @@ -107,22 +99,28 @@ public abstract class Storage { tickableVisuals.clear(); dynamicVisuals.clear(); litVisuals.clear(); - visuals.values() - .forEach(Visual::delete); + for (var visualList : visuals.values()) { + for (Visual visual : visualList) { + visual.delete(); + } + } visuals.clear(); } private void create(T obj, float partialTick) { - Visual visual = createRaw(obj); + var visuals = createRaw(obj); - if (visual != null) { + if (visuals.isEmpty()) { + return; + } + this.visuals.put(obj, visuals); + + for (Visual visual : visuals) { setup(visual, partialTick); - visuals.put(obj, visual); } } - @Nullable - protected abstract Visual createRaw(T obj); + protected abstract List createRaw(T obj); public Plan framePlan() { return NestedPlan.of(dynamicVisuals, litVisuals.plan(), ForEachPlan.of(() -> simpleDynamicVisuals, SimpleDynamicVisual::beginFrame)); @@ -160,6 +158,27 @@ public abstract class Storage { } } + private void remove(Visual visual) { + if (visual instanceof TickableVisual tickable) { + if (visual instanceof SimpleTickableVisual simpleTickable) { + simpleTickableVisuals.remove(simpleTickable); + } else { + tickableVisuals.remove(tickable); + } + } + if (visual instanceof DynamicVisual dynamic) { + if (visual instanceof SimpleDynamicVisual simpleDynamic) { + simpleDynamicVisuals.remove(simpleDynamic); + } else { + dynamicVisuals.remove(dynamic); + } + } + if (visual instanceof LitVisual lit) { + litVisuals.remove(lit); + } + visual.delete(); + } + /** * Is the given object currently capable of being added? *