From 153c63f1c8a85a00b9e4c1858f5fc27d75badd3d Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 19 Jan 2025 14:58:51 -0600 Subject: [PATCH] Package deal - Add package entity visual - Add packager visual - Don't render the box model in the visual because it relies on item transforms - Bump flywheel build - Upgrade to some of the newer Affine functions where applicable --- gradle.properties | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 3 + .../com/simibubi/create/AllEntityTypes.java | 5 +- .../logistics/box/PackageRenderer.java | 12 ++- .../content/logistics/box/PackageVisual.java | 69 ++++++++++++ .../logistics/packager/PackagerRenderer.java | 60 +++++++---- .../logistics/packager/PackagerVisual.java | 102 ++++++++++++++++++ 7 files changed, 223 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java diff --git a/gradle.properties b/gradle.properties index c7781bb2f5..3ab81a692c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-182 +flywheel_version = 1.0.0-beta-184 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 227b2a5684..574b5223ef 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -174,6 +174,7 @@ import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEnt import com.simibubi.create.content.logistics.packagePort.postbox.PostboxRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; +import com.simibubi.create.content.logistics.packager.PackagerVisual; import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockEntity; @@ -497,12 +498,14 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry PACKAGER = REGISTRATE .blockEntity("packager", PackagerBlockEntity::new) + .visual(() -> PackagerVisual::new, true) .validBlocks(AllBlocks.PACKAGER) .renderer(() -> PackagerRenderer::new) .register(); public static final BlockEntityEntry REPACKAGER = REGISTRATE .blockEntity("repackager", RepackagerBlockEntity::new) + .visual(() -> PackagerVisual::new, true) .validBlocks(AllBlocks.REPACKAGER) .renderer(() -> PackagerRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 5e5a08622a..2c04ea664f 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -16,6 +16,7 @@ import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileEntity import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileRenderer; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageRenderer; +import com.simibubi.create.content.logistics.box.PackageVisual; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionVisual; @@ -71,7 +72,9 @@ public class AllEntityTypes { MobCategory.MISC, 5, Integer.MAX_VALUE, false, true, SeatEntity::build).register(); public static final EntityEntry PACKAGE = register("package", PackageEntity::new, () -> PackageRenderer::new, - MobCategory.MISC, 10, 3, true, false, PackageEntity::build).register(); + MobCategory.MISC, 10, 3, true, false, PackageEntity::build) + .visual(() -> PackageVisual::new, true) + .register(); // diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index e7717eb6d6..f786bf1f70 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; +import dev.engine_room.flywheel.api.backend.BackendManager; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; @@ -28,11 +29,12 @@ public class PackageRenderer extends EntityRenderer { @Override public void render(PackageEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, int light) { - ItemStack box = entity.box; - if (box.isEmpty() || !PackageItem.isPackage(box)) - box = AllBlocks.CARDBOARD_BLOCK.asStack(); - PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); - renderBox(entity, yaw, ms, buffer, light, model); + if (!BackendManager.isBackendOn()) { + ItemStack box = entity.box; + if (box.isEmpty() || !PackageItem.isPackage(box)) box = AllBlocks.CARDBOARD_BLOCK.asStack(); + PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); + renderBox(entity, yaw, ms, buffer, light, model); + } super.render(entity, yaw, pt, ms, buffer, light); } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java new file mode 100644 index 0000000000..2c44d9bcd8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java @@ -0,0 +1,69 @@ +package com.simibubi.create.content.logistics.box; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPartialModels; + +import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import dev.engine_room.flywheel.lib.instance.InstanceTypes; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.model.Models; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.transform.Translate; +import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; +import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; + +import net.minecraft.world.phys.Vec3; + +import net.minecraftforge.registries.ForgeRegistries; + +public class PackageVisual extends AbstractEntityVisual implements SimpleDynamicVisual { + public final TransformedInstance instance; + + public PackageVisual(VisualizationContext ctx, PackageEntity entity, float partialTick) { + super(ctx, entity, partialTick); + + ItemStack box = entity.box; + if (box.isEmpty() || !PackageItem.isPackage(box)) + box = AllBlocks.CARDBOARD_BLOCK.asStack(); + PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); + + instance = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(model)) + .createInstance(); + + animate(partialTick); + } + + @Override + public void beginFrame(Context ctx) { + animate(ctx.partialTick()); + } + + private void animate(float partialTick) { + float yaw = Mth.lerp(partialTick, entity.yRotO, entity.getYRot()); + + Vec3 pos = PackageVisual.this.entity.position(); + var renderOrigin = renderOrigin(); + var x = (float) (Mth.lerp(partialTick, this.entity.xo, pos.x) - renderOrigin.getX()); + var y = (float) (Mth.lerp(partialTick, this.entity.yo, pos.y) - renderOrigin.getY()); + var z = (float) (Mth.lerp(partialTick, this.entity.zo, pos.z) - renderOrigin.getZ()); + + long randomBits = (long) entity.getId() * 31L * 493286711L; + randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; + float xNudge = (((float) (randomBits >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + float yNudge = (((float) (randomBits >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + float zNudge = (((float) (randomBits >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + + instance.setIdentityTransform() + .translate(x - 0.5 + xNudge, y + yNudge, z - 0.5 + zNudge) + .rotateYCenteredDegrees(yaw) + .light(computePackedLight(partialTick)) + .setChanged(); + } + + @Override + protected void _delete() { + instance.delete(); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index 60a74a558d..491c9db3dc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -5,6 +5,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import dev.engine_room.flywheel.api.backend.BackendManager; +import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; @@ -33,36 +35,35 @@ public class PackagerRenderer extends SmartBlockEntityRenderer (be.animationInward ? 1 : 5) - && be.animationTicks < PackagerBlockEntity.CYCLE - (be.animationInward ? 5 : 1); BlockState blockState = be.getBlockState(); Direction facing = blockState.getValue(PackagerBlock.FACING) .getOpposite(); - PartialModel hatchModel = - hatchOpen ? AllPartialModels.PACKAGER_HATCH_OPEN : AllPartialModels.PACKAGER_HATCH_CLOSED; + if (!BackendManager.isBackendOn()) { + var hatchModel = getHatchModel(be); - SuperByteBuffer sbb = CachedBuffers.partial(hatchModel, blockState); - sbb.translate(Vec3.atLowerCornerOf(facing.getNormal()) - .scale(.49999f)) - .rotateCentered(AngleHelper.rad(AngleHelper.horizontalAngle(facing)), Direction.UP) - .rotateCentered(AngleHelper.rad(AngleHelper.verticalAngle(facing)), Direction.EAST) - .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.solid())); + SuperByteBuffer sbb = CachedBuffers.partial(hatchModel, blockState); + sbb.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(.49999f)) + .rotateYCenteredDegrees(AngleHelper.horizontalAngle(facing)) + .rotateXCenteredDegrees(AngleHelper.verticalAngle(facing)) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); - ms.pushPose(); - var msr = TransformStack.of(ms); - msr.translate(Vec3.atLowerCornerOf(facing.getNormal()) - .scale(trayOffset)); - - sbb = CachedBuffers.partial(AllBlocks.PACKAGER.has(blockState) ? AllPartialModels.PACKAGER_TRAY_REGULAR - : AllPartialModels.PACKAGER_TRAY_DEFRAG, blockState); - sbb.rotateCentered(AngleHelper.rad(facing.toYRot()), Direction.UP) - .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + sbb = CachedBuffers.partial(getTrayModel(blockState), blockState); + sbb.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(trayOffset)) + .rotateYCenteredDegrees(facing.toYRot()) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + } if (!renderedBox.isEmpty()) { - msr.translate(.5f, .5f, .5f) + ms.pushPose(); + var msr = TransformStack.of(ms); + msr.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(trayOffset)) + .translate(.5f, .5f, .5f) .rotateYDegrees(facing.toYRot()) .translate(0, 2 / 16f, 0) .scale(1.49f, 1.49f, 1.49f); @@ -70,9 +71,22 @@ public class PackagerRenderer extends SmartBlockEntityRenderer (be.animationInward ? 1 : 5) + && be.animationTicks < PackagerBlockEntity.CYCLE - (be.animationInward ? 5 : 1); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java new file mode 100644 index 0000000000..e7e909d389 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java @@ -0,0 +1,102 @@ +package com.simibubi.create.content.logistics.packager; + +import java.util.function.Consumer; + +import org.jetbrains.annotations.Nullable; + +import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import dev.engine_room.flywheel.lib.instance.InstanceTypes; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.model.Models; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; +import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import net.createmod.catnip.math.AngleHelper; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.Vec3; + +public class PackagerVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { + public final TransformedInstance hatch; + public final TransformedInstance tray; + + public float lastTrayOffset = Float.NaN; + public PartialModel lastHatchPartial; + + + public PackagerVisual(VisualizationContext ctx, T blockEntity, float partialTick) { + super(ctx, blockEntity, partialTick); + + lastHatchPartial = PackagerRenderer.getHatchModel(blockEntity); + hatch = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(lastHatchPartial)) + .createInstance(); + + tray = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(PackagerRenderer.getTrayModel(blockState))) + .createInstance(); + + Direction facing = blockState.getValue(PackagerBlock.FACING) + .getOpposite(); + + var lowerCorner = Vec3.atLowerCornerOf(facing.getNormal()); + hatch.setIdentityTransform() + .translate(getVisualPosition()) + .translate(lowerCorner + .scale(.49999f)) + .rotateYCenteredDegrees(AngleHelper.horizontalAngle(facing)) + .rotateXCenteredDegrees(AngleHelper.verticalAngle(facing)) + .setChanged(); + + // TODO: I think we need proper ItemVisuals to handle rendering the boxes in here + + animate(partialTick); + } + + @Override + public void beginFrame(Context ctx) { + animate(ctx.partialTick()); + } + + public void animate(float partialTick) { + var hatchPartial = PackagerRenderer.getHatchModel(blockEntity); + + if (hatchPartial != this.lastHatchPartial) { + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(hatchPartial)) + .stealInstance(hatch); + + this.lastHatchPartial = hatchPartial; + } + + float trayOffset = blockEntity.getTrayOffset(partialTick); + + if (trayOffset != lastTrayOffset) { + Direction facing = blockState.getValue(PackagerBlock.FACING) + .getOpposite(); + + var lowerCorner = Vec3.atLowerCornerOf(facing.getNormal()); + + tray.setIdentityTransform() + .translate(getVisualPosition()) + .translate(lowerCorner.scale(trayOffset)) + .rotateYCenteredDegrees(facing.toYRot()) + .setChanged(); + + lastTrayOffset = trayOffset; + } + } + + @Override + public void updateLight(float partialTick) { + relight(hatch, tray); + } + + @Override + protected void _delete() { + hatch.delete(); + tray.delete(); + } + + @Override + public void collectCrumblingInstances(Consumer<@Nullable Instance> consumer) { + + } +}