From eb8dc6bc0730efe9da2738d861a84561e1508075 Mon Sep 17 00:00:00 2001 From: PepperCode1 <44146161+PepperCode1@users.noreply.github.com> Date: Mon, 3 Jan 2022 21:41:08 -0800 Subject: [PATCH] Switch to instancing controllers - Combine InstanceFactories and FlywheelRendered into InstancingControllers - Store these controllers directly in the BlockEntity/Entity type instead of a map for efficiency - Redo InstancedRenderRegistry to fit these changes - Rename all tile to block entity - Remove all interface I prefixes - Organize imports - Bump version to 0.5.1 --- gradle.properties | 2 +- .../com/jozufozu/flywheel/FlywheelClient.java | 1 - .../flywheel/api/FlywheelRendered.java | 14 -- .../jozufozu/flywheel/api/FlywheelWorld.java | 3 +- ...amicInstance.java => DynamicInstance.java} | 8 +- .../{IInstance.java => Instance.java} | 2 +- ...bleInstance.java => TickableInstance.java} | 10 +- .../flywheel/backend/GameStateRegistry.java | 10 +- .../backend/instancing/AbstractInstance.java | 16 +- .../backend/instancing/AbstractInstancer.java | 1 - .../backend/instancing/InstanceManager.java | 36 ++-- .../backend/instancing/InstanceWorld.java | 28 +-- .../instancing/InstancedRenderDispatcher.java | 16 +- .../instancing/InstancedRenderRegistry.java | 170 +++++++++++------- .../instancing/batching/BatchingEngine.java | 6 +- .../BlockEntityInstance.java} | 30 ++-- .../BlockEntityInstanceManager.java} | 22 ++- .../BlockEntityInstancingController.java | 11 ++ .../blockentity/BlockEntityTypeExtension.java | 9 + ...SimpleBlockEntityInstancingController.java | 28 +++ .../{tile => blockentity}/package-info.java | 2 +- .../instancing/entity/EntityInstance.java | 16 +- .../entity/EntityInstanceManager.java | 6 +- .../entity/EntityInstancingController.java | 11 ++ .../entity/EntityTypeExtension.java | 9 + .../entity/IEntityInstanceFactory.java | 10 -- .../SimpleEntityInstancingController.java | 28 +++ .../instancing/InstancingEngine.java | 2 +- .../instancing/tile/ITileInstanceFactory.java | 10 -- .../backend/source/FileResolution.java | 2 +- .../flywheel/backend/source/Resolver.java | 2 +- .../backend/source/ShaderSources.java | 2 +- .../{ISourceHolder.java => SourceHolder.java} | 2 +- .../flywheel/config/BooleanConfig.java | 3 - .../crumbling/CrumblingInstanceManager.java | 4 +- .../core/crumbling/CrumblingRenderer.java | 18 +- .../flywheel/core/hardcoded/ModelPart.java | 2 +- .../core/materials/model/ModelType.java | 6 +- .../materials/model/ModelWriterUnsafe.java | 2 +- .../core/materials/oriented/OrientedType.java | 4 +- .../oriented/OrientedWriterUnsafe.java | 2 +- .../core/shader/ExtensibleGlProgram.java | 10 +- .../core/shader/GameStateProgram.java | 14 +- ...onInstance.java => ExtensionInstance.java} | 2 +- .../extension/UnitExtensionInstance.java | 2 +- .../core/shader/extension/WorldFog.java | 2 +- ...teProvider.java => GameStateProvider.java} | 4 +- .../gamestate/NormalDebugStateProvider.java | 4 +- .../spec/BooleanGameStateCondition.java | 18 +- .../shader/spec/BooleanStateProvider.java | 13 ++ ...Condition.java => GameStateCondition.java} | 6 +- .../shader/spec/IBooleanStateProvider.java | 13 -- .../core/shader/spec/ProgramState.java | 4 +- .../shader/spec/SpecificValueCondition.java | 12 +- .../flywheel/core/vertex/BlockVertex.java | 2 +- .../core/vertex/PosTexNormalVertex.java | 2 +- .../core/virtual/VirtualRenderWorld.java | 10 +- .../flywheel/mixin/BlockEntityTypeMixin.java | 26 +++ .../flywheel/mixin/BufferBuilderMixin.java | 2 - .../mixin/CancelEntityRenderMixin.java | 4 +- .../mixin/ChunkRebuildHooksMixin.java | 9 +- .../flywheel/mixin/EntityTypeMixin.java | 26 +++ .../flywheel/mixin/InstanceAddMixin.java | 4 +- .../flywheel/mixin/InstanceRemoveMixin.java | 6 +- .../flywheel/mixin/RenderHooksMixin.java | 2 +- .../flywheel/vanilla/BellInstance.java | 20 +-- .../flywheel/vanilla/ChestInstance.java | 16 +- .../flywheel/vanilla/MinecartInstance.java | 8 +- .../flywheel/vanilla/ShulkerBoxInstance.java | 16 +- .../flywheel/vanilla/VanillaInstances.java | 60 ++++--- src/main/resources/flywheel.mixins.json | 2 + 71 files changed, 515 insertions(+), 370 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java rename src/main/java/com/jozufozu/flywheel/api/instance/{IDynamicInstance.java => DynamicInstance.java} (78%) rename src/main/java/com/jozufozu/flywheel/api/instance/{IInstance.java => Instance.java} (80%) rename src/main/java/com/jozufozu/flywheel/api/instance/{ITickableInstance.java => TickableInstance.java} (79%) rename src/main/java/com/jozufozu/flywheel/backend/instancing/{tile/TileEntityInstance.java => blockentity/BlockEntityInstance.java} (75%) rename src/main/java/com/jozufozu/flywheel/backend/instancing/{tile/TileInstanceManager.java => blockentity/BlockEntityInstanceManager.java} (58%) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstancingController.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityTypeExtension.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/SimpleBlockEntityInstancingController.java rename src/main/java/com/jozufozu/flywheel/backend/instancing/{tile => blockentity}/package-info.java (73%) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstancingController.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityTypeExtension.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/entity/SimpleEntityInstancingController.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java rename src/main/java/com/jozufozu/flywheel/backend/source/{ISourceHolder.java => SourceHolder.java} (86%) rename src/main/java/com/jozufozu/flywheel/core/shader/extension/{IExtensionInstance.java => ExtensionInstance.java} (87%) rename src/main/java/com/jozufozu/flywheel/core/shader/gamestate/{IGameStateProvider.java => GameStateProvider.java} (60%) create mode 100644 src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanStateProvider.java rename src/main/java/com/jozufozu/flywheel/core/shader/spec/{IGameStateCondition.java => GameStateCondition.java} (50%) delete mode 100644 src/main/java/com/jozufozu/flywheel/core/shader/spec/IBooleanStateProvider.java create mode 100644 src/main/java/com/jozufozu/flywheel/mixin/BlockEntityTypeMixin.java create mode 100644 src/main/java/com/jozufozu/flywheel/mixin/EntityTypeMixin.java diff --git a/gradle.properties b/gradle.properties index fb86b8d59..570812746 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false # mod version info -mod_version = 0.5.0a +mod_version = 0.5.1 mc_update_version = 1.18 minecraft_version = 1.18.1 forge_version = 39.0.8 diff --git a/src/main/java/com/jozufozu/flywheel/FlywheelClient.java b/src/main/java/com/jozufozu/flywheel/FlywheelClient.java index 3d7f7adb5..d3a46a9a7 100644 --- a/src/main/java/com/jozufozu/flywheel/FlywheelClient.java +++ b/src/main/java/com/jozufozu/flywheel/FlywheelClient.java @@ -15,7 +15,6 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; public class FlywheelClient { public static void clientInit() { - CrashReportCallables.registerCrashCallable("Flywheel Backend", () -> Backend.getInstance().getBackendDescriptor()); diff --git a/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java b/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java deleted file mode 100644 index 7ccb6149c..000000000 --- a/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.jozufozu.flywheel.api; - -/** - * Something (a BlockEntity or Entity) that can be rendered using the instancing API. - */ -public interface FlywheelRendered { - - /** - * @return true if there are parts of the renderer that cannot be implemented with Flywheel. - */ - default boolean shouldRenderNormally() { - return false; - } -} diff --git a/src/main/java/com/jozufozu/flywheel/api/FlywheelWorld.java b/src/main/java/com/jozufozu/flywheel/api/FlywheelWorld.java index 5cfa5320b..968535ed0 100644 --- a/src/main/java/com/jozufozu/flywheel/api/FlywheelWorld.java +++ b/src/main/java/com/jozufozu/flywheel/api/FlywheelWorld.java @@ -2,7 +2,8 @@ package com.jozufozu.flywheel.api; /** * A marker interface custom worlds can override to indicate - * that tiles inside the world should render with Flywheel. + * that block entities and entities inside the world should + * render with Flywheel. * * {@link net.minecraft.client.Minecraft#level Minecraft#level} is special cased and will support Flywheel by default. */ diff --git a/src/main/java/com/jozufozu/flywheel/api/instance/IDynamicInstance.java b/src/main/java/com/jozufozu/flywheel/api/instance/DynamicInstance.java similarity index 78% rename from src/main/java/com/jozufozu/flywheel/api/instance/IDynamicInstance.java rename to src/main/java/com/jozufozu/flywheel/api/instance/DynamicInstance.java index 75b4bdc15..14310c962 100644 --- a/src/main/java/com/jozufozu/flywheel/api/instance/IDynamicInstance.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/DynamicInstance.java @@ -2,18 +2,18 @@ package com.jozufozu.flywheel.api.instance; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; -import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; /** - * An interface giving {@link TileEntityInstance}s a hook to have a function called at - * the start of a frame. By implementing {@link IDynamicInstance}, a {@link TileEntityInstance} + * An interface giving {@link BlockEntityInstance}s a hook to have a function called at + * the start of a frame. By implementing {@link DynamicInstance}, a {@link BlockEntityInstance} * can animate its models in ways that could not be easily achieved by shader attribute * parameterization. * *

If your goal is offloading work to shaders, but you're unsure exactly how you need * to parameterize the instances, you're encouraged to implement this for prototyping. */ -public interface IDynamicInstance extends IInstance { +public interface DynamicInstance extends Instance { /** * Called every frame, and after initialization. *
diff --git a/src/main/java/com/jozufozu/flywheel/api/instance/IInstance.java b/src/main/java/com/jozufozu/flywheel/api/instance/Instance.java similarity index 80% rename from src/main/java/com/jozufozu/flywheel/api/instance/IInstance.java rename to src/main/java/com/jozufozu/flywheel/api/instance/Instance.java index 843cfb147..88a49c4fc 100644 --- a/src/main/java/com/jozufozu/flywheel/api/instance/IInstance.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/Instance.java @@ -2,6 +2,6 @@ package com.jozufozu.flywheel.api.instance; import net.minecraft.core.BlockPos; -public interface IInstance { +public interface Instance { BlockPos getWorldPosition(); } diff --git a/src/main/java/com/jozufozu/flywheel/api/instance/ITickableInstance.java b/src/main/java/com/jozufozu/flywheel/api/instance/TickableInstance.java similarity index 79% rename from src/main/java/com/jozufozu/flywheel/api/instance/ITickableInstance.java rename to src/main/java/com/jozufozu/flywheel/api/instance/TickableInstance.java index c0d32cb29..efb2fedb1 100644 --- a/src/main/java/com/jozufozu/flywheel/api/instance/ITickableInstance.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/TickableInstance.java @@ -2,13 +2,13 @@ package com.jozufozu.flywheel.api.instance; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; -import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; /** - * An interface giving {@link TileEntityInstance}s a hook to have a function called at - * the end of every tick. By implementing {@link ITickableInstance}, a {@link TileEntityInstance} + * An interface giving {@link BlockEntityInstance}s a hook to have a function called at + * the end of every tick. By implementing {@link TickableInstance}, a {@link BlockEntityInstance} * can update frequently, but not every frame. - *
There are a few cases in which this should be considered over {@link IDynamicInstance}: + *
There are a few cases in which this should be considered over {@link DynamicInstance}: * */ -public interface ITickableInstance extends IInstance { +public interface TickableInstance extends Instance { /** * Called every tick, and after initialization. diff --git a/src/main/java/com/jozufozu/flywheel/backend/GameStateRegistry.java b/src/main/java/com/jozufozu/flywheel/backend/GameStateRegistry.java index d7e6af08c..04aa431e6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/GameStateRegistry.java +++ b/src/main/java/com/jozufozu/flywheel/backend/GameStateRegistry.java @@ -3,20 +3,20 @@ package com.jozufozu.flywheel.backend; import java.util.HashMap; import java.util.Map; -import com.jozufozu.flywheel.core.shader.gamestate.IGameStateProvider; +import com.jozufozu.flywheel.core.shader.gamestate.GameStateProvider; import net.minecraft.resources.ResourceLocation; public class GameStateRegistry { - private static final Map registeredStateProviders = new HashMap<>(); + private static final Map registeredStateProviders = new HashMap<>(); static void clear() { registeredStateProviders.clear(); } - public static IGameStateProvider getStateProvider(ResourceLocation location) { - IGameStateProvider out = registeredStateProviders.get(location); + public static GameStateProvider getStateProvider(ResourceLocation location) { + GameStateProvider out = registeredStateProviders.get(location); if (out == null) { throw new IllegalArgumentException("State provider '" + location + "' does not exist."); @@ -25,7 +25,7 @@ public class GameStateRegistry { return out; } - public static void register(IGameStateProvider context) { + public static void register(GameStateProvider context) { if (registeredStateProviders.containsKey(context.getID())) { throw new IllegalStateException("Duplicate game state provider: " + context.getID()); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java index a194a265c..1a2ebb781 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java @@ -4,15 +4,15 @@ import java.util.Arrays; import java.util.stream.Stream; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.api.instance.IInstance; -import com.jozufozu.flywheel.api.instance.ITickableInstance; -import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.instance.Instance; +import com.jozufozu.flywheel.api.instance.TickableInstance; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstanceManager; import com.jozufozu.flywheel.core.materials.FlatLit; -import com.jozufozu.flywheel.util.box.ImmutableBox; import com.jozufozu.flywheel.light.LightListener; import com.jozufozu.flywheel.light.LightProvider; import com.jozufozu.flywheel.light.ListenerStatus; +import com.jozufozu.flywheel.util.box.ImmutableBox; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; @@ -20,9 +20,9 @@ import net.minecraft.world.level.LightLayer; /** * A general interface providing information about any type of thing that could use Flywheel's instanced rendering. - * Right now, that's only {@link TileInstanceManager}, but there could be an entity equivalent in the future. + * Right now, that's only {@link BlockEntityInstanceManager}, but there could be an entity equivalent in the future. */ -public abstract class AbstractInstance implements IInstance, LightListener { +public abstract class AbstractInstance implements Instance, LightListener { protected final MaterialManager materialManager; public final Level world; @@ -48,7 +48,7 @@ public abstract class AbstractInstance implements IInstance, LightListener { * Update instance data here. Good for when data doesn't change very often and when animations are GPU based. * Don't query lighting data here, that's handled separately in {@link #updateLight()}. * - *

If your animations are complex or more CPU driven, see {@link IDynamicInstance} or {@link ITickableInstance}. + *

If your animations are complex or more CPU driven, see {@link DynamicInstance} or {@link TickableInstance}. */ public void update() { } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java index ef1a6824c..e353a7104 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java @@ -6,7 +6,6 @@ import java.util.function.Supplier; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; -import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.model.Model; public abstract class AbstractInstancer implements Instancer { diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java index 6741c513c..8c79fe8e9 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java @@ -10,8 +10,8 @@ import java.util.Set; import javax.annotation.Nullable; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.light.LightUpdater; @@ -30,8 +30,8 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift private final Set queuedUpdates; protected final Map instances; - protected final Object2ObjectOpenHashMap tickableInstances; - protected final Object2ObjectOpenHashMap dynamicInstances; + protected final Object2ObjectOpenHashMap tickableInstances; + protected final Object2ObjectOpenHashMap dynamicInstances; protected int frame; protected int tick; @@ -71,7 +71,7 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift * Ticks the InstanceManager. * *

- * {@link ITickableInstance}s get ticked. + * {@link TickableInstance}s get ticked. *
* Queued updates are processed. *

@@ -85,16 +85,16 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift int cY = (int) cameraY; int cZ = (int) cameraZ; - ArrayList instances = new ArrayList<>(tickableInstances.values()); + ArrayList instances = new ArrayList<>(tickableInstances.values()); int incr = 500; int size = instances.size(); int start = 0; while (start < size) { int end = Math.min(start + incr, size); - List sub = instances.subList(start, end); + List sub = instances.subList(start, end); taskEngine.submit(() -> { - for (ITickableInstance instance : sub) { + for (TickableInstance instance : sub) { tickInstance(cX, cY, cZ, instance); } }); @@ -103,7 +103,7 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift } } - private void tickInstance(int cX, int cY, int cZ, ITickableInstance instance) { + private void tickInstance(int cX, int cY, int cZ, TickableInstance instance) { if (!instance.decreaseTickRateWithDistance()) { instance.tick(); return; @@ -132,16 +132,16 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift int cY = (int) info.getPosition().y; int cZ = (int) info.getPosition().z; - ArrayList instances = new ArrayList<>(dynamicInstances.values()); + ArrayList instances = new ArrayList<>(dynamicInstances.values()); int incr = 500; int size = instances.size(); int start = 0; while (start < size) { int end = Math.min(start + incr, size); - List sub = instances.subList(start, end); + List sub = instances.subList(start, end); taskEngine.submit(() -> { - for (IDynamicInstance dyn : sub) { + for (DynamicInstance dyn : sub) { if (!dyn.decreaseFramerateWithDistance() || shouldFrameUpdate(dyn.getWorldPosition(), lookX, lookY, lookZ, cX, cY, cZ)) dyn.beginFrame(); } @@ -179,8 +179,8 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift * *

* By default this is the only hook an IInstance has to change its internal state. This is the lowest frequency - * update hook IInstance gets. For more frequent updates, see {@link ITickableInstance} and - * {@link IDynamicInstance}. + * update hook IInstance gets. For more frequent updates, see {@link TickableInstance} and + * {@link DynamicInstance}. *

* * @param obj the object to update. @@ -312,12 +312,12 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift .addListener(renderer); instances.put(obj, renderer); - if (renderer instanceof ITickableInstance r) { + if (renderer instanceof TickableInstance r) { tickableInstances.put(obj, r); r.tick(); } - if (renderer instanceof IDynamicInstance r) { + if (renderer instanceof DynamicInstance r) { dynamicInstances.put(obj, r); r.beginFrame(); } @@ -328,9 +328,9 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift @Override public void onOriginShift() { - ArrayList instancedTiles = new ArrayList<>(instances.keySet()); + ArrayList instanced = new ArrayList<>(instances.keySet()); invalidate(); - instancedTiles.forEach(this::add); + instanced.forEach(this::add); } public void detachLightListeners() { diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java index a6167ab24..1f4c7200c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java @@ -1,12 +1,12 @@ package com.jozufozu.flywheel.backend.instancing; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.batching.BatchingEngine; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstanceManager; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstanceManager; import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; -import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; import com.jozufozu.flywheel.config.FlwEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.core.shader.WorldProgram; @@ -29,7 +29,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; public class InstanceWorld { protected final Engine engine; protected final InstanceManager entityInstanceManager; - protected final InstanceManager tileEntityInstanceManager; + protected final InstanceManager blockEntityInstanceManager; protected final ParallelTaskEngine taskEngine; @@ -48,16 +48,16 @@ public class InstanceWorld { .build(); entityInstanceManager = new EntityInstanceManager(manager); - tileEntityInstanceManager = new TileInstanceManager(manager); + blockEntityInstanceManager = new BlockEntityInstanceManager(manager); manager.addListener(entityInstanceManager); - manager.addListener(tileEntityInstanceManager); + manager.addListener(blockEntityInstanceManager); this.engine = manager; } case BATCHING -> { this.engine = new BatchingEngine(); entityInstanceManager = new EntityInstanceManager(this.engine); - tileEntityInstanceManager = new TileInstanceManager(this.engine); + blockEntityInstanceManager = new BlockEntityInstanceManager(this.engine); } default -> throw new IllegalArgumentException("Unknown engine type"); } @@ -67,8 +67,8 @@ public class InstanceWorld { return entityInstanceManager; } - public InstanceManager getTileEntityInstanceManager() { - return tileEntityInstanceManager; + public InstanceManager getBlockEntityInstanceManager() { + return blockEntityInstanceManager; } /** @@ -78,7 +78,7 @@ public class InstanceWorld { this.taskEngine.stopWorkers(); engine.delete(); entityInstanceManager.detachLightListeners(); - tileEntityInstanceManager.detachLightListeners(); + blockEntityInstanceManager.detachLightListeners(); } /** @@ -86,7 +86,7 @@ public class InstanceWorld { *

* Check and shift the origin coordinate. *
- * Call {@link IDynamicInstance#beginFrame()} on all instances in this world. + * Call {@link DynamicInstance#beginFrame()} on all instances in this world. *

*/ public void beginFrame(BeginFrameEvent event) { @@ -94,14 +94,14 @@ public class InstanceWorld { taskEngine.syncPoint(); - tileEntityInstanceManager.beginFrame(taskEngine, event.getInfo()); + blockEntityInstanceManager.beginFrame(taskEngine, event.getInfo()); entityInstanceManager.beginFrame(taskEngine, event.getInfo()); } /** * Tick the renderers after the game has ticked: *

- * Call {@link ITickableInstance#tick()} on all instances in this world. + * Call {@link TickableInstance#tick()} on all instances in this world. *

*/ public void tick() { @@ -110,7 +110,7 @@ public class InstanceWorld { if (renderViewEntity == null) return; - tileEntityInstanceManager.tick(taskEngine, renderViewEntity.getX(), renderViewEntity.getY(), renderViewEntity.getZ()); + blockEntityInstanceManager.tick(taskEngine, renderViewEntity.getX(), renderViewEntity.getY(), renderViewEntity.getZ()); entityInstanceManager.tick(taskEngine, renderViewEntity.getX(), renderViewEntity.getY(), renderViewEntity.getZ()); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java index 51755ed9f..bfc580517 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java @@ -26,13 +26,13 @@ public class InstancedRenderDispatcher { /** * Call this when you want to manually run {@link AbstractInstance#update()}. - * @param te The tile whose instance you want to update. + * @param blockEntity The block entity whose instance you want to update. */ - public static void enqueueUpdate(BlockEntity te) { - if (Backend.isOn() && te.hasLevel() && te.getLevel() instanceof ClientLevel) { - instanceWorlds.get(te.getLevel()) - .getTileEntityInstanceManager() - .queueUpdate(te); + public static void enqueueUpdate(BlockEntity blockEntity) { + if (Backend.isOn() && blockEntity.hasLevel() && blockEntity.getLevel() instanceof ClientLevel) { + instanceWorlds.get(blockEntity.getLevel()) + .getBlockEntityInstanceManager() + .queueUpdate(blockEntity); } } @@ -48,10 +48,10 @@ public class InstancedRenderDispatcher { } } - public static InstanceManager getTiles(LevelAccessor world) { + public static InstanceManager getBlockEntities(LevelAccessor world) { if (Backend.isOn()) { return instanceWorlds.get(world) - .getTileEntityInstanceManager(); + .getBlockEntityInstanceManager(); } else { throw new NullPointerException("Backend is off, cannot retrieve instance world."); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java index db0c325a4..87f43a90e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java @@ -1,134 +1,176 @@ package com.jozufozu.flywheel.backend.instancing; -import java.util.Map; +import java.util.Objects; +import java.util.function.BiFunction; +import java.util.function.Predicate; import javax.annotation.Nullable; -import com.google.common.collect.Maps; -import com.jozufozu.flywheel.api.FlywheelRendered; import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstancingController; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityTypeExtension; +import com.jozufozu.flywheel.backend.instancing.blockentity.SimpleBlockEntityInstancingController; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; -import com.jozufozu.flywheel.backend.instancing.entity.IEntityInstanceFactory; -import com.jozufozu.flywheel.backend.instancing.tile.ITileInstanceFactory; -import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; +import com.jozufozu.flywheel.backend.instancing.entity.EntityInstancingController; +import com.jozufozu.flywheel.backend.instancing.entity.EntityTypeExtension; +import com.jozufozu.flywheel.backend.instancing.entity.SimpleEntityInstancingController; -import it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; public class InstancedRenderRegistry { - private static final InstancedRenderRegistry INSTANCE = new InstancedRenderRegistry(); - - public static InstancedRenderRegistry getInstance() { - return INSTANCE; + public static boolean canInstance(BlockEntityType type) { + return getBlockEntityController(type) != null; } - private final Object2BooleanMap skipRender = new Object2BooleanLinkedOpenHashMap<>(); - private final Map, ITileInstanceFactory> tiles = Maps.newHashMap(); - private final Map, IEntityInstanceFactory> entities = Maps.newHashMap(); - - protected InstancedRenderRegistry() { - skipRender.defaultReturnValue(false); + public static boolean canInstance(EntityType type) { + return getEntityController(type) != null; } - public boolean shouldSkipRender(T type) { - return _skipRender(type.getType()) || ((type instanceof FlywheelRendered) && !((FlywheelRendered) type).shouldRenderNormally()); + @Nullable + public static BlockEntityInstance createInstance(MaterialManager materialManager, T blockEntity) { + BlockEntityInstancingController controller = getBlockEntityController(getType(blockEntity)); + if (controller == null) { + return null; + } + return controller.createInstance(materialManager, blockEntity); } - public boolean shouldSkipRender(T type) { - return _skipRender(type.getType()) || ((type instanceof FlywheelRendered) && !((FlywheelRendered) type).shouldRenderNormally()); + @Nullable + public static EntityInstance createInstance(MaterialManager materialManager, T entity) { + EntityInstancingController controller = getEntityController(getType(entity)); + if (controller == null) { + return null; + } + return controller.createInstance(materialManager, entity); } - public boolean canInstance(BlockEntityType type) { - return tiles.containsKey(type); + public static boolean shouldSkipRender(T blockEntity) { + BlockEntityInstancingController controller = getBlockEntityController(getType(blockEntity)); + if (controller == null) { + return false; + } + return controller.shouldSkipRender(blockEntity); } - public boolean canInstance(EntityType type) { - return entities.containsKey(type); + public static boolean shouldSkipRender(T entity) { + EntityInstancingController controller = getEntityController(getType(entity)); + if (controller == null) { + return false; + } + return controller.shouldSkipRender(entity); } - public TileConfig tile(BlockEntityType type) { - return new TileConfig<>(type); + public static BlockEntityConfig configure(BlockEntityType type) { + return new BlockEntityConfig<>(type); } - public EntityConfig entity(EntityType type) { + public static EntityConfig configure(EntityType type) { return new EntityConfig<>(type); } @SuppressWarnings("unchecked") @Nullable - public TileEntityInstance create(MaterialManager manager, T tile) { - BlockEntityType type = tile.getType(); - ITileInstanceFactory factory = (ITileInstanceFactory) this.tiles.get(type); - - if (factory == null) return null; - else return factory.create(manager, tile); + public static BlockEntityInstancingController getBlockEntityController(BlockEntityType type) { + return ((BlockEntityTypeExtension) type).flywheel$getInstancingController(); } + @SuppressWarnings("unchecked") + public static void setBlockEntityController(BlockEntityType type, BlockEntityInstancingController instancingController) { + ((BlockEntityTypeExtension) type).flywheel$setInstancingController(instancingController); + } @SuppressWarnings("unchecked") @Nullable - public EntityInstance create(MaterialManager manager, T tile) { - EntityType type = tile.getType(); - IEntityInstanceFactory factory = (IEntityInstanceFactory) this.entities.get(type); - - if (factory == null) return null; - else return factory.create(manager, tile); + public static EntityInstancingController getEntityController(EntityType type) { + return ((EntityTypeExtension) type).flywheel$getInstancingController(); } - private boolean _skipRender(Object o) { - return skipRender.getBoolean(o); + @SuppressWarnings("unchecked") + public static void setEntityController(EntityType type, EntityInstancingController instancingController) { + ((EntityTypeExtension) type).flywheel$setInstancingController(instancingController); } - public interface Config, FACTORY> { - - CONFIG factory(FACTORY rendererFactory); - - CONFIG setSkipRender(boolean skipRender); + @SuppressWarnings("unchecked") + public static BlockEntityType getType(T blockEntity) { + return (BlockEntityType) blockEntity.getType(); } - public class TileConfig implements Config, ITileInstanceFactory> { + @SuppressWarnings("unchecked") + public static EntityType getType(T entity) { + return (EntityType) entity.getType(); + } - private final BlockEntityType type; + public static class BlockEntityConfig { + protected BlockEntityType type; + protected BiFunction> instanceFactory; + protected Predicate skipRender; - public TileConfig(BlockEntityType type) { + public BlockEntityConfig(BlockEntityType type) { this.type = type; } - public TileConfig factory(ITileInstanceFactory rendererFactory) { - tiles.put(type, rendererFactory); + public BlockEntityConfig factory(BiFunction> instanceFactory) { + this.instanceFactory = instanceFactory; return this; } - public TileConfig setSkipRender(boolean skipRender) { - InstancedRenderRegistry.this.skipRender.put(type, skipRender); + public BlockEntityConfig skipRender(Predicate skipRender) { + this.skipRender = skipRender; return this; } + public BlockEntityConfig alwaysSkipRender() { + this.skipRender = be -> true; + return this; + } + + public SimpleBlockEntityInstancingController apply() { + Objects.requireNonNull(instanceFactory, "Instance factory cannot be null!"); + if (skipRender == null) { + skipRender = be -> false; + } + SimpleBlockEntityInstancingController controller = new SimpleBlockEntityInstancingController<>(instanceFactory, skipRender); + setBlockEntityController(type, controller); + return controller; + } } - public class EntityConfig implements Config, IEntityInstanceFactory> { - - private final EntityType type; + public static class EntityConfig { + protected EntityType type; + protected BiFunction> instanceFactory; + protected Predicate skipRender; public EntityConfig(EntityType type) { this.type = type; } - public EntityConfig factory(IEntityInstanceFactory rendererFactory) { - entities.put(type, rendererFactory); + public EntityConfig factory(BiFunction> instanceFactory) { + this.instanceFactory = instanceFactory; return this; } - public EntityConfig setSkipRender(boolean skipRender) { - InstancedRenderRegistry.this.skipRender.put(type, skipRender); - + public EntityConfig skipRender(Predicate skipRender) { + this.skipRender = skipRender; return this; } + public EntityConfig alwaysSkipRender() { + this.skipRender = entity -> true; + return this; + } + + public SimpleEntityInstancingController apply() { + Objects.requireNonNull(instanceFactory, "Instance factory cannot be null!"); + if (skipRender == null) { + skipRender = entity -> false; + } + SimpleEntityInstancingController controller = new SimpleEntityInstancingController<>(instanceFactory, skipRender); + setEntityController(type, controller); + return controller; + } } - } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java index caec4b844..ed1dd12cd 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java @@ -6,18 +6,14 @@ import java.util.Map; import com.jozufozu.flywheel.api.MaterialGroup; import com.jozufozu.flywheel.backend.RenderLayer; +import com.jozufozu.flywheel.backend.instancing.Engine; import com.jozufozu.flywheel.backend.instancing.SuperBufferSource; import com.jozufozu.flywheel.backend.instancing.TaskEngine; -import com.jozufozu.flywheel.backend.instancing.Engine; import com.jozufozu.flywheel.event.RenderLayerEvent; import com.mojang.blaze3d.platform.Lighting; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix4f; import net.minecraft.client.Camera; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java similarity index 75% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java index 59e9b71f1..11925664f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java @@ -1,9 +1,9 @@ -package com.jozufozu.flywheel.backend.instancing.tile; +package com.jozufozu.flywheel.backend.instancing.blockentity; import com.jozufozu.flywheel.api.Material; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; @@ -22,28 +22,28 @@ import net.minecraft.world.level.block.state.BlockState; * *

There are a few additional features that overriding classes can opt in to: *
    - *
  • {@link IDynamicInstance}
  • - *
  • {@link ITickableInstance}
  • + *
  • {@link DynamicInstance}
  • + *
  • {@link TickableInstance}
  • *
* See the interfaces' documentation for more information about each one. * - *
Implementing one or more of these will give a {@link TileEntityInstance} access + *
Implementing one or more of these will give a {@link BlockEntityInstance} access * to more interesting and regular points within a tick or a frame. * * @param The type of {@link BlockEntity} your class is an instance of. */ -public abstract class TileEntityInstance extends AbstractInstance { +public abstract class BlockEntityInstance extends AbstractInstance { - protected final T tile; + protected final T blockEntity; protected final BlockPos pos; protected final BlockPos instancePos; protected final BlockState blockState; - public TileEntityInstance(MaterialManager materialManager, T tile) { - super(materialManager, tile.getLevel()); - this.tile = tile; - this.pos = tile.getBlockPos(); - this.blockState = tile.getBlockState(); + public BlockEntityInstance(MaterialManager materialManager, T blockEntity) { + super(materialManager, blockEntity.getLevel()); + this.blockEntity = blockEntity; + this.pos = blockEntity.getBlockPos(); + this.blockState = blockEntity.getBlockState(); this.instancePos = pos.subtract(materialManager.getOriginCoordinate()); } @@ -56,12 +56,12 @@ public abstract class TileEntityInstance extends Abstract * @return true if this instance should be discarded and refreshed. */ public boolean shouldReset() { - return tile.getBlockState() != blockState; + return blockEntity.getBlockState() != blockState; } /** * In order to accommodate for floating point precision errors at high coordinates, - * {@link TileInstanceManager}s are allowed to arbitrarily adjust the origin, and + * {@link BlockEntityInstanceManager}s are allowed to arbitrarily adjust the origin, and * shift the world matrix provided as a shader uniform accordingly. * * @return The {@link BlockPos position} of the {@link BlockEntity} this instance diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstanceManager.java similarity index 58% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstanceManager.java index b0be524da..aebc9ee1e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstanceManager.java @@ -1,46 +1,44 @@ -package com.jozufozu.flywheel.backend.instancing.tile; +package com.jozufozu.flywheel.backend.instancing.blockentity; import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.instancing.TaskEngine; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -public class TileInstanceManager extends InstanceManager { +public class BlockEntityInstanceManager extends InstanceManager { - public TileInstanceManager(MaterialManager materialManager) { + public BlockEntityInstanceManager(MaterialManager materialManager) { super(materialManager); } @Override protected boolean canInstance(BlockEntity obj) { - return obj != null && InstancedRenderRegistry.getInstance().canInstance(obj.getType()); + return obj != null && InstancedRenderRegistry.canInstance(obj.getType()); } @Override protected AbstractInstance createRaw(BlockEntity obj) { - return InstancedRenderRegistry.getInstance() - .create(materialManager, obj); + return InstancedRenderRegistry.createInstance(materialManager, obj); } @Override - protected boolean canCreateInstance(BlockEntity tile) { - if (tile.isRemoved()) return false; + protected boolean canCreateInstance(BlockEntity blockEntity) { + if (blockEntity.isRemoved()) return false; - Level world = tile.getLevel(); + Level world = blockEntity.getLevel(); if (world == null) return false; - if (world.isEmptyBlock(tile.getBlockPos())) return false; + if (world.isEmptyBlock(blockEntity.getBlockPos())) return false; if (Backend.isFlywheelWorld(world)) { - BlockPos pos = tile.getBlockPos(); + BlockPos pos = blockEntity.getBlockPos(); BlockGetter existingChunk = world.getChunkForCollisions(pos.getX() >> 4, pos.getZ() >> 4); diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstancingController.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstancingController.java new file mode 100644 index 000000000..d2af7e459 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstancingController.java @@ -0,0 +1,11 @@ +package com.jozufozu.flywheel.backend.instancing.blockentity; + +import com.jozufozu.flywheel.api.MaterialManager; + +import net.minecraft.world.level.block.entity.BlockEntity; + +public interface BlockEntityInstancingController { + BlockEntityInstance createInstance(MaterialManager materialManager, T blockEntity); + + boolean shouldSkipRender(T blockEntity); +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityTypeExtension.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityTypeExtension.java new file mode 100644 index 000000000..e21f03334 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityTypeExtension.java @@ -0,0 +1,9 @@ +package com.jozufozu.flywheel.backend.instancing.blockentity; + +import net.minecraft.world.level.block.entity.BlockEntity; + +public interface BlockEntityTypeExtension { + BlockEntityInstancingController flywheel$getInstancingController(); + + void flywheel$setInstancingController(BlockEntityInstancingController instancingController); +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/SimpleBlockEntityInstancingController.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/SimpleBlockEntityInstancingController.java new file mode 100644 index 000000000..6b2cfe0e6 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/SimpleBlockEntityInstancingController.java @@ -0,0 +1,28 @@ +package com.jozufozu.flywheel.backend.instancing.blockentity; + +import java.util.function.BiFunction; +import java.util.function.Predicate; + +import com.jozufozu.flywheel.api.MaterialManager; + +import net.minecraft.world.level.block.entity.BlockEntity; + +public class SimpleBlockEntityInstancingController implements BlockEntityInstancingController { + protected BiFunction> instanceFactory; + protected Predicate skipRender; + + public SimpleBlockEntityInstancingController(BiFunction> instanceFactory, Predicate skipRender) { + this.instanceFactory = instanceFactory; + this.skipRender = skipRender; + } + + @Override + public BlockEntityInstance createInstance(MaterialManager materialManager, T blockEntity) { + return instanceFactory.apply(materialManager, blockEntity); + } + + @Override + public boolean shouldSkipRender(T blockEntity) { + return skipRender.test(blockEntity); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/package-info.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/package-info.java similarity index 73% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/tile/package-info.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/package-info.java index d8532a523..ceb2b6de9 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.backend.instancing.tile; +package com.jozufozu.flywheel.backend.instancing.blockentity; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java index e1f6f3830..02e03435c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java @@ -1,14 +1,14 @@ package com.jozufozu.flywheel.backend.instancing.entity; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; -import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.util.box.GridAlignedBB; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstanceManager; import com.jozufozu.flywheel.light.LightListener; import com.jozufozu.flywheel.light.LightProvider; import com.jozufozu.flywheel.light.MovingListener; +import com.jozufozu.flywheel.util.box.GridAlignedBB; import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; @@ -24,8 +24,8 @@ import net.minecraft.world.phys.Vec3; * * *

There are a few additional features that overriding classes can opt in to: *
    - *
  • {@link IDynamicInstance}
  • - *
  • {@link ITickableInstance}
  • + *
  • {@link DynamicInstance}
  • + *
  • {@link TickableInstance}
  • *
* See the interfaces' documentation for more information about each one. * @@ -65,7 +65,7 @@ public abstract class EntityInstance extends AbstractInstance /** * In order to accommodate for floating point precision errors at high coordinates, - * {@link TileInstanceManager}s are allowed to arbitrarily adjust the origin, and + * {@link BlockEntityInstanceManager}s are allowed to arbitrarily adjust the origin, and * shift the world matrix provided as a shader uniform accordingly. * * @return The position this instance should be rendered at to appear in the correct location. @@ -78,7 +78,7 @@ public abstract class EntityInstance extends AbstractInstance /** * In order to accommodate for floating point precision errors at high coordinates, - * {@link TileInstanceManager}s are allowed to arbitrarily adjust the origin, and + * {@link BlockEntityInstanceManager}s are allowed to arbitrarily adjust the origin, and * shift the world matrix provided as a shader uniform accordingly. * * @return The position this instance should be rendered at to appear in the correct location. diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java index 494800ae2..60ece43f5 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java @@ -5,7 +5,6 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.instancing.TaskEngine; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; @@ -20,13 +19,12 @@ public class EntityInstanceManager extends InstanceManager { @Override protected boolean canInstance(Entity obj) { - return obj != null && InstancedRenderRegistry.getInstance().canInstance(obj.getType()); + return obj != null && InstancedRenderRegistry.canInstance(obj.getType()); } @Override protected AbstractInstance createRaw(Entity obj) { - return InstancedRenderRegistry.getInstance() - .create(materialManager, obj); + return InstancedRenderRegistry.createInstance(materialManager, obj); } @Override diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstancingController.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstancingController.java new file mode 100644 index 000000000..c835ca59e --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstancingController.java @@ -0,0 +1,11 @@ +package com.jozufozu.flywheel.backend.instancing.entity; + +import com.jozufozu.flywheel.api.MaterialManager; + +import net.minecraft.world.entity.Entity; + +public interface EntityInstancingController { + EntityInstance createInstance(MaterialManager materialManager, T entity); + + boolean shouldSkipRender(T entity); +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityTypeExtension.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityTypeExtension.java new file mode 100644 index 000000000..cede41bbe --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityTypeExtension.java @@ -0,0 +1,9 @@ +package com.jozufozu.flywheel.backend.instancing.entity; + +import net.minecraft.world.entity.Entity; + +public interface EntityTypeExtension { + EntityInstancingController flywheel$getInstancingController(); + + void flywheel$setInstancingController(EntityInstancingController instancingController); +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java deleted file mode 100644 index 04927760a..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.jozufozu.flywheel.backend.instancing.entity; - -import com.jozufozu.flywheel.api.MaterialManager; - -import net.minecraft.world.entity.Entity; - -@FunctionalInterface -public interface IEntityInstanceFactory { - EntityInstance create(MaterialManager manager, E te); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/SimpleEntityInstancingController.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/SimpleEntityInstancingController.java new file mode 100644 index 000000000..d63eac390 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/SimpleEntityInstancingController.java @@ -0,0 +1,28 @@ +package com.jozufozu.flywheel.backend.instancing.entity; + +import java.util.function.BiFunction; +import java.util.function.Predicate; + +import com.jozufozu.flywheel.api.MaterialManager; + +import net.minecraft.world.entity.Entity; + +public class SimpleEntityInstancingController implements EntityInstancingController { + protected BiFunction> instanceFactory; + protected Predicate skipRender; + + public SimpleEntityInstancingController(BiFunction> instanceFactory, Predicate skipRender) { + this.instanceFactory = instanceFactory; + this.skipRender = skipRender; + } + + @Override + public EntityInstance createInstance(MaterialManager materialManager, T entity) { + return instanceFactory.apply(materialManager, entity); + } + + @Override + public boolean shouldSkipRender(T entity) { + return skipRender.test(entity); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java index 7f30b541e..b14cf78e7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java @@ -9,11 +9,11 @@ import java.util.stream.Stream; import javax.annotation.Nullable; import com.jozufozu.flywheel.api.MaterialGroup; -import com.jozufozu.flywheel.backend.instancing.TaskEngine; import com.jozufozu.flywheel.backend.RenderLayer; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.instancing.Engine; +import com.jozufozu.flywheel.backend.instancing.TaskEngine; import com.jozufozu.flywheel.core.WorldContext; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.event.RenderLayerEvent; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java deleted file mode 100644 index c1bdaa74b..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.jozufozu.flywheel.backend.instancing.tile; - -import com.jozufozu.flywheel.api.MaterialManager; - -import net.minecraft.world.level.block.entity.BlockEntity; - -@FunctionalInterface -public interface ITileInstanceFactory { - TileEntityInstance create(MaterialManager manager, T te); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/source/FileResolution.java b/src/main/java/com/jozufozu/flywheel/backend/source/FileResolution.java index 9799f00ca..5d2d221ef 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/source/FileResolution.java +++ b/src/main/java/com/jozufozu/flywheel/backend/source/FileResolution.java @@ -62,7 +62,7 @@ public class FileResolution { * Called after all files are loaded. If we can't find the file here, it doesn't exist. *

*/ - void resolve(ISourceHolder sources) { + void resolve(SourceHolder sources) { try { file = sources.findSource(fileLoc); diff --git a/src/main/java/com/jozufozu/flywheel/backend/source/Resolver.java b/src/main/java/com/jozufozu/flywheel/backend/source/Resolver.java index 185fcd4af..4377d8496 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/source/Resolver.java +++ b/src/main/java/com/jozufozu/flywheel/backend/source/Resolver.java @@ -28,7 +28,7 @@ public class Resolver { /** * Try and resolve all referenced source files, printing errors if any aren't found. */ - public void resolve(ISourceHolder sources) { + public void resolve(SourceHolder sources) { for (FileResolution resolution : resolutions.values()) { resolution.resolve(sources); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/source/ShaderSources.java b/src/main/java/com/jozufozu/flywheel/backend/source/ShaderSources.java index 00898a238..be9ab9dfb 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/source/ShaderSources.java +++ b/src/main/java/com/jozufozu/flywheel/backend/source/ShaderSources.java @@ -17,7 +17,7 @@ import net.minecraft.server.packs.resources.ResourceManager; /** * The main object for loading and parsing source files. */ -public class ShaderSources implements ISourceHolder { +public class ShaderSources implements SourceHolder { public static final String SHADER_DIR = "flywheel/shaders/"; public static final ArrayList EXTENSIONS = Lists.newArrayList(".vert", ".vsh", ".frag", ".fsh", ".glsl"); diff --git a/src/main/java/com/jozufozu/flywheel/backend/source/ISourceHolder.java b/src/main/java/com/jozufozu/flywheel/backend/source/SourceHolder.java similarity index 86% rename from src/main/java/com/jozufozu/flywheel/backend/source/ISourceHolder.java rename to src/main/java/com/jozufozu/flywheel/backend/source/SourceHolder.java index df209dcf7..9d25cbaea 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/source/ISourceHolder.java +++ b/src/main/java/com/jozufozu/flywheel/backend/source/SourceHolder.java @@ -6,7 +6,7 @@ import net.minecraft.resources.ResourceLocation; * A minimal source file lookup function. */ @FunctionalInterface -public interface ISourceHolder { +public interface SourceHolder { SourceFile findSource(ResourceLocation name); } diff --git a/src/main/java/com/jozufozu/flywheel/config/BooleanConfig.java b/src/main/java/com/jozufozu/flywheel/config/BooleanConfig.java index 78f611990..ae33c75f3 100644 --- a/src/main/java/com/jozufozu/flywheel/config/BooleanConfig.java +++ b/src/main/java/com/jozufozu/flywheel/config/BooleanConfig.java @@ -3,9 +3,6 @@ package com.jozufozu.flywheel.config; import java.util.function.Consumer; import java.util.function.Supplier; -import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.OptifineHandler; - import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java index 30e427f6b..edfcd2c0c 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java @@ -1,11 +1,11 @@ package com.jozufozu.flywheel.core.crumbling; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstanceManager; import net.minecraft.core.BlockPos; -public class CrumblingInstanceManager extends TileInstanceManager { +public class CrumblingInstanceManager extends BlockEntityInstanceManager { public CrumblingInstanceManager(MaterialManager materialManager) { super(materialManager); diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java index 056790864..e9aca9ff3 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java @@ -6,8 +6,8 @@ import java.util.SortedSet; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.GlTextureUnit; -import com.jozufozu.flywheel.backend.instancing.SerialTaskEngine; import com.jozufozu.flywheel.backend.instancing.InstanceManager; +import com.jozufozu.flywheel.backend.instancing.SerialTaskEngine; import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.event.ReloadRenderersEvent; @@ -36,7 +36,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; /** - * Responsible for rendering the block breaking overlay for instanced tiles. + * Responsible for rendering the block breaking overlay for instanced block entities. */ @OnlyIn(Dist.CLIENT) @Mod.EventBusSubscriber(Dist.CLIENT) @@ -57,7 +57,7 @@ public class CrumblingRenderer { public static void renderBreaking(RenderLayerEvent event) { if (!Backend.canUseInstancing(event.getWorld())) return; - Int2ObjectMap> activeStages = getActiveStageTiles(event.getWorld()); + Int2ObjectMap> activeStages = getActiveStageBlockEntities(event.getWorld()); if (activeStages.isEmpty()) return; @@ -90,9 +90,9 @@ public class CrumblingRenderer { } /** - * Associate each breaking stage with a list of all tile entities at that stage. + * Associate each breaking stage with a list of all block entities at that stage. */ - private static Int2ObjectMap> getActiveStageTiles(ClientLevel world) { + private static Int2ObjectMap> getActiveStageBlockEntities(ClientLevel world) { Int2ObjectMap> breakingEntities = new Int2ObjectArrayMap<>(); @@ -105,11 +105,11 @@ public class CrumblingRenderer { int blockDamage = progresses.last() .getProgress(); - BlockEntity tileEntity = world.getBlockEntity(breakingPos); + BlockEntity blockEntity = world.getBlockEntity(breakingPos); - if (tileEntity != null) { - List tileEntities = breakingEntities.computeIfAbsent(blockDamage, $ -> new ArrayList<>()); - tileEntities.add(tileEntity); + if (blockEntity != null) { + List blockEntities = breakingEntities.computeIfAbsent(blockDamage, $ -> new ArrayList<>()); + blockEntities.add(blockEntity); } } } diff --git a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java index 77078ffff..67bdeb798 100644 --- a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java +++ b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java @@ -2,9 +2,9 @@ package com.jozufozu.flywheel.core.hardcoded; import java.util.List; +import com.jozufozu.flywheel.api.vertex.VertexList; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.core.model.Model; -import com.jozufozu.flywheel.api.vertex.VertexList; import com.jozufozu.flywheel.core.vertex.PosTexNormalWriterUnsafe; import com.mojang.blaze3d.platform.MemoryTracker; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java index fdd5127b0..67172a308 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java @@ -3,11 +3,11 @@ package com.jozufozu.flywheel.core.materials.model; import com.jozufozu.flywheel.api.struct.Batched; import com.jozufozu.flywheel.api.struct.Instanced; import com.jozufozu.flywheel.api.struct.StructWriter; -import com.jozufozu.flywheel.core.layout.CommonItems; -import com.jozufozu.flywheel.core.layout.MatrixItems; -import com.jozufozu.flywheel.core.layout.BufferLayout; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.Programs; +import com.jozufozu.flywheel.core.layout.BufferLayout; +import com.jozufozu.flywheel.core.layout.CommonItems; +import com.jozufozu.flywheel.core.layout.MatrixItems; import com.jozufozu.flywheel.core.model.ModelTransformer; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelWriterUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelWriterUnsafe.java index 354751f4e..6f3682040 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelWriterUnsafe.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelWriterUnsafe.java @@ -1,7 +1,7 @@ package com.jozufozu.flywheel.core.materials.model; -import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.api.struct.StructType; +import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.materials.BasicWriterUnsafe; import com.jozufozu.flywheel.util.MatrixWrite; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java index d2f7e57eb..c74056390 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java @@ -3,10 +3,10 @@ package com.jozufozu.flywheel.core.materials.oriented; import com.jozufozu.flywheel.api.struct.Batched; import com.jozufozu.flywheel.api.struct.Instanced; import com.jozufozu.flywheel.api.struct.StructWriter; -import com.jozufozu.flywheel.core.layout.CommonItems; -import com.jozufozu.flywheel.core.layout.BufferLayout; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.Programs; +import com.jozufozu.flywheel.core.layout.BufferLayout; +import com.jozufozu.flywheel.core.layout.CommonItems; import com.jozufozu.flywheel.core.model.ModelTransformer; import com.mojang.math.Quaternion; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedWriterUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedWriterUnsafe.java index f7db693a3..f7afd8c2b 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedWriterUnsafe.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedWriterUnsafe.java @@ -2,8 +2,8 @@ package com.jozufozu.flywheel.core.materials.oriented; import org.lwjgl.system.MemoryUtil; -import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.api.struct.StructType; +import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.materials.BasicWriterUnsafe; public class OrientedWriterUnsafe extends BasicWriterUnsafe { diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java b/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java index 72f642020..05ef8dc73 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java @@ -7,13 +7,13 @@ import javax.annotation.Nonnull; import com.jozufozu.flywheel.backend.ShaderContext; import com.jozufozu.flywheel.backend.gl.shader.GlProgram; -import com.jozufozu.flywheel.core.shader.extension.IExtensionInstance; +import com.jozufozu.flywheel.core.shader.extension.ExtensionInstance; import net.minecraft.resources.ResourceLocation; /** * A shader program that be arbitrarily "extended". This class can take in any number of program extensions, and - * will initialize them and then call their {@link IExtensionInstance#bind() bind} function every subsequent time this + * will initialize them and then call their {@link ExtensionInstance#bind() bind} function every subsequent time this * program is bound. An "extension" is something that interacts with the shader program in a way that is invisible to * the caller using the program. This is used by some programs to implement the different fog modes. Other uses might * include binding extra textures to allow for blocks to have normal maps, for example. As the extensions are @@ -22,7 +22,7 @@ import net.minecraft.resources.ResourceLocation; */ public class ExtensibleGlProgram extends GlProgram { - protected final List extensions = new ArrayList<>(); + protected final List extensions = new ArrayList<>(); public ExtensibleGlProgram(ResourceLocation name, int handle) { super(name, handle); @@ -32,7 +32,7 @@ public class ExtensibleGlProgram extends GlProgram { public void bind() { super.bind(); - extensions.forEach(IExtensionInstance::bind); + extensions.forEach(ExtensionInstance::bind); } @Override @@ -42,7 +42,7 @@ public class ExtensibleGlProgram extends GlProgram { .append(name) .append('['); - for (IExtensionInstance extension : extensions) { + for (ExtensionInstance extension : extensions) { builder.append(extension) .append('+'); } diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java b/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java index 12bc659ad..ce6ae31cd 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java @@ -5,22 +5,22 @@ import java.util.List; import com.google.common.collect.ImmutableList; import com.jozufozu.flywheel.backend.gl.shader.GlProgram; -import com.jozufozu.flywheel.core.shader.spec.IGameStateCondition; +import com.jozufozu.flywheel.core.shader.spec.GameStateCondition; import com.jozufozu.flywheel.util.Pair; public class GameStateProgram

implements ContextAwareProgram

{ - private final List> variants; + private final List> variants; private final P fallback; - protected GameStateProgram(List> variants, P fallback) { + protected GameStateProgram(List> variants, P fallback) { this.variants = variants; this.fallback = fallback; } @Override public P get() { - for (Pair variant : variants) { + for (Pair variant : variants) { if (variant.first() .isMet()) return variant.second(); } @@ -30,7 +30,7 @@ public class GameStateProgram

implements ContextAwareProgra @Override public void delete() { - for (Pair variant : variants) { + for (Pair variant : variants) { variant.second() .delete(); } @@ -44,13 +44,13 @@ public class GameStateProgram

implements ContextAwareProgra public static class Builder

{ private final P fallback; - private final List> variants = new ArrayList<>(); + private final List> variants = new ArrayList<>(); public Builder(P fallback) { this.fallback = fallback; } - public Builder

withVariant(IGameStateCondition condition, P program) { + public Builder

withVariant(GameStateCondition condition, P program) { variants.add(Pair.of(condition, program)); return this; } diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/extension/IExtensionInstance.java b/src/main/java/com/jozufozu/flywheel/core/shader/extension/ExtensionInstance.java similarity index 87% rename from src/main/java/com/jozufozu/flywheel/core/shader/extension/IExtensionInstance.java rename to src/main/java/com/jozufozu/flywheel/core/shader/extension/ExtensionInstance.java index d6c2e0f04..6499820c9 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/extension/IExtensionInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/extension/ExtensionInstance.java @@ -2,7 +2,7 @@ package com.jozufozu.flywheel.core.shader.extension; import net.minecraft.resources.ResourceLocation; -public interface IExtensionInstance { +public interface ExtensionInstance { /** * Bind the extra program state. It is recommended to grab the state information from global variables. diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/extension/UnitExtensionInstance.java b/src/main/java/com/jozufozu/flywheel/core/shader/extension/UnitExtensionInstance.java index ac3dcc36e..70d1bff4b 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/extension/UnitExtensionInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/extension/UnitExtensionInstance.java @@ -5,7 +5,7 @@ import com.jozufozu.flywheel.backend.gl.shader.GlProgram; import net.minecraft.resources.ResourceLocation; -public class UnitExtensionInstance implements IExtensionInstance { +public class UnitExtensionInstance implements ExtensionInstance { public static final ResourceLocation NAME = Flywheel.rl("unit"); diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/extension/WorldFog.java b/src/main/java/com/jozufozu/flywheel/core/shader/extension/WorldFog.java index b76c370eb..dd371debd 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/extension/WorldFog.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/extension/WorldFog.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.resources.ResourceLocation; -public class WorldFog implements IExtensionInstance { +public class WorldFog implements ExtensionInstance { public static final ResourceLocation NAME = Flywheel.rl("fog"); diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/IGameStateProvider.java b/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/GameStateProvider.java similarity index 60% rename from src/main/java/com/jozufozu/flywheel/core/shader/gamestate/IGameStateProvider.java rename to src/main/java/com/jozufozu/flywheel/core/shader/gamestate/GameStateProvider.java index 8e472de72..a7f7fb0ba 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/IGameStateProvider.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/GameStateProvider.java @@ -5,9 +5,9 @@ import com.mojang.serialization.Codec; import net.minecraft.resources.ResourceLocation; -public interface IGameStateProvider { +public interface GameStateProvider { - Codec CODEC = ResourceLocation.CODEC.xmap(GameStateRegistry::getStateProvider, IGameStateProvider::getID); + Codec CODEC = ResourceLocation.CODEC.xmap(GameStateRegistry::getStateProvider, GameStateProvider::getID); ResourceLocation getID(); diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/NormalDebugStateProvider.java b/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/NormalDebugStateProvider.java index f7ddbbea0..01646f027 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/NormalDebugStateProvider.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/gamestate/NormalDebugStateProvider.java @@ -2,11 +2,11 @@ package com.jozufozu.flywheel.core.shader.gamestate; import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.config.FlwConfig; -import com.jozufozu.flywheel.core.shader.spec.IBooleanStateProvider; +import com.jozufozu.flywheel.core.shader.spec.BooleanStateProvider; import net.minecraft.resources.ResourceLocation; -public class NormalDebugStateProvider implements IBooleanStateProvider { +public class NormalDebugStateProvider implements BooleanStateProvider { public static final NormalDebugStateProvider INSTANCE = new NormalDebugStateProvider(); public static final ResourceLocation NAME = Flywheel.rl("normal_debug"); diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanGameStateCondition.java b/src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanGameStateCondition.java index 6293ade94..9ff461f6b 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanGameStateCondition.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanGameStateCondition.java @@ -1,22 +1,22 @@ package com.jozufozu.flywheel.core.shader.spec; -import com.jozufozu.flywheel.core.shader.gamestate.IGameStateProvider; +import com.jozufozu.flywheel.core.shader.gamestate.GameStateProvider; import com.mojang.serialization.Codec; import net.minecraft.resources.ResourceLocation; -public class BooleanGameStateCondition implements IGameStateCondition { +public class BooleanGameStateCondition implements GameStateCondition { - public static final Codec BOOLEAN_SUGAR = IGameStateProvider.CODEC.xmap(gameContext -> { - if (gameContext instanceof IBooleanStateProvider) { - return new BooleanGameStateCondition(((IBooleanStateProvider) gameContext)); + public static final Codec BOOLEAN_SUGAR = GameStateProvider.CODEC.xmap(gameContext -> { + if (gameContext instanceof BooleanStateProvider) { + return new BooleanGameStateCondition(((BooleanStateProvider) gameContext)); } return null; - }, IGameStateCondition::getStateProvider); - protected final IBooleanStateProvider context; + }, GameStateCondition::getStateProvider); + protected final BooleanStateProvider context; - public BooleanGameStateCondition(IBooleanStateProvider context) { + public BooleanGameStateCondition(BooleanStateProvider context) { this.context = context; } @@ -26,7 +26,7 @@ public class BooleanGameStateCondition implements IGameStateCondition { } @Override - public IGameStateProvider getStateProvider() { + public GameStateProvider getStateProvider() { return context; } diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanStateProvider.java b/src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanStateProvider.java new file mode 100644 index 000000000..1cf0b1da2 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/shader/spec/BooleanStateProvider.java @@ -0,0 +1,13 @@ +package com.jozufozu.flywheel.core.shader.spec; + +import com.jozufozu.flywheel.core.shader.gamestate.GameStateProvider; + +public interface BooleanStateProvider extends GameStateProvider { + + boolean isTrue(); + + @Override + default Boolean getValue() { + return isTrue(); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/spec/IGameStateCondition.java b/src/main/java/com/jozufozu/flywheel/core/shader/spec/GameStateCondition.java similarity index 50% rename from src/main/java/com/jozufozu/flywheel/core/shader/spec/IGameStateCondition.java rename to src/main/java/com/jozufozu/flywheel/core/shader/spec/GameStateCondition.java index 08fd87dc3..c8ad1e1cf 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/spec/IGameStateCondition.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/spec/GameStateCondition.java @@ -1,14 +1,14 @@ package com.jozufozu.flywheel.core.shader.spec; -import com.jozufozu.flywheel.core.shader.gamestate.IGameStateProvider; +import com.jozufozu.flywheel.core.shader.gamestate.GameStateProvider; import net.minecraft.resources.ResourceLocation; -public interface IGameStateCondition { +public interface GameStateCondition { ResourceLocation getID(); - IGameStateProvider getStateProvider(); + GameStateProvider getStateProvider(); boolean isMet(); } diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/spec/IBooleanStateProvider.java b/src/main/java/com/jozufozu/flywheel/core/shader/spec/IBooleanStateProvider.java deleted file mode 100644 index 1f1265724..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/shader/spec/IBooleanStateProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jozufozu.flywheel.core.shader.spec; - -import com.jozufozu.flywheel.core.shader.gamestate.IGameStateProvider; - -public interface IBooleanStateProvider extends IGameStateProvider { - - boolean isTrue(); - - @Override - default Boolean getValue() { - return isTrue(); - } -} diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/spec/ProgramState.java b/src/main/java/com/jozufozu/flywheel/core/shader/spec/ProgramState.java index e680c4e85..7f4fc7782 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/spec/ProgramState.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/spec/ProgramState.java @@ -9,10 +9,10 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; -public record ProgramState(IGameStateCondition context, List defines) { +public record ProgramState(GameStateCondition context, List defines) { // TODO: Use Codec.dispatch - private static final Codec WHEN = Codec.either(BooleanGameStateCondition.BOOLEAN_SUGAR, SpecificValueCondition.CODEC) + private static final Codec WHEN = Codec.either(BooleanGameStateCondition.BOOLEAN_SUGAR, SpecificValueCondition.CODEC) .flatXmap(either -> either.map(DataResult::success, DataResult::success), any -> { if (any instanceof BooleanGameStateCondition) { return DataResult.success(Either.left((BooleanGameStateCondition) any)); diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/spec/SpecificValueCondition.java b/src/main/java/com/jozufozu/flywheel/core/shader/spec/SpecificValueCondition.java index 69e40a08d..fc530536e 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/spec/SpecificValueCondition.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/spec/SpecificValueCondition.java @@ -1,22 +1,22 @@ package com.jozufozu.flywheel.core.shader.spec; -import com.jozufozu.flywheel.core.shader.gamestate.IGameStateProvider; +import com.jozufozu.flywheel.core.shader.gamestate.GameStateProvider; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.resources.ResourceLocation; -public class SpecificValueCondition implements IGameStateCondition { +public class SpecificValueCondition implements GameStateCondition { - public static final Codec CODEC = RecordCodecBuilder.create(condition -> condition.group(IGameStateProvider.CODEC.fieldOf("provider") + public static final Codec CODEC = RecordCodecBuilder.create(condition -> condition.group(GameStateProvider.CODEC.fieldOf("provider") .forGetter(SpecificValueCondition::getStateProvider), Codec.STRING.fieldOf("value") .forGetter(SpecificValueCondition::getValue)) .apply(condition, SpecificValueCondition::new)); private final String required; - private final IGameStateProvider context; + private final GameStateProvider context; - public SpecificValueCondition(IGameStateProvider context, String required) { + public SpecificValueCondition(GameStateProvider context, String required) { this.required = required; this.context = context; } @@ -31,7 +31,7 @@ public class SpecificValueCondition implements IGameStateCondition { } @Override - public IGameStateProvider getStateProvider() { + public GameStateProvider getStateProvider() { return context; } diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java index eb77286fc..4a6664d0b 100644 --- a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java +++ b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java @@ -4,8 +4,8 @@ import java.nio.ByteBuffer; import com.jozufozu.flywheel.api.vertex.VertexList; import com.jozufozu.flywheel.api.vertex.VertexType; -import com.jozufozu.flywheel.core.layout.CommonItems; import com.jozufozu.flywheel.core.layout.BufferLayout; +import com.jozufozu.flywheel.core.layout.CommonItems; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.datafixers.util.Pair; diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java index feb7ff348..85daec969 100644 --- a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java +++ b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java @@ -3,8 +3,8 @@ package com.jozufozu.flywheel.core.vertex; import java.nio.ByteBuffer; import com.jozufozu.flywheel.api.vertex.VertexType; -import com.jozufozu.flywheel.core.layout.CommonItems; import com.jozufozu.flywheel.core.layout.BufferLayout; +import com.jozufozu.flywheel.core.layout.CommonItems; public class PosTexNormalVertex implements VertexType { diff --git a/src/main/java/com/jozufozu/flywheel/core/virtual/VirtualRenderWorld.java b/src/main/java/com/jozufozu/flywheel/core/virtual/VirtualRenderWorld.java index bfd246988..a0687b992 100644 --- a/src/main/java/com/jozufozu/flywheel/core/virtual/VirtualRenderWorld.java +++ b/src/main/java/com/jozufozu/flywheel/core/virtual/VirtualRenderWorld.java @@ -43,7 +43,7 @@ import net.minecraft.world.ticks.LevelTickAccess; public class VirtualRenderWorld extends Level implements FlywheelWorld { public final Map blocksAdded = new HashMap<>(); - public final Map tesAdded = new HashMap<>(); + public final Map besAdded = new HashMap<>(); public final Set spannedSections = new HashSet<>(); private final BlockPos.MutableBlockPos scratch = new BlockPos.MutableBlockPos(); @@ -85,9 +85,9 @@ public class VirtualRenderWorld extends Level implements FlywheelWorld { lighter.runUpdates(Integer.MAX_VALUE, false, false); } - public void setTileEntities(Collection tileEntities) { - tesAdded.clear(); - tileEntities.forEach(te -> tesAdded.put(te.getBlockPos(), te)); + public void setBlockEntities(Collection blockEntities) { + besAdded.clear(); + blockEntities.forEach(be -> besAdded.put(be.getBlockPos(), be)); } public void clear() { @@ -153,7 +153,7 @@ public class VirtualRenderWorld extends Level implements FlywheelWorld { @Override @Nullable public BlockEntity getBlockEntity(BlockPos pos) { - return tesAdded.get(pos); + return besAdded.get(pos); } @Override diff --git a/src/main/java/com/jozufozu/flywheel/mixin/BlockEntityTypeMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/BlockEntityTypeMixin.java new file mode 100644 index 000000000..c9f086957 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/mixin/BlockEntityTypeMixin.java @@ -0,0 +1,26 @@ +package com.jozufozu.flywheel.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstancingController; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityTypeExtension; + +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; + +@Mixin(BlockEntityType.class) +public class BlockEntityTypeMixin implements BlockEntityTypeExtension { + @Unique + private BlockEntityInstancingController flywheel$instancingController; + + @Override + public BlockEntityInstancingController flywheel$getInstancingController() { + return flywheel$instancingController; + } + + @Override + public void flywheel$setInstancingController(BlockEntityInstancingController instancingController) { + this.flywheel$instancingController = instancingController; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/mixin/BufferBuilderMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/BufferBuilderMixin.java index a105affa3..5a67e78a2 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/BufferBuilderMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/BufferBuilderMixin.java @@ -9,8 +9,6 @@ import org.lwjgl.system.MemoryUtil; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import com.jozufozu.flywheel.backend.instancing.SuperBufferSource; -import com.jozufozu.flywheel.backend.model.DirectVertexConsumer; import com.jozufozu.flywheel.backend.model.BufferBuilderHack; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.VertexFormat; diff --git a/src/main/java/com/jozufozu/flywheel/mixin/CancelEntityRenderMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/CancelEntityRenderMixin.java index 0e64a35ed..ed1a41e6e 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/CancelEntityRenderMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/CancelEntityRenderMixin.java @@ -24,11 +24,9 @@ public class CancelEntityRenderMixin { private Iterable filterEntities(ClientLevel world) { Iterable entities = world.entitiesForRendering(); if (Backend.isOn()) { - ArrayList filtered = Lists.newArrayList(entities); - InstancedRenderRegistry r = InstancedRenderRegistry.getInstance(); - filtered.removeIf(r::shouldSkipRender); + filtered.removeIf(InstancedRenderRegistry::shouldSkipRender); return filtered; } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java index 861fa7c06..a4accbe24 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java @@ -22,14 +22,11 @@ public class ChunkRebuildHooksMixin { @Inject(method = "handleBlockEntity", at = @At("HEAD"), cancellable = true) private void addAndFilterBEs(ChunkRenderDispatcher.CompiledChunk compiledChunk, Set set, E be, CallbackInfo ci) { - if (Backend.canUseInstancing(be.getLevel())) { + if (InstancedRenderRegistry.canInstance(be.getType())) + InstancedRenderDispatcher.getBlockEntities(be.getLevel()).queueAdd(be); - InstancedRenderRegistry registry = InstancedRenderRegistry.getInstance(); - if (registry.canInstance(be.getType())) - InstancedRenderDispatcher.getTiles(be.getLevel()).queueAdd(be); - - if (registry.shouldSkipRender(be)) + if (InstancedRenderRegistry.shouldSkipRender(be)) ci.cancel(); } } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/EntityTypeMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/EntityTypeMixin.java new file mode 100644 index 000000000..828232c4a --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/mixin/EntityTypeMixin.java @@ -0,0 +1,26 @@ +package com.jozufozu.flywheel.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +import com.jozufozu.flywheel.backend.instancing.entity.EntityInstancingController; +import com.jozufozu.flywheel.backend.instancing.entity.EntityTypeExtension; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; + +@Mixin(EntityType.class) +public class EntityTypeMixin implements EntityTypeExtension { + @Unique + private EntityInstancingController flywheel$instancingController; + + @Override + public EntityInstancingController flywheel$getInstancingController() { + return flywheel$instancingController; + } + + @Override + public void flywheel$setInstancingController(EntityInstancingController instancingController) { + this.flywheel$instancingController = instancingController; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/mixin/InstanceAddMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/InstanceAddMixin.java index 53137d485..b28fbfa84 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/InstanceAddMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/InstanceAddMixin.java @@ -26,9 +26,9 @@ public class InstanceAddMixin { @Inject(method = "setBlockEntity", at = @At(value = "INVOKE_ASSIGN", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")) - private void tileAdded(BlockEntity be, CallbackInfo ci) { + private void blockEntityAdded(BlockEntity be, CallbackInfo ci) { if (level.isClientSide && Backend.isOn()) { - InstancedRenderDispatcher.getTiles(this.level) + InstancedRenderDispatcher.getBlockEntities(this.level) .add(be); } } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/InstanceRemoveMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/InstanceRemoveMixin.java index 9a6862ddf..0ee0fd088 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/InstanceRemoveMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/InstanceRemoveMixin.java @@ -25,18 +25,18 @@ public class InstanceRemoveMixin { @Inject(at = @At("TAIL"), method = "setRemoved") private void removeInstance(CallbackInfo ci) { if (level instanceof ClientLevel && Backend.isOn()) { - InstancedRenderDispatcher.getTiles(this.level) + InstancedRenderDispatcher.getBlockEntities(this.level) .remove((BlockEntity) (Object) this); } } // /** // * Don't do this. -// * It can cause infinite loops if an instance class tries to access another tile entity in its constructor. +// * It can cause infinite loops if an instance class tries to access another block entity in its constructor. // */ // @Inject(at = @At("TAIL"), method = "clearRemoved") // private void addInstance(CallbackInfo ci) { -// if (level.isClientSide) InstancedRenderDispatcher.getTiles(this.level) +// if (level.isClientSide) InstancedRenderDispatcher.getBlockEntities(this.level) // .add((BlockEntity) (Object) this); // } } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java index 5452c100e..a60ffd45d 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java @@ -87,7 +87,7 @@ public class RenderHooksMixin { @Inject(at = @At("TAIL"), method = "setBlockDirty(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;)V") private void checkUpdate(BlockPos pos, BlockState lastState, BlockState newState, CallbackInfo ci) { if (Backend.isOn()) { - InstancedRenderDispatcher.getTiles(level) + InstancedRenderDispatcher.getBlockEntities(level) .update(level.getBlockEntity(pos)); } } diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java index c66e41b63..0da987881 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java @@ -1,11 +1,11 @@ package com.jozufozu.flywheel.vanilla; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.Materials; -import com.jozufozu.flywheel.core.materials.oriented.OrientedData; import com.jozufozu.flywheel.core.hardcoded.ModelPart; +import com.jozufozu.flywheel.core.materials.oriented.OrientedData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; @@ -14,14 +14,14 @@ import net.minecraft.client.renderer.blockentity.BellRenderer; import net.minecraft.util.Mth; import net.minecraft.world.level.block.entity.BellBlockEntity; -public class BellInstance extends TileEntityInstance implements IDynamicInstance { +public class BellInstance extends BlockEntityInstance implements DynamicInstance { private final OrientedData bell; private float lastRingTime = Float.NaN; - public BellInstance(MaterialManager materialManager, BellBlockEntity tile) { - super(materialManager, tile); + public BellInstance(MaterialManager materialManager, BellBlockEntity blockEntity) { + super(materialManager, blockEntity); bell = createBellInstance() .setPivot(0.5f, 0.75f, 0.5f) @@ -30,15 +30,15 @@ public class BellInstance extends TileEntityInstance implements @Override public void beginFrame() { - float ringTime = (float)tile.ticks + AnimationTickHolder.getPartialTicks(); + float ringTime = (float)blockEntity.ticks + AnimationTickHolder.getPartialTicks(); if (ringTime == lastRingTime) return; lastRingTime = ringTime; - if (tile.shaking) { + if (blockEntity.shaking) { float angle = Mth.sin(ringTime / (float) Math.PI) / (4.0F + ringTime / 3.0F); - Vector3f ringAxis = tile.clickDirection.getCounterClockWise().step(); + Vector3f ringAxis = blockEntity.clickDirection.getCounterClockWise().step(); bell.setRotation(ringAxis.rotation(angle)); } else { @@ -59,7 +59,7 @@ public class BellInstance extends TileEntityInstance implements private OrientedData createBellInstance() { return materialManager.defaultCutout() .material(Materials.ORIENTED) - .model(tile.getType(), BellInstance::createBellModel) + .model(blockEntity.getType(), BellInstance::createBellModel) .createInstance(); } diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java index ab1acdebf..df834d326 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java @@ -5,12 +5,12 @@ import java.util.Calendar; import javax.annotation.Nonnull; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.Materials; +import com.jozufozu.flywheel.core.hardcoded.ModelPart; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; -import com.jozufozu.flywheel.core.hardcoded.ModelPart; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; @@ -28,7 +28,7 @@ import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.entity.LidBlockEntity; import net.minecraft.world.level.block.state.properties.ChestType; -public class ChestInstance extends TileEntityInstance implements IDynamicInstance { +public class ChestInstance extends BlockEntityInstance implements DynamicInstance { private final OrientedData body; private final ModelData lid; @@ -41,13 +41,13 @@ public class ChestInstance extends TileE private float lastProgress = Float.NaN; - public ChestInstance(MaterialManager materialManager, T tile) { - super(materialManager, tile); + public ChestInstance(MaterialManager materialManager, T blockEntity) { + super(materialManager, blockEntity); Block block = blockState.getBlock(); chestType = blockState.hasProperty(ChestBlock.TYPE) ? blockState.getValue(ChestBlock.TYPE) : ChestType.SINGLE; - renderMaterial = Sheets.chooseMaterial(tile, chestType, isChristmas()); + renderMaterial = Sheets.chooseMaterial(blockEntity, chestType, isChristmas()); body = baseInstance() .setPosition(getInstancePosition()); @@ -63,7 +63,7 @@ public class ChestInstance extends TileE DoubleBlockCombiner.NeighborCombineResult wrapper = chestBlock.combine(blockState, world, getWorldPosition(), true); - this.lidProgress = wrapper.apply(ChestBlock.opennessCombiner(tile)); + this.lidProgress = wrapper.apply(ChestBlock.opennessCombiner(blockEntity)); } else { diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java index 4fe3116df..c4d06994a 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java @@ -1,13 +1,13 @@ package com.jozufozu.flywheel.vanilla; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; import com.jozufozu.flywheel.core.Materials; +import com.jozufozu.flywheel.core.hardcoded.ModelPart; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.model.Model; -import com.jozufozu.flywheel.core.hardcoded.ModelPart; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.math.Vector3f; @@ -21,7 +21,7 @@ import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -public class MinecartInstance extends EntityInstance implements IDynamicInstance, ITickableInstance { +public class MinecartInstance extends EntityInstance implements DynamicInstance, TickableInstance { private static final ResourceLocation MINECART_LOCATION = new ResourceLocation("textures/entity/minecart.png"); diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java index a64e5b0ec..167b2367a 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java @@ -1,11 +1,11 @@ package com.jozufozu.flywheel.vanilla; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; +import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.Materials; -import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.hardcoded.ModelPart; +import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.mojang.math.Quaternion; @@ -19,7 +19,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.ShulkerBoxBlock; import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; -public class ShulkerBoxInstance extends TileEntityInstance implements IDynamicInstance { +public class ShulkerBoxInstance extends BlockEntityInstance implements DynamicInstance { private final TextureAtlasSprite texture; @@ -29,10 +29,10 @@ public class ShulkerBoxInstance extends TileEntityInstance