Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// 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
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.objects;
11

    
12
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_HEXAHEDRON;
13
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_SPLIT_EDGE;
14

    
15
import org.distorted.library.type.Static3D;
16
import org.distorted.library.type.Static4D;
17

    
18
import org.distorted.objectlib.helpers.FactoryCubit;
19
import org.distorted.objectlib.helpers.ObjectFaceShape;
20
import org.distorted.objectlib.helpers.ObjectSignature;
21
import org.distorted.objectlib.helpers.ObjectVertexEffects;
22
import org.distorted.objectlib.main.InitAssets;
23
import org.distorted.objectlib.main.InitData;
24
import org.distorted.objectlib.main.ObjectSignatures;
25
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
26
import org.distorted.objectlib.main.ObjectType;
27
import org.distorted.objectlib.helpers.ObjectShape;
28
import org.distorted.objectlib.shape.ShapeHexahedron;
29

    
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31

    
32
public class TwistyHelicopter extends ShapeHexahedron
33
{
34
  static final Static3D[] ROT_AXIS = new Static3D[]
35
         {
36
           new Static3D(     0,  SQ2/2, -SQ2/2),
37
           new Static3D(     0, -SQ2/2, -SQ2/2),
38
           new Static3D( SQ2/2,      0, -SQ2/2),
39
           new Static3D(-SQ2/2,      0, -SQ2/2),
40
           new Static3D( SQ2/2, -SQ2/2,      0),
41
           new Static3D(-SQ2/2, -SQ2/2,      0)
42
         };
43

    
44
  private int[][] mEdges;
45
  private int[][] mBasicAngle;
46
  private float[][] mCuts;
47
  private float[][] mCenters;
48
  private int[] mQuatIndices;
49

    
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

    
52
  public TwistyHelicopter(int meshState, int iconMode, Static4D quat, Static3D move, float scale, InitData data, InitAssets asset)
53
    {
54
    super(meshState, iconMode, data.getNumLayers()[0], quat, move, scale, data, asset);
55
    }
56

    
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58

    
59
  public int[][] getScrambleEdges()
60
    {
61
    if( mEdges==null )
62
      {
63
      mEdges = new int[][]
64
        {
65
            {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
66
            {                    6,5,      9,7,             14,10,        17,12},  // 1
67
            {                         8,6,      11,8, 12,9,        15,11       },  // 2
68
            {                    6,5,      9,7,       12,9,        15,11       },  // 3
69
            {                         8,6,      11,8,       14,10,        17,12},  // 4
70
            {0,1,      3,3,                           12,9,               17,12},  // 5
71
            {     2,2,      5,4,                            14,10, 15,11       },  // 6
72
            {0,1,      3,3,                                 14,10, 15,11       },  // 7
73
            {     2,2,      5,4,                      12,9,               17,12},  // 8
74
            {     2,2, 3,3,      6,5,           11,8                           },  // 9
75
            {0,1,           5,4,      8,6, 9,7,                                },  // 10
76
            {     2,2, 3,3,           8,6, 9,7                                 },  // 11
77
            {0,1,           5,4, 6,5,           11,8                           }   // 12
78
        };
79
      }
80

    
81
    return mEdges;
82
    }
83

    
84
///////////////////////////////////////////////////////////////////////////////////////////////////
85

    
86
  public float[][] getCuts(int[] numLayers)
87
    {
88
    if( mCuts==null )
89
      {
90
      float[] cut = new float[] { -3*SQ2/4, 3*SQ2/4 };
91
      mCuts = new float[][] { cut,cut,cut,cut,cut,cut };
92
      }
93

    
94
    return mCuts;
95
    }
96

    
97
///////////////////////////////////////////////////////////////////////////////////////////////////
98

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

    
105
///////////////////////////////////////////////////////////////////////////////////////////////////
106

    
107
  public int getTouchControlType()
108
    {
109
    return TC_HEXAHEDRON;
110
    }
111

    
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113

    
114
  public int getTouchControlSplit()
115
    {
116
    return TYPE_SPLIT_EDGE;
117
    }
118

    
119
///////////////////////////////////////////////////////////////////////////////////////////////////
120

    
121
  public int[][][] getEnabled()
122
    {
123
    return new int[][][]
124
      {
125
          {{2,5},{2,4},{3,4},{3,5}},
126
          {{2,4},{2,5},{3,5},{3,4}},
127
          {{0,5},{1,5},{1,4},{0,4}},
128
          {{0,4},{1,4},{1,5},{0,5}},
129
          {{1,3},{0,3},{0,2},{1,2}},
130
          {{0,3},{1,3},{1,2},{0,2}},
131
      };
132
    }
133

    
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135

    
136
  public float[] getDist3D(int[] numLayers)
137
    {
138
    return TouchControlHexahedron.D3D;
139
    }
140

    
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142

    
143
  public Static3D[] getFaceAxis()
144
    {
145
    return TouchControlHexahedron.FACE_AXIS;
146
    }
147

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  public float[][] getCubitPositions(int[] numLayers)
151
    {
152
    if( mCenters==null )
153
      {
154
      float DIST_CORNER = 1.50f;
155
      float DIST_CENTER = 1.50f;
156
      float XY_CENTER = DIST_CORNER/3;
157

    
158
      mCenters = new float[][]
159
         {
160
             {   DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
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

    
169
             {  -XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
170
             {  -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

    
178
             {  -XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
179
             {  -XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
180
             {   XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
181
             {   XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
182
             {  -XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
183
             {  -XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
184
             {   XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
185
             {   XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
186

    
187
             {   DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
188
             {   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
         };
196
      }
197

    
198
    return mCenters;
199
    }
200

    
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202

    
203
  public Static4D getCubitQuats(int cubit, int[] numLayers)
204
    {
205
    if( mQuatIndices==null ) mQuatIndices = new int[] {  0,19,21, 7,18,16,17, 3,
206

    
207
                                                         0,21,20,17, 6, 7,16, 5,
208
                                                        10,22, 2,11,23,14,15, 1,
209
                                                         8,19, 4,12,18,13, 9, 3
210
                                                        };
211
    return mObjectQuats[mQuatIndices[cubit]];
212
    }
213

    
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215

    
216
  private float[][] getVertices(int variant)
217
    {
218
    if( variant==0 )
219
      {
220
      return new float[][]
221
         {
222
           {-1.50f, 0.00f, 0.00f},
223
           { 0.00f,-1.50f, 0.00f},
224
           { 0.00f, 0.00f,-1.50f},
225
           {-0.75f,-0.75f,-0.75f},
226
           { 0.00f, 0.00f, 0.00f}
227
         };
228
      }
229
    else
230
      {
231
      return new float[][]
232
        {
233
          { 0.50f, 0.50f, 0.00f },
234
          {-1.00f, 0.50f, 0.00f },
235
          { 0.50f,-1.00f, 0.00f },
236
          {-0.25f,-0.25f,-0.75f }
237
        };
238
      }
239
    }
240

    
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242

    
243
  public ObjectShape getObjectShape(int variant)
244
    {
245
    if( variant==0 )
246
      {
247
      int[][] indices = { {0,1,4},{2,0,4},{1,2,4},{3,1,0},{3,2,1},{3,0,2} };
248
      return new ObjectShape(getVertices(variant), indices);
249
      }
250
    else
251
      {
252
      int[][] indices = { { 0,1,2 },{ 2,1,3 },{ 3,1,0 },{ 3,0,2 } };
253
      return new ObjectShape(getVertices(variant), indices);
254
      }
255
    }
256

    
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258

    
259
  public ObjectFaceShape getObjectFaceShape(int variant)
260
    {
261
    float height = isInIconMode() ? 0.001f : 0.028f;
262

    
263
    if( variant==0 )
264
      {
265
      float[][] bands = { {height,35,0.16f,0.7f,7,3,3}, {0.001f, 0,1.00f,0.0f,3,1,5} };
266
      int[] indices   = { 0,0,0,1,1,1 };
267
      return new ObjectFaceShape(bands,indices,null);
268
      }
269
    else
270
      {
271
      float[][] bands = { {height,35,0.16f,0.7f,7,3,3}, {0.001f, 0,1.00f,0.0f,3,1,3} };
272
      int[] indices   = { 0,1,1,1 };
273
      return new ObjectFaceShape(bands,indices,null);
274
      }
275
    }
276

    
277
///////////////////////////////////////////////////////////////////////////////////////////////////
278

    
279
  public ObjectVertexEffects getVertexEffects(int variant)
280
    {
281
    if( variant==0 )
282
      {
283
      float[][] corners   = { {0.08f,0.20f} };
284
      int[] cornerIndices = { 0,0,0,0,0 };
285
      float[][] centers   = { {-0.75f, -0.75f, -0.75f} };
286
      int[] centerIndices = { 0,0,0,-1,0 };
287
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
288
      }
289
    else
290
      {
291
      float[][] corners   = { {0.06f,0.20f} };
292
      int[] cornerIndices = { 0,0,0,-1 };
293
      float[][] centers   = { {-0.25f, -0.25f, -0.75f} };
294
      int[] centerIndices = { 0,0,0,-1 };
295
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
296
      }
297
    }
298

    
299
///////////////////////////////////////////////////////////////////////////////////////////////////
300

    
301
  public int getNumCubitVariants(int[] numLayers)
302
    {
303
    return 2;
304
    }
305

    
306
///////////////////////////////////////////////////////////////////////////////////////////////////
307

    
308
  public int getCubitVariant(int cubit, int[] numLayers)
309
    {
310
    return cubit<8 ? 0:1;
311
    }
312

    
313
///////////////////////////////////////////////////////////////////////////////////////////////////
314

    
315
  public float getStickerRadius()
316
    {
317
    return 0.08f;
318
    }
319

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

    
322
  public float getStickerStroke()
323
    {
324
    return isInIconMode() ? 0.20f : 0.10f;
325
    }
326

    
327
///////////////////////////////////////////////////////////////////////////////////////////////////
328

    
329
  public float[][] getStickerAngles()
330
    {
331
    return null;
332
    }
333

    
334
///////////////////////////////////////////////////////////////////////////////////////////////////
335
// PUBLIC API
336

    
337
  public Static3D[] getRotationAxis()
338
    {
339
    return ROT_AXIS;
340
    }
341

    
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343

    
344
  public int[][] getBasicAngles()
345
    {
346
    if( mBasicAngle ==null )
347
      {
348
      int num = getNumLayers()[0];
349
      int[] tmp = new int[num];
350
      for(int i=0; i<num; i++) tmp[i] = 2;
351
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp,tmp,tmp };
352
      }
353
    return mBasicAngle;
354
    }
355

    
356
///////////////////////////////////////////////////////////////////////////////////////////////////
357

    
358
  public String getShortName()
359
    {
360
    return ObjectType.HELI_3.name();
361
    }
362

    
363
///////////////////////////////////////////////////////////////////////////////////////////////////
364

    
365
  public ObjectSignature getSignature()
366
    {
367
    return new ObjectSignature(ObjectSignatures.HELI_3);
368
    }
369

    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371

    
372
  public String getObjectName()
373
    {
374
    return "Helicopter Cube";
375
    }
376

    
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378

    
379
  public String getInventor()
380
    {
381
    return "Adam G. Cowan";
382
    }
383

    
384
///////////////////////////////////////////////////////////////////////////////////////////////////
385

    
386
  public int getYearOfInvention()
387
    {
388
    return 2006;
389
    }
390

    
391
///////////////////////////////////////////////////////////////////////////////////////////////////
392

    
393
  public int getComplexity()
394
    {
395
    return 3;
396
    }
397

    
398
///////////////////////////////////////////////////////////////////////////////////////////////////
399

    
400
  public String[][] getTutorials()
401
    {
402
    return new String[][]{
403
                          {"gb","-suwJpd_PO8","Helicopter Cube Tutorial","Bearded Cubing"},
404
                          {"es","DWG9n_YyGPA","Resolver Helicopter Cube","Cuby"},
405
                          {"ru","V4lJ3pg7Hio","Как собрать Куб Вертолет","Алексей Ярыгин"},
406
                          {"fr","Zk8zWBWD2Ow","Comment résoudre le Helicopter Cube","Julien"},
407
                          {"de","6VUH_FkBTlw","Helicopter Cube Tutorial","GerCubing"},
408
                          {"pl","zoBZame4gFo","Helicopter Cube TUTORIAL PL","MrUk"},
409
                          {"br","k8PVOARh6Kk","Como resolver o Helicopter Cube 1/3","Rafael Cinoto"},
410
                          {"br","6d4JLfuIwOQ","Como resolver o Helicopter Cube 2/3","Rafael Cinoto"},
411
                          {"br","moiV-2oWgrA","Como resolver o Helicopter Cube 3/3","Rafael Cinoto"},
412
                          {"kr","xZeIbPySg0k","헬리콥터 솔빙의 기본 방법","듀나메스 큐브 해법연구소"},
413
                          {"vn","Ff6-IHhQHGY","Tutorial N.89 - Helicopter","Duy Thích Rubik"},
414
                         };
415
    }
416
}
(16-16/41)