Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyCrystal.java @ 361fd0de

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2022 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
import org.distorted.objectlib.helpers.FactoryCubit;
15
import org.distorted.objectlib.helpers.ObjectFaceShape;
16
import org.distorted.objectlib.helpers.ObjectShape;
17
import org.distorted.objectlib.metadata.Metadata;
18
import org.distorted.objectlib.signature.ObjectSignature;
19
import org.distorted.objectlib.helpers.ObjectVertexEffects;
20
import org.distorted.objectlib.main.InitAssets;
21
import org.distorted.objectlib.signature.ObjectConstants;
22
import org.distorted.objectlib.metadata.ListObjects;
23

    
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25

    
26
public class TwistyCrystal extends TwistyDodecahedron
27
{
28
  private static final float A = (SQ5+5)/10;
29

    
30
  private float[][] mCuts;
31
  private float[][] mPosition;
32
  private int[] mQuatIndex;
33

    
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35

    
36
  public TwistyCrystal(int iconMode, Static4D quat, Static3D move, float scale, Metadata meta, InitAssets asset)
37
    {
38
    super(iconMode, quat, move, scale, meta, asset);
39
    }
40

    
41
///////////////////////////////////////////////////////////////////////////////////////////////////
42

    
43
  public float[][] getCubitPositions(int[] numLayers)
44
    {
45
    if( mPosition==null )
46
      {
47
      if( mEdgeMap==null ) mEdgeMap = initializeEdgeMap();
48
      if( mCenterCoords==null ) initializeCenterCoords();
49

    
50
      mPosition = new float[NUM_EDGES+NUM_CORNERS][3];
51

    
52
      for(int edge=0; edge<NUM_EDGES; edge++)
53
        {
54
        float[] c1 = mCorners[ mEdgeMap[edge][0] ];
55
        float[] c2 = mCorners[ mEdgeMap[edge][1] ];
56

    
57
        mPosition[edge][0] = (c1[0]+c2[0])/2;
58
        mPosition[edge][1] = (c1[1]+c2[1])/2;
59
        mPosition[edge][2] = (c1[2]+c2[2])/2;
60
        }
61

    
62
      System.arraycopy(mCorners, 0, mPosition, NUM_EDGES, NUM_CORNERS);
63
      }
64

    
65
    return mPosition;
66
    }
67

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

    
70
  public Static4D getCubitQuats(int cubit, int[] numLayers)
71
    {
72
    if( mQuatIndex==null ) mQuatIndex = new int[] {  0,17,12,13,20, 4,25, 5,24,16,
73
                                                     9,21, 1,34, 8,11,30,43,26,14,
74
                                                    15,45,33,28,10, 2,29, 6, 7, 3,
75

    
76
                                                     0, 2,20,42,13,41,16,33, 8,51,
77
                                                     1,25,12,27, 4, 3,21,28, 5, 6 };
78
    return mObjectQuats[mQuatIndex[cubit]];
79
    }
80

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

    
83
  private float[][] getVertices(int variant)
84
    {
85
    float[] blueCenter = mCenterCoords[0];
86
    float[] greeCenter = mCenterCoords[1];
87
    float[] pinkCenter = mCenterCoords[2];
88

    
89
    if( variant==0 )
90
      {
91
      float B = greeCenter[2]-mCorners[0][2];
92
      float C = A*mCorners[0][1]+(1.0f-A)*mCorners[2][1];
93
      float D = greeCenter[0];
94

    
95
      return new float[][]
96
         {
97
             { 0.0f, C, 0,0f },
98
             { 0.0f,-C, 0,0f },
99
             {   -D,0.0f,  B },
100
             {   +D,0.0f,  B },
101
         };
102
      }
103
    else
104
      {
105
      float X = mCorners[0][0];
106
      float Y = mCorners[0][1];
107
      float Z = mCorners[0][2];
108

    
109
      float X1 = A*mCorners[0][0]+(1.0f-A)*mCorners[16][0];
110
      float Y1 = A*mCorners[0][1]+(1.0f-A)*mCorners[16][1];
111
      float Z1 = A*mCorners[0][2]+(1.0f-A)*mCorners[16][2];
112
      float X2 = A*mCorners[0][0]+(1.0f-A)*mCorners[12][0];
113
      float Y2 = A*mCorners[0][1]+(1.0f-A)*mCorners[12][1];
114
      float Z2 = A*mCorners[0][2]+(1.0f-A)*mCorners[12][2];
115
      float X3 = A*mCorners[0][0]+(1.0f-A)*mCorners[ 2][0];
116
      float Y3 = A*mCorners[0][1]+(1.0f-A)*mCorners[ 2][1];
117
      float Z3 = A*mCorners[0][2]+(1.0f-A)*mCorners[ 2][2];
118

    
119
      return new float[][]
120
         {
121
             {0.0f, 0.0f, 0.0f},
122
             {X1-X, Y1-Y, Z1-Z},
123
             {X2-X, Y2-Y, Z2-Z},
124
             {X3-X, Y3-Y, Z3-Z},
125
             { greeCenter[0]-X, greeCenter[1]-Y, greeCenter[2]-Z },
126
             { pinkCenter[0]-X, pinkCenter[1]-Y, pinkCenter[2]-Z },
127
             { blueCenter[0]-X, blueCenter[1]-Y, blueCenter[2]-Z }
128
         };
129
      }
130
    }
131

    
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133

    
134
  public ObjectShape getObjectShape(int variant)
135
    {
136
    if( variant==0 )
137
      {
138
      int[][] indices =
139
         {
140
             {1,0,2},
141
             {0,1,3},
142
             {2,3,1},
143
             {3,2,0}
144
         };
145

    
146
      return new ObjectShape(getVertices(variant), indices);
147
      }
148
    else
149
      {
150
      int[][] indices =
151
         {
152
             { 5,3,0,1 },
153
             { 4,2,0,3 },
154
             { 6,1,0,2 },
155
             { 5,4,3 },
156
             { 4,6,2 },
157
             { 6,5,1 },
158
             { 6,4,5 }
159
         };
160

    
161
      return new ObjectShape(getVertices(variant), indices);
162
      }
163
    }
164

    
165
///////////////////////////////////////////////////////////////////////////////////////////////////
166

    
167
  public ObjectFaceShape getObjectFaceShape(int variant)
168
    {
169
    int angle = 15;
170
    float R = 0.7f;
171
    float S = 0.5f;
172

    
173
    if( variant==0 )
174
      {
175
      float h1 = isInIconMode() ? 0.001f : 0.03f;
176
      float h2 = isInIconMode() ? 0.001f : 0.01f;
177
      float[][] bands = { {h1,angle,R,S,5,1,0}, {h2,angle,R,S,5,1,0} };
178
      int[] indices   = { 0,0,1,1 };
179
      return new ObjectFaceShape(bands,indices,null);
180
      }
181
    else
182
      {
183
      float h1 = isInIconMode() ? 0.001f : 0.03f;
184
      float h2 = isInIconMode() ? 0.001f : 0.01f;
185
      float[][] bands = { {h1,angle,R,S,5,1,0}, {h2,angle,R,S,5,1,0}, {h2,angle,R,S,3,0,0} };
186
      int[] indices   = { 0,0,0,1,1,1,2 };
187
      return new ObjectFaceShape(bands,indices,null);
188
      }
189
    }
190

    
191
///////////////////////////////////////////////////////////////////////////////////////////////////
192

    
193
  public ObjectVertexEffects getVertexEffects(int variant)
194
    {
195
    if( variant==0 )
196
      {
197
      float[][] corners= { { 0.015f, 0.20f } };
198
      int[] indices    = { 0,0,0,0 };
199
      float[][] centers= { { 0.0f,0.0f,-mCorners[0][2] } };
200
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
201
      }
202
    else
203
      {
204
      float[][] corners= { { 0.01f, 0.20f } };
205
      int[] indices    = { 0,0,0,0,0,0,0 };
206
      float[][] centers= { { 0.0f,-1.5f,-mCorners[0][2] } };
207
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
208
      }
209
    }
210

    
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212

    
213
  public int getNumCubitVariants(int[] numLayers)
214
    {
215
    return 2;
216
    }
217

    
218
///////////////////////////////////////////////////////////////////////////////////////////////////
219

    
220
  public int getCubitVariant(int cubit, int[] numLayers)
221
    {
222
    return cubit<NUM_EDGES ? 0:1;
223
    }
224

    
225
///////////////////////////////////////////////////////////////////////////////////////////////////
226

    
227
  public float[][] getCuts(int[] numLayers)
228
    {
229
    if( mCuts==null )
230
      {
231
      float CUT = 1.5f; // TODO
232
      float[] cut = new float[] { -CUT,+CUT };
233
      mCuts = new float[][] { cut,cut,cut,cut,cut,cut };
234
      }
235

    
236
    return mCuts;
237
    }
238

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

    
241
  public float getStickerRadius()
242
    {
243
    return 0.18f;
244
    }
245

    
246
///////////////////////////////////////////////////////////////////////////////////////////////////
247

    
248
  public float getStickerStroke()
249
    {
250
    return isInIconMode() ? 0.22f : 0.15f;
251
    }
252

    
253
///////////////////////////////////////////////////////////////////////////////////////////////////
254

    
255
  public float[][][] getStickerAngles()
256
    {
257
    return null;
258
    }
259

    
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
// PUBLIC API
262

    
263
  public String getShortName()
264
    {
265
    return ListObjects.CRYS_3.name();
266
    }
267

    
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269

    
270
  public ObjectSignature getSignature()
271
    {
272
    return new ObjectSignature(ObjectConstants.CRYS_3);
273
    }
274

    
275
///////////////////////////////////////////////////////////////////////////////////////////////////
276

    
277
  public String getObjectName()
278
    {
279
    return "Pyraminx Crystal";
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283

    
284
  public String getInventor()
285
    {
286
    return "Aleh Hladzilin";
287
    }
288

    
289
///////////////////////////////////////////////////////////////////////////////////////////////////
290

    
291
  public int getYearOfInvention()
292
    {
293
    return 2006;
294
    }
295

    
296
///////////////////////////////////////////////////////////////////////////////////////////////////
297

    
298
  public float getComplexity()
299
    {
300
    return 3.0f;
301
    }
302

    
303
///////////////////////////////////////////////////////////////////////////////////////////////////
304

    
305
  public String[][] getTutorials()
306
    {
307
    return new String[][]{
308
                          {"gb","tFSGC9esay0","Pyraminx Crystal Tutorial","twistypuzzling"},
309
                          {"es","AmrIwSICFB8","Como resolver Pyraminx Crystal","Tutoriales Rubik"},
310
                          {"ru","3AKeT8JIU0E","Как собрать Crystal Pyraminx","RBcuber"},
311
                          {"fr","SPsrHhQzmVg","Résolution du Pyraminx Crystal","asthalis"},
312
                          {"de","EH4sw7_21eA","Crystal Pyraminx Tutorial","GerCubing"},
313
                          {"pl","AmrIwSICFB8","Crystal Pyraminx TUTORIAL PL","MrUK"},
314
                          {"br","13pz0cNBVow","Como resolver o Pyraminx Crystal 1/3","RafaelCinoto"},
315
                          {"br","eT654oZsBg0","Como resolver o Pyraminx Crystal 2/3","RafaelCinoto"},
316
                          {"br","MnooQbVFbfU","Como resolver o Pyraminx Crystal 3/3","RafaelCinoto"},
317
                          {"kr","o-w_ZzDrfFU","피라밍크스 크리스탈 해법 1/2","SlowCuberToumai"},
318
                          {"kr","ExMg8SAge4Q","피라밍크스 크리스탈 해법 2/2","SlowCuberToumai"},
319
                          {"vn","MxF4bKlnIMU","Tutorial N.28 - Pyraminx Crystal","Duy Thích Rubik"},
320
                         };
321
    }
322
}
(14-14/57)