Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyMirrorSkewb.java @ 962b8ff6

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[] getColorTable()
89
    {
90
    return FACE_COLORS;
91
    }
92

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

    
95
  @Override
96
  public float[][] returnRotationFactor()
97
    {
98
    int numL = getNumLayers()[0];
99
    float[] f = new float[numL];
100
    for(int i=0; i<numL; i++) f[i] = 1.7f;
101
    return new float[][] { f,f,f,f };
102
    }
103

    
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105

    
106
  public int[][] getScrambleEdges()
107
    {
108
    if( mEdges==null ) mEdges = ScrambleEdgeGenerator.getScrambleEdgesSingle(mBasicAngle);
109
    return mEdges;
110
    }
111

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

    
114
  public float[][] getCuts(int[] numLayers)
115
    {
116
    if( mCuts==null )
117
      {
118
      float[] c = {0};
119
      mCuts = new float[][] {c,c,c,c};
120
      }
121

    
122
    return mCuts;
123
    }
124

    
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126

    
127
  public boolean[][] getLayerRotatable(int[] numLayers)
128
    {
129
    boolean[] tmp = {true,true};
130
    return new boolean[][] { tmp,tmp,tmp,tmp };
131
    }
132

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

    
135
  public int getTouchControlType()
136
    {
137
    return TC_CHANGING_SHAPEMOD;
138
    }
139

    
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141

    
142
  public int getTouchControlSplit()
143
    {
144
    return TYPE_NOT_SPLIT;
145
    }
146

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

    
149
  public int[][][] getEnabled()
150
    {
151
    return null;
152
    }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155
// 'full' dists (not divided by numLayers)
156

    
157
  private float[] getDist()
158
    {
159
    if( mDist==null )
160
      {
161
      float DX = MIRROR_VEC[0];
162
      float DY = MIRROR_VEC[1];
163
      float DZ = MIRROR_VEC[2];
164
      mDist = new float[] { 1+DX, 1-DX, 1+DY, 1-DY, 1+DZ, 1-DZ };
165
      }
166

    
167
    return mDist;
168
    }
169

    
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171
// 'regular' dists for the touchControl (have to be divided by numLayers)
172

    
173
  public float[] getDist3D(int[] numLayers)
174
    {
175
    if( mDist3D==null )
176
      {
177
      float[] d = getDist();
178
      mDist3D = new float[] { d[0]/2, d[1]/2, d[2]/2, d[3]/2, d[4]/2, d[5]/2 };
179
      }
180

    
181
    return mDist3D;
182
    }
183

    
184
///////////////////////////////////////////////////////////////////////////////////////////////////
185

    
186
  public Static3D[] getFaceAxis()
187
    {
188
    return TouchControlHexahedron.FACE_AXIS;
189
    }
190

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

    
193
  private float[][] getPositions()
194
    {
195
    if( mPositions==null )
196
      {
197
      final float COR = 1.0f;
198
      final float CEN = 1.0f;
199
      final float X = MIRROR_VEC[0];
200
      final float Y = MIRROR_VEC[1];
201
      final float Z = MIRROR_VEC[2];
202

    
203
      mPositions = new float[8+6][];
204

    
205
      mPositions[0] = new float[]{ COR+X,  COR+Y,  COR+Z };
206
      mPositions[1] = new float[]{ COR+X,  COR+Y, -COR+Z };
207
      mPositions[2] = new float[]{ COR+X, -COR+Y,  COR+Z };
208
      mPositions[3] = new float[]{ COR+X, -COR+Y, -COR+Z };
209
      mPositions[4] = new float[]{-COR+X,  COR+Y,  COR+Z };
210
      mPositions[5] = new float[]{-COR+X,  COR+Y, -COR+Z };
211
      mPositions[6] = new float[]{-COR+X, -COR+Y,  COR+Z };
212
      mPositions[7] = new float[]{-COR+X, -COR+Y, -COR+Z };
213

    
214
      mPositions[ 8] = new float[]{     X,     Y, CEN+Z };
215
      mPositions[ 9] = new float[]{     X,     Y,-CEN+Z };
216
      mPositions[10] = new float[]{     X, CEN+Y,     Z };
217
      mPositions[11] = new float[]{     X,-CEN+Y,     Z };
218
      mPositions[12] = new float[]{ CEN+X,     Y,     Z };
219
      mPositions[13] = new float[]{-CEN+X,     Y,     Z };
220
      }
221

    
222
    return mPositions;
223
    }
224

    
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

    
228
  public float[][] getCubitPositions(int[] numLayers)
229
    {
230
    return getPositions();
231
    }
232

    
233
///////////////////////////////////////////////////////////////////////////////////////////////////
234

    
235
  public Static4D getCubitQuats(int cubit, int[] numLayers)
236
    {
237
    return mObjectQuats[0];
238
    }
239

    
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241

    
242
  private void createCutPlanes()
243
    {
244
    int numPlanes = 6+4;
245
    mCutPlanes = new float[numPlanes][];
246
    Static3D[] faceAxis = getFaceAxis();
247
    float[] dist = getDist();
248

    
249
    for(int p=0; p<6; p++)
250
      {
251
      Static3D ax = faceAxis[p];
252
      mCutPlanes[p] = new float[] { ax.get0(), ax.get1(), ax.get2(), dist[p] };
253
      }
254

    
255
    for(int p=6; p<10; p++)
256
      {
257
      Static3D ax = ROT_AXIS[p-6];
258
      mCutPlanes[p] = new float[] { ax.get0(), ax.get1(), ax.get2(), 0 };
259
      }
260
    }
261

    
262
///////////////////////////////////////////////////////////////////////////////////////////////////
263

    
264
  private float[] internalPoint(int variant)
265
    {
266
    float[][] pos = getPositions();
267
    float[] position = pos[variant];
268
    float[][] center = computeVertexEffectCenter(variant);
269
    float[] cent = center[0];
270

    
271
    float[] ret = new float[3];
272

    
273
    float A = 0.1f;
274

    
275
    ret[0] = position[0] + A*cent[0];
276
    ret[1] = position[1] + A*cent[1];
277
    ret[2] = position[2] + A*cent[2];
278

    
279
    return ret;
280
    }
281

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

    
284
  public ObjectShape getObjectShape(int variant)
285
    {
286
    if( mShapes==null )
287
      {
288
      int[] numLayers = getNumLayers();
289
      int numV = getNumCubitVariants(numLayers);
290
      mShapes = new ObjectShape[numV];
291
      createCutPlanes();
292
      mPotentialVertices = FactoryShape.computePotentialVertices(mCutPlanes);
293
      }
294

    
295
    if( mShapes[variant]==null )
296
      {
297
      float[][] pos = getPositions();
298
      float[] point = internalPoint(variant);
299
      mShapes[variant] = FactoryShape.createShape(mCutPlanes,mPotentialVertices,pos[variant],point);
300
      }
301

    
302
    return mShapes[variant];
303
    }
304

    
305
///////////////////////////////////////////////////////////////////////////////////////////////////
306

    
307
  public ObjectFaceShape getObjectFaceShape(int variant)
308
    {
309
    ObjectShape shape = getObjectShape(variant);
310
    int[][] ind    = shape.getVertIndices();
311
    float[][] vert = shape.getVertices();
312
    float[][] pos  = getPositions();
313
    int[] indices  = FactoryShape.produceBandIndices(vert, pos[variant], ind, getFaceAxis(), getDist() );
314

    
315
    if( variant<8 )
316
      {
317
      int N = 5;
318
      int E = 2;
319
      float height = isInIconMode() ? 0.001f : 0.04f;
320
      float[][] bands = { {height,35,0.16f,0.7f,N,E,E}, {0.001f, 35,1.00f,0.0f,N,E,E} };
321
      return new ObjectFaceShape(bands,indices,null);
322
      }
323
    else
324
      {
325
      int N = 5;
326
      int E = 1;
327
      float height = isInIconMode() ? 0.001f : 0.05f;
328
      float[][] bands = { {height,35,SQ2/8,0.9f,N,E,E}, {0.001f,35,1,0.0f,3,0,0} };
329
      return new ObjectFaceShape(bands,indices,null);
330
      }
331
    }
332

    
333
///////////////////////////////////////////////////////////////////////////////////////////////////
334

    
335
  private float[][] computeVertexEffectCenter(int variant)
336
    {
337
    final float A = 1.0f;
338

    
339
    switch(variant)
340
      {
341
      case  0: return new float[][] { {-A,-A,-A} };
342
      case  1: return new float[][] { {-A,-A, A} };
343
      case  2: return new float[][] { {-A, A,-A} };
344
      case  3: return new float[][] { {-A, A, A} };
345
      case  4: return new float[][] { { A,-A,-A} };
346
      case  5: return new float[][] { { A,-A, A} };
347
      case  6: return new float[][] { { A, A,-A} };
348
      case  7: return new float[][] { { A, A, A} };
349
      case  8: return new float[][] { { 0, 0,-A} };
350
      case  9: return new float[][] { { 0, 0, A} };
351
      case 10: return new float[][] { { 0,-A, 0} };
352
      case 11: return new float[][] { { 0, A, 0} };
353
      case 12: return new float[][] { {-A, 0, 0} };
354
      case 13: return new float[][] { { A, 0, 0} };
355
      }
356

    
357
    return null;
358
    }
359

    
360
///////////////////////////////////////////////////////////////////////////////////////////////////
361

    
362
  public ObjectVertexEffects getVertexEffects(int variant)
363
    {
364
    ObjectShape shape  = getObjectShape(variant);
365
    float[][] vertices = shape.getVertices();
366
    float[][] centers  = computeVertexEffectCenter(variant);
367
    float[][] pos      = getPositions();
368
    int[] indices      = FactoryShape.computeVertexEffectsIndices(vertices, pos[variant], getFaceAxis(), getDist() );
369
    float[][] corners  = variant<8 ? new float[][]{{0.03f, 0.20f}} : new float[][]{{0.03f, 0.15f}};
370

    
371
    return FactoryCubit.generateVertexEffect(vertices,corners,indices,centers,indices);
372
    }
373

    
374
///////////////////////////////////////////////////////////////////////////////////////////////////
375

    
376
  public int getNumCubitVariants(int[] numLayers)
377
    {
378
    return 14;
379
    }
380

    
381
///////////////////////////////////////////////////////////////////////////////////////////////////
382

    
383
  public int getCubitVariant(int cubit, int[] numLayers)
384
    {
385
    return cubit;
386
    }
387

    
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389

    
390
  public float getStickerRadius()
391
    {
392
    return 0.08f;
393
    }
394

    
395
///////////////////////////////////////////////////////////////////////////////////////////////////
396

    
397
  public float getStickerStroke()
398
    {
399
    return isInIconMode() ? 0.16f : 0.08f;
400
    }
401

    
402
///////////////////////////////////////////////////////////////////////////////////////////////////
403

    
404
  public float[][][] getStickerAngles()
405
    {
406
    return null;
407
    }
408

    
409
///////////////////////////////////////////////////////////////////////////////////////////////////
410
// PUBLIC API
411

    
412
  public Static3D[] getRotationAxis()
413
    {
414
    return ROT_AXIS;
415
    }
416

    
417
///////////////////////////////////////////////////////////////////////////////////////////////////
418

    
419
  public int[][] getBasicAngles()
420
    {
421
    if( mBasicAngle ==null )
422
      {
423
      int num = getNumLayers()[0];
424
      int[] tmp = new int[num];
425
      for(int i=0; i<num; i++) tmp[i] = 3;
426
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
427
      }
428

    
429
    return mBasicAngle;
430
    }
431

    
432
///////////////////////////////////////////////////////////////////////////////////////////////////
433

    
434
  public String getShortName()
435
    {
436
    return ListObjects.MSKE_2.name();
437
    }
438

    
439
///////////////////////////////////////////////////////////////////////////////////////////////////
440

    
441
  public String[][] getTutorials()
442
    {
443
    return null;
444
    }
445
}
(34-34/59)