cornerMultiply method

Cube cornerMultiply(
  1. Cube b
)

Implementation

Cube cornerMultiply(Cube b) {
  final cp = List.filled(Corner.count, Corner.upRightFront);
  final co = List.filled(Corner.count, 0);

  for (var corner = 0; corner < Corner.count; corner++) {
    cp[corner] = _cp[b._cp[corner].index];

    final oriA = _co[b._cp[corner].index];
    final oriB = b._co[corner];
    var ori = 0;

    // if both cubes are regular cubes...
    if (oriA < 3 && oriB < 3) {
      // just do an addition modulo 3 here.
      ori = oriA + oriB;
      // the composition is a regular cube.
      if (ori >= 3) {
        ori -= 3;
      }
    }
    // if cube b is a mirrored.
    else if (oriA < 3 && oriB >= 3) {
      ori = oriA + oriB;
      // the composition is a mirrored cube.
      if (ori >= 6) {
        ori -= 3;
      }
    }
    // if cube a is a mirrored.
    else if (oriA >= 3 && oriB < 3) {
      ori = oriA - oriB;
      // the composition is a mirrored cube.
      if (ori < 3) {
        ori += 3;
      }
    }
    // if both cubes are in mirrored.
    else if (oriA >= 3 && oriB >= 3) {
      ori = oriA - oriB;
      // the composition is a regular cube.
      if (ori < 0) {
        ori += 3;
      }
    }

    co[corner] = ori;
  }

  return Cube._(cp: cp, co: co, ep: _ep, eo: _eo);
}