Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyCuboid.java @ d6998705

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