Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 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 static org.distorted.objectlib.touchcontrol.TouchControl.TC_HEXAHEDRON;
13
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_SPLIT_EDGE_COIN;
14

    
15
import org.distorted.library.helpers.QuatHelper;
16
import org.distorted.library.type.Static3D;
17
import org.distorted.library.type.Static4D;
18
import org.distorted.objectlib.helpers.FactoryCubit;
19
import org.distorted.objectlib.helpers.ObjectFaceShape;
20
import org.distorted.objectlib.helpers.ObjectShape;
21
import org.distorted.objectlib.helpers.ObjectSignature;
22
import org.distorted.objectlib.helpers.ObjectVertexEffects;
23
import org.distorted.objectlib.main.InitAssets;
24
import org.distorted.objectlib.main.InitData;
25
import org.distorted.objectlib.main.ObjectSignatures;
26
import org.distorted.objectlib.main.ObjectType;
27
import org.distorted.objectlib.scrambling.ScrambleEdgeGenerator;
28
import org.distorted.objectlib.shape.ShapeHexahedron;
29
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
30

    
31
///////////////////////////////////////////////////////////////////////////////////////////////////
32

    
33
public class TwistyCoinHexahedron extends ShapeHexahedron
34
{
35
  static final Static3D[] ROT_AXIS = new Static3D[]
36
         {
37
           new Static3D( SQ3/3, SQ3/3, SQ3/3),
38
           new Static3D( SQ3/3, SQ3/3,-SQ3/3),
39
           new Static3D( SQ3/3,-SQ3/3, SQ3/3),
40
           new Static3D( SQ3/3,-SQ3/3,-SQ3/3),
41
           new Static3D(     1,     0,     0),
42
           new Static3D(     0,     1,     0),
43
           new Static3D(     0,     0,     1),
44
         };
45

    
46
  private static final int N = 5;
47
  private static final float C = 0.2f;
48
  private static final float D = 0.85f;
49

    
50
  private int[][] mEdges;
51
  private int[][] mBasicAngle;
52
  private float[][] mCuts;
53
  private float[][] mPosition;
54
  private int[] mQuatIndex;
55
  private boolean[][] mRotatable;
56

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

    
59
  public TwistyCoinHexahedron(int meshState, int iconMode, Static4D quat, Static3D move, float scale, InitData data, InitAssets asset)
60
    {
61
    super(meshState, iconMode, data.getNumLayers()[0], quat, move, scale, data, asset);
62
    }
63

    
64
///////////////////////////////////////////////////////////////////////////////////////////////////
65

    
66
  public int[][] getScrambleEdges()
67
    {
68
    if( mEdges==null )
69
      {
70
      mEdges = new int[][]
71
        {
72
          {0,1,1,1, 2,2,3,2, 4,3,5,3, 6,4,7,4, 8,5,9,5, 10,6,11,6, 12,7,13,7, 14,8,15,8},
73
          {16, 9,17, 9,18, 9, 22,11,23,11,24,11, 28,13,29,13,30,13},
74
          {19,10,20,10,21,10, 25,12,26,12,27,12, 31,14,32,14,33,14},
75
          {16, 9,17, 9,18, 9, 22,11,23,11,24,11, 31,14,32,14,33,14},
76
          {19,10,20,10,21,10, 25,12,26,12,27,12, 28,13,29,13,30,13},
77
          {16, 9,17, 9,18, 9, 25,12,26,12,27,12, 28,13,29,13,30,13},
78
          {19,10,20,10,21,10, 22,11,23,11,24,11, 31,14,32,14,33,14},
79
          {16, 9,17, 9,18, 9, 25,12,26,12,27,12, 31,14,32,14,33,14},
80
          {19,10,20,10,21,10, 22,11,23,11,24,11, 28,13,29,13,30,13},
81
          { 0, 1, 1, 1,  4, 3, 5, 3,   8, 5, 9, 5,  12, 7,13, 7},
82
          { 2, 2, 3, 2,  6, 4, 7, 4,  10, 6,11, 6,  14, 8,15, 8},
83
          { 0, 1, 1, 1,  4, 3, 5, 3,  10, 6,11, 6,  14, 8,15, 8},
84
          { 2, 2, 3, 2,  6, 4, 7, 4,   8, 5, 9, 5,  12, 7,13, 7},
85
          { 0, 1, 1, 1,  6, 4, 7, 4,   8, 5, 9, 5,  14, 8,15, 8},
86
          { 2, 2, 3, 2,  4, 3, 5, 3,  10, 6,11, 6,  12, 7,13, 7}
87
        };
88
      }
89

    
90
    return mEdges;
91
    }
92

    
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94

    
95
  @Override
96
  public int[][] getScrambleAlgorithms()
97
    {
98
    setUpRotatable();
99
    return ScrambleEdgeGenerator.getScramblingAlgorithms(mBasicAngle, mRotatable);
100
    }
101

    
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103

    
104
  @Override
105
  public float[][] returnRotationFactor()
106
    {
107
    float C1 = 2.5f;
108
    float C2 = 1.0f;
109
    float[] f1 = new float[] { C1,C1,C1 };
110
    float[] f2 = new float[] { C2,C2,C2 };
111

    
112
    return new float[][] { f1,f1,f1,f1, f2,f2,f2 };
113
    }
114

    
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

    
117
  public float[][] getCuts(int[] numLayers)
118
    {
119
    if( mCuts==null )
120
      {
121
      float C1 = 0.75f*SQ3;
122
      float C2 = 1.49f;
123
      float[] cut1 = new float[] { -C1,C1 };
124
      float[] cut2 = new float[] { -C2,C2 };
125
      mCuts = new float[][] { cut1,cut1,cut1,cut1,cut2,cut2,cut2 };
126
      }
127

    
128
    return mCuts;
129
    }
130

    
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

    
133
  private void setUpRotatable()
134
    {
135
    if( mRotatable==null )
136
      {
137
      boolean[] tmp = new boolean[] {true,false,true};
138
      mRotatable = new boolean[][] { tmp,tmp,tmp,tmp,tmp,tmp,tmp };
139
      }
140
    }
141

    
142
///////////////////////////////////////////////////////////////////////////////////////////////////
143

    
144
  public boolean[][] getLayerRotatable(int[] numLayers)
145
    {
146
    setUpRotatable();
147
    return mRotatable;
148
    }
149

    
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

    
152
  public int getTouchControlType()
153
    {
154
    return TC_HEXAHEDRON;
155
    }
156

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

    
159
  public int getTouchControlSplit()
160
    {
161
    return TYPE_SPLIT_EDGE_COIN;
162
    }
163

    
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165

    
166
  public int[][][] getEnabled()
167
    {
168
    return new int[][][]
169
      {
170
         {{4},{4},{4},{4},{1},{3},{2},{0}},
171
         {{4},{4},{4},{4},{3},{1},{0},{2}},
172
         {{5},{5},{5},{5},{1},{0},{3},{2}},
173
         {{5},{5},{5},{5},{2},{3},{0},{1}},
174
         {{6},{6},{6},{6},{0},{2},{1},{3}},
175
         {{6},{6},{6},{6},{2},{0},{3},{1}},
176
      };
177
    }
178

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

    
181
  public float[] getDist3D(int[] numLayers)
182
    {
183
    return TouchControlHexahedron.D3D;
184
    }
185

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

    
188
  public Static3D[] getFaceAxis()
189
    {
190
    return TouchControlHexahedron.FACE_AXIS;
191
    }
192

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

    
195
  public float[][] getCubitPositions(int[] numLayers)
196
    {
197
    if( mPosition==null )
198
      {
199
      final float A = 1.5f-C;
200
      final float B = 1.52f;
201
      final float E = 0.75f*D;
202

    
203
      mPosition = new float[][]
204
         {
205
             { A, A, A},
206
             { A, A,-A},
207
             { A,-A, A},
208
             { A,-A,-A},
209
             {-A, A, A},
210
             {-A, A,-A},
211
             {-A,-A, A},
212
             {-A,-A,-A},
213

    
214
             { 0, 0, B },
215
             { 0, 0,-B },
216
             { 0, B, 0 },
217
             { 0,-B, 0 },
218
             { B, 0, 0 },
219
             {-B, 0, 0 },
220

    
221
             { E, E, B},
222
             { E,-E, B},
223
             {-E, E, B},
224
             {-E,-E, B},
225
             { E, E,-B},
226
             { E,-E,-B},
227
             {-E, E,-B},
228
             {-E,-E,-B},
229
             { E, B, E},
230
             { E, B,-E},
231
             {-E, B, E},
232
             {-E, B,-E},
233
             { E,-B, E},
234
             { E,-B,-E},
235
             {-E,-B, E},
236
             {-E,-B,-E},
237
             { B, E, E},
238
             { B, E,-E},
239
             { B,-E, E},
240
             { B,-E,-E},
241
             {-B, E, E},
242
             {-B, E,-E},
243
             {-B,-E, E},
244
             {-B,-E,-E},
245
         };
246
      }
247

    
248
    return mPosition;
249
    }
250

    
251
///////////////////////////////////////////////////////////////////////////////////////////////////
252

    
253
  public Static4D getCubitQuats(int cubit, int[] numLayers)
254
    {
255
    if( mQuatIndex==null ) mQuatIndex = new int[] {0,9,11,4,12,3,6,21,
256
                                                   0,10,1,4,2,3,
257
                                                   0,15,17,16,19,10,13,23,1,9,20,7, 11,4,6,21,2,14,18,5,12,3,8,22 };
258
    return mObjectQuats[mQuatIndex[cubit]];
259
    }
260

    
261
///////////////////////////////////////////////////////////////////////////////////////////////////
262

    
263
  private float[] rotateVertices(float angle, float[] vector, float[] center, float[] rotAxis)
264
    {
265
    float[] ret = new float[4];
266
    float sin = (float)Math.sin(angle/2);
267
    float cos = (float)Math.cos(angle/2);
268
    float[] quat= new float[] { sin*rotAxis[0], sin*rotAxis[1], sin*rotAxis[2], cos};
269
    QuatHelper.rotateVectorByQuat(ret,vector,quat);
270

    
271
    ret[0] += center[0];
272
    ret[1] += center[1];
273
    ret[2] += center[2];
274

    
275
    return ret;
276
    }
277

    
278
///////////////////////////////////////////////////////////////////////////////////////////////////
279

    
280
  private float[][] produceCorner()
281
    {
282
    final float angle = (float)Math.PI/(2*N);
283
    final float A = 0.3f;
284
    final int N1 = 4;
285
    final int N2 = N1 + N + 1;
286
    final int N3 = N2 + N + 1;
287
    float[][] vertices= new float[3*N+8][3];
288

    
289
    vertices[3*N+7][0] = -A;
290
    vertices[3*N+7][1] = -A;
291
    vertices[3*N+7][2] = -A;
292

    
293
    vertices[0][0] = 0;
294
    vertices[0][1] = 0;
295
    vertices[0][2] = 0;
296
    vertices[1][0] =-2;
297
    vertices[1][1] = 0;
298
    vertices[1][2] = 0;
299
    vertices[2][0] = 0;
300
    vertices[2][1] =-2;
301
    vertices[2][2] = 0;
302
    vertices[3][0] = 0;
303
    vertices[3][1] = 0;
304
    vertices[3][2] =-2;
305

    
306
    for(int i=0; i<=N; i++)
307
      {
308
      float cos1 = (float)Math.cos((N-i)*angle);
309
      float sin1 = (float)Math.sin((N-i)*angle);
310
      float cos2 = (float)Math.cos((  i)*angle);
311
      float sin2 = (float)Math.sin((  i)*angle);
312

    
313
      vertices[N1+i][0] = 2*D*cos1-2;
314
      vertices[N1+i][1] = 2*D*sin1-2;
315
      vertices[N1+i][2] = 0;
316

    
317
      vertices[N2+i][0] = 0;
318
      vertices[N2+i][1] = 2*D*sin2-2;
319
      vertices[N2+i][2] = 2*D*cos2-2;
320

    
321
      vertices[N3+i][0] = 2*D*cos2-2;
322
      vertices[N3+i][1] = 0;
323
      vertices[N3+i][2] = 2*D*sin2-2;
324
      }
325

    
326
    for(int i=0; i<3*N+8; i++)
327
      {
328
      vertices[i][0] = 0.75f*vertices[i][0] + C;
329
      vertices[i][1] = 0.75f*vertices[i][1] + C;
330
      vertices[i][2] = 0.75f*vertices[i][2] + C;
331
      }
332

    
333
    return vertices;
334
    }
335

    
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337

    
338
  private float[][] produceCenter()
339
    {
340
    float[][] ret = new float[4*N+1][];
341

    
342
    float[] rot = new float[] { 0,0,-1 };
343

    
344
    float[] center1 = { 1.5f*D, 1.5f*D, 0  };
345
    float[] center2 = { 1.5f*D,-1.5f*D, 0  };
346
    float[] center3 = {-1.5f*D,-1.5f*D, 0  };
347
    float[] center4 = {-1.5f*D, 1.5f*D, 0  };
348

    
349
    float[] vect1 = { -1.5f*D,0,0,0 };
350
    float[] vect2 = { 0, 1.5f*D,0,0 };
351
    float[] vect3 = {  1.5f*D,0,0,0 };
352
    float[] vect4 = { 0,-1.5f*D,0,0 };
353

    
354
    for(int i=0; i<N; i++)
355
      {
356
      float angle = (float)(Math.PI/2)*i/N;
357

    
358
      ret[i    ] = rotateVertices(angle, vect1, center1, rot);
359
      ret[i+  N] = rotateVertices(angle, vect2, center2, rot);
360
      ret[i+2*N] = rotateVertices(angle, vect3, center3, rot);
361
      ret[i+3*N] = rotateVertices(angle, vect4, center4, rot);
362
      }
363

    
364
    ret[4*N] = new float[] { 0, 0, -1.5f };
365

    
366
    return ret;
367
    }
368

    
369
///////////////////////////////////////////////////////////////////////////////////////////////////
370

    
371
  private float[][] produceLeaf()
372
    {
373
    float[][] ret = new float[2*N+1][];
374

    
375
    float[] rot = new float[] { 0,0,1 };
376

    
377
    float[] center1 = {-0.75f*D,-0.75f*D, 0 };
378
    float[] center2 = { 0.75f*D, 0.75f*D, 0 };
379

    
380
    float[] vect1 = {  0, 1.5f*D, 0, 0 };
381
    float[] vect2 = {  0,-1.5f*D, 0, 0 };
382

    
383
    for(int i=0; i<N; i++)
384
      {
385
      float angle = (float)(Math.PI/2)*i/N;
386

    
387
      ret[  N-1-i] = rotateVertices(angle, vect1, center1, rot);
388
      ret[2*N-1-i] = rotateVertices(angle, vect2, center2, rot);
389
      }
390

    
391
    ret[2*N] = new float[] { 0, 0, -1.5f/10 };
392

    
393
    return ret;
394
    }
395

    
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397

    
398
  private float[][] getVertices(int variant)
399
    {
400
         if( variant==0 ) return produceCorner();
401
    else if( variant==1 ) return produceCenter();
402
    else                  return produceLeaf();
403
    }
404

    
405
///////////////////////////////////////////////////////////////////////////////////////////////////
406

    
407
  private int[][] produceCornerShape()
408
    {
409
    int[][] indices = new int[3*N+9][];
410

    
411
    indices[0] = new int[N+4];
412
    indices[1] = new int[N+4];
413
    indices[2] = new int[N+4];
414

    
415
    indices[0][0] = 2;
416
    indices[0][1] = 0;
417
    indices[0][2] = 1;
418
    indices[1][0] = 3;
419
    indices[1][1] = 0;
420
    indices[1][2] = 2;
421
    indices[2][0] = 1;
422
    indices[2][1] = 0;
423
    indices[2][2] = 3;
424

    
425
    int N1 = 4;
426
    int N2 = N1 + N + 1;
427
    int N3 = N2 + N + 1;
428

    
429
    for(int i=0; i<=N; i++)
430
      {
431
      indices[0][i+3] = N1 + i;
432
      indices[1][i+3] = N2 + i;
433
      indices[2][i+3] = N3 + i;
434
      }
435

    
436
    for(int i=0; i<N; i++)
437
      {
438
      indices[3*i+3] = new int[] { N1+i+1, N1+i, 3*N+7 };
439
      indices[3*i+4] = new int[] { N2+i+1, N2+i, 3*N+7 };
440
      indices[3*i+5] = new int[] { N3+i+1, N3+i, 3*N+7 };
441
      }
442

    
443
    indices[3*N+3] = new int[] { 2    , 4+  N, 3*N+7 };
444
    indices[3*N+4] = new int[] { 5  +N, 2    , 3*N+7 };
445
    indices[3*N+5] = new int[] { 5+2*N, 3    , 3*N+7 };
446
    indices[3*N+6] = new int[] { 3    , 6+2*N, 3*N+7 };
447
    indices[3*N+7] = new int[] { 1    , 6+3*N, 3*N+7 };
448
    indices[3*N+8] = new int[] { 4    , 1    , 3*N+7 };
449

    
450
    return indices;
451
    }
452

    
453
///////////////////////////////////////////////////////////////////////////////////////////////////
454

    
455
  private int[][] produceCenterShape()
456
    {
457
    int[][] ret = new int[1+4*N][];
458

    
459
    ret[0] = new int[4*N];
460
    for(int i=0; i<4*N; i++) ret[0][i] = 4*N-1-i;
461

    
462
    for(int i=0; i<N; i++)
463
      {
464
      ret[i+1] = new int[3];
465
      ret[i+1][0] = i;
466
      ret[i+1][1] = i+1;
467
      ret[i+1][2] = 4*N;
468

    
469
      ret[N+i+1] = new int[3];
470
      ret[N+i+1][0] = N+i;
471
      ret[N+i+1][1] = N+i+1;
472
      ret[N+i+1][2] = 4*N;
473

    
474
      ret[2*N+i+1] = new int[3];
475
      ret[2*N+i+1][0] = 2*N+i;
476
      ret[2*N+i+1][1] = 2*N+i+1;
477
      ret[2*N+i+1][2] = 4*N;
478

    
479
      ret[3*N+i+1] = new int[3];
480
      ret[3*N+i+1][0] = 3*N+i;
481
      ret[3*N+i+1][1] = i<N-1 ? 3*N+i+1 : 0;
482
      ret[3*N+i+1][2] = 4*N;
483
      }
484

    
485
    return ret;
486
    }
487

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

    
490
  private int[][] produceLeafShape()
491
    {
492
    int[][] ret = new int[2*N+1][];
493

    
494
    ret[0] = new int[2*N];
495
    for(int i=0; i<2*N; i++) ret[0][i] = i;
496

    
497
    for(int i=1; i<=N-1; i++)
498
      {
499
      ret[i] = new int[3];
500
      ret[i][0] = i;
501
      ret[i][1] = i-1;
502
      ret[i][2] = 2*N;
503

    
504
      ret[N-1+i] = new int[3];
505
      ret[N-1+i][0] = N+i;
506
      ret[N-1+i][1] = N+i-1;
507
      ret[N-1+i][2] = 2*N;
508
      }
509

    
510
    ret[2*N-1] = new int[] { N,  N-1, 2*N };
511
    ret[2*N  ] = new int[] { 0,2*N-1, 2*N };
512

    
513
    return ret;
514
    }
515

    
516
///////////////////////////////////////////////////////////////////////////////////////////////////
517

    
518
  public ObjectShape getObjectShape(int variant)
519
    {
520
    if( variant==0 )
521
      {
522
      int[][] indices = produceCornerShape();
523
      return new ObjectShape(getVertices(variant), indices);
524
      }
525
    else if( variant==1 )
526
      {
527
      int[][] indices = produceCenterShape();
528
      return new ObjectShape(getVertices(variant), indices);
529
      }
530
    else
531
      {
532
      int[][] indices = produceLeafShape();
533
      return new ObjectShape(getVertices(variant), indices);
534
      }
535
    }
536

    
537
///////////////////////////////////////////////////////////////////////////////////////////////////
538

    
539
  public ObjectFaceShape getObjectFaceShape(int variant)
540
    {
541
    if( variant==0 )
542
      {
543
      float h1 = isInIconMode() ? 0.0001f : 0.03f;
544
      float h2 = isInIconMode() ? 0.0001f : 0.01f;
545
      float[][] bands = { {h1,35,0.2f,0.4f,5,2,1}, {h2,35,0.2f,0.4f,2,0,0} };
546
      int num = 3*N+9;
547
      int[] indices = new int[num];
548
      for(int i=3; i<num; i++) indices[i] = 1;
549
      float S = 1-SQ2/2 - C;
550
      float[] convexCenter = {-S,-S,-S };
551
      return new ObjectFaceShape(bands,indices,convexCenter);
552
      }
553
    else if( variant==1 )
554
      {
555
      float h1 = isInIconMode() ? 0.0001f : 0.0002f;
556
      float h2 = 0.0001f;
557
      float[][] bands = { {h1,15,0.2f,0.4f,5,0,0}, {h2,15,0.05f,0.1f,2,0,0} };
558
      int num = 1+4*N;
559
      int[] indices   = new int[num];
560
      for(int i=1; i<num; i++) indices[i] = 1;
561
      return new ObjectFaceShape(bands,indices,null);
562
      }
563
    else
564
      {
565
      float h1 = isInIconMode() ? 0.0001f : 0.015f;
566
      float h2 = isInIconMode() ? 0.0001f : 0.001f;
567
      float[][] bands = { {h1,15,0.250f,0.7f,5,0,0}, {h2,15,0.125f,0.2f,2,0,0} };
568
      int num = 1+2*N;
569
      int[] indices   = new int[num];
570
      for(int i=1; i<num; i++) indices[i] = 1;
571
      return new ObjectFaceShape(bands,indices,null);
572
      }
573
    }
574

    
575
///////////////////////////////////////////////////////////////////////////////////////////////////
576

    
577
  public ObjectVertexEffects getVertexEffects(int variant)
578
    {
579
    if( variant==0 )
580
      {
581
      float[][] corners = { {0.10f,0.20f} };
582
      int num = 8+3*N;
583
      int[] indices = new int[num];
584
      for(int i=1; i<num; i++) indices[i] = -1;
585
      float[][] centers = {{ 0,0,0 }};
586
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
587
      }
588
    else if( variant==1 )
589
      {
590
      float[][] corners = { {0.05f,0.20f} };
591
      int num = 1+4*N;
592
      int[] indices = new int[num];
593
      for(int i=0; i<num; i++) indices[i] = -1;
594
      float[][] centers = { { 0,0,0 } };
595
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
596
      }
597
    else
598
      {
599
      float[][] corners = { {0.05f,0.20f} };
600
      int num = 1+2*N;
601
      int[] indices = new int[num];
602
      for(int i=0; i<num; i++) indices[i] = -1;
603
      float[][] centers = { { 0,0,0 } };
604
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
605
      }
606
    }
607

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

    
610
  public int getNumCubitVariants(int[] numLayers)
611
    {
612
    return 3;
613
    }
614

    
615
///////////////////////////////////////////////////////////////////////////////////////////////////
616

    
617
  public int getCubitVariant(int cubit, int[] numLayers)
618
    {
619
    return cubit<8 ? 0 : (cubit<14 ? 1:2);
620
    }
621

    
622
///////////////////////////////////////////////////////////////////////////////////////////////////
623

    
624
  public float getStickerRadius()
625
    {
626
    return 0.12f;
627
    }
628

    
629
///////////////////////////////////////////////////////////////////////////////////////////////////
630

    
631
  public float getStickerStroke()
632
    {
633
    return isInIconMode() ? 0.23f : 0.12f;
634
    }
635

    
636
///////////////////////////////////////////////////////////////////////////////////////////////////
637
// ditto, manually provide the sticker coordinates.
638

    
639
  @Override
640
  public void adjustStickerCoords()
641
    {
642
    float A = 0.38f;
643
    float B = 0.24f;
644

    
645
    mStickerCoords = new float[][]
646
          {
647
            { A,-0.5f, A, A, -0.5f, A, -0.5f, B, B, -0.5f },
648
            { 0.5f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, -0.5f },
649
            { 0.5f, -0.5f, -0.5f, 0.5f }
650
          };
651
    }
652

    
653
///////////////////////////////////////////////////////////////////////////////////////////////////
654

    
655
  public float[][] getStickerAngles()
656
    {
657
    float D = (float)(Math.PI/4);
658
    return new float[][] { { 0,0,0,-D,0 },{-D,-D,-D,-D},{D,D} };
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[] tmp1 = {3,3,3};
676
      int[] tmp2 = {4,4,4};
677
      mBasicAngle = new int[][] { tmp1,tmp1,tmp1,tmp1,tmp2,tmp2,tmp2 };
678
      }
679

    
680
    return mBasicAngle;
681
    }
682

    
683
///////////////////////////////////////////////////////////////////////////////////////////////////
684

    
685
  public String getShortName()
686
    {
687
    return ObjectType.COIH_3.name();
688
    }
689

    
690
///////////////////////////////////////////////////////////////////////////////////////////////////
691

    
692
  public ObjectSignature getSignature()
693
    {
694
    return new ObjectSignature(ObjectSignatures.COIH_3);
695
    }
696

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

    
699
  public String getObjectName()
700
    {
701
    return "Ancient Coin Cube";
702
    }
703

    
704
///////////////////////////////////////////////////////////////////////////////////////////////////
705

    
706
  public String getInventor()
707
    {
708
    return "Yukang Wu";
709
    }
710

    
711
///////////////////////////////////////////////////////////////////////////////////////////////////
712

    
713
  public int getYearOfInvention()
714
    {
715
    return 2018;
716
    }
717

    
718
///////////////////////////////////////////////////////////////////////////////////////////////////
719

    
720
  public int getComplexity()
721
    {
722
    return 0;
723
    }
724

    
725
///////////////////////////////////////////////////////////////////////////////////////////////////
726

    
727
  public String[][] getTutorials()
728
    {
729
    return new String[][] {
730
                          {"gb","8hPxLbZDSLQ","Chinese Coin Cube","CanChrisSolve"},
731
                          {"es","rK0_IsjoZqM","Ancient Coin Cube","R de Rubik"},
732
                          {"ru","HVZj2vBxD5A","Как собрать Коин Куб","Алексей Ярыгин"},
733
                          {"pl","yaNeIw4C5Uk","Ancient coin cube TUTORIAL PL","MrUK"},
734
                         };
735
    }
736
}
(6-6/47)