Revision e4bf4d02
Added by Leszek Koltunski about 3 years ago
src/main/java/org/distorted/objects/TwistyMegaminx.java | ||
---|---|---|
40 | 40 |
|
41 | 41 |
public class TwistyMegaminx extends TwistyMinx |
42 | 42 |
{ |
43 |
static final float MEGA_D = 0.05f;
|
|
43 |
static final float MEGA_D = 0.04f;
|
|
44 | 44 |
|
45 | 45 |
private static final int NUM_CORNERS = 20; |
46 | 46 |
private static final int NUM_CENTERS = 12; |
... | ... | |
102 | 102 |
{ 3, 15, 3, 5}, |
103 | 103 |
}; |
104 | 104 |
|
105 |
|
|
106 |
private static final int[] QUAT_EDGE_INDICES = |
|
107 |
{ |
|
108 |
56, 40, 43, 59, 0, 55, 10, 17, 25, 49, |
|
109 |
48, 57, 18, 7, 53, 32, 20, 11, 31, 38, |
|
110 |
37, 30, 8, 28, 36, 44, 1, 46, 12, 14 |
|
111 |
}; |
|
112 |
|
|
113 |
private static final int[] QUAT_CENTER_INDICES = |
|
114 |
{ |
|
115 |
16, 18, 22, 1, 20, 13, 14, 15, 0, 12, 2, 3 |
|
116 |
}; |
|
117 |
|
|
105 | 118 |
private static final float[][] mCenterCoords = new float[NUM_CENTERS][3]; |
106 | 119 |
|
107 | 120 |
static |
... | ... | |
175 | 188 |
|
176 | 189 |
int getNumStickerTypes(int numLayers) |
177 | 190 |
{ |
178 |
return numLayers-1; //numLayers;
|
|
191 |
return (numLayers+3)/2;
|
|
179 | 192 |
} |
180 | 193 |
|
181 | 194 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
203 | 216 |
|
204 | 217 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
205 | 218 |
|
206 |
private void computeCenter(Static3D[] array, int center)
|
|
219 |
private void computeCenter(Static3D pos, int center, int numLayers)
|
|
207 | 220 |
{ |
208 | 221 |
float[] coords = mCenterCoords[center]; |
209 |
array[center].set( coords[0], coords[1], coords[2]); |
|
222 |
float A = numLayers/3.0f; |
|
223 |
|
|
224 |
pos.set( A*coords[0], A*coords[1], A*coords[2] ); |
|
210 | 225 |
} |
211 | 226 |
|
212 | 227 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
298 | 313 |
{ |
299 | 314 |
int numCubitsPerCorner = numCubitsPerCorner(numLayers); |
300 | 315 |
int numCubitsPerEdge = numCubitsPerEdge(numLayers); |
301 |
int numCubits = NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge;// + NUM_CENTERS;
|
|
316 |
int numCubits = NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge + NUM_CENTERS; |
|
302 | 317 |
int index=0; |
303 | 318 |
|
304 | 319 |
final Static3D[] CENTERS = new Static3D[numCubits]; |
... | ... | |
322 | 337 |
computeEdge(CENTERS[index], numLayers, edge, part ); |
323 | 338 |
} |
324 | 339 |
} |
325 |
/* |
|
340 |
|
|
326 | 341 |
for(int center=0; center<NUM_CENTERS; center++, index++) |
327 | 342 |
{ |
328 |
computeCenter(CENTERS,index); |
|
343 |
CENTERS[index] = new Static3D(0,0,0); |
|
344 |
computeCenter(CENTERS[index], center, numLayers); |
|
329 | 345 |
} |
330 |
*/ |
|
346 |
|
|
331 | 347 |
return CENTERS; |
332 | 348 |
} |
333 | 349 |
|
334 | 350 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
335 | 351 |
|
336 |
private int getQuat(int cubit, int numLayers)
|
|
352 |
private int getQuat(int cubit, int numCubitsPerCorner, int numCubitsPerEdge)
|
|
337 | 353 |
{ |
338 |
int numCubitsPerCorner = numCubitsPerCorner(numLayers); |
|
339 |
|
|
340 | 354 |
if( cubit < NUM_CORNERS*numCubitsPerCorner ) |
341 | 355 |
{ |
342 | 356 |
int corner = cubit/numCubitsPerCorner; |
343 | 357 |
return QUAT_CORNER_INDICES[corner]; |
344 | 358 |
} |
345 | 359 |
|
346 |
int numCubitsPerEdge = numCubitsPerEdge(numLayers); |
|
347 |
|
|
348 | 360 |
if( cubit < NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge ) |
349 | 361 |
{ |
350 | 362 |
int edge = (cubit-NUM_CORNERS*numCubitsPerCorner)/numCubitsPerEdge; |
351 | 363 |
return QUAT_EDGE_INDICES[edge]; |
352 | 364 |
} |
353 | 365 |
|
354 |
/* |
|
355 |
else |
|
356 |
{ |
|
357 |
// TODO: centers |
|
358 |
} |
|
359 |
*/ |
|
360 |
|
|
361 |
return 0; |
|
366 |
int center = cubit - NUM_CORNERS*numCubitsPerCorner - NUM_EDGES*numCubitsPerEdge; |
|
367 |
return QUAT_CENTER_INDICES[center]; |
|
362 | 368 |
} |
363 | 369 |
|
364 | 370 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
374 | 380 |
|
375 | 381 |
if( mCornerMeshes==null ) mCornerMeshes = new MeshBase[variants]; |
376 | 382 |
if( mEdgeMeshes ==null ) mEdgeMeshes = new MeshBase[variants][(sizes[variants-1]-1)/2]; |
383 |
if( mCenterMeshes==null ) mCenterMeshes = new MeshBase[variants]; |
|
377 | 384 |
|
378 | 385 |
if( cubit < NUM_CORNERS*numCubitsPerCorner ) |
379 | 386 |
{ |
... | ... | |
383 | 390 |
} |
384 | 391 |
mesh = mCornerMeshes[index].copy(true); |
385 | 392 |
} |
386 |
else //if( cubit<NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge )
|
|
393 |
else if( cubit<NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge ) |
|
387 | 394 |
{ |
388 | 395 |
int type = computeEdgeType(cubit,numCubitsPerCorner,numCubitsPerEdge); |
389 | 396 |
|
... | ... | |
397 | 404 |
|
398 | 405 |
mesh = mEdgeMeshes[index][type].copy(true); |
399 | 406 |
} |
400 |
/* |
|
401 | 407 |
else |
402 | 408 |
{ |
403 |
// TODO: centers |
|
409 |
if( mCenterMeshes[index]==null ) |
|
410 |
{ |
|
411 |
float width = 2 * (numLayers/3.0f) * (MEGA_D+(0.5f-MEGA_D)*SIN18); |
|
412 |
mCenterMeshes[index] = FactoryCubit.getInstance().createMegaminxCenterMesh(width); |
|
413 |
} |
|
414 |
|
|
415 |
mesh = mCenterMeshes[index].copy(true); |
|
404 | 416 |
} |
405 |
*/ |
|
406 |
Static4D q = QUATS[getQuat(cubit,numLayers)];
|
|
417 |
|
|
418 |
Static4D q = QUATS[getQuat(cubit,numCubitsPerCorner,numCubitsPerEdge)];
|
|
407 | 419 |
MatrixEffectQuaternion quat = new MatrixEffectQuaternion( q, new Static3D(0,0,0) ); |
408 | 420 |
mesh.apply(quat,0xffffffff,0); |
409 | 421 |
|
... | ... | |
454 | 466 |
|
455 | 467 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
456 | 468 |
|
457 |
int getEdgeColor(int cubit, int cubitface, int numLayers, int numCubitsPerCorner, int numCubitsPerEdge)
|
|
469 |
int getEdgeColor(int edge, int cubitface, int numCubitsPerEdge)
|
|
458 | 470 |
{ |
459 | 471 |
if( cubitface<0 || cubitface>1 ) return NUM_TEXTURES; |
460 | 472 |
|
461 |
int part = (cubit - NUM_CORNERS*numCubitsPerCorner) % numCubitsPerEdge;
|
|
462 |
int edge = (cubit - NUM_CORNERS*numCubitsPerCorner) / numCubitsPerEdge;
|
|
473 |
int part = edge % numCubitsPerEdge;
|
|
474 |
int variant = edge / numCubitsPerEdge;
|
|
463 | 475 |
|
464 |
if( part==0 ) |
|
465 |
{ |
|
466 |
return mEdgeMap[edge][cubitface+2]; |
|
467 |
} |
|
468 |
|
|
469 |
return cubitface==((part+1)%2) ? mEdgeMap[edge][cubitface+2] : NUM_TEXTURES; |
|
476 |
return (part==0 || cubitface==((part+1)%2)) ? mEdgeMap[variant][cubitface+2] + (part+1)*NUM_FACES : NUM_TEXTURES; |
|
470 | 477 |
} |
471 | 478 |
|
472 | 479 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
473 |
// TODO |
|
474 | 480 |
|
475 |
int getCenterColor(int cubit, int cubitface, int numLayers)
|
|
481 |
int getCenterColor(int center, int cubitface, int numLayers)
|
|
476 | 482 |
{ |
477 |
return 0;
|
|
483 |
return cubitface>0 ? NUM_TEXTURES : center + NUM_FACES*(numLayers+1)/2;
|
|
478 | 484 |
} |
479 | 485 |
|
480 | 486 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
490 | 496 |
} |
491 | 497 |
else if( cubit<NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge ) |
492 | 498 |
{ |
493 |
return getEdgeColor(cubit,cubitface,numLayers,numCubitsPerCorner,numCubitsPerEdge); |
|
499 |
int edge = cubit - NUM_CORNERS*numCubitsPerCorner; |
|
500 |
return getEdgeColor(edge,cubitface,numCubitsPerEdge); |
|
494 | 501 |
} |
495 | 502 |
else |
496 | 503 |
{ |
497 |
return getCenterColor(cubit,cubitface,numLayers); |
|
504 |
int center = cubit-NUM_CORNERS*numCubitsPerCorner-NUM_EDGES*numCubitsPerEdge; |
|
505 |
return getCenterColor( center, cubitface, numLayers); |
|
498 | 506 |
} |
499 | 507 |
} |
500 | 508 |
|
Also available in: Unified diff
Progress with Megaminx.