Project

General

Profile

Download (21.2 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / objects / TwistySkewb.java @ 8db55f55

1 fb52fae9 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.objects;
21
22
import android.content.res.Resources;
23
24 8655f3fe Leszek Koltunski
import org.distorted.helpers.ObjectShape;
25 9c06394a Leszek Koltunski
import org.distorted.helpers.ObjectSticker;
26 fb52fae9 Leszek Koltunski
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 6fd4a72c Leszek Koltunski
import org.distorted.main.R;
32 fb52fae9 Leszek Koltunski
33
import java.util.Random;
34
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36
37 9c2f0c91 Leszek Koltunski
public class TwistySkewb extends TwistyObject
38 fb52fae9 Leszek Koltunski
{
39
  private static final int FACES_PER_CUBIT =6;
40
41
  // the four rotation axis of a RubikSkewb. Must be normalized.
42
  static final Static3D[] ROT_AXIS = new Static3D[]
43
         {
44
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
45
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
46
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
47
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
48
         };
49
50 925ed78f Leszek Koltunski
  private static final int[] BASIC_ANGLE = new int[] { 3,3,3,3 };
51
52 fb52fae9 Leszek Koltunski
  private static final int[] FACE_COLORS = new int[]
53
         {
54 ece1b58d Leszek Koltunski
           COLOR_YELLOW, COLOR_WHITE,
55
           COLOR_BLUE  , COLOR_GREEN,
56 323b217c Leszek Koltunski
           COLOR_RED   , COLOR_ORANGE
57 fb52fae9 Leszek Koltunski
         };
58
59
  // All legal rotation quats of a RubikSkewb
60
  private static final Static4D[] QUATS = new Static4D[]
61
         {
62
           new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),
63
           new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
64
           new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
65
           new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
66
67
           new Static4D(  0.5f,  0.5f,  0.5f,  0.5f ),
68
           new Static4D(  0.5f,  0.5f,  0.5f, -0.5f ),
69
           new Static4D(  0.5f,  0.5f, -0.5f,  0.5f ),
70
           new Static4D(  0.5f,  0.5f, -0.5f, -0.5f ),
71
           new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
72
           new Static4D(  0.5f, -0.5f,  0.5f, -0.5f ),
73
           new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
74
           new Static4D(  0.5f, -0.5f, -0.5f, -0.5f )
75
         };
76
77 3f3ff476 Leszek Koltunski
  private static final int[][] mCornerMap =
78
         {
79
           {  4, 2, 0, 18,18,18 },
80
           {  2, 5, 0, 18,18,18 },
81
           {  3, 4, 0, 18,18,18 },
82
           {  5, 3, 0, 18,18,18 },
83
           {  1, 2, 4, 18,18,18 },
84
           {  5, 2, 1, 18,18,18 },
85
           {  4, 3, 1, 18,18,18 },
86
           {  1, 3, 5, 18,18,18 },
87
         };
88 63002261 Leszek Koltunski
89 3f3ff476 Leszek Koltunski
  private static final int[][] mEdgeMap =
90 fb52fae9 Leszek Koltunski
         {
91 3f3ff476 Leszek Koltunski
           { 10, 8, 18,18,18,18 },
92
           {  6,10, 18,18,18,18 },
93
           { 10, 9, 18,18,18,18 },
94
           {  7,10, 18,18,18,18 },
95
           {  8, 6, 18,18,18,18 },
96
           {  9, 6, 18,18,18,18 },
97
           {  9, 7, 18,18,18,18 },
98
           {  8, 7, 18,18,18,18 },
99
           { 11, 8, 18,18,18,18 },
100
           {  6,11, 18,18,18,18 },
101
           { 11, 9, 18,18,18,18 },
102
           {  7,11, 18,18,18,18 }
103 fb52fae9 Leszek Koltunski
         };
104
105 3f3ff476 Leszek Koltunski
  private static final int[][] mCenterMap =
106 fb52fae9 Leszek Koltunski
         {
107 3f3ff476 Leszek Koltunski
           { 12, 18,18,18,18,18 },
108
           { 13, 18,18,18,18,18 },
109
           { 14, 18,18,18,18,18 },
110
           { 15, 18,18,18,18,18 },
111
           { 16, 18,18,18,18,18 },
112
           { 17, 18,18,18,18,18 },
113 fb52fae9 Leszek Koltunski
         };
114
115 596d62a4 Leszek Koltunski
  private static final double[][] VERTICES_CORNER = new double[][]
116
          {
117 7dc57f89 Leszek Koltunski
              {-0.5f, 0.0f, 0.0f},
118
              { 0.0f,-0.5f, 0.0f},
119
              { 0.0f, 0.0f,-0.5f},
120
              {-0.5f,-0.5f,-0.5f},
121
              { 0.0f, 0.0f, 0.0f}
122 596d62a4 Leszek Koltunski
          };
123
124
  private static final int[][] VERT_INDEXES_CORNER = new int[][]
125
          {
126 7dc57f89 Leszek Koltunski
              {0,1,4},
127
              {2,0,4},
128
              {1,2,4},
129
              {3,1,0},
130
              {3,2,1},
131
              {3,0,2}
132 596d62a4 Leszek Koltunski
          };
133
134
  private static final double[][] VERTICES_EDGE = new double[][]
135
          {
136
             {-0.5, 0.0, 0.0},
137
             { 0.5, 0.0, 0.0},
138
             { 0.0,-0.5, 0.0},
139
             { 0.0, 0.0,-0.5}
140
          };
141
142
  private static final int[][] VERT_INDEXES_EDGE = new int[][]
143
          {
144
             {2,1,0},   // counterclockwise!
145
             {3,0,1},
146
             {2,3,1},
147
             {3,2,0},
148
          };
149
150
  private static final double[][] VERTICES_FACE = new double[][]
151
          {
152 7dc57f89 Leszek Koltunski
             {-0.5f, 0.0f, 0.0f },
153
             { 0.0f,-0.5f, 0.0f },
154
             { 0.5f, 0.0f, 0.0f },
155
             { 0.0f, 0.5f, 0.0f },
156
             { 0.0f, 0.0f,-0.5f }
157 596d62a4 Leszek Koltunski
          };
158
159
  private static final int[][] VERT_INDEXES_FACE = new int[][]
160
          {
161 7dc57f89 Leszek Koltunski
             {0,1,2,3},
162
             {4,1,0},
163
             {4,2,1},
164
             {4,3,2},
165
             {4,0,3}
166
          };
167
168
  private static final float[][] STICKERS = new float[][]
169
          {
170 be56193c Leszek Koltunski
             { -0.5f, 0.25f, 0.25f,  -0.5f, 0.25f, 0.25f  },
171
             { -0.5f, 0.00f, 0.00f,  -0.5f, 0.50f, 0.0f, 0.0f, 0.5f }
172 596d62a4 Leszek Koltunski
          };
173
174 9c06394a Leszek Koltunski
  private static final ObjectSticker[] mStickers;
175
176
  static
177
    {
178
    mStickers = new ObjectSticker[STICKERS.length+1];
179
    final float R1 = 0.025f;
180
    final float R2 = 0.025f;
181
    final float R3 = 0.055f;
182
    final float[][] radii  = { { R1,R1,R1 },{ R2,R2,R2 },{ R3,R3,R3,R3 } };
183
    final float[] strokes = { 0.045f, 0.035f, 0.035f };
184
185
    for(int s=0; s<STICKERS.length+1; s++)
186
      {
187
      int index = s<2 ? 0:1;
188
      mStickers[s] = new ObjectSticker(STICKERS[index],null,radii[s],strokes[s]);
189
      }
190
    }
191
192 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
193
194 9c2f0c91 Leszek Koltunski
  TwistySkewb(int size, Static4D quat, DistortedTexture texture,
195
              MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
196 fb52fae9 Leszek Koltunski
    {
197 db875721 Leszek Koltunski
    super(size, 2*size-2, quat, texture, mesh, effects, moves, ObjectList.SKEW, res, scrWidth);
198 fb52fae9 Leszek Koltunski
    }
199
200 a480ee80 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
201
202
  int[] getSolvedQuats(int cubit, int numLayers)
203
    {
204
    int status = retCubitSolvedStatus(cubit,numLayers);
205
    return status<0 ? null : buildSolvedQuats(MovementSkewb.FACE_AXIS[status],QUATS);
206
    }
207
208 3f3ff476 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
209
210 d92030e4 Leszek Koltunski
  private int getNumCorners()
211 3f3ff476 Leszek Koltunski
    {
212
    return 8;
213
    }
214
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216
217 b89898c5 Leszek Koltunski
  private int getNumEdges(int layers)
218 3f3ff476 Leszek Koltunski
    {
219 b89898c5 Leszek Koltunski
    return (layers-2)*12;
220 3f3ff476 Leszek Koltunski
    }
221
222
///////////////////////////////////////////////////////////////////////////////////////////////////
223
224 d92030e4 Leszek Koltunski
  private int getNumCentersPerFace(int layers)
225 3f3ff476 Leszek Koltunski
    {
226 d92030e4 Leszek Koltunski
    return ((layers-2)*(layers-2) + (layers-1)*(layers-1));
227 3f3ff476 Leszek Koltunski
    }
228
229 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
230
231
  float getScreenRatio()
232
    {
233 d99f3a48 Leszek Koltunski
    return 1.0f;
234 fb52fae9 Leszek Koltunski
    }
235
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237
238
  Static4D[] getQuats()
239
    {
240
    return QUATS;
241
    }
242
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244
245
  int getNumFaces()
246
    {
247
    return FACE_COLORS.length;
248
    }
249
250 169219a7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
251
252
  int getSolvedFunctionIndex()
253
    {
254
    return 0;
255
    }
256
257 eaee1ddc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
258
259
  boolean shouldResetTextureMaps()
260
    {
261
    return false;
262
    }
263
264 eab9d8f8 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
265
266 a64e07d0 Leszek Koltunski
  int getNumStickerTypes(int numLayers)
267 eab9d8f8 Leszek Koltunski
    {
268 3f3ff476 Leszek Koltunski
    return 3;
269 eab9d8f8 Leszek Koltunski
    }
270
271 7403cdfa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
272
273 e6734aa9 Leszek Koltunski
  float[][] getCuts(int numLayers)
274 7403cdfa Leszek Koltunski
    {
275 b89898c5 Leszek Koltunski
    switch(numLayers)
276 a97e02b7 Leszek Koltunski
      {
277 e6734aa9 Leszek Koltunski
      case 2: float[] c2 = new float[] {0.0f};
278
              return new float[][] { c2,c2,c2,c2 };
279
      case 3: float[] c3 = new float[] {-SQ3/12,+SQ3/12};
280
              return new float[][] { c3,c3,c3,c3 };
281 a97e02b7 Leszek Koltunski
      }
282 e6734aa9 Leszek Koltunski
    return null;
283 7403cdfa Leszek Koltunski
    }
284
285 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
286
287
  int getNumCubitFaces()
288
    {
289
    return FACES_PER_CUBIT;
290
    }
291
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293
294 e6cf7283 Leszek Koltunski
  float[][] getCubitPositions(int numLayers)
295 fb52fae9 Leszek Koltunski
    {
296 b89898c5 Leszek Koltunski
    final float DIST_CORNER = (numLayers-1)*0.50f;
297
    final float DIST_EDGE   = (numLayers-1)*0.50f;
298
    final float DIST_CENTER = (numLayers-1)*0.50f;
299 3f3ff476 Leszek Koltunski
300 d92030e4 Leszek Koltunski
    final int numCorners = getNumCorners();
301 b89898c5 Leszek Koltunski
    final int numEdges   = getNumEdges(numLayers);
302 d92030e4 Leszek Koltunski
    final int numCenters = 6*getNumCentersPerFace(numLayers);
303 3f3ff476 Leszek Koltunski
304 e6cf7283 Leszek Koltunski
    final float[][] CENTERS = new float[numCorners+numEdges+numCenters][];
305 3f3ff476 Leszek Koltunski
306
    /// CORNERS //////////////////////////////////////////////
307
308 e6cf7283 Leszek Koltunski
    CENTERS[0] = new float[] { DIST_CORNER, DIST_CORNER, DIST_CORNER };
309
    CENTERS[1] = new float[] { DIST_CORNER, DIST_CORNER,-DIST_CORNER };
310
    CENTERS[2] = new float[] { DIST_CORNER,-DIST_CORNER, DIST_CORNER };
311
    CENTERS[3] = new float[] { DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
312
    CENTERS[4] = new float[] {-DIST_CORNER, DIST_CORNER, DIST_CORNER };
313
    CENTERS[5] = new float[] {-DIST_CORNER, DIST_CORNER,-DIST_CORNER };
314
    CENTERS[6] = new float[] {-DIST_CORNER,-DIST_CORNER, DIST_CORNER };
315
    CENTERS[7] = new float[] {-DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
316 3f3ff476 Leszek Koltunski
317
    /// EDGES ///////////////////////////////////////////////
318
319
    final float[][]  edgeTable =
320
        {
321
            {0,+DIST_EDGE,+DIST_EDGE},
322
            {+DIST_EDGE,0,+DIST_EDGE},
323
            {0,-DIST_EDGE,+DIST_EDGE},
324
            {-DIST_EDGE,0,+DIST_EDGE},
325
            {+DIST_EDGE,+DIST_EDGE,0},
326
            {+DIST_EDGE,-DIST_EDGE,0},
327
            {-DIST_EDGE,-DIST_EDGE,0},
328
            {-DIST_EDGE,+DIST_EDGE,0},
329
            {0,+DIST_EDGE,-DIST_EDGE},
330
            {+DIST_EDGE,0,-DIST_EDGE},
331
            {0,-DIST_EDGE,-DIST_EDGE},
332
            {-DIST_EDGE,0,-DIST_EDGE}
333
        };
334
335
    int index=8;
336
337
    for (float[] edges : edgeTable)
338
      {
339 b89898c5 Leszek Koltunski
      float c = (3-numLayers)*0.5f;
340 3f3ff476 Leszek Koltunski
341 b89898c5 Leszek Koltunski
      for (int j=0; j<numLayers-2; j++, c+=1.0f, index++)
342 3f3ff476 Leszek Koltunski
        {
343 e6cf7283 Leszek Koltunski
        CENTERS[index] = new float[] { edges[0]==0 ? c : edges[0] ,
344 3f3ff476 Leszek Koltunski
                                       edges[1]==0 ? c : edges[1] ,
345 e6cf7283 Leszek Koltunski
                                       edges[2]==0 ? c : edges[2] };
346 3f3ff476 Leszek Koltunski
        }
347
      }
348
349
    /// CENTERS //////////////////////////////////////////////
350
351
    final float X= -1000.0f;
352
    final float Y= -1001.0f;
353
354
    final float[][]  centerTable =
355
        {
356
            {+DIST_CENTER,X,Y},
357
            {-DIST_CENTER,X,Y},
358
            {X,+DIST_CENTER,Y},
359
            {X,-DIST_CENTER,Y},
360
            {X,Y,+DIST_CENTER},
361
            {X,Y,-DIST_CENTER}
362
        };
363
364
    float x,y, cen0, cen1, cen2;
365
366
    for( float[] centers : centerTable )
367
      {
368 b89898c5 Leszek Koltunski
      x = (2-numLayers)*0.5f;
369 3f3ff476 Leszek Koltunski
370 b89898c5 Leszek Koltunski
      for(int i=0; i<numLayers-1; i++, x+=1.0f)
371 3f3ff476 Leszek Koltunski
        {
372 b89898c5 Leszek Koltunski
        y = (2-numLayers)*0.5f;
373 3f3ff476 Leszek Koltunski
374 b89898c5 Leszek Koltunski
        for(int j=0; j<numLayers-1; j++, y+=1.0f, index++)
375 3f3ff476 Leszek Koltunski
          {
376
               if( centers[0]==Y ) cen0 = y;
377
          else if( centers[0]==X ) cen0 = x;
378
          else                     cen0 = centers[0];
379
380
               if( centers[1]==Y ) cen1 = y;
381
          else if( centers[1]==X ) cen1 = x;
382
          else                     cen1 = centers[1];
383
384
               if( centers[2]==Y ) cen2 = y;
385
          else if( centers[2]==X ) cen2 = x;
386
          else                     cen2 = centers[2];
387
388 e6cf7283 Leszek Koltunski
          CENTERS[index] = new float[] {cen0,cen1,cen2};
389 3f3ff476 Leszek Koltunski
          }
390
        }
391
392 b89898c5 Leszek Koltunski
      x = (3-numLayers)*0.5f;
393 3f3ff476 Leszek Koltunski
394 b89898c5 Leszek Koltunski
      for(int i=0; i<numLayers-2; i++, x+=1.0f)
395 3f3ff476 Leszek Koltunski
        {
396 b89898c5 Leszek Koltunski
        y = (3-numLayers)*0.5f;
397 3f3ff476 Leszek Koltunski
398 b89898c5 Leszek Koltunski
        for(int j=0; j<numLayers-2; j++, y+=1.0f, index++)
399 3f3ff476 Leszek Koltunski
          {
400
               if( centers[0]==Y ) cen0 = y;
401
          else if( centers[0]==X ) cen0 = x;
402
          else                     cen0 = centers[0];
403
404
               if( centers[1]==Y ) cen1 = y;
405
          else if( centers[1]==X ) cen1 = x;
406
          else                     cen1 = centers[1];
407
408
               if( centers[2]==Y ) cen2 = y;
409
          else if( centers[2]==X ) cen2 = x;
410
          else                     cen2 = centers[2];
411
412 e6cf7283 Leszek Koltunski
          CENTERS[index] = new float[] {cen0,cen1,cen2};
413 3f3ff476 Leszek Koltunski
          }
414
        }
415
      }
416
417 fb52fae9 Leszek Koltunski
    return CENTERS;
418
    }
419
420
///////////////////////////////////////////////////////////////////////////////////////////////////
421
422 3e605536 Leszek Koltunski
  Static4D getQuat(int cubit, int numLayers)
423 fb52fae9 Leszek Koltunski
    {
424 d92030e4 Leszek Koltunski
    int numCorners = getNumCorners();
425
    int numEdges   = getNumEdges(numLayers);
426 3f3ff476 Leszek Koltunski
427
    if( cubit<numCorners )
428
      {
429
      switch(cubit)
430
        {
431
        case  0: return QUATS[0];                          //  unit quat
432
        case  1: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
433
        case  2: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
434
        case  3: return QUATS[1];                          // 180 along X
435
        case  4: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
436
        case  5: return QUATS[2];                          // 180 along Y
437
        case  6: return QUATS[3];                          // 180 along Z
438
        case  7: return new Static4D(SQ2/2,0,-SQ2/2,0);    // 180 along (SQ2/2,0,-SQ2/2)
439
        }
440
      }
441
    else if( cubit<numCorners+numEdges )
442
      {
443 d92030e4 Leszek Koltunski
      int edge = (cubit-numCorners)/(numLayers-2);
444 3f3ff476 Leszek Koltunski
445
      switch(edge)
446
        {
447
        case  0: return QUATS[ 0];
448
        case  1: return QUATS[ 5];
449
        case  2: return QUATS[ 3];
450
        case  3: return QUATS[11];
451
        case  4: return QUATS[ 4];
452
        case  5: return QUATS[ 7];
453
        case  6: return QUATS[ 9];
454
        case  7: return QUATS[10];
455
        case  8: return QUATS[ 2];
456
        case  9: return QUATS[ 8];
457
        case 10: return QUATS[ 1];
458
        case 11: return QUATS[ 6];
459
        }
460
      }
461
    else
462 fb52fae9 Leszek Koltunski
      {
463 d92030e4 Leszek Koltunski
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
464 3f3ff476 Leszek Koltunski
465
      switch(center)
466
        {
467
        case 0: return new Static4D(0,-SQ2/2,0,SQ2/2);    // -90 along Y
468
        case 1: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
469
        case 2: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
470
        case 3: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
471
        case 4: return QUATS[0];                          //  unit quaternion
472
        case 5: return QUATS[1];                          // 180 along X
473
        }
474 fb52fae9 Leszek Koltunski
      }
475
476
    return null;
477
    }
478
479
///////////////////////////////////////////////////////////////////////////////////////////////////
480
481 8655f3fe Leszek Koltunski
  ObjectShape getObjectShape(int cubit, int numLayers)
482 fb52fae9 Leszek Koltunski
    {
483 8655f3fe Leszek Koltunski
    int variant = getCubitVariant(cubit,numLayers);
484 fb52fae9 Leszek Koltunski
485 8655f3fe Leszek Koltunski
    if( variant==0 )
486 fb52fae9 Leszek Koltunski
      {
487 8655f3fe Leszek Koltunski
      int N = numLayers==2 ? 7:5;
488
      int E1= numLayers==2 ? 3:2;
489
      int E2= numLayers==2 ? 5:3;
490 3e605536 Leszek Koltunski
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,N,E1,E1}, {0.000f, 0,1.00f,0.0f,3,1,E2} };
491 8655f3fe Leszek Koltunski
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
492
      float[][] corners   = new float[][] { {0.08f,0.15f}, {0.08f,0.20f} };
493
      int[] cornerIndices = new int[] { 1,1,1,0,0 };
494
      float[][] centers   = new float[][] { {-0.25f, -0.25f, -0.25f} };
495
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
496
      return new ObjectShape(VERTICES_CORNER,VERT_INDEXES_CORNER,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
497 fb52fae9 Leszek Koltunski
      }
498 8655f3fe Leszek Koltunski
    else if( variant==1 )
499 3f3ff476 Leszek Koltunski
      {
500 8655f3fe Leszek Koltunski
      int N = numLayers==2 ? 7:5;
501
      int E = numLayers==2 ? 5:2;
502 3e605536 Leszek Koltunski
      float[][] bands     = new float[][] { {0.035f,30,0.16f,0.8f,N,2,E}, {0.020f,45,0.16f,0.2f,3,1,2} };
503 8655f3fe Leszek Koltunski
      int[] bandIndices   = new int[] { 0,0,1,1 };
504
      float[][] corners   = new float[][] { {0.07f,0.20f}, {0.02f,0.30f} };
505
      int[] cornerIndices = new int[] { 0,0,1,1 };
506
      float[][] centers   = new float[][] { {0.0f, -0.25f, -0.25f} };
507
      int[] centerIndices = new int[] { 0,0,0,0 };
508
      return new ObjectShape(VERTICES_EDGE,VERT_INDEXES_EDGE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
509 3f3ff476 Leszek Koltunski
      }
510 fb52fae9 Leszek Koltunski
    else
511
      {
512 8655f3fe Leszek Koltunski
      int N = numLayers==2 ? 7:6;
513
      int E = numLayers==2 ? 3:1;
514 3e605536 Leszek Koltunski
      float[][] bands     = new float[][] { {0.051f,35,SQ2/8,0.9f,N,E,E}, {0.000f,0,1,0.0f,3,0,0} };
515 8655f3fe Leszek Koltunski
      int[] bandIndices   = new int[] { 0,1,1,1,1 };
516
      float[][] corners   = new float[][] { {0.06f,0.10f} };
517
      int[] cornerIndices = new int[] { 0,0,0,0,0 };
518
      float[][] centers   = new float[][] { {0,0,-0.2f} };
519
      int[] centerIndices = new int[] { 0,0,0,0,-1 };
520
      return new ObjectShape(VERTICES_FACE,VERT_INDEXES_FACE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
521
      }
522
    }
523
524
///////////////////////////////////////////////////////////////////////////////////////////////////
525
526 3e605536 Leszek Koltunski
  int getNumCubitVariants(int numLayers)
527 8655f3fe Leszek Koltunski
    {
528
    return 3;
529
    }
530
531
///////////////////////////////////////////////////////////////////////////////////////////////////
532
533
  int getCubitVariant(int cubit, int numLayers)
534
    {
535
    int numCorners = getNumCorners();
536
    if( cubit<numCorners ) return 0;
537
    int numEdges = getNumEdges(numLayers);
538
    return cubit<numCorners+numEdges ? 1:2;
539
    }
540
541 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
542
543 d92030e4 Leszek Koltunski
  int getFaceColor(int cubit, int cubitface, int numLayers)
544 fb52fae9 Leszek Koltunski
    {
545 d92030e4 Leszek Koltunski
    int numCorners = getNumCorners();
546
    int numEdges   = getNumEdges(numLayers);
547 3f3ff476 Leszek Koltunski
548
    if( cubit<numCorners )
549
      {
550
      return mCornerMap[cubit][cubitface];
551
      }
552
    else if( cubit<numCorners+numEdges )
553
      {
554 d92030e4 Leszek Koltunski
      int edge = (cubit-numCorners)/(numLayers-2);
555 3f3ff476 Leszek Koltunski
      return mEdgeMap[edge][cubitface];
556
      }
557
    else
558
      {
559 d92030e4 Leszek Koltunski
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
560 3f3ff476 Leszek Koltunski
      return mCenterMap[center][cubitface];
561
      }
562 fb52fae9 Leszek Koltunski
    }
563
564
///////////////////////////////////////////////////////////////////////////////////////////////////
565
566 9c06394a Leszek Koltunski
  int getColor(int face)
567 fb52fae9 Leszek Koltunski
    {
568 9c06394a Leszek Koltunski
    return FACE_COLORS[face];
569
    }
570 eab9d8f8 Leszek Koltunski
571 9c06394a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
572 ae755eda Leszek Koltunski
573 9c06394a Leszek Koltunski
  ObjectSticker retSticker(int face)
574
    {
575
    return mStickers[face/NUM_FACES];
576 fb52fae9 Leszek Koltunski
    }
577
578
///////////////////////////////////////////////////////////////////////////////////////////////////
579
580
  float returnMultiplier()
581
    {
582
    return 2.0f;
583
    }
584
585
///////////////////////////////////////////////////////////////////////////////////////////////////
586
// PUBLIC API
587
588
  public Static3D[] getRotationAxis()
589
    {
590
    return ROT_AXIS;
591
    }
592
593
///////////////////////////////////////////////////////////////////////////////////////////////////
594
595 925ed78f Leszek Koltunski
  public int[] getBasicAngle()
596 fb52fae9 Leszek Koltunski
    {
597 925ed78f Leszek Koltunski
    return BASIC_ANGLE;
598 fb52fae9 Leszek Koltunski
    }
599
600
///////////////////////////////////////////////////////////////////////////////////////////////////
601
602 9f171eba Leszek Koltunski
  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total)
603 fb52fae9 Leszek Koltunski
    {
604 9f171eba Leszek Koltunski
    if( curr==0 )
605 fb52fae9 Leszek Koltunski
      {
606 9f171eba Leszek Koltunski
      scramble[curr][0] = rnd.nextInt(NUM_AXIS);
607 fb52fae9 Leszek Koltunski
      }
608
    else
609
      {
610 8db55f55 Leszek Koltunski
      int newVector = rnd.nextInt(NUM_AXIS-1);
611 9f171eba Leszek Koltunski
      scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector);
612 fb52fae9 Leszek Koltunski
      }
613
614 9f171eba Leszek Koltunski
    scramble[curr][1] = rnd.nextFloat()<=0.5f ? 0 : getNumLayers()-1;
615 fb52fae9 Leszek Koltunski
616 5043d5d0 Leszek Koltunski
    switch( rnd.nextInt(2) )
617
      {
618 9f171eba Leszek Koltunski
      case 0: scramble[curr][2] = -1; break;
619
      case 1: scramble[curr][2] =  1; break;
620 5043d5d0 Leszek Koltunski
      }
621 fb52fae9 Leszek Koltunski
    }
622
623 6fd4a72c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
624
625
  public int getObjectName(int numLayers)
626
    {
627
    switch(numLayers)
628
      {
629
      case 2: return R.string.skew2;
630
      case 3: return R.string.skew3;
631
      }
632
    return R.string.skew2;
633
    }
634
635
///////////////////////////////////////////////////////////////////////////////////////////////////
636
637
  public int getInventor(int numLayers)
638
    {
639
    switch(numLayers)
640
      {
641
      case 2: return R.string.skew2_inventor;
642
      case 3: return R.string.skew3_inventor;
643
      }
644
    return R.string.skew2_inventor;
645
    }
646
647
///////////////////////////////////////////////////////////////////////////////////////////////////
648
649
  public int getComplexity(int numLayers)
650
    {
651
    switch(numLayers)
652
      {
653 d5ca9927 Leszek Koltunski
      case 2: return 4;
654
      case 3: return 8;
655 6fd4a72c Leszek Koltunski
      }
656
    return 5;
657
    }
658 fb52fae9 Leszek Koltunski
}