Prepare the 'objectlib' package to be separated into a library module
Refactoring: split the 'objects' package into two, 'objects' and 'objectlib'.The point: we're going to need to move the 'objectlib' stuff into its own library module, and that's because we're going to create a new app module which needs access to it.
Remove redundant variable.
Do away with the last method in the object Movement classes. Remove the object Movement classes altogether.From now on the implementation of a TwistyPuzzle is 100% data, no code at all.Next step: make the implementation a (generated?) (XML?) file.
Abstract the next function, computeRowFromOffset(), out of the individual Movement classes.Still two issues:
1) mysterious 1.5 multiplier in Movement122) in Movement8, moving the offset works only if the rotAxis are face-turning, i.e. they connect the centers of the opposing faces of the octahedron.
Introduce abstract 4,6,8 adn 12 classes.
Move the Movement class from ObjectList to individual object classes.
Make Jing standard size (tetra size=2, i.e. equal to numLayers so that DIST2D and DIST3D are standard)
Add Mirror Cube 2x2 and 3x3.
Make object scrambling abstract (well, almost - with exception of Square-1 - this theoretically could also be done the generic way, but this would require almost 20000 'ScrambleStates')
Remove statics from the Pyraminx class.
Remove statics from the Jing class.
Introduce pseudorandom balancing into scrambling to all the other already converted objects, i.e. everytihng except for Pyraminxes, Squares, Minxes and the Redi.
Introduce pseudorandom balancing into scrambling in case of the two Dinos (from now on, the more times a particular (ax,layer) combination has been chosen already in the scrambling sequence, the less likely it is to be chosen next).Fix Dino6 - isSolved(). Sadly, it cannot be the geeneric function - it needs to be another special case.
Convert Skewb Ultimate, Jing Pyraminx & Ivy Cube to the new, unified scrambling method.
Remove the last 'isSolved()' (from Dino4) and put it to the parent class as a special case.
Standarize the 'isSolved()' method: now all objects, except one (Dino4) have a standard isSolved().This incidentally also fixes detection of the solved state in case of Diamond4, i.e. a Master FTO.
Add flag of Madagascar.
Finally remove cubit creation from the implementation classes and move it to the TwistyObject.
Move 1) Jing 2) Kilominx to the new cubit creation scheme.Make the Master Kilominx mesh a bit smaller.
Important step towards making the implementation of an individual puzzle code-free (i.e. data-only): move the 'MeshBase[] mMeshes' variable from the individual classes to the parent TwistyObject.
Convert the Ivy corner cubit to the new, 'universal' cubit creation method.
This forces deep changes to 'createRoundSolid' and the underlying 'MeshPolygon' class to make them support arbitrary Polygon 'centers of face convexity'.
Reason: the faces of this cubit are concave and such default 'center of face convexity' (which by default used to be (0,0)) turned to lie outside the face - which produces strange visual artifacts.
Move the TwistyObject.retCubePosition() to the solver.
Standarize drawing stickers of a twisty puzzle. From now on, there's no 'sticker drawing' code in the individual classes, only some constants.
Convert the last 'special' case, the Rex edge sticker, to the generic sticker mechanism.
Generalize FactorySticker - make it possible to draw stickers whose sides are curved.Convert the Ivy to use this new functionality.
Make the Pyraminxes a bit bigger by default - improvement.
Make the Pyraminxes a bit bigger by default.
Minor.
Finish implementing Jing's 'isSolved'
New 'JingPyraminx' object - add the mesh.
New 'JingPyraminx' object - improvements. The object should be working now.
New 'JingPyraminx' object - improvements
New 'JingPyraminx' object - improvement.
New 'JingPyraminx' object.