Project

General

Profile

« Previous | Next » 

Revision 4a9f01f9

Added by Leszek Koltunski about 2 years ago

Major progrss writing FactoryBandagedPyraminx.

View differences:

src/main/java/org/distorted/objectlib/helpers/BandagedElement.java
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.helpers;
11

  
12
///////////////////////////////////////////////////////////////////////////////////////////////////
13

  
14
import org.distorted.library.type.Static3D;
15

  
16
public class BandagedElement
17
  {
18
  private final float mX, mY, mZ;
19
  private final float[][] mCuts;
20
  private final int[] mNumCuts;
21
  private final float[][] mNormal;
22
  private final int[] mRotationRow;
23

  
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25

  
26
  BandagedElement(float[] pos, int index, Static3D[] normalVector, float[][] cuts)
27
    {
28
    mX = pos[index  ];
29
    mY = pos[index+1];
30
    mZ = pos[index+2];
31

  
32
    int numFaces = normalVector.length;
33
    mNormal = new float[numFaces][];
34
    mRotationRow = new int[numFaces];
35
    mNumCuts = new int[numFaces];
36
    mCuts = cuts;
37

  
38
    for(int i=0; i<numFaces; i++)
39
      {
40
      Static3D n = normalVector[i];
41
      mNormal[i] = new float[] { n.get0(), n.get1(), n.get2() };
42
      mNumCuts[i] = (mCuts==null || mCuts[i]==null ? 0 : mCuts[i].length);
43
      mRotationRow[i] = computeRow(i);
44
      }
45
    }
46

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

  
49
  private int computeRow(int face)
50
    {
51
    float[] ax = mNormal[face];
52
    float casted = mX*ax[0] + mY*ax[1] + mZ*ax[2];
53
    int num = mNumCuts[face];
54

  
55
    for(int i=0; i<num; i++)
56
      {
57
      if( casted<mCuts[face][i] ) return i;
58
      }
59

  
60
    return num;
61
    }
62

  
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

  
65
  int[] getRotRow()
66
    {
67
    return mRotationRow;
68
    }
69
  }
src/main/java/org/distorted/objectlib/helpers/BandagedElementCuboid.java
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.helpers;
11

  
12
///////////////////////////////////////////////////////////////////////////////////////////////////
13

  
14
public class BandagedElementCuboid
15
  {
16
  private final float mX, mY, mZ;
17
  private final int mNumFaces;
18
  private final float[][] mCuts;
19
  private final int[] mNumCuts;
20
  private final float[][] mNormal;
21
  private final int[] mRotationRow;
22

  
23
///////////////////////////////////////////////////////////////////////////////////////////////////
24

  
25
  BandagedElementCuboid(float[] pos, int index, float[][] normalVector, float[][] cuts)
26
    {
27
    mX = pos[index  ];
28
    mY = pos[index+1];
29
    mZ = pos[index+2];
30

  
31
    mNormal   = normalVector;
32
    mNumFaces = normalVector.length;
33
    mRotationRow = new int[mNumFaces];
34
    mCuts = cuts;
35

  
36
    mNumCuts = new int[mNumFaces];
37

  
38
    for(int i=0; i<mNumFaces; i++)
39
      {
40
      mNumCuts[i] = (mCuts==null || mCuts[i]==null ? 0 : mCuts[i].length);
41
      mRotationRow[i] = computeRow(i);
42
      }
43
    }
44

  
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46

  
47
  private int computeRow(int face)
48
    {
49
    float[] ax = mNormal[face];
50
    float casted = mX*ax[0] + mY*ax[1] + mZ*ax[2];
51
    int num = mNumCuts[face];
52

  
53
    for(int i=0; i<num; i++)
54
      {
55
      if( casted<mCuts[face][i] ) return i;
56
      }
57

  
58
    return num;
59
    }
60

  
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62

  
63
  int[] getRotRow()
64
    {
65
    return mRotationRow;
66
    }
67
  }
src/main/java/org/distorted/objectlib/helpers/FactoryBandaged.java
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.helpers;
11

  
12
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
13
import static org.distorted.objectlib.objects.TwistyBandagedCuboid.REGION_SIZE;
14
import static org.distorted.objectlib.objects.TwistyBandagedCuboid.STRENGTH;
15

  
16
import org.distorted.library.mesh.MeshBase;
17
import org.distorted.library.type.Static3D;
18

  
19
import java.util.ArrayList;
20

  
21
///////////////////////////////////////////////////////////////////////////////////////////////////
22

  
23
abstract public class FactoryBandaged
24
  {
25
  private ArrayList<float[]> mTmpArray;
26
  private float mNX, mNY, mNZ;
27
  private float[] mDist3D;
28
  private int[][] mFaceBelongsBitmap;
29
  private float[][] mCuts;
30

  
31
  BandagedElement[] mElements;
32
  ArrayList<float[][]> mVertexArray;
33

  
34
  int[][] mBandIndices;
35
  float[][][] mVertices;
36
  int[][][][] mIndices;
37
  float[][] mMove;
38
  int mNumElements;
39
  int mNumFaces;
40
  Static3D[] mNormals;
41

  
42
  int[] mNumLayers;
43

  
44
///////////////////////////////////////////////////////////////////////////////////////////////////
45

  
46
  FactoryBandaged()
47
    {
48

  
49
    }
50

  
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

  
53
  abstract void prepareSubclass(int numVariants, int[] numLayers);
54
  abstract float faceDiameter(float[][] vertices, int[][] indices);
55
  abstract Static3D[] getNormals();
56
  abstract float[] getDist3D();
57
  abstract float[][] getBands(boolean iconMode);
58
  abstract void fillUpVertexArray();
59
  abstract float[][] getCuts(int[] numLayers);
60

  
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62

  
63
  int[] computeFaceBelongsBitmap(float[][] vertices, float[] move)
64
    {
65
    int numVerts = vertices.length;
66
    int[] ret = new int[numVerts];
67

  
68
    for(int i=0; i<numVerts; i++)
69
      {
70
      int vertBelongsBitmap=0x00000000;
71
      float[] vert=vertices[i];
72

  
73
      for(int j=0; j<mNumFaces; j++)
74
        if( vertInFace(vert, move, mNormals[j], mDist3D[j]) ) vertBelongsBitmap |= (1<<j);
75

  
76
      ret[i]=vertBelongsBitmap;
77
      }
78

  
79
    return ret;
80
    }
81

  
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83
// return array of:
84
// 0 if this is an inner face, 1 if its diameter is 1, 2 if diameter is 2, 3 if 3, etc
85
// but only up to 5 (because the number of bands is 6 - see createIrregularFaceShape() )
86

  
87
  int[] generateBandIndices(float[][] vertices, int[][][] indices, int[] belongs)
88
    {
89
    int numCubitFaces = indices.length;
90
    int[] bandIndices = new int[numCubitFaces];
91

  
92
    for(int f=0; f<numCubitFaces; f++)
93
      {
94
      bandIndices[f] = 0xffffffff;
95
      for( int index : indices[f][0] ) bandIndices[f] &= belongs[index];
96

  
97
      if( bandIndices[f]!=0 ) // outer face
98
        {
99
        float diameter = faceDiameter(vertices, indices[f]);
100
        bandIndices[f] = (diameter>=6 ? 5: (int)diameter);
101
        }
102
      }
103

  
104
    return bandIndices;
105
    }
106

  
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108

  
109
  void computeMove(float[] pos, int variant)
110
    {
111
    int numMoves = pos.length/3;
112
    float[] m = mMove[variant];
113
    m[0]=0.0f;
114
    m[1]=0.0f;
115
    m[2]=0.0f;
116

  
117
    for(int i=0; i<numMoves; i++)
118
      {
119
      m[0] += pos[3*i  ];
120
      m[1] += pos[3*i+1];
121
      m[2] += pos[3*i+2];
122
      }
123

  
124
    m[0]/=numMoves;
125
    m[1]/=numMoves;
126
    m[2]/=numMoves;
127
    }
128

  
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

  
131
  float[][] getVertices(ArrayList<float[][]> list, int variant)
132
    {
133
    int total  = 0;
134
    int length = list.size();
135
    float[][][] vertices = new float[length][][];
136

  
137
    for( int i=0; i<length; i++ )
138
      {
139
      vertices[i] = list.get(i);
140
      int len = vertices[i].length;
141
      for(int j=0; j<len; j++) total += vertices[i][j].length/3;
142
      }
143

  
144
    float[][] verts = new float[total][3];
145
    int pointer = 0;
146

  
147
    for(int i=0; i<length; i++)
148
      {
149
      int len = vertices[i].length;
150

  
151
      for(int j=0; j<len; j++)
152
        {
153
        float[] v = vertices[i][j];
154
        int l = v.length/3;
155

  
156
        for(int k=0; k<l; k++)
157
          {
158
          verts[pointer][0] = v[3*k  ] - mMove[variant][0];
159
          verts[pointer][1] = v[3*k+1] - mMove[variant][1];
160
          verts[pointer][2] = v[3*k+2] - mMove[variant][2];
161
          pointer++;
162
          }
163
        }
164
      }
165

  
166
    return verts;
167
    }
168

  
169
///////////////////////////////////////////////////////////////////////////////////////////////////
170

  
171
  int[][][] getIndices(ArrayList<float[][]> list)
172
    {
173
    int indicesSoFar=0;
174
    int length = list.size();
175
    int[][][] indices = new int[length][][];
176

  
177
    for( int i=0; i<length; i++ )
178
      {
179
      float[][] face = list.get(i);
180
      int len = face.length;
181
      int[][] ind = new int[len][];
182

  
183
      for(int j=0; j<len; j++)
184
        {
185
        int l = face[j].length/3;
186
        ind[j] = new int[l];
187
        for(int k=0; k<l; k++) ind[j][k] = (indicesSoFar++);
188
        }
189

  
190
      indices[i] = ind;
191
      }
192

  
193
    return indices;
194
    }
195

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

  
198
  private void markAllVertices(float[] vertex, float[][] vertices, int[][][] indices, int pointer, int variant)
199
    {
200
    int numFaces = indices.length;
201

  
202
    for(int face=0; face<numFaces; face++)
203
      {
204
      int len = indices[face].length;
205

  
206
      for(int comp=0; comp<len; comp++)
207
        {
208
        int l = indices[face][comp].length;
209

  
210
        for(int v=0; v<l; v++)
211
          {
212
          if( mIndices[variant][face][comp][v]==-1 )
213
            {
214
            int ind=indices[face][comp][v];
215
            float[] ver=vertices[ind];
216

  
217
            if(vertex[0]==ver[0] && vertex[1]==ver[1] && vertex[2]==ver[2])
218
              {
219
              mIndices[variant][face][comp][v]=pointer;
220
              }
221
            }
222
          }
223
        }
224
      }
225
    }
226

  
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228
// So far the 'vertices/indices' are stored inefficiently, with each vertex stored three times
229
// (each one normally is a corner of three faces) or even six times. Compress!
230
// Example of six times: the central vertex here:
231
//
232
// { 1.0f,  0.0f, -1.0f,
233
//   1.0f, -1.0f, -1.0f,
234
//   1.0f, -1.0f, +0.0f,
235
//   0.0f, -1.0f, -1.0f },
236

  
237
  void compressVerticesAndIndices(int variant, float[][] vertices, int[][][] indices)
238
    {
239
    if( mTmpArray==null ) mTmpArray = new ArrayList<>();
240

  
241
    int numFaces = indices.length;
242
    int pointer=0;
243

  
244
    mIndices[variant] = new int[numFaces][][];
245

  
246
    for(int face=0; face<numFaces;face++)
247
      {
248
      int len = indices[face].length;
249
      mIndices[variant][face] = new int[len][];
250

  
251
      for(int comp=0; comp<len; comp++)
252
        {
253
        int l = indices[face][comp].length;
254
        mIndices[variant][face][comp] = new int[l];
255
        for(int v=0; v<l; v++) mIndices[variant][face][comp][v] = -1;
256
        }
257
      }
258

  
259
    for(int face=0; face<numFaces; face++)
260
      {
261
      int len = indices[face].length;
262

  
263
      for(int comp=0; comp<len; comp++)
264
        {
265
        int l = indices[face][comp].length;
266

  
267
        for(int v=0; v<l; v++)
268
          {
269
          if( mIndices[variant][face][comp][v]==-1 )
270
            {
271
            int ind=indices[face][comp][v];
272
            float[] ver=vertices[ind];
273
            mTmpArray.add(ver);
274
            markAllVertices(ver, vertices, indices, pointer, variant);
275
            pointer++;
276
            }
277
          }
278
        }
279
      }
280

  
281
    int len = mTmpArray.size();
282
    mVertices[variant] = new float[len][];
283

  
284
    for(int i=0; i<len; i++)
285
      {
286
      mVertices[variant][i] = mTmpArray.remove(0);
287
      }
288
    }
289

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

  
292
  boolean elementExists(int x, int y, int z)
293
    {
294
    for(int i=0; i<mNumElements; i++)
295
      {
296
      int[] row = mElements[i].getRotRow();
297
      if( row[0]==x && row[2]==y && row[4]==z ) return true;
298
      }
299

  
300
    return false;
301
    }
302

  
303
///////////////////////////////////////////////////////////////////////////////////////////////////
304

  
305
  static boolean vertInFace(float[] vertex, float[] move, Static3D faceAxis, float dist)
306
    {
307
    final float MAX_ERROR = 0.01f;
308

  
309
    float x= faceAxis.get0();
310
    float y= faceAxis.get1();
311
    float z= faceAxis.get2();
312

  
313
    float a = (vertex[0]+move[0])*x + (vertex[1]+move[1])*y + (vertex[2]+move[2])*z;
314
    float diff = a - dist;
315

  
316
    return diff>-MAX_ERROR && diff<MAX_ERROR;
317
    }
318

  
319
///////////////////////////////////////////////////////////////////////////////////////////////////
320

  
321
  private void computeVectorFace(float[] prev, float[] curr, float[] next)
322
    {
323
    float ax = prev[0]-curr[0];
324
    float ay = prev[1]-curr[1];
325
    float az = prev[2]-curr[2];
326

  
327
    float bx = next[0]-curr[0];
328
    float by = next[1]-curr[1];
329
    float bz = next[2]-curr[2];
330

  
331
    float lena = (float)Math.sqrt(ax*ax + ay*ay + az*az);
332
    float lenb = (float)Math.sqrt(bx*bx + by*by + bz*bz);
333

  
334
    ax /= lena;
335
    ay /= lena;
336
    az /= lena;
337

  
338
    bx /= lenb;
339
    by /= lenb;
340
    bz /= lenb;
341

  
342
    mNX = ax + bx + ay*bz-az*by;
343
    mNY = ay + by + az*bx-ax*bz;
344
    mNZ = az + bz + ax*by-ay*bx;
345
    }
346

  
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348

  
349
  private float[] computeVector(int index, float[][] vertices, int[][][] indices, int[] bandIndices)
350
    {
351
    int band=0;
352
    int numFaces = indices.length;
353
    int numBordering = 0;
354
    float x=0, y=0, z=0;
355

  
356
    for(int f=0; f<numFaces; f++)
357
      {
358
      int numComponentsInFace = indices[f].length;
359

  
360
      for(int c=0; c<numComponentsInFace; c++)
361
        {
362
        int[] ind = indices[f][c];
363
        int numVertsInComponent = ind.length;
364

  
365
        for(int v=0; v<numVertsInComponent; v++)
366
          {
367
          if(ind[v]==index)
368
            {
369
            int prev=v>0 ? v-1 : numVertsInComponent-1;
370
            int next=v<numVertsInComponent-1 ? v+1 : 0;
371

  
372
            int prevIndex=ind[prev];
373
            int currIndex=ind[v];
374
            int nextIndex=ind[next];
375

  
376
            computeVectorFace(vertices[prevIndex], vertices[currIndex], vertices[nextIndex]);
377
            band|=bandIndices[f];
378
            v = numVertsInComponent;
379
            c = numComponentsInFace;
380
            numBordering++;
381

  
382
            x += mNX;
383
            y += mNY;
384
            z += mNZ;
385
            }
386
          }
387
        }
388
      }
389

  
390
    return ( band==0 || numBordering<3 ) ? null : new float[] { x/numBordering, y/numBordering, z/numBordering};
391
    }
392

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

  
395
  private float[][] generateVectors(float[][] vertices, int[][][] indices, int[] bandIndices)
396
    {
397
    int len = vertices.length;
398
    float[][] vectors = new float[len][];
399

  
400
    for(int i=0; i<len; i++)
401
      {
402
      vectors[i] = computeVector(i,vertices,indices,bandIndices);
403
      }
404

  
405
    return vectors;
406
    }
407

  
408
///////////////////////////////////////////////////////////////////////////////////////////////////
409

  
410
  private void debug(float[][] vert, int[][] ind)
411
    {
412
    String vv="VERTICES: ";
413
    for (float[] floats : vert)
414
      {
415
      vv += "\n";
416
      int lenV2 = floats.length / 3;
417

  
418
      for (int v2 = 0; v2 < lenV2; v2++)
419
        {
420
        vv += " {";
421
        vv += (floats[3 * v2] + " ");
422
        vv += (floats[3 * v2 + 1] + " ");
423
        vv += (floats[3 * v2 + 2] + " ");
424
        vv += "}";
425
        }
426
      }
427
    android.util.Log.e("D", vv);
428

  
429
    String ii="INDICES: ";
430
    for (int[] ints : ind)
431
      {
432
      ii += "\n";
433
      for(int anInt : ints) ii+=(anInt+" ");
434
      }
435
    android.util.Log.e("D", ii);
436
    }
437

  
438
///////////////////////////////////////////////////////////////////////////////////////////////////
439

  
440
  private int debugArray(int start, String str)
441
    {
442
    StringBuilder s = new StringBuilder();
443
    int n = mVertexArray.size();
444
    for(int i=start; i<n; i++)
445
      {
446
      float[][] v = mVertexArray.get(i);
447
      int numC = v.length;
448
      s.append("numComp: ");
449
      s.append(numC);
450

  
451
      for(float[] floats : v)
452
        {
453
        int l=floats.length/3;
454

  
455
        for(int k=0; k<l; k++)
456
          {
457
          s.append(" (");
458
          s.append(floats[3*k  ]);
459
          s.append(" ");
460
          s.append(floats[3*k+1]);
461
          s.append(" ");
462
          s.append(floats[3*k+2]);
463
          s.append(") ");
464
          }
465
        }
466
      }
467

  
468
    android.util.Log.e("D", str+" : "+s);
469

  
470
    return n;
471
    }
472

  
473
///////////////////////////////////////////////////////////////////////////////////////////////////
474
// PUBLIC API
475

  
476
  public void prepare(int numVariants, int[] numLayers)
477
    {
478
    if( mVertexArray==null ) mVertexArray = new ArrayList<>();
479
    mVertices= new float[numVariants][][];
480
    mIndices = new int[numVariants][][][];
481
    mMove = new float[numVariants][3];
482
    mBandIndices = new int[numVariants][];
483
    mFaceBelongsBitmap= new int[numVariants][];
484

  
485
    mNumLayers = numLayers;
486
    mNormals = getNormals();
487
    mNumFaces =mNormals.length;
488
    mDist3D = getDist3D();
489
    mCuts = getCuts(numLayers);
490

  
491
    prepareSubclass(numVariants,numLayers);
492
    }
493

  
494
///////////////////////////////////////////////////////////////////////////////////////////////////
495

  
496
  public ObjectShape createIrregularShape(int variant, float[] pos)
497
    {
498
    mVertexArray.clear();
499

  
500
    mNumElements = pos.length/3;
501
    mElements = new BandagedElement[mNumElements];
502
    for(int i=0; i<mNumElements; i++) mElements[i] = new BandagedElement(pos, 3*i, mNormals, mCuts);
503

  
504
    fillUpVertexArray();
505

  
506
    computeMove(pos,variant);
507
    float[][] verts = getVertices(mVertexArray,variant);
508
    int[][][] inds  = getIndices(mVertexArray);
509

  
510
    compressVerticesAndIndices(variant,verts,inds);
511

  
512
    return new ObjectShape(mVertices[variant], mIndices[variant]);
513
    }
514

  
515
///////////////////////////////////////////////////////////////////////////////////////////////////
516

  
517
  public ObjectFaceShape createIrregularFaceShape(int variant, boolean iconMode)
518
    {
519
    float[][] bands = getBands(iconMode);
520

  
521
    if( mBandIndices[variant]==null )
522
      {
523
      mFaceBelongsBitmap[variant] = computeFaceBelongsBitmap(mVertices[variant], mMove[variant]);
524
      mBandIndices[variant] = generateBandIndices(mVertices[variant], mIndices[variant], mFaceBelongsBitmap[variant]);
525
      }
526

  
527
    return new ObjectFaceShape(bands,mBandIndices[variant],null);
528
    }
529

  
530
///////////////////////////////////////////////////////////////////////////////////////////////////
531

  
532
  public ObjectVertexEffects createVertexEffects(int variant, boolean roundCorners)
533
    {
534
    float[][] vertVec= generateVectors(mVertices[variant], mIndices[variant], mBandIndices[variant]);
535
    int numEffects   = mVertices[variant].length;
536
    float S          = STRENGTH;
537
    float[] region   = {0,0,0,REGION_SIZE};
538
    String[] names   = new String[numEffects];
539
    float[][] regions= new float[numEffects][];
540
    boolean[] uses   = new boolean[numEffects];
541
    float[][] vars   = new float[numEffects][];
542

  
543
    for(int i=0; i<numEffects; i++)
544
      {
545
      float[] v = vertVec[i];
546

  
547
      if( v!=null )
548
        {
549
        names[i]  = FactoryCubit.NAME;
550
        regions[i]= region;
551
        uses[i]   = roundCorners;
552
        vars[i]   = new float[] { 0, S*v[0], S*v[1], S*v[2], 1 };
553
        }
554
      }
555

  
556
    return new ObjectVertexEffects(names,vars,mVertices[variant],regions,uses);
557
    }
558

  
559
///////////////////////////////////////////////////////////////////////////////////////////////////
560

  
561
  public MeshBase createMesh(float[] pos, int[] numLayers, boolean iconMode, boolean roundCorners)
562
    {
563
    prepare(1,numLayers);
564
    ObjectShape shape           = createIrregularShape(0,pos);
565
    ObjectFaceShape face        = createIrregularFaceShape(0,iconMode);
566
    ObjectVertexEffects effects = createVertexEffects(0,roundCorners);
567
    int numFaces                = shape.getNumFaces();
568

  
569
    FactoryCubit factory = FactoryCubit.getInstance();
570
    factory.clear();
571
    factory.createNewFaceTransform(shape,null);
572
    return factory.createRoundedSolid(shape,face,effects,MESH_NICE,numFaces);
573
    }
574
  }
src/main/java/org/distorted/objectlib/helpers/FactoryBandagedCuboid.java
11 11

  
12 12
import java.util.ArrayList;
13 13

  
14
import org.distorted.library.mesh.MeshBase;
15 14
import org.distorted.library.type.Static3D;
16 15
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
17 16

  
18
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
19
import static org.distorted.objectlib.objects.TwistyBandagedCuboid.REGION_SIZE;
20
import static org.distorted.objectlib.objects.TwistyBandagedCuboid.STRENGTH;
21

  
22 17
///////////////////////////////////////////////////////////////////////////////////////////////////
23 18

  
24
public class FactoryBandagedCuboid
19
public class FactoryBandagedCuboid extends FactoryBandaged
25 20
  {
26 21
  private static final int WALL_MARKED=0;
27 22
  private static final int WALL_EMPTY =-1;
......
34 29
  private static final int AXIS_ZM = 5;
35 30

  
36 31
  private static FactoryBandagedCuboid mThis;
37
  private BandagedElementCuboid[] mElements;
38
  private ArrayList<float[][]> mVertexArray;
39
  private ArrayList<float[]> mTmpArray;
40

  
41
  private float[][][] mVertices;
42
  private int[][][][] mIndices;
43
  private int[][] mBandIndices;
44
  private float[][] mMove;
45
  private int mX, mY, mZ, mMax;
46
  private float dX, dY, dZ;
32

  
33
  private int mMax;
47 34
  private int[][] mWall;
48
  private float[][] mCuts;
49
  private float[][] mNormal;
50
  private int mNumElements;
51
  private int[][] mFaceBelongsBitmap;
52
  private float mNX, mNY, mNZ;
53 35

  
54 36
///////////////////////////////////////////////////////////////////////////////////////////////////
55 37

  
......
60 42

  
61 43
///////////////////////////////////////////////////////////////////////////////////////////////////
62 44

  
63
  public float[][] getCuts(int[] numLayers)
64
    {
65
    int numFaces = 6;
66
    float[][] cuts = new float[numFaces][];
67

  
68
    for(int axis=0; axis<numFaces; axis++)
69
      {
70
      int len = numLayers[axis/2];
71
      float start = 1-len*0.5f;
72

  
73
      if( len>=2 )
74
        {
75
        cuts[axis] = new float[len-1];
76
        for(int i=0; i<len-1; i++) cuts[axis][i] = start+i;
77
        }
78
      }
79

  
80
    return cuts;
81
    }
82

  
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84

  
85
  private void createNormal()
86
    {
87
    if( mNormal==null )
88
      {
89
      mNormal = new float[][]
90
        {
91
          { 1, 0, 0 },
92
          {-1, 0, 0 },
93
          { 0, 1, 0 },
94
          { 0,-1, 0 },
95
          { 0, 0, 1 },
96
          { 0, 0,-1 }
97
        };
98
      }
99
    }
100

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

  
103
  private void computeMove(float[] pos, int variant)
104
    {
105
    int numMoves = pos.length/3;
106
    float[] m = mMove[variant];
107
    m[0]=0.0f;
108
    m[1]=0.0f;
109
    m[2]=0.0f;
110

  
111
    for(int i=0; i<numMoves; i++)
112
      {
113
      m[0] += pos[3*i  ];
114
      m[1] += pos[3*i+1];
115
      m[2] += pos[3*i+2];
116
      }
117

  
118
    m[0]/=numMoves;
119
    m[1]/=numMoves;
120
    m[2]/=numMoves;
121
    }
122

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

  
125
  private float[][] getVertices(ArrayList<float[][]> list, int variant)
126
    {
127
    int total  = 0;
128
    int length = list.size();
129
    float[][][] vertices = new float[length][][];
130

  
131
    for( int i=0; i<length; i++ )
132
      {
133
      vertices[i] = list.get(i);
134
      int len = vertices[i].length;
135
      for(int j=0; j<len; j++) total += vertices[i][j].length/3;
136
      }
137

  
138
    float[][] verts = new float[total][3];
139
    int pointer = 0;
140

  
141
    for(int i=0; i<length; i++)
142
      {
143
      int len = vertices[i].length;
144

  
145
      for(int j=0; j<len; j++)
146
        {
147
        float[] v = vertices[i][j];
148
        int l = v.length/3;
149

  
150
        for(int k=0; k<l; k++)
151
          {
152
          verts[pointer][0] = v[3*k  ] - mMove[variant][0];
153
          verts[pointer][1] = v[3*k+1] - mMove[variant][1];
154
          verts[pointer][2] = v[3*k+2] - mMove[variant][2];
155
          pointer++;
156
          }
157
        }
158
      }
159

  
160
    return verts;
161
    }
162

  
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164

  
165
  private int[][][] getIndices(ArrayList<float[][]> list)
166
    {
167
    int indicesSoFar=0;
168
    int length = list.size();
169
    int[][][] indices = new int[length][][];
170

  
171
    for( int i=0; i<length; i++ )
172
      {
173
      float[][] face = list.get(i);
174
      int len = face.length;
175
      int[][] ind = new int[len][];
176

  
177
      for(int j=0; j<len; j++)
178
        {
179
        int l = face[j].length/3;
180
        ind[j] = new int[l];
181
        for(int k=0; k<l; k++) ind[j][k] = (indicesSoFar++);
182
        }
183

  
184
      indices[i] = ind;
185
      }
186

  
187
    return indices;
188
    }
189

  
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

  
192
  private void markAllVertices(float[] vertex, float[][] vertices, int[][][] indices, int pointer, int variant)
193
    {
194
    int numFaces = indices.length;
195

  
196
    for(int face=0; face<numFaces; face++)
197
      {
198
      int len = indices[face].length;
199

  
200
      for(int comp=0; comp<len; comp++)
201
        {
202
        int l = indices[face][comp].length;
203

  
204
        for(int v=0; v<l; v++)
205
          {
206
          if( mIndices[variant][face][comp][v]==-1 )
207
            {
208
            int ind=indices[face][comp][v];
209
            float[] ver=vertices[ind];
210

  
211
            if(vertex[0]==ver[0] && vertex[1]==ver[1] && vertex[2]==ver[2])
212
              {
213
              mIndices[variant][face][comp][v]=pointer;
214
              }
215
            }
216
          }
217
        }
218
      }
219
    }
220

  
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222
// So far the 'vertices/indices' are stored inefficiently, with each vertex stored three times
223
// (each one normally is a corner of three faces) or even six times. Compress!
224
// Example of six times: the central vertex here:
225
//
226
// { 1.0f,  0.0f, -1.0f,
227
//   1.0f, -1.0f, -1.0f,
228
//   1.0f, -1.0f, +0.0f,
229
//   0.0f, -1.0f, -1.0f },
230

  
231
  private void compressVerticesAndIndices(int variant, float[][] vertices, int[][][] indices)
45
  private void displayWall(String tmp)
232 46
    {
233
    if( mTmpArray==null ) mTmpArray = new ArrayList<>();
234

  
235
    int numFaces = indices.length;
236
    int pointer=0;
237

  
238
    mIndices[variant] = new int[numFaces][][];
239

  
240
    for(int face=0; face<numFaces;face++)
241
      {
242
      int len = indices[face].length;
243
      mIndices[variant][face] = new int[len][];
244

  
245
      for(int comp=0; comp<len; comp++)
246
        {
247
        int l = indices[face][comp].length;
248
        mIndices[variant][face][comp] = new int[l];
249
        for(int v=0; v<l; v++) mIndices[variant][face][comp][v] = -1;
250
        }
251
      }
47
    StringBuilder sb = new StringBuilder();
252 48

  
253
    for(int face=0; face<numFaces; face++)
49
    for(int i=0; i<mMax; i++)
254 50
      {
255
      int len = indices[face].length;
256

  
257
      for(int comp=0; comp<len; comp++)
51
      for(int j=0; j<mMax; j++)
258 52
        {
259
        int l = indices[face][comp].length;
260

  
261
        for(int v=0; v<l; v++)
262
          {
263
          if( mIndices[variant][face][comp][v]==-1 )
264
            {
265
            int ind=indices[face][comp][v];
266
            float[] ver=vertices[ind];
267
            mTmpArray.add(ver);
268
            markAllVertices(ver, vertices, indices, pointer, variant);
269
            pointer++;
270
            }
271
          }
53
        sb.append(mWall[i][j]);
54
        sb.append(' ');
272 55
        }
56
      sb.append("  -  ");
273 57
      }
274 58

  
275
    int len = mTmpArray.size();
276
    mVertices[variant] = new float[len][];
277

  
278
    for(int i=0; i<len; i++)
279
      {
280
      mVertices[variant][i] = mTmpArray.remove(0);
281
      }
282
    }
283

  
284
///////////////////////////////////////////////////////////////////////////////////////////////////
285

  
286
  private boolean elementExists(int x, int y, int z)
287
    {
288
    for(int i=0; i<mNumElements; i++)
289
      {
290
      int[] row = mElements[i].getRotRow();
291
      if( row[0]==x && row[2]==y && row[4]==z ) return true;
292
      }
293

  
294
    return false;
59
    android.util.Log.e("D", tmp+" : "+sb);
295 60
    }
296 61

  
297 62
///////////////////////////////////////////////////////////////////////////////////////////////////
......
307 72

  
308 73
      if( row[0]==x )
309 74
        {
310
        int y = mY-1-row[2];
311
        int z = mZ-1-row[4];
75
        int y = mNumLayers[1]-1-row[2];
76
        int z = mNumLayers[2]-1-row[4];
312 77
        mWall[z][y] = elementExists(x+1,row[2],row[4]) ? WALL_EMPTY : WALL_MARKED;
313 78
        }
314 79
      }
......
329 94

  
330 95
      if( row[0]==x )
331 96
        {
332
        int y = mY-1-row[2];
97
        int y = mNumLayers[1]-1-row[2];
333 98
        int z = row[4];
334 99
        mWall[z][y] = elementExists(x-1,row[2],row[4]) ? WALL_EMPTY : WALL_MARKED;
335 100
        }
......
374 139
      if( row[2]==y )
375 140
        {
376 141
        int x = row[0];
377
        int z = mZ-1-row[4];
142
        int z = mNumLayers[2]-1-row[4];
378 143
        mWall[x][z] = elementExists(row[0],y-1,row[4]) ? WALL_EMPTY : WALL_MARKED;
379 144
        }
380 145
      }
......
396 161
      if( row[4]==z )
397 162
        {
398 163
        int x = row[0];
399
        int y = mY-1-row[2];
164
        int y = mNumLayers[1]-1-row[2];
400 165
        mWall[x][y] = elementExists(row[0],row[2],z+1) ? WALL_EMPTY : WALL_MARKED;
401 166
        }
402 167
      }
......
417 182

  
418 183
      if( row[4]==z )
419 184
        {
420
        int x = mX-1-row[0];
421
        int y = mY-1-row[2];
185
        int x = mNumLayers[0]-1-row[0];
186
        int y = mNumLayers[1]-1-row[2];
422 187
        mWall[x][y] = elementExists(row[0],row[2],z-1) ? WALL_EMPTY : WALL_MARKED;
423 188
        }
424 189
      }
......
515 280
      case AXIS_XP: for(i=0; i<len; i++)
516 281
                      {
517 282
                      int l = vertices[i].length/3;
283
                      float x = layer - mNumLayers[0]/2.0f + 1.0f;
518 284

  
519 285
                      for(int j=0; j<l; j++)
520 286
                        {
521 287
                        vertices[i][3*j+2] = -vertices[i][3*j];
522
                        vertices[i][3*j]   = layer-(dX-1.0f);
288
                        vertices[i][3*j]   = x;
523 289
                        }
524 290
                      }
525 291
                    break;
526 292
      case AXIS_XM: for(i=0; i<len; i++)
527 293
                      {
528 294
                      int l = vertices[i].length/3;
295
                      float x = layer - mNumLayers[0]/2.0f;
529 296

  
530 297
                      for(int j=0; j<l; j++)
531 298
                        {
532 299
                        vertices[i][3*j+2] = vertices[i][3*j];
533
                        vertices[i][3*j]   = layer-dX;
300
                        vertices[i][3*j]   = x;
534 301
                        }
535 302
                      }
536 303
                    break;
537 304
      case AXIS_YP: for(i=0; i<len; i++)
538 305
                      {
539 306
                      int l = vertices[i].length/3;
307
                      float y = layer - mNumLayers[1]/2.0f + 1.0f;
540 308

  
541 309
                      for(int j=0; j<l; j++)
542 310
                        {
543 311
                        vertices[i][3*j+2] = -vertices[i][3*j+1];
544
                        vertices[i][3*j+1] = layer-(dY-1.0f);
312
                        vertices[i][3*j+1] = y;
545 313
                        }
546 314
                      }
547 315
                    break;
548 316
      case AXIS_YM: for(i=0; i<len; i++)
549 317
                      {
550 318
                      int l = vertices[i].length/3;
319
                      float y = layer - mNumLayers[1]/2.0f;
551 320

  
552 321
                      for(int j=0; j<l; j++)
553 322
                        {
554 323
                        vertices[i][3*j+2] = vertices[i][3*j+1];
555
                        vertices[i][3*j+1] = layer-dY;
324
                        vertices[i][3*j+1] = y;
556 325
                        }
557 326
                      }
558 327
                    break;
559 328
      case AXIS_ZP: for(i=0; i<len; i++)
560 329
                      {
561 330
                      int l = vertices[i].length/3;
331
                      float z = layer - mNumLayers[2]/2.0f + 1.0f;
562 332

  
563 333
                      for(int j=0; j<l; j++)
564 334
                        {
565
                        vertices[i][3*j+2] = layer-(dZ-1.0f);
335
                        vertices[i][3*j+2] = z;
566 336
                        }
567 337
                      }
568 338
                    break;
569 339
      case AXIS_ZM: for(i=0; i<len; i++)
570 340
                      {
571 341
                      int l = vertices[i].length/3;
342
                      float z = layer - mNumLayers[2]/2.0f;
572 343

  
573 344
                      for(int j=0; j<l; j++)
574 345
                        {
575
                        vertices[i][3*j+2] = layer-dZ;
346
                        vertices[i][3*j+2] = z;
576 347
                        vertices[i][3*j]   = -vertices[i][3*j];
577 348
                        }
578 349
                      }
......
592 363
    {
593 364
    int sections = markSections(wall);
594 365

  
595
    float dx = (axis==AXIS_XP || axis==AXIS_XM) ? dZ : dX;
596
    float dy = (axis==AXIS_YP || axis==AXIS_YM) ? dZ : dY;
366
    float dx = (axis==AXIS_XP || axis==AXIS_XM) ? mNumLayers[2]/2.0f : mNumLayers[0]/2.0f;
367
    float dy = (axis==AXIS_YP || axis==AXIS_YM) ? mNumLayers[2]/2.0f : mNumLayers[1]/2.0f;
597 368

  
598 369
    for(int i=0; i<sections; i++)
599 370
      {
......
603 374
      }
604 375
    }
605 376

  
606
///////////////////////////////////////////////////////////////////////////////////////////////////
607

  
608
  private static boolean vertInFace(float[] vertex, float[] move, Static3D faceAxis, float dist)
609
    {
610
    final float MAX_ERROR = 0.01f;
611

  
612
    float x= faceAxis.get0();
613
    float y= faceAxis.get1();
614
    float z= faceAxis.get2();
615

  
616
    float a = (vertex[0]+move[0])*x + (vertex[1]+move[1])*y + (vertex[2]+move[2])*z;
617
    float diff = a - dist;
618

  
619
    return diff>-MAX_ERROR && diff<MAX_ERROR;
620
    }
621

  
622 377
///////////////////////////////////////////////////////////////////////////////////////////////////
623 378
// (vertices,indices) define a cubit face, i.e. a connected subset of the NxN grid.
624 379
// Return its 'diameter', i.e. max(width,height)
625 380

  
626
  private int faceDiameter(float[][] vertices, int[][] indices)
381
  public float faceDiameter(float[][] vertices, int[][] indices)
627 382
    {
628
    float maxX = -dX;
629
    float minX =  dX;
630
    float maxY = -dY;
631
    float minY =  dY;
632
    float maxZ = -dZ;
633
    float minZ =  dZ;
383
    float maxX = -Float.MAX_VALUE;
384
    float minX =  Float.MAX_VALUE;
385
    float maxY = -Float.MAX_VALUE;
386
    float minY =  Float.MAX_VALUE;
387
    float maxZ = -Float.MAX_VALUE;
388
    float minZ =  Float.MAX_VALUE;
634 389

  
635 390
    for (int[] ind : indices)
636 391
      for(int index : ind)
......
649 404
    float diffY = maxY-minY;
650 405
    float diffZ = maxZ-minZ;
651 406

  
652
    float max = diffX>diffY ? Math.max(diffX,diffZ) : Math.max(diffY,diffZ);
653

  
654
    return (int)max;
655
    }
656

  
657
///////////////////////////////////////////////////////////////////////////////////////////////////
658

  
659
  private int[] computeFaceBelongsBitmap(float[][] vertices, int[][][] indices, float[] move)
660
    {
661
    int numVerts = vertices.length;
662
    int[] ret = new int[numVerts];
663

  
664
    for(int[][] ints : indices)
665
      for(int[] ind : ints)
666
        for(int index : ind)
667
          {
668
          int vertBelongsBitmap=0x00000000;
669
          float[] vert=vertices[index];
670

  
671
          if( vertInFace(vert, move, TouchControlHexahedron.FACE_AXIS[0], dX) ) vertBelongsBitmap |= (1   );
672
          if( vertInFace(vert, move, TouchControlHexahedron.FACE_AXIS[1], dX) ) vertBelongsBitmap |= (1<<1);
673
          if( vertInFace(vert, move, TouchControlHexahedron.FACE_AXIS[2], dY) ) vertBelongsBitmap |= (1<<2);
674
          if( vertInFace(vert, move, TouchControlHexahedron.FACE_AXIS[3], dY) ) vertBelongsBitmap |= (1<<3);
675
          if( vertInFace(vert, move, TouchControlHexahedron.FACE_AXIS[4], dZ) ) vertBelongsBitmap |= (1<<4);
676
          if( vertInFace(vert, move, TouchControlHexahedron.FACE_AXIS[5], dZ) ) vertBelongsBitmap |= (1<<5);
677

  
678
          ret[index]=vertBelongsBitmap;
679
          }
680

  
681
    return ret;
682
    }
683

  
684
///////////////////////////////////////////////////////////////////////////////////////////////////
685
// return array of:
686
// 0 if this is an inner face, 1 if its diameter is 1, 2 if diameter is 2, 3 if 3, etc
687
// but only up to 5 (because the number of bands is 6 - see createIrregularFaceShape() )
688

  
689
  private int[] generateBandIndices(float[][] vertices, int[][][] indices, int[] belongs)
690
    {
691
    int numCubitFaces = indices.length;
692
    int[] bandIndices = new int[numCubitFaces];
693

  
694
    for(int f=0; f<numCubitFaces; f++)
695
      {
696
      bandIndices[f] = 0xffffffff;
697
      for( int index : indices[f][0] ) bandIndices[f] &= belongs[index];
698

  
699
      if( bandIndices[f]!=0 ) // outer face
700
        {
701
        int diameter = faceDiameter(vertices, indices[f]);
702
        bandIndices[f] = (diameter>=6 ? 5:diameter);
703
        }
704
      }
705

  
706
    return bandIndices;
707
    }
708

  
709
///////////////////////////////////////////////////////////////////////////////////////////////////
710

  
711
  private void computeVectorFace(float[] prev, float[] curr, float[] next)
712
    {
713
    float ax = prev[0]-curr[0];
714
    float ay = prev[1]-curr[1];
715
    float az = prev[2]-curr[2];
716

  
717
    float bx = next[0]-curr[0];
718
    float by = next[1]-curr[1];
719
    float bz = next[2]-curr[2];
720

  
721
    float lena = (float)Math.sqrt(ax*ax + ay*ay + az*az);
722
    float lenb = (float)Math.sqrt(bx*bx + by*by + bz*bz);
723

  
724
    ax /= lena;
725
    ay /= lena;
726
    az /= lena;
727

  
728
    bx /= lenb;
729
    by /= lenb;
730
    bz /= lenb;
731

  
732
    mNX = ax + bx + ay*bz-az*by;
733
    mNY = ay + by + az*bx-ax*bz;
734
    mNZ = az + bz + ax*by-ay*bx;
407
    return diffX>diffY ? Math.max(diffX,diffZ) : Math.max(diffY,diffZ);
735 408
    }
736 409

  
737 410
///////////////////////////////////////////////////////////////////////////////////////////////////
411
// PUBLIC API
738 412

  
739
  private float[] computeVector(int index, float[][] vertices, int[][][] indices, int[] bandIndices)
413
  public static FactoryBandagedCuboid getInstance()
740 414
    {
741
    int band=0;
742
    int numFaces = indices.length;
743
    int numBordering = 0;
744
    float x=0, y=0, z=0;
745

  
746
    for(int f=0; f<numFaces; f++)
747
      {
748
      int numComponentsInFace = indices[f].length;
749

  
750
      for(int c=0; c<numComponentsInFace; c++)
751
        {
752
        int[] ind = indices[f][c];
753
        int numVertsInComponent = ind.length;
754

  
755
        for(int v=0; v<numVertsInComponent; v++)
756
          {
757
          if(ind[v]==index)
758
            {
759
            int prev=v>0 ? v-1 : numVertsInComponent-1;
760
            int next=v<numVertsInComponent-1 ? v+1 : 0;
761

  
762
            int prevIndex=ind[prev];
763
            int currIndex=ind[v];
764
            int nextIndex=ind[next];
765

  
766
            computeVectorFace(vertices[prevIndex], vertices[currIndex], vertices[nextIndex]);
767
            band|=bandIndices[f];
768
            v = numVertsInComponent;
769
            c = numComponentsInFace;
770
            numBordering++;
771

  
772
            x += mNX;
773
            y += mNY;
774
            z += mNZ;
775
            }
776
          }
777
        }
778
      }
779

  
780
    return ( band==0 || numBordering<3 ) ? null : new float[] { x/numBordering, y/numBordering, z/numBordering};
415
    if( mThis==null ) mThis = new FactoryBandagedCuboid();
416
    return mThis;
781 417
    }
782 418

  
783 419
///////////////////////////////////////////////////////////////////////////////////////////////////
784 420

  
785
  private float[][] generateVectors(float[][] vertices, int[][][] indices, int[] bandIndices)
421
  public float[][] getCuts(int[] numLayers)
786 422
    {
787
    int len = vertices.length;
788
    float[][] vectors = new float[len][];
423
    int numFaces = 6;
424
    float[][] cuts = new float[numFaces][];
789 425

  
790
    for(int i=0; i<len; i++)
426
    for(int axis=0; axis<numFaces; axis++)
791 427
      {
792
      vectors[i] = computeVector(i,vertices,indices,bandIndices);
793
      }
794

  
795
    return vectors;
796
    }
797

  
798
///////////////////////////////////////////////////////////////////////////////////////////////////
799

  
800
  private void displayWall(String tmp)
801
    {
802
    StringBuilder sb = new StringBuilder();
428
      int len = numLayers[axis/2];
429
      float start = 1-len*0.5f;
803 430

  
804
    for(int i=0; i<mMax; i++)
805
      {
806
      for(int j=0; j<mMax; j++)
431
      if( len>=2 )
807 432
        {
808
        sb.append(mWall[i][j]);
809
        sb.append(' ');
433
        cuts[axis] = new float[len-1];
434
        for(int i=0; i<len-1; i++) cuts[axis][i] = start+i;
810 435
        }
811
      sb.append("  -  ");
812 436
      }
813 437

  
814
    android.util.Log.e("D", tmp+" : "+sb);
438
    return cuts;
815 439
    }
816 440

  
817 441
///////////////////////////////////////////////////////////////////////////////////////////////////
818 442

  
819
  private void debug(float[][] vert, int[][] ind)
443
  public Static3D[] getNormals()
820 444
    {
821
    String vv="VERTICES: ";
822
    for (float[] floats : vert)
823
      {
824
      vv += "\n";
825
      int lenV2 = floats.length / 3;
826

  
827
      for (int v2 = 0; v2 < lenV2; v2++)
828
        {
829
        vv += " {";
830
        vv += (floats[3 * v2] + " ");
831
        vv += (floats[3 * v2 + 1] + " ");
832
        vv += (floats[3 * v2 + 2] + " ");
833
        vv += "}";
834
        }
835
      }
836
    android.util.Log.e("D", vv);
837

  
838
    String ii="INDICES: ";
839
    for (int[] ints : ind)
840
      {
841
      ii += "\n";
842
      for(int anInt : ints) ii+=(anInt+" ");
843
      }
844
    android.util.Log.e("D", ii);
445
    return TouchControlHexahedron.FACE_AXIS;
845 446
    }
846 447

  
847 448
///////////////////////////////////////////////////////////////////////////////////////////////////
848 449

  
849
  private int debugArray(int start, String str)
450
  public float[] getDist3D()
850 451
    {
851
    StringBuilder s = new StringBuilder();
852
    int n = mVertexArray.size();
853
    for(int i=start; i<n; i++)
854
      {
855
      float[][] v = mVertexArray.get(i);
856
      int numC = v.length;
857
      s.append("numComp: ");
858
      s.append(numC);
859

  
860
      for(float[] floats : v)
861
        {
862
        int l=floats.length/3;
863

  
864
        for(int k=0; k<l; k++)
865
          {
866
          s.append(" (");
867
          s.append(floats[3*k  ]);
868
          s.append(" ");
869
          s.append(floats[3*k+1]);
870
          s.append(" ");
871
          s.append(floats[3*k+2]);
872
          s.append(") ");
873
          }
874
        }
875
      }
876

  
877
    android.util.Log.e("D", str+" : "+s);
452
    float dx = mNumLayers[0]/2.0f;
453
    float dy = mNumLayers[1]/2.0f;
454
    float dz = mNumLayers[2]/2.0f;
878 455

  
879
    return n;
456
    return new float[] {dx,dx,dy,dy,dz,dz};
880 457
    }
881 458

  
882 459
///////////////////////////////////////////////////////////////////////////////////////////////////
883
// PUBLIC API
884 460

  
885
  public static FactoryBandagedCuboid getInstance()
461
  public void prepareSubclass(int numVariants, int[] numLayers)
886 462
    {
887
    if( mThis==null ) mThis = new FactoryBandagedCuboid();
888
    return mThis;
889
    }
890

  
891
///////////////////////////////////////////////////////////////////////////////////////////////////
892

  
893
  public void prepare(int numVariants, int[] numLayers)
894
    {
895
    if( mVertexArray==null ) mVertexArray = new ArrayList<>();
896
    mVertices= new float[numVariants][][];
897
    mIndices = new int[numVariants][][][];
898
    mMove = new float[numVariants][3];
899
    mBandIndices = new int[numVariants][];
900
    mFaceBelongsBitmap= new int[numVariants][];
901

  
902
    mX = numLayers[0];
903
    mY = numLayers[1];
904
    mZ = numLayers[2];
905

  
906
    dX = mX/2.0f;
907
    dY = mY/2.0f;
908
    dZ = mZ/2.0f;
909

  
910
    mMax = mX>mY ? Math.max(mX,mZ) : Math.max(mY,mZ);
463
    int x = numLayers[0];
464
    int y = numLayers[1];
465
    int z = numLayers[2];
911 466

  
467
    mMax = x>y ? Math.max(x,z) : Math.max(y,z);
912 468
    mWall = new int[mMax][mMax];
913
    mCuts = getCuts(numLayers);
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff