Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistySkewb.java @ 4946b635

1 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.objects;
21
22
import android.content.res.Resources;
23
24 8655f3fe Leszek Koltunski
import org.distorted.helpers.ObjectShape;
25 9c06394a Leszek Koltunski
import org.distorted.helpers.ObjectSticker;
26 6cf89a3e Leszek Koltunski
import org.distorted.helpers.ScrambleState;
27 fb52fae9 Leszek Koltunski
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 6fd4a72c Leszek Koltunski
import org.distorted.main.R;
33 fb52fae9 Leszek Koltunski
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35
36 efa81f0c Leszek Koltunski
public class TwistySkewb extends Twisty6
37 fb52fae9 Leszek Koltunski
{
38
  static final Static3D[] ROT_AXIS = new Static3D[]
39
         {
40
           new Static3D(+SQ3/3,+SQ3/3,+SQ3/3),
41
           new Static3D(+SQ3/3,+SQ3/3,-SQ3/3),
42
           new Static3D(+SQ3/3,-SQ3/3,+SQ3/3),
43
           new Static3D(+SQ3/3,-SQ3/3,-SQ3/3)
44
         };
45
46 91792184 Leszek Koltunski
  private ScrambleState[] mStates;
47 8c3148e2 Leszek Koltunski
  private int[] mBasicAngle;
48
  private Static4D[] mQuats;
49 ef018c1b Leszek Koltunski
  private float[][] mCuts;
50
  private boolean[][] mLayerRotatable;
51 8c3148e2 Leszek Koltunski
  private int[][] mCornerMap,mEdgeMap,mCenterMap;
52
  private ObjectSticker[] mStickers;
53 e9a87113 Leszek Koltunski
  private Movement mMovement;
54 01b2ef5a Leszek Koltunski
55 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
56
57 9c2f0c91 Leszek Koltunski
  TwistySkewb(int size, Static4D quat, DistortedTexture texture,
58
              MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
59 fb52fae9 Leszek Koltunski
    {
60 db875721 Leszek Koltunski
    super(size, 2*size-2, quat, texture, mesh, effects, moves, ObjectList.SKEW, res, scrWidth);
61 91792184 Leszek Koltunski
    }
62 01b2ef5a Leszek Koltunski
63 91792184 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
64 01b2ef5a Leszek Koltunski
65 91792184 Leszek Koltunski
  ScrambleState[] getScrambleStates()
66
    {
67
    if( mStates==null )
68 01b2ef5a Leszek Koltunski
      {
69 91792184 Leszek Koltunski
      int size = getNumLayers();
70
      int[] tmp = {0,-1,0, 0,1,0, size-1,-1,0, size-1,1,0 };
71
72
      mStates = new ScrambleState[]
73
        {
74
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
75
        };
76
      }
77
78
    return mStates;
79 fb52fae9 Leszek Koltunski
    }
80
81 8c3148e2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83
  private void initializeQuats()
84
    {
85
    mQuats = new Static4D[]
86
         {
87
         new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),
88
         new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
89
         new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
90
         new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
91
92
         new Static4D(  0.5f,  0.5f,  0.5f,  0.5f ),
93
         new Static4D(  0.5f,  0.5f,  0.5f, -0.5f ),
94
         new Static4D(  0.5f,  0.5f, -0.5f,  0.5f ),
95
         new Static4D(  0.5f,  0.5f, -0.5f, -0.5f ),
96
         new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
97
         new Static4D(  0.5f, -0.5f,  0.5f, -0.5f ),
98
         new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
99
         new Static4D(  0.5f, -0.5f, -0.5f, -0.5f )
100
         };
101
    }
102
103 a480ee80 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
104
105
  int[] getSolvedQuats(int cubit, int numLayers)
106
    {
107 8c3148e2 Leszek Koltunski
    if( mQuats==null ) initializeQuats();
108 a480ee80 Leszek Koltunski
    int status = retCubitSolvedStatus(cubit,numLayers);
109 e782e026 Leszek Koltunski
    return status<0 ? null : buildSolvedQuats(MovementCornerTwisting.FACE_AXIS[status],mQuats);
110 a480ee80 Leszek Koltunski
    }
111
112 3f3ff476 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
113
114 d92030e4 Leszek Koltunski
  private int getNumCorners()
115 3f3ff476 Leszek Koltunski
    {
116
    return 8;
117
    }
118
119
///////////////////////////////////////////////////////////////////////////////////////////////////
120
121 b89898c5 Leszek Koltunski
  private int getNumEdges(int layers)
122 3f3ff476 Leszek Koltunski
    {
123 b89898c5 Leszek Koltunski
    return (layers-2)*12;
124 3f3ff476 Leszek Koltunski
    }
125
126
///////////////////////////////////////////////////////////////////////////////////////////////////
127
128 d92030e4 Leszek Koltunski
  private int getNumCentersPerFace(int layers)
129 3f3ff476 Leszek Koltunski
    {
130 d92030e4 Leszek Koltunski
    return ((layers-2)*(layers-2) + (layers-1)*(layers-1));
131 3f3ff476 Leszek Koltunski
    }
132
133 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
134
135
  Static4D[] getQuats()
136
    {
137 8c3148e2 Leszek Koltunski
    if( mQuats==null ) initializeQuats();
138
    return mQuats;
139 fb52fae9 Leszek Koltunski
    }
140
141 169219a7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
142
143
  int getSolvedFunctionIndex()
144
    {
145
    return 0;
146
    }
147
148 eab9d8f8 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
149
150 a64e07d0 Leszek Koltunski
  int getNumStickerTypes(int numLayers)
151 eab9d8f8 Leszek Koltunski
    {
152 3f3ff476 Leszek Koltunski
    return 3;
153 eab9d8f8 Leszek Koltunski
    }
154
155 7403cdfa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
156
157 e6734aa9 Leszek Koltunski
  float[][] getCuts(int numLayers)
158 7403cdfa Leszek Koltunski
    {
159 ef018c1b Leszek Koltunski
    if( mCuts==null )
160 a97e02b7 Leszek Koltunski
      {
161 ef018c1b Leszek Koltunski
      float[] c = numLayers==2 ? (new float[] {0.0f}) : (new float[] {-SQ3/6,+SQ3/6});
162
      mCuts = new float[][] {c,c,c,c};
163
      }
164
165
    return mCuts;
166
    }
167
168
///////////////////////////////////////////////////////////////////////////////////////////////////
169
170
  private void getLayerRotatable(int numLayers)
171
    {
172
    if( mLayerRotatable==null )
173
      {
174
      int numAxis = ROT_AXIS.length;
175
      boolean[] tmp = numLayers==2 ? (new boolean[] {true,true}) : (new boolean[] {true,false,true});
176
      mLayerRotatable = new boolean[numAxis][];
177
      for(int i=0; i<numAxis; i++) mLayerRotatable[i] = tmp;
178 a97e02b7 Leszek Koltunski
      }
179 7403cdfa Leszek Koltunski
    }
180
181 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
182
183
  int getNumCubitFaces()
184
    {
185 8c3148e2 Leszek Koltunski
    return 6;
186 fb52fae9 Leszek Koltunski
    }
187
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189
190 e6cf7283 Leszek Koltunski
  float[][] getCubitPositions(int numLayers)
191 fb52fae9 Leszek Koltunski
    {
192 74d67e50 Leszek Koltunski
    final float DIST_CORNER = numLayers-1;
193
    final float DIST_EDGE   = numLayers-1;
194
    final float DIST_CENTER = numLayers-1;
195 3f3ff476 Leszek Koltunski
196 d92030e4 Leszek Koltunski
    final int numCorners = getNumCorners();
197 b89898c5 Leszek Koltunski
    final int numEdges   = getNumEdges(numLayers);
198 d92030e4 Leszek Koltunski
    final int numCenters = 6*getNumCentersPerFace(numLayers);
199 3f3ff476 Leszek Koltunski
200 e6cf7283 Leszek Koltunski
    final float[][] CENTERS = new float[numCorners+numEdges+numCenters][];
201 3f3ff476 Leszek Koltunski
202
    /// CORNERS //////////////////////////////////////////////
203
204 e6cf7283 Leszek Koltunski
    CENTERS[0] = new float[] { DIST_CORNER, DIST_CORNER, DIST_CORNER };
205
    CENTERS[1] = new float[] { DIST_CORNER, DIST_CORNER,-DIST_CORNER };
206
    CENTERS[2] = new float[] { DIST_CORNER,-DIST_CORNER, DIST_CORNER };
207
    CENTERS[3] = new float[] { DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
208
    CENTERS[4] = new float[] {-DIST_CORNER, DIST_CORNER, DIST_CORNER };
209
    CENTERS[5] = new float[] {-DIST_CORNER, DIST_CORNER,-DIST_CORNER };
210
    CENTERS[6] = new float[] {-DIST_CORNER,-DIST_CORNER, DIST_CORNER };
211
    CENTERS[7] = new float[] {-DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
212 3f3ff476 Leszek Koltunski
213
    /// EDGES ///////////////////////////////////////////////
214
215
    final float[][]  edgeTable =
216
        {
217
            {0,+DIST_EDGE,+DIST_EDGE},
218
            {+DIST_EDGE,0,+DIST_EDGE},
219
            {0,-DIST_EDGE,+DIST_EDGE},
220
            {-DIST_EDGE,0,+DIST_EDGE},
221
            {+DIST_EDGE,+DIST_EDGE,0},
222
            {+DIST_EDGE,-DIST_EDGE,0},
223
            {-DIST_EDGE,-DIST_EDGE,0},
224
            {-DIST_EDGE,+DIST_EDGE,0},
225
            {0,+DIST_EDGE,-DIST_EDGE},
226
            {+DIST_EDGE,0,-DIST_EDGE},
227
            {0,-DIST_EDGE,-DIST_EDGE},
228
            {-DIST_EDGE,0,-DIST_EDGE}
229
        };
230
231
    int index=8;
232
233
    for (float[] edges : edgeTable)
234
      {
235 74d67e50 Leszek Koltunski
      float c = 3-numLayers;
236 3f3ff476 Leszek Koltunski
237 74d67e50 Leszek Koltunski
      for (int j=0; j<numLayers-2; j++, c+=2, index++)
238 3f3ff476 Leszek Koltunski
        {
239 e6cf7283 Leszek Koltunski
        CENTERS[index] = new float[] { edges[0]==0 ? c : edges[0] ,
240 3f3ff476 Leszek Koltunski
                                       edges[1]==0 ? c : edges[1] ,
241 e6cf7283 Leszek Koltunski
                                       edges[2]==0 ? c : edges[2] };
242 3f3ff476 Leszek Koltunski
        }
243
      }
244
245
    /// CENTERS //////////////////////////////////////////////
246
247
    final float X= -1000.0f;
248
    final float Y= -1001.0f;
249
250
    final float[][]  centerTable =
251
        {
252
            {+DIST_CENTER,X,Y},
253
            {-DIST_CENTER,X,Y},
254
            {X,+DIST_CENTER,Y},
255
            {X,-DIST_CENTER,Y},
256
            {X,Y,+DIST_CENTER},
257
            {X,Y,-DIST_CENTER}
258
        };
259
260
    float x,y, cen0, cen1, cen2;
261
262
    for( float[] centers : centerTable )
263
      {
264 74d67e50 Leszek Koltunski
      x = 2-numLayers;
265 3f3ff476 Leszek Koltunski
266 74d67e50 Leszek Koltunski
      for(int i=0; i<numLayers-1; i++, x+=2)
267 3f3ff476 Leszek Koltunski
        {
268 74d67e50 Leszek Koltunski
        y = 2-numLayers;
269 3f3ff476 Leszek Koltunski
270 74d67e50 Leszek Koltunski
        for(int j=0; j<numLayers-1; j++, y+=2, index++)
271 3f3ff476 Leszek Koltunski
          {
272
               if( centers[0]==Y ) cen0 = y;
273
          else if( centers[0]==X ) cen0 = x;
274
          else                     cen0 = centers[0];
275
276
               if( centers[1]==Y ) cen1 = y;
277
          else if( centers[1]==X ) cen1 = x;
278
          else                     cen1 = centers[1];
279
280
               if( centers[2]==Y ) cen2 = y;
281
          else if( centers[2]==X ) cen2 = x;
282
          else                     cen2 = centers[2];
283
284 e6cf7283 Leszek Koltunski
          CENTERS[index] = new float[] {cen0,cen1,cen2};
285 3f3ff476 Leszek Koltunski
          }
286
        }
287
288 74d67e50 Leszek Koltunski
      x = 3-numLayers;
289 3f3ff476 Leszek Koltunski
290 74d67e50 Leszek Koltunski
      for(int i=0; i<numLayers-2; i++, x+=2)
291 3f3ff476 Leszek Koltunski
        {
292 74d67e50 Leszek Koltunski
        y = 3-numLayers;
293 3f3ff476 Leszek Koltunski
294 74d67e50 Leszek Koltunski
        for(int j=0; j<numLayers-2; j++, y+=2, index++)
295 3f3ff476 Leszek Koltunski
          {
296
               if( centers[0]==Y ) cen0 = y;
297
          else if( centers[0]==X ) cen0 = x;
298
          else                     cen0 = centers[0];
299
300
               if( centers[1]==Y ) cen1 = y;
301
          else if( centers[1]==X ) cen1 = x;
302
          else                     cen1 = centers[1];
303
304
               if( centers[2]==Y ) cen2 = y;
305
          else if( centers[2]==X ) cen2 = x;
306
          else                     cen2 = centers[2];
307
308 e6cf7283 Leszek Koltunski
          CENTERS[index] = new float[] {cen0,cen1,cen2};
309 3f3ff476 Leszek Koltunski
          }
310
        }
311
      }
312
313 fb52fae9 Leszek Koltunski
    return CENTERS;
314
    }
315
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317
318 3e605536 Leszek Koltunski
  Static4D getQuat(int cubit, int numLayers)
319 fb52fae9 Leszek Koltunski
    {
320 8c3148e2 Leszek Koltunski
    if( mQuats==null ) initializeQuats();
321 d92030e4 Leszek Koltunski
    int numCorners = getNumCorners();
322
    int numEdges   = getNumEdges(numLayers);
323 3f3ff476 Leszek Koltunski
324
    if( cubit<numCorners )
325
      {
326
      switch(cubit)
327
        {
328 8c3148e2 Leszek Koltunski
        case  0: return mQuats[0];                         //  unit quat
329 3f3ff476 Leszek Koltunski
        case  1: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
330
        case  2: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
331 8c3148e2 Leszek Koltunski
        case  3: return mQuats[1];                         // 180 along X
332 3f3ff476 Leszek Koltunski
        case  4: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
333 8c3148e2 Leszek Koltunski
        case  5: return mQuats[2];                         // 180 along Y
334
        case  6: return mQuats[3];                         // 180 along Z
335 3f3ff476 Leszek Koltunski
        case  7: return new Static4D(SQ2/2,0,-SQ2/2,0);    // 180 along (SQ2/2,0,-SQ2/2)
336
        }
337
      }
338
    else if( cubit<numCorners+numEdges )
339
      {
340 d92030e4 Leszek Koltunski
      int edge = (cubit-numCorners)/(numLayers-2);
341 3f3ff476 Leszek Koltunski
342
      switch(edge)
343
        {
344 8c3148e2 Leszek Koltunski
        case  0: return mQuats[ 0];
345
        case  1: return mQuats[ 5];
346
        case  2: return mQuats[ 3];
347
        case  3: return mQuats[11];
348
        case  4: return mQuats[ 4];
349
        case  5: return mQuats[ 7];
350
        case  6: return mQuats[ 9];
351
        case  7: return mQuats[10];
352
        case  8: return mQuats[ 2];
353
        case  9: return mQuats[ 8];
354
        case 10: return mQuats[ 1];
355
        case 11: return mQuats[ 6];
356 3f3ff476 Leszek Koltunski
        }
357
      }
358
    else
359 fb52fae9 Leszek Koltunski
      {
360 d92030e4 Leszek Koltunski
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
361 3f3ff476 Leszek Koltunski
362
      switch(center)
363
        {
364
        case 0: return new Static4D(0,-SQ2/2,0,SQ2/2);    // -90 along Y
365
        case 1: return new Static4D(0, SQ2/2,0,SQ2/2);    //  90 along Y
366
        case 2: return new Static4D( SQ2/2,0,0,SQ2/2);    //  90 along X
367
        case 3: return new Static4D(-SQ2/2,0,0,SQ2/2);    // -90 along X
368 8c3148e2 Leszek Koltunski
        case 4: return mQuats[0];                         //  unit quaternion
369
        case 5: return mQuats[1];                         // 180 along X
370 3f3ff476 Leszek Koltunski
        }
371 fb52fae9 Leszek Koltunski
      }
372
373
    return null;
374
    }
375
376
///////////////////////////////////////////////////////////////////////////////////////////////////
377
378 8655f3fe Leszek Koltunski
  ObjectShape getObjectShape(int cubit, int numLayers)
379 fb52fae9 Leszek Koltunski
    {
380 8655f3fe Leszek Koltunski
    int variant = getCubitVariant(cubit,numLayers);
381 fb52fae9 Leszek Koltunski
382 8655f3fe Leszek Koltunski
    if( variant==0 )
383 fb52fae9 Leszek Koltunski
      {
384 74d67e50 Leszek Koltunski
      double[][] vertices = new double[][] { {-1,0,0},{0,-1,0},{0,0,-1},{-1,-1,-1},{0,0,0} };
385 8c3148e2 Leszek Koltunski
      int[][] vert_indices = new int[][] { {0,1,4},{2,0,4},{1,2,4},{3,1,0},{3,2,1},{3,0,2} };
386 8655f3fe Leszek Koltunski
      int N = numLayers==2 ? 7:5;
387
      int E1= numLayers==2 ? 3:2;
388
      int E2= numLayers==2 ? 5:3;
389 74d67e50 Leszek Koltunski
      float[][] bands     = new float[][] { {0.020f,35,0.16f,0.7f,N,E1,E1}, {0.000f, 0,1.00f,0.0f,3,1,E2} };
390 8655f3fe Leszek Koltunski
      int[] bandIndices   = new int[] { 0,0,0,1,1,1 };
391 74d67e50 Leszek Koltunski
      float[][] corners   = new float[][] { {0.05f,0.25f}, {0.05f,0.20f} };
392 8655f3fe Leszek Koltunski
      int[] cornerIndices = new int[] { 1,1,1,0,0 };
393 74d67e50 Leszek Koltunski
      float[][] centers   = new float[][] { {-0.5f, -0.5f, -0.5f} };
394 8655f3fe Leszek Koltunski
      int[] centerIndices = new int[] { 0,0,0,-1,0 };
395 8c3148e2 Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
396 fb52fae9 Leszek Koltunski
      }
397 8655f3fe Leszek Koltunski
    else if( variant==1 )
398 3f3ff476 Leszek Koltunski
      {
399 74d67e50 Leszek Koltunski
      double[][] vertices = new double[][] { {-1,0,0},{1,0,0},{0,-1,0},{0,0,-1} };
400 8c3148e2 Leszek Koltunski
      int[][] vert_indices = new int[][] { {2,1,0},{3,0,1},{2,3,1},{3,2,0} };
401 8655f3fe Leszek Koltunski
      int N = numLayers==2 ? 7:5;
402
      int E = numLayers==2 ? 5:2;
403 3e605536 Leszek Koltunski
      float[][] bands     = new float[][] { {0.035f,30,0.16f,0.8f,N,2,E}, {0.020f,45,0.16f,0.2f,3,1,2} };
404 8655f3fe Leszek Koltunski
      int[] bandIndices   = new int[] { 0,0,1,1 };
405
      float[][] corners   = new float[][] { {0.07f,0.20f}, {0.02f,0.30f} };
406
      int[] cornerIndices = new int[] { 0,0,1,1 };
407 74d67e50 Leszek Koltunski
      float[][] centers   = new float[][] { {0.0f, -0.5f, -0.5f} };
408 8655f3fe Leszek Koltunski
      int[] centerIndices = new int[] { 0,0,0,0 };
409 8c3148e2 Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
410 3f3ff476 Leszek Koltunski
      }
411 fb52fae9 Leszek Koltunski
    else
412
      {
413 74d67e50 Leszek Koltunski
      double[][] vertices = new double[][] { {-1,0,0},{0,-1,0},{1,0,0},{0,1,0},{0,0,-1} };
414 8c3148e2 Leszek Koltunski
      int[][] vert_indices = new int[][] { {0,1,2,3},{4,1,0},{4,2,1},{4,3,2},{4,0,3} };
415 8655f3fe Leszek Koltunski
      int N = numLayers==2 ? 7:6;
416
      int E = numLayers==2 ? 3:1;
417 74d67e50 Leszek Koltunski
      float[][] bands     = new float[][] { {0.04f,35,SQ2/8,0.9f,N,E,E}, {0.000f,0,1,0.0f,3,0,0} };
418 8655f3fe Leszek Koltunski
      int[] bandIndices   = new int[] { 0,1,1,1,1 };
419 74d67e50 Leszek Koltunski
      float[][] corners   = new float[][] { {0.06f,0.15f} };
420 8655f3fe Leszek Koltunski
      int[] cornerIndices = new int[] { 0,0,0,0,0 };
421 74d67e50 Leszek Koltunski
      float[][] centers   = new float[][] { {0,0,-0.4f} };
422 8655f3fe Leszek Koltunski
      int[] centerIndices = new int[] { 0,0,0,0,-1 };
423 8c3148e2 Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
424 8655f3fe Leszek Koltunski
      }
425
    }
426
427
///////////////////////////////////////////////////////////////////////////////////////////////////
428
429 3e605536 Leszek Koltunski
  int getNumCubitVariants(int numLayers)
430 8655f3fe Leszek Koltunski
    {
431
    return 3;
432
    }
433
434
///////////////////////////////////////////////////////////////////////////////////////////////////
435
436
  int getCubitVariant(int cubit, int numLayers)
437
    {
438
    int numCorners = getNumCorners();
439
    if( cubit<numCorners ) return 0;
440
    int numEdges = getNumEdges(numLayers);
441
    return cubit<numCorners+numEdges ? 1:2;
442
    }
443
444 fb52fae9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
445
446 d92030e4 Leszek Koltunski
  int getFaceColor(int cubit, int cubitface, int numLayers)
447 fb52fae9 Leszek Koltunski
    {
448 8c3148e2 Leszek Koltunski
    if( mCornerMap==null || mEdgeMap==null || mCenterMap==null )
449
      {
450
      mCornerMap = new int[][]
451
         {
452
           {  4, 2, 0, 18,18,18 },
453
           {  2, 5, 0, 18,18,18 },
454
           {  3, 4, 0, 18,18,18 },
455
           {  5, 3, 0, 18,18,18 },
456
           {  1, 2, 4, 18,18,18 },
457
           {  5, 2, 1, 18,18,18 },
458
           {  4, 3, 1, 18,18,18 },
459
           {  1, 3, 5, 18,18,18 },
460
         };
461
462
      mEdgeMap = new int[][]
463
         {
464
           { 10, 8, 18,18,18,18 },
465
           {  6,10, 18,18,18,18 },
466
           { 10, 9, 18,18,18,18 },
467
           {  7,10, 18,18,18,18 },
468
           {  8, 6, 18,18,18,18 },
469
           {  9, 6, 18,18,18,18 },
470
           {  9, 7, 18,18,18,18 },
471
           {  8, 7, 18,18,18,18 },
472
           { 11, 8, 18,18,18,18 },
473
           {  6,11, 18,18,18,18 },
474
           { 11, 9, 18,18,18,18 },
475
           {  7,11, 18,18,18,18 }
476
         };
477
478
      mCenterMap = new int[][]
479
         {
480
           { 12, 18,18,18,18,18 },
481
           { 13, 18,18,18,18,18 },
482
           { 14, 18,18,18,18,18 },
483
           { 15, 18,18,18,18,18 },
484
           { 16, 18,18,18,18,18 },
485
           { 17, 18,18,18,18,18 },
486
         };
487
      }
488
489 d92030e4 Leszek Koltunski
    int numCorners = getNumCorners();
490
    int numEdges   = getNumEdges(numLayers);
491 3f3ff476 Leszek Koltunski
492
    if( cubit<numCorners )
493
      {
494
      return mCornerMap[cubit][cubitface];
495
      }
496
    else if( cubit<numCorners+numEdges )
497
      {
498 d92030e4 Leszek Koltunski
      int edge = (cubit-numCorners)/(numLayers-2);
499 3f3ff476 Leszek Koltunski
      return mEdgeMap[edge][cubitface];
500
      }
501
    else
502
      {
503 d92030e4 Leszek Koltunski
      int center = (cubit-numCorners-numEdges)/getNumCentersPerFace(numLayers);
504 3f3ff476 Leszek Koltunski
      return mCenterMap[center][cubitface];
505
      }
506 fb52fae9 Leszek Koltunski
    }
507
508 9c06394a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
509 ae755eda Leszek Koltunski
510 9c06394a Leszek Koltunski
  ObjectSticker retSticker(int face)
511
    {
512 8c3148e2 Leszek Koltunski
    if( mStickers==null )
513
      {
514
      float[][] STICKERS = new float[][]
515
          {
516
             { -0.5f, 0.25f, 0.25f,  -0.5f, 0.25f, 0.25f  },
517
             { -0.5f, 0.00f, 0.00f,  -0.5f, 0.50f, 0.0f, 0.0f, 0.5f }
518
          };
519
520
      final float R1 = 0.025f;
521
      final float R2 = 0.025f;
522
      final float R3 = 0.055f;
523
      final float[][] radii  = { { R1,R1,R1 },{ R2,R2,R2 },{ R3,R3,R3,R3 } };
524
      final float[] strokes = { 0.045f, 0.035f, 0.035f };
525
526
      mStickers = new ObjectSticker[STICKERS.length+1];
527
528
      for(int s=0; s<STICKERS.length+1; s++)
529
        {
530
        int index = s<2 ? 0:1;
531
        mStickers[s] = new ObjectSticker(STICKERS[index],null,radii[s],strokes[s]);
532
        }
533
      }
534
535 abf36986 Leszek Koltunski
    return mStickers[face/NUM_FACE_COLORS];
536 fb52fae9 Leszek Koltunski
    }
537
538
///////////////////////////////////////////////////////////////////////////////////////////////////
539 e1dc3366 Leszek Koltunski
// PUBLIC API
540 fb52fae9 Leszek Koltunski
541 e1dc3366 Leszek Koltunski
  public Static3D[] getRotationAxis()
542
    {
543
    return ROT_AXIS;
544
    }
545
546 e9a87113 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
547
548
  public Movement getMovement()
549
    {
550 ef018c1b Leszek Koltunski
    if( mMovement==null )
551
      {
552
      int numLayers = getNumLayers();
553
      if( mCuts==null ) getCuts(numLayers);
554
      getLayerRotatable(numLayers);
555
556 4946b635 Leszek Koltunski
      mMovement = new MovementCornerTwisting(mCuts,mLayerRotatable,2*numLayers-2);
557 ef018c1b Leszek Koltunski
      }
558 e9a87113 Leszek Koltunski
    return mMovement;
559
    }
560
561 e1dc3366 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
562
563
  public int[] getBasicAngle()
564
    {
565 8c3148e2 Leszek Koltunski
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 3,3,3,3 };
566
    return mBasicAngle;
567 e1dc3366 Leszek Koltunski
    }
568
569 6fd4a72c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
570
571
  public int getObjectName(int numLayers)
572
    {
573
    switch(numLayers)
574
      {
575
      case 2: return R.string.skew2;
576
      case 3: return R.string.skew3;
577
      }
578
    return R.string.skew2;
579
    }
580
581
///////////////////////////////////////////////////////////////////////////////////////////////////
582
583
  public int getInventor(int numLayers)
584
    {
585
    switch(numLayers)
586
      {
587
      case 2: return R.string.skew2_inventor;
588
      case 3: return R.string.skew3_inventor;
589
      }
590
    return R.string.skew2_inventor;
591
    }
592
593
///////////////////////////////////////////////////////////////////////////////////////////////////
594
595
  public int getComplexity(int numLayers)
596
    {
597
    switch(numLayers)
598
      {
599 d5ca9927 Leszek Koltunski
      case 2: return 4;
600
      case 3: return 8;
601 6fd4a72c Leszek Koltunski
      }
602
    return 5;
603
    }
604 fb52fae9 Leszek Koltunski
}