83 lines
3.4 KiB
Java
83 lines
3.4 KiB
Java
// SPDX-FileCopyrightText: 2018 The CC: Tweaked Developers
|
|
//
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package dan200.computercraft.client.render;
|
|
|
|
import com.mojang.blaze3d.vertex.PoseStack;
|
|
import com.mojang.math.Axis;
|
|
import dan200.computercraft.shared.ModRegistry;
|
|
import dan200.computercraft.shared.media.items.PrintoutData;
|
|
import dan200.computercraft.shared.media.items.PrintoutItem;
|
|
import net.minecraft.client.renderer.MultiBufferSource;
|
|
import net.minecraft.world.entity.EntityType;
|
|
import net.minecraft.world.entity.decoration.ItemFrame;
|
|
import net.minecraft.world.item.ItemStack;
|
|
|
|
import static dan200.computercraft.client.render.PrintoutRenderer.*;
|
|
import static dan200.computercraft.client.render.text.FixedWidthFontRenderer.FONT_HEIGHT;
|
|
import static dan200.computercraft.client.render.text.FixedWidthFontRenderer.FONT_WIDTH;
|
|
import static dan200.computercraft.shared.media.items.PrintoutData.LINES_PER_PAGE;
|
|
import static dan200.computercraft.shared.media.items.PrintoutData.LINE_LENGTH;
|
|
|
|
/**
|
|
* Emulates map and item-frame rendering for printouts.
|
|
*/
|
|
public final class PrintoutItemRenderer extends ItemMapLikeRenderer {
|
|
public static final PrintoutItemRenderer INSTANCE = new PrintoutItemRenderer();
|
|
|
|
private PrintoutItemRenderer() {
|
|
}
|
|
|
|
@Override
|
|
protected void renderItem(PoseStack transform, MultiBufferSource render, ItemStack stack, int light) {
|
|
transform.mulPose(Axis.XP.rotationDegrees(180f));
|
|
transform.scale(0.42f, 0.42f, -0.42f);
|
|
transform.translate(-0.5f, -0.48f, 0.0f);
|
|
|
|
drawPrintout(transform, render, stack, light);
|
|
}
|
|
|
|
public static void onRenderInFrame(PoseStack transform, MultiBufferSource render, ItemFrame frame, ItemStack stack, int packedLight) {
|
|
// Move a little bit forward to ensure we're not clipping with the frame
|
|
transform.translate(0.0f, 0.0f, -0.001f);
|
|
transform.mulPose(Axis.ZP.rotationDegrees(180f));
|
|
transform.scale(0.95f, 0.95f, -0.95f);
|
|
transform.translate(-0.5f, -0.5f, 0.0f);
|
|
|
|
var light = frame.getType() == EntityType.GLOW_ITEM_FRAME ? 0xf000d2 : packedLight; // See getLightVal.
|
|
drawPrintout(transform, render, stack, light);
|
|
}
|
|
|
|
private static void drawPrintout(PoseStack transform, MultiBufferSource render, ItemStack stack, int light) {
|
|
var pageData = stack.getOrDefault(ModRegistry.DataComponents.PRINTOUT.get(), PrintoutData.EMPTY);
|
|
|
|
var pages = pageData.pages();
|
|
var book = ((PrintoutItem) stack.getItem()).getType() == PrintoutItem.Type.BOOK;
|
|
|
|
double width = LINE_LENGTH * FONT_WIDTH + X_TEXT_MARGIN * 2;
|
|
double height = LINES_PER_PAGE * FONT_HEIGHT + Y_TEXT_MARGIN * 2;
|
|
|
|
// Non-books will be left aligned
|
|
if (!book) width += offsetAt(pages - 1);
|
|
|
|
double visualWidth = width, visualHeight = height;
|
|
|
|
// Meanwhile books will be centred
|
|
if (book) {
|
|
visualWidth += 2 * COVER_SIZE + 2 * offsetAt(pages);
|
|
visualHeight += 2 * COVER_SIZE;
|
|
}
|
|
|
|
var max = Math.max(visualHeight, visualWidth);
|
|
|
|
// Scale the printout to fit correctly.
|
|
var scale = (float) (1.0 / max);
|
|
transform.scale(scale, scale, scale);
|
|
transform.translate((max - width) / 2.0, (max - height) / 2.0, 0.0);
|
|
|
|
drawBorder(transform, render, 0, 0, -0.01f, 0, pages, book, light);
|
|
drawText(transform, render, X_TEXT_MARGIN, Y_TEXT_MARGIN, 0, light, pageData.lines());
|
|
}
|
|
}
|