CreateMod/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java
2022-08-18 17:30:48 +02:00

95 lines
3 KiB
Java

package com.simibubi.create.compat.jei.category.animations;
import java.util.List;
import com.mojang.blaze3d.platform.Lighting;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.math.Vector3f;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.fluid.FluidRenderer;
import net.createmod.catnip.gui.UIRenderHelper;
import net.createmod.catnip.utility.AnimationTickHolder;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.MultiBufferSource.BufferSource;
import net.minecraft.util.Mth;
import net.minecraftforge.fluids.FluidStack;
public class AnimatedSpout extends AnimatedKinetics {
private List<FluidStack> fluids;
public AnimatedSpout withFluids(List<FluidStack> fluids) {
this.fluids = fluids;
return this;
}
@Override
public void draw(PoseStack matrixStack, int xOffset, int yOffset) {
matrixStack.pushPose();
matrixStack.translate(xOffset, yOffset, 100);
matrixStack.mulPose(Vector3f.XP.rotationDegrees(-15.5f));
matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f));
int scale = 20;
blockElement(AllBlocks.SPOUT.getDefaultState())
.scale(scale)
.render(matrixStack);
float cycle = (AnimationTickHolder.getRenderTime() - offset * 8) % 30;
float squeeze = cycle < 20 ? Mth.sin((float) (cycle / 20f * Math.PI)) : 0;
squeeze *= 20;
matrixStack.pushPose();
blockElement(AllBlockPartials.SPOUT_TOP)
.scale(scale)
.render(matrixStack);
matrixStack.translate(0, -3 * squeeze / 32f, 0);
blockElement(AllBlockPartials.SPOUT_MIDDLE)
.scale(scale)
.render(matrixStack);
matrixStack.translate(0, -3 * squeeze / 32f, 0);
blockElement(AllBlockPartials.SPOUT_BOTTOM)
.scale(scale)
.render(matrixStack);
matrixStack.translate(0, -3 * squeeze / 32f, 0);
matrixStack.popPose();
blockElement(AllBlocks.DEPOT.getDefaultState())
.atLocal(0, 2, 0)
.scale(scale)
.render(matrixStack);
AnimatedKinetics.DEFAULT_LIGHTING.applyLighting();
BufferSource buffer = MultiBufferSource.immediate(Tesselator.getInstance()
.getBuilder());
matrixStack.pushPose();
UIRenderHelper.flipForGuiRender(matrixStack);
matrixStack.scale(16, 16, 16);
float from = 3f / 16f;
float to = 17f / 16f;
FluidRenderer.renderFluidBox(fluids.get(0), from, from, from, to, to, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false);
matrixStack.popPose();
float width = 1 / 128f * squeeze;
matrixStack.translate(scale / 2f, scale * 1.5f, scale / 2f);
UIRenderHelper.flipForGuiRender(matrixStack);
matrixStack.scale(16, 16, 16);
matrixStack.translate(-0.5f, 0, -0.5f);
from = -width / 2 + 0.5f;
to = width / 2 + 0.5f;
FluidRenderer.renderFluidBox(fluids.get(0), from, 0, from, to, 2, to, buffer, matrixStack, LightTexture.FULL_BRIGHT,
false);
buffer.endBatch();
Lighting.setupFor3DItems();
matrixStack.popPose();
}
}