Project

General

Profile

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

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

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.metadata.Metadata;
21
import org.distorted.objectlib.helpers.ObjectVertexEffects;
22
import org.distorted.objectlib.main.InitAssets;
23
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
24
import org.distorted.objectlib.metadata.ListObjects;
25
import org.distorted.objectlib.helpers.ObjectShape;
26
import org.distorted.objectlib.shape.ShapeHexahedron;
27

    
28
///////////////////////////////////////////////////////////////////////////////////////////////////
29

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

    
42
  private int[][] mEdges;
43
  private int[][] mBasicAngle;
44
  private float[][] mCuts;
45
  private float[][] mCenters;
46
  private int[] mQuatIndices;
47

    
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49

    
50
  public TwistyHelicopter(int iconMode, Static4D quat, Static3D move, float scale, Metadata meta, InitAssets asset)
51
    {
52
    super(iconMode, meta.getNumLayers()[0], quat, move, scale, meta, asset);
53
    }
54

    
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56

    
57
  @Override
58
  public float[][] returnRotationFactor()
59
    {
60
    float C = 2.2f;
61
    float[] f = new float[] { C,C,C };
62
    return new float[][] { f,f,f,f,f,f };
63
    }
64

    
65
///////////////////////////////////////////////////////////////////////////////////////////////////
66

    
67
  public int[][] getScrambleEdges()
68
    {
69
    if( mEdges==null )
70
      {
71
      mEdges = new int[][]
72
        {
73
            {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
74
            {                    6,5,      9,7,             14,10,        17,12},  // 1
75
            {                         8,6,      11,8, 12,9,        15,11       },  // 2
76
            {                    6,5,      9,7,       12,9,        15,11       },  // 3
77
            {                         8,6,      11,8,       14,10,        17,12},  // 4
78
            {0,1,      3,3,                           12,9,               17,12},  // 5
79
            {     2,2,      5,4,                            14,10, 15,11       },  // 6
80
            {0,1,      3,3,                                 14,10, 15,11       },  // 7
81
            {     2,2,      5,4,                      12,9,               17,12},  // 8
82
            {     2,2, 3,3,      6,5,           11,8                           },  // 9
83
            {0,1,           5,4,      8,6, 9,7,                                },  // 10
84
            {     2,2, 3,3,           8,6, 9,7                                 },  // 11
85
            {0,1,           5,4, 6,5,           11,8                           }   // 12
86
        };
87
      }
88

    
89
    return mEdges;
90
    }
91

    
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93

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

    
102
    return mCuts;
103
    }
104

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

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

    
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114

    
115
  public int getTouchControlType()
116
    {
117
    return TC_HEXAHEDRON;
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121

    
122
  public int getTouchControlSplit()
123
    {
124
    return TYPE_SPLIT_EDGE;
125
    }
126

    
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128

    
129
  public int[][][] getEnabled()
130
    {
131
    return new int[][][]
132
      {
133
          {{2,5},{2,4},{3,4},{3,5}},
134
          {{2,4},{2,5},{3,5},{3,4}},
135
          {{0,5},{1,5},{1,4},{0,4}},
136
          {{0,4},{1,4},{1,5},{0,5}},
137
          {{1,3},{0,3},{0,2},{1,2}},
138
          {{0,3},{1,3},{1,2},{0,2}},
139
      };
140
    }
141

    
142
///////////////////////////////////////////////////////////////////////////////////////////////////
143

    
144
  public float[] getDist3D(int[] numLayers)
145
    {
146
    return TouchControlHexahedron.D3D;
147
    }
148

    
149
///////////////////////////////////////////////////////////////////////////////////////////////////
150

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

    
156
///////////////////////////////////////////////////////////////////////////////////////////////////
157

    
158
  public float[][] getCubitPositions(int[] numLayers)
159
    {
160
    if( mCenters==null )
161
      {
162
      float DIST_CORNER = 1.50f;
163
      float DIST_CENTER = 1.50f;
164
      float XY_CENTER = DIST_CORNER/3;
165

    
166
      mCenters = new float[][]
167
         {
168
             {   DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
169
             {   DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
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

    
177
             {  -XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
178
             {  -XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
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

    
186
             {  -XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
187
             {  -XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
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

    
195
             {   DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
196
             {   DIST_CENTER,    -XY_CENTER,     XY_CENTER },
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
         };
204
      }
205

    
206
    return mCenters;
207
    }
208

    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210

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

    
215
                                                         0,21,20,17, 6, 7,16, 5,
216
                                                        10,22, 2,11,23,14,15, 1,
217
                                                         8,19, 4,12,18,13, 9, 3
218
                                                        };
219
    return mObjectQuats[mQuatIndices[cubit]];
220
    }
221

    
222
///////////////////////////////////////////////////////////////////////////////////////////////////
223

    
224
  private float[][] getVertices(int variant)
225
    {
226
    if( variant==0 )
227
      {
228
      return new float[][]
229
         {
230
           {-1.50f, 0.00f, 0.00f},
231
           { 0.00f,-1.50f, 0.00f},
232
           { 0.00f, 0.00f,-1.50f},
233
           {-0.75f,-0.75f,-0.75f},
234
           { 0.00f, 0.00f, 0.00f}
235
         };
236
      }
237
    else
238
      {
239
      return new float[][]
240
        {
241
          { 0.50f, 0.50f, 0.00f },
242
          {-1.00f, 0.50f, 0.00f },
243
          { 0.50f,-1.00f, 0.00f },
244
          {-0.25f,-0.25f,-0.75f }
245
        };
246
      }
247
    }
248

    
249
///////////////////////////////////////////////////////////////////////////////////////////////////
250

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

    
265
///////////////////////////////////////////////////////////////////////////////////////////////////
266

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

    
271
    if( variant==0 )
272
      {
273
      float[][] bands = { {height,35,0.16f,0.7f,7,3,3}, {0.001f, 0,1.00f,0.0f,3,1,5} };
274
      int[] indices   = { 0,0,0,1,1,1 };
275
      return new ObjectFaceShape(bands,indices,null);
276
      }
277
    else
278
      {
279
      float[][] bands = { {height,35,0.16f,0.7f,7,3,3}, {0.001f, 0,1.00f,0.0f,3,1,3} };
280
      int[] indices   = { 0,1,1,1 };
281
      return new ObjectFaceShape(bands,indices,null);
282
      }
283
    }
284

    
285
///////////////////////////////////////////////////////////////////////////////////////////////////
286

    
287
  public ObjectVertexEffects getVertexEffects(int variant)
288
    {
289
    if( variant==0 )
290
      {
291
      float[][] corners   = { {0.08f,0.20f} };
292
      int[] cornerIndices = { 0,0,0,0,0 };
293
      float[][] centers   = { {-0.75f, -0.75f, -0.75f} };
294
      int[] centerIndices = { 0,0,0,-1,0 };
295
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
296
      }
297
    else
298
      {
299
      float[][] corners   = { {0.06f,0.20f} };
300
      int[] cornerIndices = { 0,0,0,-1 };
301
      float[][] centers   = { {-0.25f, -0.25f, -0.75f} };
302
      int[] centerIndices = { 0,0,0,-1 };
303
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,cornerIndices,centers,centerIndices);
304
      }
305
    }
306

    
307
///////////////////////////////////////////////////////////////////////////////////////////////////
308

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

    
314
///////////////////////////////////////////////////////////////////////////////////////////////////
315

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

    
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322

    
323
  public float getStickerRadius()
324
    {
325
    return 0.08f;
326
    }
327

    
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329

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

    
335
///////////////////////////////////////////////////////////////////////////////////////////////////
336

    
337
  public float[][][] getStickerAngles()
338
    {
339
    return null;
340
    }
341

    
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343
// PUBLIC API
344

    
345
  public Static3D[] getRotationAxis()
346
    {
347
    return ROT_AXIS;
348
    }
349

    
350
///////////////////////////////////////////////////////////////////////////////////////////////////
351

    
352
  public int[][] getBasicAngles()
353
    {
354
    if( mBasicAngle ==null )
355
      {
356
      int num = getNumLayers()[0];
357
      int[] tmp = new int[num];
358
      for(int i=0; i<num; i++) tmp[i] = 2;
359
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp,tmp,tmp };
360
      }
361
    return mBasicAngle;
362
    }
363

    
364
///////////////////////////////////////////////////////////////////////////////////////////////////
365

    
366
  public String getShortName()
367
    {
368
    return ListObjects.HELI_3.name();
369
    }
370

    
371
///////////////////////////////////////////////////////////////////////////////////////////////////
372

    
373
  public String[][] getTutorials()
374
    {
375
    return new String[][]{
376
                          {"gb","-suwJpd_PO8","Helicopter Cube Tutorial","Bearded Cubing"},
377
                          {"es","DWG9n_YyGPA","Resolver Helicopter Cube","Cuby"},
378
                          {"ru","V4lJ3pg7Hio","Как собрать Куб Вертолет","Алексей Ярыгин"},
379
                          {"fr","Zk8zWBWD2Ow","Comment résoudre le Helicopter Cube","Julien"},
380
                          {"de","6VUH_FkBTlw","Helicopter Cube Tutorial","GerCubing"},
381
                          {"pl","zoBZame4gFo","Helicopter Cube TUTORIAL PL","MrUk"},
382
                          {"br","k8PVOARh6Kk","Como resolver o Helicopter Cube 1/3","Rafael Cinoto"},
383
                          {"br","6d4JLfuIwOQ","Como resolver o Helicopter Cube 2/3","Rafael Cinoto"},
384
                          {"br","moiV-2oWgrA","Como resolver o Helicopter Cube 3/3","Rafael Cinoto"},
385
                          {"kr","xZeIbPySg0k","헬리콥터 솔빙의 기본 방법","듀나메스 큐브 해법연구소"},
386
                          {"vn","Ff6-IHhQHGY","Tutorial N.89 - Helicopter","Duy Thích Rubik"},
387
                         };
388
    }
389
}
(23-23/59)