mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-06-02 10:49:31 +02:00
9098002c17
- add flywheel as a dependency to catnip
96 lines
3.3 KiB
Java
96 lines
3.3 KiB
Java
package com.simibubi.create.content.decoration.slidingDoor;
|
|
|
|
import com.jozufozu.flywheel.core.PartialModel;
|
|
import com.mojang.blaze3d.vertex.PoseStack;
|
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
|
import com.simibubi.create.AllPartialModels;
|
|
import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer;
|
|
|
|
import net.createmod.catnip.render.CachedBuffers;
|
|
import net.createmod.catnip.render.SuperByteBuffer;
|
|
import net.createmod.catnip.utility.Couple;
|
|
import net.createmod.catnip.utility.Iterate;
|
|
import net.createmod.catnip.utility.math.AngleHelper;
|
|
import net.minecraft.client.renderer.MultiBufferSource;
|
|
import net.minecraft.client.renderer.RenderType;
|
|
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.world.level.block.DoorBlock;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.block.state.properties.DoorHingeSide;
|
|
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
|
|
import net.minecraft.world.phys.Vec3;
|
|
|
|
public class SlidingDoorRenderer extends SafeBlockEntityRenderer<SlidingDoorBlockEntity> {
|
|
|
|
public SlidingDoorRenderer(Context context) {}
|
|
|
|
@Override
|
|
protected void renderSafe(SlidingDoorBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer,
|
|
int light, int overlay) {
|
|
BlockState blockState = be.getBlockState();
|
|
if (!be.shouldRenderSpecial(blockState))
|
|
return;
|
|
|
|
Direction facing = blockState.getValue(DoorBlock.FACING);
|
|
Direction movementDirection = facing.getClockWise();
|
|
|
|
if (blockState.getValue(DoorBlock.HINGE) == DoorHingeSide.LEFT)
|
|
movementDirection = movementDirection.getOpposite();
|
|
|
|
float value = be.animation.getValue(partialTicks);
|
|
float value2 = Mth.clamp(value * 10, 0, 1);
|
|
|
|
VertexConsumer vb = buffer.getBuffer(RenderType.cutoutMipped());
|
|
Vec3 offset = Vec3.atLowerCornerOf(movementDirection.getNormal())
|
|
.scale(value * value * 13 / 16f)
|
|
.add(Vec3.atLowerCornerOf(facing.getNormal())
|
|
.scale(value2 * 1 / 32f));
|
|
|
|
if (((SlidingDoorBlock) blockState.getBlock()).isFoldingDoor()) {
|
|
Couple<PartialModel> partials = AllPartialModels.FOLDING_DOORS.get(blockState.getBlock()
|
|
.getRegistryName());
|
|
|
|
boolean flip = blockState.getValue(DoorBlock.HINGE) == DoorHingeSide.RIGHT;
|
|
for (boolean left : Iterate.trueAndFalse) {
|
|
SuperByteBuffer partial = CachedBuffers.partial(partials.get(left ^ flip), blockState);
|
|
float f = flip ? -1 : 1;
|
|
|
|
partial.translate(0, -1 / 512f, 0)
|
|
.translate(Vec3.atLowerCornerOf(facing.getNormal())
|
|
.scale(value2 * 1 / 32f));
|
|
partial.rotateCentered(Direction.UP,
|
|
Mth.DEG_TO_RAD * AngleHelper.horizontalAngle(facing.getClockWise()));
|
|
|
|
if (flip)
|
|
partial.translate(0, 0, 1);
|
|
partial.rotateY(91 * f * value * value);
|
|
|
|
if (!left)
|
|
partial.translate(0, 0, f / 2f)
|
|
.rotateY(-181 * f * value * value);
|
|
|
|
if (flip)
|
|
partial.translate(0, 0, -1 / 2f);
|
|
|
|
partial.light(light)
|
|
.renderInto(ms, vb);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
for (DoubleBlockHalf half : DoubleBlockHalf.values()) {
|
|
CachedBuffers.block(blockState.setValue(DoorBlock.OPEN, false)
|
|
.setValue(DoorBlock.HALF, half))
|
|
.translate(0, half == DoubleBlockHalf.UPPER ? 1 - 1 / 512f : 0, 0)
|
|
.translate(offset)
|
|
.light(light)
|
|
.renderInto(ms, vb);
|
|
}
|
|
|
|
}
|
|
|
|
}
|