Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistySquare2.java @ 57ef6378

1 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 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 82eb152a Leszek Koltunski
import java.io.InputStream;
23 29b82486 Leszek Koltunski
24 ecf3d6e3 Leszek Koltunski
import org.distorted.library.type.Static3D;
25 29b82486 Leszek Koltunski
import org.distorted.library.type.Static4D;
26
27 8592461c Leszek Koltunski
import org.distorted.objectlib.main.ObjectControl;
28 8005e762 Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
29 198c5bf0 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectShape;
30
import org.distorted.objectlib.helpers.ObjectSticker;
31
import org.distorted.objectlib.helpers.ScrambleState;
32 29b82486 Leszek Koltunski
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34
35
public class TwistySquare2 extends TwistySquare
36
{
37
  private static final int NUM_STICKERS = 6;
38
39
  private ScrambleState[] mStates;
40
  private int[] mQuatNumber;
41
  private float[][] mCenters;
42
  private int[][] mStickerColor;
43
  private int[][] mStickerType;
44
  private ObjectSticker[] mStickers;
45
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47
48 64c209f5 Leszek Koltunski
  public TwistySquare2(int[] numL, Static4D quat, Static3D move, float scale, InputStream stream)
49 29b82486 Leszek Koltunski
    {
50 64c209f5 Leszek Koltunski
    super(numL, quat, move, scale, stream);
51 29b82486 Leszek Koltunski
    }
52
53
///////////////////////////////////////////////////////////////////////////////////////////////////
54
55 f9a81f52 Leszek Koltunski
  public ScrambleState[] getScrambleStates()
56 29b82486 Leszek Koltunski
    {
57
    if( mStates==null )
58
      {
59
      int[] SL_6 = new int[] { 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1};
60
      int[] SL_1 = new int[] { 0,1,1, 1,1,1 };
61
      int[] LO_2 = new int[] { 0,-5,2, 0,-4,2, 0,-3,2, 0,-2,2, 0,-1,2, 0,1,2, 0,2,2, 0,3,2, 0,4,2, 0,5,2, 0,5,2 };
62
      int[] LO_3 = new int[] { 0,-5,3, 0,-4,3, 0,-3,3, 0,-2,3, 0,-1,3, 0,1,3, 0,2,3, 0,3,3, 0,4,3, 0,5,3, 0,5,3 };
63
      int[] LO_4 = new int[] { 0,-5,4, 0,-4,4, 0,-3,4, 0,-2,4, 0,-1,4, 0,1,4, 0,2,4, 0,3,4, 0,4,4, 0,5,4, 0,5,4 };
64
65
      mStates = new ScrambleState[]
66
        {
67
        new ScrambleState( new int[][] { LO_2, SL_6, LO_3 } ),  // 0
68
        new ScrambleState( new int[][] { LO_2, null, LO_3 } ),  // SL
69
        new ScrambleState( new int[][] { null, SL_1, LO_4 } ),  // LO
70
        new ScrambleState( new int[][] { LO_4, SL_1, null } ),  // UP
71
        new ScrambleState( new int[][] { null, SL_1, null } ),  // UL
72
        };
73
      }
74
75
    return mStates;
76
    }
77
78
///////////////////////////////////////////////////////////////////////////////////////////////////
79
80 7b832206 Leszek Koltunski
  public int[] getSolvedQuats(int cubit, int[] numLayers)
81 29b82486 Leszek Koltunski
    {
82
    return null;
83
    }
84
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86
87 e30c522a Leszek Koltunski
  public ObjectShape getObjectShape(int variant)
88 29b82486 Leszek Koltunski
    {
89
    if( variant==0 )
90
      {
91 57ef6378 Leszek Koltunski
      float[][] vertices = new float[][]
92 29b82486 Leszek Koltunski
        {
93 57ef6378 Leszek Koltunski
         { -1.5f-X, 0.5f, 1.5f },
94
         {    0.0f, 0.5f, 1.5f },
95
         {    0.0f, 0.5f,-1.5f },
96
         { -1.5f+X, 0.5f,-1.5f },
97
         { -1.5f-X,-0.5f, 1.5f },
98
         {    0.0f,-0.5f, 1.5f },
99
         {    0.0f,-0.5f,-1.5f },
100
         { -1.5f+X,-0.5f,-1.5f }
101 29b82486 Leszek Koltunski
        };
102
103
      int[][] vert_indices = new int[][]
104
        {
105
         {0,1,2,3},
106
         {4,5,6,7},
107
         {4,5,1,0},
108
         {5,6,2,1},
109
         {6,7,3,2},
110
         {7,4,0,3}
111
        };
112
113
      float[][] bands     = new float[][] { {0.040f,35,0.8f,1.0f,5,2,1}, {0.020f,35,0.8f,1.0f,5,2,1}, {0.001f,35,0.8f,1.0f,5,2,1} };
114
      int[] bandIndices   = new int[] { 2,2,1,1,0,2 };
115
      float[][] corners   = new float[][] { {0.03f,0.05f} };
116
      int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
117
      float[][] centers   = new float[][] { { -0.75f, 0.0f, 0.0f} };
118
      int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
119
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
120
      }
121
    else if( variant==1 )
122
      {
123 57ef6378 Leszek Koltunski
      float[][] vertices = new float[][]
124 29b82486 Leszek Koltunski
        {
125 57ef6378 Leszek Koltunski
         {  -X, 0.5f, 0.0f },
126
         {  +X, 0.5f, 0.0f },
127
         {0.0f, 0.5f,-1.5f },
128
         {  -X,-0.5f, 0.0f },
129
         {  +X,-0.5f, 0.0f },
130
         {0.0f,-0.5f,-1.5f },
131 29b82486 Leszek Koltunski
        };
132
133
      int[][] vert_indices = new int[][]
134
        {
135
         {0,1,2},
136
         {3,4,5},
137
         {3,4,1,0},
138
         {4,5,2,1},
139
         {5,3,0,2}
140
        };
141
142
      float[][] bands     = new float[][] { {0.038f,35,0.5f,0.9f, 5,2,1}, {0.001f,35,0.5f,0.9f, 5,2,1} };
143
      int[] bandIndices   = new int[] { 0,1,0,1,1 };
144
      float[][] corners   = new float[][] { {0.04f,0.15f} };
145
      int[] cornerIndices = new int[] { 0,0,-1,0,0,-1 };
146
      float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
147
      int[] centerIndices = new int[] { 0,0,-1,0,0,-1 };
148
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
149
      }
150
    else
151
      {
152 57ef6378 Leszek Koltunski
      float[][] vertices = new float[][]
153 29b82486 Leszek Koltunski
        {
154 57ef6378 Leszek Koltunski
         {-0.75f+X/2, 0.5f,  0.0f },
155
         { 0.75f-X/2, 0.5f,  0.0f },
156
         {-0.75f-X/2, 0.5f, -1.5f },
157
         {-0.75f+X/2,-0.5f,  0.0f },
158
         { 0.75f-X/2,-0.5f,  0.0f },
159
         {-0.75f-X/2,-0.5f, -1.5f }
160 29b82486 Leszek Koltunski
        };
161
      int[][] vert_indices = new int[][]
162
        {
163
         {0,1,2},
164
         {5,4,3},
165
         {3,4,1,0},
166
         {4,5,2,1},
167
         {5,3,0,2}
168
        };
169
170
      float[][] bands     = new float[][] { {0.030f,35,0.9f,1.0f, 5,2,1}, {0.001f,35,0.9f,1.0f, 5,2,1} };
171
      int[] bandIndices   = new int[] { 0,0,0,1,1 };
172
      float[][] corners   = new float[][] { {0.05f,0.13f} };
173
      int[] cornerIndices = new int[] { 0,0,-1,0,0,-1 };
174
      float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
175
      int[] centerIndices = new int[] { 0,0,-1,0,0,-1 };
176
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
177
      }
178
    }
179
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181
182 7b832206 Leszek Koltunski
  public Static4D getQuat(int cubit, int[] numLayers)
183 29b82486 Leszek Koltunski
    {
184
    if( mQuats==null ) initializeQuats();
185
186
    if( mQuatNumber ==null )
187
      {
188
      mQuatNumber = new int[]
189
        {
190
        0, 6,
191
        0, 9, 6, 3, 18, 15, 12, 21,
192
        0, 9, 6, 3, 0, 9, 6, 3,
193
        15, 12, 21, 18, 15, 12, 21, 18
194
        };
195
      }
196
197
    return mQuats[mQuatNumber[cubit]];
198
    }
199
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201
202 e30c522a Leszek Koltunski
  public int getNumCubitVariants(int[] numLayers)
203 29b82486 Leszek Koltunski
    {
204
    return 3;
205
    }
206
207
///////////////////////////////////////////////////////////////////////////////////////////////////
208
209 e30c522a Leszek Koltunski
  public int getCubitVariant(int cubit, int[] numLayers)
210 29b82486 Leszek Koltunski
    {
211
    return cubit<2 ? 0 : (cubit<10 ? 1:2);
212
    }
213
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215
216 1bb09f88 Leszek Koltunski
  public ObjectSticker retSticker(int sticker)
217 29b82486 Leszek Koltunski
    {
218
    if( mStickers==null )
219
      {
220
      float[][] STICKERS = new float[][]
221
        {
222
          { -0.5f, -0.26289170f, 0.5f, -0.26289170f, 0.5f, 0.26289170f, -0.5f, 0.26289170f }, // middle front
223
          { -0.5f, -0.16666667f, 0.5f, -0.16666667f, 0.5f, 0.16666667f, -0.5f, 0.16666667f }, // middle right
224
          { -0.5f, -0.45534182f, 0.5f, -0.45534182f, 0.5f, 0.45534182f, -0.5f, 0.45534182f }, // middle back
225
          { -0.20096192f, -0.25f, 0.20096192f, -0.25f, 0.0f, 0.5f },                          // edge top
226
          { -0.40192384f, -0.5f, 0.40192384f, -0.5f, 0.40192384f, 0.5f, -0.40192384f, 0.5f }, // edge face
227
          { -0.11602539f, -0.25f, 0.4330127f, -0.25f, -0.3169873f, 0.5f }                     // corner top
228
        };
229
230
      final float R1 = 0.06f;
231
      final float R2 = 0.04f;
232
      final float R3 = 0.11f;
233
      final float R4 = 0.03f;
234
      final float R5 = 0.11f;
235
      final float R6 = 0.025f;
236
      final float[][] radii  = { {R1,R1,R1,R1},{R2,R2,R2,R2},{R3,R3,R3,R3},{R4,R4,R4},{R5,R5,R5,R5},{R6,R6,R6} };
237 8592461c Leszek Koltunski
      float[] strokes = { 0.05f,0.04f,0.09f,0.05f,0.08f,0.06f };
238
239
      if( ObjectControl.isInIconMode() )
240
        {
241
        float mult = 2.0f;
242
        strokes[0]*=mult;
243
        strokes[1]*=mult;
244
        strokes[2]*=mult;
245
        strokes[3]*=mult;
246
        strokes[4]*=mult;
247
        strokes[5]*=mult;
248
        }
249 29b82486 Leszek Koltunski
250
      mStickers = new ObjectSticker[NUM_STICKERS];
251
252
      for(int s=0; s<NUM_STICKERS; s++)
253
        {
254
        mStickers[s] = new ObjectSticker(STICKERS[s],null,radii[s],strokes[s]);
255
        }
256
      }
257
258 1bb09f88 Leszek Koltunski
    return mStickers[sticker];
259
    }
260
261 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
262
263 7b832206 Leszek Koltunski
  public float[][] getCubitPositions(int[] numLayers)
264 29b82486 Leszek Koltunski
    {
265
    if( mCenters ==null )
266
      {
267
      float Y = 0.75f + X/2;
268
269
      mCenters = new float[][]
270
        {
271
         { 1.5f, 0.0f, 0.0f },
272
         {-1.5f, 0.0f, 0.0f },
273
274
         { 0.0f, 1.0f, 1.5f },
275
         { 1.5f, 1.0f, 0.0f },
276
         { 0.0f, 1.0f,-1.5f },
277
         {-1.5f, 1.0f, 0.0f },
278
         { 0.0f,-1.0f, 1.5f },
279
         { 1.5f,-1.0f, 0.0f },
280
         { 0.0f,-1.0f,-1.5f },
281
         {-1.5f,-1.0f, 0.0f },
282
283
         {    Y, 1.0f, 1.5f },
284
         { 1.5f, 1.0f,   -Y },
285
         {   -Y, 1.0f,-1.5f },
286
         {-1.5f, 1.0f,    Y },
287
         {    Y,-1.0f, 1.5f },
288
         { 1.5f,-1.0f,   -Y },
289
         {   -Y,-1.0f,-1.5f },
290
         {-1.5f,-1.0f,    Y },
291
292
         { 1.5f, 1.0f,    Y },
293
         {    Y, 1.0f,-1.5f },
294
         {-1.5f, 1.0f,   -Y },
295
         {   -Y, 1.0f, 1.5f },
296
         { 1.5f,-1.0f,    Y },
297
         {    Y,-1.0f,-1.5f },
298
         {-1.5f,-1.0f,   -Y },
299
         {   -Y,-1.0f, 1.5f },
300
        };
301
      }
302
303
    return mCenters;
304
    }
305
306
///////////////////////////////////////////////////////////////////////////////////////////////////
307
308 59c20632 Leszek Koltunski
  public int getSolvedFunctionIndex()
309 29b82486 Leszek Koltunski
    {
310
    return 3;
311
    }
312
313
///////////////////////////////////////////////////////////////////////////////////////////////////
314
315 1bb09f88 Leszek Koltunski
  public int getNumStickerTypes(int[] numLayers)
316 29b82486 Leszek Koltunski
    {
317
    return NUM_STICKERS;
318
    }
319
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321
322 a75ae1ee Leszek Koltunski
  public int getVariantFaceColor(int variant, int face, int[] numLayers)
323 29b82486 Leszek Koltunski
    {
324 a75ae1ee Leszek Koltunski
    if( mStickerType==null )
325 29b82486 Leszek Koltunski
      {
326 a75ae1ee Leszek Koltunski
      mStickerType = new int[][]
327 29b82486 Leszek Koltunski
        {
328 a75ae1ee Leszek Koltunski
         { -1,-1, 0, 1, 2,-1 },
329
         {  3,-1, 4,-1,-1,-1 },
330
         {  5, 5, 2,-1,-1,-1 },
331 29b82486 Leszek Koltunski
        };
332
      }
333
334 a75ae1ee Leszek Koltunski
    return mStickerType[variant][face];
335
    }
336
337
///////////////////////////////////////////////////////////////////////////////////////////////////
338
339
  public int getCubitFaceColor(int cubit, int face, int[] numLayers)
340
    {
341
    if( mStickerColor==null )
342 29b82486 Leszek Koltunski
      {
343 a75ae1ee Leszek Koltunski
      // YELLOW 0 WHITE 1 BLUE 2 GREEN 3 RED 4 ORANGE 5
344
      mStickerColor = new int[][]
345 29b82486 Leszek Koltunski
        {
346 a75ae1ee Leszek Koltunski
         {-1,-1, 4, 0, 5,-1 }, // 0
347
         {-1,-1, 5, 1, 4,-1 },
348
349
         { 2,-1, 4,-1,-1,-1 }, // 2
350
         { 2,-1, 0,-1,-1,-1 },
351
         { 2,-1, 5,-1,-1,-1 },
352
         { 2,-1, 1,-1,-1,-1 },
353
         { 3,-1, 4,-1,-1,-1 },
354
         { 3,-1, 0,-1,-1,-1 },
355
         { 3,-1, 5,-1,-1,-1 },
356
         { 3,-1, 1,-1,-1,-1 },
357
358
         { 2,-1, 4,-1,-1,-1 }, // 10
359
         { 2,-1, 0,-1,-1,-1 },
360
         { 2,-1, 5,-1,-1,-1 },
361
         { 2,-1, 1,-1,-1,-1 },
362
         {-1, 3, 4,-1,-1,-1 },
363
         {-1, 3, 0,-1,-1,-1 },
364
         {-1, 3, 5,-1,-1,-1 },
365
         {-1, 3, 1,-1,-1,-1 },
366
367
         {-1, 2, 0,-1,-1,-1 }, // 18
368
         {-1, 2, 5,-1,-1,-1 },
369
         {-1, 2, 1,-1,-1,-1 },
370
         {-1, 2, 4,-1,-1,-1 },
371
         { 3,-1, 0,-1,-1,-1 },
372
         { 3,-1, 5,-1,-1,-1 },
373
         { 3,-1, 1,-1,-1,-1 },
374
         { 3,-1, 4,-1,-1,-1 },
375 29b82486 Leszek Koltunski
        };
376
      }
377
378 a75ae1ee Leszek Koltunski
    return mStickerColor[cubit][face];
379 29b82486 Leszek Koltunski
    }
380
381
///////////////////////////////////////////////////////////////////////////////////////////////////
382
// PUBLIC API
383
384 a57e6870 Leszek Koltunski
  public ObjectType intGetObjectType(int[] numLayers)
385 61aa85e4 Leszek Koltunski
    {
386 8005e762 Leszek Koltunski
    return ObjectType.SQU2_3;
387 61aa85e4 Leszek Koltunski
    }
388
389
///////////////////////////////////////////////////////////////////////////////////////////////////
390
391 e26eb4e7 Leszek Koltunski
  public String getObjectName()
392 29b82486 Leszek Koltunski
    {
393 e26eb4e7 Leszek Koltunski
    return "Square-2";
394 29b82486 Leszek Koltunski
    }
395
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397
398 e26eb4e7 Leszek Koltunski
  public String getInventor()
399 29b82486 Leszek Koltunski
    {
400 e26eb4e7 Leszek Koltunski
    return "David Litwin";
401 29b82486 Leszek Koltunski
    }
402
403 59c20632 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
404
405 e26eb4e7 Leszek Koltunski
  public int getYearOfInvention()
406 59c20632 Leszek Koltunski
    {
407
    return 1995;
408
    }
409
410 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
411
412 e26eb4e7 Leszek Koltunski
  public int getComplexity()
413 29b82486 Leszek Koltunski
    {
414
    return 7;
415
    }
416
}