Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistySquare2.java @ 8005e762

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
import android.content.res.Resources;
23

    
24
import org.distorted.library.main.DistortedEffects;
25
import org.distorted.library.main.DistortedTexture;
26
import org.distorted.library.mesh.MeshSquare;
27
import org.distorted.library.type.Static4D;
28

    
29
import org.distorted.objectlib.R;
30
import org.distorted.objectlib.main.ObjectType;
31
import org.distorted.objectlib.main.ObjectShape;
32
import org.distorted.objectlib.main.ObjectSticker;
33
import org.distorted.objectlib.main.ScrambleState;
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

    
37
public class TwistySquare2 extends TwistySquare
38
{
39
  private static final int NUM_STICKERS = 6;
40

    
41
  private ScrambleState[] mStates;
42
  private int[] mQuatNumber;
43
  private float[][] mCenters;
44
  private int[][] mStickerColor;
45
  private int[][] mStickerType;
46
  private ObjectSticker[] mStickers;
47

    
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49

    
50
  public TwistySquare2(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
51
                       DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
52
    {
53
    super(size, quat, texture, mesh, effects, moves, res, scrWidth);
54
    }
55

    
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57

    
58
  protected ScrambleState[] getScrambleStates()
59
    {
60
    if( mStates==null )
61
      {
62
      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};
63
      int[] SL_1 = new int[] { 0,1,1, 1,1,1 };
64
      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 };
65
      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 };
66
      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 };
67

    
68
      mStates = new ScrambleState[]
69
        {
70
        new ScrambleState( new int[][] { LO_2, SL_6, LO_3 } ),  // 0
71
        new ScrambleState( new int[][] { LO_2, null, LO_3 } ),  // SL
72
        new ScrambleState( new int[][] { null, SL_1, LO_4 } ),  // LO
73
        new ScrambleState( new int[][] { LO_4, SL_1, null } ),  // UP
74
        new ScrambleState( new int[][] { null, SL_1, null } ),  // UL
75
        };
76
      }
77

    
78
    return mStates;
79
    }
80

    
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82

    
83
  protected int getResource(int numLayers)
84
    {
85
    return R.raw.squa2;
86
    }
87

    
88
///////////////////////////////////////////////////////////////////////////////////////////////////
89

    
90
  protected int[] getSolvedQuats(int cubit, int numLayers)
91
    {
92
    return null;
93
    }
94

    
95
///////////////////////////////////////////////////////////////////////////////////////////////////
96

    
97
  protected ObjectShape getObjectShape(int cubit, int numLayers)
98
    {
99
    int variant = getCubitVariant(cubit,numLayers);
100

    
101
    if( variant==0 )
102
      {
103
      double[][] vertices = new double[][]
104
        {
105
         { -1.5-X, 0.5, 1.5 },
106
         {    0.0, 0.5, 1.5 },
107
         {    0.0, 0.5,-1.5 },
108
         { -1.5+X, 0.5,-1.5 },
109
         { -1.5-X,-0.5, 1.5 },
110
         {    0.0,-0.5, 1.5 },
111
         {    0.0,-0.5,-1.5 },
112
         { -1.5+X,-0.5,-1.5 }
113
        };
114

    
115
      int[][] vert_indices = new int[][]
116
        {
117
         {0,1,2,3},
118
         {4,5,6,7},
119
         {4,5,1,0},
120
         {5,6,2,1},
121
         {6,7,3,2},
122
         {7,4,0,3}
123
        };
124

    
125
      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} };
126
      int[] bandIndices   = new int[] { 2,2,1,1,0,2 };
127
      float[][] corners   = new float[][] { {0.03f,0.05f} };
128
      int[] cornerIndices = new int[] { 0,0,0,0,0,0,0,0 };
129
      float[][] centers   = new float[][] { { -0.75f, 0.0f, 0.0f} };
130
      int[] centerIndices = new int[] { 0,0,0,0,0,0,0,0 };
131
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
132
      }
133
    else if( variant==1 )
134
      {
135
      double[][] vertices = new double[][]
136
        {
137
         { -X, 0.5, 0.0 },
138
         { +X, 0.5, 0.0 },
139
         {0.0, 0.5,-1.5 },
140
         { -X,-0.5, 0.0 },
141
         { +X,-0.5, 0.0 },
142
         {0.0,-0.5,-1.5 },
143
        };
144

    
145
      int[][] vert_indices = new int[][]
146
        {
147
         {0,1,2},
148
         {3,4,5},
149
         {3,4,1,0},
150
         {4,5,2,1},
151
         {5,3,0,2}
152
        };
153

    
154
      float[][] bands     = new float[][] { {0.038f,35,0.5f,0.9f, 5,2,1}, {0.001f,35,0.5f,0.9f, 5,2,1} };
155
      int[] bandIndices   = new int[] { 0,1,0,1,1 };
156
      float[][] corners   = new float[][] { {0.04f,0.15f} };
157
      int[] cornerIndices = new int[] { 0,0,-1,0,0,-1 };
158
      float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
159
      int[] centerIndices = new int[] { 0,0,-1,0,0,-1 };
160
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
161
      }
162
    else
163
      {
164
      double[][] vertices = new double[][]
165
        {
166
         {-0.75f+X/2, 0.5,  0.0 },
167
         { 0.75f-X/2, 0.5,  0.0 },
168
         {-0.75f-X/2, 0.5, -1.5 },
169
         {-0.75f+X/2,-0.5,  0.0 },
170
         { 0.75f-X/2,-0.5,  0.0 },
171
         {-0.75f-X/2,-0.5, -1.5 }
172
        };
173
      int[][] vert_indices = new int[][]
174
        {
175
         {0,1,2},
176
         {5,4,3},
177
         {3,4,1,0},
178
         {4,5,2,1},
179
         {5,3,0,2}
180
        };
181

    
182
      float[][] bands     = new float[][] { {0.030f,35,0.9f,1.0f, 5,2,1}, {0.001f,35,0.9f,1.0f, 5,2,1} };
183
      int[] bandIndices   = new int[] { 0,0,0,1,1 };
184
      float[][] corners   = new float[][] { {0.05f,0.13f} };
185
      int[] cornerIndices = new int[] { 0,0,-1,0,0,-1 };
186
      float[][] centers   = new float[][] { { 0.0f, 0.0f,-0.5f} };
187
      int[] centerIndices = new int[] { 0,0,-1,0,0,-1 };
188
      return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
189
      }
190
    }
191

    
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193

    
194
  protected Static4D getQuat(int cubit, int numLayers)
195
    {
196
    if( mQuats==null ) initializeQuats();
197

    
198
    if( mQuatNumber ==null )
199
      {
200
      mQuatNumber = new int[]
201
        {
202
        0, 6,
203
        0, 9, 6, 3, 18, 15, 12, 21,
204
        0, 9, 6, 3, 0, 9, 6, 3,
205
        15, 12, 21, 18, 15, 12, 21, 18
206
        };
207
      }
208

    
209
    return mQuats[mQuatNumber[cubit]];
210
    }
211

    
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213

    
214
  protected int getNumCubitVariants(int numLayers)
215
    {
216
    return 3;
217
    }
218

    
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

    
221
  protected int getCubitVariant(int cubit, int numLayers)
222
    {
223
    return cubit<2 ? 0 : (cubit<10 ? 1:2);
224
    }
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

    
228
  protected ObjectSticker retSticker(int face)
229
    {
230
    if( mStickers==null )
231
      {
232
      float[][] STICKERS = new float[][]
233
        {
234
          { -0.5f, -0.26289170f, 0.5f, -0.26289170f, 0.5f, 0.26289170f, -0.5f, 0.26289170f }, // middle front
235
          { -0.5f, -0.16666667f, 0.5f, -0.16666667f, 0.5f, 0.16666667f, -0.5f, 0.16666667f }, // middle right
236
          { -0.5f, -0.45534182f, 0.5f, -0.45534182f, 0.5f, 0.45534182f, -0.5f, 0.45534182f }, // middle back
237
          { -0.20096192f, -0.25f, 0.20096192f, -0.25f, 0.0f, 0.5f },                          // edge top
238
          { -0.40192384f, -0.5f, 0.40192384f, -0.5f, 0.40192384f, 0.5f, -0.40192384f, 0.5f }, // edge face
239
          { -0.11602539f, -0.25f, 0.4330127f, -0.25f, -0.3169873f, 0.5f }                     // corner top
240
        };
241

    
242
      final float R1 = 0.06f;
243
      final float R2 = 0.04f;
244
      final float R3 = 0.11f;
245
      final float R4 = 0.03f;
246
      final float R5 = 0.11f;
247
      final float R6 = 0.025f;
248
      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} };
249
      final float[] strokes = { 0.05f,0.04f,0.09f,0.05f,0.08f,0.06f };
250

    
251
      mStickers = new ObjectSticker[NUM_STICKERS];
252

    
253
      for(int s=0; s<NUM_STICKERS; s++)
254
        {
255
        mStickers[s] = new ObjectSticker(STICKERS[s],null,radii[s],strokes[s]);
256
        }
257
      }
258

    
259
    return mStickers[face/NUM_FACE_COLORS];
260
    }
261

    
262
///////////////////////////////////////////////////////////////////////////////////////////////////
263

    
264
  protected float[][] getCubitPositions(int numLayers)
265
    {
266
    if( mCenters ==null )
267
      {
268
      float Y = 0.75f + X/2;
269

    
270
      mCenters = new float[][]
271
        {
272
         { 1.5f, 0.0f, 0.0f },
273
         {-1.5f, 0.0f, 0.0f },
274

    
275
         { 0.0f, 1.0f, 1.5f },
276
         { 1.5f, 1.0f, 0.0f },
277
         { 0.0f, 1.0f,-1.5f },
278
         {-1.5f, 1.0f, 0.0f },
279
         { 0.0f,-1.0f, 1.5f },
280
         { 1.5f,-1.0f, 0.0f },
281
         { 0.0f,-1.0f,-1.5f },
282
         {-1.5f,-1.0f, 0.0f },
283

    
284
         {    Y, 1.0f, 1.5f },
285
         { 1.5f, 1.0f,   -Y },
286
         {   -Y, 1.0f,-1.5f },
287
         {-1.5f, 1.0f,    Y },
288
         {    Y,-1.0f, 1.5f },
289
         { 1.5f,-1.0f,   -Y },
290
         {   -Y,-1.0f,-1.5f },
291
         {-1.5f,-1.0f,    Y },
292

    
293
         { 1.5f, 1.0f,    Y },
294
         {    Y, 1.0f,-1.5f },
295
         {-1.5f, 1.0f,   -Y },
296
         {   -Y, 1.0f, 1.5f },
297
         { 1.5f,-1.0f,    Y },
298
         {    Y,-1.0f,-1.5f },
299
         {-1.5f,-1.0f,   -Y },
300
         {   -Y,-1.0f, 1.5f },
301
        };
302
      }
303

    
304
    return mCenters;
305
    }
306

    
307
///////////////////////////////////////////////////////////////////////////////////////////////////
308

    
309
  protected int getSolvedFunctionIndex()
310
    {
311
    return 3;
312
    }
313

    
314
///////////////////////////////////////////////////////////////////////////////////////////////////
315

    
316
  protected int getNumStickerTypes(int numLayers)
317
    {
318
    return NUM_STICKERS;
319
    }
320

    
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322

    
323
  protected int getFaceColor(int cubit, int cubitface, int numLayers)
324
    {
325
    if( mStickerColor==null )
326
      {
327
      // YELLOW 0 WHITE 1 BLUE 2 GREEN 3 RED 4 ORANGE 5
328
      mStickerColor = new int[][]
329
        {
330
         { 0, 0, 4, 0, 5, 0 }, // 0
331
         { 0, 0, 5, 1, 4, 0 },
332

    
333
         { 2, 0, 4, 0, 0, 0 }, // 2
334
         { 2, 0, 0, 0, 0, 0 },
335
         { 2, 0, 5, 0, 0, 0 },
336
         { 2, 0, 1, 0, 0, 0 },
337
         { 3, 0, 4, 0, 0, 0 },
338
         { 3, 0, 0, 0, 0, 0 },
339
         { 3, 0, 5, 0, 0, 0 },
340
         { 3, 0, 1, 0, 0, 0 },
341

    
342
         { 2, 0, 4, 0, 0, 0 }, // 10
343
         { 2, 0, 0, 0, 0, 0 },
344
         { 2, 0, 5, 0, 0, 0 },
345
         { 2, 0, 1, 0, 0, 0 },
346
         { 0, 3, 4, 0, 0, 0 },
347
         { 0, 3, 0, 0, 0, 0 },
348
         { 0, 3, 5, 0, 0, 0 },
349
         { 0, 3, 1, 0, 0, 0 },
350

    
351
         { 0, 2, 0, 0, 0, 0 }, // 18
352
         { 0, 2, 5, 0, 0, 0 },
353
         { 0, 2, 1, 0, 0, 0 },
354
         { 0, 2, 4, 0, 0, 0 },
355
         { 3, 0, 0, 0, 0, 0 },
356
         { 3, 0, 5, 0, 0, 0 },
357
         { 3, 0, 1, 0, 0, 0 },
358
         { 3, 0, 4, 0, 0, 0 },
359
        };
360
      }
361

    
362
    if( mStickerType==null )
363
      {
364
      mStickerType = new int[][]
365
        {
366
         {  NUM_STICKERS,NUM_STICKERS,0,           1,           2,NUM_STICKERS },
367
         {             3,NUM_STICKERS,4,NUM_STICKERS,NUM_STICKERS,NUM_STICKERS },
368
         {             5,NUM_STICKERS,2,NUM_STICKERS,NUM_STICKERS,NUM_STICKERS },
369
         {  NUM_STICKERS,           5,2,NUM_STICKERS,NUM_STICKERS,NUM_STICKERS }
370
        };
371
      }
372

    
373
    int type;
374

    
375
         if( cubit< 2             ) type = 0;
376
    else if( cubit<10             ) type = 1;
377
    else if( cubit>13 && cubit<22 ) type = 3;
378
    else                            type = 2;
379

    
380
    return 6*mStickerType[type][cubitface] + mStickerColor[cubit][cubitface];
381
    }
382

    
383
///////////////////////////////////////////////////////////////////////////////////////////////////
384
// PUBLIC API
385

    
386
  public ObjectType intGetObjectList(int numLayers)
387
    {
388
    return ObjectType.SQU2_3;
389
    }
390

    
391
///////////////////////////////////////////////////////////////////////////////////////////////////
392

    
393
  public int getObjectName(int numLayers)
394
    {
395
    return R.string.squa2;
396
    }
397

    
398
///////////////////////////////////////////////////////////////////////////////////////////////////
399

    
400
  public int getInventor(int numLayers)
401
    {
402
    return R.string.squa2_inventor;
403
    }
404

    
405
///////////////////////////////////////////////////////////////////////////////////////////////////
406

    
407
  public int getComplexity(int numLayers)
408
    {
409
    return 7;
410
    }
411
}
(24-24/25)