Project

General

Profile

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

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

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
      int lenX = numLayers[0];
549

    
550
      if( lenX>=2 )
551
        {
552
        mCuts[0] = new float[lenX-1];
553
        for(int i=0; i<lenX-1; i++) mCuts[0][i] = (2-lenX)*0.5f + i;
554
        }
555
      else
556
        {
557
        mCuts[0] = null;
558
        }
559

    
560
      int lenY = numLayers[1];
561

    
562
      if( lenY>=2 )
563
        {
564
        mCuts[1] = new float[lenY-1];
565
        for(int i=0; i<lenY-1; i++) mCuts[1][i] = (2-lenY)*0.5f + i;
566
        }
567
      else
568
        {
569
        mCuts[1] = null;
570
        }
571

    
572
      int lenZ = numLayers[2];
573

    
574
      if( lenZ>=2 )
575
        {
576
        mCuts[2] = new float[lenZ-1];
577
        for(int i=0; i<lenZ-1; i++) mCuts[2][i] = (2-lenZ)*0.5f + i;
578
        }
579
      else
580
        {
581
        mCuts[2] = null;
582
        }
583
      }
584

    
585
    return mCuts;
586
    }
587

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

    
590
  private void getLayerRotatable(int[] numLayers)
591
    {
592
    if( mLayerRotatable==null )
593
      {
594
      int numAxis = ROT_AXIS.length;
595
      mLayerRotatable = new boolean[numAxis][];
596

    
597
      for(int i=0; i<numAxis; i++)
598
        {
599
        mLayerRotatable[i] = new boolean[numLayers[i]];
600
        for(int j=0; j<numLayers[i]; j++) mLayerRotatable[i][j] = true;
601
        }
602
      }
603
    }
604

    
605
///////////////////////////////////////////////////////////////////////////////////////////////////
606

    
607
  protected int getSolvedFunctionIndex()
608
    {
609
    return 0;
610
    }
611

    
612
///////////////////////////////////////////////////////////////////////////////////////////////////
613

    
614
  protected int getNumStickerTypes(int[] numLayers)
615
    {
616
    return 1;
617
    }
618

    
619
///////////////////////////////////////////////////////////////////////////////////////////////////
620

    
621
  protected int getNumCubitFaces()
622
    {
623
    return 6;
624
    }
625

    
626
///////////////////////////////////////////////////////////////////////////////////////////////////
627
// PUBLIC API
628

    
629
  public Static3D[] getRotationAxis()
630
    {
631
    return ROT_AXIS;
632
    }
633

    
634
///////////////////////////////////////////////////////////////////////////////////////////////////
635
// TODO
636

    
637
  public Movement getMovement()
638
    {
639
    if( mMovement==null )
640
      {
641
      int[] numLayers = getNumLayers();
642
      if( mCuts==null ) getCuts(numLayers);
643
      getLayerRotatable(numLayers);
644
      mMovement = new Movement6(ROT_AXIS,mCuts,mLayerRotatable,numLayers[0],TYPE_NOT_SPLIT,ENABLED);
645
      }
646
    return mMovement;
647
    }
648

    
649
///////////////////////////////////////////////////////////////////////////////////////////////////
650

    
651
  public int[] getBasicAngle()
652
    {
653
    if( mBasicAngle==null )
654
      {
655
      int[] num = getNumLayers();
656
      int x = num[1]==num[2] ? 4 : 2;
657
      int y = num[0]==num[2] ? 4 : 2;
658
      int z = num[0]==num[1] ? 4 : 2;
659

    
660
      mBasicAngle = new int[] { x,y,z };
661
      }
662
    return mBasicAngle;
663
    }
664

    
665
///////////////////////////////////////////////////////////////////////////////////////////////////
666
// TODO
667

    
668
  public ObjectType intGetObjectType(int[] numLayers)
669
    {
670
    switch(numLayers[0])
671
      {
672
      case 2: return numLayers[1]==2 ? ObjectType.CUBE_2 : ObjectType.CU_223;
673
      case 3: return numLayers[1]==3 ? ObjectType.CUBE_3 : ObjectType.CU_334;
674
      case 4: return ObjectType.CUBE_4;
675
      case 5: return ObjectType.CUBE_5;
676
      }
677

    
678
    return ObjectType.CUBE_3;
679
    }
680

    
681
///////////////////////////////////////////////////////////////////////////////////////////////////
682

    
683
  public int getObjectName(int[] numLayers)
684
    {
685
    switch(numLayers[0])
686
      {
687
      case 2: return R.string.cube2;
688
      case 3: return R.string.cube3;
689
      case 4: return R.string.cube4;
690
      case 5: return R.string.cube5;
691
      }
692
    return R.string.cube3;
693
    }
694

    
695
///////////////////////////////////////////////////////////////////////////////////////////////////
696

    
697
  public int getInventor(int[] numLayers)
698
    {
699
    switch(numLayers[0])
700
      {
701
      case 2: return R.string.cube2_inventor;
702
      case 3: return R.string.cube3_inventor;
703
      case 4: return R.string.cube4_inventor;
704
      case 5: return R.string.cube5_inventor;
705
      }
706
    return R.string.cube3_inventor;
707
    }
708

    
709
///////////////////////////////////////////////////////////////////////////////////////////////////
710

    
711
  public int getComplexity(int[] numLayers)
712
    {
713
    switch(numLayers[0])
714
      {
715
      case 2: return 4;
716
      case 3: return 6;
717
      case 4: return 8;
718
      case 5: return 10;
719
      }
720
    return 6;
721
    }
722
}
(6-6/25)