Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyContainer.java @ f925d455

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 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.scrambling.ScrambleState;
23
import org.distorted.objectlib.main.ObjectType;
24
import org.distorted.objectlib.shape.ShapeHexahedron;
25
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
26

    
27
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_CHANGING_SHAPEMOD;
28
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
29

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

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

    
42
  private ScrambleState[] mStates;
43
  private int[][] mBasicAngle;
44
  private float[][] mCuts;
45
  private int[][] mFaceMap;
46

    
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48

    
49
  public TwistyContainer(InitData data, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
50
    {
51
    super(data, meshState, iconMode, data.getNumLayers()[0], quat, move, scale, stream);
52
    }
53

    
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55
// we want colorful insides
56

    
57
  @Override
58
  public int getCubitFaceMap(int cubit, int face)
59
    {
60
    if( mFaceMap==null )
61
      {
62
      mFaceMap = new int[][]
63
         {
64
             { 3, 3, 3, 3, 3, 3},
65
             { 2, 2, 2, 2, 2, 2},
66

    
67
             { 0, 5, 5, 0, 0, 5},
68
             { 5, 1, 1, 5, 5, 1},
69
             { 1, 4, 4, 1, 1, 4},
70
             { 4, 0, 0, 4, 4, 0},
71

    
72
             { 4, 4, 4, 4, 4, 4},
73
             { 4, 4, 4, 4, 4, 4},
74
             { 0, 0, 0, 0, 0, 0},
75
             { 0, 0, 0, 0, 0, 0},
76
             { 5, 5, 5, 5, 5, 5},
77
             { 5, 5, 5, 5, 5, 5},
78
             { 1, 1, 1, 1, 1, 1},
79
             { 1, 1, 1, 1, 1, 1},
80
         };
81
      }
82

    
83
    return mFaceMap[cubit][face];
84
    }
85

    
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87

    
88
  public ScrambleState[] getScrambleStates()
89
    {
90
    if( mStates==null )
91
      {
92
      int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
93

    
94
      mStates = new ScrambleState[]
95
        {
96
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
97
        };
98
      }
99

    
100
    return mStates;
101
    }
102

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

    
105
  public float[][] getCuts(int[] numLayers)
106
    {
107
    if( mCuts==null )
108
      {
109
      float[] c = {0};
110
      mCuts = new float[][] {c,c,c,c};
111
      }
112

    
113
    return mCuts;
114
    }
115

    
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117

    
118
  public boolean[][] getLayerRotatable(int[] numLayers)
119
    {
120
    boolean[] tmp = {true,true};
121
    return new boolean[][] { tmp,tmp,tmp,tmp };
122
    }
123

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

    
126
  public int getTouchControlType()
127
    {
128
    return TC_CHANGING_SHAPEMOD;
129
    }
130

    
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

    
133
  public int getTouchControlSplit()
134
    {
135
    return TYPE_NOT_SPLIT;
136
    }
137

    
138
///////////////////////////////////////////////////////////////////////////////////////////////////
139

    
140
  public int[][][] getEnabled()
141
    {
142
    return null;
143
    }
144

    
145
///////////////////////////////////////////////////////////////////////////////////////////////////
146

    
147
  public float[] getDist3D(int[] numLayers)
148
    {
149
    return new float[] { 0.5f,0.5f,SQ2/2,SQ2/2,0.5f,0.5f};
150
    }
151

    
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153

    
154
  public Static3D[] getFaceAxis()
155
    {
156
    return TouchControlHexahedron.FACE_AXIS;
157
    }
158

    
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

    
161
  public float[][] getCubitPositions(int[] numLayers)
162
    {
163
    return new float[][]
164
        {
165
            { 0.0f,  -SQ2, 0.0f},
166
            { 0.0f,   SQ2, 0.0f},
167

    
168
            { 1.0f,  0.0f,-1.0f},
169
            {-1.0f,  0.0f,-1.0f},
170
            {-1.0f,  0.0f, 1.0f},
171
            { 1.0f,  0.0f, 1.0f},
172

    
173
            { 0.0f,-SQ2/2, 1.0f},
174
            { 0.0f, SQ2/2, 1.0f},
175
            { 1.0f,-SQ2/2, 0.0f},
176
            { 1.0f, SQ2/2, 0.0f},
177
            { 0.0f,-SQ2/2,-1.0f},
178
            { 0.0f, SQ2/2,-1.0f},
179
            {-1.0f,-SQ2/2, 0.0f},
180
            {-1.0f, SQ2/2, 0.0f},
181
        };
182
    }
183

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

    
186
  public Static4D getCubitQuats(int cubit, int[] numLayers)
187
    {
188
    switch(cubit)
189
      {
190
      case  0: return mObjectQuats[ 0];
191
      case  1: return mObjectQuats[10];
192

    
193
      case  2: return mObjectQuats[ 0];
194
      case  3: return new Static4D( 0.0f, SQ2/2, 0.0f,-SQ2/2);
195
      case  4: return mObjectQuats[11];
196
      case  5: return new Static4D( 0.0f, SQ2/2, 0.0f, SQ2/2);
197

    
198
      case  6: return mObjectQuats[ 0];
199
      case  7: return new Static4D( 0.0f, 0.0f, 1.0f, 0.0f);
200
      case  8: return new Static4D( 0.0f, SQ2/2, 0.0f,-SQ2/2);
201
      case  9: return mObjectQuats[10];
202
      case 10: return mObjectQuats[11];
203
      case 11: return new Static4D( 1.0f, 0.0f, 0.0f, 0.0f);
204
      case 12: return new Static4D( 0.0f, SQ2/2, 0.0f, SQ2/2);
205
      case 13: return mObjectQuats[ 9];
206
      }
207

    
208
    return null;
209
    }
210

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

    
213
  private float[][] getVertices(int variant)
214
    {
215
    if( variant==0 )
216
      {
217
      return new float[][] { {-1,0,1},{1,0,1},{1,0,-1},{-1,0,-1},{0,SQ2,0} };
218
      }
219
    else if( variant==1 )
220
      {
221
      return new float[][] { {-1,0,1},{0,0,1},{-1,0,0},{0,SQ2,0},{0,-SQ2,0} };
222
      }
223
    else
224
      {
225
      return new float[][] { {-1,-SQ2/2,0},{1,-SQ2/2,0},{0,SQ2/2,0},{0,SQ2/2,-1} };
226
      }
227
    }
228

    
229
///////////////////////////////////////////////////////////////////////////////////////////////////
230

    
231
  public ObjectShape getObjectShape(int variant)
232
    {
233
    if( variant==0 )
234
      {
235
      int[][] indices = { {3,2,1,0},{0,1,4},{1,2,4},{2,3,4},{3,0,4} };
236
      return new ObjectShape(getVertices(variant), indices);
237
      }
238
    else if( variant==1 )
239
      {
240
      int[][] indices = { {4,3,1},{4,2,3},{2,0,3},{3,0,1},{1,0,4},{0,2,4} };
241
      return new ObjectShape(getVertices(variant), indices);
242
      }
243
    else
244
      {
245
      int[][] indices = { {0,1,2},{0,2,3},{1,3,2},{1,0,3} };
246
      return new ObjectShape(getVertices(variant), indices);
247
      }
248
    }
249

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

    
252
  public ObjectFaceShape getObjectFaceShape(int variant)
253
    {
254
    if( variant==0 )
255
      {
256
      float h1 = isInIconMode() ? 0.001f : 0.05f;
257
      float h2 = isInIconMode() ? 0.001f : 0.01f;
258
      float[][] bands   = { {h1,35,0.26f,0.7f,5,1,1}, {h2,15,0.1f,0.7f,5,1,1} };
259
      int[] bandIndices = { 0,1,1,1,1 };
260
      return new ObjectFaceShape(bands,bandIndices,null);
261
      }
262
    else if( variant==1 )
263
      {
264
      float h1 = isInIconMode() ? 0.001f : 0.04f;
265
      float h2 = isInIconMode() ? 0.001f : 0.01f;
266
      float[][] bands   = { {h1,25,0.26f,0.7f,5,1,1}, {h2,15,0.1f,0.7f,5,1,1} };
267
      int[] bandIndices = { 0,0,1,1,1,1 };
268
      return new ObjectFaceShape(bands,bandIndices,null);
269
      }
270
    else
271
      {
272
      float h1 = isInIconMode() ? 0.001f : 0.05f;
273
      float h2 = isInIconMode() ? 0.001f : 0.01f;
274
      float[][] bands   = { {h1,35,0.26f,0.7f,5,1,1}, {h2,15,0.1f,0.7f,5,1,1} };
275
      int[] bandIndices = { 0,1,1,1 };
276
      return new ObjectFaceShape(bands,bandIndices,null);
277
      }
278
    }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
  public ObjectVertexEffects getVertexEffects(int variant)
283
    {
284
    if( variant==0 )
285
      {
286
      float[][] corners = { {0.03f,0.20f} };
287
      int[] indices     = { 0,0,0,0,-1 };
288
      float[][] centers = { { 0.0f, SQ2, 0.0f} };
289
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
290
      }
291
    else if( variant==1 )
292
      {
293
      float[][] corners = { {0.03f,0.20f} };
294
      int[] indices     = { -1,0,0,0,0 };
295
      float[][] centers = { {-1,0,1} };
296
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
297
      }
298
    else
299
      {
300
      float[][] corners = { {0.03f,0.20f} };
301
      int[] indices     = { 0,0,0,-1 };
302
      float[][] centers = { {0.0f, SQ2/2, -1.0f} };
303
      return FactoryCubit.generateVertexEffect(getVertices(variant),corners,indices,centers,indices);
304
      }
305
    }
306

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

    
309
  public int getNumCubitVariants(int[] numLayers)
310
    {
311
    return 3;
312
    }
313

    
314
///////////////////////////////////////////////////////////////////////////////////////////////////
315

    
316
  public int getCubitVariant(int cubit, int[] numLayers)
317
    {
318
    return cubit<2 ? 0 : (cubit<6 ? 1:2);
319
    }
320

    
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322

    
323
  public float getStickerRadius()
324
    {
325
    return 0.10f;
326
    }
327

    
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329

    
330
  public float getStickerStroke()
331
    {
332
    return isInIconMode() ? 0.20f : 0.06f;
333
    }
334

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

    
337
  public float[][] getStickerAngles()
338
    {
339
    return null;
340
    }
341

    
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343
// PUBLIC API
344

    
345
  public Static3D[] getRotationAxis()
346
    {
347
    return ROT_AXIS;
348
    }
349

    
350
///////////////////////////////////////////////////////////////////////////////////////////////////
351

    
352
  public int[][] getBasicAngles()
353
    {
354
    if( mBasicAngle ==null )
355
      {
356
      int num = getNumLayers()[0];
357
      int[] tmp = new int[num];
358
      for(int i=0; i<num; i++) tmp[i] = 3;
359
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
360
      }
361

    
362
    return mBasicAngle;
363
    }
364

    
365
///////////////////////////////////////////////////////////////////////////////////////////////////
366

    
367
  public String getShortName()
368
    {
369
    return ObjectType.CONT_2.name();
370
    }
371

    
372
///////////////////////////////////////////////////////////////////////////////////////////////////
373

    
374
  public ObjectSignature getSignature()
375
    {
376
    return new ObjectSignature(ObjectType.CONT_2);
377
    }
378

    
379
///////////////////////////////////////////////////////////////////////////////////////////////////
380

    
381
  public String getObjectName()
382
    {
383
    return "Container";
384
    }
385

    
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387

    
388
  public String getInventor()
389
    {
390
    return "Tony Fisher";
391
    }
392

    
393
///////////////////////////////////////////////////////////////////////////////////////////////////
394

    
395
  public int getYearOfInvention()
396
    {
397
    return 1998;
398
    }
399

    
400
///////////////////////////////////////////////////////////////////////////////////////////////////
401

    
402
  public int getComplexity()
403
    {
404
    return 2;
405
    }
406

    
407
///////////////////////////////////////////////////////////////////////////////////////////////////
408

    
409
  public String[][] getTutorials()
410
    {
411
    return new String[][] {
412
                          {"gb","THndZ2H7OO4","Container Cube Tutorial","SuperAntoniovivaldi"},
413
                          {"es","8K2PeCAcpNU","Tutorial Container Puzzle","GioMart"},
414
                          {"ru","rh3rMuESOIM","Как собрать Container cube","RubicsGuide"},
415
                          {"fr","V4lmnbLjUdc","Résolution du Container Cube","skieur cubb"},
416
                          {"de","TRJEIgcda0Y","Container Cube Tutorial","Pezcraft"},
417
                          {"pl","jdJpUc-LaKY","Container Cube TUTORIAL PL","MrUK"},
418
                          {"br","44JnUyGTAD8","Tutorial do Cubo Container","Cubo vicio"},
419
                          {"kr","6HJKHLxaIPk","컨테이너 큐브 해법 강좌","굿맨's 큐브 이야기"},
420
                          {"vn","RLD9srIrDcI","Tutorial N.97 - Container","Duy Thích Rubik"},
421
                         };
422
    }
423
}
(5-5/41)