Project

General

Profile

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

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

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.helpers.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.main.ObjectSignatures;
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 meshState, int iconMode, Static4D quat, Static3D move, float scale, InitData data, InitAssets asset)
52
    {
53
    super(meshState, iconMode, 4, quat, move, scale, data, asset);
54
    }
55

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

    
58
  public int[][] getScrambleEdges()
59
    {
60
    if( mEdges==null )
61
      {
62
      setUpRotatable();
63
      mEdges = ScrambleEdgeGenerator.getScrambleEdgesSingle(mBasicAngle, mRotatable);
64
      }
65

    
66
    return mEdges;
67
    }
68

    
69
///////////////////////////////////////////////////////////////////////////////////////////////////
70

    
71
  @Override
72
  public int[][] getScrambleAlgorithms()
73
    {
74
    setUpRotatable();
75
    return ScrambleEdgeGenerator.getScramblingAlgorithms(mBasicAngle, mRotatable);
76
    }
77

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

    
80
  public float[][] getCuts(int[] numLayers)
81
    {
82
    if( mCuts==null )
83
      {
84
      float C1 = -4*SQ3/3;
85
      float C2 = -2*SQ3/3;
86
      float C3 =  2*SQ3/3;
87
      float C4 =    SQ3+0.01f;
88

    
89
      float[] cut1 = new float[] { C1, C2, C3, C4 };
90
      float[] cut2 = new float[] {-C4,-C3,-C2,-C1 };
91

    
92
      mCuts = new float[][] { cut1,cut2,cut2,cut1 };
93
      }
94

    
95
    return mCuts;
96
    }
97

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

    
100
  private void setUpRotatable()
101
    {
102
    if( mRotatable==null )
103
      {
104
      boolean[] tmp = new boolean[] {true,true,false,true,true};
105
      mRotatable = new boolean[][] { tmp,tmp,tmp,tmp };
106
      }
107
    }
108

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

    
111
  public boolean[][] getLayerRotatable(int[] numLayers)
112
    {
113
    setUpRotatable();
114
    return mRotatable;
115
    }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118

    
119
  public int getTouchControlType()
120
    {
121
    return TC_HEXAHEDRON;
122
    }
123

    
124
///////////////////////////////////////////////////////////////////////////////////////////////////
125

    
126
  public int getTouchControlSplit()
127
    {
128
    return TYPE_SPLIT_CORNER;
129
    }
130

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

    
133
  public int[][][] getEnabled()
134
    {
135
    return new int[][][]
136
      {
137
          {{0,1},{3,1},{2,3},{0,2}},
138
          {{2,3},{3,1},{0,1},{0,2}},
139
          {{1,2},{0,1},{0,3},{2,3}},
140
          {{1,2},{2,3},{0,3},{0,1}},
141
          {{0,3},{0,2},{1,2},{1,3}},
142
          {{1,2},{0,2},{0,3},{1,3}},
143
      };
144
    }
145

    
146
///////////////////////////////////////////////////////////////////////////////////////////////////
147

    
148
  public float[] getDist3D(int[] numLayers)
149
    {
150
    return TouchControlHexahedron.D3D;
151
    }
152

    
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154

    
155
  public Static3D[] getFaceAxis()
156
    {
157
    return TouchControlHexahedron.FACE_AXIS;
158
    }
159

    
160
///////////////////////////////////////////////////////////////////////////////////////////////////
161
// corner cubes, corner 'dino' , edges, centers.
162

    
163
  public float[][] getCubitPositions(int[] numLayers)
164
    {
165
    if( mPosition==null )
166
      {
167
      float C1 = 1.5f;
168
      float C2 = 1.0f;
169
      float C3 = 2.0f;
170
      float C4 = 0.5f;
171
      float C5 = 0.25f;
172
      float C6 = 0.75f;
173

    
174
      mPosition = new float[][]
175
         {
176
             { C1, C1, C1},
177
             {-C1, C1,-C1},
178
             { C1,-C1,-C1},
179
             {-C1,-C1, C1},
180

    
181
             {-C2, C3, C3},
182
             {-C3, C2, C3},
183
             {-C3, C3, C2},
184
             { C2, C3,-C3},
185
             { C3, C2,-C3},
186
             { C3, C3,-C2},
187
             { C2,-C3, C3},
188
             { C3,-C2, C3},
189
             { C3,-C3, C2},
190
             {-C2,-C3,-C3},
191
             {-C3,-C2,-C3},
192
             {-C3,-C3,-C2},
193

    
194
             { C4, C3, C3},
195
             { C3, C4, C3},
196
             {-C4,-C3, C3},
197
             {-C3,-C4, C3},
198
             { C3, C3, C4},
199
             { C3,-C3,-C4},
200
             {-C3,-C3, C4},
201
             {-C3, C3,-C4},
202
             {-C4, C3,-C3},
203
             { C3,-C4,-C3},
204
             { C4,-C3,-C3},
205
             {-C3, C4,-C3},
206

    
207
             {-C5, C6, C3}, // F
208
             { C5,-C6, C3},
209
             { C5, C6,-C3}, // B
210
             {-C5,-C6,-C3},
211
             { C3, C5,-C6}, // R
212
             { C3,-C5, C6},
213
             {-C3,-C5,-C6}, // L
214
             {-C3, C5, C6},
215
             {-C6, C3, C5}, // T
216
             { C6, C3,-C5},
217
             {-C6,-C3,-C5}, // D
218
             { C6,-C3, C5},
219

    
220
             { C6,-C5, C3},
221
             {-C6, C5, C3},
222
             {-C6,-C5,-C3},
223
             { C6, C5,-C3},
224
             { C3,-C6, C5},
225
             { C3, C6,-C5},
226
             {-C3, C6, C5},
227
             {-C3,-C6,-C5},
228
             { C5, C3,-C6},
229
             {-C5, C3, C6},
230
             { C5,-C3, C6},
231
             {-C5,-C3,-C6},
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, 3, 4, 6,
243
                                                    0, 8, 7,11, 5, 1,10, 2, 4, 9, 3, 6,
244
                                                    0, 2,10, 8, 1, 4, 6, 7,11, 5, 9, 3,
245
                                                    0,10,11, 9, 5, 2, 3, 8, 7, 1, 6, 4,
246
                                                    0,10,11, 9, 5, 2, 3, 8, 7, 1, 6, 4,
247
                                                  };
248
    return mObjectQuats[mQuatIndex[cubit]];
249
    }
250

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

    
253
  private float[][] getVertices(int variant)
254
    {
255
    if( variant==0 )
256
      {
257
      return new float[][]
258
          {
259
             { 0.0f, 0.0f, 0.0f },
260
             {-0.5f, 0.5f, 0.5f },
261
             {-0.5f,-0.5f, 0.5f },
262
             { 0.5f, 0.5f, 0.5f },
263
             { 0.5f,-0.5f, 0.5f },
264
             { 0.5f, 0.5f,-0.5f },
265
             { 0.5f,-0.5f,-0.5f },
266
             {-0.5f, 0.5f,-0.5f },
267
          };
268
      }
269
    else if( variant==1 )
270
      {
271
      return new float[][]
272
          {
273
             {-1.0f, 0.0f, 0.0f},
274
             { 1.0f, 0.0f, 0.0f},
275
             { 0.0f,-1.0f, 0.0f},
276
             { 0.0f, 0.0f,-1.0f}
277
          };
278
      }
279
    else if( variant==2 )
280
      {
281
      return new float[][]
282
          {
283
             {-0.5f, 0.0f, 0.0f},
284
             { 0.5f, 0.0f, 0.0f},
285
             { 0.5f,-1.0f, 0.0f},
286
             { 0.0f,-1.5f, 0.0f},
287
             {-1.0f,-0.5f, 0.0f},
288
             {-1.0f, 0.0f,-0.5f},
289
             { 0.0f, 0.0f,-1.5f},
290
             { 0.5f, 0.0f,-1.0f}
291
          };
292
      }
293
    else if( variant==3 )
294
      {
295
      return new float[][]
296
          {
297
             {-0.25f, 0.75f, 0.00f},
298
             { 0.75f,-0.25f, 0.00f},
299
             { 0.25f,-0.75f, 0.00f},
300
             {-0.75f, 0.25f, 0.00f},
301
             {-0.25f, 1.00f,-0.25f},
302
             { 0.75f, 0.50f,-0.75f},
303
             { 0.25f, 0.25f,-1.00f},
304
             {-0.75f, 0.75f,-0.50f}
305
          };
306
      }
307
    else
308
      {
309
      return new float[][]
310
          {
311
             {-0.25f, 0.75f, 0.00f},
312
             { 0.75f,-0.25f, 0.00f},
313
             { 0.25f,-0.75f, 0.00f},
314
             {-0.75f, 0.25f, 0.00f},
315
             { 0.50f, 0.75f,-0.75f},
316
             { 1.00f,-0.25f,-0.25f},
317
             { 0.75f,-0.75f,-0.50f},
318
             { 0.25f, 0.25f,-1.00f}
319
          };
320
      }
321
    }
322

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

    
325
  public ObjectShape getObjectShape(int variant)
326
    {
327
    if( variant==0 )
328
      {
329
      int[][] indices =
330
          {
331
             { 2,4,3,1 },
332
             { 1,3,5,7 },
333
             { 4,6,5,3 },
334
             { 0,4,2 },
335
             { 0,7,5 },
336
             { 0,6,4 },
337
             { 0,1,7 },
338
             { 0,2,1 },
339
             { 0,5,6 }
340
          };
341

    
342
      return new ObjectShape(getVertices(variant), indices);
343
      }
344
    else if( variant==1 )
345
      {
346
      int[][] indices =
347
          {
348
             {2,1,0},
349
             {3,0,1},
350
             {2,3,1},
351
             {3,2,0}
352
          };
353

    
354
      return new ObjectShape(getVertices(variant), indices);
355
      }
356
    else if( variant==2 )
357
      {
358
      int[][] indices =
359
          {
360
             {4,3,2,1,0},
361
             {0,1,7,6,5},
362
             {1,2,7},
363
             {2,3,6,7},
364
             {3,4,5,6},
365
             {0,5,4}
366
          };
367

    
368
      return new ObjectShape(getVertices(variant), indices);
369
      }
370
    else
371
      {
372
      int[][] indices =
373
          {
374
             {3,2,1,0},
375
             {6,5,1,2},
376
             {5,4,0,1},
377
             {4,7,3,0},
378
             {7,6,2,3},
379
             {4,5,6,7}
380
          };
381

    
382
      return new ObjectShape(getVertices(variant), indices);
383
      }
384
    }
385

    
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387

    
388
  public ObjectFaceShape getObjectFaceShape(int variant)
389
    {
390
    if( variant==0 )
391
      {
392
      float h1 = isInIconMode() ? 0.001f : 0.06f;
393
      float h2 = isInIconMode() ? 0.001f : 0.01f;
394
      float[][] bands = { {h1,35,0.5f,0.7f,5,1,0}, {h2,35,0.2f,0.4f,5,1,0} };
395
      int[] indices   = { 0,0,0,1,1,1,1,1,1 };
396
      return new ObjectFaceShape(bands,indices,null);
397
      }
398
    else if( variant==1 )
399
      {
400
      float h1 = isInIconMode() ? 0.001f : 0.035f;
401
      float h2 = isInIconMode() ? 0.001f : 0.010f;
402
      float[][] bands  = { {h1,30,0.16f,0.8f,5,0,0}, {h2,30,0.16f,0.2f,5,0,0} };
403
      int[] bandIndices= { 0,0,1,1 };
404
      return new ObjectFaceShape(bands,bandIndices,null);
405
      }
406
    else if( variant==2 )
407
      {
408
      float h1 = isInIconMode() ? 0.001f : 0.035f;
409
      float h2 = isInIconMode() ? 0.001f : 0.010f;
410
      float[][] bands  = { {h1,30,0.16f,0.8f,5,1,0}, {h2,30,0.16f,0.2f,5,0,0} };
411
      int[] bandIndices= { 0,0,1,1,1,1 };
412
      return new ObjectFaceShape(bands,bandIndices,null);
413
      }
414
    else
415
      {
416
      float h1 = isInIconMode() ? 0.001f : 0.040f;
417
      float h2 = isInIconMode() ? 0.001f : 0.002f;
418
      float[][] bands  = { {h1,30,0.3f,0.5f,5,0,0}, {h2,30,0.1f,0.2f,3,0,0} };
419
      int[] bandIndices= { 0,1,1,1,1,1,1,1 };
420
      return new ObjectFaceShape(bands,bandIndices,null);
421
      }
422
    }
423

    
424
///////////////////////////////////////////////////////////////////////////////////////////////////
425

    
426
  public ObjectVertexEffects getVertexEffects(int variant)
427
    {
428
    if( variant==0 )
429
      {
430
      float[][] corners = { {0.06f,0.12f} };
431
      int[] indices     = { -1,0,-1,0,0,0,-1,-1 };
432
      float[][] centers = { { 0.0f, 0.0f, 0.0f} };
433
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
434
      }
435
    else if( variant==1 )
436
      {
437
      float[][] corners   = { {0.05f,0.30f}, {0.05f,0.20f} };
438
      int[] cornerIndices = { 0,0,1,1 };
439
      float[][] centers   = { {0.0f, -0.75f, -0.75f} };
440
      int[] centerIndices = { 0,0,0,0 };
441
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
442
      }
443
    else if( variant==2 )
444
      {
445
      float[][] corners   = { {0.05f,0.20f}, {0.05f,0.15f} };
446
      int[] cornerIndices = { 0,0,1,1,1,1,1,1 };
447
      float[][] centers   = { {0.0f, -0.5f, -0.5f} };
448
      int[] centerIndices = { 0,0,0,0,0,0,0,0 };
449
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
450
      }
451
    else
452
      {
453
      return null;
454
      }
455
    }
456

    
457
///////////////////////////////////////////////////////////////////////////////////////////////////
458

    
459
  public int getNumCubitVariants(int[] numLayers)
460
    {
461
    return 5;
462
    }
463

    
464
///////////////////////////////////////////////////////////////////////////////////////////////////
465

    
466
  public int getCubitVariant(int cubit, int[] numLayers)
467
    {
468
    return cubit<4 ? 0: (cubit<16 ? 1: (cubit<28 ? 2: (cubit<40 ? 3:4)));
469
    }
470

    
471
///////////////////////////////////////////////////////////////////////////////////////////////////
472

    
473
  public float getStickerRadius()
474
    {
475
    return 0.09f;
476
    }
477

    
478
///////////////////////////////////////////////////////////////////////////////////////////////////
479

    
480
  public float getStickerStroke()
481
    {
482
    return isInIconMode() ? 0.24f : 0.10f;
483
    }
484

    
485
///////////////////////////////////////////////////////////////////////////////////////////////////
486

    
487
  public float[][] getStickerAngles()
488
    {
489
    return null;
490
    }
491

    
492
///////////////////////////////////////////////////////////////////////////////////////////////////
493
// PUBLIC API
494

    
495
  public Static3D[] getRotationAxis()
496
    {
497
    return ROT_AXIS;
498
    }
499

    
500
///////////////////////////////////////////////////////////////////////////////////////////////////
501

    
502
  public int[][] getBasicAngles()
503
    {
504
    if( mBasicAngle ==null )
505
      {
506
      int[] tmp = {3,3,3,3,3};
507
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
508
      }
509

    
510
    return mBasicAngle;
511
    }
512

    
513
///////////////////////////////////////////////////////////////////////////////////////////////////
514

    
515
  public String getShortName()
516
    {
517
    return ObjectType.TINS_5.name();
518
    }
519

    
520
///////////////////////////////////////////////////////////////////////////////////////////////////
521

    
522
  public ObjectSignature getSignature()
523
    {
524
    return new ObjectSignature(ObjectSignatures.TINS_5);
525
    }
526

    
527
///////////////////////////////////////////////////////////////////////////////////////////////////
528

    
529
  public String getObjectName()
530
    {
531
    return "Tins Cube";
532
    }
533

    
534
///////////////////////////////////////////////////////////////////////////////////////////////////
535

    
536
  public String getInventor()
537
    {
538
    return "조현준";
539
    }
540

    
541
///////////////////////////////////////////////////////////////////////////////////////////////////
542

    
543
  public int getYearOfInvention()
544
    {
545
    return 2021;
546
    }
547

    
548
///////////////////////////////////////////////////////////////////////////////////////////////////
549

    
550
  public int getComplexity()
551
    {
552
    return 2;
553
    }
554

    
555
///////////////////////////////////////////////////////////////////////////////////////////////////
556

    
557
  public String[][] getTutorials()
558
    {
559
    return null;
560
    }
561
}
(43-43/47)