Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyTins.java @ da5551f4

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 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_CORNER;
14

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

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

    
32
public class TwistyTins extends ShapeHexahedron
33
{
34
  static final Static3D[] ROT_AXIS = new Static3D[]
35
         {
36
           new Static3D( SQ3/3, SQ3/3, SQ3/3),
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
         };
41

    
42
  private int[][] mEdges;
43
  private int[][] mBasicAngle;
44
  private float[][] mCuts;
45
  private float[][] mPosition;
46
  private int[] mQuatIndex;
47
  private boolean[][] mRotatable;
48

    
49
///////////////////////////////////////////////////////////////////////////////////////////////////
50

    
51
  public TwistyTins(int iconMode, Static4D quat, Static3D move, float scale, InitData data, InitAssets asset)
52
    {
53
    super(iconMode, 4, quat, move, scale, data, asset);
54
    }
55

    
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57

    
58
  public int[][] getScrambleEdges()
59
    {
60
    if( mEdges==null )
61
      {
62
      mEdges = new int[][]
63
        {
64
          { 0,16,1,16,2,8,3,8,  4,1,5,1,6,9,7,9,  8,15,9,15,10,7,11,7,  12,2,13,2,14,10,15,10,  16,14,17,14,18,6,19,6,  20,3,21,3,22,11,23,11,  24,13,25,13,26,5,27,5,  28,4,29,4,30,12,31,12 },  // 0
65

    
66
          {                                                             12,2,13,2,14,10,15,10,                          20,3,21,3,22,11,23,11,  24,13,25,13,26,5,27,5,                        },  // 1
67
          {                     4,1,5,1,6,9,7,9,                                                16,14,17,14,18,6,19,6,                                                  28,4,29,4,30,12,31,12 },  // 2
68
          {                     4,1,5,1,6,9,7,9,  8,15,9,15,10,7,11,7,                                                                                                  28,4,29,4,30,12,31,12 },  // 3
69
          { 0,16,1,16,2,8,3,8,                                          12,2,13,2,14,10,15,10,                          20,3,21,3,22,11,23,11,                                                },  // 4
70
          {                     4,1,5,1,6,9,7,9,  8,15,9,15,10,7,11,7,                          16,14,17,14,18,6,19,6,                                                                        },  // 5
71
          { 0,16,1,16,2,8,3,8,                                          12,2,13,2,14,10,15,10,                                                  24,13,25,13,26,5,27,5,                        },  // 6
72
          { 0,16,1,16,2,8,3,8,                                                                                          20,3,21,3,22,11,23,11,  24,13,25,13,26,5,27,5,                        },  // 7
73
          {                                       8,15,9,15,10,7,11,7,                          16,14,17,14,18,6,19,6,                                                  28,4,29,4,30,12,31,12 },  // 8
74

    
75
          {                                                             12,2,13,2,                                      20,3,21,3,                          26,5,27,5,                        },  // 9
76
          {                     4,1,5,1,                                                                    18,6,19,6,                                                  28,4,29,4,            },  // 10
77
          {                     4,1,5,1,                    10,7,11,7,                                                                                                  28,4,29,4,            },  // 11
78
          {           2,8,3,8,                                          12,2,13,2,                                      20,3,21,3,                                                            },  // 12
79
          {                     4,1,5,1,                    10,7,11,7,                                      18,6,19,6,                                                                        },  // 13
80
          {           2,8,3,8,                                          12,2,13,2,                                                                          26,5,27,5,                        },  // 14
81
          {           2,8,3,8,                                                                                          20,3,21,3,                          26,5,27,5,                        },  // 15
82
          {                                                 10,7,11,7,                                      18,6,19,6,                                                  28,4,29,4,            },  // 16
83
        };
84
      }
85

    
86
    return mEdges;
87
    }
88

    
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90

    
91
  @Override
92
  public int[][] getScrambleAlgorithms()
93
    {
94
    setUpRotatable();
95
    return ScrambleEdgeGenerator.getScramblingAlgorithms(mBasicAngle, mRotatable);
96
    }
97

    
98
///////////////////////////////////////////////////////////////////////////////////////////////////
99

    
100
  @Override
101
  public float[][] returnRotationFactor()
102
    {
103
    float C1 = 1.7f;
104
    float C2 = 2.5f;
105
    float[] f = new float[] { C2,C1,C1,C1,C2 };
106
    return new float[][] { f,f,f,f };
107
    }
108

    
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110

    
111
  public float[][] getCuts(int[] numLayers)
112
    {
113
    if( mCuts==null )
114
      {
115
      float C1 = -4*SQ3/3;
116
      float C2 = -2*SQ3/3;
117
      float C3 =  2*SQ3/3;
118
      float C4 =    SQ3+0.01f;
119

    
120
      float[] cut1 = new float[] { C1, C2, C3, C4 };
121
      float[] cut2 = new float[] {-C4,-C3,-C2,-C1 };
122

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

    
126
    return mCuts;
127
    }
128

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

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

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

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

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  public int getTouchControlType()
151
    {
152
    return TC_HEXAHEDRON;
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
  public int getTouchControlSplit()
158
    {
159
    return TYPE_SPLIT_CORNER;
160
    }
161

    
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163

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

    
177
///////////////////////////////////////////////////////////////////////////////////////////////////
178

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

    
184
///////////////////////////////////////////////////////////////////////////////////////////////////
185

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

    
191
///////////////////////////////////////////////////////////////////////////////////////////////////
192
// corner cubes, corner 'dino' , edges, centers.
193

    
194
  public float[][] getCubitPositions(int[] numLayers)
195
    {
196
    if( mPosition==null )
197
      {
198
      float C1 = 1.5f;
199
      float C2 = 1.0f;
200
      float C3 = 2.0f;
201
      float C4 = 0.5f;
202
      float C5 = 0.25f;
203
      float C6 = 0.75f;
204

    
205
      mPosition = new float[][]
206
         {
207
             { C1, C1, C1},
208
             {-C1, C1,-C1},
209
             { C1,-C1,-C1},
210
             {-C1,-C1, C1},
211

    
212
             {-C2, C3, C3},
213
             {-C3, C2, C3},
214
             {-C3, C3, C2},
215
             { C2, C3,-C3},
216
             { C3, C2,-C3},
217
             { C3, C3,-C2},
218
             { C2,-C3, C3},
219
             { C3,-C2, C3},
220
             { C3,-C3, C2},
221
             {-C2,-C3,-C3},
222
             {-C3,-C2,-C3},
223
             {-C3,-C3,-C2},
224

    
225
             { C4, C3, C3},
226
             { C3, C4, C3},
227
             {-C4,-C3, C3},
228
             {-C3,-C4, C3},
229
             { C3, C3, C4},
230
             { C3,-C3,-C4},
231
             {-C3,-C3, C4},
232
             {-C3, C3,-C4},
233
             {-C4, C3,-C3},
234
             { C3,-C4,-C3},
235
             { C4,-C3,-C3},
236
             {-C3, C4,-C3},
237

    
238
             {-C5, C6, C3}, // F
239
             { C5,-C6, C3},
240
             { C5, C6,-C3}, // B
241
             {-C5,-C6,-C3},
242
             { C3, C5,-C6}, // R
243
             { C3,-C5, C6},
244
             {-C3,-C5,-C6}, // L
245
             {-C3, C5, C6},
246
             {-C6, C3, C5}, // T
247
             { C6, C3,-C5},
248
             {-C6,-C3,-C5}, // D
249
             { C6,-C3, C5},
250

    
251
             { C6,-C5, C3},
252
             {-C6, C5, C3},
253
             {-C6,-C5,-C3},
254
             { C6, C5,-C3},
255
             { C3,-C6, C5},
256
             { C3, C6,-C5},
257
             {-C3, C6, C5},
258
             {-C3,-C6,-C5},
259
             { C5, C3,-C6},
260
             {-C5, C3, C6},
261
             { C5,-C3, C6},
262
             {-C5,-C3,-C6},
263
         };
264
      }
265

    
266
    return mPosition;
267
    }
268

    
269
///////////////////////////////////////////////////////////////////////////////////////////////////
270

    
271
  public Static4D getCubitQuats(int cubit, int[] numLayers)
272
    {
273
    if( mQuatIndex==null ) mQuatIndex = new int[] { 0, 3, 4, 6,
274
                                                    0, 8, 7,11, 5, 1,10, 2, 4, 9, 3, 6,
275
                                                    0, 2,10, 8, 1, 4, 6, 7,11, 5, 9, 3,
276
                                                    0,10,11, 9, 5, 2, 3, 8, 7, 1, 6, 4,
277
                                                    0,10,11, 9, 5, 2, 3, 8, 7, 1, 6, 4,
278
                                                  };
279
    return mObjectQuats[mQuatIndex[cubit]];
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283

    
284
  private float[][] getVertices(int variant)
285
    {
286
    if( variant==0 )
287
      {
288
      return new float[][]
289
          {
290
             { 0.0f, 0.0f, 0.0f },
291
             {-0.5f, 0.5f, 0.5f },
292
             {-0.5f,-0.5f, 0.5f },
293
             { 0.5f, 0.5f, 0.5f },
294
             { 0.5f,-0.5f, 0.5f },
295
             { 0.5f, 0.5f,-0.5f },
296
             { 0.5f,-0.5f,-0.5f },
297
             {-0.5f, 0.5f,-0.5f },
298
          };
299
      }
300
    else if( variant==1 )
301
      {
302
      return new float[][]
303
          {
304
             {-1.0f, 0.0f, 0.0f},
305
             { 1.0f, 0.0f, 0.0f},
306
             { 0.0f,-1.0f, 0.0f},
307
             { 0.0f, 0.0f,-1.0f}
308
          };
309
      }
310
    else if( variant==2 )
311
      {
312
      return new float[][]
313
          {
314
             {-0.5f, 0.0f, 0.0f},
315
             { 0.5f, 0.0f, 0.0f},
316
             { 0.5f,-1.0f, 0.0f},
317
             { 0.0f,-1.5f, 0.0f},
318
             {-1.0f,-0.5f, 0.0f},
319
             {-1.0f, 0.0f,-0.5f},
320
             { 0.0f, 0.0f,-1.5f},
321
             { 0.5f, 0.0f,-1.0f}
322
          };
323
      }
324
    else if( variant==3 )
325
      {
326
      return new float[][]
327
          {
328
             {-0.25f, 0.75f, 0.00f},
329
             { 0.75f,-0.25f, 0.00f},
330
             { 0.25f,-0.75f, 0.00f},
331
             {-0.75f, 0.25f, 0.00f},
332
             {-0.25f, 1.00f,-0.25f},
333
             { 0.75f, 0.50f,-0.75f},
334
             { 0.25f, 0.25f,-1.00f},
335
             {-0.75f, 0.75f,-0.50f}
336
          };
337
      }
338
    else
339
      {
340
      return new float[][]
341
          {
342
             {-0.25f, 0.75f, 0.00f},
343
             { 0.75f,-0.25f, 0.00f},
344
             { 0.25f,-0.75f, 0.00f},
345
             {-0.75f, 0.25f, 0.00f},
346
             { 0.50f, 0.75f,-0.75f},
347
             { 1.00f,-0.25f,-0.25f},
348
             { 0.75f,-0.75f,-0.50f},
349
             { 0.25f, 0.25f,-1.00f}
350
          };
351
      }
352
    }
353

    
354
///////////////////////////////////////////////////////////////////////////////////////////////////
355

    
356
  public ObjectShape getObjectShape(int variant)
357
    {
358
    if( variant==0 )
359
      {
360
      int[][] indices =
361
          {
362
             { 2,4,3,1 },
363
             { 1,3,5,7 },
364
             { 4,6,5,3 },
365
             { 0,4,2 },
366
             { 0,7,5 },
367
             { 0,6,4 },
368
             { 0,1,7 },
369
             { 0,2,1 },
370
             { 0,5,6 }
371
          };
372

    
373
      return new ObjectShape(getVertices(variant), indices);
374
      }
375
    else if( variant==1 )
376
      {
377
      int[][] indices =
378
          {
379
             {2,1,0},
380
             {3,0,1},
381
             {2,3,1},
382
             {3,2,0}
383
          };
384

    
385
      return new ObjectShape(getVertices(variant), indices);
386
      }
387
    else if( variant==2 )
388
      {
389
      int[][] indices =
390
          {
391
             {4,3,2,1,0},
392
             {0,1,7,6,5},
393
             {1,2,7},
394
             {2,3,6,7},
395
             {3,4,5,6},
396
             {0,5,4}
397
          };
398

    
399
      return new ObjectShape(getVertices(variant), indices);
400
      }
401
    else
402
      {
403
      int[][] indices =
404
          {
405
             {3,2,1,0},
406
             {6,5,1,2},
407
             {5,4,0,1},
408
             {4,7,3,0},
409
             {7,6,2,3},
410
             {4,5,6,7}
411
          };
412

    
413
      return new ObjectShape(getVertices(variant), indices);
414
      }
415
    }
416

    
417
///////////////////////////////////////////////////////////////////////////////////////////////////
418

    
419
  public ObjectFaceShape getObjectFaceShape(int variant)
420
    {
421
    if( variant==0 )
422
      {
423
      float h1 = isInIconMode() ? 0.001f : 0.06f;
424
      float h2 = isInIconMode() ? 0.001f : 0.01f;
425
      float[][] bands = { {h1,35,0.5f,0.7f,5,1,0}, {h2,35,0.2f,0.4f,5,1,0} };
426
      int[] indices   = { 0,0,0,1,1,1,1,1,1 };
427
      return new ObjectFaceShape(bands,indices,null);
428
      }
429
    else if( variant==1 )
430
      {
431
      float h1 = isInIconMode() ? 0.001f : 0.035f;
432
      float h2 = isInIconMode() ? 0.001f : 0.010f;
433
      float[][] bands  = { {h1,30,0.16f,0.8f,5,0,0}, {h2,30,0.16f,0.2f,5,0,0} };
434
      int[] bandIndices= { 0,0,1,1 };
435
      return new ObjectFaceShape(bands,bandIndices,null);
436
      }
437
    else if( variant==2 )
438
      {
439
      float h1 = isInIconMode() ? 0.001f : 0.035f;
440
      float h2 = isInIconMode() ? 0.001f : 0.010f;
441
      float[][] bands  = { {h1,30,0.16f,0.8f,5,1,0}, {h2,30,0.16f,0.2f,5,0,0} };
442
      int[] bandIndices= { 0,0,1,1,1,1 };
443
      return new ObjectFaceShape(bands,bandIndices,null);
444
      }
445
    else
446
      {
447
      float h1 = isInIconMode() ? 0.001f : 0.040f;
448
      float h2 = isInIconMode() ? 0.001f : 0.002f;
449
      float[][] bands  = { {h1,30,0.3f,0.5f,5,0,0}, {h2,30,0.1f,0.2f,3,0,0} };
450
      int[] bandIndices= { 0,1,1,1,1,1,1,1 };
451
      return new ObjectFaceShape(bands,bandIndices,null);
452
      }
453
    }
454

    
455
///////////////////////////////////////////////////////////////////////////////////////////////////
456

    
457
  public ObjectVertexEffects getVertexEffects(int variant)
458
    {
459
    if( variant==0 )
460
      {
461
      float[][] corners = { {0.06f,0.12f} };
462
      int[] indices     = { -1,0,-1,0,0,0,-1,-1 };
463
      float[][] centers = { { 0.0f, 0.0f, 0.0f} };
464
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
465
      }
466
    else if( variant==1 )
467
      {
468
      float[][] corners   = { {0.05f,0.30f}, {0.05f,0.20f} };
469
      int[] cornerIndices = { 0,0,1,1 };
470
      float[][] centers   = { {0.0f, -0.75f, -0.75f} };
471
      int[] centerIndices = { 0,0,0,0 };
472
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
473
      }
474
    else if( variant==2 )
475
      {
476
      float[][] corners   = { {0.05f,0.20f}, {0.05f,0.15f} };
477
      int[] cornerIndices = { 0,0,1,1,1,1,1,1 };
478
      float[][] centers   = { {0.0f, -0.5f, -0.5f} };
479
      int[] centerIndices = { 0,0,0,0,0,0,0,0 };
480
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
481
      }
482
    else
483
      {
484
      return null;
485
      }
486
    }
487

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

    
490
  public int getNumCubitVariants(int[] numLayers)
491
    {
492
    return 5;
493
    }
494

    
495
///////////////////////////////////////////////////////////////////////////////////////////////////
496

    
497
  public int getCubitVariant(int cubit, int[] numLayers)
498
    {
499
    return cubit<4 ? 0: (cubit<16 ? 1: (cubit<28 ? 2: (cubit<40 ? 3:4)));
500
    }
501

    
502
///////////////////////////////////////////////////////////////////////////////////////////////////
503

    
504
  public float getStickerRadius()
505
    {
506
    return 0.09f;
507
    }
508

    
509
///////////////////////////////////////////////////////////////////////////////////////////////////
510

    
511
  public float getStickerStroke()
512
    {
513
    return isInIconMode() ? 0.24f : 0.10f;
514
    }
515

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

    
518
  public float[][][] getStickerAngles()
519
    {
520
    return null;
521
    }
522

    
523
///////////////////////////////////////////////////////////////////////////////////////////////////
524
// PUBLIC API
525

    
526
  public Static3D[] getRotationAxis()
527
    {
528
    return ROT_AXIS;
529
    }
530

    
531
///////////////////////////////////////////////////////////////////////////////////////////////////
532

    
533
  public int[][] getBasicAngles()
534
    {
535
    if( mBasicAngle ==null )
536
      {
537
      int[] tmp = {3,3,3,3,3};
538
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
539
      }
540

    
541
    return mBasicAngle;
542
    }
543

    
544
///////////////////////////////////////////////////////////////////////////////////////////////////
545

    
546
  public String getShortName()
547
    {
548
    return ObjectType.TINS_5.name();
549
    }
550

    
551
///////////////////////////////////////////////////////////////////////////////////////////////////
552

    
553
  public ObjectSignature getSignature()
554
    {
555
    return new ObjectSignature(ObjectConstants.TINS_5);
556
    }
557

    
558
///////////////////////////////////////////////////////////////////////////////////////////////////
559

    
560
  public String getObjectName()
561
    {
562
    return "Tins Cube";
563
    }
564

    
565
///////////////////////////////////////////////////////////////////////////////////////////////////
566

    
567
  public String getInventor()
568
    {
569
    return "조현준";
570
    }
571

    
572
///////////////////////////////////////////////////////////////////////////////////////////////////
573

    
574
  public int getYearOfInvention()
575
    {
576
    return 2021;
577
    }
578

    
579
///////////////////////////////////////////////////////////////////////////////////////////////////
580

    
581
  public float getComplexity()
582
    {
583
    return 2.95f;
584
    }
585

    
586
///////////////////////////////////////////////////////////////////////////////////////////////////
587

    
588
  public String[][] getTutorials()
589
    {
590
    return null;
591
    }
592
}
(53-53/57)