Project

General

Profile

Download (22.3 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyCuboid.java @ ba6d9ee9

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2019 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.objectlib.objects;
21

    
22
import static org.distorted.objectlib.main.Movement.TYPE_NOT_SPLIT;
23

    
24
import android.content.res.Resources;
25

    
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

    
32
import org.distorted.objectlib.R;
33
import org.distorted.objectlib.main.Movement;
34
import org.distorted.objectlib.main.Movement6;
35
import org.distorted.objectlib.main.ObjectControl;
36
import org.distorted.objectlib.main.ObjectType;
37
import org.distorted.objectlib.helpers.ObjectShape;
38
import org.distorted.objectlib.helpers.ObjectSticker;
39
import org.distorted.objectlib.helpers.ScrambleState;
40
import org.distorted.objectlib.main.Twisty6;
41

    
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43

    
44
public class TwistyCuboid extends Twisty6
45
{
46
  static final Static3D[] ROT_AXIS = new Static3D[]
47
         {
48
           new Static3D(1,0,0),
49
           new Static3D(0,1,0),
50
           new Static3D(0,0,1)
51
         };
52

    
53
  private static final int[][][] ENABLED = new int[][][]
54
      {
55
          {{1,2}},{{1,2}},{{0,2}},{{0,2}},{{0,1}},{{0,1}},
56
      };
57

    
58
  private ScrambleState[] mStates;
59
  private Static4D[] mQuats;
60
  private float[][] mCuts;
61
  private boolean[][] mLayerRotatable;
62
  private int[] mBasicAngle;
63
  private ObjectSticker[] mStickers;
64
  private Movement mMovement;
65

    
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67

    
68
  public TwistyCuboid(int[] numL, Static4D quat, Static3D move, DistortedTexture texture,
69
                      MeshSquare mesh, DistortedEffects effects, Resources res, int surfaceW, int surfaceH)
70
    {
71
    super(numL, (numL[0]+numL[1]+numL[2])/3.0f, quat, move, texture, mesh, effects, res, surfaceW, surfaceH);
72
    }
73

    
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75

    
76
  private int[] createEdges(int size, boolean full, int vertex)
77
    {
78
    if( size==1 ) return null;
79

    
80
    if( full )
81
      {
82
      int[] ret = new int[9*size];
83

    
84
      for(int l=0; l<size; l++)
85
        {
86
        ret[9*l  ] = l;
87
        ret[9*l+1] =-1;
88
        ret[9*l+2] = vertex;
89
        ret[9*l+3] = l;
90
        ret[9*l+4] = 1;
91
        ret[9*l+5] = vertex;
92
        ret[9*l+6] = l;
93
        ret[9*l+7] = 2;
94
        ret[9*l+8] = vertex;
95
        }
96

    
97
      return ret;
98
      }
99
    else
100
      {
101
      int[] ret = new int[6*size];
102

    
103
      for(int l=0; l<size; l++)
104
        {
105
        ret[6*l  ] = l;
106
        ret[6*l+1] = 1;
107
        ret[6*l+2] = vertex;
108
        ret[6*l+3] = l;
109
        ret[6*l+4] =-1;
110
        ret[6*l+5] = vertex;
111
        }
112

    
113
      return ret;
114
      }
115
    }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118

    
119
  protected ScrambleState[] getScrambleStates()
120
    {
121
    if( mStates==null )
122
      {
123
      int[] numLayers = getNumLayers();
124

    
125
      int X = numLayers[0];
126
      int Y = numLayers[1];
127
      int Z = numLayers[2];
128

    
129
      int[][] mX = new int[16][];
130
      int[][] mY = new int[16][];
131
      int[][] mZ = new int[16][];
132

    
133
      for(int i=0; i<16; i++)
134
        {
135
        mX[i] = createEdges(X,Y==Z,i);
136
        mY[i] = createEdges(Y,X==Z,i);
137
        mZ[i] = createEdges(Z,X==Y,i);
138
        }
139

    
140
      if( X>1 && Y>1 && Z>1 )
141
        {
142
        mStates = new ScrambleState[]
143
          {
144
          new ScrambleState( new int[][] { mX[ 1], mY[ 2], mZ[ 3] } ),  //  0 0
145
          new ScrambleState( new int[][] {   null, mY[ 4], mZ[ 5] } ),  //  1 x
146
          new ScrambleState( new int[][] { mX[ 6],   null, mZ[ 7] } ),  //  2 y
147
          new ScrambleState( new int[][] { mX[ 8], mY[ 9],   null } ),  //  3 z
148
          new ScrambleState( new int[][] { mX[10],   null, mZ[ 7] } ),  //  4 xy
149
          new ScrambleState( new int[][] { mX[11], mY[ 9],   null } ),  //  5 xz
150
          new ScrambleState( new int[][] {   null, mY[12], mZ[ 5] } ),  //  6 yx
151
          new ScrambleState( new int[][] { mX[ 8], mY[13],   null } ),  //  7 yz
152
          new ScrambleState( new int[][] {   null, mY[ 4], mZ[14] } ),  //  8 zx
153
          new ScrambleState( new int[][] { mX[ 6],   null, mZ[15] } ),  //  9 zy
154
          new ScrambleState( new int[][] {   null,   null, mZ[ 5] } ),  // 10 xyx
155
          new ScrambleState( new int[][] {   null, mY[ 4],   null } ),  // 11 xzx
156
          new ScrambleState( new int[][] {   null,   null, mZ[ 7] } ),  // 12 yxy
157
          new ScrambleState( new int[][] { mX[ 6],   null,   null } ),  // 13 yzy
158
          new ScrambleState( new int[][] {   null, mY[ 9],   null } ),  // 14 zxz
159
          new ScrambleState( new int[][] { mX[ 8],   null,   null } ),  // 15 zyz
160
          };
161
        }
162
      else if( X==1 && Y==1 && Z==1 )
163
        {
164
        int[] state = new int[] {0,-1,0,0,1,0,0,2,0};
165

    
166
        mStates = new ScrambleState[]
167
          {
168
          new ScrambleState( new int[][] { state, state, state } )
169
          };
170
        }
171
      else
172
        {
173
        mStates = new ScrambleState[]
174
          {
175
          new ScrambleState( new int[][] { mX[ 0], mY[ 0], mZ[ 0] } )
176
          };
177
        }
178

    
179
      }
180

    
181
    return mStates;
182
    }
183

    
184
///////////////////////////////////////////////////////////////////////////////////////////////////
185

    
186
  protected int getResource(int[] numLayers)
187
    {
188
    int x = numLayers[0];
189
    int y = numLayers[1];
190
    int z = numLayers[2];
191

    
192
    if( x==y && x==z )
193
      {
194
      switch(x)
195
        {
196
        case 2: return R.raw.cube2;
197
        case 3: return R.raw.cube3;
198
        case 4: return R.raw.cube4;
199
        case 5: return R.raw.cube5;
200
        }
201
      }
202

    
203
    return 0;
204
    }
205

    
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207

    
208
  private void initializeQuats()
209
    {
210
    mQuats = new Static4D[]
211
         {
212
         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
213
         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
214
         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
215
         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
216

    
217
         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
218
         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
219
         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
220
         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
221
         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
222
         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
223
         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
224
         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
225
         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
226
         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
227
         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
228
         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
229

    
230
         new Static4D(  0.5f,   0.5f,   0.5f,   0.5f),
231
         new Static4D(  0.5f,   0.5f,  -0.5f,   0.5f),
232
         new Static4D(  0.5f,   0.5f,  -0.5f,  -0.5f),
233
         new Static4D(  0.5f,  -0.5f,   0.5f,  -0.5f),
234
         new Static4D( -0.5f,  -0.5f,  -0.5f,   0.5f),
235
         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
236
         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
237
         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
238
         };
239
    }
240

    
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242

    
243
  protected int[] getSolvedQuats(int cubit, int[] numLayers)
244
    {
245
    if( mQuats ==null ) initializeQuats();
246
    int status = retCubitSolvedStatus(cubit,numLayers);
247
    return status<0 ? null : buildSolvedQuats(Movement6.FACE_AXIS[status], mQuats);
248
    }
249

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

    
252
  protected ObjectShape getObjectShape(int cubit, int[] numLayers)
253
    {
254
    int extraI, extraV, num;
255
    float height;
256
    int variant = getCubitVariant(cubit,numLayers);
257
    int numL = numLayers[0];
258

    
259
    switch(numL)
260
        {
261
        case 2 : num = 6; extraI = 2; extraV = 2; height = 0.045f; break;
262
        case 3 : num = 5; extraI = 2; extraV = 2; height = 0.045f; break;
263
        case 4 : num = 5; extraI = 1; extraV = 1; height = 0.045f; break;
264
        default: num = 5; extraI = 0; extraV = 0; height = 0.045f; break;
265
        }
266

    
267
    double[][] vertices = new double[][]
268
          {
269
              { 0.5, 0.5, 0.5 },
270
              { 0.5, 0.5,-0.5 },
271
              { 0.5,-0.5, 0.5 },
272
              { 0.5,-0.5,-0.5 },
273
              {-0.5, 0.5, 0.5 },
274
              {-0.5, 0.5,-0.5 },
275
              {-0.5,-0.5, 0.5 },
276
              {-0.5,-0.5,-0.5 },
277
          };
278

    
279
    int[][] vert_indices = new int[][]
280
          {
281
              {2,3,1,0},
282
              {7,6,4,5},
283
              {4,0,1,5},
284
              {7,3,2,6},
285
              {6,2,0,4},
286
              {3,7,5,1}
287
          };
288

    
289
    float[][] corners   = new float[][] { {0.036f,0.12f} };
290
    int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
291
    float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
292
    int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
293

    
294
    if( variant==0 )
295
      {
296
      float[][] bands   = new float[][] { {height,35,0.5f,0.7f,num,extraI,extraV} };
297
      int[] bandIndices = new int[] { 0,0,0,0,0,0};
298
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
299
      }
300
    else
301
      {
302
      int extraI2, extraV2, num2;
303

    
304
      switch(numL)
305
        {
306
        case 2 : num2 = 6; extraI2 = 2; extraV2 = 2; break;
307
        case 3 : num2 = 5; extraI2 = 1; extraV2 = 0; break;
308
        case 4 : num2 = 4; extraI2 = 0; extraV2 = 0; break;
309
        default: num2 = 3; extraI2 = 0; extraV2 = 0; break;
310
        }
311

    
312
      float[][] bands   = new float[][]
313
        {
314
          {height,35,0.5f,0.7f,num ,extraI ,extraV },
315
          {height,35,0.5f,0.7f,num2,extraI2,extraV2},
316
          {height,35,0.5f,0.7f,   2,      0,      0},
317
        };
318
      int[] bandIndices = new int[] { 1,1,1,1,0,2};
319
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
320
      }
321
    }
322

    
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324

    
325
  private int getCenterNum(int cubit, int[] numLayers)
326
    {
327
    int num = cubit - getNumCornersAndEdges(numLayers);
328

    
329
    if( num>=0 )
330
      {
331
      int numLR = (numLayers[1]-2)*(numLayers[2]-2);
332
      if( num<  numLR ) return 0;
333
      if( num<2*numLR ) return 1;
334
      num -= 2*numLR;
335

    
336
      int numTD = (numLayers[0]-2)*(numLayers[2]-2);
337
      if( num<  numTD ) return 2;
338
      if( num<2*numTD ) return 3;
339
      num -= 2*numTD;
340

    
341
      int numFB = (numLayers[0]-2)*(numLayers[1]-2);
342
      if( num<  numFB ) return 4;
343
      if( num<2*numFB ) return 5;
344
      }
345

    
346
    return -1;
347
    }
348

    
349
///////////////////////////////////////////////////////////////////////////////////////////////////
350

    
351
  private int getNumCornersAndEdges(int[] numLayers)
352
    {
353
    int x = numLayers[0];
354
    int y = numLayers[1];
355
    int z = numLayers[2];
356

    
357
    return ( x==1 || y==1 || z==1 ) ? x*y*z : 4*( (x-2)+(y-2)+(z-2) ) + 8;
358
    }
359

    
360
///////////////////////////////////////////////////////////////////////////////////////////////////
361

    
362
  protected float[][] getCubitPositions(int[] numLayers)
363
    {
364
    final int X = numLayers[0];
365
    final int Y = numLayers[1];
366
    final int Z = numLayers[2];
367

    
368
    final float lenX = 0.5f*(X-1);
369
    final float lenY = 0.5f*(Y-1);
370
    final float lenZ = 0.5f*(Z-1);
371

    
372
    int curPos = 0;
373

    
374
    if( X==1 )
375
      {
376
      float[][] pos = new float[X*Y*Z][];
377

    
378
      for(int y=0; y<Y; y++)
379
        for(int z=0; z<Z; z++) pos[curPos++] = new float[] {+lenX,y-lenY,z-lenZ};
380

    
381
      return pos;
382
      }
383

    
384
    if( Y==1 )
385
      {
386
      float[][] pos = new float[X*Y*Z][];
387

    
388
      for(int x=0; x<X; x++)
389
        for(int z=0; z<Z; z++) pos[curPos++] = new float[] {x-lenX,+lenY,z-lenZ};
390

    
391
      return pos;
392
      }
393

    
394
    if( Z==1 )
395
      {
396
      float[][] pos = new float[X*Y*Z][];
397

    
398
      for(int x=0; x<X; x++)
399
        for(int y=0; y<Y; y++) pos[curPos++] = new float[] {x-lenX,y-lenY,+lenZ};
400

    
401
      return pos;
402
      }
403

    
404
    int numCubits = X*Y*Z - (X-2)*(Y-2)*(Z-2);
405
    float[][] pos = new float[numCubits][];
406

    
407
    pos[curPos++] = new float[] {-lenX,-lenY,-lenZ};
408
    pos[curPos++] = new float[] {-lenX,-lenY,+lenZ};
409
    pos[curPos++] = new float[] {-lenX,+lenY,-lenZ};
410
    pos[curPos++] = new float[] {-lenX,+lenY,+lenZ};
411
    pos[curPos++] = new float[] {+lenX,-lenY,-lenZ};
412
    pos[curPos++] = new float[] {+lenX,-lenY,+lenZ};
413
    pos[curPos++] = new float[] {+lenX,+lenY,-lenZ};
414
    pos[curPos++] = new float[] {+lenX,+lenY,+lenZ};
415

    
416
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  -lenY,  -lenZ };
417
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  -lenY,  +lenZ };
418
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  +lenY,  -lenZ };
419
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  +lenY,  +lenZ };
420
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  -lenX, i-lenY,  -lenZ };
421
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  -lenX, i-lenY,  +lenZ };
422
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  +lenX, i-lenY,  -lenZ };
423
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  +lenX, i-lenY,  +lenZ };
424
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  -lenX,  -lenY, i-lenZ };
425
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  -lenX,  +lenY, i-lenZ };
426
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  +lenX,  -lenY, i-lenZ };
427
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  +lenX,  +lenY, i-lenZ };
428

    
429
    for(int y=1; y<Y-1; y++)
430
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {+lenX,y-lenY,z-lenZ};
431

    
432
    for(int y=1; y<Y-1; y++)
433
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {-lenX,y-lenY,z-lenZ};
434

    
435
    for(int x=1; x<X-1; x++)
436
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {x-lenX,+lenY,z-lenZ};
437

    
438
    for(int x=1; x<X-1; x++)
439
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {x-lenX,-lenY,z-lenZ};
440

    
441
    for(int x=1; x<X-1; x++)
442
      for(int y=1; y<Y-1; y++) pos[curPos++] = new float[] {x-lenX,y-lenY,+lenZ};
443

    
444
    for(int x=1; x<X-1; x++)
445
      for(int y=1; y<Y-1; y++) pos[curPos++] = new float[] {x-lenX,y-lenY,-lenZ};
446

    
447
    return pos;
448
    }
449

    
450
///////////////////////////////////////////////////////////////////////////////////////////////////
451

    
452
  protected Static4D getQuat(int cubit, int[] numLayers)
453
    {
454
    if( mQuats ==null ) initializeQuats();
455

    
456
    int centerNum = getCenterNum(cubit,numLayers);
457

    
458
    switch(centerNum)
459
      {
460
      case 0 : return mQuats[13];
461
      case 1 : return mQuats[12];
462
      case 2 : return mQuats[ 8];
463
      case 3 : return mQuats[ 9];
464
      case 4 : return mQuats[ 0];
465
      case 5 : return mQuats[ 1];
466
      default: return mQuats[ 0];
467
      }
468
    }
469

    
470
///////////////////////////////////////////////////////////////////////////////////////////////////
471

    
472
  protected int getNumCubitVariants(int[] numLayers)
473
    {
474
    return numLayers[0]>2 ? 2:1;
475
    }
476

    
477
///////////////////////////////////////////////////////////////////////////////////////////////////
478

    
479
  protected int getCubitVariant(int cubit, int[] numLayers)
480
    {
481
    return cubit < getNumCornersAndEdges(numLayers) ? 0 : 1;
482
    }
483

    
484
///////////////////////////////////////////////////////////////////////////////////////////////////
485

    
486
  protected int getFaceColor(int cubit, int cubitface, int[] numLayers)
487
    {
488
    int centerNum = getCenterNum(cubit,numLayers);
489

    
490
    if( centerNum<0 )
491
      {
492
      int axis = cubitface/2;
493
      return CUBITS[cubit].getRotRow(axis) == (cubitface%2==0 ? (1<<(numLayers[axis]-1)):1) ? cubitface : NUM_TEXTURES;
494
      }
495
    else
496
      {
497
      return cubitface == 4 ? centerNum : NUM_TEXTURES;
498
      }
499
    }
500

    
501
///////////////////////////////////////////////////////////////////////////////////////////////////
502

    
503
  protected ObjectSticker retSticker(int face)
504
    {
505
    if( mStickers==null )
506
      {
507
      final float[][] STICKERS = new float[][]  { { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f } };
508
      final float radius = 0.10f;
509
      final float[] radii = {radius,radius,radius,radius};
510
      mStickers = new ObjectSticker[STICKERS.length];
511
      float stroke = 0.08f;
512

    
513
      if( ObjectControl.isInIconMode() )
514
        {
515
        int[] numLayers = getNumLayers();
516

    
517
        switch(numLayers[0])
518
          {
519
          case 2: stroke*=1.8f; break;
520
          case 3: stroke*=2.0f; break;
521
          case 4: stroke*=2.1f; break;
522
          default:stroke*=2.2f; break;
523
          }
524
        }
525

    
526
      mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke );
527
      }
528

    
529
    return mStickers[face/NUM_FACE_COLORS];
530
    }
531

    
532
///////////////////////////////////////////////////////////////////////////////////////////////////
533

    
534
  protected Static4D[] getQuats()
535
    {
536
    if( mQuats ==null ) initializeQuats();
537
    return mQuats;
538
    }
539

    
540
///////////////////////////////////////////////////////////////////////////////////////////////////
541

    
542
  protected float[][] getCuts(int[] numLayers)
543
    {
544
    if( mCuts==null )
545
      {
546
      mCuts = new float[3][];
547

    
548
      for(int axis=0; axis<3; axis++)
549
        {
550
        int len = numLayers[axis];
551
        float start = (2-len)*0.5f;
552

    
553
        if( len>=2 )
554
          {
555
          mCuts[axis] = new float[len-1];
556
          for(int i=0; i<len-1; i++) mCuts[axis][i] = start+i;
557
          }
558
        }
559
      }
560

    
561
    return mCuts;
562
    }
563

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

    
566
  private void getLayerRotatable(int[] numLayers)
567
    {
568
    if( mLayerRotatable==null )
569
      {
570
      int numAxis = ROT_AXIS.length;
571
      mLayerRotatable = new boolean[numAxis][];
572

    
573
      for(int i=0; i<numAxis; i++)
574
        {
575
        mLayerRotatable[i] = new boolean[numLayers[i]];
576
        for(int j=0; j<numLayers[i]; j++) mLayerRotatable[i][j] = true;
577
        }
578
      }
579
    }
580

    
581
///////////////////////////////////////////////////////////////////////////////////////////////////
582

    
583
  protected int getSolvedFunctionIndex()
584
    {
585
    return 0;
586
    }
587

    
588
///////////////////////////////////////////////////////////////////////////////////////////////////
589

    
590
  protected int getNumStickerTypes(int[] numLayers)
591
    {
592
    return 1;
593
    }
594

    
595
///////////////////////////////////////////////////////////////////////////////////////////////////
596

    
597
  protected int getNumCubitFaces()
598
    {
599
    return 6;
600
    }
601

    
602
///////////////////////////////////////////////////////////////////////////////////////////////////
603
// PUBLIC API
604

    
605
  public Static3D[] getRotationAxis()
606
    {
607
    return ROT_AXIS;
608
    }
609

    
610
///////////////////////////////////////////////////////////////////////////////////////////////////
611
// TODO
612

    
613
  public Movement getMovement()
614
    {
615
    if( mMovement==null )
616
      {
617
      int[] numLayers = getNumLayers();
618
      if( mCuts==null ) getCuts(numLayers);
619
      getLayerRotatable(numLayers);
620
      float avg = (numLayers[0]+numLayers[1]+numLayers[2])/3.0f;
621
      mMovement = new Movement6(ROT_AXIS,mCuts,mLayerRotatable,avg,TYPE_NOT_SPLIT,ENABLED);
622
      }
623
    return mMovement;
624
    }
625

    
626
///////////////////////////////////////////////////////////////////////////////////////////////////
627

    
628
  public int[] getBasicAngle()
629
    {
630
    if( mBasicAngle==null )
631
      {
632
      int[] num = getNumLayers();
633
      int x = num[1]==num[2] ? 4 : 2;
634
      int y = num[0]==num[2] ? 4 : 2;
635
      int z = num[0]==num[1] ? 4 : 2;
636

    
637
      mBasicAngle = new int[] { x,y,z };
638
      }
639
    return mBasicAngle;
640
    }
641

    
642
///////////////////////////////////////////////////////////////////////////////////////////////////
643
// TODO
644

    
645
  public ObjectType intGetObjectType(int[] numLayers)
646
    {
647
    switch(numLayers[0])
648
      {
649
      case 2: return ObjectType.CUBE_2;
650
      case 3: return ObjectType.CUBE_3;
651
      case 4: return ObjectType.CUBE_4;
652
      case 5: return ObjectType.CUBE_5;
653
      }
654

    
655
    return ObjectType.CUBE_3;
656
    }
657

    
658
///////////////////////////////////////////////////////////////////////////////////////////////////
659

    
660
  public int getObjectName(int[] numLayers)
661
    {
662
    switch(numLayers[0])
663
      {
664
      case 2: return R.string.cube2;
665
      case 3: return R.string.cube3;
666
      case 4: return R.string.cube4;
667
      case 5: return R.string.cube5;
668
      }
669
    return R.string.cube3;
670
    }
671

    
672
///////////////////////////////////////////////////////////////////////////////////////////////////
673

    
674
  public int getInventor(int[] numLayers)
675
    {
676
    switch(numLayers[0])
677
      {
678
      case 2: return R.string.cube2_inventor;
679
      case 3: return R.string.cube3_inventor;
680
      case 4: return R.string.cube4_inventor;
681
      case 5: return R.string.cube5_inventor;
682
      }
683
    return R.string.cube3_inventor;
684
    }
685

    
686
///////////////////////////////////////////////////////////////////////////////////////////////////
687

    
688
  public int getComplexity(int[] numLayers)
689
    {
690
    switch(numLayers[0])
691
      {
692
      case 2: return 4;
693
      case 3: return 6;
694
      case 4: return 8;
695
      case 5: return 10;
696
      }
697
    return 6;
698
    }
699
}
(6-6/25)