Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyMorphix.java @ 3a0990b1

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2022 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.objects;
11

    
12
import org.distorted.library.type.Static3D;
13
import org.distorted.library.type.Static4D;
14
import org.distorted.objectlib.helpers.FactoryCubit;
15
import org.distorted.objectlib.helpers.ObjectFaceShape;
16
import org.distorted.objectlib.helpers.ObjectShape;
17
import org.distorted.objectlib.metadata.Metadata;
18
import org.distorted.objectlib.helpers.ObjectVertexEffects;
19
import org.distorted.objectlib.main.InitAssets;
20
import org.distorted.objectlib.metadata.ListObjects;
21
import org.distorted.objectlib.scrambling.ScrambleEdgeGenerator;
22
import org.distorted.objectlib.shape.ShapeTetrahedron;
23
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
24

    
25
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_CHANGING_SHAPEMOD;
26
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
27

    
28
///////////////////////////////////////////////////////////////////////////////////////////////////
29

    
30
public class TwistyMorphix extends ShapeTetrahedron
31
{
32
  // size>=3: if length of the edge of the whole tetrahedron is = 1.0, then
33
  // length of the edge of the corner cubit is equal to DIST. (separate for size 3 and 4)
34
  private static final float DIST3 = 0.39f;
35
  private static final float DIST4 = 0.365f;
36

    
37
  static final Static3D[] ROT_AXIS = new Static3D[]
38
         {
39
           new Static3D( SQ2/2, 0.0f, SQ2/2),
40
           new Static3D(  0.0f, 1.0f,  0.0f),
41
           new Static3D( SQ2/2, 0.0f,-SQ2/2),
42
         };
43

    
44
  private int[][] mEdges;
45
  private int[][] mBasicAngle;
46
  private float[][] mCuts;
47
  private float[][] mCenters;
48
  private int[] mQuatIndex;
49

    
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

    
52
  public TwistyMorphix(int iconMode, Static4D quat, Static3D move, float scale, Metadata meta, InitAssets asset)
53
    {
54
    super(iconMode, meta.getNumLayers()[0], quat, move, scale, meta, asset);
55
    }
56

    
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58

    
59
  @Override
60
  public float[][] returnRotationFactor()
61
    {
62
    int numL = getNumLayers()[0];
63
    float[] f = new float[numL];
64
    for(int i=0; i<numL; i++) f[i] = 1.3f;
65
    return new float[][] { f,f,f };
66
    }
67

    
68
///////////////////////////////////////////////////////////////////////////////////////////////////
69

    
70
  @Override
71
  public float getPillowCoeff()
72
    {
73
    return 1.5f;
74
    }
75

    
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77

    
78
  @Override
79
  public int getInternalColor()
80
    {
81
    return getNumLayers()[0]==2 ? 0xff000000 : 0xff333333;
82
    }
83

    
84
///////////////////////////////////////////////////////////////////////////////////////////////////
85

    
86
  public int[][] getScrambleEdges()
87
    {
88
    if( mEdges==null )
89
      {
90
      int nL = getNumLayers()[0];
91
      mEdges = ScrambleEdgeGenerator.getScrambleEdgesCuboid(nL,nL,nL);
92
      }
93

    
94
    return mEdges;
95
    }
96

    
97
///////////////////////////////////////////////////////////////////////////////////////////////////
98

    
99
  public float[][] getCuts(int[] numLayers)
100
    {
101
    if( mCuts==null )
102
      {
103
      int numL = numLayers[0];
104
      float[] cut = new float[numL-1];
105
      float DIST = numL==3 ? DIST3:DIST4;
106
      float dist = numL*(SQ2/2)*(0.5f-DIST);
107

    
108
      switch(numL)
109
        {
110
        case 2: cut[0] = 0;
111
                break;
112
        case 3: cut[0] = -dist;
113
                cut[1] =  dist;
114
                break;
115
        case 4: cut[0] = -dist;
116
                cut[1] = 0.0f;
117
                cut[2] =  dist;
118
                break;
119
        }
120

    
121
      mCuts = new float[][] { cut,cut,cut };
122
      }
123

    
124
    return mCuts;
125
    }
126

    
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128

    
129
  public boolean[][] getLayerRotatable(int[] numLayers)
130
    {
131
    int numL = numLayers[0];
132
    boolean[] tmp = new boolean[numL];
133
    for(int i=0; i<numL; i++) tmp[i] = true;
134

    
135
    return new boolean[][] { tmp,tmp,tmp };
136
    }
137

    
138
///////////////////////////////////////////////////////////////////////////////////////////////////
139

    
140
  public int getTouchControlType()
141
    {
142
    return TC_CHANGING_SHAPEMOD;
143
    }
144

    
145
///////////////////////////////////////////////////////////////////////////////////////////////////
146

    
147
  public int getTouchControlSplit()
148
    {
149
    return TYPE_NOT_SPLIT;
150
    }
151

    
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153

    
154
  public int[][][] getEnabled()
155
    {
156
    return null;
157
    }
158

    
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

    
161
  public float[] getDist3D(int[] numLayers)
162
    {
163
    return TouchControlTetrahedron.D3D;
164
    }
165

    
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167

    
168
  public Static3D[] getFaceAxis()
169
    {
170
    return TouchControlTetrahedron.FACE_AXIS;
171
    }
172

    
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

    
175
  public float[][] getCubitPositions(int[] numLayers)
176
    {
177
    if( mCenters==null )
178
      {
179
      int numL = numLayers[0];
180
      float DIST = numL==3 ? DIST3:DIST4;
181
      final float C = numL==2 ? 1.0f : 6*numL*(0.25f-DIST/3);
182
      final float A = C*SQ2/6;
183
      final float B = C/3;
184
      final float D = (SQ2/12)*numL;
185
      final float E = (1.0f/6)*numL;
186

    
187
      if( numL==2 )
188
        {
189
        mCenters = new float[][]
190
           {
191
             {0.0f, -A,   +B},
192
             {0.0f, -A,   -B},
193
             {  +B,  A, 0.0f},
194
             {  -B,  A, 0.0f},
195

    
196
             {0.0f,  D,   +E},
197
             {0.0f,  D,   -E},
198
             {  +E, -D, 0.0f},
199
             {  -E, -D, 0.0f}
200
           };
201
        }
202
      else if( numL==3 )
203
        {
204
        final float X1 = 0.5f*(3*DIST-1)*numL;
205
        final float X2 = 0.5f*DIST*numL;
206
        final float X = 0.25f*numL*(1-DIST);
207
        final float Y = numL*(1-DIST)*(SQ2/4);
208
        final float F = 0.5f*(1-DIST)*numL - X2 + X1/2;
209
        final float G = 0.5f*F;
210
        final float H = (SQ2/2)*F;
211

    
212
        mCenters = new float[][]
213
           {
214
             {0.0f, -A,   +B},
215
             {0.0f, -A,   -B},
216
             {  +B,  A, 0.0f},
217
             {  -B,  A, 0.0f},
218

    
219
             {0.0f,  D,   +E},
220
             {0.0f,  D,   -E},
221
             {  +E, -D, 0.0f},
222
             {  -E, -D, 0.0f},
223

    
224
             {0.0f,  +Y,0.0f},
225
             {0.0f,  -Y,0.0f},
226
             {  +X,0.0f,  +X},
227
             {  +X,0.0f,  -X},
228
             {  -X,0.0f,  +X},
229
             {  -X,0.0f,  -X},
230

    
231
             {0.0f,0.0f,   F},
232
             {   G,   H,   G},
233
             {  -G,   H,   G},
234
             {0.0f,0.0f,  -F},
235
             {   G,   H,  -G},
236
             {  -G,   H,  -G},
237
             {   F,0.0f,0.0f},
238
             {   G,  -H,   G},
239
             {   G,  -H,  -G},
240
             {  -F,0.0f,0.0f},
241
             {  -G,  -H,   G},
242
             {  -G,  -H,  -G},
243
           };
244
        }
245
      else
246
        {
247
        final float X1 = 0.5f*(3*DIST-1)*numL;
248
        final float X2 = 0.5f*DIST*numL;
249
        final float X = 0.25f*numL*(1-DIST);
250
        final float Y = numL*(1-DIST)*(SQ2/4);
251
        final float Z = numL*(1-2*DIST)/(2*numL-4);
252
        final float F = 0.5f*(1-DIST)*numL - X2 + X1/2;
253
        final float G = 0.5f*F;
254
        final float H = (SQ2/2)*F;
255
        final float I = (0.25f-DIST/2)*numL;
256

    
257
        mCenters = new float[][]
258
           {
259
             {0.0f, -A,   +B},
260
             {0.0f, -A,   -B},
261
             {  +B,  A, 0.0f},
262
             {  -B,  A, 0.0f},
263

    
264
             {0.0f,  D,   +E},
265
             {0.0f,  D,   -E},
266
             {  +E, -D, 0.0f},
267
             {  -E, -D, 0.0f},
268

    
269
             {  +Z,  +Y,0.0f},
270
             {  -Z,  +Y,0.0f},
271
             {0.0f,  -Y,  +Z},
272
             {0.0f,  -Y,  -Z},
273
             {   X-Z/2,-(SQ2/2)*Z,   X+Z/2},
274
             {   X+Z/2, (SQ2/2)*Z,   X-Z/2},
275
             {   X-Z/2,-(SQ2/2)*Z,  -X-Z/2},
276
             {   X+Z/2, (SQ2/2)*Z,  -X+Z/2},
277
             {  -X+Z/2,-(SQ2/2)*Z,   X+Z/2},
278
             {  -X-Z/2, (SQ2/2)*Z,   X-Z/2},
279
             {  -X+Z/2,-(SQ2/2)*Z,  -X-Z/2},
280
             {  -X-Z/2, (SQ2/2)*Z,  -X+Z/2},
281

    
282
             {0.0f,-I*(SQ2/2),   F+I*0.5f},
283
             {   G+0.75f*I,   H+(SQ2/4)*I,   G-0.25f*I},
284
             {  -G-0.75f*I,   H+(SQ2/4)*I,   G-0.25f*I},
285
             {0.0f,-I*(SQ2/2),  -F-I*0.5f},
286
             {   G+0.75f*I,   H+(SQ2/4)*I,  -G+0.25f*I},
287
             {  -G-0.75f*I,   H+(SQ2/4)*I,  -G+0.25f*I},
288
             {   F+0.5f*I, I*(SQ2/2),0.0f},
289
             {   G-0.25f*I,  -H-(SQ2/4)*I,   G+0.75f*I},
290
             {   G-0.25f*I,  -H-(SQ2/4)*I,  -G-0.75f*I},
291
             {  -F-0.5f*I, I*(SQ2/2),0.0f},
292
             {  -G+0.25f*I,  -H-(SQ2/4)*I,   G+0.75f*I},
293
             {  -G+0.25f*I,  -H-(SQ2/4)*I,  -G-0.75f*I},
294

    
295
             {        0.0f,   I*(SQ2/2),     F+I*0.5f},
296
             {   G-0.25f*I,   H+(SQ2/4)*I,   G+0.75f*I},
297
             {  -G+0.25f*I,   H+(SQ2/4)*I,   G+0.75f*I},
298
             {        0.0f,   I*(SQ2/2),    -F-I*0.5f},
299
             {   G-0.25f*I,   H+(SQ2/4)*I,  -G-0.75f*I},
300
             {  -G+0.25f*I,   H+(SQ2/4)*I,  -G-0.75f*I},
301
             {   F+0.5f*I,   -I*(SQ2/2),          0.0f},
302
             {   G+0.75f*I,  -H-(SQ2/4)*I,   G-0.25f*I},
303
             {   G+0.75f*I,  -H-(SQ2/4)*I,  -G+0.25f*I},
304
             {  -F-0.5f*I,   -I*(SQ2/2),          0.0f},
305
             {  -G-0.75f*I,  -H-(SQ2/4)*I,   G-0.25f*I},
306
             {  -G-0.75f*I,  -H-(SQ2/4)*I,  -G+0.25f*I},
307

    
308
             {0.0f,    Y,   +Z},
309
             {0.0f,    Y,   -Z},
310
             {  +Z,   -Y, 0.0f},
311
             {  -Z,   -Y, 0.0f},
312
             { (SQ2/2)*Y-Z/2, (SQ2/2)*Z, (SQ2/2)*Y+Z/2},
313
             { (SQ2/2)*Y+Z/2,-(SQ2/2)*Z, (SQ2/2)*Y-Z/2},
314
             {-(SQ2/2)*Y+Z/2, (SQ2/2)*Z, (SQ2/2)*Y+Z/2},
315
             {-(SQ2/2)*Y-Z/2,-(SQ2/2)*Z, (SQ2/2)*Y-Z/2},
316
             { (SQ2/2)*Y-Z/2, (SQ2/2)*Z,-(SQ2/2)*Y-Z/2},
317
             { (SQ2/2)*Y+Z/2,-(SQ2/2)*Z,-(SQ2/2)*Y+Z/2},
318
             {-(SQ2/2)*Y+Z/2, (SQ2/2)*Z,-(SQ2/2)*Y-Z/2},
319
             {-(SQ2/2)*Y-Z/2,-(SQ2/2)*Z,-(SQ2/2)*Y+Z/2},
320
           };
321
        }
322
      }
323

    
324
    return mCenters;
325
    }
326

    
327
///////////////////////////////////////////////////////////////////////////////////////////////////
328

    
329
  public Static4D getCubitQuats(int cubit, int[] numLayers)
330
    {
331
    if( mQuatIndex==null )
332
      {
333
      switch(numLayers[0])
334
        {
335
        case 2: mQuatIndex = new int[] { 0,5,2,8,
336
                                         0,5,2,8
337
                                       };
338
                break;
339
        case 3: mQuatIndex = new int[] { 0,5,2,8,
340
                                         0,5,2,8,
341
                                         0,2,15,10,20,13,
342
                                         0,21,15,5,13,10,2,12,23,8,22,20
343
                                       };
344
                break;
345
        default:mQuatIndex = new int[] { 0,5,2,8,
346
                                         0,5,2,8,
347
                                         0,0,2,2,15,15,10,10,20,20,13,13,
348
                                         0,21,15,5,13,10,2,12,23,8,22,20,
349
                                         0,21,15,5,13,10,2,12,23,8,22,20,
350
                                         0,5,2,8,15,23,21,20,10,12,13,22
351
                                       };
352
        }
353

    
354
      }
355

    
356
    return mObjectQuats[mQuatIndex[cubit]];
357
    }
358

    
359
///////////////////////////////////////////////////////////////////////////////////////////////////
360

    
361
  private float[][] getVertices(int variant)
362
    {
363
    int numL = getNumLayers()[0];
364
    float DIST = numL==3 ? DIST3:DIST4;
365

    
366
    if( variant==0 )
367
      {
368
      final float Z = numL==2 ? 1.0f : numL*DIST;
369
      final float Y = (SQ2/2)*Z;
370

    
371
      return new float[][]
372
          {
373
              {0.0f,-2*Y/3, 2*Z/3 },
374
              {0.0f,-2*Y/3,  -Z/3 },
375
              { Z/2,   Y/3,   Z/6 },
376
              {-Z/2,   Y/3,   Z/6 },
377
              {0.0f,   Y/3,  -Z/3 }
378
          };
379
      }
380
    else if( variant==1 )
381
      {
382
      final float X = numL==2 ? 1.0f : numL*(3*DIST-1);
383
      final float Y = (SQ2/2)*X;
384
      final float Z = 0.5f*X;
385

    
386
      return new float[][]
387
          {
388
              {-X/2,  -Y/3,   Z/3 },
389
              { X/2,  -Y/3,   Z/3 },
390
              {0.0f, 2*Y/3,-2*Z/3 },
391
              {0.0f,  -Y/3,-2*Z/3 }
392
          };
393
      }
394
    else if( variant==2 )
395
      {
396
      final float X = numL*(1-2*DIST)/(2*numL-4);
397
      final float Y = (SQ2/4)*DIST*numL;
398

    
399
      return new float[][]
400
          {
401
              {  +X,     +Y,  0.0f },
402
              {  -X,     +Y,  0.0f },
403
              {0.0f,Y-X*SQ2,    +X },
404
              {0.0f,Y-X*SQ2,    -X },
405
              {  +X,     -Y,  0.0f },
406
              {  -X,     -Y,  0.0f },
407
              {0.0f,     -Y,    +X },
408
              {0.0f,     -Y,    -X },
409
          };
410
      }
411
    else if( variant==3 )
412
      {
413
      final float C = numL==3 ? 3*DIST-1 : 2*DIST-0.5f;
414
      final float X1 = 0.5f*C*numL;
415
      final float X2 = 0.5f*DIST*numL;
416
      final float Y  = (SQ2/4)*numL*(1-2*DIST)/(numL-2);
417

    
418
      return new float[][]
419
          {
420
              {  +X1,+Y, X1/2 },
421
              {  -X1,+Y, X1/2 },
422
              { 0.0f,+Y,-X1/2 },
423
              {  +X2,-Y, X2-X1/2 },
424
              {  -X2,-Y, X2-X1/2 },
425
              { 0.0f,-Y,-X1/2 },
426
          };
427
      }
428
    else if( variant==4 )
429
      {
430
      final float X1 = 0.5f*(3*DIST-1)*numL;
431
      final float X2 = 0.5f*(2*DIST-0.5f)*numL;
432
      final float Y  = (SQ2/4)*numL*(1-2*DIST)/(numL-2);
433

    
434
      return new float[][]
435
          {
436
              {  +X1,+Y,+X1-X2/2 },
437
              {  -X1,+Y,+X1-X2/2 },
438
              { 0.0f,+Y,-X2/2 },
439
              {  +X2,-Y,+X2/2 },
440
              {  -X2,-Y,+X2/2 },
441
              { 0.0f,-Y,-X2/2 },
442
          };
443
      }
444
    else
445
      {
446
      final float X = numL*(1-2*DIST)/(2*numL-4);
447
      final float Y = (SQ2/4)*DIST*numL;
448

    
449
      return new float[][]
450
          {
451
              {  +X,  Y-X*SQ2,  0.0f },
452
              {  -X,  Y-X*SQ2,  0.0f },
453
              {0.0f,Y-2*X*SQ2,    +X },
454
              {0.0f,Y        ,    -X },
455
              {  +X,       -Y,  0.0f },
456
              {  -X,       -Y,  0.0f },
457
              {0.0f,       -Y,    +X },
458
              {0.0f,       -Y,    -X },
459
          };
460
      }
461
    }
462

    
463
///////////////////////////////////////////////////////////////////////////////////////////////////
464

    
465
  public ObjectShape getObjectShape(int variant)
466
    {
467
    if( variant==0 )
468
      {
469
      int[][] indices = { {0,2,3},{0,1,2},{0,3,1},{4,2,1},{4,1,3},{4,3,2} };
470
      return new ObjectShape(getVertices(variant), indices);
471
      }
472
    else if( variant==1 )
473
      {
474
      int[][] indices = { {1,2,0},{3,1,0},{1,3,2},{3,0,2} };
475
      return new ObjectShape(getVertices(variant), indices);
476
      }
477
    else if( variant==2 )
478
      {
479
      int[][] indices = { {0,1,2},{0,3,1},{0,2,6,4},{2,1,5,6},{3,0,4,7},{1,3,7,5},{6,5,7,4} };
480
      return new ObjectShape(getVertices(variant), indices);
481
      }
482
    else if( variant==3 )
483
      {
484
      int[][] indices = { {0,1,4,3},{0,3,5,2},{2,5,4,1},{0,2,1},{5,3,4} };
485
      return new ObjectShape(getVertices(variant), indices);
486
      }
487
    else if( variant==4 )
488
      {
489
      int[][] indices = { {0,1,4,3},{0,3,5,2},{2,5,4,1},{0,2,1},{5,3,4} };
490
      return new ObjectShape(getVertices(variant), indices);
491
      }
492
    else
493
      {
494
      int[][] indices = { {3,1,2,0},{0,2,6,4},{2,1,5,6},{3,0,4,7},{1,3,7,5},{6,5,7,4} };
495
      return new ObjectShape(getVertices(variant), indices);
496
      }
497
    }
498

    
499
///////////////////////////////////////////////////////////////////////////////////////////////////
500

    
501
  public ObjectFaceShape getObjectFaceShape(int variant)
502
    {
503
    float height = isInIconMode() ? 0.001f : 0.03f;
504
    float internal = 0.02f;
505
    int numL = getNumLayers()[0];
506

    
507
    if( variant==0 )
508
      {
509
      float eV = numL==2 ? 2 : 0;
510
      float[][] bands = { {height,30,0.15f,0.5f,5,1,eV}, {internal,30,0.2f,0.4f,5,1,eV} };
511
      int[] indices   = { 0,0,0,1,1,1 };
512
      return new ObjectFaceShape(bands,indices,null);
513
      }
514
    else if( variant==1 )
515
      {
516
      float eI = numL==2 ? 1 : 0;
517
      float eV = numL==2 ? 1 : 0;
518
      int N = numL==2 ? 5 : 4;
519
      float[][] bands = { {height,30,0.15f,0.5f,N,eI,eV}, {internal,30,0.25f,0.5f,N,eI,eV} };
520
      int[] indices   = { 0,1,1,1 };
521
      return new ObjectFaceShape(bands,indices,null);
522
      }
523
    else if( variant==2 )
524
      {
525
      float[][] bands = { {height,30,0.15f,0.5f,5,1,0}, {internal,30,0.25f,0.5f,5,1,0} };
526
      int[] indices   = { 0,0,1,1,1,1,1 };
527
      return new ObjectFaceShape(bands,indices,null);
528
      }
529
    else if( variant==3 || variant==4 )
530
      {
531
      float[][] bands = { {height,30,0.15f,0.5f,5,0,0}, {internal,30,0.25f,0.5f,4,0,0} };
532
      int[] indices   = { 0,1,1,1,1 };
533
      return new ObjectFaceShape(bands,indices,null);
534
      }
535
    else
536
      {
537
      float[][] bands = { {height,30,0.15f,0.5f,5,0,0}, {internal,30,0.25f,0.5f,3,0,0} };
538
      int[] indices   = { 0,1,1,1,1,1 };
539
      return new ObjectFaceShape(bands,indices,null);
540
      }
541
    }
542

    
543
///////////////////////////////////////////////////////////////////////////////////////////////////
544

    
545
  public ObjectVertexEffects getVertexEffects(int variant)
546
    {
547
    int numL = getNumLayers()[0];
548
    float DIST = numL==3 ? DIST3:DIST4;
549

    
550
    if( variant==0 )
551
      {
552
      float push1 = numL<=3 ? 0.07f : 0.06f;
553
      float push2 = numL<=3 ? 0.06f : 0.05f;
554
      float[][] corners = { {push1,0.025f}, {push2,0.020f} };
555
      int[] indices     = { 0,0,0,0,-1 };
556
      float[][] centers = { { 0.0f,0.0f,0.0f } };
557
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
558
      }
559
    else if( variant==1 )
560
      {
561
      final float C = numL==2 ? 1.0f : numL*(3*DIST-1);
562
      final float Y = (SQ2/2)*C;
563
      final float Z = 0.5f*C;
564
      float[][] corners = { {0.08f,0.013f} };
565
      int[] indices     = { -1,-1,-1,-1 };
566
      float[][] centers = { { 0.0f,-Y/3,-2*Z/3 } };
567
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
568
      }
569
    else if( variant==2 )
570
      {
571
      float[][] corners = { {0.07f,0.013f} };
572
      int[] indices     = { 0,0,-1,-1,-1,-1,-1,-1 };
573
      float[][] centers = { { 0.0f,0.0f,0.0f } };
574
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
575
      }
576
    else if( variant==3 || variant==4 )
577
      {
578
      int C = variant==3 ? 0 : -1;
579
      final float Y = (SQ2/4)*numL*(1-2*DIST)/(numL-2);
580
      float[][] corners = { {0.05f,0.023f} };
581
      int[] indices     = { -1,-1,-1,C,C,-1, };
582
      float[][] centers = { { 0.0f,-Y,0.0f } };
583
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
584
      }
585
    else
586
      {
587
      final float Z = numL*(1-2*DIST)/(2*numL-4);
588
      float[][] corners = { {0.02f,0.023f} };
589
      int[] indices     = { 0,0,0,0,-1,-1,-1,-1 };
590
      float[][] centers = { { 0.0f,0.0f,-Z } };
591
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
592
      }
593
    }
594

    
595
///////////////////////////////////////////////////////////////////////////////////////////////////
596

    
597
  public int getNumCubitVariants(int[] numLayers)
598
    {
599
    switch(numLayers[0])
600
      {
601
      case 2: return 2;
602
      case 3: return 4;
603
      case 4: return 6;
604
      }
605

    
606
    return 0;
607
    }
608

    
609
///////////////////////////////////////////////////////////////////////////////////////////////////
610

    
611
  public int getCubitVariant(int cubit, int[] numLayers)
612
    {
613
    switch(numLayers[0])
614
      {
615
      case 2: return cubit<4 ? 0 : 1;
616
      case 3: return cubit<4 ? 0 : ( cubit<8 ? 1: (cubit<14 ? 2:3) );
617
      case 4: return cubit<4 ? 0 : ( cubit<8 ? 1: (cubit<20 ? 2: (cubit<32 ? 3: (cubit<44 ? 4:5) ) ) );
618
      }
619

    
620
    return 0;
621
    }
622

    
623
///////////////////////////////////////////////////////////////////////////////////////////////////
624

    
625
  public float getStickerRadius()
626
    {
627
    return 0.10f;
628
    }
629

    
630
///////////////////////////////////////////////////////////////////////////////////////////////////
631

    
632
  public float getStickerStroke()
633
    {
634
    float stroke = 0.07f;
635

    
636
    if( isInIconMode() )
637
      {
638
      int[] numLayers = getNumLayers();
639

    
640
      switch(numLayers[0])
641
        {
642
        case 2: stroke*=1.4f; break;
643
        case 3: stroke*=2.1f; break;
644
        case 4: stroke*=2.5f; break;
645
        default:stroke*=3.2f; break;
646
        }
647
      }
648

    
649
    return stroke;
650
    }
651

    
652
///////////////////////////////////////////////////////////////////////////////////////////////////
653

    
654
  public float[][][] getStickerAngles()
655
    {
656
    return null;
657
    }
658

    
659
///////////////////////////////////////////////////////////////////////////////////////////////////
660
// PUBLIC API
661

    
662
  public Static3D[] getRotationAxis()
663
    {
664
    return ROT_AXIS;
665
    }
666

    
667
///////////////////////////////////////////////////////////////////////////////////////////////////
668

    
669
  public int[][] getBasicAngles()
670
    {
671
    if( mBasicAngle==null )
672
      {
673
      int num = getNumLayers()[0];
674
      int[] tmp = new int[num];
675
      for(int i=0; i<num; i++) tmp[i] = 4;
676
      mBasicAngle = new int[][] { tmp,tmp,tmp };
677
      }
678

    
679
    return mBasicAngle;
680
    }
681

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

    
684
  public String getShortName()
685
    {
686
    switch(getNumLayers()[0])
687
      {
688
      case 2: return ListObjects.MORP_2.name();
689
      case 3: return ListObjects.MORP_3.name();
690
      case 4: return ListObjects.MORP_4.name();
691
      }
692
    return null;
693
    }
694

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

    
697
  public String[][] getTutorials()
698
    {
699
    switch(getNumLayers()[0])
700
      {
701
      case 2: return new String[][] {
702
                          {"gb","dD67B3cRaFw","Pyramorphix Solve Tutorial","SpeedCubeReview"},
703
                          {"es","RA37LhYlEW8","Resolver Pyramorphix","Cuby"},
704
                          {"ru","fTNXLAAuGAI","Как собрать Пираморфикс 2х2","Алексей Ярыгин"},
705
                          {"fr","SfEqoud5KRc","Résolution du Pyramorphix","Asthalis"},
706
                          {"de","1VDGoVJZCug","Pyramorphix - Tutorial","GerCubing"},
707
                          {"pl","b7VpuXloBNU","Mastermorphix 2x2 Tutorial PL","MrUK"},
708
                          {"br","wByfDxTrbC8","Como resolver o Pyramorphix","Rafael Cinoto"},
709
                          {"kr","WIy5ZvTXsOY","피라몰픽스 쉽게 맞추기","큐브놀이터"},
710
                          {"vn","6CuTRLjKHho","Tutorial N.14 - Pyramorphix","Duy Thích Rubik"},
711
                          {"tw","-pvYOJN9u6U","二階魔粽 直覺式解法","不正常魔術方塊研究中心"},
712
                         };
713
      case 3: return new String[][] {
714
                          {"gb","Q1DXmDGyebc","How to Solve the Mastermorphix","Z3"},
715
                          {"es","8kOuV-O4jGA","Resolver Mastermorphix 3x3","Cuby"},
716
                          {"ru","hs5jZee0XUo","Как собрать Мастерморфикс 3х3","Алексей Ярыгин"},
717
                          {"fr","73j0APwbWzc","Résolution du Mastermorphix","Asthalis"},
718
                          {"de","gbo7yTTHx5A","Mastermorphix - Tutorial","GerCubing"},
719
                          {"pl","_ZgduvWVx14","Mastermorphix Tutorial PL","MrUK"},
720
                          {"br","bFJjjWPsDoY","Mastermorphix - tutorial","Cubo da Loucura"},
721
                          {"kr","yKW48BaE91M","마스터 몰픽스 해법","듀나메스 큐브 해법연구소"},
722
                          {"vn","QcJ7E8_Duws","Giải Rubik - Mastermorphix","Duy Thích Rubik"},
723
                          {"tw","KEOzJpVkGcw","三階粽子方塊","不正常魔術方塊研究中心"},
724
                         };
725
      case 4: return new String[][] {
726
                          {"gb","su4ELv85wiY","Megamorphix Tutorial","CrazyBadCuber"},
727
                          {"es","riQY9fdspbI","Megamorphix del rubikeo","Tutoriales Rubik"},
728
                          {"ru","ZE_zPegnYTY","Как собрать Мастерморфикс 4х4","Алексей Ярыгин"},
729
                          {"fr","oLjjky1QCaA","Résolution du Megamorphix","Asthalis"},
730
                          {"pl","pF_9SaFI_fg","Mastermorphix 4x4 Tutorial PL","MrUK"},
731
                          {"br","J_V0TNDBc-M","Megamorphix Walkthrough Solve","cubo vicio"},
732
                          {"vn","20T2dIHZWHk","Megamorphix 4x4 tutorial","VĂN CÔNG TÙNG"},
733
                         };
734
      }
735
    return null;
736
    }
737
}
(38-38/59)