    001package net.minecraftforge.common;
    002
    003public enum ForgeDirection
    004{
    005    /** -Y */
    006    DOWN(0, -1, 0),
    007
    008    /** +Y */
    009    UP(0, 1, 0),
    010
    011    /** -Z */
    012    NORTH(0, 0, -1),
    013
    014    /** +Z */
    015    SOUTH(0, 0, 1),
    016
    017    /** -X */
    018    WEST(-1, 0, 0),
    019
    020    /** +X */
    021    EAST(1, 0, 0),
    022
    023    /**
    024     * Used only by getOrientation, for invalid inputs
    025     */
    026    UNKNOWN(0, 0, 0);
    027
    028    public final int offsetX;
    029    public final int offsetY;
    030    public final int offsetZ;
    031    public final int flag;
    032    public static final ForgeDirection[] VALID_DIRECTIONS = {DOWN, UP, NORTH, SOUTH, WEST, EAST};
    033    public static final int[] OPPOSITES = {1, 0, 3, 2, 5, 4, 6};
    034    // Left hand rule rotation matrix for all possible axes of rotation
    035    public static final int[][] ROTATION_MATRIX = {
    036        {0, 1, 4, 5, 3, 2, 6},
    037        {0, 1, 5, 4, 2, 3, 6},
    038        {5, 4, 2, 3, 0, 1, 6},
    039        {4, 5, 2, 3, 1, 0, 6},
    040        {2, 3, 1, 0, 4, 5, 6},
    041        {3, 2, 0, 1, 4, 5, 6},
    042        {0, 1, 2, 3, 4, 5, 6},
    043    };
    044
    045    private ForgeDirection(int x, int y, int z)
    046    {
    047        offsetX = x;
    048        offsetY = y;
    049        offsetZ = z;
    050        flag = 1 << ordinal();
    051    }
    052
    053    public static ForgeDirection getOrientation(int id)
    054    {
    055        if (id >= 0 && id < VALID_DIRECTIONS.length)
    056        {
    057            return VALID_DIRECTIONS[id];
    058        }
    059        return UNKNOWN;
    060    }
    061
    062    public ForgeDirection getOpposite()
    063    {
    064        return getOrientation(OPPOSITES[ordinal()]);
    065    }
    066
    067    public ForgeDirection getRotation(ForgeDirection axis)
    068    {
    069        return getOrientation(ROTATION_MATRIX[axis.ordinal()][ordinal()]);
    070    }
    071}