Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyIvy.java @ a8295031

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.objectlib.objects;
21

    
22
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_SPLIT_CORNER;
23
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_HEXAHEDRON;
24

    
25
import java.io.InputStream;
26

    
27
import org.distorted.library.type.Static3D;
28
import org.distorted.library.type.Static4D;
29

    
30
import org.distorted.objectlib.helpers.ObjectFaceShape;
31
import org.distorted.objectlib.helpers.ObjectSignature;
32
import org.distorted.objectlib.main.InitData;
33
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
34
import org.distorted.objectlib.main.ObjectType;
35
import org.distorted.objectlib.helpers.ObjectShape;
36
import org.distorted.objectlib.scrambling.ScrambleState;
37
import org.distorted.objectlib.main.ShapeHexahedron;
38

    
39
///////////////////////////////////////////////////////////////////////////////////////////////////
40

    
41
public class TwistyIvy extends ShapeHexahedron
42
{
43
  static final Static3D[] ROT_AXIS = new Static3D[]
44
         {
45
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
46
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
47
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
48
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
49
         };
50

    
51
  public static final float IVY_D = 0.006f;
52
  private static final int  IVY_N = 8;
53

    
54
  private ScrambleState[] mStates;
55
  private int[][] mBasicAngle;
56
  private float[][] mCuts;
57
  private int[] mQuatIndex;
58

    
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60

    
61
  public TwistyIvy(InitData data, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
62
    {
63
    super(data, meshState, iconMode, data.getNumLayers()[0], quat, move, scale, stream);
64
    }
65

    
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67
// ditto, manually provide the sticker coordinates.
68

    
69
  @Override
70
  public void adjustStickerCoords()
71
    {
72
    float B = 1.08f;
73
    float A1 = B*0.41f;
74
    float A2 = B*0.46f;
75

    
76
    mStickerCoords = new float[][]
77
          {
78
            { 0.29258922f, -0.5f, 0.29258922f, 0.29258922f, -0.5f, 0.29258922f },
79
            { -A1,A1,A2,-A2 }
80
          };
81
    }
82

    
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84

    
85
  public ScrambleState[] getScrambleStates()
86
    {
87
    if( mStates==null )
88
      {
89
      int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
90

    
91
      mStates = new ScrambleState[]
92
        {
93
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
94
        };
95
      }
96

    
97
    return mStates;
98
    }
99

    
100
///////////////////////////////////////////////////////////////////////////////////////////////////
101

    
102
  public float[][] getCuts(int[] numLayers)
103
    {
104
    if( mCuts==null )
105
      {
106
      float[] cut = new float[] {0.0f};
107
      mCuts = new float[][] { cut,cut,cut,cut };
108
      }
109

    
110
    return mCuts;
111
    }
112

    
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114

    
115
  public boolean[][] getLayerRotatable(int[] numLayers)
116
    {
117
    int numAxis = ROT_AXIS.length;
118
    boolean[][] layerRotatable = new boolean[numAxis][];
119

    
120
    for(int i=0; i<numAxis; i++)
121
      {
122
      layerRotatable[i] = new boolean[numLayers[i]];
123
      for(int j=0; j<numLayers[i]; j++) layerRotatable[i][j] = true;
124
      }
125

    
126
    return layerRotatable;
127
    }
128

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

    
131
  public int getTouchControlType()
132
    {
133
    return TC_HEXAHEDRON;
134
    }
135

    
136
///////////////////////////////////////////////////////////////////////////////////////////////////
137

    
138
  public int getTouchControlSplit()
139
    {
140
    return TYPE_SPLIT_CORNER;
141
    }
142

    
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144

    
145
  public int[][][] getEnabled()
146
    {
147
    return new int[][][]
148
      {
149
          {{0},{3},{3},{0}},
150
          {{2},{1},{1},{2}},
151
          {{2},{0},{0},{2}},
152
          {{1},{3},{3},{1}},
153
          {{0},{0},{1},{1}},
154
          {{2},{2},{3},{3}},
155
      };
156
    }
157

    
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159

    
160
  public float[] getDist3D(int[] numLayers)
161
    {
162
    return TouchControlHexahedron.D3D;
163
    }
164

    
165
///////////////////////////////////////////////////////////////////////////////////////////////////
166

    
167
  public Static3D[] getFaceAxis()
168
    {
169
    return TouchControlHexahedron.FACE_AXIS;
170
    }
171

    
172
///////////////////////////////////////////////////////////////////////////////////////////////////
173

    
174
  public float[][] getCubitPositions(int[] numLayers)
175
    {
176
    final float DIST_CORNER = numLayers[0]-1;
177
    final float DIST_CENTER = numLayers[0]-1;
178

    
179
    return new float[][]
180
      {
181
        { DIST_CORNER, DIST_CORNER, DIST_CORNER },
182
        {-DIST_CORNER, DIST_CORNER,-DIST_CORNER },
183
        {-DIST_CORNER,-DIST_CORNER, DIST_CORNER },
184
        { DIST_CORNER,-DIST_CORNER,-DIST_CORNER },
185
        {           0,           0, DIST_CENTER },
186
        {           0,           0,-DIST_CENTER },
187
        {           0, DIST_CENTER,           0 },
188
        {           0,-DIST_CENTER,           0 },
189
        { DIST_CENTER,           0,           0 },
190
        {-DIST_CENTER,           0,           0 },
191
      };
192
    }
193

    
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195

    
196
  public Static4D getCubitQuats(int cubit, int[] numLayers)
197
    {
198
    if( mQuatIndex==null ) mQuatIndex = new int[] { 0,11,10, 9,
199
                                                    0,11, 7, 6, 5, 8
200
                                                  };
201
    return mObjectQuats[mQuatIndex[cubit]];
202
    }
203

    
204
///////////////////////////////////////////////////////////////////////////////////////////////////
205

    
206
  public ObjectShape getObjectShape(int variant)
207
    {
208
    if( variant==0 )
209
      {
210
      final float A = 0.3f;
211
      final float angle = (float)Math.PI/(2*IVY_N);
212
      final float CORR  = 1-2*IVY_D;
213
      float[][] vertices= new float[3*(IVY_N+1)+5][3];
214
      int[][] indices   = new int[3*IVY_N+3][];
215

    
216
      indices[0] = new int[IVY_N+4];
217
      indices[1] = new int[IVY_N+4];
218
      indices[2] = new int[IVY_N+4];
219

    
220
      vertices[3*(IVY_N+1)+4][0] = -A;
221
      vertices[3*(IVY_N+1)+4][1] = -A;
222
      vertices[3*(IVY_N+1)+4][2] = -A;
223

    
224
      vertices[0][0] = 0;
225
      vertices[0][1] = 0;
226
      vertices[0][2] = 0;
227
      vertices[1][0] =-2;
228
      vertices[1][1] = 0;
229
      vertices[1][2] = 0;
230
      vertices[2][0] = 0;
231
      vertices[2][1] =-2;
232
      vertices[2][2] = 0;
233
      vertices[3][0] = 0;
234
      vertices[3][1] = 0;
235
      vertices[3][2] =-2;
236

    
237
      indices[0][0] = 2;
238
      indices[0][1] = 0;
239
      indices[0][2] = 1;
240
      indices[1][0] = 3;
241
      indices[1][1] = 0;
242
      indices[1][2] = 2;
243
      indices[2][0] = 1;
244
      indices[2][1] = 0;
245
      indices[2][2] = 3;
246

    
247
      int N1 = 4;
248
      int N2 = N1 + IVY_N + 1;
249
      int N3 = N2 + IVY_N + 1;
250

    
251
      for(int i=0; i<=IVY_N; i++)
252
        {
253
        float cos1 = (float)Math.cos((IVY_N-i)*angle);
254
        float sin1 = (float)Math.sin((IVY_N-i)*angle);
255
        float cos2 = (float)Math.cos((      i)*angle);
256
        float sin2 = (float)Math.sin((      i)*angle);
257

    
258
        vertices[N1+i][0] = CORR*(2*cos1-1) - 1;
259
        vertices[N1+i][1] = CORR*(2*sin1-1) - 1;
260
        vertices[N1+i][2] = 0;
261

    
262
        vertices[N2+i][0] = 0;
263
        vertices[N2+i][1] = CORR*(2*sin2-1) - 1;
264
        vertices[N2+i][2] = CORR*(2*cos2-1) - 1;
265

    
266
        vertices[N3+i][0] = CORR*(2*cos2-1) - 1;
267
        vertices[N3+i][1] = 0;
268
        vertices[N3+i][2] = CORR*(2*sin2-1) - 1;
269

    
270
        indices[0][i+3] = N1 + i;
271
        indices[1][i+3] = N2 + i;
272
        indices[2][i+3] = N3 + i;
273
        }
274

    
275
      for(int i=0; i<IVY_N; i++)
276
        {
277
        indices[3*i+3] = new int[] { N1+i+1, N1+i, 3*(IVY_N+1)+4 };
278
        indices[3*i+4] = new int[] { N2+i+1, N2+i, 3*(IVY_N+1)+4 };
279
        indices[3*i+5] = new int[] { N3+i+1, N3+i, 3*(IVY_N+1)+4 };
280
        }
281

    
282
      return new ObjectShape(vertices, indices);
283
      }
284
    else
285
      {
286
      final float angle = (float)Math.PI/(2*IVY_N);
287
      final float CORR  = 1-2*IVY_D;
288
      float[][] vertices= new float[2*IVY_N+1][3];
289
      int[][] indices   = new int[2*IVY_N+1][];
290

    
291
      for(int i=0; i<IVY_N; i++)
292
        {
293
        float sin = (float)Math.sin(i*angle);
294
        float cos = (float)Math.cos(i*angle);
295

    
296
        vertices[i      ][0] = CORR*(1-2*cos);
297
        vertices[i      ][1] = CORR*(1-2*sin);
298
        vertices[i      ][2] = 0;
299
        vertices[i+IVY_N][0] = CORR*(2*cos-1);
300
        vertices[i+IVY_N][1] = CORR*(2*sin-1);
301
        vertices[i+IVY_N][2] = 0;
302
        }
303

    
304
      vertices[2*IVY_N][0] = 0.0f;
305
      vertices[2*IVY_N][1] = 0.0f;
306
      vertices[2*IVY_N][2] =-0.1f;
307

    
308
      indices[0] = new int[2*IVY_N+1];
309
      for(int i=0; i<2*IVY_N; i++)
310
        {
311
        indices[0][i] = i;
312
        indices[i+1]  = new int[] {i+1,i,2*IVY_N};
313
        }
314
      indices[2*IVY_N][0] = 0;
315

    
316
      return new ObjectShape(vertices, indices);
317
      }
318
    }
319

    
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321

    
322
  public ObjectFaceShape getObjectFaceShape(int variant)
323
    {
324
    if( variant==0 )
325
      {
326
      float height = isInIconMode() ? 0.001f : 0.015f;
327
      float[][] centers  = { {-1.0f,-1.0f,-1.0f} };
328
      float[][] corners  = { {0.04f,0.20f}, {0.03f,0.20f} };
329
      float[][] bands    = { {height,20,0.2f,0.5f,7,1,2}, {0.001f,1,0.2f,0.0f,2,0,0} };
330

    
331
      int[] cornerIndices= new int[3*(IVY_N+1)+5];
332
      int[] centerIndices= new int[3*(IVY_N+1)+5];
333
      int[] bandIndices  = new int[3*(IVY_N+1)  ];
334

    
335
      for(int i=0; i<3*(IVY_N+1); i++)
336
        {
337
        cornerIndices[i+4] = -1;
338
        centerIndices[i+4] = -1;
339
        bandIndices[i] = 1;
340
        }
341

    
342
      cornerIndices[3*(IVY_N+1)+4] = -1;
343
      centerIndices[3*(IVY_N+1)+4] = -1;
344

    
345
      bandIndices[0] = 0;
346
      bandIndices[1] = 0;
347
      bandIndices[2] = 0;
348

    
349
      cornerIndices[0] = 1;
350
      cornerIndices[1] = 0;
351
      cornerIndices[2] = 0;
352
      cornerIndices[3] = 0;
353

    
354
      centerIndices[0] = 0;
355
      centerIndices[1] = 0;
356
      centerIndices[2] = 0;
357
      centerIndices[3] = 0;
358

    
359
      float C = 1-SQ2/2;
360
      float[] convexCenter = {-C,-C,-C};
361
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,convexCenter);
362
      }
363
    else
364
      {
365
      float h1 = isInIconMode() ? 0.001f : 0.03f;
366
      float h2 = isInIconMode() ? 0.001f : 0.01f;
367
      float[][] corners= { {0.04f,0.20f} };
368
      float[][] centers= { {-0.0f,-0.0f,-1.0f} };
369
      float[][] bands  = { { h1,35,0.5f,0.5f,5,0,0}, {h2,1,0.5f,0.8f,2,0,0} };
370

    
371
      int[] bandIndices= new int[2*IVY_N+1];
372
      int[] indexes = new int[2*IVY_N+1];
373
      for(int i=0; i<2*IVY_N+1; i++)
374
        {
375
        indexes[i] = -1;
376
        bandIndices[i] = 1;
377
        }
378
      indexes[0] = indexes[IVY_N] = 0;
379
      bandIndices[0] = 0;
380

    
381
      return new ObjectFaceShape(bands,bandIndices,corners,indexes,centers,indexes, null);
382
      }
383
    }
384

    
385
///////////////////////////////////////////////////////////////////////////////////////////////////
386

    
387
  public int getNumCubitVariants(int[] numLayers)
388
    {
389
    return 2;
390
    }
391

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

    
394
  public int getCubitVariant(int cubit, int[] numLayers)
395
    {
396
    return cubit<4 ? 0:1;
397
    }
398

    
399
///////////////////////////////////////////////////////////////////////////////////////////////////
400

    
401
  public float getStickerRadius()
402
    {
403
    return 0.19f;
404
    }
405

    
406
///////////////////////////////////////////////////////////////////////////////////////////////////
407

    
408
  public float getStickerStroke()
409
    {
410
    return isInIconMode() ? 0.16f : 0.12f;
411
    }
412

    
413
///////////////////////////////////////////////////////////////////////////////////////////////////
414

    
415
  public float[][] getStickerAngles()
416
    {
417
    float D = (float)(Math.PI/4);
418
    return new float[][] { { 0,0,-D },{ D,D } };
419
    }
420

    
421
///////////////////////////////////////////////////////////////////////////////////////////////////
422
// PUBLIC API
423

    
424
  public Static3D[] getRotationAxis()
425
    {
426
    return ROT_AXIS;
427
    }
428

    
429
///////////////////////////////////////////////////////////////////////////////////////////////////
430

    
431
  public int[][] getBasicAngles()
432
    {
433
    if( mBasicAngle ==null )
434
      {
435
      int num = getNumLayers()[0];
436
      int[] tmp = new int[num];
437
      for(int i=0; i<num; i++) tmp[i] = 3;
438
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
439
      }
440

    
441
    return mBasicAngle;
442
    }
443

    
444
///////////////////////////////////////////////////////////////////////////////////////////////////
445

    
446
  public String getShortName()
447
    {
448
    return ObjectType.IVY_2.name();
449
    }
450

    
451
///////////////////////////////////////////////////////////////////////////////////////////////////
452

    
453
  public ObjectSignature getSignature()
454
    {
455
    return new ObjectSignature(ObjectType.IVY_2);
456
    }
457

    
458
///////////////////////////////////////////////////////////////////////////////////////////////////
459

    
460
  public String getObjectName()
461
    {
462
    return "Ivy Cube";
463
    }
464

    
465
///////////////////////////////////////////////////////////////////////////////////////////////////
466

    
467
  public String getInventor()
468
    {
469
    return "Eitan Cher";
470
    }
471

    
472
///////////////////////////////////////////////////////////////////////////////////////////////////
473

    
474
  public int getYearOfInvention()
475
    {
476
    return 2009;
477
    }
478

    
479
///////////////////////////////////////////////////////////////////////////////////////////////////
480

    
481
  public int getComplexity()
482
    {
483
    return 0;
484
    }
485

    
486
///////////////////////////////////////////////////////////////////////////////////////////////////
487

    
488
  public String[][] getTutorials()
489
    {
490
    return new String[][]{
491
                          {"gb","QMzeJobSu1M","How to Solve the Ivy Cube","Z3"},
492
                          {"es","2-Gf2cmEJDs","Resolver Ivy Cube","Cuby"},
493
                          {"ru","pbkfOCnnfsA","Как собрать Иви куб","Алексей Ярыгин"},
494
                          {"fr","mn7YTnYu3Uc","Comment résoudre le Ivy Cube","ValentinoCube"},
495
                          {"de","vaW5fSUG_O8","Ivy Cube","ThomasStadler"},
496
                          {"pl","8s_0VxNvFA8","Jak ułożyć Ivy Cube","DubiCube"},
497
                          {"kr","TmSPgjtSFac","15분만에 아이비큐브 완전정복하기!","초등취미생활"},
498
                          {"vn","Ktx9KQr_8qo","Tutorial N.29 - Ivy Cube","Duy Thích Rubik"},
499
                         };
500
    }
501
}
(18-18/40)