Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyPyraminx.java @ 7ee89540

1 e844c116 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 1f9772f3 Leszek Koltunski
package org.distorted.objects;
21 e844c116 Leszek Koltunski
22 967c1d17 Leszek Koltunski
import static org.distorted.objects.Movement.TYPE_NOT_SPLIT;
23
24 ccf9fec5 Leszek Koltunski
import android.content.res.Resources;
25 e844c116 Leszek Koltunski
26 045d8cbd Leszek Koltunski
import org.distorted.helpers.ObjectShape;
27 9c06394a Leszek Koltunski
import org.distorted.helpers.ObjectSticker;
28 bbbfb6af Leszek Koltunski
import org.distorted.helpers.ScrambleState;
29 e844c116 Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
30
import org.distorted.library.main.DistortedTexture;
31 efa8aa48 Leszek Koltunski
import org.distorted.library.mesh.MeshSquare;
32 e844c116 Leszek Koltunski
import org.distorted.library.type.Static3D;
33
import org.distorted.library.type.Static4D;
34 6fd4a72c Leszek Koltunski
import org.distorted.main.R;
35 e844c116 Leszek Koltunski
36
///////////////////////////////////////////////////////////////////////////////////////////////////
37
38 efa81f0c Leszek Koltunski
public class TwistyPyraminx extends Twisty4
39 e844c116 Leszek Koltunski
{
40 ad38d800 Leszek Koltunski
  static final Static3D[] ROT_AXIS = new Static3D[]
41 e844c116 Leszek Koltunski
         {
42 ac940e24 Leszek Koltunski
           new Static3D(     0,-SQ3/3,-SQ6/3),
43
           new Static3D(     0,-SQ3/3,+SQ6/3),
44
           new Static3D(+SQ6/3,+SQ3/3,     0),
45
           new Static3D(-SQ6/3,+SQ3/3,     0),
46 ad38d800 Leszek Koltunski
         };
47
48 967c1d17 Leszek Koltunski
  private static final int[][][] ENABLED = new int[][][]
49
      {
50
          {{1,2,3}},{{0,2,3}},{{0,1,3}},{{0,1,2}}
51
      };
52
53 bbbfb6af Leszek Koltunski
  private ScrambleState[] mStates;
54 48fec01e Leszek Koltunski
  private int[] mBasicAngle;
55
  private Static4D[] mQuats;
56 ef018c1b Leszek Koltunski
  private float[][] mCuts;
57
  private boolean[][] mLayerRotatable;
58 48fec01e Leszek Koltunski
  private ObjectSticker[] mStickers;
59 e9a87113 Leszek Koltunski
  private Movement mMovement;
60 bbbfb6af Leszek Koltunski
61 e844c116 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
62
63 ac940e24 Leszek Koltunski
  TwistyPyraminx(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
64
                 DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
65 e844c116 Leszek Koltunski
    {
66 db875721 Leszek Koltunski
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.PYRA, res, scrWidth);
67 91792184 Leszek Koltunski
    }
68 bbbfb6af Leszek Koltunski
69 91792184 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
70
71
  ScrambleState[] getScrambleStates()
72
    {
73
    if( mStates==null )
74
      {
75
      int numLayers = getNumLayers();
76
      initializeScrambleStates(numLayers);
77
      }
78
79
    return mStates;
80 e844c116 Leszek Koltunski
    }
81
82 48fec01e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
83
84
  private void initializeQuats()
85
    {
86
    mQuats = new Static4D[]
87
         {
88
         new Static4D(  0.0f,   0.0f,   0.0f,  1.0f),
89
         new Static4D(  0.0f,   1.0f,   0.0f,  0.0f),
90
         new Static4D( SQ2/2,   0.5f,   0.0f,  0.5f),
91
         new Static4D(-SQ2/2,   0.5f,   0.0f,  0.5f),
92
         new Static4D(  0.0f,  -0.5f, -SQ2/2,  0.5f),
93
         new Static4D(  0.0f,  -0.5f,  SQ2/2,  0.5f),
94
         new Static4D( SQ2/2,   0.5f,   0.0f, -0.5f),
95
         new Static4D(-SQ2/2,   0.5f,   0.0f, -0.5f),
96
         new Static4D(  0.0f,  -0.5f, -SQ2/2, -0.5f),
97
         new Static4D(  0.0f,  -0.5f,  SQ2/2, -0.5f),
98
         new Static4D( SQ2/2,   0.0f,  SQ2/2,  0.0f),
99
         new Static4D(-SQ2/2,   0.0f,  SQ2/2,  0.0f)
100
         };
101
    }
102
103 a480ee80 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
104
105 bbbfb6af Leszek Koltunski
  private int[][] generateState(int start, int end)
106 a480ee80 Leszek Koltunski
    {
107 bbbfb6af Leszek Koltunski
    int len = end-start+1;
108
    int[] tmp = new int[6*len];
109
110
    for(int i=0; i<len; i++)
111
      {
112
      tmp[6*i  ] = start;
113
      tmp[6*i+1] = -1;
114
      tmp[6*i+2] = start;
115
      tmp[6*i+3] = start;
116
      tmp[6*i+4] = +1;
117
      tmp[6*i+5] = start;
118
119
      start++;
120
      }
121
122
    return new int[][] {tmp,tmp,tmp,tmp};
123 a480ee80 Leszek Koltunski
    }
124
125 0203be88 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
126
127 bbbfb6af Leszek Koltunski
  private void initializeScrambleStates(int numLayers)
128 0203be88 Leszek Koltunski
    {
129 bbbfb6af Leszek Koltunski
    mStates = new ScrambleState[numLayers];
130 0203be88 Leszek Koltunski
131 bbbfb6af Leszek Koltunski
    for(int i=0; i<numLayers-1; i++)
132 0203be88 Leszek Koltunski
      {
133 bbbfb6af Leszek Koltunski
      mStates[i] = new ScrambleState( generateState(0,numLayers-1-i) );
134 0203be88 Leszek Koltunski
      }
135
136 bbbfb6af Leszek Koltunski
    mStates[numLayers-1] = new ScrambleState( generateState(1,numLayers-2) );
137
    }
138
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140
141
  int[] getSolvedQuats(int cubit, int numLayers)
142
    {
143 48fec01e Leszek Koltunski
    if( mQuats==null ) initializeQuats();
144 bbbfb6af Leszek Koltunski
    int status = retCubitSolvedStatus(cubit,numLayers);
145 967c1d17 Leszek Koltunski
    return status<0 ? null : buildSolvedQuats(Movement4.FACE_AXIS[status],mQuats);
146 0203be88 Leszek Koltunski
    }
147
148 e844c116 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
149
150 e6cf7283 Leszek Koltunski
  private void addTetrahedralLattice(int size, int index, float[][] pos)
151 49f67f9b Leszek Koltunski
    {
152 ac940e24 Leszek Koltunski
    final float DX = 1.0f;
153
    final float DY = SQ2/2;
154
    final float DZ = 1.0f;
155 49f67f9b Leszek Koltunski
156 ac940e24 Leszek Koltunski
    float startX = 0.0f;
157
    float startY =-DY*(size-1)/2;
158
    float startZ = DZ*(size-1)/2;
159 769409d2 Leszek Koltunski
160 ac940e24 Leszek Koltunski
    for(int layer=0; layer<size; layer++)
161 49f67f9b Leszek Koltunski
      {
162 ac940e24 Leszek Koltunski
      float currX = startX;
163
      float currY = startY;
164
165
      for(int x=0; x<layer+1; x++)
166
        {
167
        float currZ = startZ;
168
169
        for(int z=0; z<size-layer; z++)
170
          {
171 e6cf7283 Leszek Koltunski
          pos[index] = new float[] {currX,currY,currZ};
172 ac940e24 Leszek Koltunski
          index++;
173
          currZ -= DZ;
174
          }
175
176
        currX += DX;
177
        }
178
179
      startX-=DX/2;
180
      startY+=DY;
181
      startZ-=DZ/2;
182 49f67f9b Leszek Koltunski
      }
183
    }
184
185
///////////////////////////////////////////////////////////////////////////////////////////////////
186 ac940e24 Leszek Koltunski
// there are (n^3-n)/6 octahedrons and ((n+1)^3 - (n+1))/6 tetrahedrons
187 49f67f9b Leszek Koltunski
188 e6cf7283 Leszek Koltunski
  float[][] getCubitPositions(int size)
189 e844c116 Leszek Koltunski
    {
190 ac940e24 Leszek Koltunski
    int numOcta = (size-1)*size*(size+1)/6;
191
    int numTetra= size*(size+1)*(size+2)/6;
192 e6cf7283 Leszek Koltunski
    float[][] ret = new float[numOcta+numTetra][];
193 49f67f9b Leszek Koltunski
194 ac940e24 Leszek Koltunski
    addTetrahedralLattice(size-1,      0,ret);
195
    addTetrahedralLattice(size  ,numOcta,ret);
196 49f67f9b Leszek Koltunski
197 ac940e24 Leszek Koltunski
    return ret;
198 e844c116 Leszek Koltunski
    }
199
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201
202 10585385 Leszek Koltunski
  Static4D[] getQuats()
203 e844c116 Leszek Koltunski
    {
204 48fec01e Leszek Koltunski
    if( mQuats==null ) initializeQuats();
205
    return mQuats;
206 e844c116 Leszek Koltunski
    }
207
208 169219a7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
209
210
  int getSolvedFunctionIndex()
211
    {
212
    return 0;
213
    }
214
215 eab9d8f8 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
216
217 a64e07d0 Leszek Koltunski
  int getNumStickerTypes(int numLayers)
218 eab9d8f8 Leszek Koltunski
    {
219 48fec01e Leszek Koltunski
    return 1;
220 eab9d8f8 Leszek Koltunski
    }
221
222 7403cdfa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
223
224 5da517d3 Leszek Koltunski
  float[][] getCuts(int numLayers)
225 7403cdfa Leszek Koltunski
    {
226 ef018c1b Leszek Koltunski
    if( mCuts==null )
227 a97e02b7 Leszek Koltunski
      {
228 ef018c1b Leszek Koltunski
      mCuts = new float[4][numLayers-1];
229
230
      for(int i=0; i<numLayers-1; i++)
231
        {
232 4946b635 Leszek Koltunski
        float cut = (1.0f+i-numLayers/4.0f)*(SQ6/3);
233 ef018c1b Leszek Koltunski
        mCuts[0][i] = cut;
234
        mCuts[1][i] = cut;
235
        mCuts[2][i] = cut;
236
        mCuts[3][i] = cut;
237
        }
238 a97e02b7 Leszek Koltunski
      }
239
240 ef018c1b Leszek Koltunski
    return mCuts;
241
    }
242
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244
245
  private void getLayerRotatable(int numLayers)
246
    {
247
    if( mLayerRotatable==null )
248
      {
249
      int numAxis = ROT_AXIS.length;
250
      boolean[] tmp = new boolean[numLayers];
251
      for(int i=0; i<numLayers; i++) tmp[i] = true;
252
      mLayerRotatable = new boolean[numAxis][];
253
      for(int i=0; i<numAxis; i++) mLayerRotatable[i] = tmp;
254
      }
255 7403cdfa Leszek Koltunski
    }
256
257 8f53e513 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
258
259
  int getNumCubitFaces()
260
    {
261 ac940e24 Leszek Koltunski
    return 8;
262 8f53e513 Leszek Koltunski
    }
263
264 31cd7256 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
265
266
  private int getNumOctahedrons(int numLayers)
267
    {
268
    return (numLayers-1)*numLayers*(numLayers+1)/6;
269
    }
270
271 f6d06256 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
272
273 ac940e24 Leszek Koltunski
  private int faceColor(int cubit, int axis)
274 f6d06256 Leszek Koltunski
    {
275 abf36986 Leszek Koltunski
    return CUBITS[cubit].mRotationRow[axis] == 1 ? axis : NUM_TEXTURES;
276 f6d06256 Leszek Koltunski
    }
277
278 f0fa83ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
279
280 ac940e24 Leszek Koltunski
  int getFaceColor(int cubit, int cubitface, int size)
281 e844c116 Leszek Koltunski
    {
282 ac940e24 Leszek Koltunski
    if( cubit< (size-1)*size*(size+1)/6 )
283 40ab026e Leszek Koltunski
      {
284 ac940e24 Leszek Koltunski
      switch( cubitface )
285
        {
286
        case 0: return faceColor(cubit,0);
287
        case 2: return faceColor(cubit,1);
288
        case 5: return faceColor(cubit,3);
289
        case 7: return faceColor(cubit,2);
290 abf36986 Leszek Koltunski
        default:return NUM_TEXTURES;
291 ac940e24 Leszek Koltunski
        }
292 40ab026e Leszek Koltunski
      }
293 ac940e24 Leszek Koltunski
    else
294 89a11f7b Leszek Koltunski
      {
295 abf36986 Leszek Koltunski
      return cubitface<NUM_TEXTURES ? faceColor(cubit,cubitface) : NUM_TEXTURES;
296 89a11f7b Leszek Koltunski
      }
297 e844c116 Leszek Koltunski
    }
298
299 045d8cbd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
300
301
  ObjectShape getObjectShape(int cubit, int numLayers)
302
    {
303
    int variant = getCubitVariant(cubit,numLayers);
304
305
    if( variant==0 )
306
      {
307 48fec01e Leszek Koltunski
      double[][] vertices = new double[][] { { 0.5,0.0,0.5},{ 0.5,0.0,-0.5},{-0.5,0.0,-0.5},{-0.5,0.0,0.5},{ 0.0,SQ2/2,0.0},{ 0.0,-SQ2/2,0.0} };
308
      int[][] vert_indices = new int[][] { {3,0,4},{0,1,4},{1,2,4},{2,3,4},{5,0,3},{5,1,0},{5,2,1},{5,3,2} };
309 045d8cbd Leszek Koltunski
      int N = numLayers==3? 6 : 5;
310
      int E = numLayers==3? 2 : 1;
311
      float[][] bands     = new float[][] { {0.05f,35,0.5f,0.8f,N,E,E} };
312
      int[] bandIndices   = new int[] { 0,0,0,0,0,0,0,0 };
313
      float[][] corners   = new float[][] { {0.04f,0.20f} };
314
      int[] cornerIndices = new int[] { 0,0,0,0,0,0 };
315
      float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
316
      int[] centerIndices = new int[] { 0,0,0,0,0,0 };
317 48fec01e Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
318 045d8cbd Leszek Koltunski
      }
319
    else
320
      {
321 48fec01e Leszek Koltunski
      double[][] vertices = new double[][] { {-0.5, SQ2/4, 0.0},{ 0.5, SQ2/4, 0.0},{ 0.0,-SQ2/4, 0.5},{ 0.0,-SQ2/4,-0.5} };
322
      int[][] vert_indices = new int[][] { {2,1,0},{3,0,1},{3,2,0},{2,3,1} };
323 045d8cbd Leszek Koltunski
      int N = numLayers==3? 6 : 5;
324
      int E = numLayers==3? 2 : 1;
325
      float[][] bands     = new float[][] { {0.05f,35,0.5f,0.8f,N,E,E} };
326
      int[] bandIndices   = new int[] { 0,0,0,0 };
327
      float[][] corners   = new float[][] { {0.06f,0.15f} };
328
      int[] cornerIndices = new int[] { 0,0,0,0 };
329
      float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
330
      int[] centerIndices = new int[] { 0,0,0,0 };
331 48fec01e Leszek Koltunski
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
332 045d8cbd Leszek Koltunski
      }
333
    }
334
335
///////////////////////////////////////////////////////////////////////////////////////////////////
336
337 3e605536 Leszek Koltunski
  Static4D getQuat(int cubit, int numLayers)
338 045d8cbd Leszek Koltunski
    {
339 48fec01e Leszek Koltunski
    if( mQuats==null ) initializeQuats();
340
    return mQuats[0];
341 045d8cbd Leszek Koltunski
    }
342
343
///////////////////////////////////////////////////////////////////////////////////////////////////
344
345 3e605536 Leszek Koltunski
  int getNumCubitVariants(int numLayers)
346 045d8cbd Leszek Koltunski
    {
347
    return 2;
348
    }
349
350
///////////////////////////////////////////////////////////////////////////////////////////////////
351
352
  int getCubitVariant(int cubit, int numLayers)
353
    {
354
    return cubit<getNumOctahedrons(numLayers) ? 0:1;
355
    }
356
357 9c06394a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
358 76c2bd07 Leszek Koltunski
359 9c06394a Leszek Koltunski
  ObjectSticker retSticker(int face)
360
    {
361 48fec01e Leszek Koltunski
    if( mStickers==null )
362
      {
363
      float[][] STICKERS = new float[][] { { -0.4330127f, -0.25f, 0.4330127f, -0.25f, 0.0f, 0.5f } };
364
      final float stroke = 0.08f;
365
      final float radius = 0.06f;
366
      final float[] radii= {radius,radius,radius};
367
      mStickers = new ObjectSticker[STICKERS.length];
368
      mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke);
369
      }
370
371 abf36986 Leszek Koltunski
    return mStickers[face/NUM_FACE_COLORS];
372 7289fd6c Leszek Koltunski
    }
373
374 7c969a6d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
375 91792184 Leszek Koltunski
// public API
376 bbbfb6af Leszek Koltunski
377
  public Static3D[] getRotationAxis()
378
    {
379
    return ROT_AXIS;
380
    }
381
382 e9a87113 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
383
384
  public Movement getMovement()
385
    {
386 ef018c1b Leszek Koltunski
    if( mMovement==null )
387
      {
388
      int numLayers = getNumLayers();
389
      if( mCuts==null ) getCuts(numLayers);
390
      getLayerRotatable(numLayers);
391 7ee89540 Leszek Koltunski
      mMovement = new Movement4(ROT_AXIS,mCuts,mLayerRotatable,numLayers,TYPE_NOT_SPLIT,ENABLED);
392 ef018c1b Leszek Koltunski
      }
393 e9a87113 Leszek Koltunski
    return mMovement;
394
    }
395
396 bbbfb6af Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
397
398
  public int[] getBasicAngle()
399
    {
400 48fec01e Leszek Koltunski
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 3,3,3,3 };
401
    return mBasicAngle;
402 e46e17fb Leszek Koltunski
    }
403 f0336037 Leszek Koltunski
404 6fd4a72c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
405
406
  public int getObjectName(int numLayers)
407
    {
408
    switch(numLayers)
409
      {
410
      case 3: return R.string.pyra3;
411
      case 4: return R.string.pyra4;
412
      case 5: return R.string.pyra5;
413
      }
414
    return R.string.pyra3;
415
    }
416
417
///////////////////////////////////////////////////////////////////////////////////////////////////
418
419
  public int getInventor(int numLayers)
420
    {
421
    switch(numLayers)
422
      {
423
      case 3: return R.string.pyra3_inventor;
424
      case 4: return R.string.pyra4_inventor;
425
      case 5: return R.string.pyra5_inventor;
426
      }
427
    return R.string.pyra3_inventor;
428
    }
429
430
///////////////////////////////////////////////////////////////////////////////////////////////////
431
432
  public int getComplexity(int numLayers)
433
    {
434
    switch(numLayers)
435
      {
436
      case 3: return 4;
437
      case 4: return 6;
438
      case 5: return 8;
439
      }
440
    return 4;
441
    }
442 e844c116 Leszek Koltunski
}