Basic instancing for the mirror

This commit is contained in:
grimmauld 2021-04-21 11:55:03 +02:00
parent 869d68ac27
commit 0bc2d1f684
7 changed files with 89 additions and 12 deletions

View file

@ -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<MirrorTileEntity> MIRROR = Create.registrate()
.tileEntity("mirror", MirrorTileEntity::new)
// .instance(() -> MirrorRendererInstance::new)
.instance(() -> MirrorInstance::new)
.validBlocks(AllBlocks.MIRROR)
.renderer(() -> MirrorRenderer::new)
.register();

View file

@ -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<T extends KineticTileEntity & ILightHandler.ILightHandlerProvider & RotationMode.RotationModeProvider> extends AbstractLightRelayBehaviour<T> {
@ -66,7 +68,16 @@ public abstract class AbstractRotatedLightRelayBehaviour<T extends KineticTileEn
if (angle != prevAngle) {
updateBeams();
onAngleChanged();
}
}
protected void onAngleChanged() {
updateBeams();
}
protected Direction.Axis getAxis() {
return tileEntity.getBlockState()
.get(BlockStateProperties.AXIS);
}
}

View file

@ -3,20 +3,30 @@ package com.simibubi.create.content.optics.mirror;
import java.util.stream.Stream;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.simibubi.create.content.optics.Beam;
import com.simibubi.create.content.optics.behaviour.AbstractRotatedLightRelayBehaviour;
import com.simibubi.create.foundation.collision.Matrix3d;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.util.Direction;
import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
public class MirrorBehaviour extends AbstractRotatedLightRelayBehaviour<MirrorTileEntity> {
public static final BehaviourType<MirrorBehaviour> 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<MirrorTi
}
@OnlyIn(Dist.CLIENT)
@Nonnull
public Quaternion getBufferedRotationQuaternion() {
if (bufferedRotationQuaternion == null)
bufferedRotationQuaternion = getBeamRotationAround().getUnitVector()
.getDegreesQuaternion(getInterpolatedAngle(AnimationTickHolder.getPartialTicks() - 1));
return bufferedRotationQuaternion;
}
@Nonnull
@Override
public Direction getBeamRotationAround() {
return Direction.getFacingFromAxisDirection(handler.getAxis(), Direction.AxisDirection.POSITIVE);
return Direction.getFacingFromAxisDirection(getAxis(), Direction.AxisDirection.POSITIVE);
}
@Override
@ -57,4 +76,10 @@ public class MirrorBehaviour extends AbstractRotatedLightRelayBehaviour<MirrorTi
return Stream.of(constructOutBeam(beam, getReflectionAngle(inDir).normalize()));
}
@Override
protected void onAngleChanged() {
super.onAngleChanged();
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> bufferedRotationQuaternion = null);
}
}

View file

@ -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<MirrorTileEntity> {
public class MirrorBlock extends AbstractEncasedShaftBlock implements IRotate, ITE<MirrorTileEntity> {
public MirrorBlock(Properties properties) {
super(properties);
}

View file

@ -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<MirrorTileEntity> 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();
}
}

View file

@ -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));

View file

@ -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<MirrorTileEntity> getHandler() {
public MirrorBehaviour getHandler() {
return mirror;
}