Project

General

Profile

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

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

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
  @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
///////////////////////////////////////////////////////////////////////////////////////////////////
68

    
69
  public int[][] getScrambleEdges()
70
    {
71
    if( mEdges==null )
72
      {
73
      mEdges = new int[][]
74
        {
75
            {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
        };
89
      }
90

    
91
    return mEdges;
92
    }
93

    
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95

    
96
  public float[][] getCuts(int[] numLayers)
97
    {
98
    if( mCuts==null )
99
      {
100
      float[] cut = new float[] { -3*SQ2/4, 3*SQ2/4 };
101
      mCuts = new float[][] { cut,cut,cut,cut,cut,cut };
102
      }
103

    
104
    return mCuts;
105
    }
106

    
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108

    
109
  public boolean[][] getLayerRotatable(int[] numLayers)
110
    {
111
    boolean[] tmp = new boolean[] {true,false,true};
112
    return new boolean[][] { tmp,tmp,tmp,tmp,tmp,tmp };
113
    }
114

    
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

    
117
  public int getTouchControlType()
118
    {
119
    return TC_HEXAHEDRON;
120
    }
121

    
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123

    
124
  public int getTouchControlSplit()
125
    {
126
    return TYPE_SPLIT_EDGE;
127
    }
128

    
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

    
131
  public int[][][] getEnabled()
132
    {
133
    return new int[][][]
134
      {
135
          {{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
    return TouchControlHexahedron.D3D;
149
    }
150

    
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152

    
153
  public Static3D[] getFaceAxis()
154
    {
155
    return TouchControlHexahedron.FACE_AXIS;
156
    }
157

    
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159

    
160
  public float[][] getCubitPositions(int[] numLayers)
161
    {
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
             {  -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

    
188
             {  -XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
189
             {  -XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
190
             {   XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
191
             {   XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
192
             {  -XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
193
             {  -XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
194
             {   XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
195
             {   XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
196

    
197
             {   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
         };
206
      }
207

    
208
    return mCenters;
209
    }
210

    
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212

    
213
  public Static4D getCubitQuats(int cubit, int[] numLayers)
214
    {
215
    if( mQuatIndices==null ) mQuatIndices = new int[] {  0,19,21, 7,18,16,17, 3,
216

    
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
    return mObjectQuats[mQuatIndices[cubit]];
222
    }
223

    
224
///////////////////////////////////////////////////////////////////////////////////////////////////
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
///////////////////////////////////////////////////////////////////////////////////////////////////
252

    
253
  public ObjectShape getObjectShape(int variant)
254
    {
255
    if( variant==0 )
256
      {
257
      int[][] indices = { {0,1,4},{2,0,4},{1,2,4},{3,1,0},{3,2,1},{3,0,2} };
258
      return new ObjectShape(getVertices(variant), indices);
259
      }
260
    else
261
      {
262
      int[][] indices = { { 0,1,2 },{ 2,1,3 },{ 3,1,0 },{ 3,0,2 } };
263
      return new ObjectShape(getVertices(variant), indices);
264
      }
265
    }
266

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

    
269
  public ObjectFaceShape getObjectFaceShape(int variant)
270
    {
271
    float height = isInIconMode() ? 0.001f : 0.028f;
272

    
273
    if( variant==0 )
274
      {
275
      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
      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
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
298
      }
299
    else
300
      {
301
      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
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
306
      }
307
    }
308

    
309
///////////////////////////////////////////////////////////////////////////////////////////////////
310

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

    
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317

    
318
  public int getCubitVariant(int cubit, int[] numLayers)
319
    {
320
    return cubit<8 ? 0:1;
321
    }
322

    
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324

    
325
  public float getStickerRadius()
326
    {
327
    return 0.08f;
328
    }
329

    
330
///////////////////////////////////////////////////////////////////////////////////////////////////
331

    
332
  public float getStickerStroke()
333
    {
334
    return isInIconMode() ? 0.20f : 0.10f;
335
    }
336

    
337
///////////////////////////////////////////////////////////////////////////////////////////////////
338

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

    
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345
// PUBLIC API
346

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

    
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353

    
354
  public int[][] getBasicAngles()
355
    {
356
    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
    return mBasicAngle;
364
    }
365

    
366
///////////////////////////////////////////////////////////////////////////////////////////////////
367

    
368
  public String getShortName()
369
    {
370
    return ObjectType.HELI_3.name();
371
    }
372

    
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374

    
375
  public ObjectSignature getSignature()
376
    {
377
    return new ObjectSignature(ObjectSignatures.HELI_3);
378
    }
379

    
380
///////////////////////////////////////////////////////////////////////////////////////////////////
381

    
382
  public String getObjectName()
383
    {
384
    return "Helicopter Cube";
385
    }
386

    
387
///////////////////////////////////////////////////////////////////////////////////////////////////
388

    
389
  public String getInventor()
390
    {
391
    return "Adam G. Cowan";
392
    }
393

    
394
///////////////////////////////////////////////////////////////////////////////////////////////////
395

    
396
  public int getYearOfInvention()
397
    {
398
    return 2006;
399
    }
400

    
401
///////////////////////////////////////////////////////////////////////////////////////////////////
402

    
403
  public int getComplexity()
404
    {
405
    return 3;
406
    }
407

    
408
///////////////////////////////////////////////////////////////////////////////////////////////////
409

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