Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyCube.java @ e9a87113

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2019 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
class TwistyCube extends TwistyObject
37
{
38
  static final Static3D[] ROT_AXIS = new Static3D[]
39
         {
40
           new Static3D(1,0,0),
41
           new Static3D(0,1,0),
42
           new Static3D(0,0,1)
43
         };
44

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

    
52
  private ScrambleState[] mStates;
53
  private Static4D[] mQuats;
54
  private int[] mBasicAngle;
55
  private ObjectSticker[] mStickers;
56
  private Movement mMovement;
57

    
58
///////////////////////////////////////////////////////////////////////////////////////////////////
59

    
60
  TwistyCube(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
61
             DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
62
    {
63
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.CUBE, res, scrWidth);
64
    }
65

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

    
68
  ScrambleState[] getScrambleStates()
69
    {
70
    if( mStates==null )
71
      {
72
      int size = getNumLayers();
73
      int[][] m = new int[16][];
74
      for(int i=1; i<16; i++) m[i] = createEdges(size,i);
75

    
76
      mStates = new ScrambleState[]
77
        {
78
        new ScrambleState( new int[][] { m[ 1], m[ 2], m[ 3] } ),  // 0
79
        new ScrambleState( new int[][] {  null, m[ 4], m[ 5] } ),  // x
80
        new ScrambleState( new int[][] { m[ 6],  null, m[ 7] } ),  // y
81
        new ScrambleState( new int[][] { m[ 8], m[ 8],  null } ),  // z
82
        new ScrambleState( new int[][] { m[10],  null, m[ 7] } ),  // xy
83
        new ScrambleState( new int[][] { m[11], m[ 9],  null } ),  // xz
84
        new ScrambleState( new int[][] {  null, m[12], m[ 5] } ),  // yx
85
        new ScrambleState( new int[][] { m[ 8], m[13],  null } ),  // yz
86
        new ScrambleState( new int[][] {  null, m[ 4], m[14] } ),  // zx
87
        new ScrambleState( new int[][] { m[ 6],  null, m[15] } ),  // zy
88
        new ScrambleState( new int[][] {  null,  null, m[ 5] } ),  // xyx
89
        new ScrambleState( new int[][] {  null, m[ 4],  null } ),  // xzx
90
        new ScrambleState( new int[][] {  null,  null, m[ 7] } ),  // yxy
91
        new ScrambleState( new int[][] { m[ 6],  null,  null } ),  // yzy
92
        new ScrambleState( new int[][] {  null, m[ 9],  null } ),  // zxz
93
        new ScrambleState( new int[][] { m[ 8],  null,  null } ),  // zyz
94
        };
95
      }
96

    
97
    return mStates;
98
    }
99

    
100
///////////////////////////////////////////////////////////////////////////////////////////////////
101

    
102
  private int[] createEdges(int size, int vertex)
103
    {
104
    int[] ret = new int[9*size];
105

    
106
    for(int l=0; l<size; l++)
107
      {
108
      ret[9*l  ] = l;
109
      ret[9*l+1] =-1;
110
      ret[9*l+2] = vertex;
111
      ret[9*l+3] = l;
112
      ret[9*l+4] = 1;
113
      ret[9*l+5] = vertex;
114
      ret[9*l+6] = l;
115
      ret[9*l+7] = 2;
116
      ret[9*l+8] = vertex;
117
      }
118

    
119
    return ret;
120
    }
121

    
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123

    
124
  private void initializeQuats()
125
    {
126
    mQuats = new Static4D[]
127
         {
128
         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
129
         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
130
         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
131
         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
132

    
133
         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
134
         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
135
         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
136
         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
137
         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
138
         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
139
         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
140
         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
141
         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
142
         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
143
         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
144
         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
145

    
146
         new Static4D(  0.5f,   0.5f,   0.5f,   0.5f),
147
         new Static4D(  0.5f,   0.5f,  -0.5f,   0.5f),
148
         new Static4D(  0.5f,   0.5f,  -0.5f,  -0.5f),
149
         new Static4D(  0.5f,  -0.5f,   0.5f,  -0.5f),
150
         new Static4D( -0.5f,  -0.5f,  -0.5f,   0.5f),
151
         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
152
         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
153
         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
154
         };
155
    }
156

    
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158

    
159
  int[] getSolvedQuats(int cubit, int numLayers)
160
    {
161
    if( mQuats ==null ) initializeQuats();
162
    int status = retCubitSolvedStatus(cubit,numLayers);
163
    return status<0 ? null : buildSolvedQuats(MovementCube.FACE_AXIS[status], mQuats);
164
    }
165

    
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167

    
168
  ObjectShape getObjectShape(int cubit, int numLayers)
169
    {
170
    int extraI, extraV, num;
171
    float height;
172

    
173
    switch(numLayers)
174
      {
175
      case 2 : num = 6; extraI = 2; extraV = 2; height = 0.045f; break;
176
      case 3 : num = 5; extraI = 2; extraV = 2; height = 0.045f; break;
177
      case 4 : num = 5; extraI = 1; extraV = 1; height = 0.045f; break;
178
      default: num = 5; extraI = 0; extraV = 0; height = 0.045f; break;
179
      }
180

    
181
    double[][] vertices = new double[][]
182
          {
183
              { 0.5, 0.5, 0.5 },
184
              { 0.5, 0.5,-0.5 },
185
              { 0.5,-0.5, 0.5 },
186
              { 0.5,-0.5,-0.5 },
187
              {-0.5, 0.5, 0.5 },
188
              {-0.5, 0.5,-0.5 },
189
              {-0.5,-0.5, 0.5 },
190
              {-0.5,-0.5,-0.5 },
191
          };
192

    
193
    int[][] vert_indices = new int[][]
194
          {
195
              {2,3,1,0},
196
              {7,6,4,5},
197
              {4,0,1,5},
198
              {7,3,2,6},
199
              {6,2,0,4},
200
              {3,7,5,1}
201
          };
202

    
203
    float[][] bands     = new float[][] { {height,35,0.5f,0.7f,num,extraI,extraV} };
204
    int[] bandIndices   = new int[] { 0,0,0,0,0,0};
205
    float[][] corners   = new float[][] { {0.036f,0.12f} };
206
    int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
207
    float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
208
    int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
209

    
210
    return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
211
    }
212

    
213
///////////////////////////////////////////////////////////////////////////////////////////////////
214

    
215
  Static4D getQuat(int cubit, int numLayers)
216
    {
217
    if( mQuats ==null ) initializeQuats();
218
    return mQuats[0];
219
    }
220

    
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222

    
223
  int getNumCubitVariants(int numLayers)
224
    {
225
    return 1;
226
    }
227

    
228
///////////////////////////////////////////////////////////////////////////////////////////////////
229

    
230
  int getCubitVariant(int cubit, int numLayers)
231
    {
232
    return 0;
233
    }
234

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

    
237
  int getColor(int face)
238
    {
239
    return FACE_COLORS[face];
240
    }
241

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

    
244
  ObjectSticker retSticker(int face)
245
    {
246
    if( mStickers==null )
247
      {
248
      final float[][] STICKERS = new float[][]  { { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f } };
249
      final float radius = 0.10f;
250
      final float stroke = 0.08f;
251
      final float[] radii = {radius,radius,radius,radius};
252
      mStickers = new ObjectSticker[STICKERS.length];
253
      mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke );
254
      }
255

    
256
    return mStickers[face/NUM_FACE_COLORS];
257
    }
258

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

    
261
  float[][] getCubitPositions(int numLayers)
262
    {
263
    int numCubits = numLayers>1 ? 6*numLayers*numLayers - 12*numLayers + 8 : 1;
264
    float[][] tmp = new float[numCubits][];
265

    
266
    float diff = 0.5f*(numLayers-1);
267
    int currentPosition = 0;
268

    
269
    for(int x = 0; x<numLayers; x++)
270
      for(int y = 0; y<numLayers; y++)
271
        for(int z = 0; z<numLayers; z++)
272
          if( x==0 || x==numLayers-1 || y==0 || y==numLayers-1 || z==0 || z==numLayers-1 )
273
            {
274
            tmp[currentPosition++] = new float[] {x-diff,y-diff,z-diff};
275
            }
276

    
277
    return tmp;
278
    }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
  Static4D[] getQuats()
283
    {
284
    if( mQuats ==null ) initializeQuats();
285
    return mQuats;
286
    }
287

    
288
///////////////////////////////////////////////////////////////////////////////////////////////////
289

    
290
  boolean shouldResetTextureMaps()
291
    {
292
    return false;
293
    }
294

    
295
///////////////////////////////////////////////////////////////////////////////////////////////////
296

    
297
  int getNumFaceColors()
298
    {
299
    return FACE_COLORS.length;
300
    }
301

    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
  float[][] getCuts(int numLayers)
305
    {
306
    float[][] cuts = new float[3][numLayers-1];
307

    
308
    for(int i=0; i<numLayers-1; i++)
309
      {
310
      float cut = (2-numLayers)*0.5f + i;
311
      cuts[0][i] = cut;
312
      cuts[1][i] = cut;
313
      cuts[2][i] = cut;
314
      }
315

    
316
    return cuts;
317
    }
318

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

    
321
  int getSolvedFunctionIndex()
322
    {
323
    return 0;
324
    }
325

    
326
///////////////////////////////////////////////////////////////////////////////////////////////////
327

    
328
  int getNumStickerTypes(int numLayers)
329
    {
330
    return 1;
331
    }
332

    
333
///////////////////////////////////////////////////////////////////////////////////////////////////
334

    
335
  int getNumCubitFaces()
336
    {
337
    return FACE_COLORS.length;
338
    }
339

    
340
///////////////////////////////////////////////////////////////////////////////////////////////////
341

    
342
  float getScreenRatio()
343
    {
344
    return 0.5f;
345
    }
346

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

    
349
  int getFaceColor(int cubit, int cubitface, int numLayers)
350
    {
351
    return CUBITS[cubit].mRotationRow[cubitface/2] == (cubitface%2==0 ? (1<<(numLayers-1)):1) ? cubitface : NUM_TEXTURES;
352
    }
353

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

    
356
  float returnMultiplier()
357
    {
358
    return getNumLayers();
359
    }
360

    
361
///////////////////////////////////////////////////////////////////////////////////////////////////
362
// PUBLIC API
363

    
364
  public Static3D[] getRotationAxis()
365
    {
366
    return ROT_AXIS;
367
    }
368

    
369
///////////////////////////////////////////////////////////////////////////////////////////////////
370

    
371
  public Movement getMovement()
372
    {
373
    if( mMovement==null ) mMovement = new MovementCube();
374
    return mMovement;
375
    }
376

    
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378

    
379
  public int[] getBasicAngle()
380
    {
381
    if( mBasicAngle==null ) mBasicAngle = new int[] { 4,4,4 };
382
    return mBasicAngle;
383
    }
384

    
385
///////////////////////////////////////////////////////////////////////////////////////////////////
386

    
387
  public int getObjectName(int numLayers)
388
    {
389
    switch(numLayers)
390
      {
391
      case 2: return R.string.cube2;
392
      case 3: return R.string.cube3;
393
      case 4: return R.string.cube4;
394
      case 5: return R.string.cube5;
395
      }
396
    return R.string.cube3;
397
    }
398

    
399
///////////////////////////////////////////////////////////////////////////////////////////////////
400

    
401
  public int getInventor(int numLayers)
402
    {
403
    switch(numLayers)
404
      {
405
      case 2: return R.string.cube2_inventor;
406
      case 3: return R.string.cube3_inventor;
407
      case 4: return R.string.cube4_inventor;
408
      case 5: return R.string.cube5_inventor;
409
      }
410
    return R.string.cube3_inventor;
411
    }
412

    
413
///////////////////////////////////////////////////////////////////////////////////////////////////
414

    
415
  public int getComplexity(int numLayers)
416
    {
417
    switch(numLayers)
418
      {
419
      case 2: return 4;
420
      case 3: return 6;
421
      case 4: return 8;
422
      case 5: return 10;
423
      }
424
    return 6;
425
    }
426
}
(23-23/44)