Instanced Ejectors and better hashing for BehaviourTypes.

This commit is contained in:
JozsefA 2021-03-25 21:27:08 -07:00
parent 718142e26f
commit 1d2b51250c
4 changed files with 81 additions and 12 deletions

View file

@ -122,10 +122,7 @@ import com.simibubi.create.content.logistics.block.chute.ChuteRenderer;
import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity;
import com.simibubi.create.content.logistics.block.chute.SmartChuteRenderer;
import com.simibubi.create.content.logistics.block.chute.SmartChuteTileEntity;
import com.simibubi.create.content.logistics.block.depot.DepotRenderer;
import com.simibubi.create.content.logistics.block.depot.DepotTileEntity;
import com.simibubi.create.content.logistics.block.depot.EjectorRenderer;
import com.simibubi.create.content.logistics.block.depot.EjectorTileEntity;
import com.simibubi.create.content.logistics.block.depot.*;
import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterInstance;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer;
@ -617,7 +614,7 @@ public class AllTileEntities {
public static final TileEntityEntry<EjectorTileEntity> WEIGHTED_EJECTOR = Create.registrate()
.tileEntity("weighted_ejector", EjectorTileEntity::new)
.instance(() -> ShaftInstance::new)
.instance(() -> EjectorInstance::new)
.validBlocks(AllBlocks.WEIGHTED_EJECTOR)
.renderer(() -> EjectorRenderer::new)
.register();

View file

@ -0,0 +1,60 @@
package com.simibubi.create.content.logistics.block.depot;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
public class EjectorInstance extends ShaftInstance implements IDynamicInstance {
protected final EjectorTileEntity tile;
protected final InstanceKey<ModelData> plate;
public EjectorInstance(InstancedTileRenderer<?> dispatcher, EjectorTileEntity tile) {
super(dispatcher, tile);
this.tile = tile;
plate = getTransformMaterial().getModel(AllBlockPartials.EJECTOR_TOP, blockState).createInstance();
pivotPlate();
updateLight();
}
@Override
public void beginFrame() {
if (tile.lidProgress.settled()) return;
pivotPlate();
}
private void pivotPlate() {
float lidProgress = tile.getLidProgress(AnimationTickHolder.getPartialTicks());
float angle = lidProgress * 70;
MatrixStack ms = new MatrixStack();
EjectorRenderer.applyLidAngle(tile, angle, MatrixStacker.of(ms).translate(getInstancePosition()));
plate.getInstance().setTransform(ms);
}
@Override
public void updateLight() {
super.updateLight();
relight(pos, plate.getInstance());
}
@Override
public void remove() {
super.remove();
plate.delete();
}
}

View file

@ -6,6 +6,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 com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.IntAttached;
import com.simibubi.create.foundation.utility.MatrixStacker;
@ -22,6 +23,8 @@ import net.minecraft.util.math.Vec3d;
public class EjectorRenderer extends KineticTileEntityRenderer {
static final Vec3d pivot = VecHelper.voxelSpace(0, 11.25, 0.75);
public EjectorRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@ -37,15 +40,16 @@ public class EjectorRenderer extends KineticTileEntityRenderer {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
EjectorTileEntity ejector = (EjectorTileEntity) te;
SuperByteBuffer model = AllBlockPartials.EJECTOR_TOP.renderOn(te.getBlockState());
IVertexBuilder vertexBuilder = buffer.getBuffer(RenderType.getSolid());
Vec3d rotationOffset = VecHelper.voxelSpace(0, 11.25, 0.75);
float lidProgress = ((EjectorTileEntity) te).getLidProgress(partialTicks);
float angle = lidProgress * 70;
applyLidAngle(te, rotationOffset, angle, model.matrixStacker());
if (!FastRenderDispatcher.available(te.getWorld())) {
SuperByteBuffer model = AllBlockPartials.EJECTOR_TOP.renderOn(te.getBlockState());
applyLidAngle(te, angle, model.matrixStacker());
model.light(light)
.renderInto(ms, vertexBuilder);
}
MatrixStacker msr = MatrixStacker.of(ms);
@ -70,7 +74,7 @@ public class EjectorRenderer extends KineticTileEntityRenderer {
return;
ms.push();
applyLidAngle(te, rotationOffset, angle, msr);
applyLidAngle(te, angle, msr);
msr.centre()
.rotateY(-180 - AngleHelper.horizontalAngle(te.getBlockState()
.get(EjectorBlock.HORIZONTAL_FACING)))
@ -79,7 +83,11 @@ public class EjectorRenderer extends KineticTileEntityRenderer {
ms.pop();
}
protected void applyLidAngle(KineticTileEntity te, Vec3d rotationOffset, float angle, MatrixStacker matrixStacker) {
static void applyLidAngle(KineticTileEntity te, float angle, MatrixStacker matrixStacker) {
applyLidAngle(te, pivot, angle, matrixStacker);
}
static void applyLidAngle(KineticTileEntity te, Vec3d rotationOffset, float angle, MatrixStacker matrixStacker) {
matrixStacker.centre()
.rotateY(180 + AngleHelper.horizontalAngle(te.getBlockState()
.get(EjectorBlock.HORIZONTAL_FACING)))

View file

@ -18,4 +18,8 @@ public class BehaviourType<T extends TileEntityBehaviour> {
return name;
}
@Override
public int hashCode() {
return super.hashCode() * 31 * 493286711; // Better hash table distribution
}
}