From 0bc2d1f68495020c1f51dba5733e507beda047a8 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Wed, 21 Apr 2021 11:55:03 +0200 Subject: [PATCH] Basic instancing for the mirror --- .../com/simibubi/create/AllTileEntities.java | 3 +- .../AbstractRotatedLightRelayBehaviour.java | 13 +++++- .../optics/mirror/MirrorBehaviour.java | 27 +++++++++++- .../content/optics/mirror/MirrorBlock.java | 4 +- .../content/optics/mirror/MirrorInstance.java | 42 +++++++++++++++++++ .../content/optics/mirror/MirrorRenderer.java | 7 ++-- .../optics/mirror/MirrorTileEntity.java | 5 +-- 7 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/optics/mirror/MirrorInstance.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index c51b7fc6d..51996b25a 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -149,6 +149,7 @@ import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity; +import com.simibubi.create.content.optics.mirror.MirrorInstance; import com.simibubi.create.content.optics.mirror.MirrorRenderer; import com.simibubi.create.content.optics.mirror.MirrorTileEntity; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; @@ -587,7 +588,7 @@ public class AllTileEntities { // Optics public static final TileEntityEntry MIRROR = Create.registrate() .tileEntity("mirror", MirrorTileEntity::new) - // .instance(() -> MirrorRendererInstance::new) + .instance(() -> MirrorInstance::new) .validBlocks(AllBlocks.MIRROR) .renderer(() -> MirrorRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractRotatedLightRelayBehaviour.java b/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractRotatedLightRelayBehaviour.java index 4be66c431..d78860c57 100644 --- a/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractRotatedLightRelayBehaviour.java +++ b/src/main/java/com/simibubi/create/content/optics/behaviour/AbstractRotatedLightRelayBehaviour.java @@ -5,6 +5,8 @@ import com.simibubi.create.content.optics.ILightHandler; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; import net.minecraft.util.math.MathHelper; public abstract class AbstractRotatedLightRelayBehaviour extends AbstractLightRelayBehaviour { @@ -66,7 +68,16 @@ public abstract class AbstractRotatedLightRelayBehaviour { public static final BehaviourType TYPE = new BehaviourType<>(); + @OnlyIn(Dist.CLIENT) + @Nullable + Quaternion bufferedRotationQuaternion = null; + public MirrorBehaviour(MirrorTileEntity te) { super(te); } @@ -38,10 +48,19 @@ public class MirrorBehaviour extends AbstractRotatedLightRelayBehaviour () -> bufferedRotationQuaternion = null); + } } diff --git a/src/main/java/com/simibubi/create/content/optics/mirror/MirrorBlock.java b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorBlock.java index b98065fec..142e3e46e 100644 --- a/src/main/java/com/simibubi/create/content/optics/mirror/MirrorBlock.java +++ b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorBlock.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.optics.mirror; import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.relays.encased.AbstractEncasedShaftBlock; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; import mcp.MethodsReturnNonnullByDefault; @@ -14,7 +14,7 @@ import net.minecraft.world.IBlockReader; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MirrorBlock extends AbstractEncasedShaftBlock implements IWrenchable, ITE { +public class MirrorBlock extends AbstractEncasedShaftBlock implements IRotate, ITE { public MirrorBlock(Properties properties) { super(properties); } diff --git a/src/main/java/com/simibubi/create/content/optics/mirror/MirrorInstance.java b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorInstance.java new file mode 100644 index 000000000..6ba551b7a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorInstance.java @@ -0,0 +1,42 @@ +package com.simibubi.create.content.optics.mirror; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileInstance; +import com.simibubi.create.foundation.render.backend.core.OrientedData; +import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.vector.Vector3f; + +public class MirrorInstance extends KineticTileInstance implements IDynamicInstance { + final Vector3f rotationAxis; + final OrientedData instance; + + public MirrorInstance(InstancedTileRenderer modelManager, MirrorTileEntity tile) { + super(modelManager, tile); + + rotationAxis = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis) + .getUnitVector(); + instance = getOrientedMaterial().getModel(AllBlockPartials.MIRROR_PLANE, tile.getBlockState()) + .createInstance(); + instance.setPosition(getInstancePosition()); + } + + @Override + public void beginFrame() { + instance.setRotation(tile.getHandler() + .getBufferedRotationQuaternion()); + } + + @Override + public void updateLight() { + super.updateLight(); + relight(pos, instance); + } + + @Override + public void remove() { + instance.delete(); + } +} diff --git a/src/main/java/com/simibubi/create/content/optics/mirror/MirrorRenderer.java b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorRenderer.java index 9259ada05..115e85a22 100644 --- a/src/main/java/com/simibubi/create/content/optics/mirror/MirrorRenderer.java +++ b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorRenderer.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -24,10 +25,8 @@ public class MirrorRenderer extends KineticTileEntityRenderer { protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - // if (FastRenderDispatcher.available(te.getWorld())) return; - MirrorTileEntity mirrorTe = (MirrorTileEntity) te; - - renderMirror(mirrorTe, partialTicks, ms, buffer, light); + if (!FastRenderDispatcher.available(te.getWorld())) + renderMirror((MirrorTileEntity) te, partialTicks, ms, buffer, light); ((MirrorTileEntity) te).getHandler() .getRenderBeams() .forEachRemaining(beam -> beam.render(ms, buffer, partialTicks)); diff --git a/src/main/java/com/simibubi/create/content/optics/mirror/MirrorTileEntity.java b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorTileEntity.java index f76205e0f..9625659ef 100644 --- a/src/main/java/com/simibubi/create/content/optics/mirror/MirrorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/optics/mirror/MirrorTileEntity.java @@ -4,7 +4,6 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.optics.ILightHandler; -import com.simibubi.create.content.optics.behaviour.AbstractRotatedLightRelayBehaviour; import com.simibubi.create.content.optics.behaviour.RotationMode; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; @@ -41,7 +40,7 @@ public class MirrorTileEntity extends KineticTileEntity implements ILightHandler @Override public boolean shouldRenderAsTE() { - return true; + return false; } @Override @@ -61,7 +60,7 @@ public class MirrorTileEntity extends KineticTileEntity implements ILightHandler } @Override - public AbstractRotatedLightRelayBehaviour getHandler() { + public MirrorBehaviour getHandler() { return mirror; }