Project

General

Profile

« Previous | Next » 

Revision 799fab62

Added by Leszek Koltunski 7 months ago

implement the 'roundness of external face does not depend on its size' thing in the BandagedCreators.

View differences:

src/main/java/org/distorted/objectlib/bandaged/FactoryBandaged.java
120 120
  private Static3D[] mPuzzleNormals;
121 121
  private float[] mDist3D;
122 122
  private int[][] mFaceBelongsBitmap;
123
  private float[][] mDiaAxis;
124
  private float[][] mMinMax;
125 123
  private int mNumFaces;
126 124
  private int mNumElements;
127 125
  private float[][] mMove;
......
147 145
  abstract Static3D[] getNormals();
148 146
  abstract float[][][] getPositions(int[] numLayers);
149 147
  abstract Static4D getElementQuat(int[] numLayers, int cubitIndex);
150
  abstract float[][] getDiameterAxis();
151 148
  abstract float[] getDist3D(int[] numLayers);
152 149
  abstract float[][] getBands(boolean iconMode, int[] numLayers);
153 150
  abstract int getElementVariant(int[] numLayers, float x, float y, float z);
154
  abstract int diameterMap(float diameter);
155 151
  abstract float[][] getVertices(int[] numLayers, int variant);
156 152
  abstract int[][] getIndices(int[] numLayers, int variant);
157 153
  abstract int getNumVariants(int[] numLayers);
......
213 209
    }
214 210

  
215 211
///////////////////////////////////////////////////////////////////////////////////////////////////
216
// (vertices,indices) define a single face of a set of connected elements.
217
// Return its 'diameter', i.e. the max distance (along any of its 'diameterAxis') between any two
218
// vertices of the face.
212
// return array of: 0 if this is an inner face, 1 otherwise.
219 213

  
220
  private float faceDiameter(float[][] vertices, int[][] indices)
221
    {
222
    int num = mDiaAxis.length;
223

  
224
    for(int i=0; i<num; i++)
225
      {
226
      mMinMax[i][0] = Float.MAX_VALUE;
227
      mMinMax[i][1] =-Float.MAX_VALUE;
228
      }
229

  
230
    for (int[] ind : indices)
231
      for(int index : ind)
232
        {
233
        float[] v = vertices[index];
234

  
235
        for(int i=0; i<num; i++)
236
          {
237
          float[] mm = mMinMax[i];
238
          float[] ax = mDiaAxis[i];
239
          float dist = v[0]*ax[0] + v[1]*ax[1] + v[2]*ax[2];
240

  
241
          if ( dist > mm[1] ) mm[1] = dist;
242
          if ( dist < mm[0] ) mm[0] = dist;
243
          }
244
        }
245

  
246
    float maxDiff = 0;
247

  
248
    for(int i=0; i<num; i++)
249
      {
250
      float[] mm = mMinMax[i];
251
      float diff = mm[1]-mm[0];
252
      if( diff>maxDiff ) maxDiff = diff;
253
      }
254

  
255
    return maxDiff+0.01f; // this will be rounded down to nearest int; we don't want 1.9999 here
256
    }
257

  
258
///////////////////////////////////////////////////////////////////////////////////////////////////
259
// return array of:
260
// 0 if this is an inner face, 1 if its diameter is 1, 2 if diameter is 2, 3 if 3, etc
261
// but only up to 5 (because the number of bands is 6 - see createIrregularFaceShape() )
262

  
263
  private int[] generateBandIndices(float[][] vertices, int[][][] indices, int[] belongs)
214
  private int[] generateBandIndices(int[][][] indices, int[] belongs)
264 215
    {
265 216
    int numCubitFaces = indices.length;
266 217
    int[] bandIndices = new int[numCubitFaces];
......
269 220
      {
270 221
      bandIndices[f] = 0xffffffff;
271 222
      for( int index : indices[f][0] ) bandIndices[f] &= belongs[index];
272

  
273
      if( bandIndices[f]!=0 ) // outer face
274
        {
275
        float diameter = faceDiameter(vertices, indices[f]);
276
        bandIndices[f] = diameterMap(diameter);
277
        }
223
      if( bandIndices[f]!=0 ) bandIndices[f] = 1;
278 224
      }
279 225

  
280 226
    return bandIndices;
......
482 428

  
483 429
///////////////////////////////////////////////////////////////////////////////////////////////////
484 430

  
485
  private float[] computeVector(int index, float[][] vertices, int[][][] indices, int[] bandIndices, float[][] normals)
431
  private float[] computeVector(int index, int[][][] indices, int[] bandIndices, float[][] normals)
486 432
    {
487 433
    int numFaces = indices.length;
488 434
    int numBordering=0, numExternal=0;
......
589 535

  
590 536
    for(int i=0; i<len; i++)
591 537
      {
592
      vectors[i] = computeVector(i,vertices,indices,bandIndices,normals);
538
      vectors[i] = computeVector(i,indices,bandIndices,normals);
593 539
      }
594 540

  
595 541
    return vectors;
......
879 825
    mPuzzleNormals= getNormals();
880 826
    mNumFaces     = mPuzzleNormals.length;
881 827
    mDist3D       = getDist3D(mNumLayers);
882
    mDiaAxis      = getDiameterAxis();
883
    mMinMax       = new float[mDiaAxis.length][2];
884 828
    }
885 829

  
886 830
///////////////////////////////////////////////////////////////////////////////////////////////////
......
933 877
    if( mBandIndices[variant]==null )
934 878
      {
935 879
      mFaceBelongsBitmap[variant] = computeFaceBelongsBitmap(mVertices[variant], mMove[variant],corr);
936
      mBandIndices[variant] = generateBandIndices(mVertices[variant], mIndices[variant], mFaceBelongsBitmap[variant]);
880
      mBandIndices[variant] = generateBandIndices(mIndices[variant], mFaceBelongsBitmap[variant]);
937 881
      }
938 882

  
939 883
    return new ObjectFaceShape(bands,mBandIndices[variant],null);
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedCuboid.java
168 168
    int sum = numLayers[0]+numLayers[1]+numLayers[2];
169 169

  
170 170
    float height= iconMode ? 0.001f : 0.05f;
171
    int[] angle = {1,54,43,35,30,26,23,21};
171
    int angle   = 60;
172 172
    float R     = 0.3f;
173 173
    float S     = 0.5f;
174 174
    int extraI  = sum>6 ? 0 : 2;
......
176 176
    int numVertA= sum>=19 ? 3 : (sum>=16 ? 4:5);
177 177
    int numVertI= sum>=13 ? 2 : 3;
178 178

  
179
    return new float[][] { {0.001f  ,angle[0],R,S,numVertI,extraV,extraI},
180
                           {height  ,angle[1],R,S,numVertA,extraV,extraI},
181
                           {height/2,angle[2],R,S,numVertA,extraV,extraI},
182
                           {height/3,angle[3],R,S,numVertA,extraV,extraI},
183
                           {height/4,angle[4],R,S,numVertA,extraV,extraI},
184
                           {height/5,angle[5],R,S,numVertA,extraV,extraI},
185
                           {height/6,angle[6],R,S,numVertA,extraV,extraI},
186
                           {height/7,angle[7],R,S,numVertA,extraV,extraI},
179
    return new float[][] { {0.001f,angle,R,S,numVertI,extraV,extraI},
180
                           {height,angle,R,S,numVertA,extraV,extraI},
187 181
                         };
188 182
    }
189 183
  }
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedMegaminx.java
1089 1089
  public float[][] getBands(boolean iconMode, int[] numLayers)
1090 1090
    {
1091 1091
    float height= iconMode ? 0.001f : 0.05f;
1092
    int[] angle = {1,55,50,46,42,39,36,34,31,29,27};
1092
    int   angle = 60;
1093 1093
    float R     = 0.5f;
1094 1094
    float S     = 0.5f;
1095 1095
    int extraI  = 0;
......
1097 1097
    int numVertA= numLayers[0]>=4 ? 4 : 5;
1098 1098
    int numVertI= numLayers[0]>=4 ? 2 : 3;
1099 1099

  
1100
    return new float[][] { {0.001f      ,angle[ 0],R,S,numVertI,extraV,extraI},
1101
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
1102
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
1103
                           {height/ 1.5f,angle[ 2],R,S,numVertA,extraV,extraI},
1104
                           {height/ 2.0f,angle[ 3],R,S,numVertA,extraV,extraI},
1105
                           {height/ 2.5f,angle[ 4],R,S,numVertA,extraV,extraI},
1106
                           {height/ 3.0f,angle[ 5],R,S,numVertA,extraV,extraI},
1107
                           {height/ 3.5f,angle[ 6],R,S,numVertA,extraV,extraI},
1108
                           {height/ 4.0f,angle[ 7],R,S,numVertA,extraV,extraI},
1109
                           {height/ 4.5f,angle[ 8],R,S,numVertA,extraV,extraI},
1110
                           {height/ 5.0f,angle[ 9],R,S,numVertA,extraV,extraI},
1111
                           {height/ 5.5f,angle[10],R,S,numVertA,extraV,extraI}
1112
                          };
1100
    return new float[][] { {0.001f,angle,R,S,numVertI,extraV,extraI},
1101
                           {height,angle,R,S,numVertA,extraV,extraI} };
1113 1102
    }
1114 1103
  }
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedOctahedron.java
347 347
  public float[][] getBands(boolean iconMode, int[] numLayers)
348 348
    {
349 349
    float height= iconMode ? 0.001f : 0.05f;
350
    int[] angle = {1,26,24,22,20,18,16,14,12,10,8};
350
    int angle   = 60;
351 351
    float R     = 0.3f;
352 352
    float S     = 0.5f;
353 353
    int extraI  = numLayers[0]>2 ? 0:1;
......
355 355
    int numVertA= numLayers[0]>3 ? 5:6;
356 356
    int numVertI= numLayers[0]>4 ? 2:3;
357 357

  
358
    return new float[][] { {  0.001f    ,angle[ 0],R,S,numVertI,extraV,extraI},
359
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
360
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
361
                           {height/ 1.5f,angle[ 2],R,S,numVertA,extraV,extraI},
362
                           {height/ 2.0f,angle[ 3],R,S,numVertA,extraV,extraI},
363
                           {height/ 2.5f,angle[ 4],R,S,numVertA,extraV,extraI},
364
                           {height/ 3.0f,angle[ 5],R,S,numVertA,extraV,extraI},
365
                           {height/ 3.5f,angle[ 6],R,S,numVertA,extraV,extraI},
366
                           {height/ 4.0f,angle[ 7],R,S,numVertA,extraV,extraI},
367
                           {height/ 4.5f,angle[ 8],R,S,numVertA,extraV,extraI},
368
                           {height/ 5.0f,angle[ 9],R,S,numVertA,extraV,extraI},
369
                           {height/ 5.5f,angle[10],R,S,numVertA,extraV,extraI}
370
                          };
358
    return new float[][] { {0.001f,angle,R,S,numVertI,extraV,extraI},
359
                           {height,angle,R,S,numVertA,extraV,extraI} };
371 360
    }
372 361
  }
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedPyraminx.java
249 249
  public float[][] getBands(boolean iconMode, int[] numLayers)
250 250
    {
251 251
    float height= iconMode ? 0.001f : 0.055f;
252
    int[] angle = {1,56,50,43,39,35,32,30,28,26,25};
252
    int angle   = 60;
253 253
    float R     = 0.3f;
254 254
    float S     = 0.5f;
255 255
    int extraI  = 0;
......
257 257
    int numVertA= numLayers[0]>=5 ? 4 : 5;
258 258
    int numVertI= numLayers[0]>=5 ? 2 : 3;
259 259

  
260
    return new float[][] { {  0.001f    ,angle[ 0],R,S,numVertI,extraV,extraI},
261
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
262
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
263
                           {height/ 1.5f,angle[ 2],R,S,numVertA,extraV,extraI},
264
                           {height/ 2.0f,angle[ 3],R,S,numVertA,extraV,extraI},
265
                           {height/ 2.5f,angle[ 4],R,S,numVertA,extraV,extraI},
266
                           {height/ 3.0f,angle[ 5],R,S,numVertA,extraV,extraI},
267
                           {height/ 3.5f,angle[ 6],R,S,numVertA,extraV,extraI},
268
                           {height/ 4.0f,angle[ 7],R,S,numVertA,extraV,extraI},
269
                           {height/ 4.5f,angle[ 8],R,S,numVertA,extraV,extraI},
270
                           {height/ 5.0f,angle[ 9],R,S,numVertA,extraV,extraI},
271
                           {height/ 5.5f,angle[10],R,S,numVertA,extraV,extraI}
272
                          };
260
    return new float[][] { {0.001f,angle,R,S,numVertI,extraV,extraI},
261
                           {height,angle,R,S,numVertA,extraV,extraI} };
273 262
    }
274 263
  }
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedSkewb.java
321 321
  public float[][] getBands(boolean iconMode, int[] numLayers)
322 322
    {
323 323
    float height= iconMode ? 0.001f : 0.055f;
324
    int[] angle = {1,35,30,25,22,20,17,15,13,11,9};
324
    int angle   = 60;
325 325
    float R     = 0.3f;
326 326
    float S     = 0.5f;
327 327
    int extraI  = numLayers[0]==2 ? 2:1;
......
329 329
    int numVertA= numLayers[0]==2 ? 7:5;
330 330
    int numVertI= numLayers[0]==2 ? 3:2;
331 331

  
332
    return new float[][] { {  0.001f    ,angle[ 0],R,S,numVertI,extraV,extraI},
333
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
334
                           {height      ,angle[ 1],R,S,numVertA,extraV,extraI},
335
                           {height/ 1.5f,angle[ 2],R,S,numVertA,extraV,extraI},
336
                           {height/ 2.0f,angle[ 3],R,S,numVertA,extraV,extraI},
337
                           {height/ 2.5f,angle[ 4],R,S,numVertA,extraV,extraI},
338
                           {height/ 3.0f,angle[ 5],R,S,numVertA,extraV,extraI},
339
                           {height/ 3.5f,angle[ 6],R,S,numVertA,extraV,extraI},
340
                           {height/ 4.0f,angle[ 7],R,S,numVertA,extraV,extraI},
341
                           {height/ 4.5f,angle[ 8],R,S,numVertA,extraV,extraI},
342
                           {height/ 5.0f,angle[ 9],R,S,numVertA,extraV,extraI},
343
                           {height/ 5.5f,angle[10],R,S,numVertA,extraV,extraI}
344
                          };
332
    return new float[][] { {0.001f,angle,R,S,numVertI,extraV,extraI},
333
                           {height,angle,R,S,numVertA,extraV,extraI} };
345 334
    }
346 335
  }
src/main/java/org/distorted/objectlib/objects/TwistyBandagedCuboid.java
524 524
      int[] numLayers = getNumLayers();
525 525
      boolean iconMode = isInIconMode();
526 526
      float[][] bands = factory.getBands(iconMode,numLayers);
527

  
528
      int X = dim[0];
529
      int Y = dim[1];
530
      int Z = dim[2];
531
      int DX = Math.max(Y,Z);
532
      int DY = Math.max(X,Z);
533
      int DZ = Math.max(X,Y);
534

  
535
      int[] bandIndices= { DX,DX,DY,DY,DZ,DZ };
527
      int[] bandIndices= { 1,1,1,1,1,1 };
536 528

  
537 529
      return new ObjectFaceShape(bands,bandIndices,null);
538 530
      }

Also available in: Unified diff