Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / ObjectList.java @ 4c0a6d97

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

    
31
import java.lang.reflect.Field;
32

    
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34

    
35
public enum ObjectList
36
  {
37
  CUBE (
38
         new int[][] {
39
                       {2 , 12, R.raw.cube2, R.drawable.ui_small_cube2, R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2, R.drawable.ui_huge_cube2} ,
40
                       {3 , 16, R.raw.cube3, R.drawable.ui_small_cube3, R.drawable.ui_medium_cube3, R.drawable.ui_big_cube3, R.drawable.ui_huge_cube3} ,
41
                       {4 , 20, R.raw.cube4, R.drawable.ui_small_cube4, R.drawable.ui_medium_cube4, R.drawable.ui_big_cube4, R.drawable.ui_huge_cube4} ,
42
                       {5 , 24, R.raw.cube5, R.drawable.ui_small_cube5, R.drawable.ui_medium_cube5, R.drawable.ui_big_cube5, R.drawable.ui_huge_cube5}
43
                     },
44
         TwistyCube.class,
45
         new MovementCube(),
46
         0,
47
         60
48
       ),
49

    
50
  PYRA (
51
         new int[][] {
52
                       {3 , 10, R.raw.pyra3, R.drawable.ui_small_pyra3, R.drawable.ui_medium_pyra3, R.drawable.ui_big_pyra3, R.drawable.ui_huge_pyra3} ,
53
                       {4 , 15, R.raw.pyra4, R.drawable.ui_small_pyra4, R.drawable.ui_medium_pyra4, R.drawable.ui_big_pyra4, R.drawable.ui_huge_pyra4} ,
54
                       {5 , 20, R.raw.pyra5, R.drawable.ui_small_pyra5, R.drawable.ui_medium_pyra5, R.drawable.ui_big_pyra5, R.drawable.ui_huge_pyra5}
55
                     },
56
         TwistyPyraminx.class,
57
         new MovementPyraminx(),
58
         1,
59
         30
60
       ),
61

    
62
  DIAM (
63
         new int[][] {
64
                       {2 , 10, R.raw.diamond, R.drawable.ui_small_diam, R.drawable.ui_medium_diam, R.drawable.ui_big_diam, R.drawable.ui_huge_diam} ,
65
                     },
66
         TwistyDiamond.class,
67
         new MovementDiamond(),
68
         1,
69
         60
70
       ),
71

    
72
  DINO (
73
         new int[][] {
74
                       {3 , 10, R.raw.dino, R.drawable.ui_small_dino, R.drawable.ui_medium_dino, R.drawable.ui_big_dino, R.drawable.ui_huge_dino} ,
75
                     },
76
         TwistyDino6.class,
77
         new MovementDino(),
78
         2,
79
         60
80
       ),
81

    
82
  DIN4 (
83
         new int[][] {
84
                       {3 ,  7, R.raw.dino, R.drawable.ui_small_din4, R.drawable.ui_medium_din4, R.drawable.ui_big_din4, R.drawable.ui_huge_din4} ,
85
                     },
86
         TwistyDino4.class,
87
         new MovementDino(),
88
         2,
89
         60
90
       ),
91

    
92
  REDI (
93
         new int[][] {
94
                       {3 , 14, R.raw.redi, R.drawable.ui_small_redi, R.drawable.ui_medium_redi, R.drawable.ui_big_redi, R.drawable.ui_huge_redi} ,
95
                     },
96
         TwistyRedi.class,
97
         new MovementRedi(),
98
         2,
99
         60
100
       ),
101

    
102
  HELI (
103
         new int[][] {
104
                       {3 , 18, R.raw.heli, R.drawable.ui_small_heli, R.drawable.ui_medium_heli, R.drawable.ui_big_heli, R.drawable.ui_huge_heli} ,
105
                     },
106
         TwistyHelicopter.class,
107
         new MovementHelicopter(),
108
         2,
109
         60
110
       ),
111

    
112
  SKEW (
113
         new int[][] {
114
                       {2 , 11, R.raw.skewb, R.drawable.ui_small_skewb, R.drawable.ui_medium_skewb, R.drawable.ui_big_skewb, R.drawable.ui_huge_skewb} ,
115
                       {3 , 17, R.raw.skewm, R.drawable.ui_small_skewm, R.drawable.ui_medium_skewm, R.drawable.ui_big_skewm, R.drawable.ui_huge_skewm} ,
116
                     },
117
         TwistySkewb.class,
118
         new MovementSkewb(),
119
         3,
120
         60
121
       ),
122

    
123
  IVY  (
124
         new int[][] {
125
                       {2 , 8, R.raw.ivy, R.drawable.ui_small_ivy, R.drawable.ui_medium_ivy, R.drawable.ui_big_ivy, R.drawable.ui_huge_ivy} ,
126
                     },
127
         TwistyIvy.class,
128
         new MovementIvy(),
129
         3,
130
         60
131
       ),
132

    
133
  REX  (
134
         new int[][] {
135
                       {3 , 16, R.raw.rex, R.drawable.ui_small_rex, R.drawable.ui_medium_rex, R.drawable.ui_big_rex, R.drawable.ui_huge_rex} ,
136
                     },
137
         TwistyRex.class,
138
         new MovementRex(),
139
         3,
140
         60
141
       ),
142

    
143
  KILO (
144
         new int[][] {
145
                       {3 , 18, R.raw.kilo3, R.drawable.ui_small_kilo3, R.drawable.ui_medium_kilo3, R.drawable.ui_big_kilo3, R.drawable.ui_huge_kilo3} ,
146
                     },
147
         TwistyKilominx.class,
148
         new MovementMinx(),
149
         4,
150
         30
151
       ),
152

    
153
  MEGA (
154
         new int[][] {
155
                       {3 , 21, R.raw.mega3, R.drawable.ui_small_mega3, R.drawable.ui_medium_mega3, R.drawable.ui_big_mega3, R.drawable.ui_huge_mega3} ,
156
                       {5 , 35, R.raw.mega5, R.drawable.ui_small_mega5, R.drawable.ui_medium_mega5, R.drawable.ui_big_mega5, R.drawable.ui_huge_mega5} ,
157
                     },
158
         TwistyMegaminx.class,
159
         new MovementMinx(),
160
         4,
161
         30
162
       ),
163

    
164
  BAN1 (
165
         new int[][] {
166
                       {3 , 16, R.raw.mega3, R.drawable.ui_small_mega3, R.drawable.ui_medium_mega3, R.drawable.ui_big_mega3, R.drawable.ui_huge_mega3} ,
167
                     },
168
         TwistyBandagedFused.class,
169
         new MovementCube(),
170
         5,
171
         60
172
       ),
173
  ;
174

    
175
  public static final int NUM_OBJECTS = values().length;
176
  public static final int MAX_NUM_OBJECTS;
177
  public static final int MAX_LEVEL;
178
  public static final int MAX_OBJECT_SIZE;
179

    
180
  private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mHugeIconIDs, mResourceIDs;
181
  private final Class<? extends TwistyObject> mObjectClass;
182
  private final Movement mObjectMovementClass;
183
  private final int mColumn, mNumSizes;
184
  private final int mFOV;
185

    
186
  private static final ObjectList[] objects;
187
  private static int mNumAll;
188
  private static int[] mIndices;
189
  private static int mColCount, mRowCount;
190

    
191
  static
192
    {
193
    mNumAll = 0;
194
    int num, i = 0;
195
    objects = new ObjectList[NUM_OBJECTS];
196
    int maxNum  = Integer.MIN_VALUE;
197
    int maxLevel= Integer.MIN_VALUE;
198
    int maxSize = Integer.MIN_VALUE;
199

    
200
    for(ObjectList object: ObjectList.values())
201
      {
202
      objects[i] = object;
203
      i++;
204
      num = object.mObjectSizes.length;
205
      mNumAll += num;
206
      if( num> maxNum ) maxNum = num;
207

    
208
      for(int j=0; j<num; j++)
209
        {
210
        if( object.mMaxLevels[j] > maxLevel ) maxLevel = object.mMaxLevels[j];
211
        if( object.mObjectSizes[j] > maxSize) maxSize  = object.mObjectSizes[j];
212
        }
213
      }
214

    
215
    MAX_NUM_OBJECTS = maxNum;
216
    MAX_LEVEL       = maxLevel;
217
    MAX_OBJECT_SIZE = maxSize;
218
    }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221

    
222
  private static void setUpColAndRow()
223
    {
224
    mIndices = new int[NUM_OBJECTS];
225
    mColCount= 0;
226

    
227
    for(int obj=0; obj<NUM_OBJECTS; obj++)
228
      {
229
      mIndices[obj] = objects[obj].mColumn;
230
      if( mIndices[obj]>=mColCount ) mColCount = mIndices[obj]+1;
231
      }
232

    
233
    mRowCount = 0;
234

    
235
    for(int col=0; col<mColCount; col++)
236
      {
237
      int numObjects = computeNumObjectsInColumn(col);
238
      if( numObjects>mRowCount ) mRowCount = numObjects;
239
      }
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243

    
244
  private static int computeNumObjectsInColumn(int column)
245
    {
246
    int num=0;
247

    
248
    for(int object=0; object<NUM_OBJECTS; object++)
249
      {
250
      if( objects[object].mColumn == column )
251
        {
252
        num += objects[object].mNumSizes;
253
        }
254
      }
255

    
256
    return num;
257
    }
258

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

    
261
  public static int getColumnCount()
262
    {
263
    if( mIndices==null ) setUpColAndRow();
264

    
265
    return mColCount;
266
    }
267

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

    
270
  public static int getRowCount()
271
    {
272
    if( mIndices==null ) setUpColAndRow();
273

    
274
    return mRowCount;
275
    }
276

    
277
///////////////////////////////////////////////////////////////////////////////////////////////////
278

    
279
  public static int[] getIndices()
280
    {
281
    if( mIndices==null ) setUpColAndRow();
282

    
283
    return mIndices;
284
    }
285

    
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287

    
288
  public static ObjectList getObject(int ordinal)
289
    {
290
    return ordinal>=0 && ordinal<NUM_OBJECTS ? objects[ordinal] : CUBE;
291
    }
292

    
293
///////////////////////////////////////////////////////////////////////////////////////////////////
294

    
295
  public static int pack(int object, int sizeIndex)
296
    {
297
    int ret = 0;
298
    for(int i=0; i<object; i++) ret += objects[i].mObjectSizes.length;
299

    
300
    return ret+sizeIndex;
301
    }
302

    
303
///////////////////////////////////////////////////////////////////////////////////////////////////
304

    
305
  public static int unpackSizeIndex(int number)
306
    {
307
    int num;
308

    
309
    for(int i=0; i<NUM_OBJECTS; i++)
310
      {
311
      num = objects[i].mObjectSizes.length;
312
      if( number<num ) return number;
313
      number -= num;
314
      }
315

    
316
    return -1;
317
    }
318

    
319
///////////////////////////////////////////////////////////////////////////////////////////////////
320

    
321
  public static int unpackObject(int number)
322
    {
323
    int num;
324

    
325
    for(int i=0; i<NUM_OBJECTS; i++)
326
      {
327
      num = objects[i].mObjectSizes.length;
328
      if( number<num ) return i;
329
      number -= num;
330
      }
331

    
332
    return -1;
333
    }
334

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

    
337
  public static int unpackObjectFromString(String obj)
338
    {
339
    int u = obj.indexOf('_');
340
    int l = obj.length();
341

    
342
    if( u>0 )
343
      {
344
      String name = obj.substring(0,u);
345
      int size = Integer.parseInt( obj.substring(u+1,l) );
346

    
347
      for(int i=0; i<NUM_OBJECTS; i++)
348
        {
349
        if( objects[i].name().equals(name) )
350
          {
351
          int sizeIndex = getSizeIndex(i,size);
352
          return pack(i,sizeIndex);
353
          }
354
        }
355
      }
356

    
357
    return -1;
358
    }
359

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

    
362
  public static String getObjectList()
363
    {
364
    String name;
365
    StringBuilder list = new StringBuilder();
366
    int len;
367
    int[] sizes;
368

    
369
    for(int i=0; i<NUM_OBJECTS; i++)
370
      {
371
      sizes = objects[i].mObjectSizes;
372
      len   = sizes.length;
373
      name  = objects[i].name();
374

    
375
      for(int j=0; j<len; j++)
376
        {
377
        if( i>0 || j>0 ) list.append(',');
378
        list.append(name);
379
        list.append('_');
380
        list.append(sizes[j]);
381
        }
382
      }
383

    
384
    return list.toString();
385
    }
386

    
387
///////////////////////////////////////////////////////////////////////////////////////////////////
388

    
389
  public static int getTotal()
390
    {
391
    return mNumAll;
392
    }
393

    
394
///////////////////////////////////////////////////////////////////////////////////////////////////
395

    
396
  public static int getMaxLevel(int ordinal, int sizeIndex)
397
    {
398
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
399
      {
400
      int num = objects[ordinal].mObjectSizes.length;
401
      return sizeIndex>=0 && sizeIndex<num ? objects[ordinal].mMaxLevels[sizeIndex] : 0;
402
      }
403

    
404
    return 0;
405
    }
406

    
407
///////////////////////////////////////////////////////////////////////////////////////////////////
408

    
409
  public static int getOrdinal(String name)
410
    {
411
    for(int i=0; i<NUM_OBJECTS; i++)
412
      {
413
      if(objects[i].name().equals(name)) return i;
414
      }
415

    
416
    return -1;
417
    }
418

    
419
///////////////////////////////////////////////////////////////////////////////////////////////////
420

    
421
  public static int getSizeIndex(int ordinal, int size)
422
    {
423
    if( ordinal>=0 && ordinal<NUM_OBJECTS )
424
      {
425
      int[] sizes = objects[ordinal].getSizes();
426
      int len = sizes.length;
427

    
428
      for(int i=0; i<len; i++)
429
        {
430
        if( sizes[i]==size ) return i;
431
        }
432
      }
433

    
434
    return -1;
435
    }
436

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

    
439
  public static int[] retFaceColors(ObjectList object)
440
    {
441
    Field field;
442
    int[] faceColors=null;
443

    
444
    try
445
      {
446
      field = object.mObjectClass.getDeclaredField("FACE_COLORS");
447
      field.setAccessible(true);
448
      Object obj = field.get(null);
449
      faceColors = (int[]) obj;
450
      }
451
    catch(NoSuchFieldException ex)
452
      {
453
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": no such field exception getting field: "+ex.getMessage());
454
      }
455
    catch(IllegalAccessException ex)
456
      {
457
      android.util.Log.e("RubikObjectList", object.mObjectClass.getSimpleName()+": illegal access exception getting field: "+ex.getMessage());
458
      }
459

    
460
    return faceColors;
461
    }
462

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

    
465
  ObjectList(int[][] info, Class<? extends TwistyObject> object , Movement movement, int column, int fov)
466
    {
467
    mNumSizes = info.length;
468

    
469
    mObjectSizes  = new int[mNumSizes];
470
    mMaxLevels    = new int[mNumSizes];
471
    mResourceIDs  = new int[mNumSizes];
472
    mSmallIconIDs = new int[mNumSizes];
473
    mMediumIconIDs= new int[mNumSizes];
474
    mBigIconIDs   = new int[mNumSizes];
475
    mHugeIconIDs  = new int[mNumSizes];
476

    
477
    for(int i=0; i<mNumSizes; i++)
478
      {
479
      mObjectSizes[i]  = info[i][0];
480
      mMaxLevels[i]    = info[i][1];
481
      mResourceIDs[i]  = info[i][2];
482
      mSmallIconIDs[i] = info[i][3];
483
      mMediumIconIDs[i]= info[i][4];
484
      mBigIconIDs[i]   = info[i][5];
485
      mHugeIconIDs[i]  = info[i][6];
486
      }
487

    
488
    mObjectClass         = object;
489
    mObjectMovementClass = movement;
490
    mColumn              = column;
491
    mFOV                 = fov;
492
    }
493

    
494
///////////////////////////////////////////////////////////////////////////////////////////////////
495

    
496
  public int[] getSizes()
497
    {
498
    return mObjectSizes;
499
    }
500

    
501
///////////////////////////////////////////////////////////////////////////////////////////////////
502

    
503
  public int[] getMaxLevels()
504
    {
505
    return mMaxLevels;
506
    }
507

    
508
///////////////////////////////////////////////////////////////////////////////////////////////////
509

    
510
  public int getFOV()
511
    {
512
    return mFOV;
513
    }
514

    
515
///////////////////////////////////////////////////////////////////////////////////////////////////
516

    
517
  public int[] getIconIDs()
518
    {
519
    int size = RubikActivity.getDrawableSize();
520

    
521
    switch(size)
522
      {
523
      case 0 : return mSmallIconIDs;
524
      case 1 : return mMediumIconIDs;
525
      case 2 : return mBigIconIDs;
526
      default: return mHugeIconIDs;
527
      }
528
    }
529

    
530
///////////////////////////////////////////////////////////////////////////////////////////////////
531

    
532
  public int[] getResourceIDs()
533
    {
534
    return mResourceIDs;
535
    }
536

    
537
///////////////////////////////////////////////////////////////////////////////////////////////////
538

    
539
  public int getNumVariants()
540
    {
541
    return mObjectSizes.length;
542
    }
543

    
544
///////////////////////////////////////////////////////////////////////////////////////////////////
545

    
546
  public TwistyObject create(int size, Static4D quat, int[][] moves, Resources res, int scrWidth)
547
    {
548
    DistortedTexture texture = new DistortedTexture();
549
    DistortedEffects effects = new DistortedEffects();
550
    MeshSquare mesh          = new MeshSquare(20,20);   // mesh of the node, not of the cubits
551

    
552
    switch(ordinal())
553
      {
554
      case  0: return new TwistyCube         (size, quat, texture, mesh, effects, moves, res, scrWidth);
555
      case  1: return new TwistyPyraminx     (size, quat, texture, mesh, effects, moves, res, scrWidth);
556
      case  2: return new TwistyDiamond      (size, quat, texture, mesh, effects, moves, res, scrWidth);
557
      case  3: return new TwistyDino6        (size, quat, texture, mesh, effects, moves, res, scrWidth);
558
      case  4: return new TwistyDino4        (size, quat, texture, mesh, effects, moves, res, scrWidth);
559
      case  5: return new TwistyRedi         (size, quat, texture, mesh, effects, moves, res, scrWidth);
560
      case  6: return new TwistyHelicopter   (size, quat, texture, mesh, effects, moves, res, scrWidth);
561
      case  7: return new TwistySkewb        (size, quat, texture, mesh, effects, moves, res, scrWidth);
562
      case  8: return new TwistyIvy          (size, quat, texture, mesh, effects, moves, res, scrWidth);
563
      case  9: return new TwistyRex          (size, quat, texture, mesh, effects, moves, res, scrWidth);
564
      case 10: return new TwistyKilominx     (size, quat, texture, mesh, effects, moves, res, scrWidth);
565
      case 11: return new TwistyMegaminx     (size, quat, texture, mesh, effects, moves, res, scrWidth);
566
      case 12: return new TwistyBandagedFused(size, quat, texture, mesh, effects, moves, res, scrWidth);
567
      }
568

    
569
    return null;
570
    }
571

    
572
///////////////////////////////////////////////////////////////////////////////////////////////////
573

    
574
  public Movement getObjectMovementClass()
575
    {
576
    return mObjectMovementClass;
577
    }
578
  }
(15-15/32)