Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyRex.java @ a2a4df1b

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
import org.distorted.helpers.FactoryCubit;
25
import org.distorted.helpers.ObjectSticker;
26
import org.distorted.library.effect.MatrixEffectQuaternion;
27
import org.distorted.library.main.DistortedEffects;
28
import org.distorted.library.main.DistortedTexture;
29
import org.distorted.library.mesh.MeshBase;
30
import org.distorted.library.mesh.MeshSquare;
31
import org.distorted.library.type.Static3D;
32
import org.distorted.library.type.Static4D;
33
import org.distorted.main.R;
34

    
35
import java.util.Random;
36

    
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38

    
39
public class TwistyRex extends TwistyObject
40
{
41
  private static final int FACES_PER_CUBIT =6;
42

    
43
  public static final float REX_D = 0.2f;
44

    
45
  // the four rotation axis of a RubikRex. Must be normalized.
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[] BASIC_ANGLE = new int[] { 3,3,3,3 };
55

    
56
  private static final int[] FACE_COLORS = new int[]
57
         {
58
           COLOR_YELLOW, COLOR_WHITE,
59
           COLOR_BLUE  , COLOR_GREEN,
60
           COLOR_RED   , COLOR_ORANGE
61
         };
62

    
63
  // All legal rotation quats of a RubikRex
64
  private static final Static4D[] QUATS = new Static4D[]
65
         {
66
           new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),
67
           new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
68
           new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
69
           new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
70

    
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
           new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
76
           new Static4D(  0.5f, -0.5f,  0.5f, -0.5f ),
77
           new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
78
           new Static4D(  0.5f, -0.5f, -0.5f, -0.5f )
79
         };
80

    
81
  private static final int[][] mFaceMap =
82
         {
83
           {  0, 18,18,18,18,18 },
84
           {  0, 18,18,18,18,18 },
85
           {  0, 18,18,18,18,18 },
86
           {  0, 18,18,18,18,18 },
87
           {  1, 18,18,18,18,18 },
88
           {  1, 18,18,18,18,18 },
89
           {  1, 18,18,18,18,18 },
90
           {  1, 18,18,18,18,18 },
91
           {  2, 18,18,18,18,18 },
92
           {  2, 18,18,18,18,18 },
93
           {  2, 18,18,18,18,18 },
94
           {  2, 18,18,18,18,18 },
95
           {  3, 18,18,18,18,18 },
96
           {  3, 18,18,18,18,18 },
97
           {  3, 18,18,18,18,18 },
98
           {  3, 18,18,18,18,18 },
99
           {  4, 18,18,18,18,18 },
100
           {  4, 18,18,18,18,18 },
101
           {  4, 18,18,18,18,18 },
102
           {  4, 18,18,18,18,18 },
103
           {  5, 18,18,18,18,18 },
104
           {  5, 18,18,18,18,18 },
105
           {  5, 18,18,18,18,18 },
106
           {  5, 18,18,18,18,18 },
107

    
108
           {  6, 18,18,18,18,18 },
109
           {  7, 18,18,18,18,18 },
110
           {  8, 18,18,18,18,18 },
111
           {  9, 18,18,18,18,18 },
112
           { 10, 18,18,18,18,18 },
113
           { 11, 18,18,18,18,18 },
114

    
115
           { 16,14, 18,18,18,18 },
116
           { 16,12, 18,18,18,18 },
117
           { 16,15, 18,18,18,18 },
118
           { 16,13, 18,18,18,18 },
119
           { 12,14, 18,18,18,18 },
120
           { 15,12, 18,18,18,18 },
121
           { 15,13, 18,18,18,18 },
122
           { 13,14, 18,18,18,18 },
123
           { 14,17, 18,18,18,18 },
124
           { 12,17, 18,18,18,18 },
125
           { 17,15, 18,18,18,18 },
126
           { 13,17, 18,18,18,18 },
127
         };
128

    
129
  private static final ObjectSticker[] mStickers;
130

    
131
  private static final float[][] STICKERS = new float[][]
132
          {
133
             { -0.5f, 0.1428f, -0.1428f, 0.5f, 0.32f, -0.32f },
134
             { -0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f },
135
             { -0.5f, 0.1f, 0.5f, 0.1f, 0.0f, -0.2f  }
136
          };
137
  private static final int NUM_STICKERS = STICKERS.length;
138

    
139
  static
140
    {
141
    mStickers = new ObjectSticker[NUM_STICKERS];
142

    
143
    final float F = (float)(Math.PI/20);
144
    final float R1= 0.02f;
145
    final float R2= 0.09f;
146
    final float R3= 0.06f;
147
    final float[][] angles = { { -F/2,F,F },null,{ F/10,-F,-F } };
148
    final float[][] radii  = { {R1,R1,R1},{R2,R2,R2,R2},{0,0,R3} };
149
    final float[] strokes = { 0.06f, 0.07f, 0.04f };
150

    
151
    for(int s=0; s<NUM_STICKERS; s++)
152
      {
153
      mStickers[s] = new ObjectSticker(STICKERS[s],angles[s],radii[s],strokes[s]);
154
      }
155
    }
156

    
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158

    
159
  TwistyRex(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
160
            DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
161
    {
162
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.REX, res, scrWidth);
163
    }
164

    
165
///////////////////////////////////////////////////////////////////////////////////////////////////
166

    
167
  float getScreenRatio()
168
    {
169
    return 1.5f;
170
    }
171

    
172
///////////////////////////////////////////////////////////////////////////////////////////////////
173

    
174
  Static4D[] getQuats()
175
    {
176
    return QUATS;
177
    }
178

    
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180

    
181
  int getNumFaces()
182
    {
183
    return FACE_COLORS.length;
184
    }
185

    
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187

    
188
  boolean shouldResetTextureMaps()
189
    {
190
    return false;
191
    }
192

    
193
///////////////////////////////////////////////////////////////////////////////////////////////////
194

    
195
  int getNumStickerTypes(int numLayers)
196
    {
197
    return NUM_STICKERS;
198
    }
199

    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201

    
202
  float[][] getCuts(int numLayers)
203
    {
204
    float C = SQ3*0.15f; // bit less than 1/6 of the length of the main diagonal
205
    float[] cut = new float[] {-C,+C};
206
    return new float[][] { cut,cut,cut,cut };
207
    }
208

    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210

    
211
  int getNumCubitFaces()
212
    {
213
    return FACES_PER_CUBIT;
214
    }
215

    
216
///////////////////////////////////////////////////////////////////////////////////////////////////
217

    
218
  float[][] getCubitPositions(int numLayers)
219
    {
220
    final float DIST1= 0.50f;
221
    final float DIST2= (1+2*REX_D)/6;
222
    final float DIST3= 0.51f;
223

    
224
    final float[][] CENTERS = new float[24+6+12][];
225

    
226
    CENTERS[ 0] = new float[] { +DIST3, +DIST2, +DIST2};
227
    CENTERS[ 1] = new float[] { +DIST3, +DIST2, -DIST2};
228
    CENTERS[ 2] = new float[] { +DIST3, -DIST2, -DIST2};
229
    CENTERS[ 3] = new float[] { +DIST3, -DIST2, +DIST2};
230
    CENTERS[ 4] = new float[] { -DIST3, +DIST2, +DIST2};
231
    CENTERS[ 5] = new float[] { -DIST3, +DIST2, -DIST2};
232
    CENTERS[ 6] = new float[] { -DIST3, -DIST2, -DIST2};
233
    CENTERS[ 7] = new float[] { -DIST3, -DIST2, +DIST2};
234
    CENTERS[ 8] = new float[] { +DIST2, +DIST3, +DIST2};
235
    CENTERS[ 9] = new float[] { +DIST2, +DIST3, -DIST2};
236
    CENTERS[10] = new float[] { -DIST2, +DIST3, -DIST2};
237
    CENTERS[11] = new float[] { -DIST2, +DIST3, +DIST2};
238
    CENTERS[12] = new float[] { +DIST2, -DIST3, +DIST2};
239
    CENTERS[13] = new float[] { +DIST2, -DIST3, -DIST2};
240
    CENTERS[14] = new float[] { -DIST2, -DIST3, -DIST2};
241
    CENTERS[15] = new float[] { -DIST2, -DIST3, +DIST2};
242
    CENTERS[16] = new float[] { +DIST2, +DIST2, +DIST3};
243
    CENTERS[17] = new float[] { +DIST2, -DIST2, +DIST3};
244
    CENTERS[18] = new float[] { -DIST2, -DIST2, +DIST3};
245
    CENTERS[19] = new float[] { -DIST2, +DIST2, +DIST3};
246
    CENTERS[20] = new float[] { +DIST2, +DIST2, -DIST3};
247
    CENTERS[21] = new float[] { +DIST2, -DIST2, -DIST3};
248
    CENTERS[22] = new float[] { -DIST2, -DIST2, -DIST3};
249
    CENTERS[23] = new float[] { -DIST2, +DIST2, -DIST3};
250

    
251
    CENTERS[24] = new float[] { +DIST3, +0.00f, +0.00f};
252
    CENTERS[25] = new float[] { -DIST3, +0.00f, +0.00f};
253
    CENTERS[26] = new float[] { +0.00f, +DIST3, +0.00f};
254
    CENTERS[27] = new float[] { +0.00f, -DIST3, +0.00f};
255
    CENTERS[28] = new float[] { +0.00f, +0.00f, +DIST3};
256
    CENTERS[29] = new float[] { +0.00f, +0.00f, -DIST3};
257

    
258
    CENTERS[30] = new float[] { +0.00f, +DIST1, +DIST1};
259
    CENTERS[31] = new float[] { +DIST1, +0.00f, +DIST1};
260
    CENTERS[32] = new float[] { +0.00f, -DIST1, +DIST1};
261
    CENTERS[33] = new float[] { -DIST1, +0.00f, +DIST1};
262
    CENTERS[34] = new float[] { +DIST1, +DIST1, +0.00f};
263
    CENTERS[35] = new float[] { +DIST1, -DIST1, +0.00f};
264
    CENTERS[36] = new float[] { -DIST1, -DIST1, +0.00f};
265
    CENTERS[37] = new float[] { -DIST1, +DIST1, +0.00f};
266
    CENTERS[38] = new float[] { +0.00f, +DIST1, -DIST1};
267
    CENTERS[39] = new float[] { +DIST1, +0.00f, -DIST1};
268
    CENTERS[40] = new float[] { +0.00f, -DIST1, -DIST1};
269
    CENTERS[41] = new float[] { -DIST1, +0.00f, -DIST1};
270

    
271
    return CENTERS;
272
    }
273

    
274
///////////////////////////////////////////////////////////////////////////////////////////////////
275

    
276
  private Static4D getQuat(int cubit)
277
    {
278
    switch(cubit)
279
      {
280
      case  0: return new Static4D(+SQ2/2,     0,+SQ2/2,     0);
281
      case  1: return QUATS[5];
282
      case  2: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
283
      case  3: return QUATS[8];
284
      case  4: return QUATS[6];
285
      case  5: return new Static4D(-SQ2/2,     0,+SQ2/2,     0);
286
      case  6: return QUATS[11];
287
      case  7: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
288
      case  8: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
289
      case  9: return QUATS[10];
290
      case 10: return new Static4D(     0,+SQ2/2,+SQ2/2,     0);
291
      case 11: return QUATS[4];
292
      case 12: return QUATS[9];
293
      case 13: return new Static4D(-SQ2/2,     0,     0, SQ2/2);
294
      case 14: return QUATS[7];
295
      case 15: return new Static4D(     0,-SQ2/2,+SQ2/2,     0);
296
      case 16: return new Static4D(     0,     0,-SQ2/2, SQ2/2);
297
      case 17: return QUATS[0];
298
      case 18: return new Static4D(     0,     0,+SQ2/2, SQ2/2);
299
      case 19: return QUATS[3];
300
      case 20: return QUATS[1];
301
      case 21: return new Static4D(+SQ2/2,-SQ2/2,     0,     0);
302
      case 22: return QUATS[2];
303
      case 23: return new Static4D(+SQ2/2,+SQ2/2,     0,     0);
304

    
305
      case 24: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
306
      case 25: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
307
      case 26: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
308
      case 27: return new Static4D(-SQ2/2,     0,     0, SQ2/2);
309
      case 28: return QUATS[0];
310
      case 29: return QUATS[1];
311

    
312
      case 30: return QUATS[0];
313
      case 31: return new Static4D(     0,     0,+SQ2/2, SQ2/2);
314
      case 32: return QUATS[3];
315
      case 33: return new Static4D(     0,     0,-SQ2/2, SQ2/2);
316
      case 34: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
317
      case 35: return QUATS[7];
318
      case 36: return QUATS[9];
319
      case 37: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
320
      case 38: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
321
      case 39: return QUATS[8];
322
      case 40: return QUATS[1];
323
      case 41: return QUATS[6];
324
      }
325

    
326
    return QUATS[0];
327
    }
328

    
329
///////////////////////////////////////////////////////////////////////////////////////////////////
330

    
331
  MeshBase createCubitMesh(int cubit, int numLayers)
332
    {
333
    if( mMeshes==null )
334
      {
335
      FactoryCubit factory = FactoryCubit.getInstance();
336
      factory.clear();
337
      mMeshes = new MeshBase[3];
338
      }
339

    
340
    MeshBase mesh;
341

    
342
    if( cubit<24 )
343
      {
344
      if( mMeshes[0]==null )
345
        {
346
        float G = (1-REX_D)*SQ2/2;
347

    
348
        double[][] vertices =
349
           {
350
             {  -0.033333f, 0.23333f, 0.0f },
351
             {  -0.233333f, 0.03333f, 0.0f },
352
             {  +0.216666f,-0.23666f, 0.0f },
353
             {  +0.236666f,-0.21666f, 0.0f }
354
           };
355

    
356
        int[][] vertIndexes =
357
           {
358
             {0,1,2,3},
359
             {3,2,1,0}
360
           };
361

    
362
        float[][] centers= new float[][] { {0.0f,0.0f,-G/3} };
363
        float[][] corners= new float[][] { {0.03f,0.10f} };
364
        int[] indexes= {-1,-1,0,0};
365

    
366
        int[] bandIndexes= new int[] { 0,1 };
367

    
368
        float[][] bands =
369
          {
370
               {+0.016f,10,G/3,0.5f,5,1,1},
371
               {+0.230f,45,G/3,0.0f,2,0,0}
372
          };
373

    
374
        FactoryCubit factory = FactoryCubit.getInstance();
375
        factory.createNewFaceTransform(vertices,vertIndexes);
376
        mMeshes[0] = factory.createRoundedSolid(vertices, vertIndexes,
377
                                                bands, bandIndexes,
378
                                                corners, indexes,
379
                                                centers, indexes,
380
                                                getNumCubitFaces(), null );
381
        }
382
      mesh = mMeshes[0].copy(true);
383
      }
384
    else if( cubit<30 )
385
      {
386
      if( mMeshes[1]==null )
387
        {
388
        double[][] vertices =
389
          {
390
            { -REX_D,   0.0f, 0.0f },
391
            {   0.0f, -REX_D, 0.0f },
392
            { +REX_D,   0.0f, 0.0f },
393
            {   0.0f, +REX_D, 0.0f }
394
          };
395

    
396
        int[][] vertIndexes=
397
          {
398
            {0,1,2,3},
399
            {3,2,1,0}
400
          };
401

    
402
        float[][] bands =
403
          {
404
            {0.025f,10,REX_D/2,0.5f,5,0,0},
405
            {0.000f,45,REX_D/2,0.0f,2,0,0}
406
          };
407

    
408
        int[] indexes= {-1,-1,-1,-1};
409
        int[] bandIndexes= new int[] { 0,1 };
410

    
411
        FactoryCubit factory = FactoryCubit.getInstance();
412
        factory.createNewFaceTransform(vertices,vertIndexes);
413
        mMeshes[1] = factory.createRoundedSolid(vertices, vertIndexes,
414
                                               bands, bandIndexes,
415
                                               null, indexes,
416
                                               null, indexes,
417
                                               getNumCubitFaces(), null );
418
        }
419
      mesh = mMeshes[1].copy(true);
420
      }
421
    else
422
      {
423
      if( mMeshes[2]==null )
424
        {
425
        float E = 0.5f - REX_D;
426
        float F = 0.5f;
427
        float G = (float)Math.sqrt(E*E+F*F);
428

    
429
        double[][] vertices =
430
           {
431
             { -F, 0, 0 },
432
             {  0,-E, 0 },
433
             { +F, 0, 0 },
434
             {  0, 0,-E },
435
           };
436

    
437
        int[][] vertIndexes =
438
           {
439
             {0,1,2},
440
             {0,2,3},
441
             {0,3,1},
442
             {1,3,2}
443
           };
444

    
445
        float[][] centers= new float[][] { {0.0f,-0.5f,-0.5f} };
446
        float[][] corners= new float[][] { {0.06f,0.10f} };
447
        int[] indexes= {0,-1,0,-1};
448

    
449
        int[] bandIndexes= new int[] { 0,0,1,1 };
450

    
451
        float[][] bands =
452
          {
453
               {0.03f,27,F/3,0.8f,5,2,3},
454
               {0.01f,45,G/3,0.2f,3,1,2}
455
          };
456

    
457
        FactoryCubit factory = FactoryCubit.getInstance();
458
        factory.createNewFaceTransform(vertices,vertIndexes);
459
        mMeshes[2] = factory.createRoundedSolid(vertices, vertIndexes,
460
                                                bands, bandIndexes,
461
                                                corners, indexes,
462
                                                centers, indexes,
463
                                                getNumCubitFaces(), null );
464
        }
465
      mesh = mMeshes[2].copy(true);
466
      }
467

    
468
    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit), new Static3D(0,0,0) );
469
    mesh.apply(quat,0xffffffff,0);
470

    
471
    return mesh;
472
    }
473

    
474
///////////////////////////////////////////////////////////////////////////////////////////////////
475

    
476
  int getFaceColor(int cubit, int cubitface, int numLayers)
477
    {
478
    return mFaceMap[cubit][cubitface];
479
    }
480

    
481
///////////////////////////////////////////////////////////////////////////////////////////////////
482

    
483
  int getColor(int face)
484
    {
485
    return FACE_COLORS[face];
486
    }
487

    
488
///////////////////////////////////////////////////////////////////////////////////////////////////
489

    
490
  ObjectSticker retSticker(int face)
491
    {
492
    return mStickers[face/NUM_FACES];
493
    }
494

    
495
///////////////////////////////////////////////////////////////////////////////////////////////////
496

    
497
  float returnMultiplier()
498
    {
499
    return 2.0f;
500
    }
501

    
502
///////////////////////////////////////////////////////////////////////////////////////////////////
503
// PUBLIC API
504

    
505
  public Static3D[] getRotationAxis()
506
    {
507
    return ROT_AXIS;
508
    }
509

    
510
///////////////////////////////////////////////////////////////////////////////////////////////////
511

    
512
  public int[] getBasicAngle()
513
    {
514
    return BASIC_ANGLE;
515
    }
516

    
517
///////////////////////////////////////////////////////////////////////////////////////////////////
518

    
519
  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total)
520
    {
521
    if( curr==0 )
522
      {
523
      scramble[curr][0] = rnd.nextInt(NUM_AXIS);
524
      }
525
    else
526
      {
527
      int newVector = rnd.nextInt(NUM_AXIS -1);
528
      scramble[curr][0] = (newVector>=scramble[curr-1][0] ? newVector+1 : newVector);
529
      }
530

    
531
    scramble[curr][1] = rnd.nextFloat()<=0.5f ? 0 : 2;
532

    
533
    switch( rnd.nextInt(2) )
534
      {
535
      case 0: scramble[curr][2] = -1; break;
536
      case 1: scramble[curr][2] =  1; break;
537
      }
538
    }
539

    
540
///////////////////////////////////////////////////////////////////////////////////////////////////
541
// The Rex is solved if and only if:
542
//
543
// 1) all 12 of its edge cubits are rotated with the same quat
544
// 2) all its face & corner cubits are rotated with the same quat like the edge ones,
545
//    and optionally they also might be upside down.
546
//
547
// i.e.
548
// corners ( 0, 1, 2, 3, 4, 5, 6, 7) and faces (24,25) - might be extra QUAT[1]
549
// corners ( 8, 9,10,11,12,13,14,15) and faces (26,27) - might be extra QUAT[2]
550
// corners (16,17,18,19,20,21,22,23) and faces (28,29) - might be extra QUAT[3]
551

    
552
  public boolean isSolved()
553
    {
554
    int q1,q = CUBITS[30].mQuatIndex;
555

    
556
    for(int i=31; i<42; i++)
557
      {
558
      if( CUBITS[i].mQuatIndex != q) return false;
559
      }
560

    
561
    q1 = mulQuat(q,1);
562

    
563
    for(int i=0; i<8; i++)
564
      {
565
      if( CUBITS[i].mQuatIndex != q && CUBITS[i].mQuatIndex != q1 ) return false;
566
      }
567

    
568
    if( CUBITS[24].mQuatIndex != q && CUBITS[24].mQuatIndex != q1 ) return false;
569
    if( CUBITS[25].mQuatIndex != q && CUBITS[25].mQuatIndex != q1 ) return false;
570

    
571
    q1 = mulQuat(q,2);
572

    
573
    for(int i=8; i<16; i++)
574
      {
575
      if( CUBITS[i].mQuatIndex != q && CUBITS[i].mQuatIndex != q1 ) return false;
576
      }
577

    
578
    if( CUBITS[26].mQuatIndex != q && CUBITS[26].mQuatIndex != q1 ) return false;
579
    if( CUBITS[27].mQuatIndex != q && CUBITS[27].mQuatIndex != q1 ) return false;
580

    
581
    q1 = mulQuat(q,3);
582

    
583
    for(int i=16; i<24; i++)
584
      {
585
      if( CUBITS[i].mQuatIndex != q && CUBITS[i].mQuatIndex != q1 ) return false;
586
      }
587

    
588
    if( CUBITS[28].mQuatIndex != q && CUBITS[28].mQuatIndex != q1 ) return false;
589
    if( CUBITS[29].mQuatIndex != q && CUBITS[29].mQuatIndex != q1 ) return false;
590

    
591
    return true;
592
    }
593

    
594
///////////////////////////////////////////////////////////////////////////////////////////////////
595

    
596
  public int getObjectName(int numLayers)
597
    {
598
    return R.string.rex3;
599
    }
600

    
601
///////////////////////////////////////////////////////////////////////////////////////////////////
602

    
603
  public int getInventor(int numLayers)
604
    {
605
    return R.string.rex3_inventor;
606
    }
607

    
608
///////////////////////////////////////////////////////////////////////////////////////////////////
609

    
610
  public int getComplexity(int numLayers)
611
    {
612
    return 3;
613
    }
614
}
(36-36/41)