001    package net.minecraftforge.common;
002    
003    public 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    }