diff --git a/src/main/java/com/jozufozu/flywheel/Flywheel.java b/src/main/java/com/jozufozu/flywheel/Flywheel.java index 4a6f63102..5b373c878 100644 --- a/src/main/java/com/jozufozu/flywheel/Flywheel.java +++ b/src/main/java/com/jozufozu/flywheel/Flywheel.java @@ -13,7 +13,8 @@ import com.jozufozu.flywheel.core.Models; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.StitchedSprite; import com.jozufozu.flywheel.core.compile.ProgramCompiler; -import com.jozufozu.flywheel.core.materials.InstanceShaders; +import com.jozufozu.flywheel.core.material.MaterialShaders; +import com.jozufozu.flywheel.core.structs.InstanceShaders; import com.jozufozu.flywheel.core.vertex.LayoutShaders; import com.jozufozu.flywheel.event.ReloadRenderersEvent; import com.jozufozu.flywheel.mixin.PausedPartialTickAccessor; @@ -77,6 +78,7 @@ public class Flywheel { modEventBus.addListener(LayoutShaders::flwInit); modEventBus.addListener(InstanceShaders::flwInit); + modEventBus.addListener(MaterialShaders::flwInit); modEventBus.addListener(Contexts::flwInit); modEventBus.addListener(PartialModel::onModelRegistry); modEventBus.addListener(PartialModel::onModelBake); diff --git a/src/main/java/com/jozufozu/flywheel/api/Material.java b/src/main/java/com/jozufozu/flywheel/api/InstancerFactory.java similarity index 88% rename from src/main/java/com/jozufozu/flywheel/api/Material.java rename to src/main/java/com/jozufozu/flywheel/api/InstancerFactory.java index 7ac7b64a2..102c96c56 100644 --- a/src/main/java/com/jozufozu/flywheel/api/Material.java +++ b/src/main/java/com/jozufozu/flywheel/api/InstancerFactory.java @@ -2,7 +2,7 @@ package com.jozufozu.flywheel.api; import com.jozufozu.flywheel.core.model.ModelSupplier; -public interface Material { +public interface InstancerFactory { /** * Get an instancer for the given model. Calling this method twice with the same key will return the same instancer. diff --git a/src/main/java/com/jozufozu/flywheel/api/MaterialManager.java b/src/main/java/com/jozufozu/flywheel/api/InstancerManager.java similarity index 58% rename from src/main/java/com/jozufozu/flywheel/api/MaterialManager.java rename to src/main/java/com/jozufozu/flywheel/api/InstancerManager.java index 67e6997e9..73cda7b3d 100644 --- a/src/main/java/com/jozufozu/flywheel/api/MaterialManager.java +++ b/src/main/java/com/jozufozu/flywheel/api/InstancerManager.java @@ -4,9 +4,9 @@ import com.jozufozu.flywheel.api.struct.StructType; import net.minecraft.core.Vec3i; -public interface MaterialManager { +public interface InstancerManager { - Material material(StructType type); + InstancerFactory factory(StructType type); Vec3i getOriginCoordinate(); diff --git a/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java index 47908b64e..e8329c4bf 100644 --- a/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java @@ -2,6 +2,7 @@ package com.jozufozu.flywheel.api; import com.jozufozu.flywheel.api.struct.StructType; +@Deprecated public interface MaterialGroup { /** * Get the material as defined by the given {@link StructType type}. @@ -10,5 +11,5 @@ public interface MaterialGroup { * @param The type representing the per instance data. * @return A material you can use to render models. */ - Material material(StructType spec); + InstancerFactory material(StructType spec); } diff --git a/src/main/java/com/jozufozu/flywheel/api/material/Material.java b/src/main/java/com/jozufozu/flywheel/api/material/Material.java new file mode 100644 index 000000000..e1492b98b --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/api/material/Material.java @@ -0,0 +1,31 @@ +package com.jozufozu.flywheel.api.material; + +import java.util.function.Supplier; + +import com.jozufozu.flywheel.core.source.FileResolution; + +import net.minecraft.client.renderer.RenderType; + +public class Material { + protected final RenderType renderType; + protected final Supplier vertexShader; + protected final Supplier fragmentShader; + + public Material(RenderType renderType, Supplier vertexShader, Supplier fragmentShader) { + this.renderType = renderType; + this.vertexShader = vertexShader; + this.fragmentShader = fragmentShader; + } + + public RenderType getRenderType() { + return renderType; + } + + public FileResolution getVertexShader() { + return vertexShader.get(); + } + + public FileResolution getFragmentShader() { + return fragmentShader.get(); + } +} 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 6a3e67ba8..b66ef4617 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java @@ -3,12 +3,12 @@ package com.jozufozu.flywheel.backend.instancing; import java.util.Arrays; import java.util.stream.Stream; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; 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.core.structs.FlatLit; import com.jozufozu.flywheel.light.LightListener; import com.jozufozu.flywheel.light.LightProvider; import com.jozufozu.flywheel.light.ListenerStatus; @@ -24,12 +24,12 @@ import net.minecraft.world.level.LightLayer; */ public abstract class AbstractInstance implements Instance, LightListener { - protected final MaterialManager materialManager; - public final Level world; + protected final InstancerManager instancerManager; + public final Level level; - public AbstractInstance(MaterialManager materialManager, Level world) { - this.materialManager = materialManager; - this.world = world; + public AbstractInstance(InstancerManager instancerManager, Level level) { + this.instancerManager = instancerManager; + this.level = level; } /** @@ -88,11 +88,11 @@ public abstract class AbstractInstance implements Instance, LightListener { } protected void relight(BlockPos pos, FlatLit... models) { - relight(world.getBrightness(LightLayer.BLOCK, pos), world.getBrightness(LightLayer.SKY, pos), models); + relight(level.getBrightness(LightLayer.BLOCK, pos), level.getBrightness(LightLayer.SKY, pos), models); } protected > void relight(BlockPos pos, Stream models) { - relight(world.getBrightness(LightLayer.BLOCK, pos), world.getBrightness(LightLayer.SKY, pos), models); + relight(level.getBrightness(LightLayer.BLOCK, pos), level.getBrightness(LightLayer.SKY, pos), models); } protected void relight(int block, int sky, FlatLit... models) { diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java index 51cc0a93e..37f782c11 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java @@ -2,8 +2,8 @@ package com.jozufozu.flywheel.backend.instancing; import java.util.List; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; -public interface Engine extends RenderDispatcher, MaterialManager { +public interface Engine extends RenderDispatcher, InstancerManager { void addDebugInfo(List info); } 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 8973edb30..b4f7b561f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java @@ -9,7 +9,7 @@ import java.util.Set; import org.jetbrains.annotations.Nullable; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.backend.Backend; @@ -27,7 +27,7 @@ import net.minecraft.core.BlockPos; public abstract class InstanceManager implements InstancingEngine.OriginShiftListener { - public final MaterialManager materialManager; + public final InstancerManager instancerManager; private final Set queuedAdditions; private final Set queuedUpdates; @@ -39,8 +39,8 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift protected DistanceUpdateLimiter frame; protected DistanceUpdateLimiter tick; - public InstanceManager(MaterialManager materialManager) { - this.materialManager = materialManager; + public InstanceManager(InstancerManager instancerManager) { + this.instancerManager = instancerManager; this.queuedUpdates = new HashSet<>(64); this.queuedAdditions = new HashSet<>(64); this.instances = new HashMap<>(); @@ -318,7 +318,7 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift instances.remove(obj); dynamicInstances.remove(obj); tickableInstances.remove(obj); - LightUpdater.get(instance.world) + LightUpdater.get(instance.level) .removeListener(instance); } @@ -329,7 +329,7 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift if (renderer != null) { renderer.init(); renderer.updateLight(); - LightUpdater.get(renderer.world) + LightUpdater.get(renderer.level) .addListener(renderer); instances.put(obj, renderer); @@ -356,7 +356,7 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift public void detachLightListeners() { for (AbstractInstance value : instances.values()) { - LightUpdater.get(value.world).removeListener(value); + LightUpdater.get(value.level).removeListener(value); } } } 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 31431df1a..fab880b22 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; /** * A manager class for a single world where instancing is supported. *

- * The material manager is shared between the different instance managers. + * The instancer manager is shared between the different instance managers. *

*/ public class InstanceWorld { 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 4b052c4d0..79248b22f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java @@ -6,7 +6,7 @@ import java.util.function.Predicate; import org.jetbrains.annotations.Nullable; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstancingController; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityTypeExtension; @@ -48,34 +48,34 @@ public class InstancedRenderRegistry { /** * Creates an instance for the given block entity, if possible. - * @param materialManager The material manager to use. + * @param instancerManager The instancer manager to use. * @param blockEntity The block entity to create an instance of. * @param The type of the block entity. * @return An instance of the block entity, or {@code null} if the block entity cannot be instanced. */ @Nullable - public static BlockEntityInstance createInstance(MaterialManager materialManager, T blockEntity) { + public static BlockEntityInstance createInstance(InstancerManager instancerManager, T blockEntity) { BlockEntityInstancingController controller = getController(getType(blockEntity)); if (controller == null) { return null; } - return controller.createInstance(materialManager, blockEntity); + return controller.createInstance(instancerManager, blockEntity); } /** * Creates an instance for the given entity, if possible. - * @param materialManager The material manager to use. + * @param instancerManager The instancer manager to use. * @param entity The entity to create an instance of. * @param The type of the entity. * @return An instance of the entity, or {@code null} if the entity cannot be instanced. */ @Nullable - public static EntityInstance createInstance(MaterialManager materialManager, T entity) { + public static EntityInstance createInstance(InstancerManager instancerManager, T entity) { EntityInstancingController controller = getController(getType(entity)); if (controller == null) { return null; } - return controller.createInstance(materialManager, entity); + return controller.createInstance(instancerManager, entity); } /** @@ -194,7 +194,7 @@ public class InstancedRenderRegistry { */ public static class BlockEntityConfig { protected BlockEntityType type; - protected BiFunction> instanceFactory; + protected BiFunction> instanceFactory; protected Predicate skipRender; public BlockEntityConfig(BlockEntityType type) { @@ -206,7 +206,7 @@ public class InstancedRenderRegistry { * @param instanceFactory The instance factory. * @return {@code this} */ - public BlockEntityConfig factory(BiFunction> instanceFactory) { + public BlockEntityConfig factory(BiFunction> instanceFactory) { this.instanceFactory = instanceFactory; return this; } @@ -251,7 +251,7 @@ public class InstancedRenderRegistry { */ public static class EntityConfig { protected EntityType type; - protected BiFunction> instanceFactory; + protected BiFunction> instanceFactory; protected Predicate skipRender; public EntityConfig(EntityType type) { @@ -263,7 +263,7 @@ public class InstancedRenderRegistry { * @param instanceFactory The instance factory. * @return {@code this} */ - public EntityConfig factory(BiFunction> instanceFactory) { + public EntityConfig factory(BiFunction> instanceFactory) { this.instanceFactory = instanceFactory; return this; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java index c3f5b6e81..b162990d6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java @@ -17,7 +17,7 @@ public class BatchedMaterialGroup implements MaterialGroup { protected final RenderType state; - private final Map, BatchedMaterial> materials = new HashMap<>(); + private final Map, CPUInstancerFactory> materials = new HashMap<>(); private int vertexCount; private int instanceCount; @@ -27,9 +27,9 @@ public class BatchedMaterialGroup implements MaterialGroup { @SuppressWarnings("unchecked") @Override - public BatchedMaterial material(StructType type) { + public CPUInstancerFactory material(StructType type) { if (type instanceof Batched batched) { - return (BatchedMaterial) materials.computeIfAbsent(batched, BatchedMaterial::new); + return (CPUInstancerFactory) materials.computeIfAbsent(batched, CPUInstancerFactory::new); } else { throw new ClassCastException("Cannot use type '" + type + "' with CPU instancing."); } @@ -61,7 +61,7 @@ public class BatchedMaterialGroup implements MaterialGroup { } public void clear() { - materials.values().forEach(BatchedMaterial::clear); + materials.values().forEach(CPUInstancerFactory::clear); } public void delete() { 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 288ddb229..ddc5f949a 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 @@ -21,16 +21,16 @@ import net.minecraft.core.Vec3i; public class BatchingEngine implements Engine { - private final Map, BatchedMaterial> materials = new HashMap<>(); + private final Map, CPUInstancerFactory> factories = new HashMap<>(); private final BatchDrawingTracker batchTracker = new BatchDrawingTracker(); @SuppressWarnings("unchecked") @Override - public BatchedMaterial material(StructType type) { + public CPUInstancerFactory factory(StructType type) { if (type instanceof Batched batched) { - return (BatchedMaterial) materials.computeIfAbsent(batched, BatchedMaterial::new); + return (CPUInstancerFactory) factories.computeIfAbsent(batched, CPUInstancerFactory::new); } else { - throw new ClassCastException("Cannot use type '" + type + "' with batching."); + throw new ClassCastException("Cannot use type '" + type + "' with CPU instancing."); } } @@ -46,7 +46,6 @@ public class BatchingEngine implements Engine { @Override public void renderAllRemaining(TaskEngine taskEngine, RenderContext context) { - // vertexCount = 0; // instanceCount = 0; // for (BatchedMaterial material : materials.values()) { diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancerFactory.java similarity index 84% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancerFactory.java index c54e03c7d..65413245f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancerFactory.java @@ -5,18 +5,18 @@ import java.util.Map; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; -import com.jozufozu.flywheel.api.Material; +import com.jozufozu.flywheel.api.InstancerFactory; import com.jozufozu.flywheel.api.struct.Batched; import com.jozufozu.flywheel.core.model.ModelSupplier; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -public class BatchedMaterial implements Material { +public class CPUInstancerFactory implements InstancerFactory { protected final Map> models; private final Batched type; - public BatchedMaterial(Batched type) { + public CPUInstancerFactory(Batched type) { this.type = type; this.models = new HashMap<>(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java index bc24cb221..6f9f12ea8 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java @@ -1,13 +1,13 @@ package com.jozufozu.flywheel.backend.instancing.blockentity; -import com.jozufozu.flywheel.api.Material; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerFactory; +import com.jozufozu.flywheel.api.InstancerManager; 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.Materials; -import com.jozufozu.flywheel.core.materials.model.ModelData; -import com.jozufozu.flywheel.core.materials.oriented.OrientedData; +import com.jozufozu.flywheel.core.structs.StructTypes; +import com.jozufozu.flywheel.core.structs.model.ModelData; +import com.jozufozu.flywheel.core.structs.oriented.OrientedData; import com.jozufozu.flywheel.util.box.GridAlignedBB; import com.jozufozu.flywheel.util.box.ImmutableBox; @@ -39,12 +39,12 @@ public abstract class BlockEntityInstance extends Abstrac protected final BlockPos instancePos; protected final BlockState blockState; - public BlockEntityInstance(MaterialManager materialManager, T blockEntity) { - super(materialManager, blockEntity.getLevel()); + public BlockEntityInstance(InstancerManager instancerManager, T blockEntity) { + super(instancerManager, blockEntity.getLevel()); this.blockEntity = blockEntity; this.pos = blockEntity.getBlockPos(); this.blockState = blockEntity.getBlockState(); - this.instancePos = pos.subtract(materialManager.getOriginCoordinate()); + this.instancePos = pos.subtract(instancerManager.getOriginCoordinate()); } /** @@ -68,7 +68,7 @@ public abstract class BlockEntityInstance extends Abstrac * represents should be rendered at to appear in the correct location. */ public BlockPos getInstancePosition() { - return pos.subtract(materialManager.getOriginCoordinate()); + return pos.subtract(instancerManager.getOriginCoordinate()); } @Override @@ -76,12 +76,12 @@ public abstract class BlockEntityInstance extends Abstrac return pos; } - protected Material getTransformMaterial() { - return materialManager.material(Materials.TRANSFORMED); + protected InstancerFactory getTransformFactory() { + return instancerManager.factory(StructTypes.MODEL); } - protected Material getOrientedMaterial() { - return materialManager.material(Materials.ORIENTED); + protected InstancerFactory getOrientedFactory() { + return instancerManager.factory(StructTypes.ORIENTED); } @Override diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstanceManager.java index aebc9ee1e..b20986db0 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstanceManager.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.blockentity; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; @@ -13,8 +13,8 @@ import net.minecraft.world.level.block.entity.BlockEntity; public class BlockEntityInstanceManager extends InstanceManager { - public BlockEntityInstanceManager(MaterialManager materialManager) { - super(materialManager); + public BlockEntityInstanceManager(InstancerManager instancerManager) { + super(instancerManager); } @Override @@ -24,7 +24,7 @@ public class BlockEntityInstanceManager extends InstanceManager { @Override protected AbstractInstance createRaw(BlockEntity obj) { - return InstancedRenderRegistry.createInstance(materialManager, obj); + return InstancedRenderRegistry.createInstance(instancerManager, obj); } @Override 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 index 23bf0b318..1ee9016c5 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstancingController.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstancingController.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.blockentity; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import net.minecraft.world.level.block.entity.BlockEntity; @@ -10,12 +10,12 @@ import net.minecraft.world.level.block.entity.BlockEntity; */ public interface BlockEntityInstancingController { /** - * Given a block entity and a material manager, constructs an instance for the block entity. - * @param materialManager The material manager to use. + * Given a block entity and an instancer manager, constructs an instance for the block entity. + * @param instancerManager The instancer manager to use. * @param blockEntity The block entity to construct an instance for. * @return The instance. */ - BlockEntityInstance createInstance(MaterialManager materialManager, T blockEntity); + BlockEntityInstance createInstance(InstancerManager instancerManager, T blockEntity); /** * Checks if the given block entity should not be rendered normally. 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 index 6b2cfe0e6..93ac43df6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/SimpleBlockEntityInstancingController.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/SimpleBlockEntityInstancingController.java @@ -3,22 +3,22 @@ package com.jozufozu.flywheel.backend.instancing.blockentity; import java.util.function.BiFunction; import java.util.function.Predicate; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import net.minecraft.world.level.block.entity.BlockEntity; public class SimpleBlockEntityInstancingController implements BlockEntityInstancingController { - protected BiFunction> instanceFactory; + protected BiFunction> instanceFactory; protected Predicate skipRender; - public SimpleBlockEntityInstancingController(BiFunction> instanceFactory, 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); + public BlockEntityInstance createInstance(InstancerManager instancerManager, T blockEntity) { + return instanceFactory.apply(instancerManager, blockEntity); } @Override 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 02e03435c..29115a43a 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,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.entity; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; @@ -39,8 +39,8 @@ public abstract class EntityInstance extends AbstractInstance protected final E entity; protected final GridAlignedBB bounds; - public EntityInstance(MaterialManager materialManager, E entity) { - super(materialManager, entity.level); + public EntityInstance(InstancerManager instancerManager, E entity) { + super(instancerManager, entity.level); this.entity = entity; bounds = GridAlignedBB.from(entity.getBoundingBox()); } @@ -72,7 +72,7 @@ public abstract class EntityInstance extends AbstractInstance */ public Vector3f getInstancePosition() { Vec3 pos = entity.position(); - Vec3i origin = materialManager.getOriginCoordinate(); + Vec3i origin = instancerManager.getOriginCoordinate(); return new Vector3f((float) (pos.x - origin.getX()), (float) (pos.y - origin.getY()), (float) (pos.z - origin.getZ())); } @@ -85,7 +85,7 @@ public abstract class EntityInstance extends AbstractInstance */ public Vector3f getInstancePosition(float partialTicks) { Vec3 pos = entity.position(); - Vec3i origin = materialManager.getOriginCoordinate(); + Vec3i origin = instancerManager.getOriginCoordinate(); return new Vector3f( (float) (Mth.lerp(partialTicks, entity.xOld, pos.x) - origin.getX()), (float) (Mth.lerp(partialTicks, entity.yOld, pos.y) - origin.getY()), 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 60ece43f5..3ccbbdc0d 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 @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.entity; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; @@ -13,8 +13,8 @@ import net.minecraft.world.level.Level; public class EntityInstanceManager extends InstanceManager { - public EntityInstanceManager(MaterialManager materialManager) { - super(materialManager); + public EntityInstanceManager(InstancerManager instancerManager) { + super(instancerManager); } @Override @@ -24,7 +24,7 @@ public class EntityInstanceManager extends InstanceManager { @Override protected AbstractInstance createRaw(Entity obj) { - return InstancedRenderRegistry.createInstance(materialManager, obj); + return InstancedRenderRegistry.createInstance(instancerManager, 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 index 740800f6b..c2f3eb9cc 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstancingController.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstancingController.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.entity; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import net.minecraft.world.entity.Entity; @@ -10,12 +10,12 @@ import net.minecraft.world.entity.Entity; */ public interface EntityInstancingController { /** - * Given an entity and a material manager, constructs an instance for the entity. - * @param materialManager The material manager to use. + * Given an entity and an instancer manager, constructs an instance for the entity. + * @param instancerManager The instancer manager to use. * @param entity The entity to construct an instance for. * @return The instance. */ - EntityInstance createInstance(MaterialManager materialManager, T entity); + EntityInstance createInstance(InstancerManager instancerManager, T entity); /** * Checks if the given entity should not render normally. 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 index d63eac390..91490d8e2 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/SimpleEntityInstancingController.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/SimpleEntityInstancingController.java @@ -3,22 +3,22 @@ package com.jozufozu.flywheel.backend.instancing.entity; import java.util.function.BiFunction; import java.util.function.Predicate; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import net.minecraft.world.entity.Entity; public class SimpleEntityInstancingController implements EntityInstancingController { - protected BiFunction> instanceFactory; + protected BiFunction> instanceFactory; protected Predicate skipRender; - public SimpleEntityInstancingController(BiFunction> instanceFactory, 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); + public EntityInstance createInstance(InstancerManager instancerManager, T entity) { + return instanceFactory.apply(instancerManager, entity); } @Override diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancerFactory.java similarity index 75% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancerFactory.java index 700ff4aca..161bb12dd 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancerFactory.java @@ -6,10 +6,12 @@ import java.util.List; import java.util.Map; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; -import com.jozufozu.flywheel.api.Material; +import com.jozufozu.flywheel.api.InstancerFactory; +import com.jozufozu.flywheel.api.material.Material; import com.jozufozu.flywheel.api.struct.Instanced; import com.jozufozu.flywheel.backend.model.MeshPool; import com.jozufozu.flywheel.core.model.ModelSupplier; @@ -20,16 +22,17 @@ import net.minecraft.client.renderer.RenderType; * A collection of Instancers that all have the same format. * @param */ -public class InstancedMaterial implements Material { +public class GPUInstancerFactory implements InstancerFactory { protected final Map> models = new HashMap<>(); protected final Instanced type; protected final List> uninitialized = new ArrayList<>(); - protected final Multimap renderables = ArrayListMultimap.create(); + protected final Multimap materials = HashMultimap.create(); + protected final Multimap renderables = ArrayListMultimap.create(); - public InstancedMaterial(Instanced type) { + public GPUInstancerFactory(Instanced type) { this.type = type; } @@ -56,6 +59,7 @@ public class InstancedMaterial implements Material { public void delete() { models.values().forEach(InstancedModel::delete); models.clear(); + materials.clear(); renderables.clear(); } @@ -71,10 +75,12 @@ public class InstancedMaterial implements Material { public void init(MeshPool allocator) { for (var instanced : uninitialized) { - var map = instanced.init(allocator); - map.forEach((type, renderable) -> renderables.get(type).add(renderable)); + map.forEach((material, renderable) -> { + materials.put(material.getRenderType(), material); + renderables.get(material).add(renderable); + }); } uninitialized.clear(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedModel.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedModel.java index bd45f77a3..6c54ec14d 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedModel.java @@ -4,26 +4,25 @@ import java.util.Map; import com.google.common.collect.ImmutableMap; import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.material.Material; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.model.MeshPool; import com.jozufozu.flywheel.core.model.Mesh; import com.jozufozu.flywheel.core.model.ModelSupplier; import com.jozufozu.flywheel.util.Pair; -import net.minecraft.client.renderer.RenderType; - public class InstancedModel { final GPUInstancer instancer; final ModelSupplier model; - private Map layers; + private Map layers; public InstancedModel(GPUInstancer instancer, ModelSupplier model) { this.instancer = instancer; this.model = model; } - public Map init(MeshPool allocator) { + public Map init(MeshPool allocator) { instancer.init(); layers = model.get() @@ -38,12 +37,12 @@ public class InstancedModel { private class Layer implements Renderable { - final RenderType type; + final Material material; MeshPool.BufferedMesh bufferedMesh; GlVertexArray vao; - private Layer(MeshPool allocator, RenderType type, Mesh mesh) { - this.type = type; + private Layer(MeshPool allocator, Material material, Mesh mesh) { + this.material = material; vao = new GlVertexArray(); bufferedMesh = allocator.alloc(mesh, vao); instancer.attributeBaseIndex = bufferedMesh.getAttributeCount(); 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 97c4e7aab..32d2751c2 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,6 +9,7 @@ import java.util.Set; import org.jetbrains.annotations.NotNull; import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.material.Material; import com.jozufozu.flywheel.api.struct.Instanced; import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.backend.instancing.Engine; @@ -44,7 +45,7 @@ public class InstancingEngine

implements Engine { protected final ProgramCompiler

context; private MeshPool allocator; - protected final Map, InstancedMaterial> materials = new HashMap<>(); + protected final Map, GPUInstancerFactory> factories = new HashMap<>(); protected final Set toRender = new HashSet<>(); @@ -61,9 +62,9 @@ public class InstancingEngine

implements Engine { @SuppressWarnings("unchecked") @NotNull @Override - public InstancedMaterial material(StructType type) { + public GPUInstancerFactory factory(StructType type) { if (type instanceof Instanced instanced) { - return (InstancedMaterial) materials.computeIfAbsent(instanced, InstancedMaterial::new); + return (GPUInstancerFactory) factories.computeIfAbsent(instanced, GPUInstancerFactory::new); } else { throw new ClassCastException("Cannot use type '" + type + "' with GPU instancing."); } @@ -87,7 +88,6 @@ public class InstancingEngine

implements Engine { @Override public void renderSpecificType(TaskEngine taskEngine, RenderContext context, RenderType type) { - var camX = context.camX() - originCoordinate.getX(); var camY = context.camY() - originCoordinate.getY(); var camZ = context.camZ() - originCoordinate.getZ(); @@ -109,21 +109,23 @@ public class InstancingEngine

implements Engine { Textures.bindActiveTextures(); CoreShaderInfo coreShaderInfo = getCoreShaderInfo(); - for (Map.Entry, InstancedMaterial> entry : materials.entrySet()) { - InstancedMaterial material = entry.getValue(); + for (Map.Entry, GPUInstancerFactory> entry : factories.entrySet()) { + Instanced instanceType = entry.getKey(); + GPUInstancerFactory factory = entry.getValue(); - var toRender = material.renderables.get(type); - toRender.removeIf(Renderable::shouldRemove); + var materials = factory.materials.get(type); + for (Material material : materials) { + var toRender = factory.renderables.get(material); + toRender.removeIf(Renderable::shouldRemove); - if (!toRender.isEmpty()) { - Instanced instanceType = entry.getKey(); + if (!toRender.isEmpty()) { + setup(instanceType, material, coreShaderInfo, camX, camY, camZ, viewProjection, level); - setup(instanceType, coreShaderInfo, camX, camY, camZ, viewProjection, level); + instanceCount += factory.getInstanceCount(); + vertexCount += factory.getVertexCount(); - instanceCount += material.getInstanceCount(); - vertexCount += material.getVertexCount(); - - toRender.forEach(Renderable::render); + toRender.forEach(Renderable::render); + } } } @@ -145,7 +147,7 @@ public class InstancingEngine

implements Engine { return coreShaderInfo; } - protected P setup(Instanced instanceType, CoreShaderInfo coreShaderInfo, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) { + protected P setup(Instanced instanceType, Material material, CoreShaderInfo coreShaderInfo, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) { float alphaDiscard = coreShaderInfo.alphaDiscard(); if (alphaDiscard == 0) { alphaDiscard = 0.0001f; @@ -153,7 +155,7 @@ public class InstancingEngine

implements Engine { alphaDiscard = 0; } - P program = context.getProgram(new ProgramContext(Formats.POS_TEX_NORMAL, instanceType.getInstanceShader(), alphaDiscard, coreShaderInfo.fogType(), GameStateRegistry.takeSnapshot())); + P program = context.getProgram(new ProgramContext(Formats.POS_TEX_NORMAL, instanceType.getInstanceShader(), material.getVertexShader(), material.getFragmentShader(), alphaDiscard, coreShaderInfo.fogType(), GameStateRegistry.takeSnapshot())); program.bind(); program.uploadUniforms(camX, camY, camZ, viewProjection, level); @@ -162,15 +164,15 @@ public class InstancingEngine

implements Engine { } public void clearAll() { - materials.values().forEach(InstancedMaterial::clear); + factories.values().forEach(GPUInstancerFactory::clear); } @Override public void delete() { - materials.values() - .forEach(InstancedMaterial::delete); + factories.values() + .forEach(GPUInstancerFactory::delete); - materials.clear(); + factories.clear(); } @Override @@ -193,10 +195,10 @@ public class InstancingEngine

implements Engine { MeshPool allocator = getModelAllocator(); - for (InstancedMaterial material : materials.values()) { - material.init(allocator); + for (GPUInstancerFactory factory : factories.values()) { + factory.init(allocator); - toRender.addAll(material.renderables.keySet()); + toRender.addAll(factory.materials.keySet()); } allocator.flush(); @@ -221,7 +223,7 @@ public class InstancingEngine

implements Engine { private void shiftListeners(int cX, int cY, int cZ) { originCoordinate = new BlockPos(cX, cY, cZ); - materials.values().forEach(InstancedMaterial::clear); + factories.values().forEach(GPUInstancerFactory::clear); listeners.forEach(OriginShiftListener::onOriginShift); } diff --git a/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java b/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java index 0f3f0521a..bf70b366d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java +++ b/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java @@ -5,6 +5,8 @@ import java.util.Map; import org.jetbrains.annotations.NotNull; import com.google.common.collect.ImmutableMap; +import com.jozufozu.flywheel.api.material.Material; +import com.jozufozu.flywheel.core.material.MaterialShaders; import com.jozufozu.flywheel.core.model.Mesh; import com.jozufozu.flywheel.core.model.ModelSupplier; import com.jozufozu.flywheel.util.Lazy; @@ -13,31 +15,28 @@ import com.jozufozu.flywheel.util.NonNullSupplier; import net.minecraft.client.renderer.RenderType; public class BasicModelSupplier implements ModelSupplier { + private static final Material DEFAULT_MATERIAL = new Material(RenderType.solid(), () -> MaterialShaders.DEFAULT_VERTEX, () -> MaterialShaders.DEFAULT_FRAGMENT); - private RenderType renderType; + private Material material; private final Lazy supplier; public BasicModelSupplier(NonNullSupplier supplier) { - this(supplier, RenderType.solid()); + this(supplier, DEFAULT_MATERIAL); } - public BasicModelSupplier(NonNullSupplier supplier, RenderType renderType) { + public BasicModelSupplier(NonNullSupplier supplier, Material material) { this.supplier = Lazy.of(supplier); - this.renderType = renderType; + this.material = material; } - public BasicModelSupplier setCutout() { - return setRenderType(RenderType.cutoutMipped()); - } - - public BasicModelSupplier setRenderType(@NotNull RenderType renderType) { - this.renderType = renderType; + public BasicModelSupplier setMaterial(@NotNull Material material) { + this.material = material; return this; } @Override - public Map get() { - return ImmutableMap.of(renderType, supplier.get()); + public Map get() { + return ImmutableMap.of(material, supplier.get()); } public int getVertexCount() { @@ -47,7 +46,7 @@ public class BasicModelSupplier implements ModelSupplier { @Override public String toString() { - return "ModelSupplier{" + supplier.map(Mesh::name) + return "BasicModelSupplier{" + supplier.map(Mesh::name) .orElse("Uninitialized") + '}'; } } diff --git a/src/main/java/com/jozufozu/flywheel/core/Contexts.java b/src/main/java/com/jozufozu/flywheel/core/Contexts.java index 01f568755..ea12a3231 100644 --- a/src/main/java/com/jozufozu/flywheel/core/Contexts.java +++ b/src/main/java/com/jozufozu/flywheel/core/Contexts.java @@ -25,8 +25,8 @@ public class Contexts { FileResolution crumblingVertex = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.CRUMBLING, ".vert")); FileResolution crumblingFragment = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.CRUMBLING, ".frag")); - WORLD = ProgramCompiler.create(WorldProgram::new, Templates.INSTANCING, Templates.FRAGMENT, worldVertex, worldFragment); - CRUMBLING = ProgramCompiler.create(CrumblingProgram::new, Templates.INSTANCING, Templates.FRAGMENT, crumblingVertex, crumblingFragment); + WORLD = ProgramCompiler.create(WorldProgram::new, worldVertex, worldFragment); + CRUMBLING = ProgramCompiler.create(CrumblingProgram::new, crumblingVertex, crumblingFragment); } public static class Names { diff --git a/src/main/java/com/jozufozu/flywheel/core/Templates.java b/src/main/java/com/jozufozu/flywheel/core/Templates.java deleted file mode 100644 index cb9e83610..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/Templates.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jozufozu.flywheel.core; - -import com.jozufozu.flywheel.backend.gl.GLSLVersion; -import com.jozufozu.flywheel.core.compile.FragmentTemplateData; -import com.jozufozu.flywheel.core.compile.InstancingTemplateData; -import com.jozufozu.flywheel.core.compile.OneShotTemplateData; -import com.jozufozu.flywheel.core.compile.Template; - -public class Templates { - public static final Template INSTANCING = new Template<>(GLSLVersion.V330, InstancingTemplateData::new); - public static final Template ONE_SHOT = new Template<>(GLSLVersion.V150, OneShotTemplateData::new); - public static final Template FRAGMENT = new Template<>(GLSLVersion.V150, FragmentTemplateData::new); -} diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java b/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java index 925da17d5..92ddf67a3 100644 --- a/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java +++ b/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java @@ -1,7 +1,10 @@ package com.jozufozu.flywheel.core.compile; import java.util.Objects; +import java.util.Optional; +import com.google.common.collect.ImmutableList; +import com.jozufozu.flywheel.backend.gl.GLSLVersion; import com.jozufozu.flywheel.backend.gl.shader.GlShader; import com.jozufozu.flywheel.backend.gl.shader.ShaderType; import com.jozufozu.flywheel.core.CoreShaderInfoMap.CoreShaderInfo.FogType; @@ -9,13 +12,16 @@ import com.jozufozu.flywheel.core.shader.ShaderConstants; import com.jozufozu.flywheel.core.shader.StateSnapshot; import com.jozufozu.flywheel.core.source.FileIndexImpl; import com.jozufozu.flywheel.core.source.FileResolution; +import com.jozufozu.flywheel.core.source.ShaderLoadingException; +import com.jozufozu.flywheel.core.source.SourceFile; +import com.jozufozu.flywheel.core.source.error.ErrorReporter; +import com.jozufozu.flywheel.core.source.parse.ShaderFunction; +import com.jozufozu.flywheel.core.source.parse.Variable; public class FragmentCompiler extends Memoizer { - private final Template template; private final FileResolution contextShader; - public FragmentCompiler(Template template, FileResolution contextShader) { - this.template = template; + public FragmentCompiler(FileResolution contextShader) { this.contextShader = contextShader; } @@ -23,21 +29,77 @@ public class FragmentCompiler extends Memoizer maybeMaterialFragment = materialShader.findFunction("flw_materialFragment"); + + if (maybeMaterialFragment.isEmpty()) { + ErrorReporter.generateMissingFunction(materialShader, "flw_materialFragment", "\"flw_materialFragment\" function not defined"); + throw new ShaderLoadingException(); + } + + ShaderFunction materialFragment = maybeMaterialFragment.get(); + ImmutableList params = materialFragment.getParameters(); + + if (params.size() != 0) { + ErrorReporter.generateSpanError(materialFragment.getArgs(), "\"flw_materialFragment\" function must not have any arguments"); + throw new ShaderLoadingException(); + } + + materialShader.generateFinalSource(index, finalSource); + + // + + SourceFile contextShaderSource = contextShader.getFile(); + + Optional maybeContextFragment = contextShaderSource.findFunction("flw_contextFragment"); + + if (maybeContextFragment.isEmpty()) { + ErrorReporter.generateMissingFunction(contextShaderSource, "flw_contextFragment", "\"flw_contextFragment\" function not defined"); + throw new ShaderLoadingException(); + } + + ShaderFunction contextFragment = maybeContextFragment.get(); + params = contextFragment.getParameters(); + + if (params.size() != 0) { + ErrorReporter.generateSpanError(contextFragment.getArgs(), "\"flw_contextFragment\" function must not have any arguments"); + throw new ShaderLoadingException(); + } + + contextShaderSource.generateFinalSource(index, finalSource); + + // + + finalSource.append(generateFooter()); return new GlShader(contextShader.getFile().name, ShaderType.FRAGMENT, finalSource.toString()); } + protected String generateFooter() { + StringBuilder footer = new StringBuilder(); + + footer.append(""" + void main() { + flw_materialFragment(); + + flw_contextFragment(); + } + """ + ); + + return footer.toString(); + } + @Override protected void _destroy(GlShader value) { value.delete(); @@ -48,9 +110,9 @@ public class FragmentCompiler extends Memoizer params = contextFragment.getParameters(); - - if (params.size() != 0) { - ErrorReporter.generateSpanError(contextFragment.getArgs(), "\"flw_contextFragment\" function must not have any arguments"); - throw new ShaderLoadingException(); - } - } - - @Override - public String generateFooter() { - StringBuilder builder = new StringBuilder(); - - builder.append(""" - void main() { - flw_contextFragment(); - } - """ - ); - - return builder.toString(); - } -} diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/InstancingTemplateData.java b/src/main/java/com/jozufozu/flywheel/core/compile/InstancingTemplateData.java deleted file mode 100644 index 64c47caf5..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/compile/InstancingTemplateData.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.jozufozu.flywheel.core.compile; - -import java.util.Optional; - -import com.google.common.collect.ImmutableList; -import com.jozufozu.flywheel.api.vertex.VertexType; -import com.jozufozu.flywheel.core.source.FileIndex; -import com.jozufozu.flywheel.core.source.ShaderLoadingException; -import com.jozufozu.flywheel.core.source.SourceFile; -import com.jozufozu.flywheel.core.source.error.ErrorReporter; -import com.jozufozu.flywheel.core.source.parse.ShaderFunction; -import com.jozufozu.flywheel.core.source.parse.ShaderStruct; -import com.jozufozu.flywheel.core.source.parse.StructField; -import com.jozufozu.flywheel.core.source.parse.Variable; -import com.jozufozu.flywheel.core.source.span.Span; - -public class InstancingTemplateData implements VertexData { - public final SourceFile file; - public final ShaderFunction instanceVertex; - public final Span instanceName; - public final ShaderStruct instance; - - public InstancingTemplateData(SourceFile file) { - this.file = file; - - Optional maybeInstanceVertex = file.findFunction("flw_instanceVertex"); - - if (maybeInstanceVertex.isEmpty()) { - ErrorReporter.generateMissingFunction(file, "flw_instanceVertex", "\"flw_instanceVertex\" function not defined"); - throw new ShaderLoadingException(); - } - - instanceVertex = maybeInstanceVertex.get(); - ImmutableList params = instanceVertex.getParameters(); - - if (params.size() != 1) { - ErrorReporter.generateSpanError(instanceVertex.getArgs(), "\"flw_contextFragment\" function must have exactly 1 argument"); - throw new ShaderLoadingException(); - } - - instanceName = params.get(0).type; - Optional maybeInstance = file.findStruct(instanceName); - - if (maybeInstance.isEmpty()) { - ErrorReporter.generateMissingStruct(file, instanceName, "struct not defined"); - throw new ShaderLoadingException(); - } - - instance = maybeInstance.get(); - } - - @Override - public String generateFooter(FileIndex shader, VertexType vertexType) { - ImmutableList fields = instance.getFields(); - - int attributeBinding = vertexType.getLayout() - .getAttributeCount(); - - StringBuilder template = new StringBuilder(); - - for (StructField field : fields) { - template.append("layout(location = ") - .append(attributeBinding) - .append(") in") - .append(' ') - .append(field.type) - .append(' ') - .append("_flw_a_i_") - .append(field.name) - .append(";\n"); - attributeBinding += CompileUtil.getAttributeCount(field.type); - } - template.append('\n'); - - template.append(String.format(""" - void main() { - flw_layoutVertex(); - - %s instance; - %s - flw_instanceVertex(instance); - - flw_contextVertex(); - } - """, - instanceName, - assignFields(instance, "instance.", "_flw_a_i_") - )); - - return template.toString(); - } - - public static StringBuilder assignFields(ShaderStruct struct, String prefix1, String prefix2) { - ImmutableList fields = struct.getFields(); - - StringBuilder builder = new StringBuilder(); - - for (StructField field : fields) { - builder.append(prefix1) - .append(field.name) - .append(" = ") - .append(prefix2) - .append(field.name) - .append(";\n"); - } - - return builder; - } -} diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/OneShotTemplateData.java b/src/main/java/com/jozufozu/flywheel/core/compile/OneShotTemplateData.java deleted file mode 100644 index 30a6d0df4..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/compile/OneShotTemplateData.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.jozufozu.flywheel.core.compile; - -import java.util.Optional; - -import com.google.common.collect.ImmutableList; -import com.jozufozu.flywheel.api.vertex.VertexType; -import com.jozufozu.flywheel.core.source.FileIndex; -import com.jozufozu.flywheel.core.source.ShaderLoadingException; -import com.jozufozu.flywheel.core.source.SourceFile; -import com.jozufozu.flywheel.core.source.error.ErrorReporter; -import com.jozufozu.flywheel.core.source.parse.ShaderFunction; -import com.jozufozu.flywheel.core.source.parse.Variable; - -public class OneShotTemplateData implements VertexData { - - public final SourceFile file; - public final ShaderFunction vertexMain; - - public OneShotTemplateData(SourceFile file) { - this.file = file; - - Optional maybeVertexMain = file.findFunction("vertex"); - - if (maybeVertexMain.isEmpty()) { - ErrorReporter.generateFileError(file, "could not find \"vertex\" function"); - throw new RuntimeException(); - } - - vertexMain = maybeVertexMain.get(); - ImmutableList vertexParameters = vertexMain.getParameters(); - - if (vertexParameters.size() != 1) { - ErrorReporter.generateSpanError(vertexMain.getArgs(), "a basic model requires vertex function to have one argument"); - throw new RuntimeException(); - } - - Variable vertexParam = vertexMain.getParameters().get(0); - - boolean namedVertex = vertexParam.type - .toString() - .equals("Vertex"); - - if (!(namedVertex && vertexParam.qualifier == Variable.Qualifier.INOUT)) { - ErrorReporter.generateSpanError(vertexParam.qualifierSpan, "first parameter must be inout Vertex"); - throw new ShaderLoadingException(); - } - } - - @Override - public String generateFooter(FileIndex file, VertexType vertexType) { - return """ - out vec4 v2f_color; - out vec2 v2f_texCoords; - out vec2 v2f_light; - out float v2f_diffuse; - - void main() { - Vertex v = FLWCreateVertex(); - vertex(v); - gl_Position = FLWVertex(v); - v.normal = normalize(v.normal); - - v2f_color = v.color; - v2f_texCoords = v.texCoords; - v2f_light = v.light; - v2f_diffuse = FLWDiffuse(v.normal); - #if defined(DEBUG_NORMAL) - v2f_color = vec4(v.normal, 1.); - #endif - } - """; - } -} diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java b/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java index f031d26cc..7792704dd 100644 --- a/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java +++ b/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java @@ -34,15 +34,13 @@ public class ProgramCompiler

extends Memoizer The type of program to compile. * @return A program compiler. */ - public static ProgramCompiler

create(GlProgram.Factory

factory, Template vertexTemplate, Template fragmentTemplate, FileResolution vertexContextShader, FileResolution fragmentContextShader) { - return new ProgramCompiler<>(factory, new VertexCompiler(vertexTemplate, vertexContextShader), new FragmentCompiler(fragmentTemplate, fragmentContextShader)); + public static

ProgramCompiler

create(GlProgram.Factory

factory, FileResolution vertexContextShader, FileResolution fragmentContextShader) { + return new ProgramCompiler<>(factory, new VertexCompiler(vertexContextShader), new FragmentCompiler(fragmentContextShader)); } /** @@ -65,8 +63,8 @@ public class ProgramCompiler

extends Memoizer params = layoutVertex.getParameters(); + + if (params.size() != 0) { + ErrorReporter.generateSpanError(layoutVertex.getArgs(), "\"flw_layoutVertex\" function must not have any arguments"); + throw new ShaderLoadingException(); + } + + layoutShader.generateFinalSource(index, finalSource); + + // + + SourceFile instanceShader = key.instanceShader; + + Optional maybeInstanceVertex = instanceShader.findFunction("flw_instanceVertex"); + + if (maybeInstanceVertex.isEmpty()) { + ErrorReporter.generateMissingFunction(instanceShader, "flw_instanceVertex", "\"flw_instanceVertex\" function not defined"); + throw new ShaderLoadingException(); + } + + ShaderFunction instanceVertex = maybeInstanceVertex.get(); + params = instanceVertex.getParameters(); + + if (params.size() != 1) { + ErrorReporter.generateSpanError(instanceVertex.getArgs(), "\"flw_instanceVertex\" function must have exactly 1 argument"); + throw new ShaderLoadingException(); + } + + Span instanceName = params.get(0).type; + Optional maybeInstance = instanceShader.findStruct(instanceName); + + if (maybeInstance.isEmpty()) { + ErrorReporter.generateMissingStruct(instanceShader, instanceName, "instance struct not defined"); + throw new ShaderLoadingException(); + } + + ShaderStruct instance = maybeInstance.get(); + + instanceShader.generateFinalSource(index, finalSource); + + // + + SourceFile materialShader = key.materialShader; + + Optional maybeMaterialVertex = materialShader.findFunction("flw_materialVertex"); + + if (maybeMaterialVertex.isEmpty()) { + ErrorReporter.generateMissingFunction(materialShader, "flw_materialVertex", "\"flw_materialVertex\" function not defined"); + throw new ShaderLoadingException(); + } + + ShaderFunction materialVertex = maybeMaterialVertex.get(); + params = materialVertex.getParameters(); + + if (params.size() != 0) { + ErrorReporter.generateSpanError(materialVertex.getArgs(), "\"flw_materialVertex\" function must not have any arguments"); + throw new ShaderLoadingException(); + } + + materialShader.generateFinalSource(index, finalSource); + + // + + SourceFile contextShaderSource = contextShader.getFile(); + + Optional maybeContextVertex = contextShaderSource.findFunction("flw_contextVertex"); + + if (maybeContextVertex.isEmpty()) { + ErrorReporter.generateMissingFunction(contextShaderSource, "flw_contextVertex", "\"flw_contextVertex\" function not defined"); + throw new ShaderLoadingException(); + } + + ShaderFunction contextVertex = maybeContextVertex.get(); + params = contextVertex.getParameters(); + + if (params.size() != 0) { + ErrorReporter.generateSpanError(contextVertex.getArgs(), "\"flw_contextVertex\" function must not have any arguments"); + throw new ShaderLoadingException(); + } + + contextShaderSource.generateFinalSource(index, finalSource); + + // + + finalSource.append(generateFooter(key.vertexType, instance)); + + return new GlShader(instanceShader.name, ShaderType.VERTEX, finalSource.toString()); + } + + protected String generateFooter(VertexType vertexType, ShaderStruct instance) { + ImmutableList fields = instance.getFields(); + + int attributeBinding = vertexType.getLayout() + .getAttributeCount(); + + StringBuilder footer = new StringBuilder(); + + for (StructField field : fields) { + footer.append("layout(location = ") + .append(attributeBinding) + .append(") in") + .append(' ') + .append(field.type) + .append(' ') + .append("_flw_a_i_") + .append(field.name) + .append(";\n"); + attributeBinding += CompileUtil.getAttributeCount(field.type); + } + footer.append('\n'); + + footer.append(String.format(""" + void main() { + flw_layoutVertex(); + + %s instance; + %s + flw_instanceVertex(instance); + + flw_materialVertex(); + + flw_contextVertex(); + } + """, + instance.name, + assignFields(instance, "instance.", "_flw_a_i_") + )); + + return footer.toString(); + } + + protected static StringBuilder assignFields(ShaderStruct struct, String prefix1, String prefix2) { + ImmutableList fields = struct.getFields(); + + StringBuilder builder = new StringBuilder(); + + for (StructField field : fields) { + builder.append(prefix1) + .append(field.name) + .append(" = ") + .append(prefix2) + .append(field.name) + .append(";\n"); + } + + return builder; } @Override @@ -59,14 +214,20 @@ public class VertexCompiler extends Memoizer { */ private final SourceFile instanceShader; + /** + * The vertex material shader source. + */ + private final SourceFile materialShader; + /** * The shader constants to apply. */ private final StateSnapshot ctx; - public Context(VertexType vertexType, SourceFile instanceShader, StateSnapshot ctx) { + public Context(VertexType vertexType, SourceFile instanceShader, SourceFile materialShader, StateSnapshot ctx) { this.vertexType = vertexType; this.instanceShader = instanceShader; + this.materialShader = materialShader; this.ctx = ctx; } @@ -75,12 +236,12 @@ public class VertexCompiler extends Memoizer { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; var that = (Context) o; - return vertexType == that.vertexType && instanceShader == that.instanceShader && ctx.equals(that.ctx); + return vertexType == that.vertexType && instanceShader == that.instanceShader && materialShader == that.materialShader && ctx.equals(that.ctx); } @Override public int hashCode() { - return Objects.hash(vertexType, instanceShader, ctx); + return Objects.hash(vertexType, instanceShader, materialShader, ctx); } } } diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/VertexData.java b/src/main/java/com/jozufozu/flywheel/core/compile/VertexData.java deleted file mode 100644 index 7e3e40b34..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/compile/VertexData.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.jozufozu.flywheel.core.compile; - -import com.jozufozu.flywheel.api.vertex.VertexType; -import com.jozufozu.flywheel.core.source.FileIndex; - -public interface VertexData { - /** - * Generate the necessary glue code here. - * @param file The SourceFile with user written code. - */ - String generateFooter(FileIndex file, VertexType vertexType); -} 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 3d8abed17..df67c6c48 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java @@ -1,13 +1,13 @@ package com.jozufozu.flywheel.core.crumbling; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstanceManager; public class CrumblingInstanceManager extends BlockEntityInstanceManager { - public CrumblingInstanceManager(MaterialManager materialManager) { - super(materialManager); + public CrumblingInstanceManager(InstancerManager instancerManager) { + super(instancerManager); } @Override 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 9a36b2eee..50a8a480d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java @@ -11,7 +11,7 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.GlTextureUnit; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.SerialTaskEngine; -import com.jozufozu.flywheel.backend.instancing.instancing.InstancedMaterial; +import com.jozufozu.flywheel.backend.instancing.instancing.GPUInstancerFactory; import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.core.CoreShaderInfoMap.CoreShaderInfo; @@ -65,7 +65,7 @@ public class CrumblingRenderer { State state = STATE.get(); var instanceManager = state.instanceManager; - var engine = state.materialManager; + var engine = state.instancerManager; TextureManager textureManager = Minecraft.getInstance().getTextureManager(); Camera info = Minecraft.getInstance().gameRenderer.getMainCamera(); @@ -140,17 +140,17 @@ public class CrumblingRenderer { } private static class State { - private final CrumblingEngine materialManager; + private final CrumblingEngine instancerManager; private final InstanceManager instanceManager; private State() { - materialManager = new CrumblingEngine(); - instanceManager = new CrumblingInstanceManager(materialManager); - materialManager.addListener(instanceManager); + instancerManager = new CrumblingEngine(); + instanceManager = new CrumblingInstanceManager(instancerManager); + instancerManager.addListener(instanceManager); } private void kill() { - materialManager.delete(); + instancerManager.delete(); instanceManager.invalidate(); } } @@ -190,10 +190,10 @@ public class CrumblingRenderer { Textures.bindActiveTextures(); CoreShaderInfo coreShaderInfo = getCoreShaderInfo(); - for (Map.Entry, InstancedMaterial> entry : materials.entrySet()) { - CrumblingProgram program = setup(entry.getKey(), coreShaderInfo, camX, camY, camZ, viewProjection, level); + for (Map.Entry, GPUInstancerFactory> entry : factories.entrySet()) { + //CrumblingProgram program = setup(entry.getKey(), coreShaderInfo, camX, camY, camZ, viewProjection, level); - program.setAtlasSize(width, height); + //program.setAtlasSize(width, height); //entry.getValue().getAllRenderables().forEach(Renderable::draw); } diff --git a/src/main/java/com/jozufozu/flywheel/core/material/MaterialShaders.java b/src/main/java/com/jozufozu/flywheel/core/material/MaterialShaders.java new file mode 100644 index 000000000..d1fc82780 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/material/MaterialShaders.java @@ -0,0 +1,26 @@ +package com.jozufozu.flywheel.core.material; + +import com.jozufozu.flywheel.Flywheel; +import com.jozufozu.flywheel.core.source.FileResolution; +import com.jozufozu.flywheel.core.source.Resolver; +import com.jozufozu.flywheel.event.GatherContextEvent; +import com.jozufozu.flywheel.util.ResourceUtil; + +import net.minecraft.resources.ResourceLocation; + +public class MaterialShaders { + public static FileResolution DEFAULT_VERTEX; + public static FileResolution DEFAULT_FRAGMENT; + public static FileResolution SHADED_VERTEX; + + public static void flwInit(GatherContextEvent event) { + DEFAULT_VERTEX = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.DEFAULT, ".vert")); + DEFAULT_FRAGMENT = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.DEFAULT, ".frag")); + SHADED_VERTEX = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.SHADED, ".vert")); + } + + public static class Names { + public static final ResourceLocation DEFAULT = Flywheel.rl("material/default"); + public static final ResourceLocation SHADED = Flywheel.rl("material/shaded"); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/Materials.java b/src/main/java/com/jozufozu/flywheel/core/materials/Materials.java deleted file mode 100644 index 7f81b5b41..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/materials/Materials.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.jozufozu.flywheel.core.materials; - -import com.jozufozu.flywheel.api.struct.StructType; -import com.jozufozu.flywheel.core.materials.model.ModelData; -import com.jozufozu.flywheel.core.materials.model.ModelType; -import com.jozufozu.flywheel.core.materials.oriented.OrientedData; -import com.jozufozu.flywheel.core.materials.oriented.OrientedType; - -public class Materials { - public static final StructType TRANSFORMED = new ModelType(); - public static final StructType ORIENTED = new OrientedType(); -} diff --git a/src/main/java/com/jozufozu/flywheel/core/model/ModelSupplier.java b/src/main/java/com/jozufozu/flywheel/core/model/ModelSupplier.java index 111a126ce..f92c63bc0 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/ModelSupplier.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/ModelSupplier.java @@ -2,11 +2,10 @@ package com.jozufozu.flywheel.core.model; import java.util.Map; -import net.minecraft.client.renderer.RenderType; +import com.jozufozu.flywheel.api.material.Material; public interface ModelSupplier { - - Map get(); + Map get(); int getVertexCount(); } diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java b/src/main/java/com/jozufozu/flywheel/core/structs/BasicData.java similarity index 97% rename from src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java rename to src/main/java/com/jozufozu/flywheel/core/structs/BasicData.java index 8f1e07de8..73a13149a 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/BasicData.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.core.materials; +package com.jozufozu.flywheel.core.structs; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.util.Color; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/BasicWriterUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/structs/BasicWriterUnsafe.java similarity index 94% rename from src/main/java/com/jozufozu/flywheel/core/materials/BasicWriterUnsafe.java rename to src/main/java/com/jozufozu/flywheel/core/structs/BasicWriterUnsafe.java index 0ce2f7a75..c29d3e057 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/BasicWriterUnsafe.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/BasicWriterUnsafe.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.core.materials; +package com.jozufozu.flywheel.core.structs; import org.lwjgl.system.MemoryUtil; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java b/src/main/java/com/jozufozu/flywheel/core/structs/FlatLit.java similarity index 96% rename from src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java rename to src/main/java/com/jozufozu/flywheel/core/structs/FlatLit.java index 03fc53174..3446e1500 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/FlatLit.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.core.materials; +package com.jozufozu.flywheel.core.structs; import com.jozufozu.flywheel.api.InstanceData; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/InstanceShaders.java b/src/main/java/com/jozufozu/flywheel/core/structs/InstanceShaders.java similarity index 94% rename from src/main/java/com/jozufozu/flywheel/core/materials/InstanceShaders.java rename to src/main/java/com/jozufozu/flywheel/core/structs/InstanceShaders.java index 8cc97b31c..41507dd0a 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/InstanceShaders.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/InstanceShaders.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.core.materials; +package com.jozufozu.flywheel.core.structs; import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.core.source.FileResolution; diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/StructTypes.java b/src/main/java/com/jozufozu/flywheel/core/structs/StructTypes.java new file mode 100644 index 000000000..23364d214 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/structs/StructTypes.java @@ -0,0 +1,12 @@ +package com.jozufozu.flywheel.core.structs; + +import com.jozufozu.flywheel.api.struct.StructType; +import com.jozufozu.flywheel.core.structs.model.ModelData; +import com.jozufozu.flywheel.core.structs.model.ModelType; +import com.jozufozu.flywheel.core.structs.oriented.OrientedData; +import com.jozufozu.flywheel.core.structs.oriented.OrientedType; + +public class StructTypes { + public static final StructType MODEL = new ModelType(); + public static final StructType ORIENTED = new OrientedType(); +} diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelData.java b/src/main/java/com/jozufozu/flywheel/core/structs/model/ModelData.java similarity index 94% rename from src/main/java/com/jozufozu/flywheel/core/materials/model/ModelData.java rename to src/main/java/com/jozufozu/flywheel/core/structs/model/ModelData.java index e0965ba4b..24b486f08 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelData.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/model/ModelData.java @@ -1,6 +1,6 @@ -package com.jozufozu.flywheel.core.materials.model; +package com.jozufozu.flywheel.core.structs.model; -import com.jozufozu.flywheel.core.materials.BasicData; +import com.jozufozu.flywheel.core.structs.BasicData; import com.jozufozu.flywheel.util.transform.Transform; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix3f; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java b/src/main/java/com/jozufozu/flywheel/core/structs/model/ModelType.java similarity index 91% rename from src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java rename to src/main/java/com/jozufozu/flywheel/core/structs/model/ModelType.java index 108828492..af0da82bf 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/model/ModelType.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.core.materials.model; +package com.jozufozu.flywheel.core.structs.model; import com.jozufozu.flywheel.api.struct.Batched; import com.jozufozu.flywheel.api.struct.Instanced; @@ -6,9 +6,9 @@ import com.jozufozu.flywheel.api.struct.StructWriter; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.layout.BufferLayout; import com.jozufozu.flywheel.core.layout.CommonItems; -import com.jozufozu.flywheel.core.materials.InstanceShaders; import com.jozufozu.flywheel.core.model.ModelTransformer; import com.jozufozu.flywheel.core.source.FileResolution; +import com.jozufozu.flywheel.core.structs.InstanceShaders; public class ModelType implements Instanced, Batched { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelWriterUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/structs/model/ModelWriterUnsafe.java similarity index 84% rename from src/main/java/com/jozufozu/flywheel/core/materials/model/ModelWriterUnsafe.java rename to src/main/java/com/jozufozu/flywheel/core/structs/model/ModelWriterUnsafe.java index 6f3682040..b125b8d6c 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelWriterUnsafe.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/model/ModelWriterUnsafe.java @@ -1,8 +1,8 @@ -package com.jozufozu.flywheel.core.materials.model; +package com.jozufozu.flywheel.core.structs.model; 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.core.structs.BasicWriterUnsafe; import com.jozufozu.flywheel.util.MatrixWrite; public class ModelWriterUnsafe extends BasicWriterUnsafe { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/package-info.java b/src/main/java/com/jozufozu/flywheel/core/structs/model/package-info.java similarity index 76% rename from src/main/java/com/jozufozu/flywheel/core/materials/model/package-info.java rename to src/main/java/com/jozufozu/flywheel/core/structs/model/package-info.java index 9f136b741..759c3a038 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/model/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.core.materials.model; +package com.jozufozu.flywheel.core.structs.model; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedData.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedData.java similarity index 93% rename from src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedData.java rename to src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedData.java index 1971a3a05..15a9ebfd9 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedData.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedData.java @@ -1,6 +1,6 @@ -package com.jozufozu.flywheel.core.materials.oriented; +package com.jozufozu.flywheel.core.structs.oriented; -import com.jozufozu.flywheel.core.materials.BasicData; +import com.jozufozu.flywheel.core.structs.BasicData; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java similarity index 92% rename from src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java rename to src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java index e48429232..f11d2218e 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.core.materials.oriented; +package com.jozufozu.flywheel.core.structs.oriented; import com.jozufozu.flywheel.api.struct.Batched; import com.jozufozu.flywheel.api.struct.Instanced; @@ -6,9 +6,9 @@ import com.jozufozu.flywheel.api.struct.StructWriter; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.layout.BufferLayout; import com.jozufozu.flywheel.core.layout.CommonItems; -import com.jozufozu.flywheel.core.materials.InstanceShaders; import com.jozufozu.flywheel.core.model.ModelTransformer; import com.jozufozu.flywheel.core.source.FileResolution; +import com.jozufozu.flywheel.core.structs.InstanceShaders; import com.mojang.math.Quaternion; public class OrientedType implements Instanced, Batched { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedWriterUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedWriterUnsafe.java similarity index 88% rename from src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedWriterUnsafe.java rename to src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedWriterUnsafe.java index f7afd8c2b..45730aca1 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedWriterUnsafe.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedWriterUnsafe.java @@ -1,10 +1,10 @@ -package com.jozufozu.flywheel.core.materials.oriented; +package com.jozufozu.flywheel.core.structs.oriented; import org.lwjgl.system.MemoryUtil; 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.core.structs.BasicWriterUnsafe; public class OrientedWriterUnsafe extends BasicWriterUnsafe { public OrientedWriterUnsafe(VecBuffer backingBuffer, StructType vertexType) { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/package-info.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/package-info.java similarity index 75% rename from src/main/java/com/jozufozu/flywheel/core/materials/oriented/package-info.java rename to src/main/java/com/jozufozu/flywheel/core/structs/oriented/package-info.java index 185239e40..202eba8c7 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.core.materials.oriented; +package com.jozufozu.flywheel.core.structs.oriented; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/package-info.java b/src/main/java/com/jozufozu/flywheel/core/structs/package-info.java similarity index 78% rename from src/main/java/com/jozufozu/flywheel/core/materials/package-info.java rename to src/main/java/com/jozufozu/flywheel/core/structs/package-info.java index 09622d998..c207d09fc 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.core.materials; +package com.jozufozu.flywheel.core.structs; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java index 062da4dad..125408f43 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java @@ -2,13 +2,15 @@ package com.jozufozu.flywheel.vanilla; import org.jetbrains.annotations.NotNull; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.material.Material; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.BasicModelSupplier; import com.jozufozu.flywheel.core.hardcoded.ModelPart; -import com.jozufozu.flywheel.core.materials.Materials; -import com.jozufozu.flywheel.core.materials.oriented.OrientedData; +import com.jozufozu.flywheel.core.material.MaterialShaders; +import com.jozufozu.flywheel.core.structs.StructTypes; +import com.jozufozu.flywheel.core.structs.oriented.OrientedData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; @@ -20,14 +22,14 @@ import net.minecraft.world.level.block.entity.BellBlockEntity; public class BellInstance extends BlockEntityInstance implements DynamicInstance { - private static final BasicModelSupplier MODEL = new BasicModelSupplier(BellInstance::createBellModel, Sheets.solidBlockSheet()); + private static final BasicModelSupplier MODEL = new BasicModelSupplier(BellInstance::createBellModel, new Material(Sheets.solidBlockSheet(), () -> MaterialShaders.SHADED_VERTEX, () -> MaterialShaders.DEFAULT_FRAGMENT)); private final OrientedData bell; private float lastRingTime = Float.NaN; - public BellInstance(MaterialManager materialManager, BellBlockEntity blockEntity) { - super(materialManager, blockEntity); + public BellInstance(InstancerManager instancerManager, BellBlockEntity blockEntity) { + super(instancerManager, blockEntity); bell = createBellInstance() .setPivot(0.5f, 0.75f, 0.5f) @@ -63,7 +65,7 @@ public class BellInstance extends BlockEntityInstance implement } private OrientedData createBellInstance() { - return materialManager.material(Materials.ORIENTED) + return instancerManager.factory(StructTypes.ORIENTED) .model(MODEL) .createInstance(); } diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java index cfaca529e..bac103498 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java @@ -5,14 +5,15 @@ import java.util.function.BiFunction; import org.jetbrains.annotations.NotNull; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.BasicModelSupplier; import com.jozufozu.flywheel.core.hardcoded.ModelPart; -import com.jozufozu.flywheel.core.materials.Materials; -import com.jozufozu.flywheel.core.materials.model.ModelData; -import com.jozufozu.flywheel.core.materials.oriented.OrientedData; +import com.jozufozu.flywheel.core.material.MaterialShaders; +import com.jozufozu.flywheel.core.structs.StructTypes; +import com.jozufozu.flywheel.core.structs.model.ModelData; +import com.jozufozu.flywheel.core.structs.oriented.OrientedData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; @@ -33,8 +34,8 @@ import net.minecraft.world.level.block.state.properties.ChestType; public class ChestInstance extends BlockEntityInstance implements DynamicInstance { - private static final BiFunction LID = Util.memoize((type, mat) -> new BasicModelSupplier(() -> createLidModel(type, mat.sprite()), Sheets.chestSheet())); - private static final BiFunction BASE = Util.memoize((type, mat) -> new BasicModelSupplier(() -> createBaseModel(type, mat.sprite()), Sheets.chestSheet())); + private static final BiFunction LID = Util.memoize((type, mat) -> new BasicModelSupplier(() -> createLidModel(type, mat.sprite()), new com.jozufozu.flywheel.api.material.Material(Sheets.chestSheet(), () -> MaterialShaders.SHADED_VERTEX, () -> MaterialShaders.DEFAULT_FRAGMENT))); + private static final BiFunction BASE = Util.memoize((type, mat) -> new BasicModelSupplier(() -> createBaseModel(type, mat.sprite()), new com.jozufozu.flywheel.api.material.Material(Sheets.chestSheet(), () -> MaterialShaders.SHADED_VERTEX, () -> MaterialShaders.DEFAULT_FRAGMENT))); private final OrientedData body; private final ModelData lid; @@ -47,8 +48,8 @@ public class ChestInstance extends Block private float lastProgress = Float.NaN; - public ChestInstance(MaterialManager materialManager, T blockEntity) { - super(materialManager, blockEntity); + public ChestInstance(InstancerManager instancerManager, T blockEntity) { + super(instancerManager, blockEntity); Block block = blockState.getBlock(); @@ -67,7 +68,7 @@ public class ChestInstance extends Block body.setRotation(baseRotation); - DoubleBlockCombiner.NeighborCombineResult wrapper = chestBlock.combine(blockState, world, getWorldPosition(), true); + DoubleBlockCombiner.NeighborCombineResult wrapper = chestBlock.combine(blockState, level, getWorldPosition(), true); this.lidProgress = wrapper.apply(ChestBlock.opennessCombiner(blockEntity)); @@ -115,14 +116,14 @@ public class ChestInstance extends Block private OrientedData baseInstance() { - return materialManager.material(Materials.ORIENTED) + return instancerManager.factory(StructTypes.ORIENTED) .model(BASE.apply(chestType, renderMaterial)) .createInstance(); } private ModelData lidInstance() { - return materialManager.material(Materials.TRANSFORMED) + return instancerManager.factory(StructTypes.MODEL) .model(LID.apply(chestType, renderMaterial)) .createInstance(); } diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java index 98da7aa81..90f354cba 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java @@ -2,16 +2,18 @@ package com.jozufozu.flywheel.vanilla; import org.jetbrains.annotations.NotNull; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.api.instance.TickableInstance; +import com.jozufozu.flywheel.api.material.Material; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; import com.jozufozu.flywheel.core.BasicModelSupplier; import com.jozufozu.flywheel.core.Models; import com.jozufozu.flywheel.core.hardcoded.ModelPart; -import com.jozufozu.flywheel.core.materials.Materials; -import com.jozufozu.flywheel.core.materials.model.ModelData; +import com.jozufozu.flywheel.core.material.MaterialShaders; import com.jozufozu.flywheel.core.model.Mesh; +import com.jozufozu.flywheel.core.structs.StructTypes; +import com.jozufozu.flywheel.core.structs.model.ModelData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; @@ -29,7 +31,7 @@ import net.minecraft.world.phys.Vec3; public class MinecartInstance extends EntityInstance implements DynamicInstance, TickableInstance { private static final ResourceLocation MINECART_LOCATION = new ResourceLocation("textures/entity/minecart.png"); - private static final BasicModelSupplier MODEL = new BasicModelSupplier(MinecartInstance::getBodyModel, RenderType.entitySolid(MINECART_LOCATION)); + private static final BasicModelSupplier MODEL = new BasicModelSupplier(MinecartInstance::getBodyModel, new Material(RenderType.entitySolid(MINECART_LOCATION), () -> MaterialShaders.SHADED_VERTEX, () -> MaterialShaders.DEFAULT_FRAGMENT)); private final PoseStack stack = new PoseStack(); @@ -37,8 +39,8 @@ public class MinecartInstance extends EntityInstance private ModelData contents; private BlockState blockstate; - public MinecartInstance(MaterialManager materialManager, T entity) { - super(materialManager, entity); + public MinecartInstance(InstancerManager instancerManager, T entity) { + super(instancerManager, entity); blockstate = entity.getDisplayBlockState(); contents = getContents(); @@ -63,7 +65,7 @@ public class MinecartInstance extends EntityInstance stack.setIdentity(); float pt = AnimationTickHolder.getPartialTicks(); - Vec3i originCoordinate = materialManager.getOriginCoordinate(); + Vec3i originCoordinate = instancerManager.getOriginCoordinate(); tstack.translate( Mth.lerp(pt, entity.xOld, entity.getX()) - originCoordinate.getX(), Mth.lerp(pt, entity.yOld, entity.getY()) - originCoordinate.getY(), @@ -147,13 +149,13 @@ public class MinecartInstance extends EntityInstance if (blockstate.getRenderShape() == RenderShape.INVISIBLE) return null; - return materialManager.material(Materials.TRANSFORMED) + return instancerManager.factory(StructTypes.MODEL) .model(Models.block(blockstate)) .createInstance(); } private ModelData getBody() { - return materialManager.material(Materials.TRANSFORMED) + return instancerManager.factory(StructTypes.MODEL) .model(MODEL) .createInstance(); } diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java index 407b755f0..b2857164d 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java @@ -2,13 +2,15 @@ package com.jozufozu.flywheel.vanilla; import java.util.function.Function; -import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.api.InstancerManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; +import com.jozufozu.flywheel.api.material.Material; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.BasicModelSupplier; import com.jozufozu.flywheel.core.hardcoded.ModelPart; -import com.jozufozu.flywheel.core.materials.Materials; -import com.jozufozu.flywheel.core.materials.model.ModelData; +import com.jozufozu.flywheel.core.material.MaterialShaders; +import com.jozufozu.flywheel.core.structs.StructTypes; +import com.jozufozu.flywheel.core.structs.model.ModelData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; @@ -26,8 +28,8 @@ import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; public class ShulkerBoxInstance extends BlockEntityInstance implements DynamicInstance { - private static final Function BASE = Util.memoize(it -> new BasicModelSupplier(() -> makeBaseModel(it), RenderType.entityCutoutNoCull(Sheets.SHULKER_SHEET))); - private static final Function LID = Util.memoize(it -> new BasicModelSupplier(() -> makeLidModel(it), RenderType.entityCutoutNoCull(Sheets.SHULKER_SHEET))); + private static final Function BASE = Util.memoize(it -> new BasicModelSupplier(() -> makeBaseModel(it), new Material(RenderType.entityCutoutNoCull(Sheets.SHULKER_SHEET), () -> MaterialShaders.SHADED_VERTEX, () -> MaterialShaders.DEFAULT_FRAGMENT))); + private static final Function LID = Util.memoize(it -> new BasicModelSupplier(() -> makeLidModel(it), new Material(RenderType.entityCutoutNoCull(Sheets.SHULKER_SHEET), () -> MaterialShaders.SHADED_VERTEX, () -> MaterialShaders.DEFAULT_FRAGMENT))); private final TextureAtlasSprite texture; @@ -37,8 +39,8 @@ public class ShulkerBoxInstance extends BlockEntityInstance