Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyHelicopter.java @ 41c8d4d8

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 android.content.res.Resources;
23

    
24
import org.distorted.helpers.ObjectShape;
25
import org.distorted.helpers.ObjectSticker;
26
import org.distorted.helpers.ScrambleState;
27
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
import org.distorted.main.R;
33

    
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35

    
36
public class TwistyHelicopter extends TwistyObject
37
{
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
           COLOR_YELLOW, COLOR_WHITE,
52
           COLOR_BLUE  , COLOR_GREEN,
53
           COLOR_RED   , COLOR_ORANGE
54
         };
55

    
56
  private static final int FACES_PER_CUBIT =6;
57

    
58
  private ScrambleState[] mStates;
59
  private int[] mBasicAngle;
60
  private Static4D[] mQuats;
61
  private float[][] mCenters;
62
  private int[] mQuatIndices;
63
  private int[][] mFaceMap;
64
  private ObjectSticker[] mStickers;
65

    
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67

    
68
  TwistyHelicopter(int size, Static4D quat, DistortedTexture texture,
69
                   MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
70
    {
71
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.HELI, res, scrWidth);
72
    }
73

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

    
76
  ScrambleState[] getScrambleStates()
77
    {
78
    if( mStates==null )
79
      {
80
      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
    }
100

    
101
///////////////////////////////////////////////////////////////////////////////////////////////////
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
///////////////////////////////////////////////////////////////////////////////////////////////////
137

    
138
  int[] getSolvedQuats(int cubit, int numLayers)
139
    {
140
    if( mQuats==null ) initializeQuats();
141
    int status = retCubitSolvedStatus(cubit,numLayers);
142
    return status<0 ? null : buildSolvedQuats(MovementHelicopter.FACE_AXIS[status],mQuats);
143
    }
144

    
145
///////////////////////////////////////////////////////////////////////////////////////////////////
146

    
147
  float getScreenRatio()
148
    {
149
    return 0.5f;
150
    }
151

    
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153

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

    
160
///////////////////////////////////////////////////////////////////////////////////////////////////
161

    
162
  boolean shouldResetTextureMaps()
163
    {
164
    return false;
165
    }
166

    
167
///////////////////////////////////////////////////////////////////////////////////////////////////
168

    
169
  int getNumFaceColors()
170
    {
171
    return FACE_COLORS.length;
172
    }
173

    
174
///////////////////////////////////////////////////////////////////////////////////////////////////
175

    
176
  int getSolvedFunctionIndex()
177
    {
178
    return 0;
179
    }
180

    
181
///////////////////////////////////////////////////////////////////////////////////////////////////
182

    
183
  int getNumStickerTypes(int numLayers)
184
    {
185
    return 1;
186
    }
187

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

    
190
  float[][] getCuts(int size)
191
    {
192
    float[] cut = new float[] { -3*SQ2/4, +3*SQ2/4 };
193
    return new float[][] { cut,cut,cut,cut,cut,cut };
194
    }
195

    
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197

    
198
  int getNumCubitFaces()
199
    {
200
    return FACES_PER_CUBIT;
201
    }
202

    
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204

    
205
  float[][] getCubitPositions(int size)
206
    {
207
    if( mCenters==null )
208
      {
209
      float DIST_CORNER = 1.50f;
210
      float DIST_CENTER = 1.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
    }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
  ObjectShape getObjectShape(int cubit, int numLayers)
262
    {
263
    int variant = getCubitVariant(cubit,numLayers);
264

    
265
    if( variant==0 )
266
      {
267
      double[][] vertices = new double[][]
268
          {
269
            {-1.50f, 0.00f, 0.00f},
270
            { 0.00f,-1.50f, 0.00f},
271
            { 0.00f, 0.00f,-1.50f},
272
            {-0.75f,-0.75f,-0.75f},
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
      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
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
288
      float[][] corners   = new float[][] { {0.08f,0.20f} };
289
      int[] cornerIndices = new int[] { 0,0,0,0,0 };
290
      float[][] centers   = new float[][] { {-0.75f, -0.75f, -0.75f} };
291
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
292
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
293
      }
294
    else
295
      {
296
      double[][] vertices = new double[][]
297
          {
298
            { 0.50f, 0.50f, 0.00f },
299
            {-1.00f, 0.50f, 0.00f },
300
            { 0.50f,-1.00f, 0.00f },
301
            {-0.25f,-0.25f,-0.75f },
302
          };
303

    
304
      int[][] vert_indices = new int[][]
305
          {
306
            { 0,1,2 },
307
            { 2,1,3 },
308
            { 0,1,3 },
309
            { 2,0,3 }
310
          };
311

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

    
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323

    
324
  Static4D getQuat(int cubit, int numLayers)
325
    {
326
    if( mQuats==null ) initializeQuats();
327
    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 };
328
    return mQuats[mQuatIndices[cubit]];
329
    }
330

    
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

    
333
  int getNumCubitVariants(int numLayers)
334
    {
335
    return 2;
336
    }
337

    
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339

    
340
  int getCubitVariant(int cubit, int numLayers)
341
    {
342
    return cubit<8 ? 0:1;
343
    }
344

    
345
///////////////////////////////////////////////////////////////////////////////////////////////////
346

    
347
  int getFaceColor(int cubit, int cubitface, int size)
348
    {
349
    if( mFaceMap==null )
350
      {
351
      mFaceMap = new int[][]
352
         {
353
           { 4,2,0, 6,6,6 },
354
           { 0,2,5, 6,6,6 },
355
           { 4,0,3, 6,6,6 },
356
           { 5,3,0, 6,6,6 },
357
           { 1,2,4, 6,6,6 },
358
           { 5,2,1, 6,6,6 },
359
           { 4,3,1, 6,6,6 },
360
           { 1,3,5, 6,6,6 },
361

    
362
           { 0 , 6,6,6,6,6 },
363
           { 0 , 6,6,6,6,6 },
364
           { 0 , 6,6,6,6,6 },
365
           { 0 , 6,6,6,6,6 },
366

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

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

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

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

    
387
           { 5 , 6,6,6,6,6 },
388
           { 5 , 6,6,6,6,6 },
389
           { 5 , 6,6,6,6,6 },
390
           { 5 , 6,6,6,6,6 },
391
         };
392
      }
393

    
394
    return mFaceMap[cubit][cubitface];
395
    }
396

    
397
///////////////////////////////////////////////////////////////////////////////////////////////////
398

    
399
  int getColor(int face)
400
    {
401
    return FACE_COLORS[face];
402
    }
403

    
404
///////////////////////////////////////////////////////////////////////////////////////////////////
405

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

    
418
    return mStickers[face/NUM_FACE_COLORS];
419
    }
420

    
421
///////////////////////////////////////////////////////////////////////////////////////////////////
422

    
423
  float returnMultiplier()
424
    {
425
    return 2.0f;
426
    }
427

    
428
///////////////////////////////////////////////////////////////////////////////////////////////////
429
// PUBLIC API
430

    
431
  public Static3D[] getRotationAxis()
432
    {
433
    return ROT_AXIS;
434
    }
435

    
436
///////////////////////////////////////////////////////////////////////////////////////////////////
437

    
438
  public int[] getBasicAngle()
439
    {
440
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 2,2,2,2,2,2 };
441
    return mBasicAngle;
442
    }
443

    
444
///////////////////////////////////////////////////////////////////////////////////////////////////
445

    
446
  public int getObjectName(int numLayers)
447
    {
448
    return R.string.heli3;
449
    }
450

    
451
///////////////////////////////////////////////////////////////////////////////////////////////////
452

    
453
  public int getInventor(int numLayers)
454
    {
455
    return R.string.heli3_inventor;
456
    }
457

    
458
///////////////////////////////////////////////////////////////////////////////////////////////////
459

    
460
  public int getComplexity(int numLayers)
461
    {
462
    return 8;
463
    }
464
}
(27-27/43)