Project

General

Profile

« Previous | Next » 

Revision e4bf4d02

Added by Leszek Koltunski about 3 years ago

Progress with Megaminx.

View differences:

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