Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyHelicopter.java @ 743cdab7

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_EDGE;
14 29b82486 Leszek Koltunski
15
import org.distorted.library.type.Static3D;
16
import org.distorted.library.type.Static4D;
17
18 84a17011 Leszek Koltunski
import org.distorted.objectlib.helpers.FactoryCubit;
19 3ee1d662 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectFaceShape;
20 ae9d9227 leszek
import org.distorted.objectlib.metadata.Metadata;
21 97a75106 leszek
import org.distorted.objectlib.signature.ObjectSignature;
22 84a17011 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectVertexEffects;
23 cf93ea4e Leszek Koltunski
import org.distorted.objectlib.main.InitAssets;
24 97a75106 leszek
import org.distorted.objectlib.signature.ObjectConstants;
25 c9c71c3f Leszek Koltunski
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
26 361fd0de leszek
import org.distorted.objectlib.metadata.ListObjects;
27 198c5bf0 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectShape;
28 b31249d6 Leszek Koltunski
import org.distorted.objectlib.shape.ShapeHexahedron;
29 29b82486 Leszek Koltunski
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31
32 386af988 Leszek Koltunski
public class TwistyHelicopter extends ShapeHexahedron
33 29b82486 Leszek Koltunski
{
34
  static final Static3D[] ROT_AXIS = new Static3D[]
35
         {
36 84a17011 Leszek Koltunski
           new Static3D(     0,  SQ2/2, -SQ2/2),
37 29b82486 Leszek Koltunski
           new Static3D(     0, -SQ2/2, -SQ2/2),
38 84a17011 Leszek Koltunski
           new Static3D( SQ2/2,      0, -SQ2/2),
39 29b82486 Leszek Koltunski
           new Static3D(-SQ2/2,      0, -SQ2/2),
40 84a17011 Leszek Koltunski
           new Static3D( SQ2/2, -SQ2/2,      0),
41 29b82486 Leszek Koltunski
           new Static3D(-SQ2/2, -SQ2/2,      0)
42
         };
43
44 9ba7f3f6 Leszek Koltunski
  private int[][] mEdges;
45 beee90ab Leszek Koltunski
  private int[][] mBasicAngle;
46 29b82486 Leszek Koltunski
  private float[][] mCuts;
47
  private float[][] mCenters;
48
  private int[] mQuatIndices;
49
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51
52 ae9d9227 leszek
  public TwistyHelicopter(int iconMode, Static4D quat, Static3D move, float scale, Metadata meta, InitAssets asset)
53 29b82486 Leszek Koltunski
    {
54 ae9d9227 leszek
    super(iconMode, meta.getNumLayers()[0], quat, move, scale, meta, asset);
55 29b82486 Leszek Koltunski
    }
56
57 a70b1e96 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
58
59
  @Override
60
  public float[][] returnRotationFactor()
61
    {
62
    float C = 2.2f;
63
    float[] f = new float[] { C,C,C };
64
    return new float[][] { f,f,f,f,f,f };
65
    }
66
67 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
68
69 9ba7f3f6 Leszek Koltunski
  public int[][] getScrambleEdges()
70 29b82486 Leszek Koltunski
    {
71 9ba7f3f6 Leszek Koltunski
    if( mEdges==null )
72 29b82486 Leszek Koltunski
      {
73 9ba7f3f6 Leszek Koltunski
      mEdges = new int[][]
74 29b82486 Leszek Koltunski
        {
75 9ba7f3f6 Leszek Koltunski
            {0,1, 2,2, 3,3, 5,4, 6,5, 8,6, 9,7, 11,8, 12,9, 14,10, 15,11, 17,12},  // 0
76
            {                    6,5,      9,7,             14,10,        17,12},  // 1
77
            {                         8,6,      11,8, 12,9,        15,11       },  // 2
78
            {                    6,5,      9,7,       12,9,        15,11       },  // 3
79
            {                         8,6,      11,8,       14,10,        17,12},  // 4
80
            {0,1,      3,3,                           12,9,               17,12},  // 5
81
            {     2,2,      5,4,                            14,10, 15,11       },  // 6
82
            {0,1,      3,3,                                 14,10, 15,11       },  // 7
83
            {     2,2,      5,4,                      12,9,               17,12},  // 8
84
            {     2,2, 3,3,      6,5,           11,8                           },  // 9
85
            {0,1,           5,4,      8,6, 9,7,                                },  // 10
86
            {     2,2, 3,3,           8,6, 9,7                                 },  // 11
87
            {0,1,           5,4, 6,5,           11,8                           }   // 12
88 29b82486 Leszek Koltunski
        };
89
      }
90
91 9ba7f3f6 Leszek Koltunski
    return mEdges;
92 29b82486 Leszek Koltunski
    }
93
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95
96 7bbfc84f Leszek Koltunski
  public float[][] getCuts(int[] numLayers)
97 29b82486 Leszek Koltunski
    {
98
    if( mCuts==null )
99
      {
100 84a17011 Leszek Koltunski
      float[] cut = new float[] { -3*SQ2/4, 3*SQ2/4 };
101 29b82486 Leszek Koltunski
      mCuts = new float[][] { cut,cut,cut,cut,cut,cut };
102
      }
103
104
    return mCuts;
105
    }
106
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108
109 59c20632 Leszek Koltunski
  public boolean[][] getLayerRotatable(int[] numLayers)
110
    {
111
    boolean[] tmp = new boolean[] {true,false,true};
112 974a0e69 Leszek Koltunski
    return new boolean[][] { tmp,tmp,tmp,tmp,tmp,tmp };
113 59c20632 Leszek Koltunski
    }
114
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116
117 11fa413d Leszek Koltunski
  public int getTouchControlType()
118 59c20632 Leszek Koltunski
    {
119 c9c71c3f Leszek Koltunski
    return TC_HEXAHEDRON;
120 59c20632 Leszek Koltunski
    }
121
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123
124 11fa413d Leszek Koltunski
  public int getTouchControlSplit()
125 59c20632 Leszek Koltunski
    {
126
    return TYPE_SPLIT_EDGE;
127
    }
128
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130
131
  public int[][][] getEnabled()
132 29b82486 Leszek Koltunski
    {
133 59c20632 Leszek Koltunski
    return new int[][][]
134 29b82486 Leszek Koltunski
      {
135 59c20632 Leszek Koltunski
          {{2,5},{2,4},{3,4},{3,5}},
136
          {{2,4},{2,5},{3,5},{3,4}},
137
          {{0,5},{1,5},{1,4},{0,4}},
138
          {{0,4},{1,4},{1,5},{0,5}},
139
          {{1,3},{0,3},{0,2},{1,2}},
140
          {{0,3},{1,3},{1,2},{0,2}},
141
      };
142
    }
143
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145
146
  public float[] getDist3D(int[] numLayers)
147
    {
148 4c9ca251 Leszek Koltunski
    return TouchControlHexahedron.D3D;
149
    }
150
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152
153
  public Static3D[] getFaceAxis()
154
    {
155
    return TouchControlHexahedron.FACE_AXIS;
156 29b82486 Leszek Koltunski
    }
157
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159
160 7b832206 Leszek Koltunski
  public float[][] getCubitPositions(int[] numLayers)
161 29b82486 Leszek Koltunski
    {
162
    if( mCenters==null )
163
      {
164
      float DIST_CORNER = 1.50f;
165
      float DIST_CENTER = 1.50f;
166
      float XY_CENTER = DIST_CORNER/3;
167
168
      mCenters = new float[][]
169
         {
170
             {   DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
171
             {   DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
172
             {   DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
173
             {   DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
174
             {  -DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
175
             {  -DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
176
             {  -DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
177
             {  -DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
178
179 eaf53357 Leszek Koltunski
             {  -XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
180
             {  -XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
181
             {   XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
182
             {   XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
183
             {  -XY_CENTER  ,    -XY_CENTER,  -DIST_CENTER },
184
             {  -XY_CENTER  ,     XY_CENTER,  -DIST_CENTER },
185
             {   XY_CENTER  ,    -XY_CENTER,  -DIST_CENTER },
186
             {   XY_CENTER  ,     XY_CENTER,  -DIST_CENTER },
187 29b82486 Leszek Koltunski
188
             {  -XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
189 eaf53357 Leszek Koltunski
             {  -XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
190
             {   XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
191
             {   XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
192 29b82486 Leszek Koltunski
             {  -XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
193 eaf53357 Leszek Koltunski
             {  -XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
194
             {   XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
195
             {   XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
196 29b82486 Leszek Koltunski
197 eaf53357 Leszek Koltunski
             {   DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
198
             {   DIST_CENTER,    -XY_CENTER,     XY_CENTER },
199
             {   DIST_CENTER,     XY_CENTER,    -XY_CENTER },
200
             {   DIST_CENTER,     XY_CENTER,     XY_CENTER },
201
             {  -DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
202
             {  -DIST_CENTER,    -XY_CENTER,     XY_CENTER },
203
             {  -DIST_CENTER,     XY_CENTER,    -XY_CENTER },
204
             {  -DIST_CENTER,     XY_CENTER,     XY_CENTER },
205 29b82486 Leszek Koltunski
         };
206
      }
207
208
    return mCenters;
209
    }
210
211 d0e6cf7f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
212
213
  public Static4D getCubitQuats(int cubit, int[] numLayers)
214
    {
215 82e62580 Leszek Koltunski
    if( mQuatIndices==null ) mQuatIndices = new int[] {  0,19,21, 7,18,16,17, 3,
216 eaf53357 Leszek Koltunski
217
                                                         0,21,20,17, 6, 7,16, 5,
218
                                                        10,22, 2,11,23,14,15, 1,
219
                                                         8,19, 4,12,18,13, 9, 3
220
                                                        };
221 974a0e69 Leszek Koltunski
    return mObjectQuats[mQuatIndices[cubit]];
222 d0e6cf7f Leszek Koltunski
    }
223
224 84a17011 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
225
226
  private float[][] getVertices(int variant)
227
    {
228
    if( variant==0 )
229
      {
230
      return new float[][]
231
         {
232
           {-1.50f, 0.00f, 0.00f},
233
           { 0.00f,-1.50f, 0.00f},
234
           { 0.00f, 0.00f,-1.50f},
235
           {-0.75f,-0.75f,-0.75f},
236
           { 0.00f, 0.00f, 0.00f}
237
         };
238
      }
239
    else
240
      {
241
      return new float[][]
242
        {
243
          { 0.50f, 0.50f, 0.00f },
244
          {-1.00f, 0.50f, 0.00f },
245
          { 0.50f,-1.00f, 0.00f },
246
          {-0.25f,-0.25f,-0.75f }
247
        };
248
      }
249
    }
250
251 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
252
253 e30c522a Leszek Koltunski
  public ObjectShape getObjectShape(int variant)
254 29b82486 Leszek Koltunski
    {
255
    if( variant==0 )
256
      {
257 4e9f2df5 Leszek Koltunski
      int[][] indices = { {0,1,4},{2,0,4},{1,2,4},{3,1,0},{3,2,1},{3,0,2} };
258 84a17011 Leszek Koltunski
      return new ObjectShape(getVertices(variant), indices);
259 3ee1d662 Leszek Koltunski
      }
260
    else
261
      {
262 846b69f3 Leszek Koltunski
      int[][] indices = { { 0,1,2 },{ 2,1,3 },{ 3,1,0 },{ 3,0,2 } };
263 84a17011 Leszek Koltunski
      return new ObjectShape(getVertices(variant), indices);
264 3ee1d662 Leszek Koltunski
      }
265
    }
266
267
///////////////////////////////////////////////////////////////////////////////////////////////////
268
269
  public ObjectFaceShape getObjectFaceShape(int variant)
270
    {
271 3bf19410 Leszek Koltunski
    float height = isInIconMode() ? 0.001f : 0.028f;
272
273 3ee1d662 Leszek Koltunski
    if( variant==0 )
274
      {
275 84a17011 Leszek Koltunski
      float[][] bands = { {height,35,0.16f,0.7f,7,3,3}, {0.001f, 0,1.00f,0.0f,3,1,5} };
276
      int[] indices   = { 0,0,0,1,1,1 };
277
      return new ObjectFaceShape(bands,indices,null);
278
      }
279
    else
280
      {
281
      float[][] bands = { {height,35,0.16f,0.7f,7,3,3}, {0.001f, 0,1.00f,0.0f,3,1,3} };
282
      int[] indices   = { 0,1,1,1 };
283
      return new ObjectFaceShape(bands,indices,null);
284
      }
285
    }
286
287
///////////////////////////////////////////////////////////////////////////////////////////////////
288
289
  public ObjectVertexEffects getVertexEffects(int variant)
290
    {
291
    if( variant==0 )
292
      {
293 4e9f2df5 Leszek Koltunski
      float[][] corners   = { {0.08f,0.20f} };
294
      int[] cornerIndices = { 0,0,0,0,0 };
295
      float[][] centers   = { {-0.75f, -0.75f, -0.75f} };
296
      int[] centerIndices = { 0,0,0,-1,0 };
297 84a17011 Leszek Koltunski
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
298 29b82486 Leszek Koltunski
      }
299
    else
300
      {
301 4e9f2df5 Leszek Koltunski
      float[][] corners   = { {0.06f,0.20f} };
302
      int[] cornerIndices = { 0,0,0,-1 };
303
      float[][] centers   = { {-0.25f, -0.25f, -0.75f} };
304
      int[] centerIndices = { 0,0,0,-1 };
305 84a17011 Leszek Koltunski
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
306 29b82486 Leszek Koltunski
      }
307
    }
308
309
///////////////////////////////////////////////////////////////////////////////////////////////////
310
311 e30c522a Leszek Koltunski
  public int getNumCubitVariants(int[] numLayers)
312 29b82486 Leszek Koltunski
    {
313
    return 2;
314
    }
315
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317
318 e30c522a Leszek Koltunski
  public int getCubitVariant(int cubit, int[] numLayers)
319 29b82486 Leszek Koltunski
    {
320
    return cubit<8 ? 0:1;
321
    }
322
323 3d766df3 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
324
325 d53fb890 Leszek Koltunski
  public float getStickerRadius()
326 3d766df3 Leszek Koltunski
    {
327 00f4980d Leszek Koltunski
    return 0.08f;
328 3d766df3 Leszek Koltunski
    }
329
330
///////////////////////////////////////////////////////////////////////////////////////////////////
331
332 d53fb890 Leszek Koltunski
  public float getStickerStroke()
333 3d766df3 Leszek Koltunski
    {
334 3bf19410 Leszek Koltunski
    return isInIconMode() ? 0.20f : 0.10f;
335 3d766df3 Leszek Koltunski
    }
336
337 00f4980d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
338
339 ebe8c08e leszek
  public float[][][] getStickerAngles()
340 00f4980d Leszek Koltunski
    {
341
    return null;
342
    }
343
344 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
345
// PUBLIC API
346
347
  public Static3D[] getRotationAxis()
348
    {
349
    return ROT_AXIS;
350
    }
351
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353
354 beee90ab Leszek Koltunski
  public int[][] getBasicAngles()
355 29b82486 Leszek Koltunski
    {
356 beee90ab Leszek Koltunski
    if( mBasicAngle ==null )
357
      {
358
      int num = getNumLayers()[0];
359
      int[] tmp = new int[num];
360
      for(int i=0; i<num; i++) tmp[i] = 2;
361
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp,tmp,tmp };
362
      }
363 29b82486 Leszek Koltunski
    return mBasicAngle;
364
    }
365
366 61aa85e4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
367
368 5f54927b Leszek Koltunski
  public String getShortName()
369 61aa85e4 Leszek Koltunski
    {
370 361fd0de leszek
    return ListObjects.HELI_3.name();
371 5f54927b Leszek Koltunski
    }
372
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374
375 1d581993 Leszek Koltunski
  public ObjectSignature getSignature()
376 5f54927b Leszek Koltunski
    {
377 97a75106 leszek
    return new ObjectSignature(ObjectConstants.HELI_3);
378 61aa85e4 Leszek Koltunski
    }
379
380 052e0362 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
381
382
  public String[][] getTutorials()
383
    {
384
    return new String[][]{
385
                          {"gb","-suwJpd_PO8","Helicopter Cube Tutorial","Bearded Cubing"},
386
                          {"es","DWG9n_YyGPA","Resolver Helicopter Cube","Cuby"},
387
                          {"ru","V4lJ3pg7Hio","Как собрать Куб Вертолет","Алексей Ярыгин"},
388
                          {"fr","Zk8zWBWD2Ow","Comment résoudre le Helicopter Cube","Julien"},
389
                          {"de","6VUH_FkBTlw","Helicopter Cube Tutorial","GerCubing"},
390
                          {"pl","zoBZame4gFo","Helicopter Cube TUTORIAL PL","MrUk"},
391
                          {"br","k8PVOARh6Kk","Como resolver o Helicopter Cube 1/3","Rafael Cinoto"},
392
                          {"br","6d4JLfuIwOQ","Como resolver o Helicopter Cube 2/3","Rafael Cinoto"},
393
                          {"br","moiV-2oWgrA","Como resolver o Helicopter Cube 3/3","Rafael Cinoto"},
394 064b8a42 Leszek Koltunski
                          {"kr","xZeIbPySg0k","헬리콥터 솔빙의 기본 방법","듀나메스 큐브 해법연구소"},
395 a399e91b Leszek Koltunski
                          {"vn","Ff6-IHhQHGY","Tutorial N.89 - Helicopter","Duy Thích Rubik"},
396 052e0362 Leszek Koltunski
                         };
397
    }
398 29b82486 Leszek Koltunski
}