Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyJing.java @ beee90ab

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 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.TC_TETRAHEDRON;
23
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
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.touchcontrol.TouchControlTetrahedron;
32
import org.distorted.objectlib.main.ObjectType;
33
import org.distorted.objectlib.helpers.ObjectShape;
34
import org.distorted.objectlib.scrambling.ScrambleState;
35
import org.distorted.objectlib.main.ShapeTetrahedron;
36

    
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38

    
39
public class TwistyJing extends ShapeTetrahedron
40
{
41
  static final Static3D[] ROT_AXIS = new Static3D[]
42
         {
43
           new Static3D(     0,-SQ3/3,-SQ6/3),
44
           new Static3D(     0,-SQ3/3,+SQ6/3),
45
           new Static3D(+SQ6/3,+SQ3/3,     0),
46
           new Static3D(-SQ6/3,+SQ3/3,     0),
47
         };
48

    
49
  static final float F = 0.48f;  // length of the edge of the corner cubit. Keep<0.5
50
                                 // Assuming the length of the edge of the whole
51
                                 // tetrahedron is 2.0 (ie standard, equal to numLayers)
52

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

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

    
61
  public TwistyJing(int[] numL, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
62
    {
63
    super(numL, meshState, iconMode, numL[0], quat, move, scale, stream);
64
    }
65

    
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67

    
68
  public ScrambleState[] getScrambleStates()
69
    {
70
    if( mStates==null )
71
      {
72
      int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
73

    
74
      mStates = new ScrambleState[]
75
        {
76
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
77
        };
78
      }
79

    
80
    return mStates;
81
    }
82

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

    
85
  public float[][] getCuts(int[] numLayers)
86
    {
87
    if( mCuts==null )
88
      {
89
      float[] cut = { (F-0.5f)*(SQ6/3) };
90
      mCuts = new float[][] { cut,cut,cut,cut };
91
      }
92

    
93
    return mCuts;
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  public boolean[][] getLayerRotatable(int[] numLayers)
99
    {
100
    boolean[] tmp = {true,true};
101
    return new boolean[][] { tmp,tmp,tmp,tmp };
102
    }
103

    
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105

    
106
  public int getTouchControlType()
107
    {
108
    return TC_TETRAHEDRON;
109
    }
110

    
111
///////////////////////////////////////////////////////////////////////////////////////////////////
112

    
113
  public int getTouchControlSplit()
114
    {
115
    return TYPE_NOT_SPLIT;
116
    }
117

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

    
120
  public int[][][] getEnabled()
121
    {
122
    return new int[][][] { {{1,2,3}},{{0,2,3}},{{0,1,3}},{{0,1,2}} };
123
    }
124

    
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126

    
127
  public float[] getDist3D(int[] numLayers)
128
    {
129
    return TouchControlTetrahedron.D3D;
130
    }
131

    
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133

    
134
  public Static3D[] getFaceAxis()
135
    {
136
    return TouchControlTetrahedron.FACE_AXIS;
137
    }
138

    
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140

    
141
  public float[][] getCubitPositions(int[] numLayers)
142
    {
143
    if( mCenters==null )
144
      {
145
      mCenters = new float[][]
146
         {
147
           { 0.000f, -SQ2/2, 1.000f },
148
           { 0.000f, -SQ2/2,-1.000f },
149
           {-1.000f,  SQ2/2, 0.000f },
150
           { 1.000f,  SQ2/2, 0.000f },
151

    
152
           { 0.000f, -SQ2/2, 0.000f },
153
           {-0.500f, 0.000f, 0.500f },
154
           { 0.500f, 0.000f, 0.500f },
155
           {-0.500f, 0.000f,-0.500f },
156
           { 0.500f, 0.000f,-0.500f },
157
           { 0.000f,  SQ2/2, 0.000f },
158

    
159
           { 0.000f,  SQ2/6, 1.0f/3 },
160
           { 0.000f,  SQ2/6,-1.0f/3 },
161
           {-1.0f/3, -SQ2/6, 0.000f },
162
           { 1.0f/3, -SQ2/6, 0.000f },
163
         };
164
      }
165

    
166
    return mCenters;
167
    }
168

    
169
///////////////////////////////////////////////////////////////////////////////////////////////////
170

    
171
  public Static4D getCubitQuats(int cubit, int[] numLayers)
172
    {
173
    if( mQuatIndex==null ) mQuatIndex = new int[] {0,10,5,8,
174
                                                   0,5,8,6,7,9,
175
                                                   0,10,7,3};
176
    return mObjectQuats[mQuatIndex[cubit]];
177
    }
178

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

    
181
  public ObjectShape getObjectShape(int variant)
182
    {
183
    final float X = F/2;
184
    final float Y = F*SQ2/2;
185
    final float Z =-F/2;
186
    final float L = (2.0f-3*F);
187
    final float X2= L/2;
188
    final float Y2= L*SQ2/2;
189
    final float Z2=-L/2;
190
    final float D = F/L;
191
    final float G = 1.0f-F;
192

    
193
    if( variant==0 )
194
      {
195
      float[][] vertices =
196
          {
197
             {   0,   0,   0 },
198
             {   X,   Y,   Z },
199
             {   0, 2*Y, 2*Z },
200
             {  -X,   Y,   Z },
201
             {   0,   0,    -F },
202
             {   X,   Y,   Z-F },
203
             {   0, 2*Y, 2*Z-F },
204
             {  -X,   Y,   Z-F },
205
          };
206
      int[][] indices =
207
          {
208
             {0,1,2,3},
209
             {1,0,4,5},
210
             {7,4,0,3},
211
             {1,5,6,2},
212
             {7,3,2,6},
213
             {4,7,6,5}
214
          };
215

    
216
      return new ObjectShape(vertices, indices);
217
      }
218
    else if( variant==1 )
219
      {
220
      float[][] vertices =
221
          {
222
             {   0,   0,     G },
223
             {   X,   Y,   Z+G },
224
             {   0, 2*Y, 2*Z+G },
225
             {  -X,   Y,   Z+G },
226
             {   0,   0,    -G },
227
             {   X,   Y,  -Z-G },
228
             {   0, 2*Y,-2*Z-G },
229
             {  -X,   Y,  -Z-G },
230
          };
231
      int[][] indices =
232
          {
233
             {0,4,5,1},
234
             {3,7,4,0},
235
             {0,1,2,3},
236
             {4,7,6,5},
237
             {1,5,6,2},
238
             {2,6,7,3}
239
          };
240

    
241
      return new ObjectShape(vertices, indices);
242
      }
243
    else
244
      {
245
      float[][] vertices =
246
          {
247
             {        0,   -2*Y2/3,       -2*Z2/3 },
248
             {       X2,      Y2/3,          Z2/3 },
249
             {      -X2,      Y2/3,          Z2/3 },
250
             {        0,   -2*Y2/3,-2*Z2/3+2*D*Z2 },
251
             {  X2-D*X2, Y2/3-D*Y2,     Z2/3+D*Z2 },
252
             { -X2+D*X2, Y2/3-D*Y2,     Z2/3+D*Z2 },
253
          };
254
      int[][] indices =
255
          {
256
             {0,1,2},
257
             {3,5,4},
258
             {0,3,4,1},
259
             {5,3,0,2},
260
             {4,5,2,1}
261
          };
262

    
263
      return new ObjectShape(vertices, indices);
264
      }
265
    }
266

    
267
///////////////////////////////////////////////////////////////////////////////////////////////////
268

    
269
  public ObjectFaceShape getObjectFaceShape(int variant)
270
    {
271
    final float Y = F*SQ2/2;
272
    final float Z =-F/2;
273
    final float L = (2.0f-3*F);
274

    
275
    if( variant==0 )
276
      {
277
      float height = isInIconMode() ? 0.001f : 0.015f;
278
      float[][] bands     = { {height,35,0.25f*F,0.5f*F,5,1,1},{0.001f,35,0.25f*F,0.5f*F,5,1,1} };
279
      int[] bandIndices   = { 0,0,0,1,1,1 };
280
      float[][] corners   = { {0.08f,0.20f*F},{0.07f,0.20f*F} };
281
      int[] cornerIndices = { 0,1,1,-1,1,-1,-1,-1 };
282
      float[][] centers   = { { 0.0f, Y, Z-F/2} };
283
      int[] centerIndices = { 0,0,0,-1,0,-1,-1,-1 };
284
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
285
      }
286
    else if( variant==1 )
287
      {
288
      float height = isInIconMode() ? 0.001f : 0.015f;
289
      float[][] bands     = { {height,35,0.5f*F,F,5,1,1},{0.001f,35,0.5f*F,F,5,1,1} };
290
      int[] bandIndices   = { 0,0,1,1,1,1 };
291
      float[][] corners   = { {0.07f,0.20f*F} };
292
      int[] cornerIndices = { 0,0,-1,0,0,0,-1,0 };
293
      float[][] centers   = { { 0, F*SQ2/2, 0 } };
294
      int[] centerIndices = { 0,0,-1,0,0,0,-1,0 };
295
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
296
      }
297
    else
298
      {
299
      float height = isInIconMode() ? 0.001f : 0.020f;
300
      float[][] bands     = { {height,35,0.20f*L,0.6f*L,5,1,1}, {0.001f,35,0.05f*L,0.1f*L,5,1,1} };
301
      int[] bandIndices   = { 0,1,1,1,1,1 };
302
      float[][] corners   = { {0.04f,0.6f*F} };
303
      int[] cornerIndices = { 0,0,0,-1,-1,-1 };
304
      float[][] centers   = { { 0, -2*Y/3, 4*Z/3 } };
305
      int[] centerIndices = { 0,0,0,-1,-1,-1 };
306
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
307
      }
308
    }
309

    
310
///////////////////////////////////////////////////////////////////////////////////////////////////
311

    
312
  public int getNumCubitVariants(int[] numLayers)
313
    {
314
    return 3;
315
    }
316

    
317
///////////////////////////////////////////////////////////////////////////////////////////////////
318

    
319
  public int getCubitVariant(int cubit, int[] numLayers)
320
    {
321
    return cubit<4 ? 0 : (cubit<10?1:2);
322
    }
323

    
324
///////////////////////////////////////////////////////////////////////////////////////////////////
325

    
326
  public float getStickerRadius()
327
    {
328
    return 0.04f;
329
    }
330

    
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

    
333
  public float getStickerStroke()
334
    {
335
    return isInIconMode() ? 0.08f : 0.04f;
336
    }
337

    
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339

    
340
  public float[][] getStickerAngles()
341
    {
342
    return null;
343
    }
344

    
345
///////////////////////////////////////////////////////////////////////////////////////////////////
346
// PUBLIC API
347

    
348
  public Static3D[] getRotationAxis()
349
    {
350
    return ROT_AXIS;
351
    }
352

    
353
///////////////////////////////////////////////////////////////////////////////////////////////////
354

    
355
  public int[][] getBasicAngles()
356
    {
357
    if( mBasicAngle ==null )
358
      {
359
      int num = getNumLayers()[0];
360
      int[] tmp = new int[num];
361
      for(int i=0; i<num; i++) tmp[i] = 3;
362
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
363
      }
364

    
365
    return mBasicAngle;
366
    }
367

    
368
///////////////////////////////////////////////////////////////////////////////////////////////////
369

    
370
  public String getShortName()
371
    {
372
    return ObjectType.JING_2.name();
373
    }
374

    
375
///////////////////////////////////////////////////////////////////////////////////////////////////
376

    
377
  public long getSignature()
378
    {
379
    return ObjectType.JING_2.ordinal();
380
    }
381

    
382
///////////////////////////////////////////////////////////////////////////////////////////////////
383

    
384
  public String getObjectName()
385
    {
386
    return "Jing Pyraminx";
387
    }
388

    
389
///////////////////////////////////////////////////////////////////////////////////////////////////
390

    
391
  public String getInventor()
392
    {
393
    return "Tony Fisher";
394
    }
395

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

    
398
  public int getYearOfInvention()
399
    {
400
    return 1991;
401
    }
402

    
403
///////////////////////////////////////////////////////////////////////////////////////////////////
404

    
405
  public int getComplexity()
406
    {
407
    return 1;
408
    }
409

    
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411

    
412
  public String[][] getTutorials()
413
    {
414
    return new String[][]{
415
                          {"gb","0T8Iw6aI2gA","Jing's Pyraminx Tutorial","SuperAntoniovivaldi"},
416
                          {"es","Na27_GUIzqY","Resolver Jing Pyraminx","Cuby"},
417
                          {"ru","rlQXFzjsyAo","Как собрать Jing's pyraminx","Илья Топор-Гилка"},
418
                          {"fr","zC9dGqZRSic","Résolution du Jing's Pyraminx","Asthalis"},
419
                          {"de","6ihN4fdHH6o","Jings Pyraminx - Tutorial","GerCubing"},
420
                          {"pl","nRYoJAy1c_8","Jing's Pyraminx TUTORIAL PL","MrUK"},
421
                          {"vn","yX9KjDpHjws","Tutorial N.50 - Jing's Pyraminx","Duy Thích Rubik"},
422
                         };
423
    }
424
}
(18-18/36)