Project

General

Profile

Download (17.4 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / objects / TwistyHelicopter.java @ 967c1d17

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.objects;
21

    
22
import static org.distorted.objects.Movement.TYPE_SPLIT_EDGE;
23

    
24
import android.content.res.Resources;
25

    
26
import org.distorted.helpers.ObjectShape;
27
import org.distorted.helpers.ObjectSticker;
28
import org.distorted.helpers.ScrambleState;
29
import org.distorted.library.main.DistortedEffects;
30
import org.distorted.library.main.DistortedTexture;
31
import org.distorted.library.mesh.MeshSquare;
32
import org.distorted.library.type.Static3D;
33
import org.distorted.library.type.Static4D;
34
import org.distorted.main.R;
35

    
36
///////////////////////////////////////////////////////////////////////////////////////////////////
37

    
38
public class TwistyHelicopter extends Twisty6
39
{
40
  // the six rotation axis of a Helicopter. Must be normalized.
41
  static final Static3D[] ROT_AXIS = new Static3D[]
42
         {
43
           new Static3D(     0, +SQ2/2, -SQ2/2),
44
           new Static3D(     0, -SQ2/2, -SQ2/2),
45
           new Static3D(+SQ2/2,      0, -SQ2/2),
46
           new Static3D(-SQ2/2,      0, -SQ2/2),
47
           new Static3D(+SQ2/2, -SQ2/2,      0),
48
           new Static3D(-SQ2/2, -SQ2/2,      0)
49
         };
50

    
51
  private static final int[] NUM_ENABLED = {2,2,2,2,2,2};
52

    
53
  private static final int[][][] ENABLED = new int[][][]
54
      {
55
          {{2,5},{2,4},{3,4},{3,5}},
56
          {{2,4},{2,5},{3,5},{3,4}},
57
          {{0,5},{1,5},{1,4},{0,4}},
58
          {{0,4},{1,4},{1,5},{0,5}},
59
          {{1,3},{0,3},{0,2},{1,2}},
60
          {{0,3},{1,3},{1,2},{0,2}},
61
      };
62

    
63
  private ScrambleState[] mStates;
64
  private int[] mBasicAngle;
65
  private Static4D[] mQuats;
66
  private float[][] mCuts;
67
  private boolean[][] mLayerRotatable;
68
  private float[][] mCenters;
69
  private int[] mQuatIndices;
70
  private int[][] mFaceMap;
71
  private ObjectSticker[] mStickers;
72
  private Movement mMovement;
73

    
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75

    
76
  TwistyHelicopter(int size, Static4D quat, DistortedTexture texture,
77
                   MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
78
    {
79
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.HELI, res, scrWidth);
80
    }
81

    
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83

    
84
  ScrambleState[] getScrambleStates()
85
    {
86
    if( mStates==null )
87
      {
88
      mStates = new ScrambleState[]
89
        {
90
        new ScrambleState( new int[][] { {0,1,1,2,1,2},{0,1,3,2,1,4},{0,1,5,2,1,6},{0,1,7,2,1,8},{0,1,9,2,1,10},{0,1,11,2,1,12} } ),
91
        new ScrambleState( new int[][] { {           },{           },{0,1,5      },{0,1,7      },{      2,1,10},{       2,1,12} } ),
92
        new ScrambleState( new int[][] { {           },{           },{      2,1,6},{      2,1,8},{0,1,9       },{0,1,11       } } ),
93
        new ScrambleState( new int[][] { {           },{           },{0,1,5      },{0,1,7      },{0,1,9       },{0,1,11       } } ),
94
        new ScrambleState( new int[][] { {           },{           },{      2,1,6},{      2,1,8},{      2,1,10},{       2,1,12} } ),
95
        new ScrambleState( new int[][] { {0,1,1      },{0,1,3      },{           },{           },{0,1,9       },{       2,1,12} } ),
96
        new ScrambleState( new int[][] { {      2,1,2},{      2,1,4},{           },{           },{      2,1,10},{0,1,11       } } ),
97
        new ScrambleState( new int[][] { {0,1,1      },{0,1,3      },{           },{           },{      2,1,10},{0,1,11       } } ),
98
        new ScrambleState( new int[][] { {      2,1,2},{      2,1,4},{           },{           },{0,1,9       },{       2,1,12} } ),
99
        new ScrambleState( new int[][] { {      2,1,2},{0,1,3      },{0,1,5      },{      2,1,8},{            },{             } } ),
100
        new ScrambleState( new int[][] { {0,1,1      },{      2,1,4},{      2,1,6},{0,1,7      },{            },{             } } ),
101
        new ScrambleState( new int[][] { {      2,1,2},{0,1,3      },{      2,1,6},{0,1,7      },{            },{             } } ),
102
        new ScrambleState( new int[][] { {0,1,1      },{      2,1,4},{0,1,5      },{      2,1,8},{            },{             } } ),
103
        };
104
      }
105

    
106
    return mStates;
107
    }
108

    
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110

    
111
  private void initializeQuats()
112
    {
113
    mQuats = new Static4D[]
114
         {
115
         new Static4D( 0.00f,  0.00f,  0.00f,  1.00f ),
116
         new Static4D( 1.00f,  0.00f,  0.00f,  0.00f ),
117
         new Static4D( 0.00f,  1.00f,  0.00f,  0.00f ),
118
         new Static4D( 0.00f,  0.00f,  1.00f,  0.00f ),
119

    
120
         new Static4D( SQ2/2,  SQ2/2,  0.00f,  0.00f ),
121
         new Static4D( SQ2/2, -SQ2/2,  0.00f,  0.00f ),
122
         new Static4D( SQ2/2,  0.00f,  SQ2/2,  0.00f ),
123
         new Static4D( SQ2/2,  0.00f, -SQ2/2,  0.00f ),
124
         new Static4D( SQ2/2,  0.00f,  0.00f,  SQ2/2 ),
125
         new Static4D( SQ2/2,  0.00f,  0.00f, -SQ2/2 ),
126
         new Static4D( 0.00f,  SQ2/2,  SQ2/2,  0.00f ),
127
         new Static4D( 0.00f,  SQ2/2, -SQ2/2,  0.00f ),
128
         new Static4D( 0.00f,  SQ2/2,  0.00f,  SQ2/2 ),
129
         new Static4D( 0.00f,  SQ2/2,  0.00f, -SQ2/2 ),
130
         new Static4D( 0.00f,  0.00f,  SQ2/2,  SQ2/2 ),
131
         new Static4D( 0.00f,  0.00f,  SQ2/2, -SQ2/2 ),
132

    
133
         new Static4D( 0.50f,  0.50f,  0.50f,  0.50f ),
134
         new Static4D( 0.50f,  0.50f,  0.50f, -0.50f ),
135
         new Static4D( 0.50f,  0.50f, -0.50f,  0.50f ),
136
         new Static4D( 0.50f,  0.50f, -0.50f, -0.50f ),
137
         new Static4D( 0.50f, -0.50f,  0.50f,  0.50f ),
138
         new Static4D( 0.50f, -0.50f,  0.50f, -0.50f ),
139
         new Static4D( 0.50f, -0.50f, -0.50f,  0.50f ),
140
         new Static4D( 0.50f, -0.50f, -0.50f, -0.50f )
141
         };
142
    }
143

    
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145

    
146
  int[] getSolvedQuats(int cubit, int numLayers)
147
    {
148
    if( mQuats==null ) initializeQuats();
149
    int status = retCubitSolvedStatus(cubit,numLayers);
150
    return status<0 ? null : buildSolvedQuats(Movement6.FACE_AXIS[status],mQuats);
151
    }
152

    
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154

    
155
  Static4D[] getQuats()
156
    {
157
    if( mQuats==null ) initializeQuats();
158
    return mQuats;
159
    }
160

    
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162

    
163
  int getSolvedFunctionIndex()
164
    {
165
    return 0;
166
    }
167

    
168
///////////////////////////////////////////////////////////////////////////////////////////////////
169

    
170
  int getNumStickerTypes(int numLayers)
171
    {
172
    return 1;
173
    }
174

    
175
///////////////////////////////////////////////////////////////////////////////////////////////////
176

    
177
  float[][] getCuts(int size)
178
    {
179
    if( mCuts==null )
180
      {
181
      float[] cut = new float[] { -3*SQ2/4, +3*SQ2/4 };
182
      mCuts = new float[][] { cut,cut,cut,cut,cut,cut };
183
      }
184

    
185
    return mCuts;
186
    }
187

    
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189

    
190
  private void getLayerRotatable(int numLayers)
191
    {
192
    if( mLayerRotatable==null )
193
      {
194
      int numAxis = ROT_AXIS.length;
195
      boolean[] tmp = new boolean[] {true,false,true};
196
      mLayerRotatable = new boolean[numAxis][];
197
      for(int i=0; i<numAxis; i++) mLayerRotatable[i] = tmp;
198
      }
199
    }
200

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

    
203
  int getNumCubitFaces()
204
    {
205
    return 4;
206
    }
207

    
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209

    
210
  float[][] getCubitPositions(int size)
211
    {
212
    if( mCenters==null )
213
      {
214
      float DIST_CORNER = 1.50f;
215
      float DIST_CENTER = 1.50f;
216
      float XY_CENTER = DIST_CORNER/3;
217

    
218
      mCenters = new float[][]
219
         {
220
             {   DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
221
             {   DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
222
             {   DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
223
             {   DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
224
             {  -DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
225
             {  -DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
226
             {  -DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
227
             {  -DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
228

    
229
             {   DIST_CENTER,     XY_CENTER,     XY_CENTER },
230
             {   DIST_CENTER,     XY_CENTER,    -XY_CENTER },
231
             {   DIST_CENTER,    -XY_CENTER,     XY_CENTER },
232
             {   DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
233

    
234
             {  -DIST_CENTER,     XY_CENTER,     XY_CENTER },
235
             {  -DIST_CENTER,     XY_CENTER,    -XY_CENTER },
236
             {  -DIST_CENTER,    -XY_CENTER,     XY_CENTER },
237
             {  -DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
238

    
239
             {   XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
240
             {   XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
241
             {  -XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
242
             {  -XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
243

    
244
             {   XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
245
             {   XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
246
             {  -XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
247
             {  -XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
248

    
249
             {   XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
250
             {   XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
251
             {  -XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
252
             {  -XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
253

    
254
             {   XY_CENTER  ,     XY_CENTER,  -DIST_CENTER },
255
             {   XY_CENTER  ,    -XY_CENTER,  -DIST_CENTER },
256
             {  -XY_CENTER  ,     XY_CENTER,  -DIST_CENTER },
257
             {  -XY_CENTER  ,    -XY_CENTER,  -DIST_CENTER },
258
         };
259
      }
260

    
261
    return mCenters;
262
    }
263

    
264
///////////////////////////////////////////////////////////////////////////////////////////////////
265

    
266
  ObjectShape getObjectShape(int cubit, int numLayers)
267
    {
268
    int variant = getCubitVariant(cubit,numLayers);
269

    
270
    if( variant==0 )
271
      {
272
      double[][] vertices = new double[][]
273
          {
274
            {-1.50f, 0.00f, 0.00f},
275
            { 0.00f,-1.50f, 0.00f},
276
            { 0.00f, 0.00f,-1.50f},
277
            {-0.75f,-0.75f,-0.75f},
278
            { 0.00f, 0.00f, 0.00f}
279
          };
280

    
281
      int[][] vert_indices = new int[][]
282
          {
283
            {0,1,4},
284
            {2,0,4},
285
            {1,2,4},
286
            {3,1,0},
287
            {3,2,1},
288
            {3,0,2}
289
          };
290

    
291
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,7,3,3}, {0.000f, 0,1.00f,0.0f,3,1,5} };
292
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
293
      float[][] corners   = new float[][] { {0.08f,0.20f} };
294
      int[] cornerIndices = new int[] { 0,0,0,0,0 };
295
      float[][] centers   = new float[][] { {-0.75f, -0.75f, -0.75f} };
296
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
297
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
298
      }
299
    else
300
      {
301
      double[][] vertices = new double[][]
302
          {
303
            { 0.50f, 0.50f, 0.00f },
304
            {-1.00f, 0.50f, 0.00f },
305
            { 0.50f,-1.00f, 0.00f },
306
            {-0.25f,-0.25f,-0.75f },
307
          };
308

    
309
      int[][] vert_indices = new int[][]
310
          {
311
            { 0,1,2 },
312
            { 2,1,3 },
313
            { 0,1,3 },
314
            { 2,0,3 }
315
          };
316

    
317
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,7,3,3}, {0.000f, 0,1.00f,0.0f,3,1,3} };
318
      int[] bandIndices   = new int[] { 0,1,1,1 };
319
      float[][] corners   = new float[][] { {0.06f,0.20f} };
320
      int[] cornerIndices = new int[] { 0,0,0,-1 };
321
      float[][] centers   = new float[][] { {-0.25f, -0.25f, -0.75f} };
322
      int[] centerIndices = new int[] { 0,0,0,-1 };
323
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
324
      }
325
    }
326

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

    
329
  Static4D getQuat(int cubit, int numLayers)
330
    {
331
    if( mQuats==null ) initializeQuats();
332
    if( mQuatIndices==null ) mQuatIndices = new int[] { 0,13,14,1,12,2,3,7,20,6,13,17,7,23,18,12,22,10,8,16,11,21,19,9,3,15,14,0,5,2,1,4 };
333
    return mQuats[mQuatIndices[cubit]];
334
    }
335

    
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337

    
338
  int getNumCubitVariants(int numLayers)
339
    {
340
    return 2;
341
    }
342

    
343
///////////////////////////////////////////////////////////////////////////////////////////////////
344

    
345
  int getCubitVariant(int cubit, int numLayers)
346
    {
347
    return cubit<8 ? 0:1;
348
    }
349

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

    
352
  int getFaceColor(int cubit, int cubitface, int size)
353
    {
354
    if( mFaceMap==null )
355
      {
356
      mFaceMap = new int[][]
357
         {
358
           { 4,2,0, 6,6,6 },
359
           { 0,2,5, 6,6,6 },
360
           { 4,0,3, 6,6,6 },
361
           { 5,3,0, 6,6,6 },
362
           { 1,2,4, 6,6,6 },
363
           { 5,2,1, 6,6,6 },
364
           { 4,3,1, 6,6,6 },
365
           { 1,3,5, 6,6,6 },
366

    
367
           { 0 , 6,6,6,6,6 },
368
           { 0 , 6,6,6,6,6 },
369
           { 0 , 6,6,6,6,6 },
370
           { 0 , 6,6,6,6,6 },
371

    
372
           { 1 , 6,6,6,6,6 },
373
           { 1 , 6,6,6,6,6 },
374
           { 1 , 6,6,6,6,6 },
375
           { 1 , 6,6,6,6,6 },
376

    
377
           { 2 , 6,6,6,6,6 },
378
           { 2 , 6,6,6,6,6 },
379
           { 2 , 6,6,6,6,6 },
380
           { 2 , 6,6,6,6,6 },
381

    
382
           { 3 , 6,6,6,6,6 },
383
           { 3 , 6,6,6,6,6 },
384
           { 3 , 6,6,6,6,6 },
385
           { 3 , 6,6,6,6,6 },
386

    
387
           { 4 , 6,6,6,6,6 },
388
           { 4 , 6,6,6,6,6 },
389
           { 4 , 6,6,6,6,6 },
390
           { 4 , 6,6,6,6,6 },
391

    
392
           { 5 , 6,6,6,6,6 },
393
           { 5 , 6,6,6,6,6 },
394
           { 5 , 6,6,6,6,6 },
395
           { 5 , 6,6,6,6,6 },
396
         };
397
      }
398

    
399
    return mFaceMap[cubit][cubitface];
400
    }
401

    
402
///////////////////////////////////////////////////////////////////////////////////////////////////
403

    
404
  ObjectSticker retSticker(int face)
405
    {
406
    if( mStickers==null )
407
      {
408
      float[][] STICKERS = new float[][] { { -0.5f, 0.25f, 0.25f, -0.5f, 0.25f, 0.25f } };
409
      float radius = 0.03f;
410
      float stroke = 0.05f;
411
      float[] radii = new float[] {radius,radius,radius};
412
      mStickers = new ObjectSticker[STICKERS.length];
413
      mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke);
414
      }
415

    
416
    return mStickers[face/NUM_FACE_COLORS];
417
    }
418

    
419
///////////////////////////////////////////////////////////////////////////////////////////////////
420
// PUBLIC API
421

    
422
  public Static3D[] getRotationAxis()
423
    {
424
    return ROT_AXIS;
425
    }
426

    
427
///////////////////////////////////////////////////////////////////////////////////////////////////
428

    
429
  public Movement getMovement()
430
    {
431
    if( mMovement==null )
432
      {
433
      int numLayers = getNumLayers();
434
      if( mCuts==null ) getCuts(numLayers);
435
      getLayerRotatable(numLayers);
436
      mMovement = new Movement6(ROT_AXIS,mCuts,mLayerRotatable,numLayers,TYPE_SPLIT_EDGE,NUM_ENABLED,ENABLED);
437
      }
438
    return mMovement;
439
    }
440

    
441
///////////////////////////////////////////////////////////////////////////////////////////////////
442

    
443
  public int[] getBasicAngle()
444
    {
445
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 2,2,2,2,2,2 };
446
    return mBasicAngle;
447
    }
448

    
449
///////////////////////////////////////////////////////////////////////////////////////////////////
450

    
451
  public int getObjectName(int numLayers)
452
    {
453
    return R.string.heli3;
454
    }
455

    
456
///////////////////////////////////////////////////////////////////////////////////////////////////
457

    
458
  public int getInventor(int numLayers)
459
    {
460
    return R.string.heli3_inventor;
461
    }
462

    
463
///////////////////////////////////////////////////////////////////////////////////////////////////
464

    
465
  public int getComplexity(int numLayers)
466
    {
467
    return 8;
468
    }
469
}
(22-22/38)