/// <summary> /// The most important part of the algorithm, according to the slice that is rotating, the axis i'm rotating around and the rotation /// direction: /// 1- determine the face of the cube /// 2- get the tiles on that face and add them to a list /// 3- sort that list by the x, y or z position in ascending or descending order, according to the rotation axis and rotation direction /// TODO: Replace the bubble sort with a faster sorting algorithm /// </summary> /// <param name="face"></param> /// <param name="axis"></param> /// <param name="dir"></param> /// <returns></returns> public List <GameObject> GetFaceTiles(RubikCubeFaces.CubeFace face, AXIS axis, float dir) { List <GameObject> res = new List <GameObject>(); switch (face) { case RubikCubeFaces.CubeFace.Front: { var fronts = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsFrontFace>(); for (int i = 0; i < fronts.Length; i++) { if (fronts[i]) { res.Add(fronts[i].gameObject); } } } break; case RubikCubeFaces.CubeFace.Back: { var backs = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsBackFace>(); for (int i = 0; i < backs.Length; i++) { if (backs[i]) { res.Add(backs[i].gameObject); } } } break; case RubikCubeFaces.CubeFace.Right: { var rights = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsRightFace>(); for (int i = 0; i < rights.Length; i++) { if (rights[i]) { res.Add(rights[i].gameObject); } } } break; case RubikCubeFaces.CubeFace.Left: { var lefts = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsLeftFace>(); for (int i = 0; i < lefts.Length; i++) { if (lefts[i]) { res.Add(lefts[i].gameObject); } } } break; case RubikCubeFaces.CubeFace.Up: { var ups = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsUpFace>(); for (int i = 0; i < ups.Length; i++) { if (ups[i]) { res.Add(ups[i].gameObject); } } } break; case RubikCubeFaces.CubeFace.Down: { var downs = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsDownFace>(); for (int i = 0; i < downs.Length; i++) { if (downs[i]) { res.Add(downs[i].gameObject); } } } break; default: break; } // Bubble sorting tiles // A really crappy way of doing it // TODO: Optimize this part switch (face) { case RubikCubeFaces.CubeFace.Front: { for (int i = 0; i < res.Count - 1; i++) { for (int j = 0; j < res.Count - i - 1; j++) { switch (axis) { case AXIS.X: { if (dir < 0) { if (res[j].transform.position.y > res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.y < res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; case AXIS.Y: { if (dir > 0) { if (res[j].transform.position.x > res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.x < res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; default: break; } } } } break; case RubikCubeFaces.CubeFace.Back: { for (int i = 0; i < res.Count - 1; i++) { for (int j = 0; j < res.Count - i - 1; j++) { switch (axis) { case AXIS.X: { if (dir > 0) { if (res[j].transform.position.y > res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.y < res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; case AXIS.Y: { if (dir < 0) { if (res[j].transform.position.x > res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.x < res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; default: break; } } } } break; case RubikCubeFaces.CubeFace.Right: { for (int i = 0; i < res.Count - 1; i++) { for (int j = 0; j < res.Count - i - 1; j++) { switch (axis) { case AXIS.Y: { if (dir > 0) { if (res[j].transform.position.z > res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.z < res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; case AXIS.Z: { if (dir < 0) { if (res[j].transform.position.y > res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.y < res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; default: break; } } } } break; case RubikCubeFaces.CubeFace.Left: { for (int i = 0; i < res.Count - 1; i++) { for (int j = 0; j < res.Count - i - 1; j++) { switch (axis) { case AXIS.Y: { if (dir < 0) { if (res[j].transform.position.z > res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.z < res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; case AXIS.Z: { if (dir > 0) { if (res[j].transform.position.y > res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.y < res[j + 1].transform.position.y) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; default: break; } } } } break; case RubikCubeFaces.CubeFace.Up: { for (int i = 0; i < res.Count - 1; i++) { for (int j = 0; j < res.Count - i - 1; j++) { switch (axis) { case AXIS.X: { if (dir < 0) { if (res[j].transform.position.z > res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.z < res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; case AXIS.Z: { if (dir > 0) { if (res[j].transform.position.x > res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.x < res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; default: break; } } } } break; case RubikCubeFaces.CubeFace.Down: { for (int i = 0; i < res.Count - 1; i++) { for (int j = 0; j < res.Count - i - 1; j++) { switch (axis) { case AXIS.X: { if (dir > 0) { if (res[j].transform.position.z > res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.z < res[j + 1].transform.position.z) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; case AXIS.Z: { if (dir < 0) { if (res[j].transform.position.x > res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } else { if (res[j].transform.position.x < res[j + 1].transform.position.x) { var tmp = res[j]; res[j] = res[j + 1]; res[j + 1] = tmp; } } } break; default: break; } } } } break; default: break; } return(res); }
/// <summary> /// Given a certain slice face get the desired face tiles (i.e: get the up tiles of the front face) /// </summary> /// <param name="face"></param> /// <param name="wantedFace"></param> /// <returns></returns> public List <GameObject> GetFaceTiles(List <GameObject> face, RubikCubeFaces.CubeFace wantedFace) { List <GameObject> res = new List <GameObject>(); switch (wantedFace) { case RubikCubeFaces.CubeFace.Front: { for (int i = 0; i < face.Count; i++) { var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsFrontFace>(); if (marker) { res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsFrontFace>().gameObject); } } } break; case RubikCubeFaces.CubeFace.Back: { for (int i = 0; i < face.Count; i++) { var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsBackFace>(); if (marker) { res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsBackFace>().gameObject); } } } break; case RubikCubeFaces.CubeFace.Right: { for (int i = 0; i < face.Count; i++) { var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsRightFace>(); if (marker) { res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsRightFace>().gameObject); } } } break; case RubikCubeFaces.CubeFace.Left: { for (int i = 0; i < face.Count; i++) { var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsLeftFace>(); if (marker) { res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsLeftFace>().gameObject); } } } break; case RubikCubeFaces.CubeFace.Up: { for (int i = 0; i < face.Count; i++) { var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsUpFace>(); if (marker) { res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsUpFace>().gameObject); } } } break; case RubikCubeFaces.CubeFace.Down: { for (int i = 0; i < face.Count; i++) { var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsDownFace>(); if (marker) { res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsDownFace>().gameObject); } } } break; default: break; } return(res); }