Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyPyraminxDuo.java @ ccd8a6f2

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 static org.distorted.objectlib.touchcontrol.TouchControl.TC_TETRAHEDRON;
13
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
14

    
15
import org.distorted.library.type.Static3D;
16
import org.distorted.library.type.Static4D;
17
import org.distorted.objectlib.helpers.FactoryCubit;
18
import org.distorted.objectlib.helpers.ObjectFaceShape;
19
import org.distorted.objectlib.helpers.ObjectShape;
20
import org.distorted.objectlib.helpers.ObjectSignature;
21
import org.distorted.objectlib.helpers.ObjectVertexEffects;
22
import org.distorted.objectlib.main.InitData;
23
import org.distorted.objectlib.main.ObjectSignatures;
24
import org.distorted.objectlib.main.ObjectType;
25
import org.distorted.objectlib.shape.ShapeTetrahedron;
26
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
27

    
28
import java.io.InputStream;
29

    
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31

    
32
public class TwistyPyraminxDuo extends ShapeTetrahedron
33
{
34
  static final Static3D[] ROT_AXIS = new Static3D[]
35
         {
36
           new Static3D(     0,-SQ3/3,-SQ6/3),
37
           new Static3D(     0,-SQ3/3, SQ6/3),
38
           new Static3D( SQ6/3, SQ3/3,     0),
39
           new Static3D(-SQ6/3, SQ3/3,     0),
40
         };
41

    
42
  private static final float F = 0.60f;  // let point A = corner of the tetrahedron; B - center of tetrahedron face;
43
                                         // C - corner of the triangular face cubit. Then C = A + F(B-A)
44
  private static final float G = 0.02f;  // this defines the gap between two corner cubits. 0.0 -> no gap.
45

    
46
  private int[][] mEdges;
47
  private int[][] mBasicAngle;
48
  private int[] mQuatIndex;
49
  private float[][] mCuts;
50
  private float[][] mCenters;
51

    
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53

    
54
  public TwistyPyraminxDuo(InitData data, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
55
    {
56
    super(data, meshState, iconMode, data.getNumLayers()[0], quat, move, scale, stream);
57
    }
58

    
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60
// single edge; only the tip layers move
61

    
62
  public int[][] getScrambleEdges()
63
    {
64
    if( mEdges==null ) mEdges = new int[][] { {2,0,3,0,6,0,7,0,10,0,11,0,14,0,15,0} };
65
    return mEdges;
66
    }
67

    
68
///////////////////////////////////////////////////////////////////////////////////////////////////
69

    
70
  public float[][] getCuts(int[] numLayers)
71
    {
72
    if( mCuts==null )
73
      {
74
      float[] cut = { 0.0f };
75
      mCuts = new float[][] { cut,cut,cut,cut };
76
      }
77

    
78
    return mCuts;
79
    }
80

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

    
83
  public boolean[][] getLayerRotatable(int[] numLayers)
84
    {
85
    boolean[] tmp = {true,true};
86
    return new boolean[][] { tmp,tmp,tmp,tmp };
87
    }
88

    
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90

    
91
  public int getTouchControlType()
92
    {
93
    return TC_TETRAHEDRON;
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  public int getTouchControlSplit()
99
    {
100
    return TYPE_NOT_SPLIT;
101
    }
102

    
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

    
105
  public int[][][] getEnabled()
106
    {
107
    return new int[][][] { {{1,2,3}},{{0,2,3}},{{0,1,3}},{{0,1,2}} };
108
    }
109

    
110
///////////////////////////////////////////////////////////////////////////////////////////////////
111

    
112
  public float[] getDist3D(int[] numLayers)
113
    {
114
    return TouchControlTetrahedron.D3D;
115
    }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118

    
119
  public Static3D[] getFaceAxis()
120
    {
121
    return TouchControlTetrahedron.FACE_AXIS;
122
    }
123

    
124
///////////////////////////////////////////////////////////////////////////////////////////////////
125

    
126
  public float[][] getCubitPositions(int[] numLayers)
127
    {
128
    if( mCenters==null )
129
      {
130
      mCenters = new float[][]
131
         {
132
           { 0.000f, -SQ2/2, 1.000f },
133
           { 0.000f, -SQ2/2,-1.000f },
134
           {-1.000f,  SQ2/2, 0.000f },
135
           { 1.000f,  SQ2/2, 0.000f },
136

    
137
           { 0.000f,  SQ2/6, 1.0f/3 },
138
           { 0.000f,  SQ2/6,-1.0f/3 },
139
           {-1.0f/3, -SQ2/6, 0.000f },
140
           { 1.0f/3, -SQ2/6, 0.000f },
141
         };
142
      }
143

    
144
    return mCenters;
145
    }
146

    
147
///////////////////////////////////////////////////////////////////////////////////////////////////
148

    
149
  public Static4D getCubitQuats(int cubit, int[] numLayers)
150
    {
151
    if( mQuatIndex==null ) mQuatIndex = new int[] {0,10,5,8, 0,10,7,3};
152
    return mObjectQuats[mQuatIndex[cubit]];
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
  private float[][] getVertices(int variant)
158
    {
159
    if( variant==0 )
160
      {
161
      float v1x = G*(0.5f);
162
      float v1y = G*(SQ2/2);
163
      float v1z = G*(-0.5f);
164
      float v2x = G*(-0.5f);
165
      float v2y = G*(SQ2/2);
166
      float v2z = G*(-0.5f);
167
      float v3x = 0.0f;
168
      float v3y = 0.0f;
169
      float v3z = G*(-1.0f);
170

    
171
      return new float[][]
172
          {
173
              { 0.0f, 0.0f,0.0f},
174
              { 0.5f -v1x, SQ2/2 -v1y,-0.5f -v1z},
175
              {-0.5f -v2x, SQ2/2 -v2y,-0.5f -v2z},
176
              { 0.0f -v3x, 0.0f  -v3y,-1.0f -v3z},
177
              { 0.0f, (2*SQ2/3)*F, -2*F/3},
178
              {  F/3, (SQ2/3)*F, -F},
179
              { -F/3, (SQ2/3)*F, -F},
180
              { (1-F)*0.5f -v1x, (1-F)*(SQ2/2)+(2*SQ2/3)*F -v1y, -(1-F)*0.5f-F*(2.0f/3) -v1z},
181
              {-(1-F)*0.5f -v2x, (1-F)*(SQ2/2)+(2*SQ2/3)*F -v2y, -(1-F)*0.5f-F*(2.0f/3) -v2z},
182
              { F/3        -v3x, (SQ2/3)*F                 -v3x, -1.0f                  -v3z},
183
              { (1-F)*0.5f+F/3 -v1x, (1-F)*(SQ2/2)+F*(SQ2/3) -v1y, -(1-F)*0.5f-F -v1z},
184
              {-(1-F)*0.5f-F/3 -v2x, (1-F)*(SQ2/2)+F*(SQ2/3) -v2y, -(1-F)*0.5f-F -v2z},
185
              {-F/3            -v3x, (SQ2/3)*F               -v3y, -1.0f         -v3z},
186
              {0.0f, (1-G)*SQ2/2, (1-G)*(-1.0f) }
187
          };
188
      }
189
    else
190
      {
191
      return new float[][]
192
          {
193
              {  0.0f, (1-F)*(-2*SQ2/3), (1-F)*(2.0f/3) },
194
              { (1-F), (1-F)*(SQ2/3), (1-F)*(-1.0f/3) },
195
              { (F-1), (1-F)*(SQ2/3), (1-F)*(-1.0f/3) },
196
              {0,-SQ2/3,-1.0f/3}
197
          };
198
      }
199
    }
200

    
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202

    
203
  public ObjectShape getObjectShape(int variant)
204
    {
205
    if( variant==0 )
206
      {
207
      int[][] indices =
208
          {
209
              {0,1,7,4,8,2},
210
              {0,3,9,5,10,1},
211
              {0,2,11,6,12,3},
212
              {1,10,13,7},
213
              {3,12,13,9},
214
              {2,8,13,11},
215
              {4,7,13},
216
              {4,13,8},
217
              {5,9,13},
218
              {5,13,10},
219
              {6,11,13},
220
              {6,13,12}
221
          };
222

    
223
      return new ObjectShape(getVertices(variant), indices);
224
      }
225
    else
226
      {
227
      int[][] indices =
228
          {
229
              {0,1,2},
230
              {3,1,0},
231
              {3,2,1},
232
              {3,0,2}
233
          };
234

    
235
      return new ObjectShape(getVertices(variant), indices);
236
      }
237
    }
238

    
239
///////////////////////////////////////////////////////////////////////////////////////////////////
240

    
241
  public ObjectFaceShape getObjectFaceShape(int variant)
242
    {
243
    if( variant==0 )
244
      {
245
      float height = isInIconMode() ? 0.001f : 0.015f;
246
      float[][] bands = { {height,35,0.25f,0.5f,5,1,1},{0.001f,35,0.25f,0.5f,5,0,0} };
247
      int[] indices   = { 0,0,0,1,1,1,1,1,1,1,1,1 };
248
      return new ObjectFaceShape(bands,indices,null);
249
      }
250
    else
251
      {
252
      float height = isInIconMode() ? 0.001f : 0.020f;
253
      float[][] bands = { {height,35,0.20f,0.6f,5,0,0}, {0.001f,35,0.20f,0.6f,3,0,0} };
254
      int[] indices   = { 0,1,1,1 };
255
      return new ObjectFaceShape(bands,indices,null);
256
      }
257
    }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
  public ObjectVertexEffects getVertexEffects(int variant)
262
    {
263
    if( variant==0 )
264
      {
265
      float[][] corners = { {0.04f,0.10f} };
266
      int[] indices     = { 0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };
267
      float[][] centers = { {0.0f, SQ2/2, -1.0f} };
268
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
269
      }
270
    else
271
      {
272
      float[][] corners = { {0.02f,0.10f} };
273
      int[] indices     = { 0,0,0,-1 };
274
      float[][] centers = { {0,-SQ2/3,-1.0f/3} };
275
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
276
      }
277
    }
278

    
279
///////////////////////////////////////////////////////////////////////////////////////////////////
280

    
281
  public int getNumCubitVariants(int[] numLayers)
282
    {
283
    return 2;
284
    }
285

    
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287

    
288
  public int getCubitVariant(int cubit, int[] numLayers)
289
    {
290
    return cubit<4 ? 0:1;
291
    }
292

    
293
///////////////////////////////////////////////////////////////////////////////////////////////////
294

    
295
  public float getStickerRadius()
296
    {
297
    return 0.07f;
298
    }
299

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301

    
302
  public float getStickerStroke()
303
    {
304
    return isInIconMode() ? 0.07f : 0.06f;
305
    }
306

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

    
309
  public float[][] getStickerAngles()
310
    {
311
    return null;
312
    }
313

    
314
///////////////////////////////////////////////////////////////////////////////////////////////////
315
// PUBLIC API
316

    
317
  public Static3D[] getRotationAxis()
318
    {
319
    return ROT_AXIS;
320
    }
321

    
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323

    
324
  public int[][] getBasicAngles()
325
    {
326
    if( mBasicAngle==null )
327
      {
328
      int[] tmp = {3,3};
329
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
330
      }
331

    
332
    return mBasicAngle;
333
    }
334

    
335
///////////////////////////////////////////////////////////////////////////////////////////////////
336

    
337
  public String getShortName()
338
    {
339
    return ObjectType.PDUO_2.name();
340
    }
341

    
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343

    
344
  public ObjectSignature getSignature()
345
    {
346
    return new ObjectSignature(ObjectSignatures.PDUO_2);
347
    }
348

    
349
///////////////////////////////////////////////////////////////////////////////////////////////////
350

    
351
  public String getObjectName()
352
    {
353
    return "Pyraminx Duo";
354
    }
355

    
356
///////////////////////////////////////////////////////////////////////////////////////////////////
357

    
358
  public String getInventor()
359
    {
360
    return "Oskar van Deventer";
361
    }
362

    
363
///////////////////////////////////////////////////////////////////////////////////////////////////
364

    
365
  public int getYearOfInvention()
366
    {
367
    return 2014;
368
    }
369

    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371

    
372
  public int getComplexity()
373
    {
374
    return 0;
375
    }
376

    
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378

    
379
  public String[][] getTutorials()
380
    {
381
    return new String[][]{
382
                          {"gb","xB9OFNyi-Uk","Pyraminx Duo: Beginner","Z3"},
383
                          {"gb","P-Zt7GEyYuE","Pyraminx Duo: Optimal","Z3"},
384
                          {"es","ojDwj9Ld3t8","Tutorial: Pyraminx Duo","RubikArt"},
385
                          {"ru","pTaHQOqp4L8","Как собрать Pyraminx Duo","GCubing"},
386
                          {"pl","r9pW0933vz4","Poradnik mini - Pyraminx Duo","Speedcubing Nation"},
387
                          {"vn","F2XahC2fYuk","Hướng dẫn giải Pyraminx Duo","Rubik For Everyone"},
388
                         };
389
    }
390
}
(30-30/41)