Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyCube.java @ dfdb26a9

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 TwistyCube 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 TwistyCube(int[] numL, Static4D quat, Static3D move, DistortedTexture texture,
69
                    MeshSquare mesh, DistortedEffects effects, Resources res, int scrWidth)
70
    {
71
    super(numL, numL[0], quat, move, texture, mesh, effects, res, scrWidth);
72
    }
73

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

    
76
  private int[] createEdges(int size, int vertex)
77
    {
78
    int[] ret = new int[9*size];
79

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

    
93
    return ret;
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  protected ScrambleState[] getScrambleStates()
99
    {
100
    if( mStates==null )
101
      {
102
      int[] numL = getNumLayers();
103
      int[][] m = new int[16][];
104
      for(int i=1; i<16; i++) m[i] = createEdges(numL[0],i);
105

    
106
      mStates = new ScrambleState[]
107
        {
108
        new ScrambleState( new int[][] { m[ 1], m[ 2], m[ 3] } ),  //  0 0
109
        new ScrambleState( new int[][] {  null, m[ 4], m[ 5] } ),  //  1 x
110
        new ScrambleState( new int[][] { m[ 6],  null, m[ 7] } ),  //  2 y
111
        new ScrambleState( new int[][] { m[ 8], m[ 9],  null } ),  //  3 z
112
        new ScrambleState( new int[][] { m[10],  null, m[ 7] } ),  //  4 xy
113
        new ScrambleState( new int[][] { m[11], m[ 9],  null } ),  //  5 xz
114
        new ScrambleState( new int[][] {  null, m[12], m[ 5] } ),  //  6 yx
115
        new ScrambleState( new int[][] { m[ 8], m[13],  null } ),  //  7 yz
116
        new ScrambleState( new int[][] {  null, m[ 4], m[14] } ),  //  8 zx
117
        new ScrambleState( new int[][] { m[ 6],  null, m[15] } ),  //  9 zy
118
        new ScrambleState( new int[][] {  null,  null, m[ 5] } ),  // 10 xyx
119
        new ScrambleState( new int[][] {  null, m[ 4],  null } ),  // 11 xzx
120
        new ScrambleState( new int[][] {  null,  null, m[ 7] } ),  // 12 yxy
121
        new ScrambleState( new int[][] { m[ 6],  null,  null } ),  // 13 yzy
122
        new ScrambleState( new int[][] {  null, m[ 9],  null } ),  // 14 zxz
123
        new ScrambleState( new int[][] { m[ 8],  null,  null } ),  // 15 zyz
124
        };
125
      }
126

    
127
    return mStates;
128
    }
129

    
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131
// TODO
132

    
133
  protected int getResource(int[] numLayers)
134
    {
135
    switch(numLayers[0])
136
      {
137
      case 2: return R.raw.cube2;
138
      case 3: return R.raw.cube3;
139
      case 4: return R.raw.cube4;
140
      case 5: return R.raw.cube5;
141
      }
142

    
143
    return 0;
144
    }
145

    
146
///////////////////////////////////////////////////////////////////////////////////////////////////
147

    
148
  private void initializeQuats()
149
    {
150
    mQuats = new Static4D[]
151
         {
152
         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
153
         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
154
         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
155
         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
156

    
157
         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
158
         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
159
         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
160
         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
161
         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
162
         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
163
         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
164
         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
165
         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
166
         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
167
         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
168
         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
169

    
170
         new Static4D(  0.5f,   0.5f,   0.5f,   0.5f),
171
         new Static4D(  0.5f,   0.5f,  -0.5f,   0.5f),
172
         new Static4D(  0.5f,   0.5f,  -0.5f,  -0.5f),
173
         new Static4D(  0.5f,  -0.5f,   0.5f,  -0.5f),
174
         new Static4D( -0.5f,  -0.5f,  -0.5f,   0.5f),
175
         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
176
         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
177
         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
178
         };
179
    }
180

    
181
///////////////////////////////////////////////////////////////////////////////////////////////////
182

    
183
  protected int[] getSolvedQuats(int cubit, int[] numLayers)
184
    {
185
    if( mQuats ==null ) initializeQuats();
186
    int status = retCubitSolvedStatus(cubit,numLayers);
187
    return status<0 ? null : buildSolvedQuats(Movement6.FACE_AXIS[status], mQuats);
188
    }
189

    
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

    
192
  protected ObjectShape getObjectShape(int cubit, int[] numLayers)
193
    {
194
    int extraI, extraV, num;
195
    float height;
196
    int variant = getCubitVariant(cubit,numLayers);
197
    int numL = numLayers[0];
198

    
199
    switch(numL)
200
        {
201
        case 2 : num = 6; extraI = 2; extraV = 2; height = 0.045f; break;
202
        case 3 : num = 5; extraI = 2; extraV = 2; height = 0.045f; break;
203
        case 4 : num = 5; extraI = 1; extraV = 1; height = 0.045f; break;
204
        default: num = 5; extraI = 0; extraV = 0; height = 0.045f; break;
205
        }
206

    
207
    double[][] vertices = new double[][]
208
          {
209
              { 0.5, 0.5, 0.5 },
210
              { 0.5, 0.5,-0.5 },
211
              { 0.5,-0.5, 0.5 },
212
              { 0.5,-0.5,-0.5 },
213
              {-0.5, 0.5, 0.5 },
214
              {-0.5, 0.5,-0.5 },
215
              {-0.5,-0.5, 0.5 },
216
              {-0.5,-0.5,-0.5 },
217
          };
218

    
219
    int[][] vert_indices = new int[][]
220
          {
221
              {2,3,1,0},
222
              {7,6,4,5},
223
              {4,0,1,5},
224
              {7,3,2,6},
225
              {6,2,0,4},
226
              {3,7,5,1}
227
          };
228

    
229
    float[][] corners   = new float[][] { {0.036f,0.12f} };
230
    int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
231
    float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
232
    int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
233

    
234
    if( variant==0 )
235
      {
236
      float[][] bands   = new float[][] { {height,35,0.5f,0.7f,num,extraI,extraV} };
237
      int[] bandIndices = new int[] { 0,0,0,0,0,0};
238
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
239
      }
240
    else
241
      {
242
      int extraI2, extraV2, num2;
243

    
244
      switch(numL)
245
        {
246
        case 2 : num2 = 6; extraI2 = 2; extraV2 = 2; break;
247
        case 3 : num2 = 5; extraI2 = 1; extraV2 = 0; break;
248
        case 4 : num2 = 4; extraI2 = 0; extraV2 = 0; break;
249
        default: num2 = 3; extraI2 = 0; extraV2 = 0; break;
250
        }
251

    
252
      float[][] bands   = new float[][]
253
        {
254
          {height,35,0.5f,0.7f,num ,extraI ,extraV },
255
          {height,35,0.5f,0.7f,num2,extraI2,extraV2},
256
          {height,35,0.5f,0.7f,   2,      0,      0},
257
        };
258
      int[] bandIndices = new int[] { 1,1,1,1,0,2};
259
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
260
      }
261
    }
262

    
263
///////////////////////////////////////////////////////////////////////////////////////////////////
264

    
265
  private int getCenterNum(int cubit, int[] numLayers)
266
    {
267
    int num = cubit - getNumCornersAndEdges(numLayers);
268

    
269
    if( num>=0 )
270
      {
271
      int numLR = (numLayers[1]-2)*(numLayers[2]-2);
272
      if( num<  numLR ) return 0;
273
      if( num<2*numLR ) return 1;
274
      num -= 2*numLR;
275

    
276
      int numTD = (numLayers[0]-2)*(numLayers[2]-2);
277
      if( num<  numTD ) return 2;
278
      if( num<2*numTD ) return 3;
279
      num -= 2*numTD;
280

    
281
      int numFB = (numLayers[0]-2)*(numLayers[1]-2);
282
      if( num<  numFB ) return 4;
283
      if( num<2*numFB ) return 5;
284
      }
285

    
286
    return -1;
287
    }
288

    
289
///////////////////////////////////////////////////////////////////////////////////////////////////
290

    
291
  private int getNumCornersAndEdges(int[] numLayers)
292
    {
293
    int x = numLayers[0];
294
    int y = numLayers[1];
295
    int z = numLayers[2];
296

    
297
    return ( x==1 || y==1 || z==1 ) ? x*y*z : 4*( (x-2)+(y-2)+(z-2) ) + 8;
298
    }
299

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301

    
302
  protected float[][] getCubitPositions(int[] numLayers)
303
    {
304
    final int X = numLayers[0];
305
    final int Y = numLayers[1];
306
    final int Z = numLayers[2];
307

    
308
    final float lenX = 0.5f*(X-1);
309
    final float lenY = 0.5f*(Y-1);
310
    final float lenZ = 0.5f*(Z-1);
311

    
312
    if( X==1 || Y==1 || Z==1 )
313
      {
314
      int numCubits = X*Y*Z;
315
      float[][] tmp = new float[numCubits][];
316

    
317
      // TODO ...
318
      }
319

    
320
    int numCubits = X*Y*Z - (X-2)*(Y-2)*(Z-2);
321
    float[][] tmp = new float[numCubits][];
322

    
323
    int currentPosition = 0;
324

    
325
    tmp[currentPosition++] = new float[] {-lenX,-lenY,-lenZ};
326
    tmp[currentPosition++] = new float[] {-lenX,-lenY,+lenZ};
327
    tmp[currentPosition++] = new float[] {-lenX,+lenY,-lenZ};
328
    tmp[currentPosition++] = new float[] {-lenX,+lenY,+lenZ};
329
    tmp[currentPosition++] = new float[] {+lenX,-lenY,-lenZ};
330
    tmp[currentPosition++] = new float[] {+lenX,-lenY,+lenZ};
331
    tmp[currentPosition++] = new float[] {+lenX,+lenY,-lenZ};
332
    tmp[currentPosition++] = new float[] {+lenX,+lenY,+lenZ};
333

    
334
    for(int i=1; i<X-1; i++)
335
      tmp[currentPosition++] = new float[] { i-lenX,  -lenY,  -lenZ };
336
    for(int i=1; i<X-1; i++)
337
      tmp[currentPosition++] = new float[] { i-lenX,  -lenY,  +lenZ };
338
    for(int i=1; i<X-1; i++)
339
      tmp[currentPosition++] = new float[] { i-lenX,  +lenY,  -lenZ };
340
    for(int i=1; i<X-1; i++)
341
      tmp[currentPosition++] = new float[] { i-lenX,  +lenY,  +lenZ };
342
    for(int i=1; i<Y-1; i++)
343
      tmp[currentPosition++] = new float[] {  -lenX, i-lenY,  -lenZ };
344
    for(int i=1; i<Y-1; i++)
345
      tmp[currentPosition++] = new float[] {  -lenX, i-lenY,  +lenZ };
346
    for(int i=1; i<Y-1; i++)
347
      tmp[currentPosition++] = new float[] {  +lenX, i-lenY,  -lenZ };
348
    for(int i=1; i<Y-1; i++)
349
      tmp[currentPosition++] = new float[] {  +lenX, i-lenY,  +lenZ };
350
    for(int i=1; i<Z-1; i++)
351
      tmp[currentPosition++] = new float[] {  -lenX,  -lenY, i-lenZ };
352
    for(int i=1; i<Z-1; i++)
353
      tmp[currentPosition++] = new float[] {  -lenX,  +lenY, i-lenZ };
354
    for(int i=1; i<Z-1; i++)
355
      tmp[currentPosition++] = new float[] {  +lenX,  -lenY, i-lenZ };
356
    for(int i=1; i<Z-1; i++)
357
      tmp[currentPosition++] = new float[] {  +lenX,  +lenY, i-lenZ };
358

    
359
    for(int y=1; y<Y-1; y++)
360
      for(int z=1; z<Z-1; z++)
361
        tmp[currentPosition++] = new float[] {+lenX,y-lenY,z-lenZ};
362

    
363
    for(int y=1; y<Y-1; y++)
364
      for(int z=1; z<Z-1; z++)
365
        tmp[currentPosition++] = new float[] {-lenX,y-lenY,z-lenZ};
366

    
367
    for(int x=1; x<X-1; x++)
368
      for(int z=1; z<Z-1; z++)
369
        tmp[currentPosition++] = new float[] {x-lenX,+lenY,z-lenZ};
370

    
371
    for(int x=1; x<X-1; x++)
372
      for(int z=1; z<Z-1; z++)
373
        tmp[currentPosition++] = new float[] {x-lenX,-lenY,z-lenZ};
374

    
375
    for(int x=1; x<X-1; x++)
376
      for(int y=1; y<Y-1; y++)
377
        tmp[currentPosition++] = new float[] {x-lenX,y-lenY,+lenZ};
378

    
379
    for(int x=1; x<X-1; x++)
380
      for(int y=1; y<Y-1; y++)
381
        tmp[currentPosition++] = new float[] {x-lenX,y-lenY,-lenZ};
382

    
383
    return tmp;
384
    }
385

    
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387

    
388
  protected Static4D getQuat(int cubit, int[] numLayers)
389
    {
390
    if( mQuats ==null ) initializeQuats();
391

    
392
    int centerNum = getCenterNum(cubit,numLayers);
393

    
394
    switch(centerNum)
395
      {
396
      case 0 : return mQuats[13];
397
      case 1 : return mQuats[12];
398
      case 2 : return mQuats[ 8];
399
      case 3 : return mQuats[ 9];
400
      case 4 : return mQuats[ 0];
401
      case 5 : return mQuats[ 1];
402
      default: return mQuats[ 0];
403
      }
404
    }
405

    
406
///////////////////////////////////////////////////////////////////////////////////////////////////
407

    
408
  protected int getNumCubitVariants(int[] numLayers)
409
    {
410
    return numLayers[0]>2 ? 2:1;
411
    }
412

    
413
///////////////////////////////////////////////////////////////////////////////////////////////////
414

    
415
  protected int getCubitVariant(int cubit, int[] numLayers)
416
    {
417
    return cubit < getNumCornersAndEdges(numLayers) ? 0 : 1;
418
    }
419

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

    
422
  protected int getFaceColor(int cubit, int cubitface, int[] numLayers)
423
    {
424
    int centerNum = getCenterNum(cubit,numLayers);
425

    
426
    if( centerNum<0 )
427
      {
428
      int axis = cubitface/2;
429
      return CUBITS[cubit].getRotRow(axis) == (cubitface%2==0 ? (1<<(numLayers[axis]-1)):1) ? cubitface : NUM_TEXTURES;
430
      }
431
    else
432
      {
433
      return cubitface == 4 ? centerNum : NUM_TEXTURES;
434
      }
435
    }
436

    
437
///////////////////////////////////////////////////////////////////////////////////////////////////
438

    
439
  protected ObjectSticker retSticker(int face)
440
    {
441
    if( mStickers==null )
442
      {
443
      final float[][] STICKERS = new float[][]  { { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f } };
444
      final float radius = 0.10f;
445
      final float[] radii = {radius,radius,radius,radius};
446
      mStickers = new ObjectSticker[STICKERS.length];
447
      float stroke = 0.08f;
448

    
449
      if( ObjectControl.isInIconMode() )
450
        {
451
        int[] numLayers = getNumLayers();
452

    
453
        switch(numLayers[0])
454
          {
455
          case 2: stroke*=1.8f; break;
456
          case 3: stroke*=2.0f; break;
457
          case 4: stroke*=2.1f; break;
458
          default:stroke*=2.2f; break;
459
          }
460
        }
461

    
462
      mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke );
463
      }
464

    
465
    return mStickers[face/NUM_FACE_COLORS];
466
    }
467

    
468
///////////////////////////////////////////////////////////////////////////////////////////////////
469

    
470
  protected Static4D[] getQuats()
471
    {
472
    if( mQuats ==null ) initializeQuats();
473
    return mQuats;
474
    }
475

    
476
///////////////////////////////////////////////////////////////////////////////////////////////////
477

    
478
  protected float[][] getCuts(int[] numLayers)
479
    {
480
    if( mCuts==null )
481
      {
482
      mCuts = new float[3][];
483

    
484
      int lenX = numLayers[0];
485

    
486
      if( lenX>=2 )
487
        {
488
        mCuts[0] = new float[lenX-1];
489
        for(int i=0; i<lenX-1; i++) mCuts[0][i] = (2-lenX)*0.5f + i;
490
        }
491
      else
492
        {
493
        mCuts[0] = null;
494
        }
495

    
496
      int lenY = numLayers[1];
497

    
498
      if( lenY>=2 )
499
        {
500
        mCuts[1] = new float[lenY-1];
501
        for(int i=0; i<lenY-1; i++) mCuts[1][i] = (2-lenY)*0.5f + i;
502
        }
503
      else
504
        {
505
        mCuts[1] = null;
506
        }
507

    
508
      int lenZ = numLayers[2];
509

    
510
      if( lenZ>=2 )
511
        {
512
        mCuts[2] = new float[lenZ-1];
513
        for(int i=0; i<lenZ-1; i++) mCuts[2][i] = (2-lenZ)*0.5f + i;
514
        }
515
      else
516
        {
517
        mCuts[2] = null;
518
        }
519
      }
520

    
521
    return mCuts;
522
    }
523

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

    
526
  private void getLayerRotatable(int[] numLayers)
527
    {
528
    if( mLayerRotatable==null )
529
      {
530
      int numAxis = ROT_AXIS.length;
531
      mLayerRotatable = new boolean[numAxis][];
532

    
533
      for(int i=0; i<numAxis; i++)
534
        {
535
        mLayerRotatable[i] = new boolean[numLayers[i]];
536
        for(int j=0; j<numLayers[i]; j++) mLayerRotatable[i][j] = true;
537
        }
538
      }
539
    }
540

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

    
543
  protected int getSolvedFunctionIndex()
544
    {
545
    return 0;
546
    }
547

    
548
///////////////////////////////////////////////////////////////////////////////////////////////////
549

    
550
  protected int getNumStickerTypes(int[] numLayers)
551
    {
552
    return 1;
553
    }
554

    
555
///////////////////////////////////////////////////////////////////////////////////////////////////
556

    
557
  protected int getNumCubitFaces()
558
    {
559
    return 6;
560
    }
561

    
562
///////////////////////////////////////////////////////////////////////////////////////////////////
563
// PUBLIC API
564

    
565
  public Static3D[] getRotationAxis()
566
    {
567
    return ROT_AXIS;
568
    }
569

    
570
///////////////////////////////////////////////////////////////////////////////////////////////////
571
// TODO
572

    
573
  public Movement getMovement()
574
    {
575
    if( mMovement==null )
576
      {
577
      int[] numLayers = getNumLayers();
578
      if( mCuts==null ) getCuts(numLayers);
579
      getLayerRotatable(numLayers);
580
      mMovement = new Movement6(ROT_AXIS,mCuts,mLayerRotatable,numLayers[0],TYPE_NOT_SPLIT,ENABLED);
581
      }
582
    return mMovement;
583
    }
584

    
585
///////////////////////////////////////////////////////////////////////////////////////////////////
586

    
587
  public int[] getBasicAngle()
588
    {
589
    if( mBasicAngle==null )
590
      {
591
      int[] num = getNumLayers();
592
      int x = num[1]==num[2] ? 4 : 2;
593
      int y = num[0]==num[2] ? 4 : 2;
594
      int z = num[0]==num[1] ? 4 : 2;
595

    
596
      mBasicAngle = new int[] { x,y,z };
597
      }
598
    return mBasicAngle;
599
    }
600

    
601
///////////////////////////////////////////////////////////////////////////////////////////////////
602
// TODO
603

    
604
  public ObjectType intGetObjectType(int[] numLayers)
605
    {
606
    switch(numLayers[0])
607
      {
608
      case 2: return numLayers[1]==2 ? ObjectType.CUBE_2 : ObjectType.CU_223;
609
      case 3: return numLayers[1]==3 ? ObjectType.CUBE_3 : ObjectType.CU_334;
610
      case 4: return ObjectType.CUBE_4;
611
      case 5: return ObjectType.CUBE_5;
612
      }
613

    
614
    return ObjectType.CUBE_3;
615
    }
616

    
617
///////////////////////////////////////////////////////////////////////////////////////////////////
618

    
619
  public int getObjectName(int[] numLayers)
620
    {
621
    switch(numLayers[0])
622
      {
623
      case 2: return R.string.cube2;
624
      case 3: return R.string.cube3;
625
      case 4: return R.string.cube4;
626
      case 5: return R.string.cube5;
627
      }
628
    return R.string.cube3;
629
    }
630

    
631
///////////////////////////////////////////////////////////////////////////////////////////////////
632

    
633
  public int getInventor(int[] numLayers)
634
    {
635
    switch(numLayers[0])
636
      {
637
      case 2: return R.string.cube2_inventor;
638
      case 3: return R.string.cube3_inventor;
639
      case 4: return R.string.cube4_inventor;
640
      case 5: return R.string.cube5_inventor;
641
      }
642
    return R.string.cube3_inventor;
643
    }
644

    
645
///////////////////////////////////////////////////////////////////////////////////////////////////
646

    
647
  public int getComplexity(int[] numLayers)
648
    {
649
    switch(numLayers[0])
650
      {
651
      case 2: return 4;
652
      case 3: return 6;
653
      case 4: return 8;
654
      case 5: return 10;
655
      }
656
    return 6;
657
    }
658
}
(6-6/25)