Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistySkewb.java @ 74d67e50

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