SEToolbox.Models.StructureCubeGridModel.MirrorCubeOrientation C# (CSharp) Method

MirrorCubeOrientation() private static method

private static MirrorCubeOrientation ( string subtypeName, Sandbox.Common.ObjectBuilders.VRageData.SerializableBlockOrientation orientation, Mirror xMirror, Mirror yMirror, Mirror zMirror ) : Sandbox.Common.ObjectBuilders.VRageData.SerializableBlockOrientation
subtypeName string
orientation Sandbox.Common.ObjectBuilders.VRageData.SerializableBlockOrientation
xMirror Mirror
yMirror Mirror
zMirror Mirror
return Sandbox.Common.ObjectBuilders.VRageData.SerializableBlockOrientation
        private static SerializableBlockOrientation MirrorCubeOrientation(string subtypeName, SerializableBlockOrientation orientation, Mirror xMirror, Mirror yMirror, Mirror zMirror)
        {
            if (xMirror != Mirror.None)
            {
                #region X Symmetry mapping

                if (CornerRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Right];
                    }
                }
                else if (WindowFlatRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Down_Left];
                    }
                }
                else if (WindowCornerRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Up_Forward];
                    }
                }
                else if (WindowEdgeRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Left_Up];
                    }
                }
                else if (TubeCurvedRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Down_Left];
                        default: return orientation;
                    }
                }
                else
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Up_Left];
                    }
                }

                #endregion
            }
            else if (yMirror != Mirror.None)
            {
                #region Y Symmetry mapping

                if (CornerRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Up_Backward];
                    }
                }
                else if (WindowFlatRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Down_Left];
                    }
                }
                else if (WindowCornerRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Down_Forward];
                    }
                }
                else if (WindowEdgeRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Right_Down];
                    }
                }
                else if (TubeCurvedRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Left_Down];
                        default: return orientation;
                    }
                }
                else
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Down_Right];
                    }
                }

                #endregion
            }
            else if (zMirror != Mirror.None)
            {
                #region Z Symmetry mapping

                if (CornerRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Down_Forward];
                    }
                }
                else if (WindowFlatRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Right_Up]; //U
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Up_Left];
                    }
                }
                else if (WindowCornerRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Up_Backward];
                    }
                }
                else if (WindowEdgeRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Right_Up];
                    }
                }
                else if (TubeCurvedRotationBlocks.Contains(subtypeName))
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Up_Right];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Down_Right];
                        default: return orientation;
                    }
                }
                else
                {
                    var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                    switch (cubeType.Key)
                    {
                        case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Forward_Down];
                        case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Forward_Left];
                        case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Forward_Right];
                        case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Forward_Up];
                        case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                        case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                        case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Down_Left];
                        case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Down_Right];
                        case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Backward_Down];
                        case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Backward_Left];
                        case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Backward_Right];
                        case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Backward_Up];
                        case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                        case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Left_Down];
                        case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                        case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Left_Up];
                        case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                        case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Right_Down];
                        case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                        case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Right_Up];
                        case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                        case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                        case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Up_Left];
                        case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Up_Right];
                    }
                }

                //var cubeType = BaseOrientations.FirstOrDefault(x => x.Value.Forward == orientation.Forward && x.Value.Up == orientation.Up);
                //switch (cubeType.Key)
                //{
                //    case OrientType.Axis24_Backward_Down: return BaseOrientations[OrientType.Axis24_Backward_Down];
                //    case OrientType.Axis24_Backward_Left: return BaseOrientations[OrientType.Axis24_Backward_Left];
                //    case OrientType.Axis24_Backward_Right: return BaseOrientations[OrientType.Axis24_Backward_Right];
                //    case OrientType.Axis24_Backward_Up: return BaseOrientations[OrientType.Axis24_Backward_Up];
                //    case OrientType.Axis24_Down_Backward: return BaseOrientations[OrientType.Axis24_Down_Backward];
                //    case OrientType.Axis24_Down_Forward: return BaseOrientations[OrientType.Axis24_Down_Forward];
                //    case OrientType.Axis24_Down_Left: return BaseOrientations[OrientType.Axis24_Down_Left];
                //    case OrientType.Axis24_Down_Right: return BaseOrientations[OrientType.Axis24_Down_Right];
                //    case OrientType.Axis24_Forward_Down: return BaseOrientations[OrientType.Axis24_Forward_Down];
                //    case OrientType.Axis24_Forward_Left: return BaseOrientations[OrientType.Axis24_Forward_Left];
                //    case OrientType.Axis24_Forward_Right: return BaseOrientations[OrientType.Axis24_Forward_Right];
                //    case OrientType.Axis24_Forward_Up: return BaseOrientations[OrientType.Axis24_Forward_Up];
                //    case OrientType.Axis24_Left_Backward: return BaseOrientations[OrientType.Axis24_Left_Backward];
                //    case OrientType.Axis24_Left_Down: return BaseOrientations[OrientType.Axis24_Left_Down];
                //    case OrientType.Axis24_Left_Forward: return BaseOrientations[OrientType.Axis24_Left_Forward];
                //    case OrientType.Axis24_Left_Up: return BaseOrientations[OrientType.Axis24_Left_Up];
                //    case OrientType.Axis24_Right_Backward: return BaseOrientations[OrientType.Axis24_Right_Backward];
                //    case OrientType.Axis24_Right_Down: return BaseOrientations[OrientType.Axis24_Right_Down];
                //    case OrientType.Axis24_Right_Forward: return BaseOrientations[OrientType.Axis24_Right_Forward];
                //    case OrientType.Axis24_Right_Up: return BaseOrientations[OrientType.Axis24_Right_Up];
                //    case OrientType.Axis24_Up_Backward: return BaseOrientations[OrientType.Axis24_Up_Backward];
                //    case OrientType.Axis24_Up_Forward: return BaseOrientations[OrientType.Axis24_Up_Forward];
                //    case OrientType.Axis24_Up_Left: return BaseOrientations[OrientType.Axis24_Up_Left];
                //    case OrientType.Axis24_Up_Right: return BaseOrientations[OrientType.Axis24_Up_Right];
                //}

                #endregion
            }

            return orientation;
        }