diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java index f9c671839..bcc74eef9 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java @@ -6,7 +6,6 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; -import dev.engine_room.flywheel.lib.model.baked.MultiBlockModelBuilder; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.resources.ResourceLocation; @@ -20,6 +19,4 @@ public interface FlwLibXplat { SimpleModel buildBakedModelBuilder(BakedModelBuilder builder); SimpleModel buildBlockModelBuilder(BlockModelBuilder builder); - - SimpleModel buildMultiBlockModelBuilder(MultiBlockModelBuilder builder); } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java index 22116f74f..80948eaef 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java @@ -1,5 +1,6 @@ package dev.engine_room.flywheel.lib.model; +import java.util.List; import java.util.function.BiConsumer; import com.mojang.blaze3d.vertex.PoseStack; @@ -8,8 +9,10 @@ import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.model.baked.SinglePosVirtualBlockGetter; import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.util.RendererReloadCache; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; @@ -20,7 +23,8 @@ * method with the same parameters will return the same object. */ public final class Models { - private static final RendererReloadCache BLOCK_STATE = new RendererReloadCache<>(it -> new BlockModelBuilder(it) + private static final RendererReloadCache BLOCK_STATE = new RendererReloadCache<>(it -> new BlockModelBuilder(SinglePosVirtualBlockGetter.createFullDark() + .blockState(it), List.of(BlockPos.ZERO)) .build()); private static final RendererReloadCache PARTIAL = new RendererReloadCache<>(it -> new BakedModelBuilder(it.get()) .build()); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java index a3a1c1980..478d9cf90 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java @@ -12,15 +12,15 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; public final class BakedModelBuilder { final BakedModel bakedModel; @Nullable BlockAndTintGetter level; @Nullable - BlockState blockState; + BlockPos pos; @Nullable PoseStack poseStack; @Nullable @@ -30,27 +30,33 @@ public BakedModelBuilder(BakedModel bakedModel) { this.bakedModel = bakedModel; } - public BakedModelBuilder level(BlockAndTintGetter level) { + public BakedModelBuilder level(@Nullable BlockAndTintGetter level) { this.level = level; return this; } - public BakedModelBuilder blockState(BlockState blockState) { - this.blockState = blockState; + public BakedModelBuilder pos(@Nullable BlockPos pos) { + this.pos = pos; return this; } - public BakedModelBuilder poseStack(PoseStack poseStack) { + public BakedModelBuilder poseStack(@Nullable PoseStack poseStack) { this.poseStack = poseStack; return this; } - public BakedModelBuilder materialFunc(BiFunction materialFunc) { + public BakedModelBuilder materialFunc(@Nullable BiFunction materialFunc) { this.materialFunc = materialFunc; return this; } public SimpleModel build() { + if (level == null) { + level = EmptyVirtualBlockGetter.FULL_DARK; + } + if (pos == null) { + pos = BlockPos.ZERO; + } if (materialFunc == null) { materialFunc = ModelUtil::getMaterial; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index 8186e197c..81bc3fa27 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -11,33 +11,34 @@ import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; public final class BlockModelBuilder { - final BlockState state; - @Nullable - BlockAndTintGetter level; + final BlockAndTintGetter level; + final Iterable positions; @Nullable PoseStack poseStack; + boolean renderFluids = false; @Nullable BiFunction materialFunc; - public BlockModelBuilder(BlockState state) { - this.state = state; + public BlockModelBuilder(BlockAndTintGetter level, Iterable positions) { + this.level = level; + this.positions = positions; } - public BlockModelBuilder level(BlockAndTintGetter level) { - this.level = level; + public BlockModelBuilder poseStack(@Nullable PoseStack poseStack) { + this.poseStack = poseStack; return this; } - public BlockModelBuilder poseStack(PoseStack poseStack) { - this.poseStack = poseStack; + public BlockModelBuilder renderFluids(boolean renderFluids) { + this.renderFluids = renderFluids; return this; } - public BlockModelBuilder materialFunc(BiFunction materialFunc) { + public BlockModelBuilder materialFunc(@Nullable BiFunction materialFunc) { this.materialFunc = materialFunc; return this; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualEmptyBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java similarity index 61% rename from common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualEmptyBlockGetter.java rename to common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java index 825e229f6..a5439444d 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualEmptyBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java @@ -5,26 +5,20 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; -public class VirtualEmptyBlockGetter extends VirtualBlockGetter { - public static final VirtualEmptyBlockGetter INSTANCE = new VirtualEmptyBlockGetter(p -> 0, p -> 15); - public static final VirtualEmptyBlockGetter FULL_BRIGHT = new VirtualEmptyBlockGetter(p -> 15, p -> 15); - public static final VirtualEmptyBlockGetter FULL_DARK = new VirtualEmptyBlockGetter(p -> 0, p -> 0); +public class EmptyVirtualBlockGetter extends VirtualBlockGetter { + public static final EmptyVirtualBlockGetter FULL_DARK = new EmptyVirtualBlockGetter(p -> 0, p -> 0); + public static final EmptyVirtualBlockGetter FULL_BRIGHT = new EmptyVirtualBlockGetter(p -> 15, p -> 15); - public VirtualEmptyBlockGetter(ToIntFunction blockLightFunc, ToIntFunction skyLightFunc) { + public EmptyVirtualBlockGetter(ToIntFunction blockLightFunc, ToIntFunction skyLightFunc) { super(blockLightFunc, skyLightFunc); } - public static boolean is(BlockAndTintGetter blockGetter) { - return blockGetter instanceof VirtualEmptyBlockGetter; - } - @Override @Nullable public final BlockEntity getBlockEntity(BlockPos pos) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MultiBlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MultiBlockModelBuilder.java deleted file mode 100644 index 2e99a6c77..000000000 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MultiBlockModelBuilder.java +++ /dev/null @@ -1,53 +0,0 @@ -package dev.engine_room.flywheel.lib.model.baked; - -import java.util.function.BiFunction; - -import org.jetbrains.annotations.Nullable; - -import com.mojang.blaze3d.vertex.PoseStack; - -import dev.engine_room.flywheel.api.material.Material; -import dev.engine_room.flywheel.lib.internal.FlwLibXplat; -import dev.engine_room.flywheel.lib.model.ModelUtil; -import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; - -public final class MultiBlockModelBuilder { - final BlockAndTintGetter level; - final Iterable positions; - @Nullable - PoseStack poseStack; - boolean renderFluids = false; - @Nullable - BiFunction materialFunc; - - public MultiBlockModelBuilder(BlockAndTintGetter level, Iterable positions) { - this.level = level; - this.positions = positions; - } - - public MultiBlockModelBuilder poseStack(PoseStack poseStack) { - this.poseStack = poseStack; - return this; - } - - public MultiBlockModelBuilder enableFluidRendering() { - renderFluids = true; - return this; - } - - public MultiBlockModelBuilder materialFunc(BiFunction materialFunc) { - this.materialFunc = materialFunc; - return this; - } - - public SimpleModel build() { - if (materialFunc == null) { - materialFunc = ModelUtil::getMaterial; - } - - return FlwLibXplat.INSTANCE.buildMultiBlockModelBuilder(this); - } -} diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/OriginBlockAndTintGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/OriginBlockAndTintGetter.java deleted file mode 100644 index 9df1dbf4f..000000000 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/OriginBlockAndTintGetter.java +++ /dev/null @@ -1,57 +0,0 @@ -package dev.engine_room.flywheel.lib.model.baked; - -import java.util.function.ToIntFunction; - -import org.jetbrains.annotations.Nullable; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -public class OriginBlockAndTintGetter extends VirtualBlockGetter { - @Nullable - protected BlockEntity originBlockEntity; - protected BlockState originBlockState = Blocks.AIR.defaultBlockState(); - - public OriginBlockAndTintGetter(ToIntFunction blockLightFunc, ToIntFunction skyLightFunc) { - super(blockLightFunc, skyLightFunc); - } - - public void originBlockEntity(@Nullable BlockEntity blockEntity) { - originBlockEntity = blockEntity; - } - - public void originBlockState(BlockState state) { - originBlockState = state; - } - - @Override - @Nullable - public BlockEntity getBlockEntity(BlockPos pos) { - if (pos.equals(BlockPos.ZERO)) { - return originBlockEntity; - } - - return null; - } - - @Override - public BlockState getBlockState(BlockPos pos) { - if (pos.equals(BlockPos.ZERO)) { - return originBlockState; - } - - return Blocks.AIR.defaultBlockState(); - } - - @Override - public int getHeight() { - return 1; - } - - @Override - public int getMinBuildHeight() { - return 0; - } -} diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java new file mode 100644 index 000000000..21d248724 --- /dev/null +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java @@ -0,0 +1,73 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import java.util.function.ToIntFunction; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class SinglePosVirtualBlockGetter extends VirtualBlockGetter { + protected BlockPos pos = BlockPos.ZERO; + protected BlockState blockState = Blocks.AIR.defaultBlockState(); + @Nullable + protected BlockEntity blockEntity; + + public SinglePosVirtualBlockGetter(ToIntFunction blockLightFunc, ToIntFunction skyLightFunc) { + super(blockLightFunc, skyLightFunc); + } + + public static SinglePosVirtualBlockGetter createFullDark() { + return new SinglePosVirtualBlockGetter(p -> 0, p -> 0); + } + + public static SinglePosVirtualBlockGetter createFullBright() { + return new SinglePosVirtualBlockGetter(p -> 15, p -> 15); + } + + public SinglePosVirtualBlockGetter pos(BlockPos pos) { + this.pos = pos; + return this; + } + + public SinglePosVirtualBlockGetter blockState(BlockState state) { + blockState = state; + return this; + } + + public SinglePosVirtualBlockGetter blockEntity(@Nullable BlockEntity blockEntity) { + this.blockEntity = blockEntity; + return this; + } + + @Override + @Nullable + public BlockEntity getBlockEntity(BlockPos pos) { + if (pos.equals(this.pos)) { + return blockEntity; + } + + return null; + } + + @Override + public BlockState getBlockState(BlockPos pos) { + if (pos.equals(this.pos)) { + return blockState; + } + + return Blocks.AIR.defaultBlockState(); + } + + @Override + public int getHeight() { + return 1; + } + + @Override + public int getMinBuildHeight() { + return pos.getY(); + } +} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java index ae2618add..4108f5afe 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java @@ -3,7 +3,12 @@ import dev.engine_room.vanillin.config.BlockEntityVisualizerBuilder; import dev.engine_room.vanillin.config.Configurator; import dev.engine_room.vanillin.config.EntityVisualizerBuilder; -import dev.engine_room.vanillin.visuals.*; +import dev.engine_room.vanillin.visuals.BellVisual; +import dev.engine_room.vanillin.visuals.ChestVisual; +import dev.engine_room.vanillin.visuals.MinecartVisual; +import dev.engine_room.vanillin.visuals.ShulkerBoxVisual; +import dev.engine_room.vanillin.visuals.SignVisual; +import dev.engine_room.vanillin.visuals.TntMinecartVisual; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; diff --git a/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java b/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java index 13f6a77bd..7782a5d7d 100644 --- a/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java +++ b/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.backend.compile; -import dev.engine_room.flywheel.lib.util.ResourceUtil; import dev.engine_room.flywheel.backend.NoiseTextures; +import dev.engine_room.flywheel.lib.util.ResourceUtil; import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java index 6521c1539..797db860f 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java @@ -19,7 +19,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; @@ -33,18 +32,8 @@ final class BakedModelBufferer { private BakedModelBufferer() { } - public static void bufferSingle(@Nullable BlockAndTintGetter level, BakedModel model, @Nullable BlockState state, @Nullable PoseStack poseStack, ResultConsumer resultConsumer) { + public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ResultConsumer resultConsumer) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); - if (level == null) { - if (state == null) { - state = Blocks.AIR.defaultBlockState(); - } - FabricOriginBlockAndTintGetter originLevel = objects.level; - originLevel.originBlockState(state); - level = originLevel; - } else if (state == null) { - state = level.getBlockState(BlockPos.ZERO); - } if (poseStack == null) { poseStack = objects.identityPoseStack; } @@ -56,6 +45,8 @@ public static void bufferSingle(@Nullable BlockAndTintGetter level, BakedModel m emitter.prepare(resultConsumer); } + long seed = state.getSeed(pos); + RenderType defaultLayer = ItemBlockRenderTypes.getChunkRenderType(state); universalEmitter.prepare(defaultLayer); model = universalEmitter.wrapModel(model); @@ -64,7 +55,7 @@ public static void bufferSingle(@Nullable BlockAndTintGetter level, BakedModel m Minecraft.getInstance() .getBlockRenderer() .getModelRenderer() - .tesselateBlock(level, model, state, BlockPos.ZERO, poseStack, universalEmitter, false, random, 42L, OverlayTexture.NO_OVERLAY); + .tesselateBlock(level, model, state, pos, poseStack, universalEmitter, false, random, seed, OverlayTexture.NO_OVERLAY); poseStack.popPose(); universalEmitter.clear(); @@ -74,18 +65,7 @@ public static void bufferSingle(@Nullable BlockAndTintGetter level, BakedModel m } } - public static void bufferBlock(@Nullable BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ResultConsumer resultConsumer) { - if (state.getRenderShape() != RenderShape.MODEL) { - return; - } - - var blockModel = Minecraft.getInstance() - .getBlockRenderer() - .getBlockModel(state); - bufferSingle(level, blockModel, state, poseStack, resultConsumer); - } - - public static void bufferMultiBlock(Iterator posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, boolean renderFluids, ResultConsumer resultConsumer) { + public static void bufferBlocks(Iterator posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, boolean renderFluids, ResultConsumer resultConsumer) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); if (poseStack == null) { poseStack = objects.identityPoseStack; @@ -154,7 +134,6 @@ public interface ResultConsumer { } private static class ThreadLocalObjects { - public final FabricOriginBlockAndTintGetter level = new FabricOriginBlockAndTintGetter(p -> 0, p -> 0); public final PoseStack identityPoseStack = new PoseStack(); public final RandomSource random = RandomSource.createNewThreadLocalInstance(); diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricOriginBlockAndTintGetter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricOriginBlockAndTintGetter.java deleted file mode 100644 index 6ca65bafe..000000000 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricOriginBlockAndTintGetter.java +++ /dev/null @@ -1,30 +0,0 @@ -package dev.engine_room.flywheel.lib.model.baked; - -import java.util.function.ToIntFunction; - -import org.jetbrains.annotations.Nullable; - -import net.minecraft.core.BlockPos; - -public class FabricOriginBlockAndTintGetter extends OriginBlockAndTintGetter { - @Nullable - protected Object originRenderData; - - public FabricOriginBlockAndTintGetter(ToIntFunction blockLightFunc, ToIntFunction skyLightFunc) { - super(blockLightFunc, skyLightFunc); - } - - public void originRenderData(@Nullable Object renderData) { - originRenderData = renderData; - } - - @Override - @Nullable - public Object getBlockEntityRenderData(BlockPos pos) { - if (pos.equals(BlockPos.ZERO)) { - return originRenderData; - } - - return super.getBlockEntityRenderData(pos); - } -} diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricSinglePosVirtualBlockGetter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricSinglePosVirtualBlockGetter.java new file mode 100644 index 000000000..7a860daf3 --- /dev/null +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricSinglePosVirtualBlockGetter.java @@ -0,0 +1,59 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import java.util.function.ToIntFunction; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class FabricSinglePosVirtualBlockGetter extends SinglePosVirtualBlockGetter { + @Nullable + protected Object renderData; + + public FabricSinglePosVirtualBlockGetter(ToIntFunction blockLightFunc, ToIntFunction skyLightFunc) { + super(blockLightFunc, skyLightFunc); + } + + public static FabricSinglePosVirtualBlockGetter createFullDark() { + return new FabricSinglePosVirtualBlockGetter(p -> 0, p -> 0); + } + + public static FabricSinglePosVirtualBlockGetter createFullBright() { + return new FabricSinglePosVirtualBlockGetter(p -> 15, p -> 15); + } + + @Override + public FabricSinglePosVirtualBlockGetter pos(BlockPos pos) { + super.pos(pos); + return this; + } + + @Override + public FabricSinglePosVirtualBlockGetter blockState(BlockState state) { + super.blockState(blockState); + return this; + } + + @Override + public FabricSinglePosVirtualBlockGetter blockEntity(@Nullable BlockEntity blockEntity) { + super.blockEntity(blockEntity); + return this; + } + + public FabricSinglePosVirtualBlockGetter renderData(@Nullable Object renderData) { + this.renderData = renderData; + return this; + } + + @Override + @Nullable + public Object getBlockEntityRenderData(BlockPos pos) { + if (pos.equals(this.pos)) { + return renderData != null ? renderData : super.getBlockEntityRenderData(pos); + } + + return super.getBlockEntityRenderData(pos); + } +} diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java index a78db4b28..ce0787013 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java @@ -6,6 +6,7 @@ import dev.engine_room.flywheel.api.model.Mesh; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.lib.model.SimpleModel; +import net.minecraft.world.level.block.state.BlockState; @ApiStatus.Internal public final class ModelBuilderImpl { @@ -13,9 +14,10 @@ private ModelBuilderImpl() { } public static SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { + BlockState blockState = builder.level.getBlockState(builder.pos); var builder1 = ChunkLayerSortedListBuilder.getThreadLocal(); - BakedModelBufferer.bufferSingle(builder.level, builder.bakedModel, builder.blockState, builder.poseStack, (renderType, shaded, data) -> { + BakedModelBufferer.bufferModel(builder.bakedModel, builder.pos, builder.level, blockState, builder.poseStack, (renderType, shaded, data) -> { Material material = builder.materialFunc.apply(renderType, shaded); if (material != null) { Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=BakedModelBuilder," + "bakedModel=" + builder.bakedModel + ",renderType=" + renderType + ",shaded=" + shaded); @@ -29,24 +31,10 @@ public static SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { var builder1 = ChunkLayerSortedListBuilder.getThreadLocal(); - BakedModelBufferer.bufferBlock(builder.level, builder.state, builder.poseStack, (renderType, shaded, data) -> { + BakedModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, (renderType, shaded, data) -> { Material material = builder.materialFunc.apply(renderType, shaded); if (material != null) { - Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=BlockModelBuilder," + "blockState=" + builder.state + ",renderType=" + renderType + ",shaded=" + shaded); - builder1.add(renderType, new Model.ConfiguredMesh(material, mesh)); - } - }); - - return new SimpleModel(builder1.build()); - } - - public static SimpleModel buildMultiBlockModelBuilder(MultiBlockModelBuilder builder) { - var builder1 = ChunkLayerSortedListBuilder.getThreadLocal(); - - BakedModelBufferer.bufferMultiBlock(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, (renderType, shaded, data) -> { - Material material = builder.materialFunc.apply(renderType, shaded); - if (material != null) { - Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=MultiBlockModelBuilder," + "renderType=" + renderType + ",shaded=" + shaded); + Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=BlockModelBuilder," + "renderType=" + renderType + ",shaded=" + shaded); builder1.add(renderType, new Model.ConfiguredMesh(material, mesh)); } }); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index bfa52bd1b..733d53425 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -7,7 +7,6 @@ import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.model.baked.ModelBuilderImpl; -import dev.engine_room.flywheel.lib.model.baked.MultiBlockModelBuilder; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.resources.ResourceLocation; @@ -28,9 +27,4 @@ public SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { return ModelBuilderImpl.buildBlockModelBuilder(builder); } - - @Override - public SimpleModel buildMultiBlockModelBuilder(MultiBlockModelBuilder builder) { - return ModelBuilderImpl.buildMultiBlockModelBuilder(builder); - } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java index 82e4dad3d..bd052135d 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java @@ -17,7 +17,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; @@ -33,26 +32,17 @@ final class BakedModelBufferer { private BakedModelBufferer() { } - public static void bufferSingle(@Nullable BlockAndTintGetter level, BakedModel model, @Nullable BlockState state, @Nullable PoseStack poseStack, ResultConsumer resultConsumer) { + public static void bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ResultConsumer resultConsumer) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); - if (level == null) { - if (state == null) { - state = Blocks.AIR.defaultBlockState(); - } - OriginBlockAndTintGetter originLevel = objects.level; - originLevel.originBlockState(state); - level = originLevel; - } else if (state == null) { - state = level.getBlockState(BlockPos.ZERO); - } if (poseStack == null) { poseStack = objects.identityPoseStack; } RandomSource random = objects.random; MeshEmitter[] emitters = objects.emitters; - ModelData modelData = model.getModelData(level, BlockPos.ZERO, state, level.getModelData(BlockPos.ZERO)); - random.setSeed(42L); + long seed = state.getSeed(pos); + ModelData modelData = model.getModelData(level, pos, state, level.getModelData(pos)); + random.setSeed(seed); ChunkRenderTypeSet renderTypes = model.getRenderTypes(state, random, modelData); ModelBlockRenderer blockRenderer = Minecraft.getInstance() @@ -66,25 +56,14 @@ public static void bufferSingle(@Nullable BlockAndTintGetter level, BakedModel m emitter.prepare(resultConsumer); poseStack.pushPose(); - blockRenderer.tesselateBlock(level, model, state, BlockPos.ZERO, poseStack, emitter, false, random, 42L, OverlayTexture.NO_OVERLAY, modelData, renderType); + blockRenderer.tesselateBlock(level, model, state, pos, poseStack, emitter, false, random, seed, OverlayTexture.NO_OVERLAY, modelData, renderType); poseStack.popPose(); emitter.end(); } } - public static void bufferBlock(@Nullable BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ResultConsumer resultConsumer) { - if (state.getRenderShape() != RenderShape.MODEL) { - return; - } - - var blockModel = Minecraft.getInstance() - .getBlockRenderer() - .getBlockModel(state); - bufferSingle(level, blockModel, state, poseStack, resultConsumer); - } - - public static void bufferMultiBlock(Iterator posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, boolean renderFluids, ResultConsumer resultConsumer) { + public static void bufferBlocks(Iterator posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, boolean renderFluids, ResultConsumer resultConsumer) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); if (poseStack == null) { poseStack = objects.identityPoseStack; @@ -154,7 +133,6 @@ public interface ResultConsumer { } private static class ThreadLocalObjects { - public final OriginBlockAndTintGetter level = new OriginBlockAndTintGetter(p -> 0, p -> 0); public final PoseStack identityPoseStack = new PoseStack(); public final RandomSource random = RandomSource.createNewThreadLocalInstance(); diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java index a78db4b28..ce0787013 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java @@ -6,6 +6,7 @@ import dev.engine_room.flywheel.api.model.Mesh; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.lib.model.SimpleModel; +import net.minecraft.world.level.block.state.BlockState; @ApiStatus.Internal public final class ModelBuilderImpl { @@ -13,9 +14,10 @@ private ModelBuilderImpl() { } public static SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { + BlockState blockState = builder.level.getBlockState(builder.pos); var builder1 = ChunkLayerSortedListBuilder.getThreadLocal(); - BakedModelBufferer.bufferSingle(builder.level, builder.bakedModel, builder.blockState, builder.poseStack, (renderType, shaded, data) -> { + BakedModelBufferer.bufferModel(builder.bakedModel, builder.pos, builder.level, blockState, builder.poseStack, (renderType, shaded, data) -> { Material material = builder.materialFunc.apply(renderType, shaded); if (material != null) { Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=BakedModelBuilder," + "bakedModel=" + builder.bakedModel + ",renderType=" + renderType + ",shaded=" + shaded); @@ -29,24 +31,10 @@ public static SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { var builder1 = ChunkLayerSortedListBuilder.getThreadLocal(); - BakedModelBufferer.bufferBlock(builder.level, builder.state, builder.poseStack, (renderType, shaded, data) -> { + BakedModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, (renderType, shaded, data) -> { Material material = builder.materialFunc.apply(renderType, shaded); if (material != null) { - Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=BlockModelBuilder," + "blockState=" + builder.state + ",renderType=" + renderType + ",shaded=" + shaded); - builder1.add(renderType, new Model.ConfiguredMesh(material, mesh)); - } - }); - - return new SimpleModel(builder1.build()); - } - - public static SimpleModel buildMultiBlockModelBuilder(MultiBlockModelBuilder builder) { - var builder1 = ChunkLayerSortedListBuilder.getThreadLocal(); - - BakedModelBufferer.bufferMultiBlock(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, (renderType, shaded, data) -> { - Material material = builder.materialFunc.apply(renderType, shaded); - if (material != null) { - Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=MultiBlockModelBuilder," + "renderType=" + renderType + ",shaded=" + shaded); + Mesh mesh = MeshHelper.blockVerticesToMesh(data, "source=BlockModelBuilder," + "renderType=" + renderType + ",shaded=" + shaded); builder1.add(renderType, new Model.ConfiguredMesh(material, mesh)); } }); diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java new file mode 100644 index 000000000..41291b65e --- /dev/null +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java @@ -0,0 +1,59 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import java.util.function.ToIntFunction; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.client.model.data.ModelData; + +public class NeoForgeSinglePosVirtualBlockGetter extends SinglePosVirtualBlockGetter { + @Nullable + protected ModelData modelData; + + public NeoForgeSinglePosVirtualBlockGetter(ToIntFunction blockLightFunc, ToIntFunction skyLightFunc) { + super(blockLightFunc, skyLightFunc); + } + + public static NeoForgeSinglePosVirtualBlockGetter createFullDark() { + return new NeoForgeSinglePosVirtualBlockGetter(p -> 0, p -> 0); + } + + public static NeoForgeSinglePosVirtualBlockGetter createFullBright() { + return new NeoForgeSinglePosVirtualBlockGetter(p -> 15, p -> 15); + } + + @Override + public NeoForgeSinglePosVirtualBlockGetter pos(BlockPos pos) { + super.pos(pos); + return this; + } + + @Override + public NeoForgeSinglePosVirtualBlockGetter blockState(BlockState state) { + super.blockState(blockState); + return this; + } + + @Override + public NeoForgeSinglePosVirtualBlockGetter blockEntity(@Nullable BlockEntity blockEntity) { + super.blockEntity(blockEntity); + return this; + } + + public NeoForgeSinglePosVirtualBlockGetter modelData(@Nullable ModelData modelData) { + this.modelData = modelData; + return this; + } + + @Override + public ModelData getModelData(BlockPos pos) { + if (pos.equals(this.pos)) { + return modelData != null ? modelData : super.getModelData(pos); + } + + return super.getModelData(pos); + } +} diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index 0b2ee42db..c5ccd80f6 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -7,13 +7,10 @@ import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.model.baked.ModelBuilderImpl; -import dev.engine_room.flywheel.lib.model.baked.MultiBlockModelBuilder; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; public class FlwLibXplatImpl implements FlwLibXplat { @Override @@ -31,9 +28,4 @@ public SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { return ModelBuilderImpl.buildBlockModelBuilder(builder); } - - @Override - public SimpleModel buildMultiBlockModelBuilder(MultiBlockModelBuilder builder) { - return ModelBuilderImpl.buildMultiBlockModelBuilder(builder); - } }