Project

General

Profile

« Previous | Next » 

Revision 5e06e92f

Added by Leszek Koltunski about 3 years ago

New cubit engine: convert Kiliminx & some Megaminx.

View differences:

src/main/java/org/distorted/helpers/FactoryCubit.java
41 41
public class FactoryCubit
42 42
  {
43 43
  private static final float SQ2 = (float)Math.sqrt(2);
44
  private static final float SQ3 = (float)Math.sqrt(3);
45 44
  private static final float SQ5 = (float)Math.sqrt(5);
46 45

  
47 46
  private static final Static1D RADIUS = new Static1D(1);
......
65 64
  public static final float SIN_HALFD= (float)(Math.sqrt(0.5f+0.1f*SQ5)); // sin(half the dihedral angle)
66 65
  public static final float DIHEDRAL1= (float)(Math.acos(-SQ5/5)*180/Math.PI);
67 66
  public static final float DIHEDRAL2= (float)((180/Math.PI)*Math.asin((2*SIN54*SIN54-1)/COS54) - 90);
68
  public static final float MINX_SC  = 0.5f;
69

  
70 67

  
71 68
  private static final double[] mBuffer = new double[3];
72 69
  private static final double[] mQuat1  = new double[4];
......
391 388
    return new MeshJoined(meshes);
392 389
    }
393 390

  
394
///////////////////////////////////////////////////////////////////////////////////////////////////
395

  
396
  MeshBase createFacesKilominxCenter()
397
    {
398
    MeshBase[] meshes = new MeshPolygon[6];
399

  
400
    float X1= 0.5f*SIN54;
401
    float Y1= 0.5f*SIN_HALFD;
402
    float Y2= Y1 - 0.5f*COS54;
403
    float H = 0.5f* SIN54 /COS54  ;
404
    float X2= MINX_SC*H* SIN_HALFD;
405
    float Y3= MINX_SC*H/(2*COS_HALFD);
406
    float Y4= MINX_SC*H*(1/(2*COS_HALFD) - COS_HALFD);
407

  
408
    float[] vertices0 = { -X1, Y2, 0, -Y1, X1, Y2, 0, Y1 };
409
    float[] bands0 = computeBands(0.04f,17,0.3f,0.2f,5);
410
    float[] vertices1 = { -X2, Y4, 0, -Y3, X2, Y4, 0, Y3 };
411
    float[] bands1 = computeBands(0.00f, 0,0.25f,0.5f,2);
412

  
413
    meshes[0] = new MeshPolygon(vertices0, bands0, 1, 1);
414
    meshes[0].setEffectAssociation(0, 1,0);
415
    meshes[1] = meshes[0].copy(true);
416
    meshes[1].setEffectAssociation(0, 2,0);
417
    meshes[2] = meshes[0].copy(true);
418
    meshes[2].setEffectAssociation(0, 4,0);
419
    meshes[3] = new MeshPolygon(vertices1, bands1, 0, 0);
420
    meshes[3].setEffectAssociation(0, 8,0);
421
    meshes[4] = meshes[3].copy(true);
422
    meshes[4].setEffectAssociation(0,16,0);
423
    meshes[5] = meshes[3].copy(true);
424
    meshes[5].setEffectAssociation(0,32,0);
425

  
426
    return new MeshJoined(meshes);
427
    }
428

  
429
///////////////////////////////////////////////////////////////////////////////////////////////////
430

  
431
  MeshBase createFacesMinxCorner(int numLayers)
432
    {
433
    MeshBase[] meshes = new MeshPolygon[6];
434

  
435
    float Y = COS54/(2*SIN54);
436

  
437
    float[] vertices0 = { -0.5f, 0.0f, 0.0f, -Y, 0.5f, 0.0f, 0.0f, Y };
438

  
439
    int numBands0 = numLayers==3 ? 5 : 3;
440
    int numBands1 = numLayers==3 ? 2 : 2;
441
    float h       = numLayers==3 ? 0.04f : 0.03f;
442
    int   e       = numLayers==3 ? 4 : 1;
443

  
444
    float[] bands0 = computeBands(h    ,34,0.3f,0.2f, numBands0);
445
    float[] bands1 = computeBands(0.00f,34,0.3f,0.2f, numBands1);
446

  
447
    meshes[0] = new MeshPolygon(vertices0, bands0, 1, 1);
448
    meshes[0].setEffectAssociation(0, 1,0);
449
    meshes[1] = meshes[0].copy(true);
450
    meshes[1].setEffectAssociation(0, 2,0);
451
    meshes[2] = meshes[0].copy(true);
452
    meshes[2].setEffectAssociation(0, 4,0);
453
    meshes[3] = new MeshPolygon(vertices0, bands1, 1, e);
454
    meshes[3].setEffectAssociation(0, 8,0);
455
    meshes[4] = meshes[3].copy(true);
456
    meshes[4].setEffectAssociation(0,16,0);
457
    meshes[5] = meshes[3].copy(true);
458
    meshes[5].setEffectAssociation(0,32,0);
459

  
460
    return new MeshJoined(meshes);
461
    }
462

  
463
///////////////////////////////////////////////////////////////////////////////////////////////////
464

  
465
  MeshBase createFacesKilominxEdge(int numLayers, float width, float height)
466
    {
467
     MeshBase[] meshes = new MeshPolygon[6];
468

  
469
    float D = height/COS18;
470
    float W = D*SIN18;
471
    float X1 = height/2;
472
    float Y1 = width/2;
473
    float Y2 = (width+W)/2;
474
    float X3 = D*SIN54;
475
    float Y3 = D*COS54;
476
    float X4 = height*SIN_HALFD;
477
    float Y4 = height*COS_HALFD;
478

  
479
    float[] vertices0 = { -X1,-Y1, X1, -Y1, X1, Y1+W,-X1, Y1 };
480
    float[] vertices1 = { -X1,-Y2, X1, -Y2, X1, Y2+W,-X1, Y2 };
481
    float[] vertices2 = { -X3, 0.0f, 0.0f, -Y3, X3, 0.0f, 0.0f, Y3 };
482
    float[] vertices3 = { -X4, 0.0f, 0.0f, -Y4, X4, 0.0f, 0.0f, Y4 };
483

  
484
    int numBands0 = numLayers<=5 ? 5 : 3;
485
    int numBands1 = numLayers<=5 ? 3 : 2;
486
    float h       = numLayers<=5 ? 0.03f : 0.03f;
487

  
488
    float[] bands0 = computeBands(h    ,34,0.2f,0.2f,numBands0);
489
    float[] bands1 = computeBands(0.01f,34,0.3f,0.2f,numBands1);
490

  
491
    meshes[0] = new MeshPolygon(vertices0, bands0, 1, 1);
492
    meshes[0].setEffectAssociation(0, 1,0);
493
    meshes[1] = meshes[0].copy(true);
494
    meshes[1].setEffectAssociation(0, 2,0);
495
    meshes[2] = new MeshPolygon(vertices1, bands1, 0, 0);
496
    meshes[2].setEffectAssociation(0, 4,0);
497
    meshes[3] = meshes[2].copy(true);
498
    meshes[3].setEffectAssociation(0, 8,0);
499
    meshes[4] = new MeshPolygon(vertices2, bands1, 0, 0);
500
    meshes[4].setEffectAssociation(0,16,0);
501
    meshes[5] = new MeshPolygon(vertices3, bands1, 0, 0);
502
    meshes[5].setEffectAssociation(0,32,0);
503

  
504
    return new MeshJoined(meshes);
505
    }
506

  
507 391
///////////////////////////////////////////////////////////////////////////////////////////////////
508 392

  
509 393
  MeshBase createFacesMegaminxEdge(int numLayers, float width, float height)
......
718 602
    return effect;
719 603
    }
720 604

  
721
///////////////////////////////////////////////////////////////////////////////////////////////////
722

  
723
  VertexEffect[] createVertexEffectsKilominxCenter(float width)
724
    {
725
    VertexEffect[] effect = new VertexEffect[11];
726

  
727
    float H = 0.5f*(SIN54/COS54);
728
    float Y1= 0.5f*SIN_HALFD;
729
    float Y2= H/(2*COS_HALFD);
730
    float cos18 = (float)(Math.sqrt(1- SIN18 * SIN18));
731
    float LEN   = (float)Math.sqrt(H*H/(COS_HALFD*COS_HALFD) + 0.25f);
732

  
733
    Static3D axisZ = new Static3D(0.0f  , 0.0f , 1.0f);
734
    Static3D axisY = new Static3D(0.0f  , 1.0f , 0.0f);
735
    Static3D axisA = new Static3D(-SIN18, cos18, 0.0f);
736
    Static3D axisC = new Static3D( H/LEN, -0.5f/LEN,-H* SIN_HALFD /(COS_HALFD*LEN));
737

  
738
    Static3D move1 = new Static3D(0,-Y1,0);
739
    Static3D move2 = new Static3D(0,-Y2,0);
740
    Static3D move3 = new Static3D(0.5f*cos18,0.5f*SIN18,0);
741
    Static3D center= new Static3D(0.0f, 0.0f, 0.0f);
742

  
743
    Static1D angle1 = new Static1D(54);
744
    Static1D angle2 = new Static1D(DIHEDRAL1/2+18);
745
    Static1D angle3 = new Static1D(90);
746
    Static1D angle4 = new Static1D(120);
747
    Static1D angle5 = new Static1D(240);
748
    Static1D angle6 = new Static1D(90-DIHEDRAL1/2);
749

  
750
    effect[0] = new VertexEffectMove(move1);
751
    effect[1] = new VertexEffectScale(1/MINX_SC);
752
    effect[2] = new VertexEffectMove(move2);
753
    effect[3] = new VertexEffectRotate(angle1, axisZ, center);
754
    effect[4] = new VertexEffectRotate(angle2, axisZ, center);
755
    effect[5] = new VertexEffectRotate(angle3, axisA, center);
756
    effect[6] = new VertexEffectMove(move3);
757
    effect[7] = new VertexEffectRotate(angle4, axisC, center);
758
    effect[8] = new VertexEffectRotate(angle5, axisC, center);
759
    effect[9] = new VertexEffectRotate(angle6, axisY, center);
760
    effect[10]= new VertexEffectScale(width/0.5f);
761

  
762
    effect[0].setMeshAssociation( 7,-1);  // meshes 0,1,2
763
    effect[1].setMeshAssociation(56,-1);  // meshes 3,4,5
764
    effect[2].setMeshAssociation(56,-1);  // meshes 3,4,5
765
    effect[3].setMeshAssociation( 7,-1);  // meshes 0,1,2
766
    effect[4].setMeshAssociation(56,-1);  // meshes 3,4,5
767
    effect[5].setMeshAssociation(56,-1);  // meshes 3,4,5
768
    effect[6].setMeshAssociation(56,-1);  // meshes 3,4,5
769
    effect[7].setMeshAssociation(18,-1);  // meshes 1,4
770
    effect[8].setMeshAssociation(36,-1);  // meshes 2,5
771

  
772
    return effect;
773
    }
774

  
775
///////////////////////////////////////////////////////////////////////////////////////////////////
776

  
777
  VertexEffect[] createVertexEffectsMinxCorner(float width)
778
    {
779
    VertexEffect[] effect = new VertexEffect[9];
780

  
781
    float Y = COS54/(2*SIN54);
782

  
783
    float sinA = (2*SIN54*SIN54-1)/COS54;
784
    float cosA = (float)Math.sqrt(1-sinA*sinA);
785
    float LEN  = 0.5f/SIN54;
786
    float scale= width/LEN;
787

  
788
    Static3D axisA = new Static3D( SIN54, COS54, 0.0f);
789
    Static3D axisB = new Static3D(-SIN54, COS54, 0.0f);
790
    Static3D axisX = new Static3D(  1.0f,  0.0f, 0.0f);
791

  
792
    Static3D centerU = new Static3D( 0.0f, Y, 0.0f);
793
    Static3D centerD = new Static3D( 0.0f,-Y, 0.0f);
794

  
795
    Static3D move1= new Static3D(0.0f, -sinA*LEN, -cosA*LEN );
796
    Static3D move2= new Static3D(0.0f, Y , 0.0f );
797

  
798
    Static1D angleD = new Static1D(DIHEDRAL1);
799
    Static1D angleE = new Static1D(360-DIHEDRAL1);
800
    Static1D angleF = new Static1D(DIHEDRAL2);
801

  
802
    effect[0] = new VertexEffectScale ( new Static3D( 1, 1,-1) );
803
    effect[1] = new VertexEffectRotate(angleE, axisA, centerU);
804
    effect[2] = new VertexEffectRotate(angleD, axisB, centerU);
805
    effect[3] = new VertexEffectMove(move1);
806
    effect[4] = new VertexEffectRotate(angleE, axisA, centerD);
807
    effect[5] = new VertexEffectRotate(angleD, axisB, centerD);
808
    effect[6] = new VertexEffectRotate(angleF, axisX, centerD);
809
    effect[7] = new VertexEffectMove(move2);
810
    effect[8] = new VertexEffectScale(scale);
811

  
812
    effect[0].setMeshAssociation(  3,-1);  // meshes 0,1
813
    effect[1].setMeshAssociation( 16,-1);  // mesh 4
814
    effect[2].setMeshAssociation( 32,-1);  // mesh 5
815
    effect[3].setMeshAssociation( 56,-1);  // meshes 3,4,5
816
    effect[4].setMeshAssociation(  1,-1);  // mesh 0
817
    effect[5].setMeshAssociation(  2,-1);  // mesh 1
818

  
819
    return effect;
820
    }
821

  
822
///////////////////////////////////////////////////////////////////////////////////////////////////
823

  
824
  VertexEffect[] createVertexEffectsKilominxEdge(float width, float height, boolean left)
825
    {
826
    VertexEffect[] effect = new VertexEffect[11 + (left ? 0:1)];
827

  
828
    float D = height/COS18;
829
    float W = D*SIN18;
830
    float X1 = height/2;
831
    float Y1 = width/2;
832
    float Y2 = (width+W)/2;
833
    float Y3 = D*COS54;
834
    float Y4 = height*COS_HALFD;
835
    float Z = 2*height*COS_HALFD;
836
    float alpha = 90-DIHEDRAL1/2;
837

  
838
    Static1D angle1 = new Static1D(alpha);
839
    Static1D angle2 = new Static1D(180-alpha);
840
    Static1D angle3 = new Static1D(DIHEDRAL2);
841
    Static1D angle4 = new Static1D(90);
842

  
843
    Static3D move1 = new Static3D(+X1,-Y1,0);
844
    Static3D move2 = new Static3D(-X1,-Y2+W,-Z);
845
    Static3D move3 = new Static3D(0,+Y3,0);
846
    Static3D move4 = new Static3D(0,-Y4-width,0);
847
    Static3D scale = new Static3D(+1,+1,-1);
848

  
849
    Static3D axisXplus = new Static3D(+1, 0, 0);
850
    Static3D axisYplus = new Static3D( 0,+1, 0);
851

  
852
    Static3D center1= new Static3D( 0, 0, 0);
853
    Static3D center2= new Static3D( 0, 0,-Z);
854
    Static3D center3= new Static3D( 0,-width, 0);
855

  
856
    effect[ 0] = new VertexEffectMove(move1);
857
    effect[ 1] = new VertexEffectMove(move2);
858
    effect[ 2] = new VertexEffectMove(move3);
859
    effect[ 3] = new VertexEffectMove(move4);
860
    effect[ 4] = new VertexEffectScale(scale);
861
    effect[ 5] = new VertexEffectRotate(angle1, axisYplus , center1);
862
    effect[ 6] = new VertexEffectRotate(angle2, axisYplus , center1);
863
    effect[ 7] = new VertexEffectRotate(angle1, axisYplus , center2);
864
    effect[ 8] = new VertexEffectRotate(angle2, axisYplus , center2);
865
    effect[ 9] = new VertexEffectRotate(angle3, axisXplus , center1);
866
    effect[10] = new VertexEffectRotate(angle4, axisXplus , center3);
867

  
868
    if( !left )
869
      {
870
      Static3D scale1 = new Static3D(+1,-1,+1);
871
      effect[11] = new VertexEffectScale(scale1);
872
      }
873

  
874
    effect[ 0].setMeshAssociation( 3,-1);  // meshes 0,1
875
    effect[ 1].setMeshAssociation(12,-1);  // meshes 2,3
876
    effect[ 2].setMeshAssociation(16,-1);  // mesh 4
877
    effect[ 3].setMeshAssociation(32,-1);  // mesh 5
878
    effect[ 4].setMeshAssociation( 2,-1);  // mesh 1
879
    effect[ 5].setMeshAssociation( 1,-1);  // mesh 0
880
    effect[ 6].setMeshAssociation( 2,-1);  // mesh 1
881
    effect[ 7].setMeshAssociation( 4,-1);  // mesh 2
882
    effect[ 8].setMeshAssociation( 8,-1);  // mesh 3
883
    effect[ 9].setMeshAssociation(16,-1);  // mesh 4
884
    effect[10].setMeshAssociation(32,-1);  // mesh 5
885

  
886
    return effect;
887
    }
888

  
889 605
///////////////////////////////////////////////////////////////////////////////////////////////////
890 606

  
891 607
  VertexEffect[] createVertexEffectsMegaminxEdge(float width, float height)
......
1114 830
    return mesh;
1115 831
    }
1116 832

  
1117
///////////////////////////////////////////////////////////////////////////////////////////////////
1118

  
1119
  public MeshBase createKilominxCenterMesh(float width)
1120
    {
1121
    MeshBase mesh = createFacesKilominxCenter();
1122
    VertexEffect[] effects = createVertexEffectsKilominxCenter(width);
1123
    for( VertexEffect effect : effects ) mesh.apply(effect);
1124

  
1125
    float A = (2*SQ3/3)* SIN54;
1126
    float B = 0.4f;
1127
    float X = SIN_HALFD * SIN54 *COS54  ;
1128
    float Y = SIN54 * SIN54 - 0.5f;
1129
    float Z = COS_HALFD* SIN54 *COS54  ;
1130

  
1131
    Static3D center = new Static3D(0.0f, -(float)Math.sqrt(1-A*A)*B,-A*B);
1132

  
1133
    Static3D[] vertices = new Static3D[4];
1134
    vertices[0] = new Static3D( 0.0f, 0.0f, 0.0f);
1135
    vertices[1] = new Static3D( 0.0f,-0.5f, 0.0f);
1136
    vertices[2] = new Static3D(-X   , Y   ,-Z   );
1137
    vertices[3] = new Static3D(+X   , Y   ,-Z   );
1138

  
1139
    roundCorners(mesh,center,vertices,0.03f,0.10f);
1140

  
1141
    mesh.mergeEffComponents();
1142

  
1143
    return mesh;
1144
    }
1145

  
1146
///////////////////////////////////////////////////////////////////////////////////////////////////
1147
// numLayers==3 --> index=0; numLayers=5 --> index=1 ...
1148
// type: 0,1,... 0 --> edge, 1 --> 1 layer deeper, etc
1149

  
1150
  public MeshBase createKilominxEdgeMesh(int numLayers, float width, float height, boolean left)
1151
    {
1152
    MeshBase mesh = createFacesKilominxEdge(numLayers,width,height);
1153
    VertexEffect[] effects = createVertexEffectsKilominxEdge(width,height,left);
1154
    for( VertexEffect effect : effects ) mesh.apply(effect);
1155

  
1156
// round...
1157

  
1158
    mesh.mergeEffComponents();
1159

  
1160
    return mesh;
1161
    }
1162

  
1163
///////////////////////////////////////////////////////////////////////////////////////////////////
1164

  
1165
  public MeshBase createMinxCornerMesh(int numLayers, float width)
1166
    {
1167
    MeshBase mesh = createFacesMinxCorner(numLayers);
1168
    VertexEffect[] effects = createVertexEffectsMinxCorner(width);
1169
    for( VertexEffect effect : effects ) mesh.apply(effect);
1170

  
1171
    float A = (2*SQ3/3)* SIN54;
1172
    float B = 0.4f;
1173
/*
1174
    float X = SIN_HALFD* SIN54 * COS54;
1175
    float Y = SIN54 * SIN54 - 0.5f;
1176
    float Z = COS_HALFD* SIN54 * COS54;
1177
    float S = 2*width;
1178
*/
1179
    Static3D center = new Static3D(0.0f, -(float)Math.sqrt(1-A*A)*B,-A*B);
1180
    Static3D[] vertices = new Static3D[1];
1181
    vertices[0] = new Static3D( 0.0f, 0.0f  , 0.0f);
1182
/*
1183
    vertices[1] = new Static3D( 0.0f,-0.5f*S, 0.0f);
1184
    vertices[2] = new Static3D(-X*S , Y*S   ,-Z*S );
1185
    vertices[3] = new Static3D(+X*S , Y*S   ,-Z*S );
1186
*/
1187
    roundCorners(mesh,center,vertices,0.04f,0.10f);
1188

  
1189
    mesh.mergeEffComponents();
1190

  
1191
    return mesh;
1192
    }
1193

  
1194 833
///////////////////////////////////////////////////////////////////////////////////////////////////
1195 834
// numLayers==3 --> index=0; numLayers=5 --> index=1 ...
1196 835
// type: 0,1,... 0 --> edge, 1 --> 1 layer deeper, etc
......
1278 917
    return mesh;
1279 918
    }
1280 919

  
1281

  
1282

  
1283

  
1284 920
///////////////////////////////////////////////////////////////////////////////////////////////////
1285 921

  
1286 922
  private boolean areColinear(double[][] vertices, int index1, int index2, int index3)
......
1899 1535

  
1900 1536
      mNewFaceTransf.add(newT);
1901 1537
      }
1538

  
1539
    printStickerCoords();
1902 1540
    }
1903 1541

  
1904 1542
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/objects/TwistyBandaged2Bar.java
69 69
    super(size, quat, texture, mesh, effects, moves, ObjectList.BAN2, res, scrWidth);
70 70
    }
71 71

  
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73

  
74
  int getNumCubitTypes(int numLayers)
75
    {
76
    return 2;
77
    }
78

  
79 72
///////////////////////////////////////////////////////////////////////////////////////////////////
80 73

  
81 74
  float[][] getPositions()
src/main/java/org/distorted/objects/TwistyKilominx.java
37 37

  
38 38
import static org.distorted.helpers.FactoryCubit.COS18;
39 39
import static org.distorted.helpers.FactoryCubit.COS54;
40
import static org.distorted.helpers.FactoryCubit.COS_HALFD;
40 41
import static org.distorted.helpers.FactoryCubit.SIN18;
41 42
import static org.distorted.helpers.FactoryCubit.SIN54;
43
import static org.distorted.helpers.FactoryCubit.SIN_HALFD;
42 44

  
43 45
///////////////////////////////////////////////////////////////////////////////////////////////////
44 46

  
......
323 325
      }
324 326
    }
325 327

  
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329

  
330
  private MeshBase createCenterMesh(float width)
331
    {
332
    double X = width*COS18*SIN_HALFD;
333
    double Y = width*SIN18;
334
    double Z = width*COS18*COS_HALFD;
335
    double H = width*(SIN54/COS54);
336
    double H3= H/COS_HALFD;
337
    double X3= H*SIN_HALFD;
338
    double Z3= H*COS_HALFD;;
339
    double C = 1/(COS54*Math.sqrt(2-2*SIN18));
340

  
341
    double[][] vertices = new double[][]
342
        {
343
            { 0.0, 0.0  ,   0.0 },
344
            {   X,   Y  ,    -Z },
345
            { 0.0,C*2*Y ,-2*C*Z },
346
            {  -X,   Y  ,    -Z },
347
            { 0.0,-width,   0.0 },
348
            {  X3,-width,   -Z3 },
349
            { 0.0,-width,   -H3 },
350
            { -X3,-width,   -Z3 }
351
        };
352

  
353
    int[][] vertIndexes = new int[][]
354
        {
355
            {4,5,1,0},
356
            {7,4,0,3},
357
            {0,1,2,3},
358
            {7,6,2,3},
359
            {6,5,1,2},
360
            {4,5,6,7}
361
        };
362

  
363
    float[][] bands     = new float[][]
364
      {
365
         {0.04f,17,0.3f,0.2f,5,1,1},
366
         {0.00f, 0,0.0f,0.5f,2,0,0}
367
      };
368

  
369
    float A = (2*SQ3/3)*SIN54;
370
    float B = 0.4f;
371

  
372
    int[] bandIndexes   = new int[] { 0,0,0,1,1,1};
373
    float[][] corners   = new float[][] { {0.03f,0.10f} };
374
    int[] cornerIndexes = new int[] { 0, 0,-1, 0, 0,-1,-1,-1 };
375
    float[][] centers   = new float[][] { {0.0f, -(float)Math.sqrt(1-A*A)*B,-A*B} };
376
    int[] centerIndexes = new int[] { 0, 0,-1, 0, 0,-1,-1,-1 };
377

  
378
    FactoryCubit factory = FactoryCubit.getInstance();
379
    factory.createNewFaceTransform(vertices,vertIndexes);
380

  
381
    return factory.createRoundedSolid(vertices, vertIndexes,
382
                                      bands, bandIndexes,
383
                                      corners, cornerIndexes,
384
                                      centers, centerIndexes,
385
                                      getNumCubitFaces() );
386
    }
387

  
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389

  
390
  private MeshBase createEdgeMesh(int numLayers, float width, float height, boolean left)
391
    {
392
    double X = height*SIN_HALFD;
393
    double Y = height*SIN18/COS18;
394
    double Z = height*COS_HALFD;
395

  
396
    double[][] vertices = new double[][]
397
        {
398
            { 0.0, 0.0   , 0.0 },
399
            {   X,   Y   ,  -Z },
400
            { 0.0, 2*Y   ,-2*Z },
401
            {  -X,   Y   ,  -Z },
402
            { 0.0, -width, 0.0 },
403
            {   X, -width,  -Z },
404
            { 0.0, -width,-2*Z },
405
            {  -X, -width,  -Z },
406
        };
407

  
408
    int[][] vertIndexes = new int[][]
409
        {
410
            {4,5,1,0},
411
            {7,4,0,3},
412
            {7,6,2,3},
413
            {6,5,1,2},
414
            {0,1,2,3},
415
            {4,5,6,7}
416
        };
417

  
418
    if( !left )
419
      {
420
      int tmp, len = vertices.length;
421
      for(int i=0; i<len; i++) vertices[i][1] = -vertices[i][1];
422

  
423
      len = vertIndexes.length;
424
      for(int i=0; i<len; i++)
425
        {
426
        tmp = vertIndexes[i][0];
427
        vertIndexes[i][0] = vertIndexes[i][3];
428
        vertIndexes[i][3] = tmp;
429

  
430
        tmp = vertIndexes[i][1];
431
        vertIndexes[i][1] = vertIndexes[i][2];
432
        vertIndexes[i][2] = tmp;
433
        }
434
      }
435

  
436
    int numBands0 = numLayers<=5 ? 5 : 3;
437
    int numBands1 = numLayers<=5 ? 3 : 2;
438

  
439
    float[][] bands     = new float[][]
440
      {
441
         {0.04f,34,0.2f,0.2f,numBands0,1,1},
442
         {0.00f, 0,0.0f,0.0f,numBands1,0,0}
443
      };
444
    int[] bandIndexes   = new int[] { 0,0,1,1,1,1};
445
    float[][] corners   = new float[][] { {0.04f,0.10f} };
446
    int[] cornerIndexes = new int[] { 0,-1,-1,-1, 0,-1,-1,-1 };
447
    float[][] centers   = new float[][] { {0.0f, -width/2, (float)(-2*Z)} };
448
    int[] centerIndexes = new int[] { 0,-1,-1,-1, 0,-1,-1,-1 };
449

  
450
    FactoryCubit factory = FactoryCubit.getInstance();
451
    factory.createNewFaceTransform(vertices,vertIndexes);
452

  
453
    return factory.createRoundedSolid(vertices, vertIndexes,
454
                                      bands, bandIndexes,
455
                                      corners, cornerIndexes,
456
                                      centers, centerIndexes,
457
                                      getNumCubitFaces() );
458
    }
459

  
326 460
///////////////////////////////////////////////////////////////////////////////////////////////////
327 461

  
328 462
  MeshBase createCubitMesh(int cubit, int numLayers)
......
349 483
      if( mCornerMeshes[indexCornerEdge]==null )
350 484
        {
351 485
        float width = (numLayers/3.0f)/(numLayers-1);
352
        mCornerMeshes[indexCornerEdge] = FactoryCubit.getInstance().createMinxCornerMesh(numLayers,width);
486
        mCornerMeshes[indexCornerEdge] = createCornerMesh(numLayers,width);
353 487
        }
354 488
      mesh = mCornerMeshes[indexCornerEdge].copy(true);
355 489
      }
......
363 497
        float height= tmp*COS18;
364 498
        float width = tmp + (type/2)*tmp*SIN18;
365 499

  
366
        mEdgeMeshes[indexCornerEdge][type] = FactoryCubit.getInstance().createKilominxEdgeMesh(numLayers,width,height, (type%2)==0 );
500
        mEdgeMeshes[indexCornerEdge][type] = createEdgeMesh(numLayers,width,height, (type%2)==0 );
367 501
        }
368 502

  
369 503
      mesh = mEdgeMeshes[indexCornerEdge][type].copy(true);
......
375 509
      if( mCenterMeshes[indexCenter]==null )
376 510
        {
377 511
        float width = (1+0.5f*(numLayers-3)*SIN18)*(numLayers/3.0f)/(numLayers-1);
378
        mCenterMeshes[indexCenter] = FactoryCubit.getInstance().createKilominxCenterMesh(width);
512
        mCenterMeshes[indexCenter] = createCenterMesh(width);
379 513
        }
380 514

  
381 515
      mesh = mCenterMeshes[indexCenter].copy(true);
......
487 621
    int variant = face/COLORS;
488 622
    int numLayers = getNumLayers();
489 623

  
490
    if( variant == (numLayers-1)/2 || numLayers==3 )
624
    if( variant == (numLayers-1)/2 || numLayers==3 ) // center
491 625
      {
492
      float S = 0.07f;
493
      float R = 0.09f;
494

  
495
      float A = 0.86f;
496
      float X1= (SQ5+1)/8;
497
      float Y1= (float)(Math.sqrt(2+0.4f*SQ5)/4);
498
      float Y2= Y1 - (float)(Math.sqrt(10-2*SQ5)/8);
626
      float R = 0.10f;
627
      float S = 0.09f;
628
      float A = 0.87f;
629
      float[] vertices = { -0.36616942f, -0.36327124f, 0.5f, -0.36327124f, 0.23233888f, 0.4605048f, -0.36616942f, 0.26603764f };
499 630

  
500
      float[] vertices = { -X1, Y2, 0, -A*Y1, X1, Y2, 0, Y1 };
631
      float cx = vertices[2];
632
      float cy = vertices[3];
633
      vertices[2] *= A;
634
      vertices[3] *= A;
501 635

  
502 636
      FactorySticker factory = FactorySticker.getInstance();
503 637
      factory.drawRoundedPolygon(canvas, paint, left, top, vertices, S, FACE_COLORS[face%NUM_FACES], R);
504

  
505
      float MID = TEXTURE_HEIGHT*0.5f;
506
      float WID = TEXTURE_HEIGHT*0.1f;
507
      float HEI = TEXTURE_HEIGHT*(0.47f+Y1);
508
      canvas.drawLine(left+MID-WID,top+HEI,left+MID+WID,top+HEI,paint);
638
      canvas.drawCircle(left+(0.5f+cx)*TEXTURE_HEIGHT, top+(0.5f-cy)*TEXTURE_HEIGHT, 0.05f*TEXTURE_HEIGHT, paint);
509 639
      }
510
    else if( variant==0 )
640
    else if( variant==0 ) // corner
511 641
      {
512
      float Y = COS54/(2*SIN54);
513
      float R = 0.09f;
514
      float S = 0.09f;
515
      float[] vertices = { -0.5f, 0.0f, 0.0f, -Y, 0.5f, 0.0f, 0.0f, Y };
642
      float R = 0.10f;
643
      float S = 0.11f;
644
      float[] vertices = { -0.36327127f, -0.5f, 0.36327127f, -0.26393202f, 0.36327127f, 0.5f, -0.36327127f, 0.26393202f };
516 645

  
517 646
      FactorySticker factory = FactorySticker.getInstance();
518 647
      factory.drawRoundedPolygon(canvas, paint, left, top, vertices, S, FACE_COLORS[face%COLORS], R);
519 648
      }
520
    else
649
    else  // edge
521 650
      {
522
      float R = 0.07f;
523
      float S = 0.07f;
524

  
525
      float tmp   = (numLayers/3.0f)/(numLayers-1);
526
      float height= tmp*COS18;
527
      float width = tmp + (variant-1)*tmp*SIN18;
528
      float D = height/COS18;
529
      float W = D*SIN18;
530
      float X1 = height/2;
531
      float Y1 = width/2;
532
      float[] vertices = { -X1,-Y1, X1, -Y1, X1, Y1+W,-X1, Y1 };
651
      float R = 0.10f;
652
      float S = 0.10f;
653
      float[] vertices = { -0.3249197f, -0.39442718f, 0.3249197f, -0.39442718f, 0.3249197f, 0.5f, -0.3249197f, 0.2888544f };
533 654

  
534 655
      FactorySticker factory = FactorySticker.getInstance();
535 656
      factory.drawRoundedPolygon(canvas, paint, left, top, vertices, S, FACE_COLORS[face%COLORS], R);
src/main/java/org/distorted/objects/TwistyMegaminx.java
286 286
      if( mCornerMeshes[index]==null )
287 287
        {
288 288
        float width = (numLayers/3.0f)*(0.5f-MEGA_D)/(0.5f*(numLayers-1));
289
        mCornerMeshes[index] = FactoryCubit.getInstance().createMinxCornerMesh(numLayers, width);
289
        mCornerMeshes[index] = createCornerMesh(numLayers, width);
290 290
        }
291 291
      mesh = mCornerMeshes[index].copy(true);
292 292
      }
......
418 418

  
419 419
    if( variant==0 )
420 420
      {
421
      float Y = COS54/(2*SIN54);
422
      R = 0.070f;
423
      S = 0.08f;
424
      vertices = new float[] { -0.5f, 0.0f, 0.0f, -Y, 0.5f, 0.0f, 0.0f, Y };
421
      R = 0.080f;
422
      S = 0.10f;
423
      vertices = new float[] { -0.36327127f, -0.5f, 0.36327127f, -0.26393202f, 0.36327127f, 0.5f, -0.36327127f, 0.26393202f };
425 424
      }
426 425
    else
427 426
      {
......
436 435
        float Y1 = 0.5f*width;
437 436
        float Y2 = 0.5f*width + W;
438 437

  
439
        R = 0.05f;
440
        S = 0.06f;
438
        R = 0.045f;
439
        S = 0.055f;
441 440
        vertices = new float[] { -X1, Y1, -X1, -Y1, X1, -Y2, X1, Y2 };
442 441
        }
443 442
      else
......
448 447
        float X2 = Z*COS18;
449 448
        float Y2 = Z*SIN18;
450 449

  
451
        R = 0.10f;
450
        R = 0.09f;
452 451
        S = 0.08f;
453 452
        vertices = new float[] { -X1,+Y1, -X2,-Y2, 0.0f,-Z, +X2,-Y2, +X1,+Y1 };
454 453
        }
src/main/java/org/distorted/objects/TwistyMinx.java
21 21

  
22 22
import android.content.res.Resources;
23 23

  
24
import org.distorted.helpers.FactoryCubit;
24 25
import org.distorted.library.main.DistortedEffects;
25 26
import org.distorted.library.main.DistortedTexture;
27
import org.distorted.library.mesh.MeshBase;
26 28
import org.distorted.library.mesh.MeshSquare;
27 29
import org.distorted.library.type.Static3D;
28 30
import org.distorted.library.type.Static4D;
29 31

  
30 32
import java.util.Random;
31 33

  
34
import static org.distorted.helpers.FactoryCubit.COS18;
35
import static org.distorted.helpers.FactoryCubit.COS_HALFD;
36
import static org.distorted.helpers.FactoryCubit.SIN18;
37
import static org.distorted.helpers.FactoryCubit.SIN54;
38
import static org.distorted.helpers.FactoryCubit.SIN_HALFD;
39

  
32 40
///////////////////////////////////////////////////////////////////////////////////////////////////
33 41

  
34 42
abstract class TwistyMinx extends TwistyObject
......
376 384
    return chances;
377 385
    }
378 386

  
387
///////////////////////////////////////////////////////////////////////////////////////////////////
388

  
389
  MeshBase createCornerMesh(int numLayers, float width)
390
    {
391
    float A = (2*SQ3/3)*SIN54;
392
    float B = 0.4f;
393
    int   N = numLayers==3 ? 5 : 3;
394
    int   E = numLayers==3 ? 4 : 1;
395

  
396
    double X = width*COS18*SIN_HALFD;
397
    double Y = width*SIN18;
398
    double Z = width*COS18*COS_HALFD;
399

  
400
    double[][] vertices = new double[][]
401
        {
402
            { 0.0, 0.0      , 0.0 },
403
            {   X,   Y      ,  -Z },
404
            { 0.0, 2*Y      ,-2*Z },
405
            {  -X,   Y      ,  -Z },
406
            { 0.0, 0.0-width, 0.0 },
407
            {   X,   Y-width,  -Z },
408
            { 0.0, 2*Y-width,-2*Z },
409
            {  -X,   Y-width,  -Z },
410
        };
411

  
412
    int[][] vertIndexes = new int[][]
413
        {
414
            {4,5,1,0},
415
            {7,4,0,3},
416
            {0,1,2,3},
417
            {4,5,6,7},
418
            {6,5,1,2},
419
            {7,6,2,3}
420
        };
421

  
422
    float[][] bands     = new float[][]
423
      {
424
         {0.04f,34,0.3f,0.2f, N, 1, 1},
425
         {0.00f, 0,0.0f,0.0f, 2, 1, E}
426
      };
427
    int[] bandIndexes   = new int[] { 0,0,0,1,1,1};
428
    float[][] corners   = new float[][] { {0.04f,0.10f} };
429
    int[] cornerIndexes = new int[] { 0,-1,-1,-1,-1,-1,-1,-1 };
430
    float[][] centers   = new float[][] { {0.0f, -(float)Math.sqrt(1-A*A)*B,-A*B} };
431
    int[] centerIndexes = new int[] { 0,-1,-1,-1,-1,-1,-1,-1 };
432

  
433
    FactoryCubit factory = FactoryCubit.getInstance();
434
    factory.createNewFaceTransform(vertices,vertIndexes);
435

  
436
    return factory.createRoundedSolid(vertices, vertIndexes,
437
                                      bands, bandIndexes,
438
                                      corners, cornerIndexes,
439
                                      centers, centerIndexes,
440
                                      getNumCubitFaces() );
441
    }
442

  
379 443
///////////////////////////////////////////////////////////////////////////////////////////////////
380 444
// PUBLIC API
381 445

  

Also available in: Unified diff