From c8e28258b5a79a612f94143197958a800bdef89b Mon Sep 17 00:00:00 2001 From: 90 Date: Fri, 20 Oct 2023 23:53:36 +0100 Subject: [PATCH] Finish dynamic rendering --- .../_90/megacells/item/part/CellDockPart.java | 72 ++++++++++++++----- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java b/common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java index eb395e8b..37ca4d18 100644 --- a/common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java +++ b/common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java @@ -14,10 +14,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; @@ -65,23 +68,31 @@ public class CellDockPart extends AEBasePart private static final VarHandle LED_RENDER_TYPE; private static final MethodHandle LED_RENDER; + private static final MethodHandle CELL_MODEL; static { try { + var lookup = MethodHandles.lookup(); + var cellLedRenderer = Class.forName("appeng.client.render.tesr.CellLedRenderer"); - var lookup = MethodHandles.privateLookupIn(cellLedRenderer, MethodHandles.lookup()); - - LED_RENDER_TYPE = lookup.findStaticVarHandle(cellLedRenderer, "RENDER_LAYER", RenderType.class); - LED_RENDER = lookup.findStatic( - cellLedRenderer, - "renderLed", - MethodType.methodType( - void.class, - IChestOrDrive.class, - int.class, - VertexConsumer.class, - PoseStack.class, - float.class)); + LED_RENDER_TYPE = MethodHandles.privateLookupIn(cellLedRenderer, lookup) + .findStaticVarHandle(cellLedRenderer, "RENDER_LAYER", RenderType.class); + LED_RENDER = MethodHandles.privateLookupIn(cellLedRenderer, lookup) + .findStatic( + cellLedRenderer, + "renderLed", + MethodType.methodType( + void.class, + IChestOrDrive.class, + int.class, + VertexConsumer.class, + PoseStack.class, + float.class)); + + var cellModel = Class.forName("appeng.client.render.tesr.ChestBlockEntityRenderer$FaceRotatingModel"); + CELL_MODEL = MethodHandles.privateLookupIn(cellModel, lookup) + .findConstructor( + cellModel, MethodType.methodType(void.class, BakedModel.class, BlockOrientation.class)); } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { throw new RuntimeException(e); } @@ -265,6 +276,7 @@ public void mountInventories(IStorageMounts storageMounts) { @Override public void saveChanges() { getHost().markForSave(); + getHost().markForUpdate(); } @Override @@ -275,7 +287,6 @@ public void onChangeInventory(InternalInventory inv, int slot) { } IStorageProvider.requestUpdate(getMainNode()); - getHost().markForSave(); } private void updateState() { @@ -311,8 +322,9 @@ public int getPriority() { @Override public void setPriority(int newValue) { priority = newValue; + getHost().markForSave(); + isCached = false; - saveChanges(); updateState(); IStorageProvider.requestUpdate(getMainNode()); @@ -341,7 +353,7 @@ public IPartModel getStaticModels() { @Override public boolean requireDynamicRender() { - return clientCell != Items.AIR; + return true; } @Override @@ -351,7 +363,10 @@ public void renderDynamic( MultiBufferSource buffers, int combinedLightIn, int combinedOverlayIn) { - // TODO + if (getLevel() == null || clientCell == Items.AIR) { + return; + } + var driveModel = Minecraft.getInstance() .getModelManager() .getBlockModelShaper() @@ -362,11 +377,30 @@ public void renderDynamic( poseStack.pushPose(); poseStack.translate(0.5, 0.5, 0.5); - var orientation = BlockOrientation.get(getSide()); + var front = getSide() == Direction.UP || getSide() == Direction.DOWN ? Direction.NORTH : Direction.UP; + var orientation = BlockOrientation.get(front, getSide()); + poseStack.mulPose(orientation.getQuaternion()); - poseStack.translate(-0.5, -0.5, -0.5); + poseStack.translate(-3.0 / 16, 5.0 / 16, -5.0 / 16); try { + var cellBuffer = buffers.getBuffer(RenderType.cutout()); + var cell = CELL_MODEL.invoke(cellModel, orientation); + Minecraft.getInstance() + .getBlockRenderer() + .getModelRenderer() + .tesselateBlock( + getLevel(), + (BakedModel) cell, + getBlockEntity().getBlockState(), + getBlockEntity().getBlockPos(), + poseStack, + cellBuffer, + false, + RandomSource.create(), + 0L, + combinedOverlayIn); + var ledBuffer = buffers.getBuffer((RenderType) LED_RENDER_TYPE.get()); LED_RENDER.invoke(this, 0, ledBuffer, poseStack, partialTicks); } catch (Throwable e) {