Project

General

Profile

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

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

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
  public float[][] getCuts(int[] numLayers)
105
    {
106
    if( mCuts==null )
107
      {
108
      float C1 = 0.75f*SQ3;
109
      float C2 = 1.49f;
110
      float[] cut1 = new float[] { -C1,C1 };
111
      float[] cut2 = new float[] { -C2,C2 };
112
      mCuts = new float[][] { cut1,cut1,cut1,cut1,cut2,cut2,cut2 };
113
      }
114

    
115
    return mCuts;
116
    }
117

    
118
///////////////////////////////////////////////////////////////////////////////////////////////////
119

    
120
  private void setUpRotatable()
121
    {
122
    if( mRotatable==null )
123
      {
124
      boolean[] tmp = new boolean[] {true,false,true};
125
      mRotatable = new boolean[][] { tmp,tmp,tmp,tmp,tmp,tmp,tmp };
126
      }
127
    }
128

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

    
131
  public boolean[][] getLayerRotatable(int[] numLayers)
132
    {
133
    setUpRotatable();
134
    return mRotatable;
135
    }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138

    
139
  public int getTouchControlType()
140
    {
141
    return TC_HEXAHEDRON;
142
    }
143

    
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145

    
146
  public int getTouchControlSplit()
147
    {
148
    return TYPE_SPLIT_EDGE_COIN;
149
    }
150

    
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152

    
153
  public int[][][] getEnabled()
154
    {
155
    return new int[][][]
156
      {
157
         {{4},{4},{4},{4},{1},{3},{2},{0}},
158
         {{4},{4},{4},{4},{3},{1},{0},{2}},
159
         {{5},{5},{5},{5},{1},{0},{3},{2}},
160
         {{5},{5},{5},{5},{2},{3},{0},{1}},
161
         {{6},{6},{6},{6},{0},{2},{1},{3}},
162
         {{6},{6},{6},{6},{2},{0},{3},{1}},
163
      };
164
    }
165

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

    
168
  public float[] getDist3D(int[] numLayers)
169
    {
170
    return TouchControlHexahedron.D3D;
171
    }
172

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

    
175
  public Static3D[] getFaceAxis()
176
    {
177
    return TouchControlHexahedron.FACE_AXIS;
178
    }
179

    
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181

    
182
  public float[][] getCubitPositions(int[] numLayers)
183
    {
184
    if( mPosition==null )
185
      {
186
      final float A = 1.5f-C;
187
      final float B = 1.52f;
188
      final float E = 0.75f*D;
189

    
190
      mPosition = new float[][]
191
         {
192
             { A, A, A},
193
             { A, A,-A},
194
             { A,-A, A},
195
             { A,-A,-A},
196
             {-A, A, A},
197
             {-A, A,-A},
198
             {-A,-A, A},
199
             {-A,-A,-A},
200

    
201
             { 0, 0, B },
202
             { 0, 0,-B },
203
             { 0, B, 0 },
204
             { 0,-B, 0 },
205
             { B, 0, 0 },
206
             {-B, 0, 0 },
207

    
208
             { E, E, B},
209
             { E,-E, B},
210
             {-E, E, B},
211
             {-E,-E, B},
212
             { E, E,-B},
213
             { E,-E,-B},
214
             {-E, E,-B},
215
             {-E,-E,-B},
216
             { E, B, E},
217
             { E, B,-E},
218
             {-E, B, E},
219
             {-E, B,-E},
220
             { E,-B, E},
221
             { E,-B,-E},
222
             {-E,-B, E},
223
             {-E,-B,-E},
224
             { B, E, E},
225
             { B, E,-E},
226
             { B,-E, E},
227
             { B,-E,-E},
228
             {-B, E, E},
229
             {-B, E,-E},
230
             {-B,-E, E},
231
             {-B,-E,-E},
232
         };
233
      }
234

    
235
    return mPosition;
236
    }
237

    
238
///////////////////////////////////////////////////////////////////////////////////////////////////
239

    
240
  public Static4D getCubitQuats(int cubit, int[] numLayers)
241
    {
242
    if( mQuatIndex==null ) mQuatIndex = new int[] {0,9,11,4,12,3,6,21,
243
                                                   0,10,1,4,2,3,
244
                                                   0,15,17,16,19,10,13,23,1,9,20,7, 11,4,6,21,2,14,18,5,12,3,8,22 };
245
    return mObjectQuats[mQuatIndex[cubit]];
246
    }
247

    
248
///////////////////////////////////////////////////////////////////////////////////////////////////
249

    
250
  private float[] rotateVertices(float angle, float[] vector, float[] center, float[] rotAxis)
251
    {
252
    float[] ret = new float[4];
253
    float sin = (float)Math.sin(angle/2);
254
    float cos = (float)Math.cos(angle/2);
255
    float[] quat= new float[] { sin*rotAxis[0], sin*rotAxis[1], sin*rotAxis[2], cos};
256
    QuatHelper.rotateVectorByQuat(ret,vector,quat);
257

    
258
    ret[0] += center[0];
259
    ret[1] += center[1];
260
    ret[2] += center[2];
261

    
262
    return ret;
263
    }
264

    
265
///////////////////////////////////////////////////////////////////////////////////////////////////
266

    
267
  private float[][] produceCorner()
268
    {
269
    final float angle = (float)Math.PI/(2*N);
270
    final float A = 0.3f;
271
    final int N1 = 4;
272
    final int N2 = N1 + N + 1;
273
    final int N3 = N2 + N + 1;
274
    float[][] vertices= new float[3*N+8][3];
275

    
276
    vertices[3*N+7][0] = -A;
277
    vertices[3*N+7][1] = -A;
278
    vertices[3*N+7][2] = -A;
279

    
280
    vertices[0][0] = 0;
281
    vertices[0][1] = 0;
282
    vertices[0][2] = 0;
283
    vertices[1][0] =-2;
284
    vertices[1][1] = 0;
285
    vertices[1][2] = 0;
286
    vertices[2][0] = 0;
287
    vertices[2][1] =-2;
288
    vertices[2][2] = 0;
289
    vertices[3][0] = 0;
290
    vertices[3][1] = 0;
291
    vertices[3][2] =-2;
292

    
293
    for(int i=0; i<=N; i++)
294
      {
295
      float cos1 = (float)Math.cos((N-i)*angle);
296
      float sin1 = (float)Math.sin((N-i)*angle);
297
      float cos2 = (float)Math.cos((  i)*angle);
298
      float sin2 = (float)Math.sin((  i)*angle);
299

    
300
      vertices[N1+i][0] = 2*D*cos1-2;
301
      vertices[N1+i][1] = 2*D*sin1-2;
302
      vertices[N1+i][2] = 0;
303

    
304
      vertices[N2+i][0] = 0;
305
      vertices[N2+i][1] = 2*D*sin2-2;
306
      vertices[N2+i][2] = 2*D*cos2-2;
307

    
308
      vertices[N3+i][0] = 2*D*cos2-2;
309
      vertices[N3+i][1] = 0;
310
      vertices[N3+i][2] = 2*D*sin2-2;
311
      }
312

    
313
    for(int i=0; i<3*N+8; i++)
314
      {
315
      vertices[i][0] = 0.75f*vertices[i][0] + C;
316
      vertices[i][1] = 0.75f*vertices[i][1] + C;
317
      vertices[i][2] = 0.75f*vertices[i][2] + C;
318
      }
319

    
320
    return vertices;
321
    }
322

    
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324

    
325
  private float[][] produceCenter()
326
    {
327
    float[][] ret = new float[4*N+1][];
328

    
329
    float[] rot = new float[] { 0,0,-1 };
330

    
331
    float[] center1 = { 1.5f*D, 1.5f*D, 0  };
332
    float[] center2 = { 1.5f*D,-1.5f*D, 0  };
333
    float[] center3 = {-1.5f*D,-1.5f*D, 0  };
334
    float[] center4 = {-1.5f*D, 1.5f*D, 0  };
335

    
336
    float[] vect1 = { -1.5f*D,0,0,0 };
337
    float[] vect2 = { 0, 1.5f*D,0,0 };
338
    float[] vect3 = {  1.5f*D,0,0,0 };
339
    float[] vect4 = { 0,-1.5f*D,0,0 };
340

    
341
    for(int i=0; i<N; i++)
342
      {
343
      float angle = (float)(Math.PI/2)*i/N;
344

    
345
      ret[i    ] = rotateVertices(angle, vect1, center1, rot);
346
      ret[i+  N] = rotateVertices(angle, vect2, center2, rot);
347
      ret[i+2*N] = rotateVertices(angle, vect3, center3, rot);
348
      ret[i+3*N] = rotateVertices(angle, vect4, center4, rot);
349
      }
350

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

    
353
    return ret;
354
    }
355

    
356
///////////////////////////////////////////////////////////////////////////////////////////////////
357

    
358
  private float[][] produceLeaf()
359
    {
360
    float[][] ret = new float[2*N+1][];
361

    
362
    float[] rot = new float[] { 0,0,1 };
363

    
364
    float[] center1 = {-0.75f*D,-0.75f*D, 0 };
365
    float[] center2 = { 0.75f*D, 0.75f*D, 0 };
366

    
367
    float[] vect1 = {  0, 1.5f*D, 0, 0 };
368
    float[] vect2 = {  0,-1.5f*D, 0, 0 };
369

    
370
    for(int i=0; i<N; i++)
371
      {
372
      float angle = (float)(Math.PI/2)*i/N;
373

    
374
      ret[  N-1-i] = rotateVertices(angle, vect1, center1, rot);
375
      ret[2*N-1-i] = rotateVertices(angle, vect2, center2, rot);
376
      }
377

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

    
380
    return ret;
381
    }
382

    
383
///////////////////////////////////////////////////////////////////////////////////////////////////
384

    
385
  private float[][] getVertices(int variant)
386
    {
387
         if( variant==0 ) return produceCorner();
388
    else if( variant==1 ) return produceCenter();
389
    else                  return produceLeaf();
390
    }
391

    
392
///////////////////////////////////////////////////////////////////////////////////////////////////
393

    
394
  private int[][] produceCornerShape()
395
    {
396
    int[][] indices = new int[3*N+9][];
397

    
398
    indices[0] = new int[N+4];
399
    indices[1] = new int[N+4];
400
    indices[2] = new int[N+4];
401

    
402
    indices[0][0] = 2;
403
    indices[0][1] = 0;
404
    indices[0][2] = 1;
405
    indices[1][0] = 3;
406
    indices[1][1] = 0;
407
    indices[1][2] = 2;
408
    indices[2][0] = 1;
409
    indices[2][1] = 0;
410
    indices[2][2] = 3;
411

    
412
    int N1 = 4;
413
    int N2 = N1 + N + 1;
414
    int N3 = N2 + N + 1;
415

    
416
    for(int i=0; i<=N; i++)
417
      {
418
      indices[0][i+3] = N1 + i;
419
      indices[1][i+3] = N2 + i;
420
      indices[2][i+3] = N3 + i;
421
      }
422

    
423
    for(int i=0; i<N; i++)
424
      {
425
      indices[3*i+3] = new int[] { N1+i+1, N1+i, 3*N+7 };
426
      indices[3*i+4] = new int[] { N2+i+1, N2+i, 3*N+7 };
427
      indices[3*i+5] = new int[] { N3+i+1, N3+i, 3*N+7 };
428
      }
429

    
430
    indices[3*N+3] = new int[] { 2    , 4+  N, 3*N+7 };
431
    indices[3*N+4] = new int[] { 5  +N, 2    , 3*N+7 };
432
    indices[3*N+5] = new int[] { 5+2*N, 3    , 3*N+7 };
433
    indices[3*N+6] = new int[] { 3    , 6+2*N, 3*N+7 };
434
    indices[3*N+7] = new int[] { 1    , 6+3*N, 3*N+7 };
435
    indices[3*N+8] = new int[] { 4    , 1    , 3*N+7 };
436

    
437
    return indices;
438
    }
439

    
440
///////////////////////////////////////////////////////////////////////////////////////////////////
441

    
442
  private int[][] produceCenterShape()
443
    {
444
    int[][] ret = new int[1+4*N][];
445

    
446
    ret[0] = new int[4*N];
447
    for(int i=0; i<4*N; i++) ret[0][i] = 4*N-1-i;
448

    
449
    for(int i=0; i<N; i++)
450
      {
451
      ret[i+1] = new int[3];
452
      ret[i+1][0] = i;
453
      ret[i+1][1] = i+1;
454
      ret[i+1][2] = 4*N;
455

    
456
      ret[N+i+1] = new int[3];
457
      ret[N+i+1][0] = N+i;
458
      ret[N+i+1][1] = N+i+1;
459
      ret[N+i+1][2] = 4*N;
460

    
461
      ret[2*N+i+1] = new int[3];
462
      ret[2*N+i+1][0] = 2*N+i;
463
      ret[2*N+i+1][1] = 2*N+i+1;
464
      ret[2*N+i+1][2] = 4*N;
465

    
466
      ret[3*N+i+1] = new int[3];
467
      ret[3*N+i+1][0] = 3*N+i;
468
      ret[3*N+i+1][1] = i<N-1 ? 3*N+i+1 : 0;
469
      ret[3*N+i+1][2] = 4*N;
470
      }
471

    
472
    return ret;
473
    }
474

    
475
///////////////////////////////////////////////////////////////////////////////////////////////////
476

    
477
  private int[][] produceLeafShape()
478
    {
479
    int[][] ret = new int[2*N+1][];
480

    
481
    ret[0] = new int[2*N];
482
    for(int i=0; i<2*N; i++) ret[0][i] = i;
483

    
484
    for(int i=1; i<=N-1; i++)
485
      {
486
      ret[i] = new int[3];
487
      ret[i][0] = i;
488
      ret[i][1] = i-1;
489
      ret[i][2] = 2*N;
490

    
491
      ret[N-1+i] = new int[3];
492
      ret[N-1+i][0] = N+i;
493
      ret[N-1+i][1] = N+i-1;
494
      ret[N-1+i][2] = 2*N;
495
      }
496

    
497
    ret[2*N-1] = new int[] { N,  N-1, 2*N };
498
    ret[2*N  ] = new int[] { 0,2*N-1, 2*N };
499

    
500
    return ret;
501
    }
502

    
503
///////////////////////////////////////////////////////////////////////////////////////////////////
504

    
505
  public ObjectShape getObjectShape(int variant)
506
    {
507
    if( variant==0 )
508
      {
509
      int[][] indices = produceCornerShape();
510
      return new ObjectShape(getVertices(variant), indices);
511
      }
512
    else if( variant==1 )
513
      {
514
      int[][] indices = produceCenterShape();
515
      return new ObjectShape(getVertices(variant), indices);
516
      }
517
    else
518
      {
519
      int[][] indices = produceLeafShape();
520
      return new ObjectShape(getVertices(variant), indices);
521
      }
522
    }
523

    
524
///////////////////////////////////////////////////////////////////////////////////////////////////
525

    
526
  public ObjectFaceShape getObjectFaceShape(int variant)
527
    {
528
    if( variant==0 )
529
      {
530
      float h1 = isInIconMode() ? 0.0001f : 0.03f;
531
      float h2 = isInIconMode() ? 0.0001f : 0.01f;
532
      float[][] bands = { {h1,35,0.2f,0.4f,5,2,1}, {h2,35,0.2f,0.4f,2,0,0} };
533
      int num = 3*N+9;
534
      int[] indices = new int[num];
535
      for(int i=3; i<num; i++) indices[i] = 1;
536
      float S = 1-SQ2/2 - C;
537
      float[] convexCenter = {-S,-S,-S };
538
      return new ObjectFaceShape(bands,indices,convexCenter);
539
      }
540
    else if( variant==1 )
541
      {
542
      float h1 = isInIconMode() ? 0.0001f : 0.0002f;
543
      float h2 = 0.0001f;
544
      float[][] bands = { {h1,15,0.2f,0.4f,5,0,0}, {h2,15,0.05f,0.1f,2,0,0} };
545
      int num = 1+4*N;
546
      int[] indices   = new int[num];
547
      for(int i=1; i<num; i++) indices[i] = 1;
548
      return new ObjectFaceShape(bands,indices,null);
549
      }
550
    else
551
      {
552
      float h1 = isInIconMode() ? 0.0001f : 0.015f;
553
      float h2 = isInIconMode() ? 0.0001f : 0.001f;
554
      float[][] bands = { {h1,15,0.250f,0.7f,5,0,0}, {h2,15,0.125f,0.2f,2,0,0} };
555
      int num = 1+2*N;
556
      int[] indices   = new int[num];
557
      for(int i=1; i<num; i++) indices[i] = 1;
558
      return new ObjectFaceShape(bands,indices,null);
559
      }
560
    }
561

    
562
///////////////////////////////////////////////////////////////////////////////////////////////////
563

    
564
  public ObjectVertexEffects getVertexEffects(int variant)
565
    {
566
    if( variant==0 )
567
      {
568
      float[][] corners = { {0.10f,0.20f} };
569
      int num = 8+3*N;
570
      int[] indices = new int[num];
571
      for(int i=1; i<num; i++) indices[i] = -1;
572
      float[][] centers = {{ 0,0,0 }};
573
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
574
      }
575
    else if( variant==1 )
576
      {
577
      float[][] corners = { {0.05f,0.20f} };
578
      int num = 1+4*N;
579
      int[] indices = new int[num];
580
      for(int i=0; i<num; i++) indices[i] = -1;
581
      float[][] centers = { { 0,0,0 } };
582
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
583
      }
584
    else
585
      {
586
      float[][] corners = { {0.05f,0.20f} };
587
      int num = 1+2*N;
588
      int[] indices = new int[num];
589
      for(int i=0; i<num; i++) indices[i] = -1;
590
      float[][] centers = { { 0,0,0 } };
591
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
592
      }
593
    }
594

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

    
597
  public int getNumCubitVariants(int[] numLayers)
598
    {
599
    return 3;
600
    }
601

    
602
///////////////////////////////////////////////////////////////////////////////////////////////////
603

    
604
  public int getCubitVariant(int cubit, int[] numLayers)
605
    {
606
    return cubit<8 ? 0 : (cubit<14 ? 1:2);
607
    }
608

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

    
611
  public float getStickerRadius()
612
    {
613
    return 0.12f;
614
    }
615

    
616
///////////////////////////////////////////////////////////////////////////////////////////////////
617

    
618
  public float getStickerStroke()
619
    {
620
    return isInIconMode() ? 0.23f : 0.12f;
621
    }
622

    
623
///////////////////////////////////////////////////////////////////////////////////////////////////
624
// ditto, manually provide the sticker coordinates.
625

    
626
  @Override
627
  public void adjustStickerCoords()
628
    {
629
    float A = 0.38f;
630
    float B = 0.24f;
631

    
632
    mStickerCoords = new float[][]
633
          {
634
            { A,-0.5f, A, A, -0.5f, A, -0.5f, B, B, -0.5f },
635
            { 0.5f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, -0.5f },
636
            { 0.5f, -0.5f, -0.5f, 0.5f }
637
          };
638
    }
639

    
640
///////////////////////////////////////////////////////////////////////////////////////////////////
641

    
642
  public float[][] getStickerAngles()
643
    {
644
    float D = (float)(Math.PI/4);
645
    return new float[][] { { 0,0,0,-D,0 },{-D,-D,-D,-D},{D,D} };
646
    }
647

    
648
///////////////////////////////////////////////////////////////////////////////////////////////////
649
// PUBLIC API
650

    
651
  public Static3D[] getRotationAxis()
652
    {
653
    return ROT_AXIS;
654
    }
655

    
656
///////////////////////////////////////////////////////////////////////////////////////////////////
657

    
658
  public int[][] getBasicAngles()
659
    {
660
    if( mBasicAngle ==null )
661
      {
662
      int[] tmp1 = {3,3,3};
663
      int[] tmp2 = {4,4,4};
664
      mBasicAngle = new int[][] { tmp1,tmp1,tmp1,tmp1,tmp2,tmp2,tmp2 };
665
      }
666

    
667
    return mBasicAngle;
668
    }
669

    
670
///////////////////////////////////////////////////////////////////////////////////////////////////
671

    
672
  public String getShortName()
673
    {
674
    return ObjectType.COIH_3.name();
675
    }
676

    
677
///////////////////////////////////////////////////////////////////////////////////////////////////
678

    
679
  public ObjectSignature getSignature()
680
    {
681
    return new ObjectSignature(ObjectSignatures.COIH_3);
682
    }
683

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

    
686
  public String getObjectName()
687
    {
688
    return "Ancient Coin Cube";
689
    }
690

    
691
///////////////////////////////////////////////////////////////////////////////////////////////////
692

    
693
  public String getInventor()
694
    {
695
    return "Yukang Wu";
696
    }
697

    
698
///////////////////////////////////////////////////////////////////////////////////////////////////
699

    
700
  public int getYearOfInvention()
701
    {
702
    return 2018;
703
    }
704

    
705
///////////////////////////////////////////////////////////////////////////////////////////////////
706

    
707
  public int getComplexity()
708
    {
709
    return 0;
710
    }
711

    
712
///////////////////////////////////////////////////////////////////////////////////////////////////
713

    
714
  public String[][] getTutorials()
715
    {
716
    return new String[][] {
717
                          {"gb","8hPxLbZDSLQ","Chinese Coin Cube","CanChrisSolve"},
718
                          {"es","rK0_IsjoZqM","Ancient Coin Cube","R de Rubik"},
719
                          {"ru","HVZj2vBxD5A","Как собрать Коин Куб","Алексей Ярыгин"},
720
                          {"pl","yaNeIw4C5Uk","Ancient coin cube TUTORIAL PL","MrUK"},
721
                         };
722
    }
723
}
(6-6/47)