Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyMirrorSkewb.java @ 8f5116ec

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 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_CHANGING_SHAPEMOD;
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.FactoryShape;
19
import org.distorted.objectlib.helpers.ObjectFaceShape;
20
import org.distorted.objectlib.helpers.ObjectShape;
21
import org.distorted.objectlib.helpers.ObjectVertexEffects;
22
import org.distorted.objectlib.main.InitAssets;
23
import org.distorted.objectlib.metadata.ListObjects;
24
import org.distorted.objectlib.metadata.Metadata;
25
import org.distorted.objectlib.scrambling.ScrambleEdgeGenerator;
26
import org.distorted.objectlib.shape.ShapeHexahedron;
27
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
28

    
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

    
31
public class TwistyMirrorSkewb extends ShapeHexahedron
32
{
33
  public static final Static3D[] ROT_AXIS =
34
         {
35
           new Static3D( SQ3/3, SQ3/3, SQ3/3),
36
           new Static3D( SQ3/3, SQ3/3,-SQ3/3),
37
           new Static3D( SQ3/3,-SQ3/3, SQ3/3),
38
           new Static3D( SQ3/3,-SQ3/3,-SQ3/3)
39
         };
40

    
41
  private static final int[] FACE_COLORS = new int[] { COLOR_WHITE };
42
  private static final float[] MIRROR_VEC = { 0.10f, 0.15f, 0.20f };
43

    
44
  private int[][] mEdges;
45
  private int[][] mBasicAngle;
46
  private float[][] mCuts;
47
  private float[][] mPositions;
48
  private ObjectShape[] mShapes;
49
  private float[][] mCutPlanes;
50
  private float[] mDist3D, mDist;
51
  private float[][] mPotentialVertices;
52

    
53
///////////////////////////////////////////////////////////////////////////////////////////////////
54

    
55
  public TwistyMirrorSkewb(int iconMode, Static4D quat, Static3D move, float scale, Metadata meta, InitAssets asset)
56
    {
57
    super(iconMode, 2*meta.getNumLayers()[0]-2, quat, move, scale, meta, asset);
58
    }
59

    
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
// here we cannot automatically detect the outer monochromatic walls -> use the old way.
62

    
63
  @Override
64
  public int getSolvedFunctionIndex()
65
    {
66
    return 0;
67
    }
68

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

    
71
  @Override
72
  public int[][] getSolvedQuats()
73
    {
74
    return getOldSolvedQuats();
75
    }
76

    
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78

    
79
  @Override
80
  public int getInternalColor()
81
    {
82
    return 0xff333333;
83
    }
84

    
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86

    
87
  @Override
88
  public int getColor(int face)
89
    {
90
    return FACE_COLORS[face];
91
    }
92

    
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94

    
95
  @Override
96
  public int getNumFaceColors()
97
    {
98
    return 1;
99
    }
100

    
101
///////////////////////////////////////////////////////////////////////////////////////////////////
102

    
103
  @Override
104
  public float[][] returnRotationFactor()
105
    {
106
    int numL = getNumLayers()[0];
107
    float[] f = new float[numL];
108
    for(int i=0; i<numL; i++) f[i] = 1.7f;
109
    return new float[][] { f,f,f,f };
110
    }
111

    
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113

    
114
  public int[][] getScrambleEdges()
115
    {
116
    if( mEdges==null ) mEdges = ScrambleEdgeGenerator.getScrambleEdgesSingle(mBasicAngle);
117
    return mEdges;
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121

    
122
  public float[][] getCuts(int[] numLayers)
123
    {
124
    if( mCuts==null )
125
      {
126
      float[] c = {0};
127
      mCuts = new float[][] {c,c,c,c};
128
      }
129

    
130
    return mCuts;
131
    }
132

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

    
135
  public boolean[][] getLayerRotatable(int[] numLayers)
136
    {
137
    boolean[] tmp = {true,true};
138
    return new boolean[][] { tmp,tmp,tmp,tmp };
139
    }
140

    
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142

    
143
  public int getTouchControlType()
144
    {
145
    return TC_CHANGING_SHAPEMOD;
146
    }
147

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  public int getTouchControlSplit()
151
    {
152
    return TYPE_NOT_SPLIT;
153
    }
154

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

    
157
  public int[][][] getEnabled()
158
    {
159
    return null;
160
    }
161

    
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163
// 'full' dists (not divided by numLayers)
164

    
165
  private float[] getDist()
166
    {
167
    if( mDist==null )
168
      {
169
      float DX = MIRROR_VEC[0];
170
      float DY = MIRROR_VEC[1];
171
      float DZ = MIRROR_VEC[2];
172
      mDist = new float[] { 1+DX, 1-DX, 1+DY, 1-DY, 1+DZ, 1-DZ };
173
      }
174

    
175
    return mDist;
176
    }
177

    
178
///////////////////////////////////////////////////////////////////////////////////////////////////
179
// 'regular' dists for the touchControl (have to be divided by numLayers)
180

    
181
  public float[] getDist3D(int[] numLayers)
182
    {
183
    if( mDist3D==null )
184
      {
185
      float[] d = getDist();
186
      mDist3D = new float[] { d[0]/2, d[1]/2, d[2]/2, d[3]/2, d[4]/2, d[5]/2 };
187
      }
188

    
189
    return mDist3D;
190
    }
191

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

    
194
  public Static3D[] getFaceAxis()
195
    {
196
    return TouchControlHexahedron.FACE_AXIS;
197
    }
198

    
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200

    
201
  private float[][] getPositions()
202
    {
203
    if( mPositions==null )
204
      {
205
      final float COR = 1.0f;
206
      final float CEN = 1.0f;
207
      final float X = MIRROR_VEC[0];
208
      final float Y = MIRROR_VEC[1];
209
      final float Z = MIRROR_VEC[2];
210

    
211
      mPositions = new float[8+6][];
212

    
213
      mPositions[0] = new float[]{ COR+X,  COR+Y,  COR+Z };
214
      mPositions[1] = new float[]{ COR+X,  COR+Y, -COR+Z };
215
      mPositions[2] = new float[]{ COR+X, -COR+Y,  COR+Z };
216
      mPositions[3] = new float[]{ COR+X, -COR+Y, -COR+Z };
217
      mPositions[4] = new float[]{-COR+X,  COR+Y,  COR+Z };
218
      mPositions[5] = new float[]{-COR+X,  COR+Y, -COR+Z };
219
      mPositions[6] = new float[]{-COR+X, -COR+Y,  COR+Z };
220
      mPositions[7] = new float[]{-COR+X, -COR+Y, -COR+Z };
221

    
222
      mPositions[ 8] = new float[]{     X,     Y, CEN+Z };
223
      mPositions[ 9] = new float[]{     X,     Y,-CEN+Z };
224
      mPositions[10] = new float[]{     X, CEN+Y,     Z };
225
      mPositions[11] = new float[]{     X,-CEN+Y,     Z };
226
      mPositions[12] = new float[]{ CEN+X,     Y,     Z };
227
      mPositions[13] = new float[]{-CEN+X,     Y,     Z };
228
      }
229

    
230
    return mPositions;
231
    }
232

    
233

    
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235

    
236
  public float[][] getCubitPositions(int[] numLayers)
237
    {
238
    return getPositions();
239
    }
240

    
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242

    
243
  public Static4D getCubitQuats(int cubit, int[] numLayers)
244
    {
245
    return mObjectQuats[0];
246
    }
247

    
248
///////////////////////////////////////////////////////////////////////////////////////////////////
249

    
250
  private void createCutPlanes()
251
    {
252
    int numPlanes = 6+4;
253
    mCutPlanes = new float[numPlanes][];
254
    Static3D[] faceAxis = getFaceAxis();
255
    float[] dist = getDist();
256

    
257
    for(int p=0; p<6; p++)
258
      {
259
      Static3D ax = faceAxis[p];
260
      mCutPlanes[p] = new float[] { ax.get0(), ax.get1(), ax.get2(), dist[p] };
261
      }
262

    
263
    for(int p=6; p<10; p++)
264
      {
265
      Static3D ax = ROT_AXIS[p-6];
266
      mCutPlanes[p] = new float[] { ax.get0(), ax.get1(), ax.get2(), 0 };
267
      }
268
    }
269

    
270
///////////////////////////////////////////////////////////////////////////////////////////////////
271

    
272
  private float[] internalPoint(int variant)
273
    {
274
    float[][] pos = getPositions();
275
    float[] position = pos[variant];
276
    float[][] center = computeVertexEffectCenter(variant);
277
    float[] cent = center[0];
278

    
279
    float[] ret = new float[3];
280

    
281
    float A = 0.1f;
282

    
283
    ret[0] = position[0] + A*cent[0];
284
    ret[1] = position[1] + A*cent[1];
285
    ret[2] = position[2] + A*cent[2];
286

    
287
    return ret;
288
    }
289

    
290
///////////////////////////////////////////////////////////////////////////////////////////////////
291

    
292
  public ObjectShape getObjectShape(int variant)
293
    {
294
    if( mShapes==null )
295
      {
296
      int[] numLayers = getNumLayers();
297
      int numV = getNumCubitVariants(numLayers);
298
      mShapes = new ObjectShape[numV];
299
      createCutPlanes();
300
      mPotentialVertices = FactoryShape.computePotentialVertices(mCutPlanes);
301
      }
302

    
303
    if( mShapes[variant]==null )
304
      {
305
      float[][] pos = getPositions();
306
      float[] point = internalPoint(variant);
307
      mShapes[variant] = FactoryShape.createShape(mCutPlanes,mPotentialVertices,pos[variant],point);
308
      }
309

    
310
    return mShapes[variant];
311
    }
312

    
313
///////////////////////////////////////////////////////////////////////////////////////////////////
314

    
315
  public ObjectFaceShape getObjectFaceShape(int variant)
316
    {
317
    ObjectShape shape = getObjectShape(variant);
318
    int[][] ind    = shape.getVertIndices();
319
    float[][] vert = shape.getVertices();
320
    float[][] pos  = getPositions();
321
    int[] indices  = FactoryShape.produceBandIndices(vert, pos[variant], ind, getFaceAxis(), getDist() );
322

    
323
    if( variant<8 )
324
      {
325
      int N = 5;
326
      int E = 2;
327
      float height = isInIconMode() ? 0.001f : 0.04f;
328
      float[][] bands = { {height,35,0.16f,0.7f,N,E,E}, {0.001f, 35,1.00f,0.0f,N,E,E} };
329
      return new ObjectFaceShape(bands,indices,null);
330
      }
331
    else
332
      {
333
      int N = 5;
334
      int E = 1;
335
      float height = isInIconMode() ? 0.001f : 0.05f;
336
      float[][] bands = { {height,35,SQ2/8,0.9f,N,E,E}, {0.001f,35,1,0.0f,3,0,0} };
337
      return new ObjectFaceShape(bands,indices,null);
338
      }
339
    }
340

    
341
///////////////////////////////////////////////////////////////////////////////////////////////////
342

    
343
  private float[][] computeVertexEffectCenter(int variant)
344
    {
345
    final float A = 1.0f;
346

    
347
    switch(variant)
348
      {
349
      case  0: return new float[][] { {-A,-A,-A} };
350
      case  1: return new float[][] { {-A,-A, A} };
351
      case  2: return new float[][] { {-A, A,-A} };
352
      case  3: return new float[][] { {-A, A, A} };
353
      case  4: return new float[][] { { A,-A,-A} };
354
      case  5: return new float[][] { { A,-A, A} };
355
      case  6: return new float[][] { { A, A,-A} };
356
      case  7: return new float[][] { { A, A, A} };
357
      case  8: return new float[][] { { 0, 0,-A} };
358
      case  9: return new float[][] { { 0, 0, A} };
359
      case 10: return new float[][] { { 0,-A, 0} };
360
      case 11: return new float[][] { { 0, A, 0} };
361
      case 12: return new float[][] { {-A, 0, 0} };
362
      case 13: return new float[][] { { A, 0, 0} };
363
      }
364

    
365
    return null;
366
    }
367

    
368
///////////////////////////////////////////////////////////////////////////////////////////////////
369

    
370
  public ObjectVertexEffects getVertexEffects(int variant)
371
    {
372
    ObjectShape shape  = getObjectShape(variant);
373
    float[][] vertices = shape.getVertices();
374
    float[][] centers  = computeVertexEffectCenter(variant);
375
    float[][] pos      = getPositions();
376
    int[] indices      = FactoryShape.computeVertexEffectsIndices(vertices, pos[variant], getFaceAxis(), getDist() );
377
    float[][] corners  = variant<8 ? new float[][]{{0.03f, 0.20f}} : new float[][]{{0.03f, 0.15f}};
378

    
379
    return FactoryCubit.generateVertexEffect(vertices,corners,indices,centers,indices);
380
    }
381

    
382
///////////////////////////////////////////////////////////////////////////////////////////////////
383

    
384
  public int getNumCubitVariants(int[] numLayers)
385
    {
386
    return 14;
387
    }
388

    
389
///////////////////////////////////////////////////////////////////////////////////////////////////
390

    
391
  public int getCubitVariant(int cubit, int[] numLayers)
392
    {
393
    return cubit;
394
    }
395

    
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397

    
398
  public float getStickerRadius()
399
    {
400
    return 0.08f;
401
    }
402

    
403
///////////////////////////////////////////////////////////////////////////////////////////////////
404

    
405
  public float getStickerStroke()
406
    {
407
    return isInIconMode() ? 0.16f : 0.08f;
408
    }
409

    
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411

    
412
  public float[][][] getStickerAngles()
413
    {
414
    return null;
415
    }
416

    
417
///////////////////////////////////////////////////////////////////////////////////////////////////
418
// PUBLIC API
419

    
420
  public Static3D[] getRotationAxis()
421
    {
422
    return ROT_AXIS;
423
    }
424

    
425
///////////////////////////////////////////////////////////////////////////////////////////////////
426

    
427
  public int[][] getBasicAngles()
428
    {
429
    if( mBasicAngle ==null )
430
      {
431
      int num = getNumLayers()[0];
432
      int[] tmp = new int[num];
433
      for(int i=0; i<num; i++) tmp[i] = 3;
434
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
435
      }
436

    
437
    return mBasicAngle;
438
    }
439

    
440
///////////////////////////////////////////////////////////////////////////////////////////////////
441

    
442
  public String getShortName()
443
    {
444
    return ListObjects.MSKE_2.name();
445
    }
446

    
447
///////////////////////////////////////////////////////////////////////////////////////////////////
448

    
449
  public String[][] getTutorials()
450
    {
451
    return null;
452
    }
453
}
(34-34/59)