Project

General

Profile

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

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

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

    
14
import org.distorted.library.effect.EffectName;
15
import org.distorted.library.type.Static3D;
16
import org.distorted.library.type.Static4D;
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.ObjectType;
23

    
24
import java.io.InputStream;
25

    
26
///////////////////////////////////////////////////////////////////////////////////////////////////
27

    
28
public class TwistyCamouflage extends TwistyBandagedAbstract
29
{
30
  public static final float[][] CAM_333 = new float[][]
31
    {
32
      getCenters( -1.0f, 1.0f, 1.0f, 2, 2, 2),
33

    
34
      getCenters(  0.5f, 1.0f, 1.0f, 1, 2, 2),
35
      getCenters(  1.5f, 1.0f, 1.0f, 1, 2, 2),
36
      getCenters( -1.0f,-0.5f, 1.0f, 2, 1, 2),
37
      getCenters( -1.0f,-1.5f, 1.0f, 2, 1, 2),
38
      getCenters( -1.0f, 1.0f,-0.5f, 2, 2, 1),
39
      getCenters( -1.0f, 1.0f,-1.5f, 2, 2, 1),
40

    
41
      getCenters( -1.0f,-1.5f,-0.5f, 2, 1, 1),
42
      getCenters( -1.0f,-1.5f,-1.5f, 2, 1, 1),
43
      getCenters( -1.0f,-0.5f,-0.5f, 2, 1, 1),
44
      getCenters( -1.0f,-0.5f,-1.5f, 2, 1, 1),
45
      getCenters(  0.5f, 1.0f,-1.5f, 1, 2, 1),
46
      getCenters(  1.5f, 1.0f,-1.5f, 1, 2, 1),
47
      getCenters(  0.5f, 1.0f,-0.5f, 1, 2, 1),
48
      getCenters(  1.5f, 1.0f,-0.5f, 1, 2, 1),
49
      getCenters(  0.5f,-0.5f, 1.0f, 1, 1, 2),
50
      getCenters(  1.5f,-0.5f, 1.0f, 1, 1, 2),
51
      getCenters(  0.5f,-1.5f, 1.0f, 1, 1, 2),
52
      getCenters(  1.5f,-1.5f, 1.0f, 1, 1, 2),
53

    
54
      getCenters(  0.5f,-0.5f,-1.5f, 1, 1, 1),
55
      getCenters(  1.5f,-0.5f,-1.5f, 1, 1, 1),
56
      getCenters(  0.5f,-1.5f,-1.5f, 1, 1, 1),
57
      getCenters(  1.5f,-1.5f,-1.5f, 1, 1, 1),
58
      getCenters(  0.5f,-1.5f,-0.5f, 1, 1, 1),
59
      getCenters(  1.5f,-0.5f,-0.5f, 1, 1, 1),
60
      getCenters(  1.5f,-1.5f,-0.5f, 1, 1, 1),
61
    };
62

    
63
  private static final int[][] DIMS = new int[][]
64
    {
65
      {2,2,2},
66
      {1,2,2},
67
      {2,1,2},
68
      {2,2,1},
69
      {2,1,1},
70
      {1,2,1},
71
      {1,1,2},
72
      {1,1,1},
73
    };
74

    
75
  private static final float[][] OFFSETS = new float[][]
76
    {
77
      { 0.0f, 0.0f, 0.0f},
78
      { 0.5f, 0.0f, 0.0f},
79
      {-0.5f, 0.0f, 0.0f},
80
      { 0.0f, 0.5f, 0.0f},
81
      { 0.0f,-0.5f, 0.0f},
82
      { 0.0f, 0.0f, 0.5f},
83
      { 0.0f, 0.0f,-0.5f},
84
      { 0.0f,-0.5f,-0.5f},
85
      { 0.5f, 0.0f,-0.5f},
86
      { 0.5f,-0.5f, 0.0f},
87
      { 0.5f,-0.5f,-0.5f},
88
    };
89

    
90
  private int[] mDimsIndices, mOffsIndices;
91

    
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93

    
94
  private static float[] getCenters( float x, float y, float z, int xd, int yd, int zd )
95
    {
96
    float XS = 0.5f*(1-xd) + x;
97
    float YS = 0.5f*(1-yd) + y;
98
    float ZS = 0.5f*(1-zd) + z;
99

    
100
    int index=0;
101
    float[] result = new float[3*xd*yd*zd];
102

    
103
    for(int i=0; i<xd; i++)
104
      for(int j=0; j<yd; j++)
105
        for(int k=0; k<zd; k++)
106
          {
107
          result[3*index  ] = XS+i;
108
          result[3*index+1] = YS+j;
109
          result[3*index+2] = ZS+k;
110
          index++;
111
          }
112

    
113
    return result;
114
    }
115

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

    
118
  public TwistyCamouflage(InitData data, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
119
    {
120
    super(data, meshState, iconMode, (data.getNumLayers()[0]+data.getNumLayers()[1]+data.getNumLayers()[2])/3.0f, quat, move, scale, stream);
121
    }
122

    
123
///////////////////////////////////////////////////////////////////////////////////////////////////
124

    
125
  private int getDimsIndex(int variant)
126
    {
127
    if( mPosition==null ) mPosition = getInitData().getPos();
128

    
129
    if( mPosition==CAM_333 )
130
      {
131
      if( mDimsIndices==null ) mDimsIndices = new int[]
132
                                   { 0,
133
                                     1,0,2,0,3,0,
134
                                     3,0,4,2,1,0,5,3,6,2,1,0,
135
                                     6,2,1,0,5,4,3 };
136
      }
137

    
138
    return mDimsIndices[variant];
139
    }
140

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

    
143
  private int getOffsetsIndex(int variant)
144
    {
145
    if( mPosition==null ) mPosition = getInitData().getPos();
146

    
147
    if( mPosition==CAM_333 )
148
      {
149
      if( mOffsIndices==null ) mOffsIndices = new int[]
150
                                   { 0,
151
                                     0,1,0,4,0,6,
152
                                     4,7,0,6,6,8,0,1,0,1,4,9,
153
                                     6,8,7,10,4,1,9 };
154
      }
155

    
156
    return mOffsIndices[variant];
157
    }
158

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

    
161
  private float[][] getVertices(int variant)
162
    {
163
    int indexD = getDimsIndex(variant);
164

    
165
    int X=DIMS[indexD][0];
166
    int Y=DIMS[indexD][1];
167
    int Z=DIMS[indexD][2];
168

    
169
    int indexO = getOffsetsIndex(variant);
170

    
171
    float XF = OFFSETS[indexO][0];
172
    float YF = OFFSETS[indexO][1];
173
    float ZF = OFFSETS[indexO][2];
174

    
175
    return new float[][]
176
      {
177
        { 0.5f*X +XF, 0.5f*Y +YF, 0.5f*Z +ZF},
178
        { 0.5f*X +XF, 0.5f*Y +YF,-0.5f*Z +ZF},
179
        { 0.5f*X +XF,-0.5f*Y +YF, 0.5f*Z +ZF},
180
        { 0.5f*X +XF,-0.5f*Y +YF,-0.5f*Z +ZF},
181
        {-0.5f*X +XF, 0.5f*Y +YF, 0.5f*Z +ZF},
182
        {-0.5f*X +XF, 0.5f*Y +YF,-0.5f*Z +ZF},
183
        {-0.5f*X +XF,-0.5f*Y +YF, 0.5f*Z +ZF},
184
        {-0.5f*X +XF,-0.5f*Y +YF,-0.5f*Z +ZF}
185
      };
186
    }
187

    
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189
// PUBLIC API
190

    
191
  public int getTouchControlType()
192
    {
193
    return TC_CHANGING_SHAPEMOD;
194
    }
195

    
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197

    
198
  public Static4D getCubitQuats(int cubit, int[] numLayers)
199
    {
200
    return mObjectQuats[0];
201
    }
202

    
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204

    
205
  public ObjectShape getObjectShape(int variant)
206
    {
207
    int[][] indices =
208
        {
209
          {2,3,1,0},
210
          {7,6,4,5},
211
          {4,0,1,5},
212
          {7,3,2,6},
213
          {6,2,0,4},
214
          {3,7,5,1},
215
        };
216

    
217
    return new ObjectShape( getVertices(variant), indices);
218
    }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221

    
222
  public ObjectFaceShape getObjectFaceShape(int variant)
223
    {
224
    int index = getDimsIndex(variant);
225

    
226
    int X = DIMS[index][0];
227
    int Y = DIMS[index][1];
228
    int Z = DIMS[index][2];
229

    
230
    float height     = isInIconMode() ? 0.001f : 0.03f;
231
    int[] bandIndices= { 0,0,1,1,2,2 };
232

    
233
    int maxXY = Math.max(X,Y);
234
    int maxXZ = Math.max(X,Z);
235
    int maxYZ = Math.max(Y,Z);
236

    
237
    int angle = 45;
238
    float R = 0.10f;
239
    float S = 0.25f;
240
    float N = 4;
241

    
242
    float[][] bands =
243
        {
244
          {height/maxYZ,angle,R,S,N,0,0},
245
          {height/maxXZ,angle,R,S,N,0,0},
246
          {height/maxXY,angle,R,S,N,0,0}
247
        };
248

    
249
    return new ObjectFaceShape(bands,bandIndices,null);
250
    }
251

    
252
///////////////////////////////////////////////////////////////////////////////////////////////////
253

    
254
  public ObjectVertexEffects getVertexEffects(int variant)
255
    {
256
    boolean round = false;
257
    float[][] vertices = getVertices(variant);
258
    float A = -0.03f;
259

    
260
    float[][] variables =
261
        {
262
          { 0, A, A, A, 1  },
263
          { 0, A, A,-A, 1  },
264
          { 0, A,-A, A, 1  },
265
          { 0, A,-A,-A, 1  },
266
          { 0,-A, A, A, 1  },
267
          { 0,-A, A,-A, 1  },
268
          { 0,-A,-A, A, 1  },
269
          { 0,-A,-A,-A, 1  },
270
        };
271

    
272
    String name = EffectName.DEFORM.name();
273
    float[] reg = {0,0,0,0.10f};
274

    
275
    String[] names = {name,name,name,name,name,name,name,name};
276
    float[][] regions = {reg,reg,reg,reg,reg,reg,reg,reg};
277
    boolean[] uses = {round,round,round,round,round,round,round,round};
278

    
279
    return new ObjectVertexEffects(names,variables,vertices,regions,uses);
280
    }
281

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

    
284
  public int getCubitVariant(int cubit, int[] numLayers)
285
    {
286
    if( mPosition==null ) mPosition = getInitData().getPos();
287

    
288
    if( mPosition==CAM_333 )
289
      {
290
      return cubit;
291
      }
292

    
293
    return 0;
294
    }
295

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

    
298
  public int getNumCubitVariants(int[] numLayers)
299
    {
300
    if( mPosition==null ) mPosition = getInitData().getPos();
301

    
302
    if( mPosition==CAM_333 ) return 26;
303

    
304
    return 0;
305
    }
306

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

    
309
  public float getStickerRadius()
310
    {
311
    return 0.18f;
312
    }
313

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

    
316
  public float getStickerStroke()
317
    {
318
    return isInIconMode() ? 0.25f : 0.15f;
319
    }
320

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

    
323
  public String getShortName()
324
    {
325
    if( mPosition==null ) mPosition = getInitData().getPos();
326

    
327
    if( mPosition==CAM_333 ) return ObjectType.CA_333.name();
328

    
329
    return null;
330
    }
331

    
332
///////////////////////////////////////////////////////////////////////////////////////////////////
333

    
334
  public ObjectSignature getSignature()
335
    {
336
    if( mSignature==null )
337
      {
338
      if( mPosition==null ) mPosition = getInitData().getPos();
339
      if( mPosition==CAM_333 ) mSignature = new ObjectSignature(ObjectType.CA_333);
340
      }
341
    return mSignature;
342
    }
343

    
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345

    
346
  public String getObjectName()
347
    {
348
    int[] nL = getNumLayers();
349
    return "Camouflage "+nL[0]+"x"+nL[1]+"x"+nL[2];
350
    }
351

    
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353

    
354
  public String getInventor()
355
    {
356
    return "Guan Yang";
357
    }
358

    
359
///////////////////////////////////////////////////////////////////////////////////////////////////
360

    
361
  public int getYearOfInvention()
362
    {
363
    return 2013;
364
    }
365

    
366
///////////////////////////////////////////////////////////////////////////////////////////////////
367

    
368
  public int getComplexity()
369
    {
370
    if( mPosition==null ) mPosition = getInitData().getPos();
371

    
372
    if( mPosition==CAM_333 ) return 3;
373

    
374
    return 0;
375
    }
376

    
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378

    
379
  public String[][] getTutorials()
380
    {
381
    if( mPosition==null ) mPosition = getInitData().getPos();
382

    
383
    if( mPosition==CAM_333 )
384
      {
385
      return new String[][]{
386
                            {"gb","f9zmpCfg25k","3x3x3 Camouflage Part 1","Superantoniovivaldi"},
387
                            {"gb","O8pGyi5Juxk","3x3x3 Camouflage Part 2","Superantoniovivaldi"},
388
                            {"es","V1RPBIzEwp4","Tutorial 3x3 Camouflage","Manu rubiks"},
389
                            {"ru","DRGNOSw5pPc","Как собрать 3х3х3 camouflage","Илья Топор-Гилка"},
390
                            {"fr","9BfI1Fcbcl8","Résolution du Camouflage Cube","Skieur Cubb"},
391
                            {"pl","uEVvR2jDdI0","Camouflage 3x3x3 Tutorial","MrUK"},
392
                           };
393
      }
394

    
395
    return null;
396
    }
397
}
(4-4/41)