Project

General

Profile

Download (21.6 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyCube.java @ e7daa161

1 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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.objectlib.objects;
21
22
import static org.distorted.objectlib.main.Movement.TYPE_NOT_SPLIT;
23
24
import android.content.res.Resources;
25
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
32
import org.distorted.objectlib.R;
33
import org.distorted.objectlib.main.Movement;
34
import org.distorted.objectlib.main.Movement6;
35 8592461c Leszek Koltunski
import org.distorted.objectlib.main.ObjectControl;
36 8005e762 Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
37 198c5bf0 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectShape;
38
import org.distorted.objectlib.helpers.ObjectSticker;
39
import org.distorted.objectlib.helpers.ScrambleState;
40 29b82486 Leszek Koltunski
import org.distorted.objectlib.main.Twisty6;
41
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43
44
public class TwistyCube extends Twisty6
45
{
46
  static final Static3D[] ROT_AXIS = new Static3D[]
47
         {
48
           new Static3D(1,0,0),
49
           new Static3D(0,1,0),
50
           new Static3D(0,0,1)
51
         };
52
53
  private static final int[][][] ENABLED = new int[][][]
54
      {
55
          {{1,2}},{{1,2}},{{0,2}},{{0,2}},{{0,1}},{{0,1}},
56
      };
57
58
  private ScrambleState[] mStates;
59
  private Static4D[] mQuats;
60
  private float[][] mCuts;
61
  private boolean[][] mLayerRotatable;
62
  private int[] mBasicAngle;
63
  private ObjectSticker[] mStickers;
64
  private Movement mMovement;
65
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67
68 a57e6870 Leszek Koltunski
  public TwistyCube(int[] numL, Static4D quat, Static3D move, DistortedTexture texture,
69 e7daa161 Leszek Koltunski
                    MeshSquare mesh, DistortedEffects effects, Resources res, int surfaceW, int surfaceH)
70 29b82486 Leszek Koltunski
    {
71 e7daa161 Leszek Koltunski
    super(numL, (numL[0]+numL[1]+numL[2])/3.0f, quat, move, texture, mesh, effects, res, surfaceW, surfaceH);
72 29b82486 Leszek Koltunski
    }
73
74 dfdb26a9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
75
76
  private int[] createEdges(int size, int vertex)
77
    {
78
    int[] ret = new int[9*size];
79
80
    for(int l=0; l<size; l++)
81
      {
82
      ret[9*l  ] = l;
83
      ret[9*l+1] =-1;
84
      ret[9*l+2] = vertex;
85
      ret[9*l+3] = l;
86
      ret[9*l+4] = 1;
87
      ret[9*l+5] = vertex;
88
      ret[9*l+6] = l;
89
      ret[9*l+7] = 2;
90
      ret[9*l+8] = vertex;
91
      }
92
93
    return ret;
94
    }
95
96 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
97
98
  protected ScrambleState[] getScrambleStates()
99
    {
100
    if( mStates==null )
101
      {
102 a57e6870 Leszek Koltunski
      int[] numL = getNumLayers();
103 29b82486 Leszek Koltunski
      int[][] m = new int[16][];
104 a57e6870 Leszek Koltunski
      for(int i=1; i<16; i++) m[i] = createEdges(numL[0],i);
105 29b82486 Leszek Koltunski
106
      mStates = new ScrambleState[]
107
        {
108 7ce20d2a Leszek Koltunski
        new ScrambleState( new int[][] { m[ 1], m[ 2], m[ 3] } ),  //  0 0
109
        new ScrambleState( new int[][] {  null, m[ 4], m[ 5] } ),  //  1 x
110
        new ScrambleState( new int[][] { m[ 6],  null, m[ 7] } ),  //  2 y
111
        new ScrambleState( new int[][] { m[ 8], m[ 9],  null } ),  //  3 z
112
        new ScrambleState( new int[][] { m[10],  null, m[ 7] } ),  //  4 xy
113
        new ScrambleState( new int[][] { m[11], m[ 9],  null } ),  //  5 xz
114
        new ScrambleState( new int[][] {  null, m[12], m[ 5] } ),  //  6 yx
115
        new ScrambleState( new int[][] { m[ 8], m[13],  null } ),  //  7 yz
116
        new ScrambleState( new int[][] {  null, m[ 4], m[14] } ),  //  8 zx
117
        new ScrambleState( new int[][] { m[ 6],  null, m[15] } ),  //  9 zy
118
        new ScrambleState( new int[][] {  null,  null, m[ 5] } ),  // 10 xyx
119
        new ScrambleState( new int[][] {  null, m[ 4],  null } ),  // 11 xzx
120
        new ScrambleState( new int[][] {  null,  null, m[ 7] } ),  // 12 yxy
121
        new ScrambleState( new int[][] { m[ 6],  null,  null } ),  // 13 yzy
122
        new ScrambleState( new int[][] {  null, m[ 9],  null } ),  // 14 zxz
123
        new ScrambleState( new int[][] { m[ 8],  null,  null } ),  // 15 zyz
124 29b82486 Leszek Koltunski
        };
125
      }
126
127
    return mStates;
128
    }
129
130 4e1dc313 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
131
132 a57e6870 Leszek Koltunski
  protected int getResource(int[] numLayers)
133 4e1dc313 Leszek Koltunski
    {
134 7dab2aea Leszek Koltunski
    int x = numLayers[0];
135
    int y = numLayers[1];
136
    int z = numLayers[2];
137
138
    if( x==y && x==z )
139 4e1dc313 Leszek Koltunski
      {
140 7dab2aea Leszek Koltunski
      switch(x)
141
        {
142
        case 2: return R.raw.cube2;
143
        case 3: return R.raw.cube3;
144
        case 4: return R.raw.cube4;
145
        case 5: return R.raw.cube5;
146
        }
147 4e1dc313 Leszek Koltunski
      }
148
149
    return 0;
150
    }
151
152 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
153
154
  private void initializeQuats()
155
    {
156
    mQuats = new Static4D[]
157
         {
158
         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
159
         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
160
         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
161
         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
162
163
         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
164
         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
165
         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
166
         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
167
         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
168
         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
169
         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
170
         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
171
         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
172
         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
173
         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
174
         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
175
176
         new Static4D(  0.5f,   0.5f,   0.5f,   0.5f),
177
         new Static4D(  0.5f,   0.5f,  -0.5f,   0.5f),
178
         new Static4D(  0.5f,   0.5f,  -0.5f,  -0.5f),
179
         new Static4D(  0.5f,  -0.5f,   0.5f,  -0.5f),
180
         new Static4D( -0.5f,  -0.5f,  -0.5f,   0.5f),
181
         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
182
         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
183
         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
184
         };
185
    }
186
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188
189 a57e6870 Leszek Koltunski
  protected int[] getSolvedQuats(int cubit, int[] numLayers)
190 29b82486 Leszek Koltunski
    {
191
    if( mQuats ==null ) initializeQuats();
192
    int status = retCubitSolvedStatus(cubit,numLayers);
193
    return status<0 ? null : buildSolvedQuats(Movement6.FACE_AXIS[status], mQuats);
194
    }
195
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197
198 a57e6870 Leszek Koltunski
  protected ObjectShape getObjectShape(int cubit, int[] numLayers)
199 29b82486 Leszek Koltunski
    {
200
    int extraI, extraV, num;
201
    float height;
202 8396c548 Leszek Koltunski
    int variant = getCubitVariant(cubit,numLayers);
203 a57e6870 Leszek Koltunski
    int numL = numLayers[0];
204 29b82486 Leszek Koltunski
205 a57e6870 Leszek Koltunski
    switch(numL)
206 8396c548 Leszek Koltunski
        {
207
        case 2 : num = 6; extraI = 2; extraV = 2; height = 0.045f; break;
208
        case 3 : num = 5; extraI = 2; extraV = 2; height = 0.045f; break;
209
        case 4 : num = 5; extraI = 1; extraV = 1; height = 0.045f; break;
210
        default: num = 5; extraI = 0; extraV = 0; height = 0.045f; break;
211
        }
212 29b82486 Leszek Koltunski
213
    double[][] vertices = new double[][]
214
          {
215
              { 0.5, 0.5, 0.5 },
216
              { 0.5, 0.5,-0.5 },
217
              { 0.5,-0.5, 0.5 },
218
              { 0.5,-0.5,-0.5 },
219
              {-0.5, 0.5, 0.5 },
220
              {-0.5, 0.5,-0.5 },
221
              {-0.5,-0.5, 0.5 },
222
              {-0.5,-0.5,-0.5 },
223
          };
224
225
    int[][] vert_indices = new int[][]
226
          {
227
              {2,3,1,0},
228
              {7,6,4,5},
229
              {4,0,1,5},
230
              {7,3,2,6},
231
              {6,2,0,4},
232
              {3,7,5,1}
233
          };
234
235
    float[][] corners   = new float[][] { {0.036f,0.12f} };
236
    int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
237
    float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
238
    int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
239
240 8396c548 Leszek Koltunski
    if( variant==0 )
241
      {
242
      float[][] bands   = new float[][] { {height,35,0.5f,0.7f,num,extraI,extraV} };
243
      int[] bandIndices = new int[] { 0,0,0,0,0,0};
244
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
245
      }
246
    else
247
      {
248
      int extraI2, extraV2, num2;
249
250 a57e6870 Leszek Koltunski
      switch(numL)
251 8396c548 Leszek Koltunski
        {
252
        case 2 : num2 = 6; extraI2 = 2; extraV2 = 2; break;
253
        case 3 : num2 = 5; extraI2 = 1; extraV2 = 0; break;
254
        case 4 : num2 = 4; extraI2 = 0; extraV2 = 0; break;
255
        default: num2 = 3; extraI2 = 0; extraV2 = 0; break;
256
        }
257
258 d309baa5 Leszek Koltunski
      float[][] bands   = new float[][]
259
        {
260
          {height,35,0.5f,0.7f,num ,extraI ,extraV },
261
          {height,35,0.5f,0.7f,num2,extraI2,extraV2},
262
          {height,35,0.5f,0.7f,   2,      0,      0},
263
        };
264
      int[] bandIndices = new int[] { 1,1,1,1,0,2};
265 8396c548 Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
266
      }
267 29b82486 Leszek Koltunski
    }
268
269 dfdb26a9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
270
271
  private int getCenterNum(int cubit, int[] numLayers)
272
    {
273
    int num = cubit - getNumCornersAndEdges(numLayers);
274
275
    if( num>=0 )
276
      {
277
      int numLR = (numLayers[1]-2)*(numLayers[2]-2);
278
      if( num<  numLR ) return 0;
279
      if( num<2*numLR ) return 1;
280
      num -= 2*numLR;
281
282
      int numTD = (numLayers[0]-2)*(numLayers[2]-2);
283
      if( num<  numTD ) return 2;
284
      if( num<2*numTD ) return 3;
285
      num -= 2*numTD;
286
287
      int numFB = (numLayers[0]-2)*(numLayers[1]-2);
288
      if( num<  numFB ) return 4;
289
      if( num<2*numFB ) return 5;
290
      }
291
292
    return -1;
293
    }
294
295
///////////////////////////////////////////////////////////////////////////////////////////////////
296
297
  private int getNumCornersAndEdges(int[] numLayers)
298
    {
299
    int x = numLayers[0];
300
    int y = numLayers[1];
301
    int z = numLayers[2];
302
303
    return ( x==1 || y==1 || z==1 ) ? x*y*z : 4*( (x-2)+(y-2)+(z-2) ) + 8;
304
    }
305
306 8da6b1c9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
307
308 a57e6870 Leszek Koltunski
  protected float[][] getCubitPositions(int[] numLayers)
309 8da6b1c9 Leszek Koltunski
    {
310 dfdb26a9 Leszek Koltunski
    final int X = numLayers[0];
311
    final int Y = numLayers[1];
312
    final int Z = numLayers[2];
313
314
    final float lenX = 0.5f*(X-1);
315
    final float lenY = 0.5f*(Y-1);
316
    final float lenZ = 0.5f*(Z-1);
317 8da6b1c9 Leszek Koltunski
318 a135652b Leszek Koltunski
    int curPos = 0;
319
320
    if( X==1 )
321
      {
322
      float[][] pos = new float[X*Y*Z][];
323
324
      for(int y=0; y<Y; y++)
325
        for(int z=0; z<Z; z++) pos[curPos++] = new float[] {+lenX,y-lenY,z-lenZ};
326
327
      return pos;
328
      }
329
330
    if( Y==1 )
331 dfdb26a9 Leszek Koltunski
      {
332 a135652b Leszek Koltunski
      float[][] pos = new float[X*Y*Z][];
333
334
      for(int x=0; x<X; x++)
335
        for(int z=0; z<Z; z++) pos[curPos++] = new float[] {x-lenX,+lenY,z-lenZ};
336
337
      return pos;
338
      }
339
340
    if( Z==1 )
341
      {
342
      float[][] pos = new float[X*Y*Z][];
343
344
      for(int x=0; x<X; x++)
345
        for(int y=0; y<Y; y++) pos[curPos++] = new float[] {x-lenX,y-lenY,+lenZ};
346 dfdb26a9 Leszek Koltunski
347 a135652b Leszek Koltunski
      return pos;
348 dfdb26a9 Leszek Koltunski
      }
349 a57e6870 Leszek Koltunski
350 dfdb26a9 Leszek Koltunski
    int numCubits = X*Y*Z - (X-2)*(Y-2)*(Z-2);
351 a135652b Leszek Koltunski
    float[][] pos = new float[numCubits][];
352
353
    pos[curPos++] = new float[] {-lenX,-lenY,-lenZ};
354
    pos[curPos++] = new float[] {-lenX,-lenY,+lenZ};
355
    pos[curPos++] = new float[] {-lenX,+lenY,-lenZ};
356
    pos[curPos++] = new float[] {-lenX,+lenY,+lenZ};
357
    pos[curPos++] = new float[] {+lenX,-lenY,-lenZ};
358
    pos[curPos++] = new float[] {+lenX,-lenY,+lenZ};
359
    pos[curPos++] = new float[] {+lenX,+lenY,-lenZ};
360
    pos[curPos++] = new float[] {+lenX,+lenY,+lenZ};
361
362
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  -lenY,  -lenZ };
363
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  -lenY,  +lenZ };
364
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  +lenY,  -lenZ };
365
    for(int i=1; i<X-1; i++) pos[curPos++] = new float[] { i-lenX,  +lenY,  +lenZ };
366
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  -lenX, i-lenY,  -lenZ };
367
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  -lenX, i-lenY,  +lenZ };
368
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  +lenX, i-lenY,  -lenZ };
369
    for(int i=1; i<Y-1; i++) pos[curPos++] = new float[] {  +lenX, i-lenY,  +lenZ };
370
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  -lenX,  -lenY, i-lenZ };
371
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  -lenX,  +lenY, i-lenZ };
372
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  +lenX,  -lenY, i-lenZ };
373
    for(int i=1; i<Z-1; i++) pos[curPos++] = new float[] {  +lenX,  +lenY, i-lenZ };
374 dfdb26a9 Leszek Koltunski
375
    for(int y=1; y<Y-1; y++)
376 a135652b Leszek Koltunski
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {+lenX,y-lenY,z-lenZ};
377 dfdb26a9 Leszek Koltunski
378
    for(int y=1; y<Y-1; y++)
379 a135652b Leszek Koltunski
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {-lenX,y-lenY,z-lenZ};
380 dfdb26a9 Leszek Koltunski
381
    for(int x=1; x<X-1; x++)
382 a135652b Leszek Koltunski
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {x-lenX,+lenY,z-lenZ};
383 dfdb26a9 Leszek Koltunski
384
    for(int x=1; x<X-1; x++)
385 a135652b Leszek Koltunski
      for(int z=1; z<Z-1; z++) pos[curPos++] = new float[] {x-lenX,-lenY,z-lenZ};
386 dfdb26a9 Leszek Koltunski
387
    for(int x=1; x<X-1; x++)
388 a135652b Leszek Koltunski
      for(int y=1; y<Y-1; y++) pos[curPos++] = new float[] {x-lenX,y-lenY,+lenZ};
389 dfdb26a9 Leszek Koltunski
390
    for(int x=1; x<X-1; x++)
391 a135652b Leszek Koltunski
      for(int y=1; y<Y-1; y++) pos[curPos++] = new float[] {x-lenX,y-lenY,-lenZ};
392 8da6b1c9 Leszek Koltunski
393 a135652b Leszek Koltunski
    return pos;
394 8da6b1c9 Leszek Koltunski
    }
395
396 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
397
398 a57e6870 Leszek Koltunski
  protected Static4D getQuat(int cubit, int[] numLayers)
399 29b82486 Leszek Koltunski
    {
400
    if( mQuats ==null ) initializeQuats();
401 8da6b1c9 Leszek Koltunski
402 dfdb26a9 Leszek Koltunski
    int centerNum = getCenterNum(cubit,numLayers);
403 8da6b1c9 Leszek Koltunski
404 dfdb26a9 Leszek Koltunski
    switch(centerNum)
405 8da6b1c9 Leszek Koltunski
      {
406 dfdb26a9 Leszek Koltunski
      case 0 : return mQuats[13];
407
      case 1 : return mQuats[12];
408
      case 2 : return mQuats[ 8];
409
      case 3 : return mQuats[ 9];
410
      case 4 : return mQuats[ 0];
411
      case 5 : return mQuats[ 1];
412
      default: return mQuats[ 0];
413 8da6b1c9 Leszek Koltunski
      }
414 29b82486 Leszek Koltunski
    }
415
416
///////////////////////////////////////////////////////////////////////////////////////////////////
417
418 a57e6870 Leszek Koltunski
  protected int getNumCubitVariants(int[] numLayers)
419 29b82486 Leszek Koltunski
    {
420 a57e6870 Leszek Koltunski
    return numLayers[0]>2 ? 2:1;
421 29b82486 Leszek Koltunski
    }
422
423
///////////////////////////////////////////////////////////////////////////////////////////////////
424
425 a57e6870 Leszek Koltunski
  protected int getCubitVariant(int cubit, int[] numLayers)
426 29b82486 Leszek Koltunski
    {
427 dfdb26a9 Leszek Koltunski
    return cubit < getNumCornersAndEdges(numLayers) ? 0 : 1;
428 8da6b1c9 Leszek Koltunski
    }
429
430
///////////////////////////////////////////////////////////////////////////////////////////////////
431
432 a57e6870 Leszek Koltunski
  protected int getFaceColor(int cubit, int cubitface, int[] numLayers)
433 8da6b1c9 Leszek Koltunski
    {
434 dfdb26a9 Leszek Koltunski
    int centerNum = getCenterNum(cubit,numLayers);
435 8da6b1c9 Leszek Koltunski
436 dfdb26a9 Leszek Koltunski
    if( centerNum<0 )
437 8da6b1c9 Leszek Koltunski
      {
438 dfdb26a9 Leszek Koltunski
      int axis = cubitface/2;
439
      return CUBITS[cubit].getRotRow(axis) == (cubitface%2==0 ? (1<<(numLayers[axis]-1)):1) ? cubitface : NUM_TEXTURES;
440 8da6b1c9 Leszek Koltunski
      }
441
    else
442
      {
443 dfdb26a9 Leszek Koltunski
      return cubitface == 4 ? centerNum : NUM_TEXTURES;
444 8da6b1c9 Leszek Koltunski
      }
445 29b82486 Leszek Koltunski
    }
446
447
///////////////////////////////////////////////////////////////////////////////////////////////////
448
449
  protected ObjectSticker retSticker(int face)
450
    {
451
    if( mStickers==null )
452
      {
453
      final float[][] STICKERS = new float[][]  { { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f } };
454
      final float radius = 0.10f;
455
      final float[] radii = {radius,radius,radius,radius};
456
      mStickers = new ObjectSticker[STICKERS.length];
457 8592461c Leszek Koltunski
      float stroke = 0.08f;
458
459
      if( ObjectControl.isInIconMode() )
460
        {
461 a57e6870 Leszek Koltunski
        int[] numLayers = getNumLayers();
462
463
        switch(numLayers[0])
464 8592461c Leszek Koltunski
          {
465
          case 2: stroke*=1.8f; break;
466
          case 3: stroke*=2.0f; break;
467
          case 4: stroke*=2.1f; break;
468
          default:stroke*=2.2f; break;
469
          }
470
        }
471
472 29b82486 Leszek Koltunski
      mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke );
473
      }
474
475
    return mStickers[face/NUM_FACE_COLORS];
476
    }
477
478
///////////////////////////////////////////////////////////////////////////////////////////////////
479
480
  protected Static4D[] getQuats()
481
    {
482
    if( mQuats ==null ) initializeQuats();
483
    return mQuats;
484
    }
485
486
///////////////////////////////////////////////////////////////////////////////////////////////////
487
488 a57e6870 Leszek Koltunski
  protected float[][] getCuts(int[] numLayers)
489 29b82486 Leszek Koltunski
    {
490
    if( mCuts==null )
491
      {
492 dfdb26a9 Leszek Koltunski
      mCuts = new float[3][];
493
494
      int lenX = numLayers[0];
495
496
      if( lenX>=2 )
497
        {
498
        mCuts[0] = new float[lenX-1];
499
        for(int i=0; i<lenX-1; i++) mCuts[0][i] = (2-lenX)*0.5f + i;
500
        }
501
      else
502
        {
503
        mCuts[0] = null;
504
        }
505 29b82486 Leszek Koltunski
506 dfdb26a9 Leszek Koltunski
      int lenY = numLayers[1];
507
508
      if( lenY>=2 )
509
        {
510
        mCuts[1] = new float[lenY-1];
511
        for(int i=0; i<lenY-1; i++) mCuts[1][i] = (2-lenY)*0.5f + i;
512
        }
513
      else
514
        {
515
        mCuts[1] = null;
516
        }
517
518
      int lenZ = numLayers[2];
519
520
      if( lenZ>=2 )
521
        {
522
        mCuts[2] = new float[lenZ-1];
523
        for(int i=0; i<lenZ-1; i++) mCuts[2][i] = (2-lenZ)*0.5f + i;
524
        }
525
      else
526 29b82486 Leszek Koltunski
        {
527 dfdb26a9 Leszek Koltunski
        mCuts[2] = null;
528 29b82486 Leszek Koltunski
        }
529
      }
530
531
    return mCuts;
532
    }
533
534
///////////////////////////////////////////////////////////////////////////////////////////////////
535
536 a57e6870 Leszek Koltunski
  private void getLayerRotatable(int[] numLayers)
537 29b82486 Leszek Koltunski
    {
538
    if( mLayerRotatable==null )
539
      {
540
      int numAxis = ROT_AXIS.length;
541
      mLayerRotatable = new boolean[numAxis][];
542 a57e6870 Leszek Koltunski
543
      for(int i=0; i<numAxis; i++)
544
        {
545
        mLayerRotatable[i] = new boolean[numLayers[i]];
546
        for(int j=0; j<numLayers[i]; j++) mLayerRotatable[i][j] = true;
547
        }
548 29b82486 Leszek Koltunski
      }
549
    }
550
551
///////////////////////////////////////////////////////////////////////////////////////////////////
552
553
  protected int getSolvedFunctionIndex()
554
    {
555
    return 0;
556
    }
557
558
///////////////////////////////////////////////////////////////////////////////////////////////////
559
560 a57e6870 Leszek Koltunski
  protected int getNumStickerTypes(int[] numLayers)
561 29b82486 Leszek Koltunski
    {
562
    return 1;
563
    }
564
565
///////////////////////////////////////////////////////////////////////////////////////////////////
566
567
  protected int getNumCubitFaces()
568
    {
569
    return 6;
570
    }
571
572
///////////////////////////////////////////////////////////////////////////////////////////////////
573
// PUBLIC API
574
575
  public Static3D[] getRotationAxis()
576
    {
577
    return ROT_AXIS;
578
    }
579
580
///////////////////////////////////////////////////////////////////////////////////////////////////
581 dfdb26a9 Leszek Koltunski
// TODO
582 29b82486 Leszek Koltunski
583
  public Movement getMovement()
584
    {
585
    if( mMovement==null )
586
      {
587 a57e6870 Leszek Koltunski
      int[] numLayers = getNumLayers();
588 29b82486 Leszek Koltunski
      if( mCuts==null ) getCuts(numLayers);
589
      getLayerRotatable(numLayers);
590 a57e6870 Leszek Koltunski
      mMovement = new Movement6(ROT_AXIS,mCuts,mLayerRotatable,numLayers[0],TYPE_NOT_SPLIT,ENABLED);
591 29b82486 Leszek Koltunski
      }
592
    return mMovement;
593
    }
594
595
///////////////////////////////////////////////////////////////////////////////////////////////////
596
597
  public int[] getBasicAngle()
598
    {
599 dfdb26a9 Leszek Koltunski
    if( mBasicAngle==null )
600
      {
601
      int[] num = getNumLayers();
602
      int x = num[1]==num[2] ? 4 : 2;
603
      int y = num[0]==num[2] ? 4 : 2;
604
      int z = num[0]==num[1] ? 4 : 2;
605
606
      mBasicAngle = new int[] { x,y,z };
607
      }
608 29b82486 Leszek Koltunski
    return mBasicAngle;
609
    }
610
611 61aa85e4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
612 dfdb26a9 Leszek Koltunski
// TODO
613 61aa85e4 Leszek Koltunski
614 a57e6870 Leszek Koltunski
  public ObjectType intGetObjectType(int[] numLayers)
615 61aa85e4 Leszek Koltunski
    {
616 a57e6870 Leszek Koltunski
    switch(numLayers[0])
617 61aa85e4 Leszek Koltunski
      {
618 dfdb26a9 Leszek Koltunski
      case 2: return numLayers[1]==2 ? ObjectType.CUBE_2 : ObjectType.CU_223;
619
      case 3: return numLayers[1]==3 ? ObjectType.CUBE_3 : ObjectType.CU_334;
620 8005e762 Leszek Koltunski
      case 4: return ObjectType.CUBE_4;
621
      case 5: return ObjectType.CUBE_5;
622 61aa85e4 Leszek Koltunski
      }
623
624 8005e762 Leszek Koltunski
    return ObjectType.CUBE_3;
625 61aa85e4 Leszek Koltunski
    }
626
627 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
628
629 a57e6870 Leszek Koltunski
  public int getObjectName(int[] numLayers)
630 29b82486 Leszek Koltunski
    {
631 a57e6870 Leszek Koltunski
    switch(numLayers[0])
632 29b82486 Leszek Koltunski
      {
633
      case 2: return R.string.cube2;
634
      case 3: return R.string.cube3;
635
      case 4: return R.string.cube4;
636
      case 5: return R.string.cube5;
637
      }
638
    return R.string.cube3;
639
    }
640
641
///////////////////////////////////////////////////////////////////////////////////////////////////
642
643 a57e6870 Leszek Koltunski
  public int getInventor(int[] numLayers)
644 29b82486 Leszek Koltunski
    {
645 a57e6870 Leszek Koltunski
    switch(numLayers[0])
646 29b82486 Leszek Koltunski
      {
647
      case 2: return R.string.cube2_inventor;
648
      case 3: return R.string.cube3_inventor;
649
      case 4: return R.string.cube4_inventor;
650
      case 5: return R.string.cube5_inventor;
651
      }
652
    return R.string.cube3_inventor;
653
    }
654
655
///////////////////////////////////////////////////////////////////////////////////////////////////
656
657 a57e6870 Leszek Koltunski
  public int getComplexity(int[] numLayers)
658 29b82486 Leszek Koltunski
    {
659 a57e6870 Leszek Koltunski
    switch(numLayers[0])
660 29b82486 Leszek Koltunski
      {
661
      case 2: return 4;
662
      case 3: return 6;
663
      case 4: return 8;
664
      case 5: return 10;
665
      }
666
    return 6;
667
    }
668
}