Lock preview view to local scene
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-09-21 08:48:20 -04:00
1 parent 83af20ab6c
commit 3ecb01940d
7 files changed
+28 -20

No files matched your search

@@ -34,7 +34,7 @@ public final class PonderDestinationPreviewRenderer implements DestinationPrevie
private static final Vector3f DIFFUSE_LIGHT_0 = new Vector3f(0.4F, -1.0F, 0.7F).normalize();
private static final Vector3f DIFFUSE_LIGHT_1 = new Vector3f(-0.4F, -0.5F, 0.7F).normalize();
private final PonderLevel previewLevel;
private final Selection selection;
private final Selection snapshotSelection;
private final PonderSceneElement section;
private int ticks;
private boolean loaded;
@@ -43,13 +43,16 @@ public final class PonderDestinationPreviewRenderer implements DestinationPrevie
public PonderDestinationPreviewRenderer() {
Minecraft minecraft = Minecraft.getInstance();
previewLevel = new PonderLevel(BlockPos.ZERO, minecraft.level);
selection = SelectionImpl.of(new BoundingBox(0, 0, 0, 8, 127, 8));
section = new WorldSectionElementImpl(selection);
snapshotSelection = SelectionImpl.of(new BoundingBox(0, 0, 0, 8, 63, 8));
// The target sits at y=32 in the snapshot. Render only its familiar
// y=30..36 window, giving the page a fixed 9×7×9 close-up.
Selection viewSelection = SelectionImpl.of(new BoundingBox(0, 30, 0, 8, 36, 8));
section = new WorldSectionElementImpl(viewSelection);
}
@Override
public void accept(LinkPreviewPayload payload) {
selection.forEach(pos -> previewLevel.setBlock(pos, Blocks.AIR.defaultBlockState(), 2));
snapshotSelection.forEach(pos -> previewLevel.setBlock(pos, Blocks.AIR.defaultBlockState(), 2));
payload.blocks().forEach(block -> previewLevel.setBlock(block.pos(), block.state(), 2));
((net.createmod.ponder.api.element.WorldSectionElement)section).queueRedraw();
backgroundColor = 0xFF000000 | payload.skyColor() & 0x00FFFFFF;
@@ -105,10 +108,8 @@ public final class PonderDestinationPreviewRenderer implements DestinationPrevie
poseStack.mulPose(Axis.XP.rotationDegrees(-28.0F));
poseStack.mulPose(Axis.YP.rotationDegrees((ticks + partialTick) * 0.6F));
UIRenderHelper.flipForGuiRender(poseStack);
// Fit the complete 128-block vertical slice, while keeping the 9×9
// footprint centered during the full horizontal orbit.
poseStack.scale(0.58F, 0.58F, 0.58F);
poseStack.translate(-4.5F, -64.0F, -4.5F);
poseStack.scale(7.0F, 7.0F, 7.0F);
poseStack.translate(-4.5F, -31.5F, -4.5F);
SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBuffer.getInstance();
section.renderFirst(previewLevel, buffer, graphics, partialTick);
@@ -65,7 +65,9 @@ public final class LinkingGameTests {
BlockPos absoluteOrigin = helper.absolutePos(ORIGIN);
for (BlockPos position : BlockPos.betweenClosed(
absoluteOrigin.offset(-4, -2, -4), absoluteOrigin.offset(4, 2, 4))) {
helper.getLevel().setBlockAndUpdate(position, Blocks.STONE.defaultBlockState());
// This test only needs collision states. Avoid propagating 405
// neighbor updates through the GameTest world while preparing it.
helper.getLevel().setBlock(position, Blocks.STONE.defaultBlockState(), 2);
}
ServerPlayer player = helper.makeMockServerPlayerInLevel();
@@ -12,8 +12,8 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
public record LinkPreviewPayload(int skyColor, List<SnapshotBlock> blocks) implements CustomPacketPayload {
/** A square footprint keeps every side visible during an orbit, with a tall vertical slice. */
private static final int MAX_BLOCKS = 9 * 128 * 9;
/** A square footprint keeps every side visible during an orbit, with a vertical snapshot cache. */
private static final int MAX_BLOCKS = 9 * 64 * 9;
public static final Type<LinkPreviewPayload> TYPE = new Type<>(
ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "link_preview")
);
@@ -114,12 +114,12 @@ public final class ModNetworking {
BlockPos origin = target.location().pos();
List<LinkPreviewPayload.SnapshotBlock> blocks = new ArrayList<>();
// The square footprint survives every angle of the orbit. The vertical
// slice captures 64 blocks below through 63 blocks above the link point.
for (BlockPos pos : BlockPos.betweenClosed(origin.offset(-4, -64, -4), origin.offset(4, 63, 4))) {
// The square footprint survives every angle of the orbit. Retain a
// 64-block vertical slice, while the renderer shows its 7-block window.
for (BlockPos pos : BlockPos.betweenClosed(origin.offset(-4, -32, -4), origin.offset(4, 31, 4))) {
var state = level.getBlockState(pos);
if (!state.isAir()) {
blocks.add(new LinkPreviewPayload.SnapshotBlock(pos.subtract(origin).offset(4, 64, 4), state));
blocks.add(new LinkPreviewPayload.SnapshotBlock(pos.subtract(origin).offset(4, 32, 4), state));
}
}
int skyColor = level.getBiome(origin).value().getSkyColor();