Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyRex.java @ bfdb9aa5

1 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 6133be67 Leszek Koltunski
// 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 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objectlib.objects;
11
12 c9c71c3f Leszek Koltunski
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_HEXAHEDRON;
13
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_SPLIT_CORNER;
14 29b82486 Leszek Koltunski
15 82eb152a Leszek Koltunski
import java.io.InputStream;
16 29b82486 Leszek Koltunski
17
import org.distorted.library.type.Static3D;
18
import org.distorted.library.type.Static4D;
19
20 3ee1d662 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectFaceShape;
21 1d581993 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectSignature;
22 a8295031 Leszek Koltunski
import org.distorted.objectlib.main.InitData;
23 c9c71c3f Leszek Koltunski
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
24 8005e762 Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
25 198c5bf0 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectShape;
26 10b7e306 Leszek Koltunski
import org.distorted.objectlib.scrambling.ScrambleState;
27 b31249d6 Leszek Koltunski
import org.distorted.objectlib.shape.ShapeHexahedron;
28 29b82486 Leszek Koltunski
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30
31 386af988 Leszek Koltunski
public class TwistyRex extends ShapeHexahedron
32 29b82486 Leszek Koltunski
{
33
  static final Static3D[] ROT_AXIS = new Static3D[]
34
         {
35
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
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
         };
40
41
  public static final float REX_D = 0.2f;
42
43
  private ScrambleState[] mStates;
44 beee90ab Leszek Koltunski
  private int[][] mBasicAngle;
45 29b82486 Leszek Koltunski
  private float[][] mCuts;
46 52f4db8a Leszek Koltunski
  private float[][] mPosition;
47
  private int[] mQuatIndex;
48 29b82486 Leszek Koltunski
49
///////////////////////////////////////////////////////////////////////////////////////////////////
50
51 a8295031 Leszek Koltunski
  public TwistyRex(InitData data, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
52 29b82486 Leszek Koltunski
    {
53 a8295031 Leszek Koltunski
    super(data, meshState, iconMode, data.getNumLayers()[0], quat, move, scale, stream);
54 29b82486 Leszek Koltunski
    }
55
56 ed0988c0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
57
58
  @Override
59
  public void adjustStickerCoords()
60
    {
61
    mStickerCoords = new float[][]
62
          {
63 cc70f525 Leszek Koltunski
             { 0.35f, -0.35f, -0.1428f, 0.5f, -0.5f, 0.1428f },
64 ed0988c0 Leszek Koltunski
             { -0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f },
65 cc70f525 Leszek Koltunski
             { 0.00f, -0.200f, 0.525f, 0.105f, -0.525f, 0.105f }
66 ed0988c0 Leszek Koltunski
          };
67
    }
68
69 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
70
71 f9a81f52 Leszek Koltunski
  public ScrambleState[] getScrambleStates()
72 29b82486 Leszek Koltunski
    {
73
    if( mStates==null )
74
      {
75
      int[] tmp = {0,-1,0, 0,1,0, 2,-1,0, 2,1,0 };
76
77
      mStates = new ScrambleState[]
78
        {
79
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
80
        };
81
      }
82
83
    return mStates;
84
    }
85
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87
88 7bbfc84f Leszek Koltunski
  public float[][] getCuts(int[] numLayers)
89 29b82486 Leszek Koltunski
    {
90
    if( mCuts==null )
91
      {
92
      float C = SQ3*0.45f; // bit less than 1/2 of the length of the main diagonal
93
      float[] cut = new float[] {-C,+C};
94
      mCuts = new float[][] { cut,cut,cut,cut };
95
      }
96
97
    return mCuts;
98
    }
99
100
///////////////////////////////////////////////////////////////////////////////////////////////////
101
102 59c20632 Leszek Koltunski
  public boolean[][] getLayerRotatable(int[] numLayers)
103
    {
104
    boolean[] tmp = new boolean[] {true,false,true};
105 802fe251 Leszek Koltunski
    return new boolean[][] { tmp,tmp,tmp,tmp };
106 59c20632 Leszek Koltunski
    }
107
108
///////////////////////////////////////////////////////////////////////////////////////////////////
109
110 11fa413d Leszek Koltunski
  public int getTouchControlType()
111 59c20632 Leszek Koltunski
    {
112 c9c71c3f Leszek Koltunski
    return TC_HEXAHEDRON;
113 59c20632 Leszek Koltunski
    }
114
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116
117 11fa413d Leszek Koltunski
  public int getTouchControlSplit()
118 59c20632 Leszek Koltunski
    {
119
    return TYPE_SPLIT_CORNER;
120
    }
121
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123
124
  public int[][][] getEnabled()
125 29b82486 Leszek Koltunski
    {
126 59c20632 Leszek Koltunski
    return new int[][][]
127 29b82486 Leszek Koltunski
      {
128 59c20632 Leszek Koltunski
          {{0,1},{3,1},{2,3},{0,2}},
129
          {{2,3},{3,1},{0,1},{0,2}},
130
          {{1,2},{0,1},{0,3},{2,3}},
131
          {{1,2},{2,3},{0,3},{0,1}},
132
          {{0,3},{0,2},{1,2},{1,3}},
133
          {{1,2},{0,2},{0,3},{1,3}},
134
      };
135
    }
136
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138
139
  public float[] getDist3D(int[] numLayers)
140
    {
141 4c9ca251 Leszek Koltunski
    return TouchControlHexahedron.D3D;
142
    }
143
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145
146
  public Static3D[] getFaceAxis()
147
    {
148
    return TouchControlHexahedron.FACE_AXIS;
149 29b82486 Leszek Koltunski
    }
150
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152
153 7b832206 Leszek Koltunski
  public float[][] getCubitPositions(int[] numLayers)
154 29b82486 Leszek Koltunski
    {
155 52f4db8a Leszek Koltunski
    if( mPosition==null )
156 802fe251 Leszek Koltunski
      {
157 52f4db8a Leszek Koltunski
      final float DIST1= 1.50f;
158
      final float DIST2= (1+2*REX_D)/2;
159
      final float DIST3= 1.53f;
160
161
      mPosition = new float[][]
162
        {
163
          { +DIST2, -DIST2, +DIST3 },
164
          { -DIST2, +DIST2, +DIST3 },
165
          { +DIST2, +DIST2, -DIST3 },
166
          { -DIST2, -DIST2, -DIST3 },
167
          { +DIST2, +DIST3, -DIST2 },
168
          { -DIST2, +DIST3, +DIST2 },
169
          { +DIST2, -DIST3, +DIST2 },
170
          { -DIST2, -DIST3, -DIST2 },
171
          { +DIST3, +DIST2, -DIST2 },
172
          { +DIST3, -DIST2, +DIST2 },
173
          { -DIST3, +DIST2, +DIST2 },
174
          { -DIST3, -DIST2, -DIST2 },
175
176
          { +DIST2, +DIST2, +DIST3 },
177
          { -DIST2, -DIST2, +DIST3 },
178
          { +DIST2, -DIST2, -DIST3 },
179
          { -DIST2, +DIST2, -DIST3 },
180
          { -DIST2, +DIST3, -DIST2 },
181
          { +DIST2, +DIST3, +DIST2 },
182
          { -DIST2, -DIST3, +DIST2 },
183
          { +DIST2, -DIST3, -DIST2 },
184
          { +DIST3, +DIST2, +DIST2 },
185
          { +DIST3, -DIST2, -DIST2 },
186
          { -DIST3, +DIST2, -DIST2 },
187
          { -DIST3, -DIST2, +DIST2 },
188
189
          { +0.00f, +0.00f, +DIST3 },
190
          { +0.00f, +0.00f, -DIST3 },
191
          { +0.00f, +DIST3, +0.00f },
192
          { +0.00f, -DIST3, +0.00f },
193
          { +DIST3, +0.00f, +0.00f },
194
          { -DIST3, +0.00f, +0.00f },
195
196
          { +0.00f, +DIST1, +DIST1 },
197
          { +DIST1, +0.00f, +DIST1 },
198
          { +0.00f, -DIST1, +DIST1 },
199
          { -DIST1, +0.00f, +DIST1 },
200
          { +DIST1, +DIST1, +0.00f },
201
          { +DIST1, -DIST1, +0.00f },
202
          { -DIST1, -DIST1, +0.00f },
203
          { -DIST1, +DIST1, +0.00f },
204
          { +0.00f, +DIST1, -DIST1 },
205
          { +DIST1, +0.00f, -DIST1 },
206
          { +0.00f, -DIST1, -DIST1 },
207
          { -DIST1, +0.00f, -DIST1 },
208
        };
209
      }
210
211
    return mPosition;
212 29b82486 Leszek Koltunski
    }
213
214 d0e6cf7f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
215
216
  public Static4D getCubitQuats(int cubit, int[] numLayers)
217
    {
218 52f4db8a Leszek Koltunski
    if( mQuatIndex==null )
219 d0e6cf7f Leszek Koltunski
      {
220 52f4db8a Leszek Koltunski
      mQuatIndex = new int[] {
221
                              0,10, 9,11, 7, 1, 6, 4, 2, 5, 3, 8,
222
                              0,10, 9,11, 7, 1, 6, 4, 2, 5, 3, 8,
223
                              0, 9, 1, 4, 2, 3,
224
                              0, 2,10, 8, 1, 4, 6, 7,11, 5, 9, 3
225
                             };
226 d0e6cf7f Leszek Koltunski
      }
227 52f4db8a Leszek Koltunski
    return mObjectQuats[mQuatIndex[cubit]];
228 d0e6cf7f Leszek Koltunski
    }
229
230 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
231
232 e30c522a Leszek Koltunski
  public ObjectShape getObjectShape(int variant)
233 29b82486 Leszek Koltunski
    {
234
    if( variant==0 )
235
      {
236 52f4db8a Leszek Koltunski
      float[][] vertices= { {-0.10f,+0.70f,0},{-0.70f,+0.10f,0},{+0.65f,-0.71f,0},{+0.71f,-0.65f,0},{0,0.05f,-0.2f} };
237 4e9f2df5 Leszek Koltunski
      int[][] indices   = { {0,1,2,3},{0,3,4},{3,2,4},{2,1,4},{1,0,4} };
238 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
239 29b82486 Leszek Koltunski
      }
240
    else if( variant==1 )
241 52f4db8a Leszek Koltunski
      {
242
      float[][] vertices= { {-0.10f,-0.70f,0},{-0.70f,-0.10f,0},{+0.65f,+0.71f,0},{+0.71f,+0.65f,0},{0,-0.05f,-0.2f} };
243
      int[][] indices   = { {3,2,1,0},{4,3,0},{4,2,3},{4,1,2},{4,0,1} };
244
      return new ObjectShape(vertices, indices);
245
      }
246
    else if( variant==2 )
247 29b82486 Leszek Koltunski
      {
248
      float G = 3*REX_D;
249 c94320d8 Leszek Koltunski
      float[][] vertices= { { -G, 0, 0 },{ 0,-G, 0 },{ +G, 0, 0 },{ 0,+G,0 },{ 0, 0,-G} };
250 4e9f2df5 Leszek Koltunski
      int[][] indices   = { {0,1,2,3},{0,3,4},{3,2,4},{2,1,4},{1,0,4} };
251 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
252 29b82486 Leszek Koltunski
      }
253
    else
254
      {
255
      float E = 1.5f - 3*REX_D;
256
      float F = 1.5f;
257 4e9f2df5 Leszek Koltunski
      float[][] vertices= { { -F, 0, 0 },{  0,-E, 0 },{ +F, 0, 0 },{  0, 0,-E } };
258
      int[][] indices   = { {0,1,2}, {0,2,3}, {0,3,1}, {1,3,2} };
259 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
260 3ee1d662 Leszek Koltunski
      }
261
    }
262
263
///////////////////////////////////////////////////////////////////////////////////////////////////
264
265
  public ObjectFaceShape getObjectFaceShape(int variant)
266
    {
267 52f4db8a Leszek Koltunski
    if( variant==0 || variant==1 )
268 3ee1d662 Leszek Koltunski
      {
269 3bf19410 Leszek Koltunski
      float height = isInIconMode() ? 0.001f : 0.02f;
270 3ee1d662 Leszek Koltunski
      float G = (1-REX_D)*SQ2/2;
271
      float[][] centers= { {0.0f,0.0f,-G} };
272
      float[][] corners= { {0.03f,0.30f} };
273
      int[] indices    = {-1,-1,0,0,-1};
274
      int[] bandIndices= { 0,1,1,1,1 };
275 3bf19410 Leszek Koltunski
      float[][] bands  = { { height,10,G/3,0.5f,5,1,1},{ 0.001f,45,0.1f,0.1f,2,0,0} };
276 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,corners,indices,centers,indices,null);
277
      }
278 52f4db8a Leszek Koltunski
    else if( variant==2 )
279 3ee1d662 Leszek Koltunski
      {
280 3bf19410 Leszek Koltunski
      float height = isInIconMode() ? 0.001f : 0.025f;
281 3ee1d662 Leszek Koltunski
      float G = 3*REX_D;
282
      int[] indices    = {-1,-1,-1,-1,-1};
283
      int[] bandIndices= { 0,1,1,1,1 };
284 3bf19410 Leszek Koltunski
      float[][] bands  = { {height,10,G/2,0.5f,5,0,0},{0.001f,45,G/2,0.0f,2,0,0} };
285 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,null,indices,null,indices,null);
286
      }
287
    else
288
      {
289 3bf19410 Leszek Koltunski
      float h1 = isInIconMode() ? 0.001f : 0.03f;
290
      float h2 = isInIconMode() ? 0.001f : 0.01f;
291 3ee1d662 Leszek Koltunski
      float E = 1.5f - 3*REX_D;
292
      float F = 1.5f;
293
      float G = (float)Math.sqrt(E*E+F*F);
294
      float[][] centers= { {0.0f,-1.5f,-1.5f} };
295
      float[][] corners= { {0.06f,0.20f} };
296
      int[] indices    = { 0,-1,0,-1 };
297
      int[] bandIndices= { 0,0,1,1 };
298 3bf19410 Leszek Koltunski
      float[][] bands  = { {h1,12,F/3,0.8f,5,2,3},{h2,45,G/3,0.2f,5,2,3} };
299 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,corners,indices,centers,indices,null);
300 29b82486 Leszek Koltunski
      }
301
    }
302
303
///////////////////////////////////////////////////////////////////////////////////////////////////
304
305 e30c522a Leszek Koltunski
  public int getNumCubitVariants(int[] numLayers)
306 29b82486 Leszek Koltunski
    {
307 52f4db8a Leszek Koltunski
    return 4;
308 29b82486 Leszek Koltunski
    }
309
310
///////////////////////////////////////////////////////////////////////////////////////////////////
311
312 e30c522a Leszek Koltunski
  public int getCubitVariant(int cubit, int[] numLayers)
313 29b82486 Leszek Koltunski
    {
314 52f4db8a Leszek Koltunski
    return cubit<12 ? 0 : (cubit<24 ? 1 : (cubit<30?2:3));
315 29b82486 Leszek Koltunski
    }
316
317 00f4980d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
318 29b82486 Leszek Koltunski
319 d53fb890 Leszek Koltunski
  public float getStickerRadius()
320 00f4980d Leszek Koltunski
    {
321
    return 0.09f;
322
    }
323
324
///////////////////////////////////////////////////////////////////////////////////////////////////
325
326 d53fb890 Leszek Koltunski
  public float getStickerStroke()
327 00f4980d Leszek Koltunski
    {
328 3bf19410 Leszek Koltunski
    return isInIconMode() ? 0.25f : 0.12f;
329 00f4980d Leszek Koltunski
    }
330
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332 8592461c Leszek Koltunski
333 d53fb890 Leszek Koltunski
  public float[][] getStickerAngles()
334 00f4980d Leszek Koltunski
    {
335
    final float F = (float)(Math.PI/20);
336 cc70f525 Leszek Koltunski
    return new float[][] { { F,-F/2,F },{0,0,0,0},{ -F,0,-F } };
337 00f4980d Leszek Koltunski
    }
338
339 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
340
// PUBLIC API
341
342
  public Static3D[] getRotationAxis()
343
    {
344
    return ROT_AXIS;
345
    }
346
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348
349 beee90ab Leszek Koltunski
  public int[][] getBasicAngles()
350 29b82486 Leszek Koltunski
    {
351 beee90ab Leszek Koltunski
    if( mBasicAngle==null )
352
      {
353
      int num = getNumLayers()[0];
354
      int[] tmp = new int[num];
355
      for(int i=0; i<num; i++) tmp[i] = 3;
356
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
357
      }
358
359 29b82486 Leszek Koltunski
    return mBasicAngle;
360
    }
361
362 61aa85e4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
363
364 5f54927b Leszek Koltunski
  public String getShortName()
365 61aa85e4 Leszek Koltunski
    {
366 5f54927b Leszek Koltunski
    return ObjectType.REX_3.name();
367
    }
368
369
///////////////////////////////////////////////////////////////////////////////////////////////////
370
371 1d581993 Leszek Koltunski
  public ObjectSignature getSignature()
372 5f54927b Leszek Koltunski
    {
373 1d581993 Leszek Koltunski
    return new ObjectSignature(ObjectType.REX_3);
374 61aa85e4 Leszek Koltunski
    }
375
376 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
377
378 e26eb4e7 Leszek Koltunski
  public String getObjectName()
379 29b82486 Leszek Koltunski
    {
380 e26eb4e7 Leszek Koltunski
    return "Rex Cube";
381 29b82486 Leszek Koltunski
    }
382
383
///////////////////////////////////////////////////////////////////////////////////////////////////
384
385 e26eb4e7 Leszek Koltunski
  public String getInventor()
386 29b82486 Leszek Koltunski
    {
387 e26eb4e7 Leszek Koltunski
    return "Andrew Cormier";
388 29b82486 Leszek Koltunski
    }
389
390 59c20632 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
391
392 e26eb4e7 Leszek Koltunski
  public int getYearOfInvention()
393 59c20632 Leszek Koltunski
    {
394
    return 2009;
395
    }
396
397 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
398
399 e26eb4e7 Leszek Koltunski
  public int getComplexity()
400 29b82486 Leszek Koltunski
    {
401
    return 3;
402
    }
403 052e0362 Leszek Koltunski
404
///////////////////////////////////////////////////////////////////////////////////////////////////
405
406
  public String[][] getTutorials()
407
    {
408
    return new String[][]{
409
                          {"gb","noAQfWqlMbk","Rex Cube Tutorial","CrazyBadCuber"},
410
                          {"es","Q90x9rjLJzw","Resolver Cubo Rex","Cuby"},
411
                          {"ru","Dr9CLM6A3fU","Как собрать Рекс Куб","Алексей Ярыгин"},
412
                          {"fr","SvK1kf6c43c","Résolution du Rex Cube","Asthalis"},
413
                          {"de","AI4vtwpRkEQ","Rex Cube - Tutorial","GerCubing"},
414
                          {"pl","ffbFRnHglWY","Rex Cube TUTORIAL PL","MrUk"},
415
                          {"kr","B3ftZzHRQyU","렉스 큐브 해법","듀나메스 큐브 해법연구소"},
416 a399e91b Leszek Koltunski
                          {"vn","5nE9Q7QmOP4","Tutorial N.87 - Rex Cube","Duy Thích Rubik"},
417 052e0362 Leszek Koltunski
                         };
418
    }
419 29b82486 Leszek Koltunski
}