Revision 799fab62
Added by Leszek Koltunski 7 months ago
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
implement the 'roundness of external face does not depend on its size' thing in the BandagedCreators.