package net.minecraft.client.renderer; import java.util.EnumMap; import java.util.Map; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.Direction; import net.minecraft.util.Util; import org.joml.Vector3f; import org.joml.Vector3fc; @Environment(EnvType.CLIENT) public enum FaceInfo { DOWN( new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MAX_Z) ), UP( new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MIN_Z) ), NORTH( new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MIN_Z) ), SOUTH( new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MAX_Z) ), WEST( new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MIN_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MAX_Z) ), EAST( new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MAX_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MIN_Y, FaceInfo.Extent.MIN_Z), new FaceInfo.VertexInfo(FaceInfo.Extent.MAX_X, FaceInfo.Extent.MAX_Y, FaceInfo.Extent.MIN_Z) ); private static final Map BY_FACING = Util.make(new EnumMap(Direction.class), map -> { map.put(Direction.DOWN, DOWN); map.put(Direction.UP, UP); map.put(Direction.NORTH, NORTH); map.put(Direction.SOUTH, SOUTH); map.put(Direction.WEST, WEST); map.put(Direction.EAST, EAST); }); private final FaceInfo.VertexInfo[] infos; public static FaceInfo fromFacing(final Direction direction) { return (FaceInfo)BY_FACING.get(direction); } private FaceInfo(final FaceInfo.VertexInfo... infos) { this.infos = infos; } public FaceInfo.VertexInfo getVertexInfo(final int index) { return this.infos[index]; } @Environment(EnvType.CLIENT) public static enum Extent { MIN_X, MIN_Y, MIN_Z, MAX_X, MAX_Y, MAX_Z; public float select(final Vector3fc min, final Vector3fc max) { return switch (this) { case MIN_X -> min.x(); case MIN_Y -> min.y(); case MIN_Z -> min.z(); case MAX_X -> max.x(); case MAX_Y -> max.y(); case MAX_Z -> max.z(); }; } public float select(final float minX, final float minY, final float minZ, final float maxX, final float maxY, final float maxZ) { return switch (this) { case MIN_X -> minX; case MIN_Y -> minY; case MIN_Z -> minZ; case MAX_X -> maxX; case MAX_Y -> maxY; case MAX_Z -> maxZ; }; } } @Environment(EnvType.CLIENT) public record VertexInfo(FaceInfo.Extent xFace, FaceInfo.Extent yFace, FaceInfo.Extent zFace) { public Vector3f select(final Vector3fc min, final Vector3fc max) { return new Vector3f(this.xFace.select(min, max), this.yFace.select(min, max), this.zFace.select(min, max)); } } }