Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyRex.java @ 16861599

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 TwistyRex extends TwistyObject
37
{
38
  // the four rotation axis of a RubikRex. Must be normalized.
39
  static final Static3D[] ROT_AXIS = new Static3D[]
40
         {
41
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
42
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
43
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
44
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
45
         };
46

    
47
  private static final int[] FACE_COLORS = new int[]
48
         {
49
           COLOR_YELLOW, COLOR_WHITE,
50
           COLOR_BLUE  , COLOR_GREEN,
51
           COLOR_RED   , COLOR_ORANGE
52
         };
53

    
54
  public static final float REX_D = 0.2f;
55

    
56
  private ScrambleState[] mStates;
57
  private int[] mBasicAngle;
58
  private Static4D[] mQuats;
59
  private int[][] mFaceMap;
60
  private ObjectSticker[] mStickers;
61

    
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63

    
64
  TwistyRex(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
65
            DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
66
    {
67
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.REX, res, scrWidth);
68
    }
69

    
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

    
72
  ScrambleState[] getScrambleStates()
73
    {
74
    if( mStates==null )
75
      {
76
      int[] tmp = {0,-1,0, 0,1,0, 2,-1,0, 2,1,0 };
77

    
78
      mStates = new ScrambleState[]
79
        {
80
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
81
        };
82
      }
83

    
84
    return mStates;
85
    }
86

    
87
///////////////////////////////////////////////////////////////////////////////////////////////////
88

    
89
  private void initializeQuats()
90
    {
91
    mQuats = new Static4D[]
92
         {
93
         new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),
94
         new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
95
         new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
96
         new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
97

    
98
         new Static4D(  0.5f,  0.5f,  0.5f,  0.5f ),
99
         new Static4D(  0.5f,  0.5f,  0.5f, -0.5f ),
100
         new Static4D(  0.5f,  0.5f, -0.5f,  0.5f ),
101
         new Static4D(  0.5f,  0.5f, -0.5f, -0.5f ),
102
         new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
103
         new Static4D(  0.5f, -0.5f,  0.5f, -0.5f ),
104
         new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
105
         new Static4D(  0.5f, -0.5f, -0.5f, -0.5f )
106
         };
107
    }
108

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

    
111
  int[] getSolvedQuats(int cubit, int numLayers)
112
    {
113
    if( mQuats==null ) initializeQuats();
114
    int status = retCubitSolvedStatus(cubit,numLayers);
115
    return status<0 ? null : buildSolvedQuats(MovementRex.FACE_AXIS[status],mQuats);
116
    }
117

    
118
///////////////////////////////////////////////////////////////////////////////////////////////////
119

    
120
  float getScreenRatio()
121
    {
122
    return 0.5f;
123
    }
124

    
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126

    
127
  Static4D[] getQuats()
128
    {
129
    if( mQuats==null ) initializeQuats();
130
    return mQuats;
131
    }
132

    
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134

    
135
  int getNumFaceColors()
136
    {
137
    return FACE_COLORS.length;
138
    }
139

    
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141

    
142
  boolean shouldResetTextureMaps()
143
    {
144
    return false;
145
    }
146

    
147
///////////////////////////////////////////////////////////////////////////////////////////////////
148

    
149
  int getSolvedFunctionIndex()
150
    {
151
    return 0;
152
    }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155

    
156
  int getNumStickerTypes(int numLayers)
157
    {
158
    return 3;
159
    }
160

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

    
163
  float[][] getCuts(int numLayers)
164
    {
165
    float C = SQ3*0.45f; // bit less than 1/2 of the length of the main diagonal
166
    float[] cut = new float[] {-C,+C};
167
    return new float[][] { cut,cut,cut,cut };
168
    }
169

    
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171

    
172
  int getNumCubitFaces()
173
    {
174
    return 6;
175
    }
176

    
177
///////////////////////////////////////////////////////////////////////////////////////////////////
178

    
179
  float[][] getCubitPositions(int numLayers)
180
    {
181
    final float DIST1= 1.50f;
182
    final float DIST2= (1+2*REX_D)/2;
183
    final float DIST3= 1.53f;
184

    
185
    final float[][] CENTERS = new float[24+6+12][];
186

    
187
    CENTERS[ 0] = new float[] { +DIST3, +DIST2, +DIST2};
188
    CENTERS[ 1] = new float[] { +DIST3, +DIST2, -DIST2};
189
    CENTERS[ 2] = new float[] { +DIST3, -DIST2, -DIST2};
190
    CENTERS[ 3] = new float[] { +DIST3, -DIST2, +DIST2};
191
    CENTERS[ 4] = new float[] { -DIST3, +DIST2, +DIST2};
192
    CENTERS[ 5] = new float[] { -DIST3, +DIST2, -DIST2};
193
    CENTERS[ 6] = new float[] { -DIST3, -DIST2, -DIST2};
194
    CENTERS[ 7] = new float[] { -DIST3, -DIST2, +DIST2};
195
    CENTERS[ 8] = new float[] { +DIST2, +DIST3, +DIST2};
196
    CENTERS[ 9] = new float[] { +DIST2, +DIST3, -DIST2};
197
    CENTERS[10] = new float[] { -DIST2, +DIST3, -DIST2};
198
    CENTERS[11] = new float[] { -DIST2, +DIST3, +DIST2};
199
    CENTERS[12] = new float[] { +DIST2, -DIST3, +DIST2};
200
    CENTERS[13] = new float[] { +DIST2, -DIST3, -DIST2};
201
    CENTERS[14] = new float[] { -DIST2, -DIST3, -DIST2};
202
    CENTERS[15] = new float[] { -DIST2, -DIST3, +DIST2};
203
    CENTERS[16] = new float[] { +DIST2, +DIST2, +DIST3};
204
    CENTERS[17] = new float[] { +DIST2, -DIST2, +DIST3};
205
    CENTERS[18] = new float[] { -DIST2, -DIST2, +DIST3};
206
    CENTERS[19] = new float[] { -DIST2, +DIST2, +DIST3};
207
    CENTERS[20] = new float[] { +DIST2, +DIST2, -DIST3};
208
    CENTERS[21] = new float[] { +DIST2, -DIST2, -DIST3};
209
    CENTERS[22] = new float[] { -DIST2, -DIST2, -DIST3};
210
    CENTERS[23] = new float[] { -DIST2, +DIST2, -DIST3};
211

    
212
    CENTERS[24] = new float[] { +DIST3, +0.00f, +0.00f};
213
    CENTERS[25] = new float[] { -DIST3, +0.00f, +0.00f};
214
    CENTERS[26] = new float[] { +0.00f, +DIST3, +0.00f};
215
    CENTERS[27] = new float[] { +0.00f, -DIST3, +0.00f};
216
    CENTERS[28] = new float[] { +0.00f, +0.00f, +DIST3};
217
    CENTERS[29] = new float[] { +0.00f, +0.00f, -DIST3};
218

    
219
    CENTERS[30] = new float[] { +0.00f, +DIST1, +DIST1};
220
    CENTERS[31] = new float[] { +DIST1, +0.00f, +DIST1};
221
    CENTERS[32] = new float[] { +0.00f, -DIST1, +DIST1};
222
    CENTERS[33] = new float[] { -DIST1, +0.00f, +DIST1};
223
    CENTERS[34] = new float[] { +DIST1, +DIST1, +0.00f};
224
    CENTERS[35] = new float[] { +DIST1, -DIST1, +0.00f};
225
    CENTERS[36] = new float[] { -DIST1, -DIST1, +0.00f};
226
    CENTERS[37] = new float[] { -DIST1, +DIST1, +0.00f};
227
    CENTERS[38] = new float[] { +0.00f, +DIST1, -DIST1};
228
    CENTERS[39] = new float[] { +DIST1, +0.00f, -DIST1};
229
    CENTERS[40] = new float[] { +0.00f, -DIST1, -DIST1};
230
    CENTERS[41] = new float[] { -DIST1, +0.00f, -DIST1};
231

    
232
    return CENTERS;
233
    }
234

    
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236

    
237
  ObjectShape getObjectShape(int cubit, int numLayers)
238
    {
239
    int variant = getCubitVariant(cubit,numLayers);
240

    
241
    if( variant==0 )
242
      {
243
      float G = (1-REX_D)*SQ2/2;
244
      double[][] vertices ={{-0.10f,0.70f,0},{-0.70f,0.10f,0},{+0.65f,-0.71f,0},{+0.71f,-0.65f,0}};
245
      int[][] vertIndexes = { {0,1,2,3},{3,2,1,0} };
246
      float[][] centers= new float[][] { {0.0f,0.0f,-G} };
247
      float[][] corners= new float[][] { {0.03f,0.30f} };
248
      int[] indices= {-1,-1,0,0};
249
      int[] bandIndices= new int[] { 0,1 };
250
      float[][] bands = { {+0.016f,10,G/3,0.5f,5,1,1},{+0.230f,45,G/3,0.0f,2,0,0} };
251

    
252
      return new ObjectShape(vertices,vertIndexes,bands,bandIndices,corners,indices,centers,indices,getNumCubitFaces(), null);
253
      }
254
    else if( variant==1 )
255
      {
256
      float G = 3*REX_D;
257
      double[][] vertices= { { -G, 0, 0 },{ 0, -G, 0 },{ +G, 0, 0 },{ 0,+G,0 } };
258
      int[][] vertIndexes= { {0,1,2,3},{3,2,1,0} };
259
      int[] indices= {-1,-1,-1,-1};
260
      int[] bandIndices= new int[] { 0,1 };
261
      float[][] bands = { {0.025f,10,G/2,0.5f,5,0,0},{0.000f,45,G/2,0.0f,2,0,0} };
262

    
263
      return new ObjectShape(vertices,vertIndexes,bands,bandIndices,null,indices,null,indices,getNumCubitFaces(), null);
264
      }
265
    else
266
      {
267
      float E = 1.5f - 3*REX_D;
268
      float F = 1.5f;
269
      float G = (float)Math.sqrt(E*E+F*F);
270
      double[][] vertices = { { -F, 0, 0 },{  0,-E, 0 },{ +F, 0, 0 },{  0, 0,-E } };
271
      int[][] vertIndexes = { {0,1,2}, {0,2,3}, {0,3,1}, {1,3,2} };
272
      float[][] centers= new float[][] { {0.0f,-1.5f,-1.5f} };
273
      float[][] corners= new float[][] { {0.06f,0.20f} };
274
      int[] indices= {0,-1,0,-1};
275
      int[] bandIndices= new int[] { 0,0,1,1 };
276
      float[][] bands = { {0.03f,27,F/3,0.8f,5,2,3},{0.01f,45,G/3,0.2f,3,1,2} };
277

    
278
      return new ObjectShape(vertices,vertIndexes,bands,bandIndices,corners,indices,centers,indices,getNumCubitFaces(), null);
279
      }
280
    }
281

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

    
284
  Static4D getQuat(int cubit, int numLayers)
285
    {
286
    if( mQuats==null ) initializeQuats();
287

    
288
    switch(cubit)
289
      {
290
      case  0: return new Static4D(+SQ2/2,     0,+SQ2/2,     0);
291
      case  1: return mQuats[5];
292
      case  2: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
293
      case  3: return mQuats[8];
294
      case  4: return mQuats[6];
295
      case  5: return new Static4D(-SQ2/2,     0,+SQ2/2,     0);
296
      case  6: return mQuats[11];
297
      case  7: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
298
      case  8: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
299
      case  9: return mQuats[10];
300
      case 10: return new Static4D(     0,+SQ2/2,+SQ2/2,     0);
301
      case 11: return mQuats[4];
302
      case 12: return mQuats[9];
303
      case 13: return new Static4D(-SQ2/2,     0,     0, SQ2/2);
304
      case 14: return mQuats[7];
305
      case 15: return new Static4D(     0,-SQ2/2,+SQ2/2,     0);
306
      case 16: return new Static4D(     0,     0,-SQ2/2, SQ2/2);
307
      case 17: return mQuats[0];
308
      case 18: return new Static4D(     0,     0,+SQ2/2, SQ2/2);
309
      case 19: return mQuats[3];
310
      case 20: return mQuats[1];
311
      case 21: return new Static4D(+SQ2/2,-SQ2/2,     0,     0);
312
      case 22: return mQuats[2];
313
      case 23: return new Static4D(+SQ2/2,+SQ2/2,     0,     0);
314

    
315
      case 24: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
316
      case 25: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
317
      case 26: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
318
      case 27: return new Static4D(-SQ2/2,     0,     0, SQ2/2);
319
      case 28: return mQuats[0];
320
      case 29: return mQuats[1];
321

    
322
      case 30: return mQuats[0];
323
      case 31: return new Static4D(     0,     0,+SQ2/2, SQ2/2);
324
      case 32: return mQuats[3];
325
      case 33: return new Static4D(     0,     0,-SQ2/2, SQ2/2);
326
      case 34: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
327
      case 35: return mQuats[7];
328
      case 36: return mQuats[9];
329
      case 37: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
330
      case 38: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
331
      case 39: return mQuats[8];
332
      case 40: return mQuats[1];
333
      case 41: return mQuats[6];
334
      }
335

    
336
    return mQuats[0];
337
    }
338

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

    
341
  int getNumCubitVariants(int numLayers)
342
    {
343
    return 3;
344
    }
345

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

    
348
  int getCubitVariant(int cubit, int numLayers)
349
    {
350
    return cubit<24 ? 0 : (cubit<30?1:2);
351
    }
352

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

    
355
  int getFaceColor(int cubit, int cubitface, int numLayers)
356
    {
357
    if( mFaceMap==null )
358
      {
359
      mFaceMap = new int[][]
360
         {
361
           {  0, 18,18,18,18,18 },
362
           {  0, 18,18,18,18,18 },
363
           {  0, 18,18,18,18,18 },
364
           {  0, 18,18,18,18,18 },
365
           {  1, 18,18,18,18,18 },
366
           {  1, 18,18,18,18,18 },
367
           {  1, 18,18,18,18,18 },
368
           {  1, 18,18,18,18,18 },
369
           {  2, 18,18,18,18,18 },
370
           {  2, 18,18,18,18,18 },
371
           {  2, 18,18,18,18,18 },
372
           {  2, 18,18,18,18,18 },
373
           {  3, 18,18,18,18,18 },
374
           {  3, 18,18,18,18,18 },
375
           {  3, 18,18,18,18,18 },
376
           {  3, 18,18,18,18,18 },
377
           {  4, 18,18,18,18,18 },
378
           {  4, 18,18,18,18,18 },
379
           {  4, 18,18,18,18,18 },
380
           {  4, 18,18,18,18,18 },
381
           {  5, 18,18,18,18,18 },
382
           {  5, 18,18,18,18,18 },
383
           {  5, 18,18,18,18,18 },
384
           {  5, 18,18,18,18,18 },
385

    
386
           {  6, 18,18,18,18,18 },
387
           {  7, 18,18,18,18,18 },
388
           {  8, 18,18,18,18,18 },
389
           {  9, 18,18,18,18,18 },
390
           { 10, 18,18,18,18,18 },
391
           { 11, 18,18,18,18,18 },
392

    
393
           { 16,14, 18,18,18,18 },
394
           { 16,12, 18,18,18,18 },
395
           { 16,15, 18,18,18,18 },
396
           { 16,13, 18,18,18,18 },
397
           { 12,14, 18,18,18,18 },
398
           { 15,12, 18,18,18,18 },
399
           { 15,13, 18,18,18,18 },
400
           { 13,14, 18,18,18,18 },
401
           { 14,17, 18,18,18,18 },
402
           { 12,17, 18,18,18,18 },
403
           { 17,15, 18,18,18,18 },
404
           { 13,17, 18,18,18,18 },
405
         };
406
      }
407

    
408
    return mFaceMap[cubit][cubitface];
409
    }
410

    
411
///////////////////////////////////////////////////////////////////////////////////////////////////
412

    
413
  int getColor(int face)
414
    {
415
    return FACE_COLORS[face];
416
    }
417

    
418
///////////////////////////////////////////////////////////////////////////////////////////////////
419

    
420
  ObjectSticker retSticker(int face)
421
    {
422
    if( mStickers==null )
423
      {
424
      float[][] STICKERS = new float[][]
425
          {
426
             { -0.5f, 0.1428f, -0.1428f, 0.5f, 0.35f, -0.35f },
427
             { -0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f },
428
             { -0.525f, 0.105f, 0.525f, 0.105f, 0.000f, -0.210f  }
429
          };
430

    
431
      final float F = (float)(Math.PI/20);
432
      final float R1= 0.02f;
433
      final float R2= 0.09f;
434
      final float R3= 0.06f;
435
      final float[][] angles = { { -F/2,F,F },null,{ F/10,-F,-F } };
436
      final float[][] radii  = { {R1,R1,R1},{R2,R2,R2,R2},{0,0,R3} };
437
      final float[] strokes = { 0.06f, 0.07f, 0.05f };
438

    
439
      mStickers = new ObjectSticker[STICKERS.length];
440

    
441
      for(int s=0; s<STICKERS.length; s++)
442
        {
443
        mStickers[s] = new ObjectSticker(STICKERS[s],angles[s],radii[s],strokes[s]);
444
        }
445
      }
446

    
447
    return mStickers[face/NUM_FACE_COLORS];
448
    }
449

    
450
///////////////////////////////////////////////////////////////////////////////////////////////////
451

    
452
  float returnMultiplier()
453
    {
454
    return 2.0f;
455
    }
456

    
457
///////////////////////////////////////////////////////////////////////////////////////////////////
458
// PUBLIC API
459

    
460
  public Static3D[] getRotationAxis()
461
    {
462
    return ROT_AXIS;
463
    }
464

    
465
///////////////////////////////////////////////////////////////////////////////////////////////////
466

    
467
  public int[] getBasicAngle()
468
    {
469
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 3,3,3,3 };
470
    return mBasicAngle;
471
    }
472

    
473
///////////////////////////////////////////////////////////////////////////////////////////////////
474

    
475
  public int getObjectName(int numLayers)
476
    {
477
    return R.string.rex3;
478
    }
479

    
480
///////////////////////////////////////////////////////////////////////////////////////////////////
481

    
482
  public int getInventor(int numLayers)
483
    {
484
    return R.string.rex3_inventor;
485
    }
486

    
487
///////////////////////////////////////////////////////////////////////////////////////////////////
488

    
489
  public int getComplexity(int numLayers)
490
    {
491
    return 3;
492
    }
493
}
(38-38/43)