Revision 0812242b
Added by Leszek Koltunski over 4 years ago
| src/main/java/org/distorted/main/RubikSurfaceView.java | ||
|---|---|---|
| 621 | 621 |
|
| 622 | 622 |
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance(); |
| 623 | 623 |
crashlytics.setCustomKey("GLSL Version" , shading );
|
| 624 |
crashlytics.setCustomKey("GLversion" , version );
|
|
| 624 |
crashlytics.setCustomKey("GL version" , version );
|
|
| 625 | 625 |
crashlytics.setCustomKey("GL Vendor " , vendor );
|
| 626 |
crashlytics.setCustomKey("GLSLrenderer" , renderer);
|
|
| 626 |
crashlytics.setCustomKey("GLSL renderer" , renderer);
|
|
| 627 | 627 |
crashlytics.recordException(ex); |
| 628 | 628 |
} |
| 629 | 629 |
} |
| src/main/java/org/distorted/objects/TwistyMinx.java | ||
|---|---|---|
| 326 | 326 |
mBasicCornerV[2] = new Static4D( 0, -0.500f, 0.0f, 0.0f ); |
| 327 | 327 |
} |
| 328 | 328 |
|
| 329 |
private static int[][] mScrambleTable; |
|
| 330 |
private static int[] mPossibleAxis, mPossibleLayers; |
|
| 331 |
private static int[] mNumOccurences; |
|
| 332 |
|
|
| 329 | 333 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 330 | 334 |
|
| 331 | 335 |
TwistyMinx(int numLayers, int realSize, Static4D quat, DistortedTexture texture, MeshSquare mesh, |
| ... | ... | |
| 427 | 431 |
} |
| 428 | 432 |
|
| 429 | 433 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 430 |
// PUBLIC API |
|
| 431 | 434 |
|
| 432 |
public Static3D[] getRotationAxis()
|
|
| 435 |
private void initializeScrambleTable(int[] first, int numLayers)
|
|
| 433 | 436 |
{
|
| 434 |
return ROT_AXIS; |
|
| 437 |
if( mScrambleTable ==null ) mScrambleTable = new int[NUM_AXIS][2]; |
|
| 438 |
if( mPossibleAxis ==null ) mPossibleAxis = new int[NUM_AXIS-1]; |
|
| 439 |
if( mPossibleLayers==null ) mPossibleLayers= new int[NUM_AXIS-1]; |
|
| 440 |
if( mNumOccurences ==null ) mNumOccurences = new int[NUM_AXIS-1]; |
|
| 441 |
|
|
| 442 |
for(int i=0; i<NUM_AXIS; i++) |
|
| 443 |
for(int j=0; j<2; j++) |
|
| 444 |
{
|
|
| 445 |
mScrambleTable[i][j] = 0; |
|
| 446 |
} |
|
| 447 |
|
|
| 448 |
int layer = convertRowIntoLayer(first[1],numLayers); |
|
| 449 |
|
|
| 450 |
mScrambleTable[first[0]][layer] = 1; |
|
| 435 | 451 |
} |
| 436 | 452 |
|
| 437 | 453 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 438 | 454 |
|
| 439 |
public int[] getBasicAngle()
|
|
| 455 |
private int convertRowIntoLayer(int row, int numLayers)
|
|
| 440 | 456 |
{
|
| 441 |
return BASIC_ANGLE; |
|
| 457 |
return row>(numLayers-1)/2 ? 1 : 0; |
|
| 458 |
} |
|
| 459 |
|
|
| 460 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 461 |
|
|
| 462 |
private int convertLayerIntoRow(Random rnd, int layer, int numLayers) |
|
| 463 |
{
|
|
| 464 |
int ran = numLayers>3 ? rnd.nextInt((numLayers-1)/2) : 0; |
|
| 465 |
return layer==0 ? ran : numLayers-1-ran; |
|
| 442 | 466 |
} |
| 443 | 467 |
|
| 444 | 468 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 445 | 469 |
|
| 470 |
private int retNewRotationIndex(Random rnd, int nom, int[] oldRot) |
|
| 471 |
{
|
|
| 472 |
int index=0, max=0; |
|
| 473 |
|
|
| 474 |
for(int ax=0; ax<NUM_AXIS; ax++) |
|
| 475 |
{
|
|
| 476 |
if( ax!=oldRot[0] ) |
|
| 477 |
{
|
|
| 478 |
mPossibleAxis[index] = ax; |
|
| 479 |
boolean opposite = OPPOSITE_ROWS[oldRot[0]][ax]; |
|
| 480 |
boolean low = opposite^(oldRot[1]<nom); |
|
| 481 |
mPossibleLayers[index] = low ? 0:1; |
|
| 482 |
int tmp = mScrambleTable[mPossibleAxis[index]][mPossibleLayers[index]]; |
|
| 483 |
if( tmp>max ) max=tmp; |
|
| 484 |
index++; |
|
| 485 |
} |
|
| 486 |
} |
|
| 487 |
|
|
| 488 |
for(int ax=0; ax<NUM_AXIS-1; ax++) |
|
| 489 |
{
|
|
| 490 |
if( ax==0 ) |
|
| 491 |
{
|
|
| 492 |
mNumOccurences[ax] = max-mScrambleTable[mPossibleAxis[ax]][mPossibleLayers[ax]]; |
|
| 493 |
} |
|
| 494 |
else |
|
| 495 |
{
|
|
| 496 |
mNumOccurences[ax] = max-mScrambleTable[mPossibleAxis[ax]][mPossibleLayers[ax]] + mNumOccurences[ax-1]; |
|
| 497 |
} |
|
| 498 |
} |
|
| 499 |
|
|
| 500 |
float random= rnd.nextFloat(); |
|
| 501 |
int total = mNumOccurences[NUM_AXIS-2]; |
|
| 502 |
|
|
| 503 |
for(int ax=0; ax<NUM_AXIS-1; ax++) |
|
| 504 |
{
|
|
| 505 |
if( random*total <= mNumOccurences[ax] ) |
|
| 506 |
{
|
|
| 507 |
index=ax; |
|
| 508 |
break; |
|
| 509 |
} |
|
| 510 |
} |
|
| 511 |
|
|
| 512 |
mScrambleTable[mPossibleAxis[index]][mPossibleLayers[index]]++; |
|
| 513 |
|
|
| 514 |
return index; |
|
| 515 |
} |
|
| 516 |
|
|
| 517 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 518 |
// PUBLIC API |
|
| 519 |
|
|
| 446 | 520 |
public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total) |
| 447 | 521 |
{
|
| 448 | 522 |
int numLayers = getNumLayers(); |
| ... | ... | |
| 451 | 525 |
|
| 452 | 526 |
if( curr==0 ) |
| 453 | 527 |
{
|
| 454 |
int lf = rnd.nextInt(2);
|
|
| 528 |
int lf = rnd.nextInt(2); |
|
| 455 | 529 |
scramble[curr][0] = rnd.nextInt(NUM_AXIS); |
| 456 | 530 |
scramble[curr][1] = (lf==0 ? row : numLayers-1-row); |
| 531 |
initializeScrambleTable(scramble[curr],numLayers); |
|
| 457 | 532 |
} |
| 458 | 533 |
else |
| 459 | 534 |
{
|
| 460 |
boolean opposite = OPPOSITE_ROWS[scramble[curr-1][0]][scramble[curr][0]]; |
|
| 461 |
boolean low = opposite^(scramble[curr-1][1]<nom); |
|
| 462 |
int newVector = rnd.nextInt(NUM_AXIS-1); |
|
| 463 |
scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector); |
|
| 464 |
scramble[curr][1] = (low ? row : numLayers-1-row); |
|
| 535 |
int index = retNewRotationIndex(rnd,nom,scramble[curr-1]); |
|
| 536 |
scramble[curr][0] = mPossibleAxis[index]; |
|
| 537 |
scramble[curr][1] = convertLayerIntoRow(rnd, mPossibleLayers[index], numLayers); |
|
| 465 | 538 |
} |
| 466 | 539 |
|
| 467 | 540 |
switch( rnd.nextInt(4) ) |
| ... | ... | |
| 473 | 546 |
} |
| 474 | 547 |
} |
| 475 | 548 |
|
| 549 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 550 |
|
|
| 551 |
public Static3D[] getRotationAxis() |
|
| 552 |
{
|
|
| 553 |
return ROT_AXIS; |
|
| 554 |
} |
|
| 555 |
|
|
| 556 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 557 |
|
|
| 558 |
public int[] getBasicAngle() |
|
| 559 |
{
|
|
| 560 |
return BASIC_ANGLE; |
|
| 561 |
} |
|
| 562 |
|
|
| 476 | 563 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 477 | 564 |
// only needed for solvers - there are no Minx solvers ATM) |
| 478 | 565 |
|
| src/main/java/org/distorted/objects/TwistyRedi.java | ||
|---|---|---|
| 203 | 203 |
|
| 204 | 204 |
private static MeshBase[] mMeshes; |
| 205 | 205 |
|
| 206 |
private static int[][] mScrambleTable; |
|
| 207 |
private static int[] mPossibleAxis, mPossibleLayers; |
|
| 208 |
|
|
| 206 | 209 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 207 | 210 |
|
| 208 | 211 |
TwistyRedi(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh, |
| ... | ... | |
| 419 | 422 |
return BASIC_ANGLE; |
| 420 | 423 |
} |
| 421 | 424 |
|
| 425 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 426 |
|
|
| 427 |
private void initializeScrambleTable(int[] first) |
|
| 428 |
{
|
|
| 429 |
if( mScrambleTable ==null ) mScrambleTable = new int[NUM_AXIS][2]; |
|
| 430 |
if( mPossibleAxis ==null ) mPossibleAxis = new int[NUM_AXIS-1]; |
|
| 431 |
if( mPossibleLayers==null ) mPossibleLayers= new int[NUM_AXIS-1]; |
|
| 432 |
|
|
| 433 |
for(int i=0; i<NUM_AXIS; i++) |
|
| 434 |
for(int j=0; j<2; j++) |
|
| 435 |
{
|
|
| 436 |
mScrambleTable[i][j] = 0; |
|
| 437 |
} |
|
| 438 |
|
|
| 439 |
mScrambleTable[first[0]][first[1]/2] = 1; |
|
| 440 |
} |
|
| 441 |
|
|
| 442 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 443 |
|
|
| 444 |
private int retNewRotationIndex(Random rnd, int[] oldRot) |
|
| 445 |
{
|
|
| 446 |
int index=0, max=0; |
|
| 447 |
|
|
| 448 |
for(int ax=0; ax<NUM_AXIS; ax++) |
|
| 449 |
{
|
|
| 450 |
if( ax!=oldRot[0] ) |
|
| 451 |
{
|
|
| 452 |
mPossibleAxis[index] = ax; |
|
| 453 |
mPossibleLayers[index] = oldRot[0]+ax==3 ? 1-oldRot[1]/2 : oldRot[1]/2; |
|
| 454 |
int tmp = mScrambleTable[mPossibleAxis[index]][mPossibleLayers[index]]; |
|
| 455 |
if( tmp>max ) max=tmp; |
|
| 456 |
index++; |
|
| 457 |
} |
|
| 458 |
} |
|
| 459 |
|
|
| 460 |
int a0 = max-mScrambleTable[mPossibleAxis[0]][mPossibleLayers[0]]; |
|
| 461 |
int a1 = max-mScrambleTable[mPossibleAxis[1]][mPossibleLayers[1]]; |
|
| 462 |
int a2 = max-mScrambleTable[mPossibleAxis[2]][mPossibleLayers[2]]; |
|
| 463 |
|
|
| 464 |
float total = a0+a1+a2; |
|
| 465 |
float random= rnd.nextFloat(); |
|
| 466 |
|
|
| 467 |
if( random*total < a0 ) index=0; |
|
| 468 |
else if( random*total < a0+a1 ) index=1; |
|
| 469 |
else index=2; |
|
| 470 |
|
|
| 471 |
mScrambleTable[mPossibleAxis[index]][mPossibleLayers[index]]++; |
|
| 472 |
|
|
| 473 |
return index; |
|
| 474 |
} |
|
| 475 |
|
|
| 422 | 476 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 423 | 477 |
|
| 424 | 478 |
public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total) |
| ... | ... | |
| 427 | 481 |
{
|
| 428 | 482 |
scramble[curr][0] = rnd.nextInt(NUM_AXIS); |
| 429 | 483 |
scramble[curr][1] = rnd.nextFloat()<=0.5f ? 0:2; |
| 484 |
initializeScrambleTable(scramble[curr]); |
|
| 430 | 485 |
} |
| 431 | 486 |
else |
| 432 | 487 |
{
|
| 433 |
int newVector = rnd.nextInt(NUM_AXIS -1);
|
|
| 434 |
scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector);
|
|
| 435 |
scramble[curr][1] = (scramble[curr-1][0]+scramble[curr][0]==3 ? 2-scramble[curr-1][1] : scramble[curr-1][1]);
|
|
| 488 |
int index = retNewRotationIndex(rnd,scramble[curr-1]);
|
|
| 489 |
scramble[curr][0] = mPossibleAxis[index];
|
|
| 490 |
scramble[curr][1] = 2*mPossibleLayers[index];
|
|
| 436 | 491 |
} |
| 437 | 492 |
|
| 438 | 493 |
switch( rnd.nextInt(2) ) |
| ... | ... | |
| 443 | 498 |
} |
| 444 | 499 |
|
| 445 | 500 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 446 |
// The Redi is solved if and only if: |
|
| 447 |
// |
|
| 448 |
// ?? |
|
| 501 |
// The Redi is solved if and only if all cubits are rotated with the same quat. |
|
| 449 | 502 |
|
| 450 | 503 |
public boolean isSolved() |
| 451 | 504 |
{
|
Also available in: Unified diff
Improve scrambling of the Minx'es and the Redi, which in full scramble mode were frequently leaving large corners unscrambled.