Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistySkewb.java @ 8592461c

1 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.objectlib.objects;
21
22
import static org.distorted.objectlib.main.Movement.TYPE_SPLIT_CORNER;
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 8592461c Leszek Koltunski
import org.distorted.objectlib.main.ObjectControl;
36 8005e762 Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
37 198c5bf0 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectShape;
38
import org.distorted.objectlib.helpers.ObjectSticker;
39
import org.distorted.objectlib.helpers.ScrambleState;
40 29b82486 Leszek Koltunski
import org.distorted.objectlib.main.Twisty6;
41
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43
44
public class TwistySkewb extends Twisty6
45
{
46
  static final Static3D[] ROT_AXIS = new Static3D[]
47
         {
48
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
49
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
50
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
51
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
52
         };
53
54
  private static final int[][][] ENABLED = new int[][][]
55
      {
56
          {{0,1},{3,1},{2,3},{0,2}},
57
          {{2,3},{3,1},{0,1},{0,2}},
58
          {{1,2},{0,1},{0,3},{2,3}},
59
          {{1,2},{2,3},{0,3},{0,1}},
60
          {{0,3},{0,2},{1,2},{1,3}},
61
          {{1,2},{0,2},{0,3},{1,3}},
62
      };
63
64
  private ScrambleState[] mStates;
65
  private int[] mBasicAngle;
66
  private Static4D[] mQuats;
67
  private float[][] mCuts;
68
  private boolean[][] mLayerRotatable;
69
  private int[][] mCornerMap,mEdgeMap,mCenterMap;
70
  private ObjectSticker[] mStickers;
71
  private Movement mMovement;
72
73
///////////////////////////////////////////////////////////////////////////////////////////////////
74
75 ecf3d6e3 Leszek Koltunski
  public TwistySkewb(int size, Static4D quat, Static3D move, DistortedTexture texture,
76
                     MeshSquare mesh, DistortedEffects effects, Resources res, int scrWidth)
77 29b82486 Leszek Koltunski
    {
78 ecf3d6e3 Leszek Koltunski
    super(size, 2*size-2, quat, move, texture, mesh, effects, res, scrWidth);
79 29b82486 Leszek Koltunski
    }
80
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83
  protected ScrambleState[] getScrambleStates()
84
    {
85
    if( mStates==null )
86
      {
87
      int size = getNumLayers();
88
      int[] tmp = {0,-1,0, 0,1,0, size-1,-1,0, size-1,1,0 };
89
90
      mStates = new ScrambleState[]
91
        {
92
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
93
        };
94
      }
95
96
    return mStates;
97
    }
98
99 4e1dc313 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
100
101
  protected int getResource(int numLayers)
102
    {
103
    switch(numLayers)
104
      {
105
      case 2: return R.raw.skew2;
106
      case 3: return R.raw.skew3;
107
      }
108
109
    return 0;
110
    }
111
112 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
113
114
  private void initializeQuats()
115
    {
116
    mQuats = new Static4D[]
117
         {
118
         new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),
119
         new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
120
         new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
121
         new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
122
123
         new Static4D(  0.5f,  0.5f,  0.5f,  0.5f ),
124
         new Static4D(  0.5f,  0.5f,  0.5f, -0.5f ),
125
         new Static4D(  0.5f,  0.5f, -0.5f,  0.5f ),
126
         new Static4D(  0.5f,  0.5f, -0.5f, -0.5f ),
127
         new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
128
         new Static4D(  0.5f, -0.5f,  0.5f, -0.5f ),
129
         new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
130
         new Static4D(  0.5f, -0.5f, -0.5f, -0.5f )
131
         };
132
    }
133
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135
136
  protected int[] getSolvedQuats(int cubit, int numLayers)
137
    {
138
    if( mQuats==null ) initializeQuats();
139
    int status = retCubitSolvedStatus(cubit,numLayers);
140
    return status<0 ? null : buildSolvedQuats(Movement6.FACE_AXIS[status],mQuats);
141
    }
142
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144
145
  private int getNumCorners()
146
    {
147
    return 8;
148
    }
149
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151
152
  private int getNumEdges(int layers)
153
    {
154
    return (layers-2)*12;
155
    }
156
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158
159
  private int getNumCentersPerFace(int layers)
160
    {
161
    return ((layers-2)*(layers-2) + (layers-1)*(layers-1));
162
    }
163
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165
166
  protected Static4D[] getQuats()
167
    {
168
    if( mQuats==null ) initializeQuats();
169
    return mQuats;
170
    }
171
172
///////////////////////////////////////////////////////////////////////////////////////////////////
173
174
  protected int getSolvedFunctionIndex()
175
    {
176
    return 0;
177
    }
178
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180
181
  protected int getNumStickerTypes(int numLayers)
182
    {
183
    return 3;
184
    }
185
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187
188
  protected float[][] getCuts(int numLayers)
189
    {
190
    if( mCuts==null )
191
      {
192
      float[] c = numLayers==2 ? (new float[] {0.0f}) : (new float[] {-SQ3/6,+SQ3/6});
193
      mCuts = new float[][] {c,c,c,c};
194
      }
195
196
    return mCuts;
197
    }
198
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200
201
  private void getLayerRotatable(int numLayers)
202
    {
203
    if( mLayerRotatable==null )
204
      {
205
      int numAxis = ROT_AXIS.length;
206
      boolean[] tmp = numLayers==2 ? (new boolean[] {true,true}) : (new boolean[] {true,false,true});
207
      mLayerRotatable = new boolean[numAxis][];
208
      for(int i=0; i<numAxis; i++) mLayerRotatable[i] = tmp;
209
      }
210
    }
211
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213
214
  protected int getNumCubitFaces()
215
    {
216
    return 6;
217
    }
218
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220
221
  protected float[][] getCubitPositions(int numLayers)
222
    {
223
    final float DIST_CORNER = numLayers-1;
224
    final float DIST_EDGE   = numLayers-1;
225
    final float DIST_CENTER = numLayers-1;
226
227
    final int numCorners = getNumCorners();
228
    final int numEdges   = getNumEdges(numLayers);
229
    final int numCenters = 6*getNumCentersPerFace(numLayers);
230
231
    final float[][] CENTERS = new float[numCorners+numEdges+numCenters][];
232
233
    /// CORNERS //////////////////////////////////////////////
234
235
    CENTERS[0] = new float[] { DIST_CORNER, DIST_CORNER, DIST_CORNER };
236
    CENTERS[1] = new float[] { DIST_CORNER, DIST_CORNER,-DIST_CORNER };
237
    CENTERS[2] = new float[] { DIST_CORNER,-DIST_CORNER, DIST_CORNER };
238
    CENTERS[3] = new float[] { DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
239
    CENTERS[4] = new float[] {-DIST_CORNER, DIST_CORNER, DIST_CORNER };
240
    CENTERS[5] = new float[] {-DIST_CORNER, DIST_CORNER,-DIST_CORNER };
241
    CENTERS[6] = new float[] {-DIST_CORNER,-DIST_CORNER, DIST_CORNER };
242
    CENTERS[7] = new float[] {-DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
243
244
    /// EDGES ///////////////////////////////////////////////
245
246
    final float[][]  edgeTable =
247
        {
248
            {0,+DIST_EDGE,+DIST_EDGE},
249
            {+DIST_EDGE,0,+DIST_EDGE},
250
            {0,-DIST_EDGE,+DIST_EDGE},
251
            {-DIST_EDGE,0,+DIST_EDGE},
252
            {+DIST_EDGE,+DIST_EDGE,0},
253
            {+DIST_EDGE,-DIST_EDGE,0},
254
            {-DIST_EDGE,-DIST_EDGE,0},
255
            {-DIST_EDGE,+DIST_EDGE,0},
256
            {0,+DIST_EDGE,-DIST_EDGE},
257
            {+DIST_EDGE,0,-DIST_EDGE},
258
            {0,-DIST_EDGE,-DIST_EDGE},
259
            {-DIST_EDGE,0,-DIST_EDGE}
260
        };
261
262
    int index=8;
263
264
    for (float[] edges : edgeTable)
265
      {
266
      float c = 3-numLayers;
267
268
      for (int j=0; j<numLayers-2; j++, c+=2, index++)
269
        {
270
        CENTERS[index] = new float[] { edges[0]==0 ? c : edges[0] ,
271
                                       edges[1]==0 ? c : edges[1] ,
272
                                       edges[2]==0 ? c : edges[2] };
273
        }
274
      }
275
276
    /// CENTERS //////////////////////////////////////////////
277
278
    final float X= -1000.0f;
279
    final float Y= -1001.0f;
280
281
    final float[][]  centerTable =
282
        {
283
            {+DIST_CENTER,X,Y},
284
            {-DIST_CENTER,X,Y},
285
            {X,+DIST_CENTER,Y},
286
            {X,-DIST_CENTER,Y},
287
            {X,Y,+DIST_CENTER},
288
            {X,Y,-DIST_CENTER}
289
        };
290
291
    float x,y, cen0, cen1, cen2;
292
293
    for( float[] centers : centerTable )
294
      {
295
      x = 2-numLayers;
296
297
      for(int i=0; i<numLayers-1; i++, x+=2)
298
        {
299
        y = 2-numLayers;
300
301
        for(int j=0; j<numLayers-1; j++, y+=2, index++)
302
          {
303
               if( centers[0]==Y ) cen0 = y;
304
          else if( centers[0]==X ) cen0 = x;
305
          else                     cen0 = centers[0];
306
307
               if( centers[1]==Y ) cen1 = y;
308
          else if( centers[1]==X ) cen1 = x;
309
          else                     cen1 = centers[1];
310
311
               if( centers[2]==Y ) cen2 = y;
312
          else if( centers[2]==X ) cen2 = x;
313
          else                     cen2 = centers[2];
314
315
          CENTERS[index] = new float[] {cen0,cen1,cen2};
316
          }
317
        }
318
319
      x = 3-numLayers;
320
321
      for(int i=0; i<numLayers-2; i++, x+=2)
322
        {
323
        y = 3-numLayers;
324
325
        for(int j=0; j<numLayers-2; j++, y+=2, index++)
326
          {
327
               if( centers[0]==Y ) cen0 = y;
328
          else if( centers[0]==X ) cen0 = x;
329
          else                     cen0 = centers[0];
330
331
               if( centers[1]==Y ) cen1 = y;
332
          else if( centers[1]==X ) cen1 = x;
333
          else                     cen1 = centers[1];
334
335
               if( centers[2]==Y ) cen2 = y;
336
          else if( centers[2]==X ) cen2 = x;
337
          else                     cen2 = centers[2];
338
339
          CENTERS[index] = new float[] {cen0,cen1,cen2};
340
          }
341
        }
342
      }
343
344
    return CENTERS;
345
    }
346
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348
349
  protected Static4D getQuat(int cubit, int numLayers)
350
    {
351
    if( mQuats==null ) initializeQuats();
352
    int numCorners = getNumCorners();
353
    int numEdges   = getNumEdges(numLayers);
354
355
    if( cubit<numCorners )
356
      {
357
      switch(cubit)
358
        {
359
        case  0: return mQuats[0];                         //  unit quat
360
        case  1: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
361
        case  2: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
362
        case  3: return mQuats[1];                         // 180 along X
363
        case  4: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
364
        case  5: return mQuats[2];                         // 180 along Y
365
        case  6: return mQuats[3];                         // 180 along Z
366
        case  7: return new Static4D(SQ2/2,0,-SQ2/2,0);    // 180 along (SQ2/2,0,-SQ2/2)
367
        }
368
      }
369
    else if( cubit<numCorners+numEdges )
370
      {
371
      int edge = (cubit-numCorners)/(numLayers-2);
372
373
      switch(edge)
374
        {
375
        case  0: return mQuats[ 0];
376
        case  1: return mQuats[ 5];
377
        case  2: return mQuats[ 3];
378
        case  3: return mQuats[11];
379
        case  4: return mQuats[ 4];
380
        case  5: return mQuats[ 7];
381
        case  6: return mQuats[ 9];
382
        case  7: return mQuats[10];
383
        case  8: return mQuats[ 2];
384
        case  9: return mQuats[ 8];
385
        case 10: return mQuats[ 1];
386
        case 11: return mQuats[ 6];
387
        }
388
      }
389
    else
390
      {
391
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
392
393
      switch(center)
394
        {
395
        case 0: return new Static4D(0,-SQ2/2,0,SQ2/2);    // -90 along Y
396
        case 1: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
397
        case 2: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
398
        case 3: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
399
        case 4: return mQuats[0];                         //  unit quaternion
400
        case 5: return mQuats[1];                         // 180 along X
401
        }
402
      }
403
404
    return null;
405
    }
406
407
///////////////////////////////////////////////////////////////////////////////////////////////////
408
409
  protected ObjectShape getObjectShape(int cubit, int numLayers)
410
    {
411
    int variant = getCubitVariant(cubit,numLayers);
412
413
    if( variant==0 )
414
      {
415
      double[][] vertices = new double[][] { {-1,0,0},{0,-1,0},{0,0,-1},{-1,-1,-1},{0,0,0} };
416
      int[][] vert_indices = new int[][] { {0,1,4},{2,0,4},{1,2,4},{3,1,0},{3,2,1},{3,0,2} };
417
      int N = numLayers==2 ? 7:5;
418
      int E1= numLayers==2 ? 3:2;
419
      int E2= numLayers==2 ? 5:3;
420
      float[][] bands     = new float[][] { {0.020f,35,0.16f,0.7f,N,E1,E1}, {0.000f, 0,1.00f,0.0f,3,1,E2} };
421
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
422
      float[][] corners   = new float[][] { {0.05f,0.25f}, {0.05f,0.20f} };
423
      int[] cornerIndices = new int[] { 1,1,1,0,0 };
424
      float[][] centers   = new float[][] { {-0.5f, -0.5f, -0.5f} };
425
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
426
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
427
      }
428
    else if( variant==1 )
429
      {
430
      double[][] vertices = new double[][] { {-1,0,0},{1,0,0},{0,-1,0},{0,0,-1} };
431
      int[][] vert_indices = new int[][] { {2,1,0},{3,0,1},{2,3,1},{3,2,0} };
432
      int N = numLayers==2 ? 7:5;
433
      int E = numLayers==2 ? 5:2;
434
      float[][] bands     = new float[][] { {0.035f,30,0.16f,0.8f,N,2,E}, {0.020f,45,0.16f,0.2f,3,1,2} };
435
      int[] bandIndices   = new int[] { 0,0,1,1 };
436
      float[][] corners   = new float[][] { {0.07f,0.20f}, {0.02f,0.30f} };
437
      int[] cornerIndices = new int[] { 0,0,1,1 };
438
      float[][] centers   = new float[][] { {0.0f, -0.5f, -0.5f} };
439
      int[] centerIndices = new int[] { 0,0,0,0 };
440
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
441
      }
442
    else
443
      {
444
      double[][] vertices = new double[][] { {-1,0,0},{0,-1,0},{1,0,0},{0,1,0},{0,0,-1} };
445
      int[][] vert_indices = new int[][] { {0,1,2,3},{4,1,0},{4,2,1},{4,3,2},{4,0,3} };
446
      int N = numLayers==2 ? 7:6;
447
      int E = numLayers==2 ? 3:1;
448
      float[][] bands     = new float[][] { {0.04f,35,SQ2/8,0.9f,N,E,E}, {0.000f,0,1,0.0f,3,0,0} };
449
      int[] bandIndices   = new int[] { 0,1,1,1,1 };
450
      float[][] corners   = new float[][] { {0.06f,0.15f} };
451
      int[] cornerIndices = new int[] { 0,0,0,0,0 };
452
      float[][] centers   = new float[][] { {0,0,-0.4f} };
453
      int[] centerIndices = new int[] { 0,0,0,0,-1 };
454
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
455
      }
456
    }
457
458
///////////////////////////////////////////////////////////////////////////////////////////////////
459
460
  protected int getNumCubitVariants(int numLayers)
461
    {
462
    return 3;
463
    }
464
465
///////////////////////////////////////////////////////////////////////////////////////////////////
466
467
  protected int getCubitVariant(int cubit, int numLayers)
468
    {
469
    int numCorners = getNumCorners();
470
    if( cubit<numCorners ) return 0;
471
    int numEdges = getNumEdges(numLayers);
472
    return cubit<numCorners+numEdges ? 1:2;
473
    }
474
475
///////////////////////////////////////////////////////////////////////////////////////////////////
476
477
  protected int getFaceColor(int cubit, int cubitface, int numLayers)
478
    {
479
    if( mCornerMap==null || mEdgeMap==null || mCenterMap==null )
480
      {
481
      mCornerMap = new int[][]
482
         {
483
           {  4, 2, 0, 18,18,18 },
484
           {  2, 5, 0, 18,18,18 },
485
           {  3, 4, 0, 18,18,18 },
486
           {  5, 3, 0, 18,18,18 },
487
           {  1, 2, 4, 18,18,18 },
488
           {  5, 2, 1, 18,18,18 },
489
           {  4, 3, 1, 18,18,18 },
490
           {  1, 3, 5, 18,18,18 },
491
         };
492
493
      mEdgeMap = new int[][]
494
         {
495
           { 10, 8, 18,18,18,18 },
496
           {  6,10, 18,18,18,18 },
497
           { 10, 9, 18,18,18,18 },
498
           {  7,10, 18,18,18,18 },
499
           {  8, 6, 18,18,18,18 },
500
           {  9, 6, 18,18,18,18 },
501
           {  9, 7, 18,18,18,18 },
502
           {  8, 7, 18,18,18,18 },
503
           { 11, 8, 18,18,18,18 },
504
           {  6,11, 18,18,18,18 },
505
           { 11, 9, 18,18,18,18 },
506
           {  7,11, 18,18,18,18 }
507
         };
508
509
      mCenterMap = new int[][]
510
         {
511
           { 12, 18,18,18,18,18 },
512
           { 13, 18,18,18,18,18 },
513
           { 14, 18,18,18,18,18 },
514
           { 15, 18,18,18,18,18 },
515
           { 16, 18,18,18,18,18 },
516
           { 17, 18,18,18,18,18 },
517
         };
518
      }
519
520
    int numCorners = getNumCorners();
521
    int numEdges   = getNumEdges(numLayers);
522
523
    if( cubit<numCorners )
524
      {
525
      return mCornerMap[cubit][cubitface];
526
      }
527
    else if( cubit<numCorners+numEdges )
528
      {
529
      int edge = (cubit-numCorners)/(numLayers-2);
530
      return mEdgeMap[edge][cubitface];
531
      }
532
    else
533
      {
534
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
535
      return mCenterMap[center][cubitface];
536
      }
537
    }
538
539
///////////////////////////////////////////////////////////////////////////////////////////////////
540
541
  protected ObjectSticker retSticker(int face)
542
    {
543
    if( mStickers==null )
544
      {
545
      float[][] STICKERS = new float[][]
546
          {
547
             { -0.5f, 0.25f, 0.25f,  -0.5f, 0.25f, 0.25f  },
548
             { -0.5f, 0.00f, 0.00f,  -0.5f, 0.50f, 0.0f, 0.0f, 0.5f }
549
          };
550
551
      final float R1 = 0.025f;
552
      final float R2 = 0.025f;
553
      final float R3 = 0.055f;
554
      final float[][] radii  = { { R1,R1,R1 },{ R2,R2,R2 },{ R3,R3,R3,R3 } };
555 21aaab9a Leszek Koltunski
      final float[] strokes = { 0.05f, 0.04f, 0.04f };
556 29b82486 Leszek Koltunski
557 8592461c Leszek Koltunski
      if( ObjectControl.isInIconMode() )
558
        {
559
        float mult = getNumLayers()==2 ? 2.0f : 2.7f;
560
        strokes[0]*=mult;
561
        strokes[1]*=mult;
562
        strokes[2]*=mult;
563
        }
564
565 29b82486 Leszek Koltunski
      mStickers = new ObjectSticker[STICKERS.length+1];
566
567
      for(int s=0; s<STICKERS.length+1; s++)
568
        {
569
        int index = s<2 ? 0:1;
570
        mStickers[s] = new ObjectSticker(STICKERS[index],null,radii[s],strokes[s]);
571
        }
572
      }
573
574
    return mStickers[face/NUM_FACE_COLORS];
575
    }
576
577
///////////////////////////////////////////////////////////////////////////////////////////////////
578
// PUBLIC API
579
580
  public Static3D[] getRotationAxis()
581
    {
582
    return ROT_AXIS;
583
    }
584
585
///////////////////////////////////////////////////////////////////////////////////////////////////
586
587
  public Movement getMovement()
588
    {
589
    if( mMovement==null )
590
      {
591
      int numLayers = getNumLayers();
592
      if( mCuts==null ) getCuts(numLayers);
593
      getLayerRotatable(numLayers);
594
      mMovement = new Movement6(ROT_AXIS,mCuts,mLayerRotatable,2*numLayers-2,TYPE_SPLIT_CORNER,ENABLED);
595
      }
596
    return mMovement;
597
    }
598
599
///////////////////////////////////////////////////////////////////////////////////////////////////
600
601
  public int[] getBasicAngle()
602
    {
603
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 3,3,3,3 };
604
    return mBasicAngle;
605
    }
606
607 61aa85e4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
608
609 c8bc83d9 Leszek Koltunski
  public ObjectType intGetObjectType(int numLayers)
610 61aa85e4 Leszek Koltunski
    {
611
    switch(numLayers)
612
      {
613 8005e762 Leszek Koltunski
      case 2: return ObjectType.SKEW_2;
614
      case 3: return ObjectType.SKEW_3;
615 61aa85e4 Leszek Koltunski
      }
616
617 8005e762 Leszek Koltunski
    return ObjectType.SKEW_2;
618 61aa85e4 Leszek Koltunski
    }
619
620 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
621
622
  public int getObjectName(int numLayers)
623
    {
624
    switch(numLayers)
625
      {
626
      case 2: return R.string.skew2;
627
      case 3: return R.string.skew3;
628
      }
629
    return R.string.skew2;
630
    }
631
632
///////////////////////////////////////////////////////////////////////////////////////////////////
633
634
  public int getInventor(int numLayers)
635
    {
636
    switch(numLayers)
637
      {
638
      case 2: return R.string.skew2_inventor;
639
      case 3: return R.string.skew3_inventor;
640
      }
641
    return R.string.skew2_inventor;
642
    }
643
644
///////////////////////////////////////////////////////////////////////////////////////////////////
645
646
  public int getComplexity(int numLayers)
647
    {
648
    switch(numLayers)
649
      {
650
      case 2: return 4;
651
      case 3: return 8;
652
      }
653
    return 5;
654
    }
655
}