Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistySquare2.java @ 3a0990b1

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.objects;
11

    
12
import org.distorted.library.type.Static3D;
13
import org.distorted.library.type.Static4D;
14

    
15
import org.distorted.objectlib.helpers.FactoryCubit;
16
import org.distorted.objectlib.helpers.ObjectFaceShape;
17
import org.distorted.objectlib.metadata.Metadata;
18
import org.distorted.objectlib.helpers.ObjectVertexEffects;
19
import org.distorted.objectlib.main.InitAssets;
20
import org.distorted.objectlib.metadata.ListObjects;
21
import org.distorted.objectlib.helpers.ObjectShape;
22

    
23
///////////////////////////////////////////////////////////////////////////////////////////////////
24

    
25
public class TwistySquare2 extends TwistySquare
26
{
27
  private int[][] mEdges;
28
  private int[] mQuatIndex;
29
  private float[][] mCenters;
30

    
31
///////////////////////////////////////////////////////////////////////////////////////////////////
32

    
33
  public TwistySquare2(int iconMode, Static4D quat, Static3D move, float scale, Metadata meta, InitAssets asset)
34
    {
35
    super(iconMode, quat, move, scale, meta, asset);
36
    }
37

    
38
///////////////////////////////////////////////////////////////////////////////////////////////////
39

    
40
  float getFactor()
41
    {
42
    return 0.8f;
43
    }
44

    
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46

    
47
  public int[][] getScrambleEdges()
48
    {
49
    if( mEdges==null )
50
      {
51
      mEdges = new int[][]
52
        {
53
          { 0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,
54
            33,1,34,1,33,1,34,1,33,1,34,1,33,1,34,1,33,1,34,1,33,1,34,1,
55
            35,3,36,3,37,3,38,3,39,3,40,3,41,3,42,3,43,3,44,3,45,3 },     // 0
56
          { 0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,
57
            35,3,36,3,37,3,38,3,39,3,40,3,41,3,42,3,43,3,44,3,45,3 },     // 1 SL
58
          { 33,1,34,1,
59
            35,4,36,4,37,4,38,4,39,4,40,4,41,4,42,4,43,4,44,4,45,4 },     // 2 LO
60
          { 0,4,1,4,2,4,3,4,4,4,5,4,6,4,7,4,8,4,9,4,10,4,
61
            33,1,34,1 },                                                  // 3 UP
62
          { 33,1,34,1 }                                                   // 4 UL
63
        };
64
      }
65

    
66
    return mEdges;
67
    }
68

    
69
///////////////////////////////////////////////////////////////////////////////////////////////////
70

    
71
  public float[][] getCubitPositions(int[] numLayers)
72
    {
73
    if( mCenters ==null )
74
      {
75
      float Y = 0.75f + X/2;
76

    
77
      mCenters = new float[][]
78
        {
79
         { 1.5f, 0.0f, 0.0f }, // 0
80
         {-1.5f, 0.0f, 0.0f },
81

    
82
         { 0.0f, 1.0f, 1.5f }, // 2
83
         { 1.5f, 1.0f, 0.0f },
84
         { 0.0f, 1.0f,-1.5f },
85
         {-1.5f, 1.0f, 0.0f },
86
         { 0.0f,-1.0f, 1.5f },
87
         { 1.5f,-1.0f, 0.0f },
88
         { 0.0f,-1.0f,-1.5f },
89
         {-1.5f,-1.0f, 0.0f },
90

    
91
         {    Y, 1.0f, 1.5f }, // 10
92
         { 1.5f, 1.0f,   -Y },
93
         {   -Y, 1.0f,-1.5f },
94
         {-1.5f, 1.0f,    Y },
95
         {    Y,-1.0f, 1.5f },
96
         { 1.5f,-1.0f,   -Y },
97
         {   -Y,-1.0f,-1.5f },
98
         {-1.5f,-1.0f,    Y },
99

    
100
         { 1.5f, 1.0f,    Y }, // 18
101
         {    Y, 1.0f,-1.5f },
102
         {-1.5f, 1.0f,   -Y },
103
         {   -Y, 1.0f, 1.5f },
104
         { 1.5f,-1.0f,    Y },
105
         {    Y,-1.0f,-1.5f },
106
         {-1.5f,-1.0f,   -Y },
107
         {   -Y,-1.0f, 1.5f },
108
        };
109
      }
110

    
111
    return mCenters;
112
    }
113

    
114
///////////////////////////////////////////////////////////////////////////////////////////////////
115

    
116
  public Static4D getCubitQuats(int cubit, int[] numLayers)
117
    {
118
    if( mQuatIndex==null )
119
      {
120
      mQuatIndex = new int[]
121
        {
122
        0, 6,
123
        0, 9, 6, 3,17,14,23,20,
124
        0, 9, 6, 3, 0, 9, 6, 3,14, 23, 20, 17, 14, 23, 20, 17
125
        };
126
      }
127

    
128
    return mObjectQuats[mQuatIndex[cubit]];
129
    }
130

    
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

    
133
  private float[][] getVertices(int variant)
134
    {
135
    if( variant==0 )
136
      {
137
      return new float[][]
138
        {
139
         { -1.5f-X, 0.5f, 1.5f },
140
         {    0.0f, 0.5f, 1.5f },
141
         {    0.0f, 0.5f,-1.5f },
142
         { -1.5f+X, 0.5f,-1.5f },
143
         { -1.5f-X,-0.5f, 1.5f },
144
         {    0.0f,-0.5f, 1.5f },
145
         {    0.0f,-0.5f,-1.5f },
146
         { -1.5f+X,-0.5f,-1.5f }
147
        };
148
      }
149
    else if( variant==1 )
150
      {
151
      return new float[][]
152
        {
153
         {  -X, 0.5f, 0.0f },
154
         {  +X, 0.5f, 0.0f },
155
         {0.0f, 0.5f,-1.5f },
156
         {  -X,-0.5f, 0.0f },
157
         {  +X,-0.5f, 0.0f },
158
         {0.0f,-0.5f,-1.5f },
159
        };
160
      }
161
    else
162
      {
163
      return new float[][]
164
        {
165
         {-0.75f+X/2, 0.5f,  0.0f },
166
         { 0.75f-X/2, 0.5f,  0.0f },
167
         {-0.75f-X/2, 0.5f, -1.5f },
168
         {-0.75f+X/2,-0.5f,  0.0f },
169
         { 0.75f-X/2,-0.5f,  0.0f },
170
         {-0.75f-X/2,-0.5f, -1.5f }
171
        };
172
      }
173
    }
174

    
175
///////////////////////////////////////////////////////////////////////////////////////////////////
176

    
177
  public ObjectShape getObjectShape(int variant)
178
    {
179
    if( variant==0 )
180
      {
181
      int[][] indices =
182
        {
183
         {4,5,1,0},
184
         {5,6,2,1},
185
         {6,7,3,2},
186
         {7,4,0,3},
187
         {0,1,2,3},
188
         {7,6,5,4}
189
        };
190

    
191
      return new ObjectShape(getVertices(variant), indices);
192
      }
193
    else if( variant==1 )
194
      {
195
      int[][] indices =
196
        {
197
         {0,1,2},
198
         {3,4,1,0},
199
         {5,4,3},
200
         {4,5,2,1},
201
         {5,3,0,2}
202
        };
203

    
204
      return new ObjectShape(getVertices(variant), indices);
205
      }
206
    else
207
      {
208
      int[][] indices =
209
        {
210
         {0,1,2},
211
         {3,4,1,0},
212
         {5,4,3},
213
         {4,5,2,1},
214
         {5,3,0,2}
215
        };
216

    
217
      return new ObjectShape(getVertices(variant), indices);
218
      }
219
    }
220

    
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222

    
223
  public ObjectFaceShape getObjectFaceShape(int variant)
224
    {
225
    int angle1 = 25;
226
    int angle2 = 35;
227
    float R = 0.2f;
228
    float S = 0.8f;
229

    
230
    if( variant==0 )
231
      {
232
      float h1 = isInIconMode() ? 0.001f : 0.04f;
233
      float h2 = isInIconMode() ? 0.001f : 0.02f;
234
      float[][] bands = { {h1,angle1,R,S,5,2,1}, {h2,angle1,R,S,5,2,1}, {0.001f,angle1,R,S,5,2,1} };
235
      int[] indices   = { 0,0,1,2,2,2 };
236
      return new ObjectFaceShape(bands,indices,null);
237
      }
238
    else if( variant==1 )
239
      {
240
      float h1 = isInIconMode() ? 0.001f : 0.038f;
241
      float[][] bands = { {h1,angle2,R,S, 5,2,1}, {0.001f,angle2,R,S, 5,2,1} };
242
      int[] indices   = { 0,0,0,1,1 };
243
      return new ObjectFaceShape(bands,indices,null);
244
      }
245
    else
246
      {
247
      float h1 = isInIconMode() ? 0.001f : 0.03f;
248
      float[][] bands = { {h1,angle2,R,S, 5,2,1}, {0.001f,angle2,R,S, 5,2,1} };
249
      int[] indices   = { 0,0,0,1,1 };
250
      return new ObjectFaceShape(bands,indices,null);
251
      }
252
    }
253

    
254
///////////////////////////////////////////////////////////////////////////////////////////////////
255

    
256
  public ObjectVertexEffects getVertexEffects(int variant)
257
    {
258
    if( variant==0 )
259
      {
260
      float[][] corners = { {0.03f,0.05f} };
261
      int[] indices     = { 0,0,0,0,0,0,0,0 };
262
      float[][] centers = { { -0.75f, 0.0f, 0.0f} };
263
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
264
      }
265
    else if( variant==1 )
266
      {
267
      float[][] corners = { {0.04f,0.15f} };
268
      int[] indices     = { 0,0,-1,0,0,-1 };
269
      float[][] centers = { { 0.0f, 0.0f,-0.5f} };
270
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
271
      }
272
    else
273
      {
274
      float[][] corners = { {0.05f,0.13f} };
275
      int[] indices     = { 0,0,-1,0,0,-1 };
276
      float[][] centers = { { 0.0f, 0.0f,-0.5f} };
277
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
278
      }
279
    }
280

    
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282

    
283
  public int getNumCubitVariants(int[] numLayers)
284
    {
285
    return 3;
286
    }
287

    
288
///////////////////////////////////////////////////////////////////////////////////////////////////
289

    
290
  public int getCubitVariant(int cubit, int[] numLayers)
291
    {
292
    return cubit<2 ? 0 : (cubit<10 ? 1:2);
293
    }
294

    
295
///////////////////////////////////////////////////////////////////////////////////////////////////
296

    
297
  public float getStickerRadius()
298
    {
299
    return 0.12f;
300
    }
301

    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
  public float getStickerStroke()
305
    {
306
    return isInIconMode() ? 0.20f : 0.10f;
307
    }
308

    
309
///////////////////////////////////////////////////////////////////////////////////////////////////
310
// PUBLIC API
311

    
312
  public String getShortName()
313
    {
314
    return ListObjects.SQU2_3.name();
315
    }
316

    
317
///////////////////////////////////////////////////////////////////////////////////////////////////
318

    
319
  public String[][] getTutorials()
320
    {
321
    return new String[][] {
322
                          {"gb","PPXojiFthEs","Square-2 Tutorial","SuperAntoniovivaldi"},
323
                          {"es","IiMwc51xKBQ","Cómo resolver Square-2","skieur cubb"},
324
                          {"ru","XZ6m8uF5oUk","Как собрать Square-2.","Илья Топор-Гилка"},
325
                          {"fr","R-m9IgYAFPA","Tutoriel: résolution du Square-2","skieur cubb"},
326
                          {"pl","SukHyoMzcgM","Square-2 TUTORIAL PL","MrUk"},
327
                          {"br","T3ts5gHLJV8","Tutorial do Square-2 1/2","Rafael Cinoto"},
328
                          {"br","4wwWE5Ni0Fw","Tutorial do Square-2 2/2","Rafael Cinoto"},
329
                          {"kr","psG9Ar4pBrc","초보자를 위한 스퀘어2 해법","SlowCuberToumai"},
330
                          {"vn","_37Pc8Y_-Hs","Square-2 Tutorial","VĂN CÔNG TÙNG"},
331
                          {"tw","hye02xzNAZk","Square-2(SQ-2) 教學","不正常魔術方塊研究中心"},
332
                         };
333
    }
334
}
(52-52/59)