Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyCrystal.java @ 2dffaf22

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 java.io.InputStream;
13

    
14
import org.distorted.library.type.Static3D;
15
import org.distorted.library.type.Static4D;
16
import org.distorted.objectlib.helpers.FactoryCubit;
17
import org.distorted.objectlib.helpers.ObjectFaceShape;
18
import org.distorted.objectlib.helpers.ObjectShape;
19
import org.distorted.objectlib.helpers.ObjectSignature;
20
import org.distorted.objectlib.helpers.ObjectVertexEffects;
21
import org.distorted.objectlib.main.InitData;
22
import org.distorted.objectlib.main.ObjectSignatures;
23
import org.distorted.objectlib.main.ObjectType;
24

    
25
///////////////////////////////////////////////////////////////////////////////////////////////////
26

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

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

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

    
37
  public TwistyCrystal(InitData data, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
38
    {
39
    super(data, meshState, iconMode, quat, move, scale, stream);
40
    }
41

    
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43

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

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

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

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

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

    
66
    return mPosition;
67
    }
68

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

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

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

    
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83

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

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

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

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

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

    
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134

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

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

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

    
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167

    
168
  public ObjectFaceShape getObjectFaceShape(int variant)
169
    {
170
    if( variant==0 )
171
      {
172
      float h1 = isInIconMode() ? 0.001f : 0.03f;
173
      float h2 = isInIconMode() ? 0.001f : 0.01f;
174
      float[][] bands = { {h1,17,0.5f,0.2f,5,1,0}, {h2, 1,0.5f,0.2f,5,1,0} };
175
      int[] indices   = { 0,0,1,1 };
176
      return new ObjectFaceShape(bands,indices,null);
177
      }
178
    else
179
      {
180
      float h1 = isInIconMode() ? 0.001f : 0.03f;
181
      float h2 = isInIconMode() ? 0.001f : 0.01f;
182
      float[][] bands = { {h1,17,0.5f,0.2f,5,1,0}, {h2, 1,0.5f,0.2f,5,1,0}, {h2, 1,0.5f,0.2f,3,0,0} };
183
      int[] indices   = { 0,0,0,1,1,1,2 };
184
      return new ObjectFaceShape(bands,indices,null);
185
      }
186
    }
187

    
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189

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

    
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209

    
210
  public int getNumCubitVariants(int[] numLayers)
211
    {
212
    return 2;
213
    }
214

    
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216

    
217
  public int getCubitVariant(int cubit, int[] numLayers)
218
    {
219
    return cubit<NUM_EDGES ? 0:1;
220
    }
221

    
222
///////////////////////////////////////////////////////////////////////////////////////////////////
223

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

    
233
    return mCuts;
234
    }
235

    
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237

    
238
  public float getStickerRadius()
239
    {
240
    return 0.18f;
241
    }
242

    
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244

    
245
  public float getStickerStroke()
246
    {
247
    return isInIconMode() ? 0.22f : 0.15f;
248
    }
249

    
250
///////////////////////////////////////////////////////////////////////////////////////////////////
251

    
252
  public float[][] getStickerAngles()
253
    {
254
    return null;
255
    }
256

    
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258
// PUBLIC API
259

    
260
  public String getShortName()
261
    {
262
    return ObjectType.CRYS_3.name();
263
    }
264

    
265
///////////////////////////////////////////////////////////////////////////////////////////////////
266

    
267
  public ObjectSignature getSignature()
268
    {
269
    return new ObjectSignature(ObjectSignatures.CRYS_3);
270
    }
271

    
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273

    
274
  public String getObjectName()
275
    {
276
    return "Pyraminx Crystal";
277
    }
278

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

    
281
  public String getInventor()
282
    {
283
    return "Aleh Hladzilin";
284
    }
285

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

    
288
  public int getYearOfInvention()
289
    {
290
    return 2006;
291
    }
292

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

    
295
  public int getComplexity()
296
    {
297
    return 3;
298
    }
299

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

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