Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyRex.java @ 588ace55

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 static org.distorted.objectlib.Movement.TYPE_SPLIT_CORNER;
23

    
24
import android.content.res.Resources;
25

    
26
import org.distorted.objectlib.ObjectShape;
27
import org.distorted.objectlib.ObjectSticker;
28
import org.distorted.objectlib.ScrambleState;
29
import org.distorted.library.main.DistortedEffects;
30
import org.distorted.library.main.DistortedTexture;
31
import org.distorted.library.mesh.MeshSquare;
32
import org.distorted.library.type.Static3D;
33
import org.distorted.library.type.Static4D;
34
import org.distorted.main.R;
35
import org.distorted.objectlib.Movement;
36
import org.distorted.objectlib.Movement6;
37
import org.distorted.objectlib.ObjectList;
38
import org.distorted.objectlib.Twisty6;
39

    
40
///////////////////////////////////////////////////////////////////////////////////////////////////
41

    
42
public class TwistyRex extends Twisty6
43
{
44
  static final Static3D[] ROT_AXIS = new Static3D[]
45
         {
46
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
47
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
48
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
49
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
50
         };
51

    
52
  private static final int[][][] ENABLED = new int[][][]
53
      {
54
          {{0,1},{3,1},{2,3},{0,2}},
55
          {{2,3},{3,1},{0,1},{0,2}},
56
          {{1,2},{0,1},{0,3},{2,3}},
57
          {{1,2},{2,3},{0,3},{0,1}},
58
          {{0,3},{0,2},{1,2},{1,3}},
59
          {{1,2},{0,2},{0,3},{1,3}},
60
      };
61

    
62
  public static final float REX_D = 0.2f;
63

    
64
  private ScrambleState[] mStates;
65
  private int[] mBasicAngle;
66
  private Static4D[] mQuats;
67
  private float[][] mCuts;
68
  private boolean[][] mLayerRotatable;
69
  private int[][] mFaceMap;
70
  private ObjectSticker[] mStickers;
71
  private Movement mMovement;
72

    
73
///////////////////////////////////////////////////////////////////////////////////////////////////
74

    
75
  public TwistyRex(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
76
                   DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
77
    {
78
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.REX, res, scrWidth);
79
    }
80

    
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82

    
83
  protected ScrambleState[] getScrambleStates()
84
    {
85
    if( mStates==null )
86
      {
87
      int[] tmp = {0,-1,0, 0,1,0, 2,-1,0, 2,1,0 };
88

    
89
      mStates = new ScrambleState[]
90
        {
91
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
92
        };
93
      }
94

    
95
    return mStates;
96
    }
97

    
98
///////////////////////////////////////////////////////////////////////////////////////////////////
99

    
100
  private void initializeQuats()
101
    {
102
    mQuats = new Static4D[]
103
         {
104
         new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),
105
         new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
106
         new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
107
         new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
108

    
109
         new Static4D(  0.5f,  0.5f,  0.5f,  0.5f ),
110
         new Static4D(  0.5f,  0.5f,  0.5f, -0.5f ),
111
         new Static4D(  0.5f,  0.5f, -0.5f,  0.5f ),
112
         new Static4D(  0.5f,  0.5f, -0.5f, -0.5f ),
113
         new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
114
         new Static4D(  0.5f, -0.5f,  0.5f, -0.5f ),
115
         new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
116
         new Static4D(  0.5f, -0.5f, -0.5f, -0.5f )
117
         };
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121

    
122
  protected int[] getSolvedQuats(int cubit, int numLayers)
123
    {
124
    if( mQuats==null ) initializeQuats();
125
    int status = retCubitSolvedStatus(cubit,numLayers);
126
    return status<0 ? null : buildSolvedQuats(Movement6.FACE_AXIS[status],mQuats);
127
    }
128

    
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

    
131
  protected Static4D[] getQuats()
132
    {
133
    if( mQuats==null ) initializeQuats();
134
    return mQuats;
135
    }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138

    
139
  protected int getSolvedFunctionIndex()
140
    {
141
    return 0;
142
    }
143

    
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145

    
146
  protected int getNumStickerTypes(int numLayers)
147
    {
148
    return 3;
149
    }
150

    
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152

    
153
  protected float[][] getCuts(int numLayers)
154
    {
155
    if( mCuts==null )
156
      {
157
      float C = SQ3*0.45f; // bit less than 1/2 of the length of the main diagonal
158
      float[] cut = new float[] {-C,+C};
159
      mCuts = new float[][] { cut,cut,cut,cut };
160
      }
161

    
162
    return mCuts;
163
    }
164

    
165
///////////////////////////////////////////////////////////////////////////////////////////////////
166

    
167
  private void getLayerRotatable(int numLayers)
168
    {
169
    if( mLayerRotatable==null )
170
      {
171
      int numAxis = ROT_AXIS.length;
172
      boolean[] tmp = new boolean[] {true,false,true};
173
      mLayerRotatable = new boolean[numAxis][];
174
      for(int i=0; i<numAxis; i++) mLayerRotatable[i] = tmp;
175
      }
176
    }
177

    
178
///////////////////////////////////////////////////////////////////////////////////////////////////
179

    
180
  protected int getNumCubitFaces()
181
    {
182
    return 6;
183
    }
184

    
185
///////////////////////////////////////////////////////////////////////////////////////////////////
186

    
187
  protected float[][] getCubitPositions(int numLayers)
188
    {
189
    final float DIST1= 1.50f;
190
    final float DIST2= (1+2*REX_D)/2;
191
    final float DIST3= 1.53f;
192

    
193
    final float[][] CENTERS = new float[24+6+12][];
194

    
195
    CENTERS[ 0] = new float[] { +DIST3, +DIST2, +DIST2};
196
    CENTERS[ 1] = new float[] { +DIST3, +DIST2, -DIST2};
197
    CENTERS[ 2] = new float[] { +DIST3, -DIST2, -DIST2};
198
    CENTERS[ 3] = new float[] { +DIST3, -DIST2, +DIST2};
199
    CENTERS[ 4] = new float[] { -DIST3, +DIST2, +DIST2};
200
    CENTERS[ 5] = new float[] { -DIST3, +DIST2, -DIST2};
201
    CENTERS[ 6] = new float[] { -DIST3, -DIST2, -DIST2};
202
    CENTERS[ 7] = new float[] { -DIST3, -DIST2, +DIST2};
203
    CENTERS[ 8] = new float[] { +DIST2, +DIST3, +DIST2};
204
    CENTERS[ 9] = new float[] { +DIST2, +DIST3, -DIST2};
205
    CENTERS[10] = new float[] { -DIST2, +DIST3, -DIST2};
206
    CENTERS[11] = new float[] { -DIST2, +DIST3, +DIST2};
207
    CENTERS[12] = new float[] { +DIST2, -DIST3, +DIST2};
208
    CENTERS[13] = new float[] { +DIST2, -DIST3, -DIST2};
209
    CENTERS[14] = new float[] { -DIST2, -DIST3, -DIST2};
210
    CENTERS[15] = new float[] { -DIST2, -DIST3, +DIST2};
211
    CENTERS[16] = new float[] { +DIST2, +DIST2, +DIST3};
212
    CENTERS[17] = new float[] { +DIST2, -DIST2, +DIST3};
213
    CENTERS[18] = new float[] { -DIST2, -DIST2, +DIST3};
214
    CENTERS[19] = new float[] { -DIST2, +DIST2, +DIST3};
215
    CENTERS[20] = new float[] { +DIST2, +DIST2, -DIST3};
216
    CENTERS[21] = new float[] { +DIST2, -DIST2, -DIST3};
217
    CENTERS[22] = new float[] { -DIST2, -DIST2, -DIST3};
218
    CENTERS[23] = new float[] { -DIST2, +DIST2, -DIST3};
219

    
220
    CENTERS[24] = new float[] { +DIST3, +0.00f, +0.00f};
221
    CENTERS[25] = new float[] { -DIST3, +0.00f, +0.00f};
222
    CENTERS[26] = new float[] { +0.00f, +DIST3, +0.00f};
223
    CENTERS[27] = new float[] { +0.00f, -DIST3, +0.00f};
224
    CENTERS[28] = new float[] { +0.00f, +0.00f, +DIST3};
225
    CENTERS[29] = new float[] { +0.00f, +0.00f, -DIST3};
226

    
227
    CENTERS[30] = new float[] { +0.00f, +DIST1, +DIST1};
228
    CENTERS[31] = new float[] { +DIST1, +0.00f, +DIST1};
229
    CENTERS[32] = new float[] { +0.00f, -DIST1, +DIST1};
230
    CENTERS[33] = new float[] { -DIST1, +0.00f, +DIST1};
231
    CENTERS[34] = new float[] { +DIST1, +DIST1, +0.00f};
232
    CENTERS[35] = new float[] { +DIST1, -DIST1, +0.00f};
233
    CENTERS[36] = new float[] { -DIST1, -DIST1, +0.00f};
234
    CENTERS[37] = new float[] { -DIST1, +DIST1, +0.00f};
235
    CENTERS[38] = new float[] { +0.00f, +DIST1, -DIST1};
236
    CENTERS[39] = new float[] { +DIST1, +0.00f, -DIST1};
237
    CENTERS[40] = new float[] { +0.00f, -DIST1, -DIST1};
238
    CENTERS[41] = new float[] { -DIST1, +0.00f, -DIST1};
239

    
240
    return CENTERS;
241
    }
242

    
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244

    
245
  protected ObjectShape getObjectShape(int cubit, int numLayers)
246
    {
247
    int variant = getCubitVariant(cubit,numLayers);
248

    
249
    if( variant==0 )
250
      {
251
      float G = (1-REX_D)*SQ2/2;
252
      double[][] vertices ={{-0.10f,0.70f,0},{-0.70f,0.10f,0},{+0.65f,-0.71f,0},{+0.71f,-0.65f,0}};
253
      int[][] vertIndexes = { {0,1,2,3},{3,2,1,0} };
254
      float[][] centers= new float[][] { {0.0f,0.0f,-G} };
255
      float[][] corners= new float[][] { {0.03f,0.30f} };
256
      int[] indices= {-1,-1,0,0};
257
      int[] bandIndices= new int[] { 0,1 };
258
      float[][] bands = { {+0.016f,10,G/3,0.5f,5,1,1},{+0.230f,45,G/3,0.0f,2,0,0} };
259

    
260
      return new ObjectShape(vertices,vertIndexes,bands,bandIndices,corners,indices,centers,indices,getNumCubitFaces(), null);
261
      }
262
    else if( variant==1 )
263
      {
264
      float G = 3*REX_D;
265
      double[][] vertices= { { -G, 0, 0 },{ 0, -G, 0 },{ +G, 0, 0 },{ 0,+G,0 } };
266
      int[][] vertIndexes= { {0,1,2,3},{3,2,1,0} };
267
      int[] indices= {-1,-1,-1,-1};
268
      int[] bandIndices= new int[] { 0,1 };
269
      float[][] bands = { {0.025f,10,G/2,0.5f,5,0,0},{0.000f,45,G/2,0.0f,2,0,0} };
270

    
271
      return new ObjectShape(vertices,vertIndexes,bands,bandIndices,null,indices,null,indices,getNumCubitFaces(), null);
272
      }
273
    else
274
      {
275
      float E = 1.5f - 3*REX_D;
276
      float F = 1.5f;
277
      float G = (float)Math.sqrt(E*E+F*F);
278
      double[][] vertices = { { -F, 0, 0 },{  0,-E, 0 },{ +F, 0, 0 },{  0, 0,-E } };
279
      int[][] vertIndexes = { {0,1,2}, {0,2,3}, {0,3,1}, {1,3,2} };
280
      float[][] centers= new float[][] { {0.0f,-1.5f,-1.5f} };
281
      float[][] corners= new float[][] { {0.06f,0.20f} };
282
      int[] indices= {0,-1,0,-1};
283
      int[] bandIndices= new int[] { 0,0,1,1 };
284
      float[][] bands = { {0.03f,27,F/3,0.8f,5,2,3},{0.01f,45,G/3,0.2f,3,1,2} };
285

    
286
      return new ObjectShape(vertices,vertIndexes,bands,bandIndices,corners,indices,centers,indices,getNumCubitFaces(), null);
287
      }
288
    }
289

    
290
///////////////////////////////////////////////////////////////////////////////////////////////////
291

    
292
  protected Static4D getQuat(int cubit, int numLayers)
293
    {
294
    if( mQuats==null ) initializeQuats();
295

    
296
    switch(cubit)
297
      {
298
      case  0: return new Static4D(+SQ2/2,     0,+SQ2/2,     0);
299
      case  1: return mQuats[5];
300
      case  2: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
301
      case  3: return mQuats[8];
302
      case  4: return mQuats[6];
303
      case  5: return new Static4D(-SQ2/2,     0,+SQ2/2,     0);
304
      case  6: return mQuats[11];
305
      case  7: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
306
      case  8: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
307
      case  9: return mQuats[10];
308
      case 10: return new Static4D(     0,+SQ2/2,+SQ2/2,     0);
309
      case 11: return mQuats[4];
310
      case 12: return mQuats[9];
311
      case 13: return new Static4D(-SQ2/2,     0,     0, SQ2/2);
312
      case 14: return mQuats[7];
313
      case 15: return new Static4D(     0,-SQ2/2,+SQ2/2,     0);
314
      case 16: return new Static4D(     0,     0,-SQ2/2, SQ2/2);
315
      case 17: return mQuats[0];
316
      case 18: return new Static4D(     0,     0,+SQ2/2, SQ2/2);
317
      case 19: return mQuats[3];
318
      case 20: return mQuats[1];
319
      case 21: return new Static4D(+SQ2/2,-SQ2/2,     0,     0);
320
      case 22: return mQuats[2];
321
      case 23: return new Static4D(+SQ2/2,+SQ2/2,     0,     0);
322

    
323
      case 24: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
324
      case 25: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
325
      case 26: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
326
      case 27: return new Static4D(-SQ2/2,     0,     0, SQ2/2);
327
      case 28: return mQuats[0];
328
      case 29: return mQuats[1];
329

    
330
      case 30: return mQuats[0];
331
      case 31: return new Static4D(     0,     0,+SQ2/2, SQ2/2);
332
      case 32: return mQuats[3];
333
      case 33: return new Static4D(     0,     0,-SQ2/2, SQ2/2);
334
      case 34: return new Static4D(     0,-SQ2/2,     0, SQ2/2);
335
      case 35: return mQuats[7];
336
      case 36: return mQuats[9];
337
      case 37: return new Static4D(     0,+SQ2/2,     0, SQ2/2);
338
      case 38: return new Static4D(+SQ2/2,     0,     0, SQ2/2);
339
      case 39: return mQuats[8];
340
      case 40: return mQuats[1];
341
      case 41: return mQuats[6];
342
      }
343

    
344
    return mQuats[0];
345
    }
346

    
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348

    
349
  protected int getNumCubitVariants(int numLayers)
350
    {
351
    return 3;
352
    }
353

    
354
///////////////////////////////////////////////////////////////////////////////////////////////////
355

    
356
  protected int getCubitVariant(int cubit, int numLayers)
357
    {
358
    return cubit<24 ? 0 : (cubit<30?1:2);
359
    }
360

    
361
///////////////////////////////////////////////////////////////////////////////////////////////////
362

    
363
  protected int getFaceColor(int cubit, int cubitface, int numLayers)
364
    {
365
    if( mFaceMap==null )
366
      {
367
      mFaceMap = new int[][]
368
         {
369
           {  0, 18,18,18,18,18 },
370
           {  0, 18,18,18,18,18 },
371
           {  0, 18,18,18,18,18 },
372
           {  0, 18,18,18,18,18 },
373
           {  1, 18,18,18,18,18 },
374
           {  1, 18,18,18,18,18 },
375
           {  1, 18,18,18,18,18 },
376
           {  1, 18,18,18,18,18 },
377
           {  2, 18,18,18,18,18 },
378
           {  2, 18,18,18,18,18 },
379
           {  2, 18,18,18,18,18 },
380
           {  2, 18,18,18,18,18 },
381
           {  3, 18,18,18,18,18 },
382
           {  3, 18,18,18,18,18 },
383
           {  3, 18,18,18,18,18 },
384
           {  3, 18,18,18,18,18 },
385
           {  4, 18,18,18,18,18 },
386
           {  4, 18,18,18,18,18 },
387
           {  4, 18,18,18,18,18 },
388
           {  4, 18,18,18,18,18 },
389
           {  5, 18,18,18,18,18 },
390
           {  5, 18,18,18,18,18 },
391
           {  5, 18,18,18,18,18 },
392
           {  5, 18,18,18,18,18 },
393

    
394
           {  6, 18,18,18,18,18 },
395
           {  7, 18,18,18,18,18 },
396
           {  8, 18,18,18,18,18 },
397
           {  9, 18,18,18,18,18 },
398
           { 10, 18,18,18,18,18 },
399
           { 11, 18,18,18,18,18 },
400

    
401
           { 16,14, 18,18,18,18 },
402
           { 16,12, 18,18,18,18 },
403
           { 16,15, 18,18,18,18 },
404
           { 16,13, 18,18,18,18 },
405
           { 12,14, 18,18,18,18 },
406
           { 15,12, 18,18,18,18 },
407
           { 15,13, 18,18,18,18 },
408
           { 13,14, 18,18,18,18 },
409
           { 14,17, 18,18,18,18 },
410
           { 12,17, 18,18,18,18 },
411
           { 17,15, 18,18,18,18 },
412
           { 13,17, 18,18,18,18 },
413
         };
414
      }
415

    
416
    return mFaceMap[cubit][cubitface];
417
    }
418

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

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

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

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

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

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

    
451
///////////////////////////////////////////////////////////////////////////////////////////////////
452
// PUBLIC API
453

    
454
  public Static3D[] getRotationAxis()
455
    {
456
    return ROT_AXIS;
457
    }
458

    
459
///////////////////////////////////////////////////////////////////////////////////////////////////
460

    
461
  public Movement getMovement()
462
    {
463
    if( mMovement==null )
464
      {
465
      int numLayers = getNumLayers();
466
      if( mCuts==null ) getCuts(numLayers);
467
      getLayerRotatable(numLayers);
468
      mMovement = new Movement6(ROT_AXIS,mCuts,mLayerRotatable,numLayers,TYPE_SPLIT_CORNER,ENABLED);
469
      }
470
    return mMovement;
471
    }
472

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

    
475
  public int[] getBasicAngle()
476
    {
477
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 3,3,3,3 };
478
    return mBasicAngle;
479
    }
480

    
481
///////////////////////////////////////////////////////////////////////////////////////////////////
482

    
483
  public int getObjectName(int numLayers)
484
    {
485
    return R.string.rex3;
486
    }
487

    
488
///////////////////////////////////////////////////////////////////////////////////////////////////
489

    
490
  public int getInventor(int numLayers)
491
    {
492
    return R.string.rex3_inventor;
493
    }
494

    
495
///////////////////////////////////////////////////////////////////////////////////////////////////
496

    
497
  public int getComplexity(int numLayers)
498
    {
499
    return 3;
500
    }
501
}
(20-20/25)