CreateMod/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java
simibubi 9c0c058fc0 SeamsBad
- Pushed surfaces around by fractions of a pixel to cover up misaligned geometry from mc's model rendering
2023-05-15 01:12:38 +02:00

103 lines
3.5 KiB
Java

package com.simibubi.create.content.logistics.block.belts.tunnel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.Map;
import com.jozufozu.flywheel.api.InstanceData;
import com.jozufozu.flywheel.api.Instancer;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.logistics.block.flap.FlapData;
import com.simibubi.create.foundation.render.AllMaterialSpecs;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import net.minecraft.core.Direction;
import net.minecraft.world.level.LightLayer;
public class BeltTunnelInstance extends BlockEntityInstance<BeltTunnelBlockEntity> implements DynamicInstance {
private final Map<Direction, ArrayList<FlapData>> tunnelFlaps;
public BeltTunnelInstance(MaterialManager materialManager, BeltTunnelBlockEntity blockEntity) {
super(materialManager, blockEntity);
tunnelFlaps = new EnumMap<>(Direction.class);
Instancer<FlapData> model = materialManager.defaultSolid()
.material(AllMaterialSpecs.FLAPS)
.getModel(AllPartialModels.BELT_TUNNEL_FLAP, blockState);
int blockLight = world.getBrightness(LightLayer.BLOCK, pos);
int skyLight = world.getBrightness(LightLayer.SKY, pos);
blockEntity.flaps.forEach((direction, flapValue) -> {
float flapness = flapValue.getValue(AnimationTickHolder.getPartialTicks());
float horizontalAngle = direction.getOpposite().toYRot();
float flapScale = direction.getAxis() == Direction.Axis.X ? 1 : -1;
ArrayList<FlapData> flaps = new ArrayList<>(4);
for (int segment = 0; segment <= 3; segment++) {
float intensity = segment == 3 ? 1.5f : segment + 1;
float segmentOffset = -3.05f / 16f * segment + 0.075f / 16f;
FlapData key = model.createInstance();
key.setPosition(getInstancePosition())
.setSegmentOffset(segmentOffset, 0, 0)
.setBlockLight(blockLight)
.setSkyLight(skyLight)
.setHorizontalAngle(horizontalAngle)
.setFlapness(flapness)
.setFlapScale(flapScale)
.setPivotVoxelSpace(0, 10, 1)
.setIntensity(intensity);
flaps.add(key);
}
tunnelFlaps.put(direction, flaps);
});
}
@Override
public boolean shouldReset() {
return super.shouldReset() || tunnelFlaps.size() != blockEntity.flaps.size();
}
@Override
public void beginFrame() {
tunnelFlaps.forEach((direction, keys) -> {
LerpedFloat lerpedFloat = blockEntity.flaps.get(direction);
if (lerpedFloat == null)
return;
float flapness = lerpedFloat.getValue(AnimationTickHolder.getPartialTicks());
for (FlapData flap : keys) {
flap.setFlapness(flapness);
}
});
}
@Override
public void updateLight() {
relight(pos, tunnelFlaps.values().stream().flatMap(Collection::stream));
}
@Override
public void remove() {
tunnelFlaps.values()
.stream()
.flatMap(Collection::stream)
.forEach(InstanceData::delete);
}
}