Project

General

Profile

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

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

1 f8e0d6be Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2022 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 6133be67 Leszek Koltunski
// 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 f8e0d6be Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objectlib.objects;
11
12
import org.distorted.library.type.Static3D;
13
import org.distorted.library.type.Static4D;
14 84a17011 Leszek Koltunski
import org.distorted.objectlib.helpers.FactoryCubit;
15 f8e0d6be Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectFaceShape;
16
import org.distorted.objectlib.helpers.ObjectShape;
17 1d581993 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectSignature;
18 84a17011 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectVertexEffects;
19 a8295031 Leszek Koltunski
import org.distorted.objectlib.main.InitData;
20 f8e0d6be Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
21 b31249d6 Leszek Koltunski
import org.distorted.objectlib.shape.ShapeTetrahedron;
22 f8e0d6be Leszek Koltunski
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
23
24
import java.io.InputStream;
25
26
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_CHANGING_SHAPEMOD;
27
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
28
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30
31 052e0362 Leszek Koltunski
public class TwistyMorphix extends ShapeTetrahedron
32 f8e0d6be Leszek Koltunski
{
33 17e17769 Leszek Koltunski
  // size>=3: if length of the edge of the whole tetrahedron is = 1.0, then
34
  // length of the edge of the corner cubit is equal to DIST. (separate for size 3 and 4)
35
  private static final float DIST3 = 0.39f;
36
  private static final float DIST4 = 0.365f;
37
38 f8e0d6be Leszek Koltunski
  static final Static3D[] ROT_AXIS = new Static3D[]
39
         {
40
           new Static3D( SQ2/2, 0.0f, SQ2/2),
41
           new Static3D(  0.0f, 1.0f,  0.0f),
42
           new Static3D( SQ2/2, 0.0f,-SQ2/2),
43
         };
44
45 9ba7f3f6 Leszek Koltunski
  private int[][] mEdges;
46 beee90ab Leszek Koltunski
  private int[][] mBasicAngle;
47 f8e0d6be Leszek Koltunski
  private float[][] mCuts;
48
  private float[][] mCenters;
49
  private int[] mQuatIndex;
50
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52
53 a8295031 Leszek Koltunski
  public TwistyMorphix(InitData data, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
54 f8e0d6be Leszek Koltunski
    {
55 a8295031 Leszek Koltunski
    super(data, meshState, iconMode, data.getNumLayers()[0], quat, move, scale, stream);
56 f8e0d6be Leszek Koltunski
    }
57
58 6db8fe2e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
59
60
  @Override
61
  public float getPillowCoeff()
62
    {
63 f2259427 Leszek Koltunski
    return 1.5f;
64 6db8fe2e Leszek Koltunski
    }
65
66 f8e0d6be Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
67 17e17769 Leszek Koltunski
68
  @Override
69
  public int getInternalColor()
70
    {
71
    return getNumLayers()[0]==2 ? 0xff000000 : 0xff333333;
72
    }
73
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75 f8e0d6be Leszek Koltunski
76 9ba7f3f6 Leszek Koltunski
  private void insertSection(int[] table, int startIndex, int size, int startAlg, int state)
77 f8e0d6be Leszek Koltunski
    {
78 9ba7f3f6 Leszek Koltunski
    for(int i=0; i<size; i++)
79
      {
80
      table[2*(i+startIndex)  ] = startAlg +i;
81
      table[2*(i+startIndex)+1] = state;
82
      }
83
    }
84
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86
87
  private int[] createEdge(int sizeX, int sizeY, int sizeZ, int stateX, int stateY, int stateZ)
88
    {
89
    int num = 0;
90
    if( stateX>=0 ) num += (3*sizeX);
91
    if( stateY>=0 ) num += (3*sizeY);
92
    if( stateZ>=0 ) num += (3*sizeZ);
93
94
    int[] ret = new int[2*num];
95
96
    if( stateX>=0 )
97
      {
98
      insertSection(ret,0,3*sizeX,0,stateX);
99
      if( stateY>=0 )
100
        {
101
        insertSection(ret,3*sizeX,3*sizeY,3*sizeX,stateY);
102
        if( stateZ>=0 ) insertSection(ret,3*sizeX+3*sizeY,3*sizeZ,3*sizeX+3*sizeY,stateZ);
103
        }
104
      else
105
        {
106
        insertSection(ret,3*sizeX,3*sizeZ,3*sizeX+3*sizeY,stateZ);
107
        }
108
      }
109
    else
110
      {
111
      if( stateY>=0 )
112
        {
113
        insertSection(ret,0,3*sizeY,3*sizeX,stateY);
114
        if( stateZ>=0 ) insertSection(ret,3*sizeY,3*sizeZ,3*sizeX+3*sizeY,stateZ);
115
        }
116
      else
117
        {
118
        insertSection(ret,0,3*sizeZ,3*sizeX+3*sizeY,stateZ);
119
        }
120
      }
121
122
    return ret;
123
    }
124
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126
// same as in a non-flat cuboids
127
128
  public int[][] getScrambleEdges()
129
    {
130
    if( mEdges==null )
131 f8e0d6be Leszek Koltunski
      {
132 17e17769 Leszek Koltunski
      int[] numLayers = getNumLayers();
133 f8e0d6be Leszek Koltunski
134 9ba7f3f6 Leszek Koltunski
      int X = numLayers[0];
135
      int Y = numLayers[1];
136
      int Z = numLayers[2];
137
138
      mEdges = new int[][]
139 17e17769 Leszek Koltunski
        {
140 9ba7f3f6 Leszek Koltunski
        createEdge(X,Y,Z, 1, 2, 3), // 0 0
141
        createEdge(X,Y,Z,-1, 4, 5), // 1 x
142
        createEdge(X,Y,Z, 6,-1, 7), // 2 y
143
        createEdge(X,Y,Z, 8, 9,-1), // 3 z
144
        createEdge(X,Y,Z,10,-1, 7), // 4 xy
145
        createEdge(X,Y,Z,11, 9,-1), // 5 xz
146
        createEdge(X,Y,Z,-1,12, 5), // 6 yx
147
        createEdge(X,Y,Z, 8,13,-1), // 7 yz
148
        createEdge(X,Y,Z,-1, 4,14), // 8 zx
149
        createEdge(X,Y,Z, 6,-1,15), // 9 zy
150
        createEdge(X,Y,Z,-1,-1, 5), // 10 xyx
151
        createEdge(X,Y,Z,-1, 4,-1), // 11 xzx
152
        createEdge(X,Y,Z,-1,-1, 7), // 12 yxy
153
        createEdge(X,Y,Z, 6,-1,-1), // 13 yzy
154
        createEdge(X,Y,Z,-1, 9,-1), // 14 zxz
155
        createEdge(X,Y,Z, 8,-1,-1), // 15 zyz
156 17e17769 Leszek Koltunski
        };
157 f8e0d6be Leszek Koltunski
      }
158
159 9ba7f3f6 Leszek Koltunski
    return mEdges;
160 f8e0d6be Leszek Koltunski
    }
161
162 17e17769 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
163
164
  private int[] createEdges(int size, int vertex)
165
    {
166
    int[] ret = new int[9*size];
167
168
    for(int l=0; l<size; l++)
169
      {
170
      ret[9*l  ] = l;
171
      ret[9*l+1] =-1;
172
      ret[9*l+2] = vertex;
173
      ret[9*l+3] = l;
174
      ret[9*l+4] = 1;
175
      ret[9*l+5] = vertex;
176
      ret[9*l+6] = l;
177
      ret[9*l+7] = 2;
178
      ret[9*l+8] = vertex;
179
      }
180
181
    return ret;
182
    }
183
184 f8e0d6be Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
185
186
  public float[][] getCuts(int[] numLayers)
187
    {
188
    if( mCuts==null )
189
      {
190 17e17769 Leszek Koltunski
      int numL = numLayers[0];
191
      float[] cut = new float[numL-1];
192
      float DIST = numL==3 ? DIST3:DIST4;
193
      float dist = numL*(SQ2/2)*(0.5f-DIST);
194
195
      switch(numL)
196
        {
197
        case 2: cut[0] = 0;
198
                break;
199
        case 3: cut[0] = -dist;
200 84a17011 Leszek Koltunski
                cut[1] =  dist;
201 17e17769 Leszek Koltunski
                break;
202
        case 4: cut[0] = -dist;
203
                cut[1] = 0.0f;
204 84a17011 Leszek Koltunski
                cut[2] =  dist;
205 17e17769 Leszek Koltunski
                break;
206
        }
207
208 f8e0d6be Leszek Koltunski
      mCuts = new float[][] { cut,cut,cut };
209
      }
210
211
    return mCuts;
212
    }
213
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215
216
  public boolean[][] getLayerRotatable(int[] numLayers)
217
    {
218 17e17769 Leszek Koltunski
    int numL = numLayers[0];
219
    boolean[] tmp = new boolean[numL];
220
    for(int i=0; i<numL; i++) tmp[i] = true;
221
222 f8e0d6be Leszek Koltunski
    return new boolean[][] { tmp,tmp,tmp };
223
    }
224
225
///////////////////////////////////////////////////////////////////////////////////////////////////
226
227
  public int getTouchControlType()
228
    {
229
    return TC_CHANGING_SHAPEMOD;
230
    }
231
232
///////////////////////////////////////////////////////////////////////////////////////////////////
233
234
  public int getTouchControlSplit()
235
    {
236
    return TYPE_NOT_SPLIT;
237
    }
238
239
///////////////////////////////////////////////////////////////////////////////////////////////////
240
241
  public int[][][] getEnabled()
242
    {
243
    return null;
244
    }
245
246
///////////////////////////////////////////////////////////////////////////////////////////////////
247
248
  public float[] getDist3D(int[] numLayers)
249
    {
250
    return TouchControlTetrahedron.D3D;
251
    }
252
253
///////////////////////////////////////////////////////////////////////////////////////////////////
254
255
  public Static3D[] getFaceAxis()
256
    {
257
    return TouchControlTetrahedron.FACE_AXIS;
258
    }
259
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
262
  public float[][] getCubitPositions(int[] numLayers)
263
    {
264
    if( mCenters==null )
265
      {
266 17e17769 Leszek Koltunski
      int numL = numLayers[0];
267
      float DIST = numL==3 ? DIST3:DIST4;
268
      final float C = numL==2 ? 1.0f : 6*numL*(0.25f-DIST/3);
269
      final float A = C*SQ2/6;
270
      final float B = C/3;
271
      final float D = (SQ2/12)*numL;
272
      final float E = (1.0f/6)*numL;
273
274
      if( numL==2 )
275
        {
276
        mCenters = new float[][]
277
           {
278
             {0.0f, -A,   +B},
279
             {0.0f, -A,   -B},
280
             {  +B,  A, 0.0f},
281
             {  -B,  A, 0.0f},
282 f8e0d6be Leszek Koltunski
283 17e17769 Leszek Koltunski
             {0.0f,  D,   +E},
284
             {0.0f,  D,   -E},
285
             {  +E, -D, 0.0f},
286
             {  -E, -D, 0.0f}
287
           };
288
        }
289
      else if( numL==3 )
290
        {
291
        final float X1 = 0.5f*(3*DIST-1)*numL;
292
        final float X2 = 0.5f*DIST*numL;
293
        final float X = 0.25f*numL*(1-DIST);
294
        final float Y = numL*(1-DIST)*(SQ2/4);
295
        final float F = 0.5f*(1-DIST)*numL - X2 + X1/2;
296
        final float G = 0.5f*F;
297
        final float H = (SQ2/2)*F;
298
299
        mCenters = new float[][]
300
           {
301 f8e0d6be Leszek Koltunski
             {0.0f, -A,   +B},
302
             {0.0f, -A,   -B},
303
             {  +B,  A, 0.0f},
304
             {  -B,  A, 0.0f},
305 17e17769 Leszek Koltunski
306
             {0.0f,  D,   +E},
307
             {0.0f,  D,   -E},
308
             {  +E, -D, 0.0f},
309
             {  -E, -D, 0.0f},
310
311
             {0.0f,  +Y,0.0f},
312
             {0.0f,  -Y,0.0f},
313
             {  +X,0.0f,  +X},
314
             {  +X,0.0f,  -X},
315
             {  -X,0.0f,  +X},
316
             {  -X,0.0f,  -X},
317
318
             {0.0f,0.0f,   F},
319
             {   G,   H,   G},
320
             {  -G,   H,   G},
321
             {0.0f,0.0f,  -F},
322
             {   G,   H,  -G},
323
             {  -G,   H,  -G},
324
             {   F,0.0f,0.0f},
325
             {   G,  -H,   G},
326
             {   G,  -H,  -G},
327
             {  -F,0.0f,0.0f},
328
             {  -G,  -H,   G},
329
             {  -G,  -H,  -G},
330
           };
331
        }
332
      else
333
        {
334
        final float X1 = 0.5f*(3*DIST-1)*numL;
335
        final float X2 = 0.5f*DIST*numL;
336
        final float X = 0.25f*numL*(1-DIST);
337
        final float Y = numL*(1-DIST)*(SQ2/4);
338
        final float Z = numL*(1-2*DIST)/(2*numL-4);
339
        final float F = 0.5f*(1-DIST)*numL - X2 + X1/2;
340
        final float G = 0.5f*F;
341
        final float H = (SQ2/2)*F;
342
        final float I = (0.25f-DIST/2)*numL;
343
344
        mCenters = new float[][]
345
           {
346
             {0.0f, -A,   +B},
347
             {0.0f, -A,   -B},
348
             {  +B,  A, 0.0f},
349
             {  -B,  A, 0.0f},
350
351
             {0.0f,  D,   +E},
352
             {0.0f,  D,   -E},
353
             {  +E, -D, 0.0f},
354
             {  -E, -D, 0.0f},
355
356
             {  +Z,  +Y,0.0f},
357
             {  -Z,  +Y,0.0f},
358
             {0.0f,  -Y,  +Z},
359
             {0.0f,  -Y,  -Z},
360 84a17011 Leszek Koltunski
             {   X-Z/2,-(SQ2/2)*Z,   X+Z/2},
361
             {   X+Z/2, (SQ2/2)*Z,   X-Z/2},
362
             {   X-Z/2,-(SQ2/2)*Z,  -X-Z/2},
363
             {   X+Z/2, (SQ2/2)*Z,  -X+Z/2},
364
             {  -X+Z/2,-(SQ2/2)*Z,   X+Z/2},
365
             {  -X-Z/2, (SQ2/2)*Z,   X-Z/2},
366 17e17769 Leszek Koltunski
             {  -X+Z/2,-(SQ2/2)*Z,  -X-Z/2},
367
             {  -X-Z/2, (SQ2/2)*Z,  -X+Z/2},
368
369
             {0.0f,-I*(SQ2/2),   F+I*0.5f},
370
             {   G+0.75f*I,   H+(SQ2/4)*I,   G-0.25f*I},
371
             {  -G-0.75f*I,   H+(SQ2/4)*I,   G-0.25f*I},
372
             {0.0f,-I*(SQ2/2),  -F-I*0.5f},
373
             {   G+0.75f*I,   H+(SQ2/4)*I,  -G+0.25f*I},
374
             {  -G-0.75f*I,   H+(SQ2/4)*I,  -G+0.25f*I},
375
             {   F+0.5f*I, I*(SQ2/2),0.0f},
376
             {   G-0.25f*I,  -H-(SQ2/4)*I,   G+0.75f*I},
377
             {   G-0.25f*I,  -H-(SQ2/4)*I,  -G-0.75f*I},
378
             {  -F-0.5f*I, I*(SQ2/2),0.0f},
379
             {  -G+0.25f*I,  -H-(SQ2/4)*I,   G+0.75f*I},
380
             {  -G+0.25f*I,  -H-(SQ2/4)*I,  -G-0.75f*I},
381
382 84a17011 Leszek Koltunski
             {        0.0f,   I*(SQ2/2),     F+I*0.5f},
383 17e17769 Leszek Koltunski
             {   G-0.25f*I,   H+(SQ2/4)*I,   G+0.75f*I},
384
             {  -G+0.25f*I,   H+(SQ2/4)*I,   G+0.75f*I},
385 84a17011 Leszek Koltunski
             {        0.0f,   I*(SQ2/2),    -F-I*0.5f},
386 17e17769 Leszek Koltunski
             {   G-0.25f*I,   H+(SQ2/4)*I,  -G-0.75f*I},
387
             {  -G+0.25f*I,   H+(SQ2/4)*I,  -G-0.75f*I},
388 84a17011 Leszek Koltunski
             {   F+0.5f*I,   -I*(SQ2/2),          0.0f},
389 17e17769 Leszek Koltunski
             {   G+0.75f*I,  -H-(SQ2/4)*I,   G-0.25f*I},
390
             {   G+0.75f*I,  -H-(SQ2/4)*I,  -G+0.25f*I},
391 84a17011 Leszek Koltunski
             {  -F-0.5f*I,   -I*(SQ2/2),          0.0f},
392 17e17769 Leszek Koltunski
             {  -G-0.75f*I,  -H-(SQ2/4)*I,   G-0.25f*I},
393
             {  -G-0.75f*I,  -H-(SQ2/4)*I,  -G+0.25f*I},
394
395
             {0.0f,    Y,   +Z},
396
             {0.0f,    Y,   -Z},
397
             {  +Z,   -Y, 0.0f},
398
             {  -Z,   -Y, 0.0f},
399
             { (SQ2/2)*Y-Z/2, (SQ2/2)*Z, (SQ2/2)*Y+Z/2},
400
             { (SQ2/2)*Y+Z/2,-(SQ2/2)*Z, (SQ2/2)*Y-Z/2},
401
             {-(SQ2/2)*Y+Z/2, (SQ2/2)*Z, (SQ2/2)*Y+Z/2},
402
             {-(SQ2/2)*Y-Z/2,-(SQ2/2)*Z, (SQ2/2)*Y-Z/2},
403
             { (SQ2/2)*Y-Z/2, (SQ2/2)*Z,-(SQ2/2)*Y-Z/2},
404
             { (SQ2/2)*Y+Z/2,-(SQ2/2)*Z,-(SQ2/2)*Y+Z/2},
405
             {-(SQ2/2)*Y+Z/2, (SQ2/2)*Z,-(SQ2/2)*Y-Z/2},
406
             {-(SQ2/2)*Y-Z/2,-(SQ2/2)*Z,-(SQ2/2)*Y+Z/2},
407
           };
408
        }
409 f8e0d6be Leszek Koltunski
      }
410
411
    return mCenters;
412
    }
413
414
///////////////////////////////////////////////////////////////////////////////////////////////////
415
416
  public Static4D getCubitQuats(int cubit, int[] numLayers)
417
    {
418 17e17769 Leszek Koltunski
    if( mQuatIndex==null )
419
      {
420
      switch(numLayers[0])
421
        {
422
        case 2: mQuatIndex = new int[] { 0,5,2,8,
423
                                         0,5,2,8
424
                                       };
425
                break;
426
        case 3: mQuatIndex = new int[] { 0,5,2,8,
427
                                         0,5,2,8,
428
                                         0,2,15,10,20,13,
429
                                         0,21,15,5,13,10,2,12,23,8,22,20
430
                                       };
431
                break;
432
        default:mQuatIndex = new int[] { 0,5,2,8,
433
                                         0,5,2,8,
434
                                         0,0,2,2,15,15,10,10,20,20,13,13,
435
                                         0,21,15,5,13,10,2,12,23,8,22,20,
436
                                         0,21,15,5,13,10,2,12,23,8,22,20,
437
                                         0,5,2,8,15,23,21,20,10,12,13,22
438
                                       };
439
        }
440
441
      }
442
443 f8e0d6be Leszek Koltunski
    return mObjectQuats[mQuatIndex[cubit]];
444
    }
445
446
///////////////////////////////////////////////////////////////////////////////////////////////////
447
448 84a17011 Leszek Koltunski
  private float[][] getVertices(int variant)
449 f8e0d6be Leszek Koltunski
    {
450 17e17769 Leszek Koltunski
    int numL = getNumLayers()[0];
451
    float DIST = numL==3 ? DIST3:DIST4;
452
453 f8e0d6be Leszek Koltunski
    if( variant==0 )
454
      {
455 17e17769 Leszek Koltunski
      final float Z = numL==2 ? 1.0f : numL*DIST;
456
      final float Y = (SQ2/2)*Z;
457 f8e0d6be Leszek Koltunski
458 84a17011 Leszek Koltunski
      return new float[][]
459 f8e0d6be Leszek Koltunski
          {
460
              {0.0f,-2*Y/3, 2*Z/3 },
461
              {0.0f,-2*Y/3,  -Z/3 },
462
              { Z/2,   Y/3,   Z/6 },
463
              {-Z/2,   Y/3,   Z/6 },
464
              {0.0f,   Y/3,  -Z/3 }
465
          };
466
      }
467 17e17769 Leszek Koltunski
    else if( variant==1 )
468 f8e0d6be Leszek Koltunski
      {
469 17e17769 Leszek Koltunski
      final float X = numL==2 ? 1.0f : numL*(3*DIST-1);
470
      final float Y = (SQ2/2)*X;
471
      final float Z = 0.5f*X;
472 f8e0d6be Leszek Koltunski
473 84a17011 Leszek Koltunski
      return new float[][]
474 f8e0d6be Leszek Koltunski
          {
475
              {-X/2,  -Y/3,   Z/3 },
476
              { X/2,  -Y/3,   Z/3 },
477
              {0.0f, 2*Y/3,-2*Z/3 },
478
              {0.0f,  -Y/3,-2*Z/3 }
479
          };
480 17e17769 Leszek Koltunski
      }
481
    else if( variant==2 )
482
      {
483
      final float X = numL*(1-2*DIST)/(2*numL-4);
484
      final float Y = (SQ2/4)*DIST*numL;
485
486 84a17011 Leszek Koltunski
      return new float[][]
487 17e17769 Leszek Koltunski
          {
488
              {  +X,     +Y,  0.0f },
489
              {  -X,     +Y,  0.0f },
490
              {0.0f,Y-X*SQ2,    +X },
491
              {0.0f,Y-X*SQ2,    -X },
492
              {  +X,     -Y,  0.0f },
493
              {  -X,     -Y,  0.0f },
494
              {0.0f,     -Y,    +X },
495
              {0.0f,     -Y,    -X },
496
          };
497
      }
498
    else if( variant==3 )
499
      {
500
      final float C = numL==3 ? 3*DIST-1 : 2*DIST-0.5f;
501
      final float X1 = 0.5f*C*numL;
502
      final float X2 = 0.5f*DIST*numL;
503
      final float Y  = (SQ2/4)*numL*(1-2*DIST)/(numL-2);
504
505 84a17011 Leszek Koltunski
      return new float[][]
506 17e17769 Leszek Koltunski
          {
507 84a17011 Leszek Koltunski
              {  +X1,+Y, X1/2 },
508
              {  -X1,+Y, X1/2 },
509 17e17769 Leszek Koltunski
              { 0.0f,+Y,-X1/2 },
510 84a17011 Leszek Koltunski
              {  +X2,-Y, X2-X1/2 },
511
              {  -X2,-Y, X2-X1/2 },
512 17e17769 Leszek Koltunski
              { 0.0f,-Y,-X1/2 },
513
          };
514
      }
515
    else if( variant==4 )
516
      {
517
      final float X1 = 0.5f*(3*DIST-1)*numL;
518
      final float X2 = 0.5f*(2*DIST-0.5f)*numL;
519
      final float Y  = (SQ2/4)*numL*(1-2*DIST)/(numL-2);
520
521 84a17011 Leszek Koltunski
      return new float[][]
522 17e17769 Leszek Koltunski
          {
523
              {  +X1,+Y,+X1-X2/2 },
524
              {  -X1,+Y,+X1-X2/2 },
525
              { 0.0f,+Y,-X2/2 },
526
              {  +X2,-Y,+X2/2 },
527
              {  -X2,-Y,+X2/2 },
528
              { 0.0f,-Y,-X2/2 },
529
          };
530
      }
531
    else
532
      {
533
      final float X = numL*(1-2*DIST)/(2*numL-4);
534
      final float Y = (SQ2/4)*DIST*numL;
535
536 84a17011 Leszek Koltunski
      return new float[][]
537 17e17769 Leszek Koltunski
          {
538
              {  +X,  Y-X*SQ2,  0.0f },
539
              {  -X,  Y-X*SQ2,  0.0f },
540
              {0.0f,Y-2*X*SQ2,    +X },
541
              {0.0f,Y        ,    -X },
542
              {  +X,       -Y,  0.0f },
543
              {  -X,       -Y,  0.0f },
544
              {0.0f,       -Y,    +X },
545
              {0.0f,       -Y,    -X },
546
          };
547 84a17011 Leszek Koltunski
      }
548
    }
549 17e17769 Leszek Koltunski
550 84a17011 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
551 17e17769 Leszek Koltunski
552 84a17011 Leszek Koltunski
  public ObjectShape getObjectShape(int variant)
553
    {
554
    if( variant==0 )
555
      {
556
      int[][] indices = { {0,2,3},{0,1,2},{0,3,1},{4,2,1},{4,1,3},{4,3,2} };
557
      return new ObjectShape(getVertices(variant), indices);
558
      }
559
    else if( variant==1 )
560
      {
561
      int[][] indices = { {1,2,0},{3,1,0},{1,3,2},{3,0,2} };
562
      return new ObjectShape(getVertices(variant), indices);
563
      }
564
    else if( variant==2 )
565
      {
566
      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} };
567
      return new ObjectShape(getVertices(variant), indices);
568
      }
569
    else if( variant==3 )
570
      {
571
      int[][] indices = { {0,1,4,3},{0,3,5,2},{2,5,4,1},{0,2,1},{5,3,4} };
572
      return new ObjectShape(getVertices(variant), indices);
573
      }
574
    else if( variant==4 )
575
      {
576
      int[][] indices = { {0,1,4,3},{0,3,5,2},{2,5,4,1},{0,2,1},{5,3,4} };
577
      return new ObjectShape(getVertices(variant), indices);
578
      }
579
    else
580
      {
581
      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} };
582
      return new ObjectShape(getVertices(variant), indices);
583 f8e0d6be Leszek Koltunski
      }
584
    }
585
586
///////////////////////////////////////////////////////////////////////////////////////////////////
587
588
  public ObjectFaceShape getObjectFaceShape(int variant)
589
    {
590 3bf19410 Leszek Koltunski
    float height = isInIconMode() ? 0.001f : 0.03f;
591 4bd1b3d6 Leszek Koltunski
    float internal = 0.02f;
592 17e17769 Leszek Koltunski
    int numL = getNumLayers()[0];
593 3bf19410 Leszek Koltunski
594 f8e0d6be Leszek Koltunski
    if( variant==0 )
595
      {
596 b5cc50ae Leszek Koltunski
      float eV = numL==2 ? 2 : 0;
597 84a17011 Leszek Koltunski
      float[][] bands = { {height,30,0.15f,0.5f,5,1,eV}, {internal,30,0.2f,0.4f,5,1,eV} };
598
      int[] indices   = { 0,0,0,1,1,1 };
599
      return new ObjectFaceShape(bands,indices,null);
600
      }
601
    else if( variant==1 )
602
      {
603
      float eI = numL==2 ? 1 : 0;
604
      float eV = numL==2 ? 1 : 0;
605
      int N = numL==2 ? 5 : 4;
606
      float[][] bands = { {height,30,0.15f,0.5f,N,eI,eV}, {internal,30,0.25f,0.5f,N,eI,eV} };
607
      int[] indices   = { 0,1,1,1 };
608
      return new ObjectFaceShape(bands,indices,null);
609
      }
610
    else if( variant==2 )
611
      {
612
      float[][] bands = { {height,30,0.15f,0.5f,5,1,0}, {internal,30,0.25f,0.5f,5,1,0} };
613
      int[] indices   = { 0,0,1,1,1,1,1 };
614
      return new ObjectFaceShape(bands,indices,null);
615
      }
616
    else if( variant==3 || variant==4 )
617
      {
618
      float[][] bands = { {height,30,0.15f,0.5f,5,0,0}, {internal,30,0.25f,0.5f,4,0,0} };
619
      int[] indices   = { 0,1,1,1,1 };
620
      return new ObjectFaceShape(bands,indices,null);
621
      }
622
    else
623
      {
624
      float[][] bands = { {height,30,0.15f,0.5f,5,0,0}, {internal,30,0.25f,0.5f,3,0,0} };
625
      int[] indices   = { 0,1,1,1,1,1 };
626
      return new ObjectFaceShape(bands,indices,null);
627
      }
628
    }
629
630
///////////////////////////////////////////////////////////////////////////////////////////////////
631
632
  public ObjectVertexEffects getVertexEffects(int variant)
633
    {
634
    int numL = getNumLayers()[0];
635
    float DIST = numL==3 ? DIST3:DIST4;
636
637
    if( variant==0 )
638
      {
639 17e17769 Leszek Koltunski
      float push1 = numL<=3 ? 0.07f : 0.06f;
640
      float push2 = numL<=3 ? 0.06f : 0.05f;
641
      float[][] corners = { {push1,0.025f}, {push2,0.020f} };
642 f8e0d6be Leszek Koltunski
      int[] indices     = { 0,0,0,0,-1 };
643
      float[][] centers = { { 0.0f,0.0f,0.0f } };
644 84a17011 Leszek Koltunski
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
645 f8e0d6be Leszek Koltunski
      }
646 17e17769 Leszek Koltunski
    else if( variant==1 )
647 f8e0d6be Leszek Koltunski
      {
648 17e17769 Leszek Koltunski
      final float C = numL==2 ? 1.0f : numL*(3*DIST-1);
649
      final float Y = (SQ2/2)*C;
650
      final float Z = 0.5f*C;
651
      float[][] corners = { {0.08f,0.013f} };
652 4bd1b3d6 Leszek Koltunski
      int[] indices     = { -1,-1,-1,-1 };
653 f8e0d6be Leszek Koltunski
      float[][] centers = { { 0.0f,-Y/3,-2*Z/3 } };
654 84a17011 Leszek Koltunski
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
655 f8e0d6be Leszek Koltunski
      }
656 17e17769 Leszek Koltunski
    else if( variant==2 )
657
      {
658
      float[][] corners = { {0.07f,0.013f} };
659
      int[] indices     = { 0,0,-1,-1,-1,-1,-1,-1 };
660
      float[][] centers = { { 0.0f,0.0f,0.0f } };
661 84a17011 Leszek Koltunski
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
662 17e17769 Leszek Koltunski
      }
663
    else if( variant==3 || variant==4 )
664
      {
665 84a17011 Leszek Koltunski
      int C = variant==3 ? 0 : -1;
666 17e17769 Leszek Koltunski
      final float Y = (SQ2/4)*numL*(1-2*DIST)/(numL-2);
667
      float[][] corners = { {0.05f,0.023f} };
668 84a17011 Leszek Koltunski
      int[] indices     = { -1,-1,-1,C,C,-1, };
669 17e17769 Leszek Koltunski
      float[][] centers = { { 0.0f,-Y,0.0f } };
670 84a17011 Leszek Koltunski
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
671 17e17769 Leszek Koltunski
      }
672
    else
673
      {
674
      final float Z = numL*(1-2*DIST)/(2*numL-4);
675
      float[][] corners = { {0.02f,0.023f} };
676
      int[] indices     = { 0,0,0,0,-1,-1,-1,-1 };
677
      float[][] centers = { { 0.0f,0.0f,-Z } };
678 84a17011 Leszek Koltunski
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
679 17e17769 Leszek Koltunski
      }
680 f8e0d6be Leszek Koltunski
    }
681
682
///////////////////////////////////////////////////////////////////////////////////////////////////
683
684
  public int getNumCubitVariants(int[] numLayers)
685
    {
686 17e17769 Leszek Koltunski
    switch(numLayers[0])
687
      {
688
      case 2: return 2;
689
      case 3: return 4;
690
      case 4: return 6;
691
      }
692
693
    return 0;
694 f8e0d6be Leszek Koltunski
    }
695
696
///////////////////////////////////////////////////////////////////////////////////////////////////
697
698
  public int getCubitVariant(int cubit, int[] numLayers)
699
    {
700 17e17769 Leszek Koltunski
    switch(numLayers[0])
701
      {
702
      case 2: return cubit<4 ? 0 : 1;
703
      case 3: return cubit<4 ? 0 : ( cubit<8 ? 1: (cubit<14 ? 2:3) );
704
      case 4: return cubit<4 ? 0 : ( cubit<8 ? 1: (cubit<20 ? 2: (cubit<32 ? 3: (cubit<44 ? 4:5) ) ) );
705
      }
706
707
    return 0;
708 f8e0d6be Leszek Koltunski
    }
709
710
///////////////////////////////////////////////////////////////////////////////////////////////////
711
712
  public float getStickerRadius()
713
    {
714
    return 0.10f;
715
    }
716
717
///////////////////////////////////////////////////////////////////////////////////////////////////
718
719
  public float getStickerStroke()
720
    {
721 b5cc50ae Leszek Koltunski
    float stroke = 0.07f;
722
723
    if( isInIconMode() )
724
      {
725
      int[] numLayers = getNumLayers();
726
727
      switch(numLayers[0])
728
        {
729 5d09301e Leszek Koltunski
        case 2: stroke*=1.4f; break;
730
        case 3: stroke*=2.1f; break;
731
        case 4: stroke*=2.5f; break;
732
        default:stroke*=3.2f; break;
733 b5cc50ae Leszek Koltunski
        }
734
      }
735
736
    return stroke;
737 f8e0d6be Leszek Koltunski
    }
738
739
///////////////////////////////////////////////////////////////////////////////////////////////////
740
741
  public float[][] getStickerAngles()
742
    {
743
    return null;
744
    }
745
746
///////////////////////////////////////////////////////////////////////////////////////////////////
747
// PUBLIC API
748
749
  public Static3D[] getRotationAxis()
750
    {
751
    return ROT_AXIS;
752
    }
753
754
///////////////////////////////////////////////////////////////////////////////////////////////////
755
756 beee90ab Leszek Koltunski
  public int[][] getBasicAngles()
757 f8e0d6be Leszek Koltunski
    {
758 beee90ab Leszek Koltunski
    if( mBasicAngle==null )
759
      {
760
      int num = getNumLayers()[0];
761
      int[] tmp = new int[num];
762
      for(int i=0; i<num; i++) tmp[i] = 4;
763
      mBasicAngle = new int[][] { tmp,tmp,tmp };
764
      }
765
766 f8e0d6be Leszek Koltunski
    return mBasicAngle;
767
    }
768
769
///////////////////////////////////////////////////////////////////////////////////////////////////
770
771 5f54927b Leszek Koltunski
  public String getShortName()
772 f8e0d6be Leszek Koltunski
    {
773 17e17769 Leszek Koltunski
    switch(getNumLayers()[0])
774
      {
775
      case 2: return ObjectType.MORP_2.name();
776
      case 3: return ObjectType.MORP_3.name();
777
      case 4: return ObjectType.MORP_4.name();
778
      }
779
    return null;
780 5f54927b Leszek Koltunski
    }
781
782
///////////////////////////////////////////////////////////////////////////////////////////////////
783
784 1d581993 Leszek Koltunski
  public ObjectSignature getSignature()
785 5f54927b Leszek Koltunski
    {
786 17e17769 Leszek Koltunski
    switch(getNumLayers()[0])
787
      {
788
      case 2: return new ObjectSignature(ObjectType.MORP_2);
789
      case 3: return new ObjectSignature(ObjectType.MORP_3);
790
      case 4: return new ObjectSignature(ObjectType.MORP_4);
791
      }
792
    return null;
793 f8e0d6be Leszek Koltunski
    }
794
795
///////////////////////////////////////////////////////////////////////////////////////////////////
796
797
  public String getObjectName()
798
    {
799 17e17769 Leszek Koltunski
    switch(getNumLayers()[0])
800
      {
801
      case 2: return "Pyramorphix";
802
      case 3: return "Mastermorphix";
803
      case 4: return "Megamorphix";
804
      }
805
    return null;
806 f8e0d6be Leszek Koltunski
    }
807
808
///////////////////////////////////////////////////////////////////////////////////////////////////
809
810
  public String getInventor()
811
    {
812 17e17769 Leszek Koltunski
    switch(getNumLayers()[0])
813
      {
814
      case 2: return "Manfred Fritsche";
815
      case 3: return "Tony Fisher";
816
      case 4: return "Adam Zamora";
817
      }
818
    return null;
819 f8e0d6be Leszek Koltunski
    }
820
821
///////////////////////////////////////////////////////////////////////////////////////////////////
822
823
  public int getYearOfInvention()
824
    {
825 17e17769 Leszek Koltunski
    switch(getNumLayers()[0])
826
      {
827
      case 2: return 0;
828
      case 3: return 1991;
829
      case 4: return 2004;
830
      }
831 f8e0d6be Leszek Koltunski
    return 0;
832
    }
833
834
///////////////////////////////////////////////////////////////////////////////////////////////////
835
836
  public int getComplexity()
837
    {
838 17e17769 Leszek Koltunski
    switch(getNumLayers()[0])
839
      {
840
      case 2: return 1;
841
      case 3: return 2;
842
      case 4: return 3;
843
      }
844 f8e0d6be Leszek Koltunski
    return 1;
845
    }
846 052e0362 Leszek Koltunski
847
///////////////////////////////////////////////////////////////////////////////////////////////////
848
849
  public String[][] getTutorials()
850
    {
851 17e17769 Leszek Koltunski
    switch(getNumLayers()[0])
852
      {
853
      case 2: return new String[][] {
854 052e0362 Leszek Koltunski
                          {"gb","dD67B3cRaFw","Pyramorphix Solve Tutorial","SpeedCubeReview"},
855
                          {"es","RA37LhYlEW8","Resolver Pyramorphix","Cuby"},
856
                          {"ru","fTNXLAAuGAI","Как собрать Пираморфикс 2х2","Алексей Ярыгин"},
857
                          {"fr","SfEqoud5KRc","Résolution du Pyramorphix","Asthalis"},
858
                          {"de","1VDGoVJZCug","Pyramorphix - Tutorial","GerCubing"},
859 17e17769 Leszek Koltunski
                          {"pl","b7VpuXloBNU","Mastermorphix 2x2 Tutorial PL","MrUK"},
860 052e0362 Leszek Koltunski
                          {"br","wByfDxTrbC8","Como resolver o Pyramorphix","Rafael Cinoto"},
861
                          {"kr","WIy5ZvTXsOY","피라몰픽스 쉽게 맞추기","큐브놀이터"},
862 a399e91b Leszek Koltunski
                          {"vn","6CuTRLjKHho","Tutorial N.14 - Pyramorphix","Duy Thích Rubik"},
863 052e0362 Leszek Koltunski
                         };
864 17e17769 Leszek Koltunski
      case 3: return new String[][] {
865
                          {"gb","Q1DXmDGyebc","How to Solve the Mastermorphix","Z3"},
866
                          {"es","8kOuV-O4jGA","Resolver Mastermorphix 3x3","Cuby"},
867
                          {"ru","hs5jZee0XUo","Как собрать Мастерморфикс 3х3","Алексей Ярыгин"},
868
                          {"fr","73j0APwbWzc","Résolution du Mastermorphix","Asthalis"},
869
                          {"de","gbo7yTTHx5A","Mastermorphix - Tutorial","GerCubing"},
870
                          {"pl","_ZgduvWVx14","Mastermorphix Tutorial PL","MrUK"},
871
                          {"br","bFJjjWPsDoY","Mastermorphix - tutorial","Cubo da Loucura"},
872
                          {"kr","yKW48BaE91M","마스터 몰픽스 해법","듀나메스 큐브 해법연구소"},
873
                          {"vn","QcJ7E8_Duws","Giải Rubik - Mastermorphix","Duy Thích Rubik"},
874
                         };
875
      case 4: return new String[][] {
876
                          {"gb","su4ELv85wiY","Megamorphix Tutorial","CrazyBadCuber"},
877
                          {"es","riQY9fdspbI","Megamorphix del rubikeo","Tutoriales Rubik"},
878
                          {"ru","ZE_zPegnYTY","Как собрать Мастерморфикс 4х4","Алексей Ярыгин"},
879
                          {"fr","oLjjky1QCaA","Résolution du Megamorphix","Asthalis"},
880
                          {"pl","pF_9SaFI_fg","Mastermorphix 4x4 Tutorial PL","MrUK"},
881
                          {"br","J_V0TNDBc-M","Megamorphix Walkthrough Solve","cubo vicio"},
882
                          {"vn","20T2dIHZWHk","Megamorphix 4x4 tutorial","VĂN CÔNG TÙNG"},
883
                         };
884
      }
885
    return null;
886 052e0362 Leszek Koltunski
    }
887 f8e0d6be Leszek Koltunski
}