diff --git a/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java b/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java index da655a07bf..1e739ca4ed 100644 --- a/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java +++ b/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java @@ -87,7 +87,7 @@ public void tick() { public void render(VertexConsumer vb, Camera info, float pt) { Quaternionf rotation = info.rotation(); Quaternionf prevRotation = new Quaternionf(rotation); - rotation.set(1, 0, 0, 1); + rotation.set(-1, 0, 0, 1); rotation.normalize(); super.render(vb, info, pt); rotation.set(0, 0, 0, 1); diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java index fe5a77e245..3ea3fb992a 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java @@ -491,6 +491,23 @@ public float getTotalFluidUnits(float partialTicks) { return totalUnits; } + public int getTotalRenderedFluids(float partialTicks){ + int renderedFluids = 0; + for (SmartFluidTankBehaviour behaviour : getTanks()) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) { + if (tankSegment.getRenderedFluid().isEmpty()) + continue; + if(tankSegment.getTotalUnits(partialTicks) < 1) + continue; + renderedFluids++; + } + } + return renderedFluids; + } + + private Optional getOperator() { if (level == null) return Optional.empty(); diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java index d92729f491..e6f951c215 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java @@ -159,9 +159,29 @@ protected float renderFluids(BasinBlockEntity basin, float partialTicks, PoseSta float xMax = 2 / 16f; final float yMin = 2 / 16f; final float yMax = yMin + 12 / 16f * fluidLevel; - final float zMin = 2 / 16f; - final float zMax = 14 / 16f; + float zMin = 2 / 16f; + float zMax = 2 / 16f; + int totalFluids = basin.getTotalRenderedFluids(partialTicks); + int rows = Mth.ceil(Math.sqrt(totalFluids)); + int columns = Mth.ceil((float) totalFluids / rows); + float []totalUnitsPerRow = new float[rows]; + + int i = 0; + for (SmartFluidTankBehaviour behaviour : tanks) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()){ + if(tankSegment.getRenderedFluid().isEmpty()) + continue; + if(tankSegment.getTotalUnits(partialTicks) < 1) + continue; + totalUnitsPerRow[i / columns] += tankSegment.getTotalUnits(partialTicks); + i++; + } + } + + i = 0; for (SmartFluidTankBehaviour behaviour : tanks) { if (behaviour == null) continue; @@ -173,12 +193,22 @@ protected float renderFluids(BasinBlockEntity basin, float partialTicks, PoseSta if (units < 1) continue; - float partial = Mth.clamp(units / totalUnits, 0, 1); - xMax += partial * 12 / 16f; + if(i % columns == 0){ + float partialZ = Mth.clamp( totalUnitsPerRow[i / columns] / totalUnits, 0, 1); + zMin = zMax; + zMax += partialZ * 12/16f; + xMin = 2/16f; + xMax = 2/16f; + } + + float partialX = Mth.clamp(units / totalUnitsPerRow[i / columns], 0, 1); + xMax += partialX * 12 / 16f; + NeoForgeCatnipServices.FLUID_RENDERER.renderFluidBox(renderedFluid, xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, false, false); xMin = xMax; + i++; } }