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;
}