package openblocks.client.renderer.tileentity.tank; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Set; import net.minecraftforge.fluids.FluidStack; import openblocks.common.tileentity.TileEntityTank; import openmods.utils.Diagonal; public class DiagonalConnection extends RenderConnection { private static class Group { private final FluidStack fluid; private final Set<Diagonal> diagonals = EnumSet.noneOf(Diagonal.class); private float sum; public Group(FluidStack fluid) { this.fluid = fluid; } public boolean match(FluidStack stack) { return fluid.isFluidEqual(stack); } public void addDiagonal(Diagonal diagonal, FluidStack stack) { diagonals.add(diagonal); sum += stack.amount; } public void update(float[] height) { final float average = TankRenderUtils.clampLevel((sum / diagonals.size()) / TileEntityTank.getTankCapacity()); for (Diagonal d : diagonals) height[d.ordinal()] = average; } } private final float phase; private final Map<Diagonal, FluidStack> fluids = Maps.newEnumMap(Diagonal.class); private final float[] height = new float[4]; public DiagonalConnection(float phase, DoubledCoords coords) { super(coords); this.phase = phase; } public float getRenderHeight(Diagonal corner, float time) { float h = height[corner.ordinal()]; if (h <= 0) return 0; return TankRenderUtils.clampLevel(TankRenderUtils.calculateWaveAmplitude(time, phase) + h); } public void updateFluid(Diagonal corner, FluidStack stack) { fluids.put(corner, TankRenderUtils.safeCopy(stack)); recalculate(); } public void clearFluid(Diagonal corner) { fluids.remove(corner); recalculate(); } private static DiagonalConnection.Group findGroup(List<DiagonalConnection.Group> entries, FluidStack stack) { for (DiagonalConnection.Group group : entries) if (group.match(stack)) return group; DiagonalConnection.Group newGroup = new Group(stack); entries.add(newGroup); return newGroup; } private void recalculate() { forceZero(); List<DiagonalConnection.Group> groups = Lists.newArrayList(); for (Diagonal diagonal : Diagonal.VALUES) { if (!fluids.containsKey(diagonal)) continue; FluidStack stack = fluids.get(diagonal); if (stack == null || stack.amount <= 0) return; DiagonalConnection.Group e = findGroup(groups, stack); e.addDiagonal(diagonal, stack); } for (DiagonalConnection.Group group : groups) group.update(height); } private void forceZero() { height[0] = height[1] = height[2] = height[3] = 0; } }