Project

General

Profile

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

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

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