Project

General

Profile

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

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

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.helpers.ObjectSignature;
18
import org.distorted.objectlib.helpers.ObjectVertexEffects;
19
import org.distorted.objectlib.main.InitAssets;
20
import org.distorted.objectlib.main.InitData;
21
import org.distorted.objectlib.main.ObjectSignatures;
22
import org.distorted.objectlib.main.ObjectType;
23
import org.distorted.objectlib.scrambling.ScrambleEdgeGenerator;
24
import org.distorted.objectlib.shape.ShapeTetrahedron;
25
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
26

    
27
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_CHANGING_SHAPEMOD;
28
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
29

    
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31

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

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

    
46
  private int[][] mEdges;
47
  private int[][] mBasicAngle;
48
  private float[][] mCuts;
49
  private float[][] mCenters;
50
  private int[] mQuatIndex;
51

    
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53

    
54
  public TwistyMorphix(int meshState, int iconMode, Static4D quat, Static3D move, float scale, InitData data, InitAssets asset)
55
    {
56
    super(meshState, iconMode, data.getNumLayers()[0], quat, move, scale, data, asset);
57
    }
58

    
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60

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

    
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

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

    
78
///////////////////////////////////////////////////////////////////////////////////////////////////
79

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

    
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87

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

    
96
    return mEdges;
97
    }
98

    
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100

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

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

    
123
      mCuts = new float[][] { cut,cut,cut };
124
      }
125

    
126
    return mCuts;
127
    }
128

    
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

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

    
137
    return new boolean[][] { tmp,tmp,tmp };
138
    }
139

    
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141

    
142
  public int getTouchControlType()
143
    {
144
    return TC_CHANGING_SHAPEMOD;
145
    }
146

    
147
///////////////////////////////////////////////////////////////////////////////////////////////////
148

    
149
  public int getTouchControlSplit()
150
    {
151
    return TYPE_NOT_SPLIT;
152
    }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155

    
156
  public int[][][] getEnabled()
157
    {
158
    return null;
159
    }
160

    
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162

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

    
168
///////////////////////////////////////////////////////////////////////////////////////////////////
169

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

    
175
///////////////////////////////////////////////////////////////////////////////////////////////////
176

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

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

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

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

    
221
             {0.0f,  D,   +E},
222
             {0.0f,  D,   -E},
223
             {  +E, -D, 0.0f},
224
             {  -E, -D, 0.0f},
225

    
226
             {0.0f,  +Y,0.0f},
227
             {0.0f,  -Y,0.0f},
228
             {  +X,0.0f,  +X},
229
             {  +X,0.0f,  -X},
230
             {  -X,0.0f,  +X},
231
             {  -X,0.0f,  -X},
232

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

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

    
266
             {0.0f,  D,   +E},
267
             {0.0f,  D,   -E},
268
             {  +E, -D, 0.0f},
269
             {  -E, -D, 0.0f},
270

    
271
             {  +Z,  +Y,0.0f},
272
             {  -Z,  +Y,0.0f},
273
             {0.0f,  -Y,  +Z},
274
             {0.0f,  -Y,  -Z},
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
             {  -X+Z/2,-(SQ2/2)*Z,  -X-Z/2},
282
             {  -X-Z/2, (SQ2/2)*Z,  -X+Z/2},
283

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

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

    
310
             {0.0f,    Y,   +Z},
311
             {0.0f,    Y,   -Z},
312
             {  +Z,   -Y, 0.0f},
313
             {  -Z,   -Y, 0.0f},
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
             {-(SQ2/2)*Y+Z/2, (SQ2/2)*Z,-(SQ2/2)*Y-Z/2},
321
             {-(SQ2/2)*Y-Z/2,-(SQ2/2)*Z,-(SQ2/2)*Y+Z/2},
322
           };
323
        }
324
      }
325

    
326
    return mCenters;
327
    }
328

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

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

    
356
      }
357

    
358
    return mObjectQuats[mQuatIndex[cubit]];
359
    }
360

    
361
///////////////////////////////////////////////////////////////////////////////////////////////////
362

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

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

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

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

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

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

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

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

    
465
///////////////////////////////////////////////////////////////////////////////////////////////////
466

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

    
501
///////////////////////////////////////////////////////////////////////////////////////////////////
502

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

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

    
545
///////////////////////////////////////////////////////////////////////////////////////////////////
546

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

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

    
597
///////////////////////////////////////////////////////////////////////////////////////////////////
598

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

    
608
    return 0;
609
    }
610

    
611
///////////////////////////////////////////////////////////////////////////////////////////////////
612

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

    
622
    return 0;
623
    }
624

    
625
///////////////////////////////////////////////////////////////////////////////////////////////////
626

    
627
  public float getStickerRadius()
628
    {
629
    return 0.10f;
630
    }
631

    
632
///////////////////////////////////////////////////////////////////////////////////////////////////
633

    
634
  public float getStickerStroke()
635
    {
636
    float stroke = 0.07f;
637

    
638
    if( isInIconMode() )
639
      {
640
      int[] numLayers = getNumLayers();
641

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

    
651
    return stroke;
652
    }
653

    
654
///////////////////////////////////////////////////////////////////////////////////////////////////
655

    
656
  public float[][] getStickerAngles()
657
    {
658
    return null;
659
    }
660

    
661
///////////////////////////////////////////////////////////////////////////////////////////////////
662
// PUBLIC API
663

    
664
  public Static3D[] getRotationAxis()
665
    {
666
    return ROT_AXIS;
667
    }
668

    
669
///////////////////////////////////////////////////////////////////////////////////////////////////
670

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

    
681
    return mBasicAngle;
682
    }
683

    
684
///////////////////////////////////////////////////////////////////////////////////////////////////
685

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

    
697
///////////////////////////////////////////////////////////////////////////////////////////////////
698

    
699
  public ObjectSignature getSignature()
700
    {
701
    switch(getNumLayers()[0])
702
      {
703
      case 2: return new ObjectSignature(ObjectSignatures.MORP_2);
704
      case 3: return new ObjectSignature(ObjectSignatures.MORP_3);
705
      case 4: return new ObjectSignature(ObjectSignatures.MORP_4);
706
      }
707
    return null;
708
    }
709

    
710
///////////////////////////////////////////////////////////////////////////////////////////////////
711

    
712
  public String getObjectName()
713
    {
714
    switch(getNumLayers()[0])
715
      {
716
      case 2: return "Pyramorphix";
717
      case 3: return "Mastermorphix";
718
      case 4: return "Megamorphix";
719
      }
720
    return null;
721
    }
722

    
723
///////////////////////////////////////////////////////////////////////////////////////////////////
724

    
725
  public String getInventor()
726
    {
727
    switch(getNumLayers()[0])
728
      {
729
      case 2: return "Manfred Fritsche";
730
      case 3: return "Tony Fisher";
731
      case 4: return "Adam Zamora";
732
      }
733
    return null;
734
    }
735

    
736
///////////////////////////////////////////////////////////////////////////////////////////////////
737

    
738
  public int getYearOfInvention()
739
    {
740
    switch(getNumLayers()[0])
741
      {
742
      case 2: return 0;
743
      case 3: return 1991;
744
      case 4: return 2004;
745
      }
746
    return 0;
747
    }
748

    
749
///////////////////////////////////////////////////////////////////////////////////////////////////
750

    
751
  public int getComplexity()
752
    {
753
    switch(getNumLayers()[0])
754
      {
755
      case 2: return 1;
756
      case 3: return 2;
757
      case 4: return 3;
758
      }
759
    return 1;
760
    }
761

    
762
///////////////////////////////////////////////////////////////////////////////////////////////////
763

    
764
  public String[][] getTutorials()
765
    {
766
    switch(getNumLayers()[0])
767
      {
768
      case 2: return new String[][] {
769
                          {"gb","dD67B3cRaFw","Pyramorphix Solve Tutorial","SpeedCubeReview"},
770
                          {"es","RA37LhYlEW8","Resolver Pyramorphix","Cuby"},
771
                          {"ru","fTNXLAAuGAI","Как собрать Пираморфикс 2х2","Алексей Ярыгин"},
772
                          {"fr","SfEqoud5KRc","Résolution du Pyramorphix","Asthalis"},
773
                          {"de","1VDGoVJZCug","Pyramorphix - Tutorial","GerCubing"},
774
                          {"pl","b7VpuXloBNU","Mastermorphix 2x2 Tutorial PL","MrUK"},
775
                          {"br","wByfDxTrbC8","Como resolver o Pyramorphix","Rafael Cinoto"},
776
                          {"kr","WIy5ZvTXsOY","피라몰픽스 쉽게 맞추기","큐브놀이터"},
777
                          {"vn","6CuTRLjKHho","Tutorial N.14 - Pyramorphix","Duy Thích Rubik"},
778
                         };
779
      case 3: return new String[][] {
780
                          {"gb","Q1DXmDGyebc","How to Solve the Mastermorphix","Z3"},
781
                          {"es","8kOuV-O4jGA","Resolver Mastermorphix 3x3","Cuby"},
782
                          {"ru","hs5jZee0XUo","Как собрать Мастерморфикс 3х3","Алексей Ярыгин"},
783
                          {"fr","73j0APwbWzc","Résolution du Mastermorphix","Asthalis"},
784
                          {"de","gbo7yTTHx5A","Mastermorphix - Tutorial","GerCubing"},
785
                          {"pl","_ZgduvWVx14","Mastermorphix Tutorial PL","MrUK"},
786
                          {"br","bFJjjWPsDoY","Mastermorphix - tutorial","Cubo da Loucura"},
787
                          {"kr","yKW48BaE91M","마스터 몰픽스 해법","듀나메스 큐브 해법연구소"},
788
                          {"vn","QcJ7E8_Duws","Giải Rubik - Mastermorphix","Duy Thích Rubik"},
789
                         };
790
      case 4: return new String[][] {
791
                          {"gb","su4ELv85wiY","Megamorphix Tutorial","CrazyBadCuber"},
792
                          {"es","riQY9fdspbI","Megamorphix del rubikeo","Tutoriales Rubik"},
793
                          {"ru","ZE_zPegnYTY","Как собрать Мастерморфикс 4х4","Алексей Ярыгин"},
794
                          {"fr","oLjjky1QCaA","Résolution du Megamorphix","Asthalis"},
795
                          {"pl","pF_9SaFI_fg","Mastermorphix 4x4 Tutorial PL","MrUK"},
796
                          {"br","J_V0TNDBc-M","Megamorphix Walkthrough Solve","cubo vicio"},
797
                          {"vn","20T2dIHZWHk","Megamorphix 4x4 tutorial","VĂN CÔNG TÙNG"},
798
                         };
799
      }
800
    return null;
801
    }
802
}
(30-30/47)