Project

General

Profile

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

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

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.library.main.DistortedEffects;
27
import org.distorted.library.main.DistortedTexture;
28
import org.distorted.library.mesh.MeshSquare;
29
import org.distorted.library.type.Static3D;
30
import org.distorted.library.type.Static4D;
31
import org.distorted.main.R;
32

    
33
import java.util.Random;
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

    
37
public class TwistyHelicopter extends TwistyObject
38
{
39
  private static final int FACES_PER_CUBIT =6;
40

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

    
52
  private static final int[] BASIC_ANGLE = new int[] { 2,2,2,2,2,2 };
53

    
54
  private static final int[] FACE_COLORS = new int[]
55
         {
56
           COLOR_YELLOW, COLOR_WHITE,
57
           COLOR_BLUE  , COLOR_GREEN,
58
           COLOR_RED   , COLOR_ORANGE
59
         };
60

    
61
  // All legal rotation quats of a HELICOPTER (same as the Cube!)
62
  private static final Static4D[] QUATS = new Static4D[]
63
         {
64
           new Static4D( 0.00f,  0.00f,  0.00f,  1.00f ),
65
           new Static4D( 1.00f,  0.00f,  0.00f,  0.00f ),
66
           new Static4D( 0.00f,  1.00f,  0.00f,  0.00f ),
67
           new Static4D( 0.00f,  0.00f,  1.00f,  0.00f ),
68

    
69
           new Static4D( SQ2/2,  SQ2/2,  0.00f,  0.00f ),
70
           new Static4D( SQ2/2, -SQ2/2,  0.00f,  0.00f ),
71
           new Static4D( SQ2/2,  0.00f,  SQ2/2,  0.00f ),
72
           new Static4D( SQ2/2,  0.00f, -SQ2/2,  0.00f ),
73
           new Static4D( SQ2/2,  0.00f,  0.00f,  SQ2/2 ),
74
           new Static4D( SQ2/2,  0.00f,  0.00f, -SQ2/2 ),
75
           new Static4D( 0.00f,  SQ2/2,  SQ2/2,  0.00f ),
76
           new Static4D( 0.00f,  SQ2/2, -SQ2/2,  0.00f ),
77
           new Static4D( 0.00f,  SQ2/2,  0.00f,  SQ2/2 ),
78
           new Static4D( 0.00f,  SQ2/2,  0.00f, -SQ2/2 ),
79
           new Static4D( 0.00f,  0.00f,  SQ2/2,  SQ2/2 ),
80
           new Static4D( 0.00f,  0.00f,  SQ2/2, -SQ2/2 ),
81

    
82
           new Static4D( 0.50f,  0.50f,  0.50f,  0.50f ),
83
           new Static4D( 0.50f,  0.50f,  0.50f, -0.50f ),
84
           new Static4D( 0.50f,  0.50f, -0.50f,  0.50f ),
85
           new Static4D( 0.50f,  0.50f, -0.50f, -0.50f ),
86
           new Static4D( 0.50f, -0.50f,  0.50f,  0.50f ),
87
           new Static4D( 0.50f, -0.50f,  0.50f, -0.50f ),
88
           new Static4D( 0.50f, -0.50f, -0.50f,  0.50f ),
89
           new Static4D( 0.50f, -0.50f, -0.50f, -0.50f )
90
         };
91

    
92
  private static final float DIST_CORNER = 0.50f;
93
  private static final float DIST_CENTER = 0.50f;
94
  private static final float XY_CENTER   = DIST_CORNER/3;
95

    
96
  // centers of the 8 corners + 6*4 face triangles ( i.e. of the all 32 cubits)
97
  private static final float[][] CENTERS = new float[][]
98
         {
99
             {   DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
100
             {   DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
101
             {   DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
102
             {   DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
103
             {  -DIST_CORNER,   DIST_CORNER,   DIST_CORNER },
104
             {  -DIST_CORNER,   DIST_CORNER,  -DIST_CORNER },
105
             {  -DIST_CORNER,  -DIST_CORNER,   DIST_CORNER },
106
             {  -DIST_CORNER,  -DIST_CORNER,  -DIST_CORNER },
107

    
108
             {   DIST_CENTER,     XY_CENTER,     XY_CENTER },
109
             {   DIST_CENTER,     XY_CENTER,    -XY_CENTER },
110
             {   DIST_CENTER,    -XY_CENTER,     XY_CENTER },
111
             {   DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
112

    
113
             {  -DIST_CENTER,     XY_CENTER,     XY_CENTER },
114
             {  -DIST_CENTER,     XY_CENTER,    -XY_CENTER },
115
             {  -DIST_CENTER,    -XY_CENTER,     XY_CENTER },
116
             {  -DIST_CENTER,    -XY_CENTER,    -XY_CENTER },
117

    
118
             {   XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
119
             {   XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
120
             {  -XY_CENTER  ,   DIST_CENTER,     XY_CENTER },
121
             {  -XY_CENTER  ,   DIST_CENTER,    -XY_CENTER },
122

    
123
             {   XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
124
             {   XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
125
             {  -XY_CENTER  ,  -DIST_CENTER,     XY_CENTER },
126
             {  -XY_CENTER  ,  -DIST_CENTER,    -XY_CENTER },
127

    
128
             {   XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
129
             {   XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
130
             {  -XY_CENTER  ,     XY_CENTER,   DIST_CENTER },
131
             {  -XY_CENTER  ,    -XY_CENTER,   DIST_CENTER },
132

    
133
             {   XY_CENTER  ,     XY_CENTER,  -DIST_CENTER },
134
             {   XY_CENTER  ,    -XY_CENTER,  -DIST_CENTER },
135
             {  -XY_CENTER  ,     XY_CENTER,  -DIST_CENTER },
136
             {  -XY_CENTER  ,    -XY_CENTER,  -DIST_CENTER },
137
         };
138

    
139
  // Colors of the faces of cubits. Each cubit has 6 faces
140
  private static final int[][] mFaceMap = new int[][]
141
         {
142
           { 4,2,0, 6,6,6 },
143
           { 0,2,5, 6,6,6 },
144
           { 4,0,3, 6,6,6 },
145
           { 5,3,0, 6,6,6 },
146
           { 1,2,4, 6,6,6 },
147
           { 5,2,1, 6,6,6 },
148
           { 4,3,1, 6,6,6 },
149
           { 1,3,5, 6,6,6 },
150

    
151
           { 0 , 6,6,6,6,6 },
152
           { 0 , 6,6,6,6,6 },
153
           { 0 , 6,6,6,6,6 },
154
           { 0 , 6,6,6,6,6 },
155

    
156
           { 1 , 6,6,6,6,6 },
157
           { 1 , 6,6,6,6,6 },
158
           { 1 , 6,6,6,6,6 },
159
           { 1 , 6,6,6,6,6 },
160

    
161
           { 2 , 6,6,6,6,6 },
162
           { 2 , 6,6,6,6,6 },
163
           { 2 , 6,6,6,6,6 },
164
           { 2 , 6,6,6,6,6 },
165

    
166
           { 3 , 6,6,6,6,6 },
167
           { 3 , 6,6,6,6,6 },
168
           { 3 , 6,6,6,6,6 },
169
           { 3 , 6,6,6,6,6 },
170

    
171
           { 4 , 6,6,6,6,6 },
172
           { 4 , 6,6,6,6,6 },
173
           { 4 , 6,6,6,6,6 },
174
           { 4 , 6,6,6,6,6 },
175

    
176
           { 5 , 6,6,6,6,6 },
177
           { 5 , 6,6,6,6,6 },
178
           { 5 , 6,6,6,6,6 },
179
           { 5 , 6,6,6,6,6 },
180
         };
181

    
182
  private static final int[] QUAT_INDICES =
183
      { 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 };
184

    
185
  private static final double[][] VERTICES_CORNER = new double[][]
186
          {
187
            {-0.50f, 0.00f, 0.00f},
188
            { 0.00f,-0.50f, 0.00f},
189
            { 0.00f, 0.00f,-0.50f},
190
            {-0.25f,-0.25f,-0.25f},
191
            { 0.00f, 0.00f, 0.00f}
192
          };
193

    
194
  private static final int[][] VERT_INDEXES_CORNER = new int[][]
195
          {
196
            {0,1,4},
197
            {2,0,4},
198
            {1,2,4},
199
            {3,1,0},
200
            {3,2,1},
201
            {3,0,2}
202
          };
203

    
204
  private static final float E = 0.1666666f;
205

    
206
  private static final double[][] VERTICES_FACE = new double[][]
207
          {
208
            { 0.00f +E, 0.00f +E, 0.00f },
209
            {-0.50f +E, 0.00f +E, 0.00f },
210
            { 0.00f +E,-0.50f +E, 0.00f },
211
            {-0.25f +E,-0.25f +E,-0.25f },
212
          };
213

    
214
  private static final int[][] VERT_INDEXES_FACE = new int[][]
215
          {
216
            { 0,1,2 },
217
            { 2,1,3 },
218
            { 0,1,3 },
219
            { 2,0,3 }
220
          };
221

    
222
  private static final float[][] STICKERS = new float[][]
223
          {
224
            { -0.5f, 0.25f, 0.25f, -0.5f, 0.25f, 0.25f }
225
          };
226

    
227
  private static final ObjectSticker[] mStickers;
228

    
229
  static
230
    {
231
    float radius = 0.03f;
232
    float stroke = 0.05f;
233
    float[] radii = new float[] {radius,radius,radius};
234
    mStickers = new ObjectSticker[STICKERS.length];
235
    mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke);
236
    }
237

    
238
///////////////////////////////////////////////////////////////////////////////////////////////////
239

    
240
  TwistyHelicopter(int size, Static4D quat, DistortedTexture texture,
241
                   MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
242
    {
243
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.HELI, res, scrWidth);
244
    }
245

    
246
///////////////////////////////////////////////////////////////////////////////////////////////////
247

    
248
  int[] getSolvedQuats(int cubit, int numLayers)
249
    {
250
    int status = retCubitSolvedStatus(cubit,numLayers);
251
    return status<0 ? null : buildSolvedQuats(MovementHelicopter.FACE_AXIS[status],QUATS);
252
    }
253

    
254
///////////////////////////////////////////////////////////////////////////////////////////////////
255

    
256
  float getScreenRatio()
257
    {
258
    return 1.6f;
259
    }
260

    
261
///////////////////////////////////////////////////////////////////////////////////////////////////
262

    
263
  Static4D[] getQuats()
264
    {
265
    return QUATS;
266
    }
267

    
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269

    
270
  boolean shouldResetTextureMaps()
271
    {
272
    return false;
273
    }
274

    
275
///////////////////////////////////////////////////////////////////////////////////////////////////
276

    
277
  int getNumFaces()
278
    {
279
    return FACE_COLORS.length;
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283

    
284
  int getNumStickerTypes(int numLayers)
285
    {
286
    return STICKERS.length;
287
    }
288

    
289
///////////////////////////////////////////////////////////////////////////////////////////////////
290

    
291
  float[][] getCuts(int size)
292
    {
293
    float[] cut = new float[] { -SQ2/4, +SQ2/4 };
294
    return new float[][] { cut,cut,cut,cut,cut,cut };
295
    }
296

    
297
///////////////////////////////////////////////////////////////////////////////////////////////////
298

    
299
  int getNumCubitFaces()
300
    {
301
    return FACES_PER_CUBIT;
302
    }
303

    
304
///////////////////////////////////////////////////////////////////////////////////////////////////
305

    
306
  float[][] getCubitPositions(int size)
307
    {
308
    return CENTERS;
309
    }
310

    
311
///////////////////////////////////////////////////////////////////////////////////////////////////
312

    
313
  ObjectShape getObjectShape(int cubit, int numLayers)
314
    {
315
    int variant = getCubitVariant(cubit,numLayers);
316

    
317
    if( variant==0 )
318
      {
319
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,7,3,3}, {0.000f, 0,1.00f,0.0f,3,1,5} };
320
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
321
      float[][] corners   = new float[][] { {0.08f,0.15f}, {0.08f,0.20f} };
322
      int[] cornerIndices = new int[] { 1,1,1,0,0 };
323
      float[][] centers   = new float[][] { {-0.25f, -0.25f, -0.25f} };
324
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
325
      return new ObjectShape(VERTICES_CORNER,VERT_INDEXES_CORNER,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
326
      }
327
    else
328
      {
329
      float[][] bands     = new float[][] { {0.028f,35,0.16f,0.7f,7,3,3}, {0.000f, 0,1.00f,0.0f,3,1,3} };
330
      int[] bandIndices   = new int[] { 0,1,1,1 };
331
      float[][] corners   = new float[][] { {0.06f,0.15f}, {0.06f,0.20f} };
332
      int[] cornerIndices = new int[] { 0,1,1,-1 };
333
      float[][] centers   = new float[][] { {-1.0f/12, -1.0f/12, -1.0f/4} };
334
      int[] centerIndices = new int[] { 0,0,0,-1 };
335
      return new ObjectShape(VERTICES_FACE,VERT_INDEXES_FACE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
336
      }
337
    }
338

    
339
///////////////////////////////////////////////////////////////////////////////////////////////////
340

    
341
  Static4D getQuat(int cubit, int numLayers)
342
    {
343
    return QUATS[QUAT_INDICES[cubit]];
344
    }
345

    
346
///////////////////////////////////////////////////////////////////////////////////////////////////
347

    
348
  int getNumCubitVariants(int numLayers)
349
    {
350
    return 2;
351
    }
352

    
353
///////////////////////////////////////////////////////////////////////////////////////////////////
354

    
355
  int getCubitVariant(int cubit, int numLayers)
356
    {
357
    return cubit<8 ? 0:1;
358
    }
359

    
360
///////////////////////////////////////////////////////////////////////////////////////////////////
361

    
362
  int getFaceColor(int cubit, int cubitface, int size)
363
    {
364
    return mFaceMap[cubit][cubitface];
365
    }
366

    
367
///////////////////////////////////////////////////////////////////////////////////////////////////
368

    
369
  int getColor(int face)
370
    {
371
    return FACE_COLORS[face];
372
    }
373

    
374
///////////////////////////////////////////////////////////////////////////////////////////////////
375

    
376
  ObjectSticker retSticker(int face)
377
    {
378
    return mStickers[face/NUM_FACES];
379
    }
380

    
381
///////////////////////////////////////////////////////////////////////////////////////////////////
382

    
383
  float returnMultiplier()
384
    {
385
    return 2.0f;
386
    }
387

    
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389
// PUBLIC API
390

    
391
  public Static3D[] getRotationAxis()
392
    {
393
    return ROT_AXIS;
394
    }
395

    
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397

    
398
  public int[] getBasicAngle()
399
    {
400
    return BASIC_ANGLE;
401
    }
402

    
403
///////////////////////////////////////////////////////////////////////////////////////////////////
404

    
405
  public void randomizeNewScramble(int[][] scramble, Random rnd, int curr, int total)
406
    {
407
    if( curr==0 )
408
      {
409
      scramble[curr][0] = rnd.nextInt(NUM_AXIS);
410
      }
411
    else
412
      {
413
      int newVector = rnd.nextInt(NUM_AXIS -2);
414

    
415
      switch(scramble[curr-1][0])
416
        {
417
        case  0:
418
        case  1: scramble[curr][0] = newVector+2;
419
                 break;
420
        case  2:
421
        case  3: scramble[curr][0] = (newVector==0 || newVector==1) ? newVector:newVector+2;
422
                 break;
423
        default: scramble[curr][0] = newVector;
424
                 break;
425
        }
426
      }
427

    
428
    scramble[curr][1] = rnd.nextFloat()<=0.5f ? 0 : 2;
429

    
430
    switch( rnd.nextInt(2) )
431
      {
432
      case 0: scramble[curr][2] = -1; break;
433
      case 1: scramble[curr][2] =  1; break;
434
      }
435
    }
436

    
437
///////////////////////////////////////////////////////////////////////////////////////////////////
438

    
439
  public int getObjectName(int numLayers)
440
    {
441
    return R.string.heli3;
442
    }
443

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

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

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

    
453
  public int getComplexity(int numLayers)
454
    {
455
    return 8;
456
    }
457
}
(27-27/41)