Project

General

Profile

Download (21.2 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / objects / TwistySkewb.java @ 8db55f55

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.objects;
21

    
22
import android.content.res.Resources;
23

    
24
import org.distorted.helpers.ObjectShape;
25
import org.distorted.helpers.ObjectSticker;
26
import org.distorted.library.main.DistortedEffects;
27
import org.distorted.library.main.DistortedTexture;
28
import org.distorted.library.mesh.MeshSquare;
29
import org.distorted.library.type.Static3D;
30
import org.distorted.library.type.Static4D;
31
import org.distorted.main.R;
32

    
33
import java.util.Random;
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

    
37
public class TwistySkewb extends TwistyObject
38
{
39
  private static final int FACES_PER_CUBIT =6;
40

    
41
  // the four rotation axis of a RubikSkewb. Must be normalized.
42
  static final Static3D[] ROT_AXIS = new Static3D[]
43
         {
44
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
45
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
46
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
47
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
48
         };
49

    
50
  private static final int[] BASIC_ANGLE = new int[] { 3,3,3,3 };
51

    
52
  private static final int[] FACE_COLORS = new int[]
53
         {
54
           COLOR_YELLOW, COLOR_WHITE,
55
           COLOR_BLUE  , COLOR_GREEN,
56
           COLOR_RED   , COLOR_ORANGE
57
         };
58

    
59
  // All legal rotation quats of a RubikSkewb
60
  private static final Static4D[] QUATS = new Static4D[]
61
         {
62
           new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),
63
           new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
64
           new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
65
           new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
66

    
67
           new Static4D(  0.5f,  0.5f,  0.5f,  0.5f ),
68
           new Static4D(  0.5f,  0.5f,  0.5f, -0.5f ),
69
           new Static4D(  0.5f,  0.5f, -0.5f,  0.5f ),
70
           new Static4D(  0.5f,  0.5f, -0.5f, -0.5f ),
71
           new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
72
           new Static4D(  0.5f, -0.5f,  0.5f, -0.5f ),
73
           new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
74
           new Static4D(  0.5f, -0.5f, -0.5f, -0.5f )
75
         };
76

    
77
  private static final int[][] mCornerMap =
78
         {
79
           {  4, 2, 0, 18,18,18 },
80
           {  2, 5, 0, 18,18,18 },
81
           {  3, 4, 0, 18,18,18 },
82
           {  5, 3, 0, 18,18,18 },
83
           {  1, 2, 4, 18,18,18 },
84
           {  5, 2, 1, 18,18,18 },
85
           {  4, 3, 1, 18,18,18 },
86
           {  1, 3, 5, 18,18,18 },
87
         };
88

    
89
  private static final int[][] mEdgeMap =
90
         {
91
           { 10, 8, 18,18,18,18 },
92
           {  6,10, 18,18,18,18 },
93
           { 10, 9, 18,18,18,18 },
94
           {  7,10, 18,18,18,18 },
95
           {  8, 6, 18,18,18,18 },
96
           {  9, 6, 18,18,18,18 },
97
           {  9, 7, 18,18,18,18 },
98
           {  8, 7, 18,18,18,18 },
99
           { 11, 8, 18,18,18,18 },
100
           {  6,11, 18,18,18,18 },
101
           { 11, 9, 18,18,18,18 },
102
           {  7,11, 18,18,18,18 }
103
         };
104

    
105
  private static final int[][] mCenterMap =
106
         {
107
           { 12, 18,18,18,18,18 },
108
           { 13, 18,18,18,18,18 },
109
           { 14, 18,18,18,18,18 },
110
           { 15, 18,18,18,18,18 },
111
           { 16, 18,18,18,18,18 },
112
           { 17, 18,18,18,18,18 },
113
         };
114

    
115
  private static final double[][] VERTICES_CORNER = new double[][]
116
          {
117
              {-0.5f, 0.0f, 0.0f},
118
              { 0.0f,-0.5f, 0.0f},
119
              { 0.0f, 0.0f,-0.5f},
120
              {-0.5f,-0.5f,-0.5f},
121
              { 0.0f, 0.0f, 0.0f}
122
          };
123

    
124
  private static final int[][] VERT_INDEXES_CORNER = new int[][]
125
          {
126
              {0,1,4},
127
              {2,0,4},
128
              {1,2,4},
129
              {3,1,0},
130
              {3,2,1},
131
              {3,0,2}
132
          };
133

    
134
  private static final double[][] VERTICES_EDGE = new double[][]
135
          {
136
             {-0.5, 0.0, 0.0},
137
             { 0.5, 0.0, 0.0},
138
             { 0.0,-0.5, 0.0},
139
             { 0.0, 0.0,-0.5}
140
          };
141

    
142
  private static final int[][] VERT_INDEXES_EDGE = new int[][]
143
          {
144
             {2,1,0},   // counterclockwise!
145
             {3,0,1},
146
             {2,3,1},
147
             {3,2,0},
148
          };
149

    
150
  private static final double[][] VERTICES_FACE = new double[][]
151
          {
152
             {-0.5f, 0.0f, 0.0f },
153
             { 0.0f,-0.5f, 0.0f },
154
             { 0.5f, 0.0f, 0.0f },
155
             { 0.0f, 0.5f, 0.0f },
156
             { 0.0f, 0.0f,-0.5f }
157
          };
158

    
159
  private static final int[][] VERT_INDEXES_FACE = new int[][]
160
          {
161
             {0,1,2,3},
162
             {4,1,0},
163
             {4,2,1},
164
             {4,3,2},
165
             {4,0,3}
166
          };
167

    
168
  private static final float[][] STICKERS = new float[][]
169
          {
170
             { -0.5f, 0.25f, 0.25f,  -0.5f, 0.25f, 0.25f  },
171
             { -0.5f, 0.00f, 0.00f,  -0.5f, 0.50f, 0.0f, 0.0f, 0.5f }
172
          };
173

    
174
  private static final ObjectSticker[] mStickers;
175

    
176
  static
177
    {
178
    mStickers = new ObjectSticker[STICKERS.length+1];
179
    final float R1 = 0.025f;
180
    final float R2 = 0.025f;
181
    final float R3 = 0.055f;
182
    final float[][] radii  = { { R1,R1,R1 },{ R2,R2,R2 },{ R3,R3,R3,R3 } };
183
    final float[] strokes = { 0.045f, 0.035f, 0.035f };
184

    
185
    for(int s=0; s<STICKERS.length+1; s++)
186
      {
187
      int index = s<2 ? 0:1;
188
      mStickers[s] = new ObjectSticker(STICKERS[index],null,radii[s],strokes[s]);
189
      }
190
    }
191

    
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193

    
194
  TwistySkewb(int size, Static4D quat, DistortedTexture texture,
195
              MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
196
    {
197
    super(size, 2*size-2, quat, texture, mesh, effects, moves, ObjectList.SKEW, res, scrWidth);
198
    }
199

    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201

    
202
  int[] getSolvedQuats(int cubit, int numLayers)
203
    {
204
    int status = retCubitSolvedStatus(cubit,numLayers);
205
    return status<0 ? null : buildSolvedQuats(MovementSkewb.FACE_AXIS[status],QUATS);
206
    }
207

    
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209

    
210
  private int getNumCorners()
211
    {
212
    return 8;
213
    }
214

    
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216

    
217
  private int getNumEdges(int layers)
218
    {
219
    return (layers-2)*12;
220
    }
221

    
222
///////////////////////////////////////////////////////////////////////////////////////////////////
223

    
224
  private int getNumCentersPerFace(int layers)
225
    {
226
    return ((layers-2)*(layers-2) + (layers-1)*(layers-1));
227
    }
228

    
229
///////////////////////////////////////////////////////////////////////////////////////////////////
230

    
231
  float getScreenRatio()
232
    {
233
    return 1.0f;
234
    }
235

    
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237

    
238
  Static4D[] getQuats()
239
    {
240
    return QUATS;
241
    }
242

    
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244

    
245
  int getNumFaces()
246
    {
247
    return FACE_COLORS.length;
248
    }
249

    
250
///////////////////////////////////////////////////////////////////////////////////////////////////
251

    
252
  int getSolvedFunctionIndex()
253
    {
254
    return 0;
255
    }
256

    
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258

    
259
  boolean shouldResetTextureMaps()
260
    {
261
    return false;
262
    }
263

    
264
///////////////////////////////////////////////////////////////////////////////////////////////////
265

    
266
  int getNumStickerTypes(int numLayers)
267
    {
268
    return 3;
269
    }
270

    
271
///////////////////////////////////////////////////////////////////////////////////////////////////
272

    
273
  float[][] getCuts(int numLayers)
274
    {
275
    switch(numLayers)
276
      {
277
      case 2: float[] c2 = new float[] {0.0f};
278
              return new float[][] { c2,c2,c2,c2 };
279
      case 3: float[] c3 = new float[] {-SQ3/12,+SQ3/12};
280
              return new float[][] { c3,c3,c3,c3 };
281
      }
282
    return null;
283
    }
284

    
285
///////////////////////////////////////////////////////////////////////////////////////////////////
286

    
287
  int getNumCubitFaces()
288
    {
289
    return FACES_PER_CUBIT;
290
    }
291

    
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293

    
294
  float[][] getCubitPositions(int numLayers)
295
    {
296
    final float DIST_CORNER = (numLayers-1)*0.50f;
297
    final float DIST_EDGE   = (numLayers-1)*0.50f;
298
    final float DIST_CENTER = (numLayers-1)*0.50f;
299

    
300
    final int numCorners = getNumCorners();
301
    final int numEdges   = getNumEdges(numLayers);
302
    final int numCenters = 6*getNumCentersPerFace(numLayers);
303

    
304
    final float[][] CENTERS = new float[numCorners+numEdges+numCenters][];
305

    
306
    /// CORNERS //////////////////////////////////////////////
307

    
308
    CENTERS[0] = new float[] { DIST_CORNER, DIST_CORNER, DIST_CORNER };
309
    CENTERS[1] = new float[] { DIST_CORNER, DIST_CORNER,-DIST_CORNER };
310
    CENTERS[2] = new float[] { DIST_CORNER,-DIST_CORNER, DIST_CORNER };
311
    CENTERS[3] = new float[] { DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
312
    CENTERS[4] = new float[] {-DIST_CORNER, DIST_CORNER, DIST_CORNER };
313
    CENTERS[5] = new float[] {-DIST_CORNER, DIST_CORNER,-DIST_CORNER };
314
    CENTERS[6] = new float[] {-DIST_CORNER,-DIST_CORNER, DIST_CORNER };
315
    CENTERS[7] = new float[] {-DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
316

    
317
    /// EDGES ///////////////////////////////////////////////
318

    
319
    final float[][]  edgeTable =
320
        {
321
            {0,+DIST_EDGE,+DIST_EDGE},
322
            {+DIST_EDGE,0,+DIST_EDGE},
323
            {0,-DIST_EDGE,+DIST_EDGE},
324
            {-DIST_EDGE,0,+DIST_EDGE},
325
            {+DIST_EDGE,+DIST_EDGE,0},
326
            {+DIST_EDGE,-DIST_EDGE,0},
327
            {-DIST_EDGE,-DIST_EDGE,0},
328
            {-DIST_EDGE,+DIST_EDGE,0},
329
            {0,+DIST_EDGE,-DIST_EDGE},
330
            {+DIST_EDGE,0,-DIST_EDGE},
331
            {0,-DIST_EDGE,-DIST_EDGE},
332
            {-DIST_EDGE,0,-DIST_EDGE}
333
        };
334

    
335
    int index=8;
336

    
337
    for (float[] edges : edgeTable)
338
      {
339
      float c = (3-numLayers)*0.5f;
340

    
341
      for (int j=0; j<numLayers-2; j++, c+=1.0f, index++)
342
        {
343
        CENTERS[index] = new float[] { edges[0]==0 ? c : edges[0] ,
344
                                       edges[1]==0 ? c : edges[1] ,
345
                                       edges[2]==0 ? c : edges[2] };
346
        }
347
      }
348

    
349
    /// CENTERS //////////////////////////////////////////////
350

    
351
    final float X= -1000.0f;
352
    final float Y= -1001.0f;
353

    
354
    final float[][]  centerTable =
355
        {
356
            {+DIST_CENTER,X,Y},
357
            {-DIST_CENTER,X,Y},
358
            {X,+DIST_CENTER,Y},
359
            {X,-DIST_CENTER,Y},
360
            {X,Y,+DIST_CENTER},
361
            {X,Y,-DIST_CENTER}
362
        };
363

    
364
    float x,y, cen0, cen1, cen2;
365

    
366
    for( float[] centers : centerTable )
367
      {
368
      x = (2-numLayers)*0.5f;
369

    
370
      for(int i=0; i<numLayers-1; i++, x+=1.0f)
371
        {
372
        y = (2-numLayers)*0.5f;
373

    
374
        for(int j=0; j<numLayers-1; j++, y+=1.0f, index++)
375
          {
376
               if( centers[0]==Y ) cen0 = y;
377
          else if( centers[0]==X ) cen0 = x;
378
          else                     cen0 = centers[0];
379

    
380
               if( centers[1]==Y ) cen1 = y;
381
          else if( centers[1]==X ) cen1 = x;
382
          else                     cen1 = centers[1];
383

    
384
               if( centers[2]==Y ) cen2 = y;
385
          else if( centers[2]==X ) cen2 = x;
386
          else                     cen2 = centers[2];
387

    
388
          CENTERS[index] = new float[] {cen0,cen1,cen2};
389
          }
390
        }
391

    
392
      x = (3-numLayers)*0.5f;
393

    
394
      for(int i=0; i<numLayers-2; i++, x+=1.0f)
395
        {
396
        y = (3-numLayers)*0.5f;
397

    
398
        for(int j=0; j<numLayers-2; j++, y+=1.0f, index++)
399
          {
400
               if( centers[0]==Y ) cen0 = y;
401
          else if( centers[0]==X ) cen0 = x;
402
          else                     cen0 = centers[0];
403

    
404
               if( centers[1]==Y ) cen1 = y;
405
          else if( centers[1]==X ) cen1 = x;
406
          else                     cen1 = centers[1];
407

    
408
               if( centers[2]==Y ) cen2 = y;
409
          else if( centers[2]==X ) cen2 = x;
410
          else                     cen2 = centers[2];
411

    
412
          CENTERS[index] = new float[] {cen0,cen1,cen2};
413
          }
414
        }
415
      }
416

    
417
    return CENTERS;
418
    }
419

    
420
///////////////////////////////////////////////////////////////////////////////////////////////////
421

    
422
  Static4D getQuat(int cubit, int numLayers)
423
    {
424
    int numCorners = getNumCorners();
425
    int numEdges   = getNumEdges(numLayers);
426

    
427
    if( cubit<numCorners )
428
      {
429
      switch(cubit)
430
        {
431
        case  0: return QUATS[0];                          //  unit quat
432
        case  1: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
433
        case  2: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
434
        case  3: return QUATS[1];                          // 180 along X
435
        case  4: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
436
        case  5: return QUATS[2];                          // 180 along Y
437
        case  6: return QUATS[3];                          // 180 along Z
438
        case  7: return new Static4D(SQ2/2,0,-SQ2/2,0);    // 180 along (SQ2/2,0,-SQ2/2)
439
        }
440
      }
441
    else if( cubit<numCorners+numEdges )
442
      {
443
      int edge = (cubit-numCorners)/(numLayers-2);
444

    
445
      switch(edge)
446
        {
447
        case  0: return QUATS[ 0];
448
        case  1: return QUATS[ 5];
449
        case  2: return QUATS[ 3];
450
        case  3: return QUATS[11];
451
        case  4: return QUATS[ 4];
452
        case  5: return QUATS[ 7];
453
        case  6: return QUATS[ 9];
454
        case  7: return QUATS[10];
455
        case  8: return QUATS[ 2];
456
        case  9: return QUATS[ 8];
457
        case 10: return QUATS[ 1];
458
        case 11: return QUATS[ 6];
459
        }
460
      }
461
    else
462
      {
463
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
464

    
465
      switch(center)
466
        {
467
        case 0: return new Static4D(0,-SQ2/2,0,SQ2/2);    // -90 along Y
468
        case 1: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
469
        case 2: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
470
        case 3: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
471
        case 4: return QUATS[0];                          //  unit quaternion
472
        case 5: return QUATS[1];                          // 180 along X
473
        }
474
      }
475

    
476
    return null;
477
    }
478

    
479
///////////////////////////////////////////////////////////////////////////////////////////////////
480

    
481
  ObjectShape getObjectShape(int cubit, int numLayers)
482
    {
483
    int variant = getCubitVariant(cubit,numLayers);
484

    
485
    if( variant==0 )
486
      {
487
      int N = numLayers==2 ? 7:5;
488
      int E1= numLayers==2 ? 3:2;
489
      int E2= numLayers==2 ? 5:3;
490
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,N,E1,E1}, {0.000f, 0,1.00f,0.0f,3,1,E2} };
491
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
492
      float[][] corners   = new float[][] { {0.08f,0.15f}, {0.08f,0.20f} };
493
      int[] cornerIndices = new int[] { 1,1,1,0,0 };
494
      float[][] centers   = new float[][] { {-0.25f, -0.25f, -0.25f} };
495
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
496
      return new ObjectShape(VERTICES_CORNER,VERT_INDEXES_CORNER,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
497
      }
498
    else if( variant==1 )
499
      {
500
      int N = numLayers==2 ? 7:5;
501
      int E = numLayers==2 ? 5:2;
502
      float[][] bands     = new float[][] { {0.035f,30,0.16f,0.8f,N,2,E}, {0.020f,45,0.16f,0.2f,3,1,2} };
503
      int[] bandIndices   = new int[] { 0,0,1,1 };
504
      float[][] corners   = new float[][] { {0.07f,0.20f}, {0.02f,0.30f} };
505
      int[] cornerIndices = new int[] { 0,0,1,1 };
506
      float[][] centers   = new float[][] { {0.0f, -0.25f, -0.25f} };
507
      int[] centerIndices = new int[] { 0,0,0,0 };
508
      return new ObjectShape(VERTICES_EDGE,VERT_INDEXES_EDGE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
509
      }
510
    else
511
      {
512
      int N = numLayers==2 ? 7:6;
513
      int E = numLayers==2 ? 3:1;
514
      float[][] bands     = new float[][] { {0.051f,35,SQ2/8,0.9f,N,E,E}, {0.000f,0,1,0.0f,3,0,0} };
515
      int[] bandIndices   = new int[] { 0,1,1,1,1 };
516
      float[][] corners   = new float[][] { {0.06f,0.10f} };
517
      int[] cornerIndices = new int[] { 0,0,0,0,0 };
518
      float[][] centers   = new float[][] { {0,0,-0.2f} };
519
      int[] centerIndices = new int[] { 0,0,0,0,-1 };
520
      return new ObjectShape(VERTICES_FACE,VERT_INDEXES_FACE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
521
      }
522
    }
523

    
524
///////////////////////////////////////////////////////////////////////////////////////////////////
525

    
526
  int getNumCubitVariants(int numLayers)
527
    {
528
    return 3;
529
    }
530

    
531
///////////////////////////////////////////////////////////////////////////////////////////////////
532

    
533
  int getCubitVariant(int cubit, int numLayers)
534
    {
535
    int numCorners = getNumCorners();
536
    if( cubit<numCorners ) return 0;
537
    int numEdges = getNumEdges(numLayers);
538
    return cubit<numCorners+numEdges ? 1:2;
539
    }
540

    
541
///////////////////////////////////////////////////////////////////////////////////////////////////
542

    
543
  int getFaceColor(int cubit, int cubitface, int numLayers)
544
    {
545
    int numCorners = getNumCorners();
546
    int numEdges   = getNumEdges(numLayers);
547

    
548
    if( cubit<numCorners )
549
      {
550
      return mCornerMap[cubit][cubitface];
551
      }
552
    else if( cubit<numCorners+numEdges )
553
      {
554
      int edge = (cubit-numCorners)/(numLayers-2);
555
      return mEdgeMap[edge][cubitface];
556
      }
557
    else
558
      {
559
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
560
      return mCenterMap[center][cubitface];
561
      }
562
    }
563

    
564
///////////////////////////////////////////////////////////////////////////////////////////////////
565

    
566
  int getColor(int face)
567
    {
568
    return FACE_COLORS[face];
569
    }
570

    
571
///////////////////////////////////////////////////////////////////////////////////////////////////
572

    
573
  ObjectSticker retSticker(int face)
574
    {
575
    return mStickers[face/NUM_FACES];
576
    }
577

    
578
///////////////////////////////////////////////////////////////////////////////////////////////////
579

    
580
  float returnMultiplier()
581
    {
582
    return 2.0f;
583
    }
584

    
585
///////////////////////////////////////////////////////////////////////////////////////////////////
586
// PUBLIC API
587

    
588
  public Static3D[] getRotationAxis()
589
    {
590
    return ROT_AXIS;
591
    }
592

    
593
///////////////////////////////////////////////////////////////////////////////////////////////////
594

    
595
  public int[] getBasicAngle()
596
    {
597
    return BASIC_ANGLE;
598
    }
599

    
600
///////////////////////////////////////////////////////////////////////////////////////////////////
601

    
602
  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total)
603
    {
604
    if( curr==0 )
605
      {
606
      scramble[curr][0] = rnd.nextInt(NUM_AXIS);
607
      }
608
    else
609
      {
610
      int newVector = rnd.nextInt(NUM_AXIS-1);
611
      scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector);
612
      }
613

    
614
    scramble[curr][1] = rnd.nextFloat()<=0.5f ? 0 : getNumLayers()-1;
615

    
616
    switch( rnd.nextInt(2) )
617
      {
618
      case 0: scramble[curr][2] = -1; break;
619
      case 1: scramble[curr][2] =  1; break;
620
      }
621
    }
622

    
623
///////////////////////////////////////////////////////////////////////////////////////////////////
624

    
625
  public int getObjectName(int numLayers)
626
    {
627
    switch(numLayers)
628
      {
629
      case 2: return R.string.skew2;
630
      case 3: return R.string.skew3;
631
      }
632
    return R.string.skew2;
633
    }
634

    
635
///////////////////////////////////////////////////////////////////////////////////////////////////
636

    
637
  public int getInventor(int numLayers)
638
    {
639
    switch(numLayers)
640
      {
641
      case 2: return R.string.skew2_inventor;
642
      case 3: return R.string.skew3_inventor;
643
      }
644
    return R.string.skew2_inventor;
645
    }
646

    
647
///////////////////////////////////////////////////////////////////////////////////////////////////
648

    
649
  public int getComplexity(int numLayers)
650
    {
651
    switch(numLayers)
652
      {
653
      case 2: return 4;
654
      case 3: return 8;
655
      }
656
    return 5;
657
    }
658
}
(37-37/41)