Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyHelicopter.java @ abf36986

1 ee35e63c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 android.content.res.Resources;
23
24 a2a4df1b Leszek Koltunski
import org.distorted.helpers.ObjectShape;
25 9c06394a Leszek Koltunski
import org.distorted.helpers.ObjectSticker;
26 6cf89a3e Leszek Koltunski
import org.distorted.helpers.ScrambleState;
27 ee35e63c Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
28
import org.distorted.library.main.DistortedTexture;
29
import org.distorted.library.mesh.MeshSquare;
30
import org.distorted.library.type.Static3D;
31
import org.distorted.library.type.Static4D;
32 6fd4a72c Leszek Koltunski
import org.distorted.main.R;
33 ee35e63c Leszek Koltunski
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35
36 9c2f0c91 Leszek Koltunski
public class TwistyHelicopter extends TwistyObject
37 ee35e63c Leszek Koltunski
{
38
  // the six rotation axis of a Helicopter. Must be normalized.
39
  static final Static3D[] ROT_AXIS = new Static3D[]
40
         {
41
           new Static3D(     0, +SQ2/2, -SQ2/2),
42
           new Static3D(     0, -SQ2/2, -SQ2/2),
43
           new Static3D(+SQ2/2,      0, -SQ2/2),
44
           new Static3D(-SQ2/2,      0, -SQ2/2),
45
           new Static3D(+SQ2/2, -SQ2/2,      0),
46
           new Static3D(-SQ2/2, -SQ2/2,      0)
47
         };
48
49
  private static final int[] FACE_COLORS = new int[]
50
         {
51 ece1b58d Leszek Koltunski
           COLOR_YELLOW, COLOR_WHITE,
52
           COLOR_BLUE  , COLOR_GREEN,
53 323b217c Leszek Koltunski
           COLOR_RED   , COLOR_ORANGE
54 ee35e63c Leszek Koltunski
         };
55
56 85449b44 Leszek Koltunski
  private static final int FACES_PER_CUBIT =6;
57 ee35e63c Leszek Koltunski
58 91792184 Leszek Koltunski
  private ScrambleState[] mStates;
59 85449b44 Leszek Koltunski
  private int[] mBasicAngle;
60
  private Static4D[] mQuats;
61
  private float[][] mCenters;
62
  private int[] mQuatIndices;
63
  private int[][] mFaceMap;
64
  private ObjectSticker[] mStickers;
65 486b3417 Leszek Koltunski
66 ee35e63c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
67
68 9c2f0c91 Leszek Koltunski
  TwistyHelicopter(int size, Static4D quat, DistortedTexture texture,
69
                   MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
70 ee35e63c Leszek Koltunski
    {
71 db875721 Leszek Koltunski
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.HELI, res, scrWidth);
72 91792184 Leszek Koltunski
    }
73
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75 486b3417 Leszek Koltunski
76 91792184 Leszek Koltunski
  ScrambleState[] getScrambleStates()
77
    {
78
    if( mStates==null )
79 486b3417 Leszek Koltunski
      {
80 91792184 Leszek Koltunski
      mStates = new ScrambleState[]
81
        {
82
        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} } ),
83
        new ScrambleState( new int[][] { {           },{           },{0,1,5      },{0,1,7      },{      2,1,10},{       2,1,12} } ),
84
        new ScrambleState( new int[][] { {           },{           },{      2,1,6},{      2,1,8},{0,1,9       },{0,1,11       } } ),
85
        new ScrambleState( new int[][] { {           },{           },{0,1,5      },{0,1,7      },{0,1,9       },{0,1,11       } } ),
86
        new ScrambleState( new int[][] { {           },{           },{      2,1,6},{      2,1,8},{      2,1,10},{       2,1,12} } ),
87
        new ScrambleState( new int[][] { {0,1,1      },{0,1,3      },{           },{           },{0,1,9       },{       2,1,12} } ),
88
        new ScrambleState( new int[][] { {      2,1,2},{      2,1,4},{           },{           },{      2,1,10},{0,1,11       } } ),
89
        new ScrambleState( new int[][] { {0,1,1      },{0,1,3      },{           },{           },{      2,1,10},{0,1,11       } } ),
90
        new ScrambleState( new int[][] { {      2,1,2},{      2,1,4},{           },{           },{0,1,9       },{       2,1,12} } ),
91
        new ScrambleState( new int[][] { {      2,1,2},{0,1,3      },{0,1,5      },{      2,1,8},{            },{             } } ),
92
        new ScrambleState( new int[][] { {0,1,1      },{      2,1,4},{      2,1,6},{0,1,7      },{            },{             } } ),
93
        new ScrambleState( new int[][] { {      2,1,2},{0,1,3      },{      2,1,6},{0,1,7      },{            },{             } } ),
94
        new ScrambleState( new int[][] { {0,1,1      },{      2,1,4},{0,1,5      },{      2,1,8},{            },{             } } ),
95
        };
96
      }
97
98
    return mStates;
99 b1f2ccf5 Leszek Koltunski
    }
100
101 85449b44 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
102
103
  private void initializeQuats()
104
    {
105
    mQuats = new Static4D[]
106
         {
107
         new Static4D( 0.00f,  0.00f,  0.00f,  1.00f ),
108
         new Static4D( 1.00f,  0.00f,  0.00f,  0.00f ),
109
         new Static4D( 0.00f,  1.00f,  0.00f,  0.00f ),
110
         new Static4D( 0.00f,  0.00f,  1.00f,  0.00f ),
111
112
         new Static4D( SQ2/2,  SQ2/2,  0.00f,  0.00f ),
113
         new Static4D( SQ2/2, -SQ2/2,  0.00f,  0.00f ),
114
         new Static4D( SQ2/2,  0.00f,  SQ2/2,  0.00f ),
115
         new Static4D( SQ2/2,  0.00f, -SQ2/2,  0.00f ),
116
         new Static4D( SQ2/2,  0.00f,  0.00f,  SQ2/2 ),
117
         new Static4D( SQ2/2,  0.00f,  0.00f, -SQ2/2 ),
118
         new Static4D( 0.00f,  SQ2/2,  SQ2/2,  0.00f ),
119
         new Static4D( 0.00f,  SQ2/2, -SQ2/2,  0.00f ),
120
         new Static4D( 0.00f,  SQ2/2,  0.00f,  SQ2/2 ),
121
         new Static4D( 0.00f,  SQ2/2,  0.00f, -SQ2/2 ),
122
         new Static4D( 0.00f,  0.00f,  SQ2/2,  SQ2/2 ),
123
         new Static4D( 0.00f,  0.00f,  SQ2/2, -SQ2/2 ),
124
125
         new Static4D( 0.50f,  0.50f,  0.50f,  0.50f ),
126
         new Static4D( 0.50f,  0.50f,  0.50f, -0.50f ),
127
         new Static4D( 0.50f,  0.50f, -0.50f,  0.50f ),
128
         new Static4D( 0.50f,  0.50f, -0.50f, -0.50f ),
129
         new Static4D( 0.50f, -0.50f,  0.50f,  0.50f ),
130
         new Static4D( 0.50f, -0.50f,  0.50f, -0.50f ),
131
         new Static4D( 0.50f, -0.50f, -0.50f,  0.50f ),
132
         new Static4D( 0.50f, -0.50f, -0.50f, -0.50f )
133
         };
134
    }
135
136 a480ee80 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
137
138
  int[] getSolvedQuats(int cubit, int numLayers)
139
    {
140 85449b44 Leszek Koltunski
    if( mQuats==null ) initializeQuats();
141 a480ee80 Leszek Koltunski
    int status = retCubitSolvedStatus(cubit,numLayers);
142 85449b44 Leszek Koltunski
    return status<0 ? null : buildSolvedQuats(MovementHelicopter.FACE_AXIS[status],mQuats);
143 a480ee80 Leszek Koltunski
    }
144
145 ee35e63c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
146
147
  float getScreenRatio()
148
    {
149 e06e1b7e Leszek Koltunski
    return 1.6f;
150 ee35e63c Leszek Koltunski
    }
151
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153
154
  Static4D[] getQuats()
155
    {
156 85449b44 Leszek Koltunski
    if( mQuats==null ) initializeQuats();
157
    return mQuats;
158 ee35e63c Leszek Koltunski
    }
159
160 eaee1ddc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
161
162
  boolean shouldResetTextureMaps()
163
    {
164
    return false;
165
    }
166
167 ee35e63c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
168
169 abf36986 Leszek Koltunski
  int getNumFaceColors()
170 ee35e63c Leszek Koltunski
    {
171
    return FACE_COLORS.length;
172
    }
173
174 169219a7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
175
176
  int getSolvedFunctionIndex()
177
    {
178
    return 0;
179
    }
180
181 ee35e63c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
182
183 a64e07d0 Leszek Koltunski
  int getNumStickerTypes(int numLayers)
184 ee35e63c Leszek Koltunski
    {
185 85449b44 Leszek Koltunski
    return 1;
186 ee35e63c Leszek Koltunski
    }
187
188 7403cdfa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
189
190 e6734aa9 Leszek Koltunski
  float[][] getCuts(int size)
191 7403cdfa Leszek Koltunski
    {
192 e6734aa9 Leszek Koltunski
    float[] cut = new float[] { -SQ2/4, +SQ2/4 };
193
    return new float[][] { cut,cut,cut,cut,cut,cut };
194 7403cdfa Leszek Koltunski
    }
195
196 ee35e63c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
197
198
  int getNumCubitFaces()
199
    {
200
    return FACES_PER_CUBIT;
201
    }
202
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204
205 e6cf7283 Leszek Koltunski
  float[][] getCubitPositions(int size)
206 ee35e63c Leszek Koltunski
    {
207 85449b44 Leszek Koltunski
    if( mCenters==null )
208
      {
209
      float DIST_CORNER = 0.50f;
210
      float DIST_CENTER = 0.50f;
211
      float XY_CENTER = DIST_CORNER/3;
212
213
      mCenters = new float[][]
214
         {
215
             {   DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
216
             {   DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
217
             {   DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
218
             {   DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
219
             {  -DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
220
             {  -DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
221
             {  -DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
222
             {  -DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
223
224
             {   DIST_CENTER,     XY_CENTER,     XY_CENTER },
225
             {   DIST_CENTER,     XY_CENTER,    -XY_CENTER },
226
             {   DIST_CENTER,    -XY_CENTER,     XY_CENTER },
227
             {   DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
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
             {   XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
235
             {   XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
236
             {  -XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
237
             {  -XY_CENTER  ,   DIST_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  ,     XY_CENTER,   DIST_CENTER },
245
             {   XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
246
             {  -XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
247
             {  -XY_CENTER  ,    -XY_CENTER,   DIST_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
      }
255
256
    return mCenters;
257 ee35e63c Leszek Koltunski
    }
258
259 a2a4df1b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
260
261
  ObjectShape getObjectShape(int cubit, int numLayers)
262
    {
263
    int variant = getCubitVariant(cubit,numLayers);
264
265
    if( variant==0 )
266
      {
267 85449b44 Leszek Koltunski
      double[][] vertices = new double[][]
268
          {
269
            {-0.50f, 0.00f, 0.00f},
270
            { 0.00f,-0.50f, 0.00f},
271
            { 0.00f, 0.00f,-0.50f},
272
            {-0.25f,-0.25f,-0.25f},
273
            { 0.00f, 0.00f, 0.00f}
274
          };
275
276
      int[][] vert_indices = new int[][]
277
          {
278
            {0,1,4},
279
            {2,0,4},
280
            {1,2,4},
281
            {3,1,0},
282
            {3,2,1},
283
            {3,0,2}
284
          };
285
286 3e605536 Leszek Koltunski
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,7,3,3}, {0.000f, 0,1.00f,0.0f,3,1,5} };
287 a2a4df1b Leszek Koltunski
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
288
      float[][] corners   = new float[][] { {0.08f,0.15f}, {0.08f,0.20f} };
289
      int[] cornerIndices = new int[] { 1,1,1,0,0 };
290
      float[][] centers   = new float[][] { {-0.25f, -0.25f, -0.25f} };
291
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
292 85449b44 Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
293 a2a4df1b Leszek Koltunski
      }
294
    else
295
      {
296 85449b44 Leszek Koltunski
      float E = 0.1666666f;
297
298
      double[][] vertices = new double[][]
299
          {
300
            { 0.00f +E, 0.00f +E, 0.00f },
301
            {-0.50f +E, 0.00f +E, 0.00f },
302
            { 0.00f +E,-0.50f +E, 0.00f },
303
            {-0.25f +E,-0.25f +E,-0.25f },
304
          };
305
306
      int[][] vert_indices = new int[][]
307
          {
308
            { 0,1,2 },
309
            { 2,1,3 },
310
            { 0,1,3 },
311
            { 2,0,3 }
312
          };
313
314 3e605536 Leszek Koltunski
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,7,3,3}, {0.000f, 0,1.00f,0.0f,3,1,3} };
315 a2a4df1b Leszek Koltunski
      int[] bandIndices   = new int[] { 0,1,1,1 };
316
      float[][] corners   = new float[][] { {0.06f,0.15f}, {0.06f,0.20f} };
317
      int[] cornerIndices = new int[] { 0,1,1,-1 };
318
      float[][] centers   = new float[][] { {-1.0f/12, -1.0f/12, -1.0f/4} };
319
      int[] centerIndices = new int[] { 0,0,0,-1 };
320 85449b44 Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
321 a2a4df1b Leszek Koltunski
      }
322
    }
323
324
///////////////////////////////////////////////////////////////////////////////////////////////////
325
326 3e605536 Leszek Koltunski
  Static4D getQuat(int cubit, int numLayers)
327 a2a4df1b Leszek Koltunski
    {
328 85449b44 Leszek Koltunski
    if( mQuats==null ) initializeQuats();
329
    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 };
330
    return mQuats[mQuatIndices[cubit]];
331 a2a4df1b Leszek Koltunski
    }
332
333
///////////////////////////////////////////////////////////////////////////////////////////////////
334
335 3e605536 Leszek Koltunski
  int getNumCubitVariants(int numLayers)
336 a2a4df1b Leszek Koltunski
    {
337
    return 2;
338
    }
339
340
///////////////////////////////////////////////////////////////////////////////////////////////////
341
342
  int getCubitVariant(int cubit, int numLayers)
343
    {
344
    return cubit<8 ? 0:1;
345
    }
346
347 ee35e63c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
348
349
  int getFaceColor(int cubit, int cubitface, int size)
350
    {
351 85449b44 Leszek Koltunski
    if( mFaceMap==null )
352
      {
353
      mFaceMap = new int[][]
354
         {
355
           { 4,2,0, 6,6,6 },
356
           { 0,2,5, 6,6,6 },
357
           { 4,0,3, 6,6,6 },
358
           { 5,3,0, 6,6,6 },
359
           { 1,2,4, 6,6,6 },
360
           { 5,2,1, 6,6,6 },
361
           { 4,3,1, 6,6,6 },
362
           { 1,3,5, 6,6,6 },
363
364
           { 0 , 6,6,6,6,6 },
365
           { 0 , 6,6,6,6,6 },
366
           { 0 , 6,6,6,6,6 },
367
           { 0 , 6,6,6,6,6 },
368
369
           { 1 , 6,6,6,6,6 },
370
           { 1 , 6,6,6,6,6 },
371
           { 1 , 6,6,6,6,6 },
372
           { 1 , 6,6,6,6,6 },
373
374
           { 2 , 6,6,6,6,6 },
375
           { 2 , 6,6,6,6,6 },
376
           { 2 , 6,6,6,6,6 },
377
           { 2 , 6,6,6,6,6 },
378
379
           { 3 , 6,6,6,6,6 },
380
           { 3 , 6,6,6,6,6 },
381
           { 3 , 6,6,6,6,6 },
382
           { 3 , 6,6,6,6,6 },
383
384
           { 4 , 6,6,6,6,6 },
385
           { 4 , 6,6,6,6,6 },
386
           { 4 , 6,6,6,6,6 },
387
           { 4 , 6,6,6,6,6 },
388
389
           { 5 , 6,6,6,6,6 },
390
           { 5 , 6,6,6,6,6 },
391
           { 5 , 6,6,6,6,6 },
392
           { 5 , 6,6,6,6,6 },
393
         };
394
      }
395
396 ee35e63c Leszek Koltunski
    return mFaceMap[cubit][cubitface];
397
    }
398
399
///////////////////////////////////////////////////////////////////////////////////////////////////
400
401 9c06394a Leszek Koltunski
  int getColor(int face)
402 ee35e63c Leszek Koltunski
    {
403 9c06394a Leszek Koltunski
    return FACE_COLORS[face];
404
    }
405 ee35e63c Leszek Koltunski
406 9c06394a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
407
408
  ObjectSticker retSticker(int face)
409
    {
410 85449b44 Leszek Koltunski
    if( mStickers==null )
411
      {
412
      float[][] STICKERS = new float[][] { { -0.5f, 0.25f, 0.25f, -0.5f, 0.25f, 0.25f } };
413
      float radius = 0.03f;
414
      float stroke = 0.05f;
415
      float[] radii = new float[] {radius,radius,radius};
416
      mStickers = new ObjectSticker[STICKERS.length];
417
      mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke);
418
      }
419
420 abf36986 Leszek Koltunski
    return mStickers[face/NUM_FACE_COLORS];
421 ee35e63c Leszek Koltunski
    }
422
423
///////////////////////////////////////////////////////////////////////////////////////////////////
424
425
  float returnMultiplier()
426
    {
427
    return 2.0f;
428
    }
429
430
///////////////////////////////////////////////////////////////////////////////////////////////////
431 e1dc3366 Leszek Koltunski
// PUBLIC API
432 ee35e63c Leszek Koltunski
433 e1dc3366 Leszek Koltunski
  public Static3D[] getRotationAxis()
434
    {
435
    return ROT_AXIS;
436
    }
437
438
///////////////////////////////////////////////////////////////////////////////////////////////////
439
440
  public int[] getBasicAngle()
441
    {
442 85449b44 Leszek Koltunski
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 2,2,2,2,2,2 };
443
    return mBasicAngle;
444 e1dc3366 Leszek Koltunski
    }
445
446 6fd4a72c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
447
448
  public int getObjectName(int numLayers)
449
    {
450
    return R.string.heli3;
451
    }
452
453
///////////////////////////////////////////////////////////////////////////////////////////////////
454
455
  public int getInventor(int numLayers)
456
    {
457
    return R.string.heli3_inventor;
458
    }
459
460
///////////////////////////////////////////////////////////////////////////////////////////////////
461
462
  public int getComplexity(int numLayers)
463
    {
464
    return 8;
465
    }
466 ee35e63c Leszek Koltunski
}