From ef94e7c302087c67d80fe06d2b1b136afbde45e4 Mon Sep 17 00:00:00 2001 From: 2No2Name <2No2Name@web.de> Date: Thu, 19 Sep 2019 01:07:43 +0200 Subject: [PATCH] Updated MovableBlockEntity Rendering Code --- .../BlockEntityRenderDispatcherInterface.java | 6 +- ...EntityRenderDispatcher_movableTEMixin.java | 61 ++++++++++++------- ...tonBlockEntityRenderer_movableTEMixin.java | 18 +++--- 3 files changed, 54 insertions(+), 31 deletions(-) diff --git a/src/main/java/carpet/fakes/BlockEntityRenderDispatcherInterface.java b/src/main/java/carpet/fakes/BlockEntityRenderDispatcherInterface.java index 98605d63..48f3c8a8 100644 --- a/src/main/java/carpet/fakes/BlockEntityRenderDispatcherInterface.java +++ b/src/main/java/carpet/fakes/BlockEntityRenderDispatcherInterface.java @@ -1,8 +1,12 @@ package carpet.fakes; +import net.minecraft.block.BlockRenderLayer; import net.minecraft.block.entity.BlockEntity; +import net.minecraft.client.render.BufferBuilder; public interface BlockEntityRenderDispatcherInterface { - void renderBlockEntityOffset(BlockEntity blockEntity, float partialTicks, int destroyStage, double xOffset, double yOffset, double zOffset); + void renderBlockEntityOffset(BlockEntity blockEntity_1, float partialTicks, int destroyStage, BlockRenderLayer blockRenderLayer_1, BufferBuilder bufferBuilder_1, + double xOffset, double yOffset, double zOffset); + } diff --git a/src/main/java/carpet/mixins/BlockEntityRenderDispatcher_movableTEMixin.java b/src/main/java/carpet/mixins/BlockEntityRenderDispatcher_movableTEMixin.java index 9da5718e..0056eeb4 100644 --- a/src/main/java/carpet/mixins/BlockEntityRenderDispatcher_movableTEMixin.java +++ b/src/main/java/carpet/mixins/BlockEntityRenderDispatcher_movableTEMixin.java @@ -1,14 +1,18 @@ package carpet.mixins; import carpet.fakes.BlockEntityRenderDispatcherInterface; -import com.mojang.blaze3d.systems.RenderSystem; +import com.sun.istack.internal.Nullable; +import net.minecraft.block.BlockRenderLayer; import net.minecraft.block.entity.BlockEntity; +import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GuiLighting; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.util.crash.CrashException; +import net.minecraft.util.crash.CrashReport; +import net.minecraft.util.crash.CrashReportSection; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import org.lwjgl.opengl.GL20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -26,28 +30,43 @@ public abstract class BlockEntityRenderDispatcher_movableTEMixin implements Bloc @Shadow public World world; - //@Shadow - //public abstract void renderEntity(BlockEntity blockEntity_1, double double_1, double double_2, double double_3, - // float float_1, int int_1, boolean boolean_1); + //@Shadow //Shadow doesn't work due to private+static+mixins requires abstract, therefore copied the whole method. //Todo fix this + private static void renderEntity(BlockEntity blockEntity_1, Runnable runnable_1){ + try { + runnable_1.run(); + } catch (Throwable var5) { + CrashReport crashReport_1 = CrashReport.create(var5, "Rendering Block Entity"); + CrashReportSection crashReportSection_1 = crashReport_1.addElement("Block Entity Details"); + blockEntity_1.populateCrashReport(crashReportSection_1); + throw new CrashException(crashReport_1); + } + } + @Shadow + public abstract BlockEntityRenderer get(@Nullable BlockEntity blockEntity_1); /** * @author 2No2Name */ //Renders the BlockEntity offset by the amount specified in the arguments xOffset yOffset zOffset (the moving block moved in the animation by this) - public void renderBlockEntityOffset(BlockEntity blockEntity_1, float partialTicks, int destroyStage, double xOffset, - double yOffset, double zOffset) - { - /*if (blockEntity_1.getSquaredDistance(this.cameraEntity.getPos().x - xOffset, this.cameraEntity.getPos().y - yOffset, - this.cameraEntity.getPos().z - zOffset) < blockEntity_1.getSquaredRenderDistance()) - { - GuiLighting.enable(); - int i = this.world.getLightmapIndex(blockEntity_1.getPos()); - int j = i % 65536; - int k = i / 65536; - RenderSystem.glMultiTexCoord2f(GL20.GL_TEXTURE1, (float) j, (float) k); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - BlockPos blockpos = blockEntity_1.getPos(); - this.renderEntity(blockEntity_1, (double) blockpos.getX() - renderOffsetX + xOffset, (double) blockpos.getY() - renderOffsetY + yOffset, (double) blockpos.getZ() - renderOffsetZ + zOffset, partialTicks, destroyStage, false); - }*/ + //Code copied and modified from BlockEntityRenderDispatcher::render(BlockEntity blockEntity_1, float float_1, int int_1, BlockRenderLayer blockRenderLayer_1, BufferBuilder bufferBuilder_1) + public void renderBlockEntityOffset(BlockEntity blockEntity_1, float partialTicks, int destroyStage, BlockRenderLayer blockRenderLayer_1, BufferBuilder bufferBuilder_1, double xOffset, + double yOffset, double zOffset){ + if (blockEntity_1.getSquaredDistance(this.cameraEntity.getPos().x - xOffset, this.cameraEntity.getPos().y - yOffset, this.cameraEntity.getPos().z - zOffset) < blockEntity_1.getSquaredRenderDistance()) { + BlockEntityRenderer blockEntityRenderer_1 = this.get(blockEntity_1); + if (blockEntityRenderer_1 != null) { + if (blockEntity_1.hasWorld() && blockEntity_1.getType().supports(blockEntity_1.getCachedState().getBlock())) { + BlockPos blockPos_1 = blockEntity_1.getPos(); + renderEntity(blockEntity_1, () -> + { + bufferBuilder_1.method_22629(); //add layer to stack + bufferBuilder_1.method_22626(xOffset,yOffset,zOffset); //add offset for the Blockentity + blockEntityRenderer_1.method_22747(blockEntity_1, (double)blockPos_1.getX() - renderOffsetX, (double)blockPos_1.getY() - renderOffsetY, (double)blockPos_1.getZ() - renderOffsetZ, partialTicks, destroyStage, bufferBuilder_1, blockRenderLayer_1, blockPos_1); + //bufferBuilder_1.method_22626(-xOffset,-yOffset,-zOffset); //remove offset + bufferBuilder_1.method_22630(); //remove layer from stack + } + ); + } + } + } } } diff --git a/src/main/java/carpet/mixins/PistonBlockEntityRenderer_movableTEMixin.java b/src/main/java/carpet/mixins/PistonBlockEntityRenderer_movableTEMixin.java index 30ebfc56..c9473883 100644 --- a/src/main/java/carpet/mixins/PistonBlockEntityRenderer_movableTEMixin.java +++ b/src/main/java/carpet/mixins/PistonBlockEntityRenderer_movableTEMixin.java @@ -3,8 +3,10 @@ package carpet.mixins; import carpet.settings.CarpetSettings; import carpet.fakes.BlockEntityRenderDispatcherInterface; import carpet.fakes.PistonBlockEntityInterface; +import net.minecraft.block.BlockRenderLayer; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.PistonBlockEntity; +import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.PistonBlockEntityRenderer; @@ -12,23 +14,22 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(PistonBlockEntityRenderer.class) public abstract class PistonBlockEntityRenderer_movableTEMixin extends BlockEntityRenderer { - /* @Inject(method = "method_3576", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/PistonBlockEntityRenderer;method_3575(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/client/render/BufferBuilder;Lnet/minecraft/world/World;Z)Z", ordinal = 3)) - private void updateRenderBool(PistonBlockEntity pistonBlockEntity_1, double double_1, double double_2, - double double_3, float float_1, int int_1, CallbackInfo ci) + private void updateRenderBool(PistonBlockEntity pistonBlockEntity_1, double double_1, double double_2, double double_3, float float_1, int int_1, BlockRenderLayer blockRenderLayer_1, BufferBuilder bufferBuilder_1, int int_2, int int_3, CallbackInfo ci) { if (!((PistonBlockEntityInterface) pistonBlockEntity_1).isRenderModeSet()) ((PistonBlockEntityInterface) pistonBlockEntity_1).setRenderCarriedBlockEntity(CarpetSettings.movableBlockEntities && ((PistonBlockEntityInterface) pistonBlockEntity_1).getCarriedBlockEntity() != null); } - - @Inject(method = "method_3576", at = @At("RETURN")) - private void endMethod3576(PistonBlockEntity pistonBlockEntity_1, double double_1, double double_2, double double_3, - float float_1, int int_1, CallbackInfo ci) + + + @Inject(method = "method_3576", at = @At("RETURN"), locals = LocalCapture.NO_CAPTURE) + private void endMethod3576(PistonBlockEntity pistonBlockEntity_1, double double_1, double double_2, double double_3, float float_1, int int_1, BlockRenderLayer blockRenderLayer_1, BufferBuilder bufferBuilder_1, int int_2, int int_3, CallbackInfo ci) { if (((PistonBlockEntityInterface) pistonBlockEntity_1).getRenderCarriedBlockEntity()) { @@ -36,9 +37,8 @@ public abstract class PistonBlockEntityRenderer_movableTEMixin extends BlockEnti if (carriedBlockEntity != null) { carriedBlockEntity.setPos(pistonBlockEntity_1.getPos()); - ((BlockEntityRenderDispatcherInterface) BlockEntityRenderDispatcher.INSTANCE).renderBlockEntityOffset(carriedBlockEntity, float_1, int_1, pistonBlockEntity_1.getRenderOffsetX(float_1), pistonBlockEntity_1.getRenderOffsetY(float_1), pistonBlockEntity_1.getRenderOffsetZ(float_1)); + ((BlockEntityRenderDispatcherInterface) BlockEntityRenderDispatcher.INSTANCE).renderBlockEntityOffset(carriedBlockEntity, float_1, int_1, BlockRenderLayer.field_20799, bufferBuilder_1, pistonBlockEntity_1.getRenderOffsetX(float_1), pistonBlockEntity_1.getRenderOffsetY(float_1), pistonBlockEntity_1.getRenderOffsetZ(float_1)); } } } - */ }