package openmods.geometry; import net.minecraftforge.common.util.ForgeDirection; public enum HalfAxis { NEG_X(ForgeDirection.WEST), NEG_Y(ForgeDirection.DOWN), NEG_Z(ForgeDirection.NORTH), POS_X(ForgeDirection.EAST), POS_Y(ForgeDirection.UP), POS_Z(ForgeDirection.SOUTH); public final int x; public final int y; public final int z; public final ForgeDirection dir; private HalfAxis(ForgeDirection dir) { this.x = dir.offsetX; this.y = dir.offsetY; this.z = dir.offsetZ; this.dir = dir; } public static final HalfAxis[] VALUES = values(); private static final HalfAxis _ZERO = null; private static final HalfAxis[][] CROSS_PRODUCTS = new HalfAxis[][] { { _ZERO, POS_Z, NEG_Y, _ZERO, NEG_Z, POS_Y }, // NEG_X { NEG_Z, _ZERO, POS_X, POS_Z, _ZERO, NEG_X }, // NEG_Y { POS_Y, NEG_X, _ZERO, NEG_Y, POS_X, _ZERO }, // NEG_Z { _ZERO, NEG_Z, POS_Y, _ZERO, POS_Z, NEG_Y }, // POS_X { POS_Z, _ZERO, NEG_X, NEG_Z, _ZERO, POS_X }, // POS_Y { NEG_Y, POS_X, _ZERO, POS_Y, NEG_X, _ZERO }, // POS_Z }; public static HalfAxis cross(HalfAxis a, HalfAxis b) { return CROSS_PRODUCTS[a.ordinal()][b.ordinal()]; } public HalfAxis cross(HalfAxis other) { return cross(this, other); } private static final HalfAxis[] NEGATIONS = new HalfAxis[] { /* NEG_X = */POS_X, /* NEG_Y = */POS_Y, /* NEG_Z = */POS_Z, /* POS_X = */NEG_X, /* POS_Y = */NEG_Y, /* POS_Z = */NEG_Z, }; public static HalfAxis negate(HalfAxis axis) { return NEGATIONS[axis.ordinal()]; } public HalfAxis negate() { return negate(this); } public static HalfAxis fromDirection(ForgeDirection dir) { switch (dir) { case EAST: return POS_X; case WEST: return NEG_X; case NORTH: return NEG_Z; case SOUTH: return POS_Z; case DOWN: return NEG_Y; case UP: return POS_Y; default: throw new IllegalArgumentException(dir.toString()); } } }