mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-02-05 01:45:00 +01:00
Basic instancing for the mirror
This commit is contained in:
parent
869d68ac27
commit
0bc2d1f684
7 changed files with 89 additions and 12 deletions
|
@ -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.NixieTubeTileEntity;
|
||||||
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity;
|
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity;
|
||||||
import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity;
|
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.MirrorRenderer;
|
||||||
import com.simibubi.create.content.optics.mirror.MirrorTileEntity;
|
import com.simibubi.create.content.optics.mirror.MirrorTileEntity;
|
||||||
import com.simibubi.create.content.schematics.block.SchematicTableTileEntity;
|
import com.simibubi.create.content.schematics.block.SchematicTableTileEntity;
|
||||||
|
@ -587,7 +588,7 @@ public class AllTileEntities {
|
||||||
// Optics
|
// Optics
|
||||||
public static final TileEntityEntry<MirrorTileEntity> MIRROR = Create.registrate()
|
public static final TileEntityEntry<MirrorTileEntity> MIRROR = Create.registrate()
|
||||||
.tileEntity("mirror", MirrorTileEntity::new)
|
.tileEntity("mirror", MirrorTileEntity::new)
|
||||||
// .instance(() -> MirrorRendererInstance::new)
|
.instance(() -> MirrorInstance::new)
|
||||||
.validBlocks(AllBlocks.MIRROR)
|
.validBlocks(AllBlocks.MIRROR)
|
||||||
.renderer(() -> MirrorRenderer::new)
|
.renderer(() -> MirrorRenderer::new)
|
||||||
.register();
|
.register();
|
||||||
|
|
|
@ -5,6 +5,8 @@ import com.simibubi.create.content.optics.ILightHandler;
|
||||||
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
|
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
|
||||||
|
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
|
import net.minecraft.state.properties.BlockStateProperties;
|
||||||
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
|
||||||
public abstract class AbstractRotatedLightRelayBehaviour<T extends KineticTileEntity & ILightHandler.ILightHandlerProvider & RotationMode.RotationModeProvider> extends AbstractLightRelayBehaviour<T> {
|
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) {
|
if (angle != prevAngle) {
|
||||||
updateBeams();
|
onAngleChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void onAngleChanged() {
|
||||||
|
updateBeams();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Direction.Axis getAxis() {
|
||||||
|
return tileEntity.getBlockState()
|
||||||
|
.get(BlockStateProperties.AXIS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,20 +3,30 @@ package com.simibubi.create.content.optics.mirror;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import com.simibubi.create.content.optics.Beam;
|
import com.simibubi.create.content.optics.Beam;
|
||||||
import com.simibubi.create.content.optics.behaviour.AbstractRotatedLightRelayBehaviour;
|
import com.simibubi.create.content.optics.behaviour.AbstractRotatedLightRelayBehaviour;
|
||||||
import com.simibubi.create.foundation.collision.Matrix3d;
|
import com.simibubi.create.foundation.collision.Matrix3d;
|
||||||
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
|
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
|
||||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||||
|
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||||
import com.simibubi.create.foundation.utility.VecHelper;
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
|
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
|
import net.minecraft.util.math.vector.Quaternion;
|
||||||
import net.minecraft.util.math.vector.Vector3d;
|
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 class MirrorBehaviour extends AbstractRotatedLightRelayBehaviour<MirrorTileEntity> {
|
||||||
public static final BehaviourType<MirrorBehaviour> TYPE = new BehaviourType<>();
|
public static final BehaviourType<MirrorBehaviour> TYPE = new BehaviourType<>();
|
||||||
|
|
||||||
|
@OnlyIn(Dist.CLIENT)
|
||||||
|
@Nullable
|
||||||
|
Quaternion bufferedRotationQuaternion = null;
|
||||||
|
|
||||||
public MirrorBehaviour(MirrorTileEntity te) {
|
public MirrorBehaviour(MirrorTileEntity te) {
|
||||||
super(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
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public Direction getBeamRotationAround() {
|
public Direction getBeamRotationAround() {
|
||||||
return Direction.getFacingFromAxisDirection(handler.getAxis(), Direction.AxisDirection.POSITIVE);
|
return Direction.getFacingFromAxisDirection(getAxis(), Direction.AxisDirection.POSITIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,4 +76,10 @@ public class MirrorBehaviour extends AbstractRotatedLightRelayBehaviour<MirrorTi
|
||||||
|
|
||||||
return Stream.of(constructOutBeam(beam, getReflectionAngle(inDir).normalize()));
|
return Stream.of(constructOutBeam(beam, getReflectionAngle(inDir).normalize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onAngleChanged() {
|
||||||
|
super.onAngleChanged();
|
||||||
|
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> bufferedRotationQuaternion = null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@ package com.simibubi.create.content.optics.mirror;
|
||||||
import javax.annotation.ParametersAreNonnullByDefault;
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
|
|
||||||
import com.simibubi.create.AllTileEntities;
|
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.relays.encased.AbstractEncasedShaftBlock;
|
||||||
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
|
|
||||||
import com.simibubi.create.foundation.block.ITE;
|
import com.simibubi.create.foundation.block.ITE;
|
||||||
|
|
||||||
import mcp.MethodsReturnNonnullByDefault;
|
import mcp.MethodsReturnNonnullByDefault;
|
||||||
|
@ -14,7 +14,7 @@ import net.minecraft.world.IBlockReader;
|
||||||
|
|
||||||
@MethodsReturnNonnullByDefault
|
@MethodsReturnNonnullByDefault
|
||||||
@ParametersAreNonnullByDefault
|
@ParametersAreNonnullByDefault
|
||||||
public class MirrorBlock extends AbstractEncasedShaftBlock implements IWrenchable, ITE<MirrorTileEntity> {
|
public class MirrorBlock extends AbstractEncasedShaftBlock implements IRotate, ITE<MirrorTileEntity> {
|
||||||
public MirrorBlock(Properties properties) {
|
public MirrorBlock(Properties properties) {
|
||||||
super(properties);
|
super(properties);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import com.simibubi.create.AllBlockPartials;
|
||||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||||
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
|
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
|
||||||
import com.simibubi.create.foundation.render.SuperByteBuffer;
|
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.IRenderTypeBuffer;
|
||||||
import net.minecraft.client.renderer.RenderType;
|
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,
|
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||||
int light, int overlay) {
|
int light, int overlay) {
|
||||||
|
|
||||||
// if (FastRenderDispatcher.available(te.getWorld())) return;
|
if (!FastRenderDispatcher.available(te.getWorld()))
|
||||||
MirrorTileEntity mirrorTe = (MirrorTileEntity) te;
|
renderMirror((MirrorTileEntity) te, partialTicks, ms, buffer, light);
|
||||||
|
|
||||||
renderMirror(mirrorTe, partialTicks, ms, buffer, light);
|
|
||||||
((MirrorTileEntity) te).getHandler()
|
((MirrorTileEntity) te).getHandler()
|
||||||
.getRenderBeams()
|
.getRenderBeams()
|
||||||
.forEachRemaining(beam -> beam.render(ms, buffer, partialTicks));
|
.forEachRemaining(beam -> beam.render(ms, buffer, partialTicks));
|
||||||
|
|
|
@ -4,7 +4,6 @@ import java.util.List;
|
||||||
|
|
||||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||||
import com.simibubi.create.content.optics.ILightHandler;
|
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.content.optics.behaviour.RotationMode;
|
||||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||||
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
|
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
|
||||||
|
@ -41,7 +40,7 @@ public class MirrorTileEntity extends KineticTileEntity implements ILightHandler
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldRenderAsTE() {
|
public boolean shouldRenderAsTE() {
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -61,7 +60,7 @@ public class MirrorTileEntity extends KineticTileEntity implements ILightHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AbstractRotatedLightRelayBehaviour<MirrorTileEntity> getHandler() {
|
public MirrorBehaviour getHandler() {
|
||||||
return mirror;
|
return mirror;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue