Project

General

Profile

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

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

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.MovementC;
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(MovementC.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

    
612
  public Movement getMovement()
613
    {
614
    if( mMovement==null )
615
      {
616
      int[] numLayers = getNumLayers();
617
      if( mCuts==null ) getCuts(numLayers);
618
      getLayerRotatable(numLayers);
619
      float avg = (numLayers[0]+numLayers[1]+numLayers[2])/3.0f;
620

    
621
      float[] dist3D =
622
        {
623
        0.5f*numLayers[0]/avg,
624
        0.5f*numLayers[0]/avg,
625
        0.5f*numLayers[1]/avg,
626
        0.5f*numLayers[1]/avg,
627
        0.5f*numLayers[2]/avg,
628
        0.5f*numLayers[2]/avg,
629
        };
630

    
631
      mMovement = new MovementC(ROT_AXIS,mCuts,mLayerRotatable,avg,TYPE_NOT_SPLIT,ENABLED,dist3D);
632
      }
633
    return mMovement;
634
    }
635

    
636
///////////////////////////////////////////////////////////////////////////////////////////////////
637

    
638
  public int[] getBasicAngle()
639
    {
640
    if( mBasicAngle==null )
641
      {
642
      int[] num = getNumLayers();
643
      int x = num[1]==num[2] ? 4 : 2;
644
      int y = num[0]==num[2] ? 4 : 2;
645
      int z = num[0]==num[1] ? 4 : 2;
646

    
647
      mBasicAngle = new int[] { x,y,z };
648
      }
649
    return mBasicAngle;
650
    }
651

    
652
///////////////////////////////////////////////////////////////////////////////////////////////////
653
// TODO
654

    
655
  public ObjectType intGetObjectType(int[] numLayers)
656
    {
657
    switch(numLayers[0])
658
      {
659
      case 2: return ObjectType.CUBE_2;
660
      case 3: return ObjectType.CUBE_3;
661
      case 4: return ObjectType.CUBE_4;
662
      case 5: return ObjectType.CUBE_5;
663
      }
664

    
665
    return ObjectType.CUBE_3;
666
    }
667

    
668
///////////////////////////////////////////////////////////////////////////////////////////////////
669

    
670
  public int getObjectName(int[] numLayers)
671
    {
672
    switch(numLayers[0])
673
      {
674
      case 2: return R.string.cube2;
675
      case 3: return R.string.cube3;
676
      case 4: return R.string.cube4;
677
      case 5: return R.string.cube5;
678
      }
679
    return R.string.cube3;
680
    }
681

    
682
///////////////////////////////////////////////////////////////////////////////////////////////////
683

    
684
  public int getInventor(int[] numLayers)
685
    {
686
    switch(numLayers[0])
687
      {
688
      case 2: return R.string.cube2_inventor;
689
      case 3: return R.string.cube3_inventor;
690
      case 4: return R.string.cube4_inventor;
691
      case 5: return R.string.cube5_inventor;
692
      }
693
    return R.string.cube3_inventor;
694
    }
695

    
696
///////////////////////////////////////////////////////////////////////////////////////////////////
697

    
698
  public int getComplexity(int[] numLayers)
699
    {
700
    switch(numLayers[0])
701
      {
702
      case 2: return 4;
703
      case 3: return 6;
704
      case 4: return 8;
705
      case 5: return 10;
706
      }
707
    return 6;
708
    }
709
}
(6-6/25)