Project

General

Profile

« Previous | Next » 

Revision 45aedaa7

Added by Leszek Koltunski 10 months ago

Progress with a generic FactoryBandaged.

View differences:

src/main/java/org/distorted/objectlib/bandaged/FactoryBandaged.java
10 10
package org.distorted.objectlib.bandaged;
11 11

  
12 12
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
13
import static org.distorted.objectlib.main.TwistyObject.SQ2;
14
import static org.distorted.objectlib.main.TwistyObject.SQ5;
13 15
import static org.distorted.objectlib.objects.TwistyBandagedCuboid.REGION_SIZE;
14 16
import static org.distorted.objectlib.objects.TwistyBandagedCuboid.STRENGTH;
15 17

  
......
21 23
import org.distorted.objectlib.helpers.ObjectVertexEffects;
22 24

  
23 25
import java.util.ArrayList;
26
import java.util.Collections;
27
import java.util.Comparator;
24 28

  
25 29
///////////////////////////////////////////////////////////////////////////////////////////////////
26 30

  
27 31
abstract public class FactoryBandaged
28 32
  {
33
  private static class BandagedCubitFace
34
    {
35
    private static final float[] sortVect = new float[] { 1/(2*SQ2), SQ2/(2*SQ2), SQ5/(2*SQ2) };
36

  
37
    float[] vertices;
38
    float[] center;
39
    float[] normal;
40
    float centerCast;
41

  
42
    BandagedCubitFace(float[] verts)
43
      {
44
      vertices = verts;
45
      computeCenter();
46
      computeNormal();
47
      computeCenterCast();
48
      }
49

  
50
    private void computeCenter()
51
      {
52
      int num = vertices.length/3;
53
      center = new float[3];
54

  
55
      for(int v=0; v<num; v++)
56
        {
57
        center[0] += vertices[3*v  ];
58
        center[1] += vertices[3*v+1];
59
        center[2] += vertices[3*v+2];
60
        }
61

  
62
      center[0] /= num;
63
      center[1] /= num;
64
      center[2] /= num;
65
      }
66

  
67
    private void computeNormal()
68
      {
69
      normal = new float[3];
70

  
71
      float x1 = vertices[0];
72
      float y1 = vertices[1];
73
      float z1 = vertices[2];
74
      float x2 = vertices[3];
75
      float y2 = vertices[4];
76
      float z2 = vertices[5];
77
      float x3 = vertices[6];
78
      float y3 = vertices[7];
79
      float z3 = vertices[8];
80

  
81
      float v1x = x2-x1;
82
      float v1y = y2-y1;
83
      float v1z = z2-z1;
84
      float v2x = x3-x1;
85
      float v2y = y3-y1;
86
      float v2z = z3-z1;
87

  
88
      normal[0] = v1y*v2z - v2y*v1z;
89
      normal[1] = v1z*v2x - v2z*v1x;
90
      normal[2] = v1x*v2y - v2x*v1y;
91

  
92
      double len = normal[0]*normal[0] + normal[1]*normal[1] + normal[2]*normal[2];
93
      len = Math.sqrt(len);
94
      normal[0] /= len;
95
      normal[1] /= len;
96
      normal[2] /= len;
97
      }
98

  
99
    private void computeCenterCast()
100
      {
101
      centerCast = center[0]*sortVect[0] + center[1]*sortVect[1] + center[2]*sortVect[2];
102
      }
103
    }
104

  
105
  static class SortByCenterCast implements Comparator<BandagedCubitFace>
106
    {
107
    public int compare(BandagedCubitFace a, BandagedCubitFace b)
108
      {
109
      float diff = a.centerCast - b.centerCast;
110
      return diff>0 ? 1: diff==0 ? 0: -1;
111
      }
112
    }
113

  
29 114
  private ArrayList<float[]> mTmpArray;
30 115
  private float[] mDist3D;
31 116
  private int[][] mFaceBelongsBitmap;
......
63 148
  abstract float[] getDist3D();
64 149
  abstract float[][] getBands(boolean iconMode);
65 150
  abstract float[][] getCuts(int[] numLayers);
66
  abstract float[] elementVertices(int ax, boolean left, int element);
67
  abstract boolean elementFaceNotNull(int ax, boolean left, int element);
68 151
  abstract int getElementVariant(float x, float y, float z);
69 152
  abstract int diameterMap(float diameter);
153
  abstract float[][] getVertices(int variant);
154
  abstract int[][] getIndices(int variant);
70 155

  
71 156
///////////////////////////////////////////////////////////////////////////////////////////////////
72 157

  
......
335 420
      }
336 421
    }
337 422

  
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339

  
340
  boolean elementDoesntExist(int[] p)
341
    {
342
    boolean res;
343

  
344
    for(int i=0; i<mNumElements; i++)
345
      {
346
      int[] row = mElements[i].getRotRow();
347
      res = true;
348

  
349
      for(int j=0; j<mNumAxis; j++)
350
        if( row[j]!=p[j] )
351
          {
352
          res = false;
353
          break;
354
          }
355

  
356
      if( res ) return false;
357
      }
358

  
359
    return true;
360
    }
361

  
362 423
///////////////////////////////////////////////////////////////////////////////////////////////////
363 424

  
364 425
  static boolean vertInFace(float[] vertex, float[] move, Static3D faceAxis, float dist)
......
505 566

  
506 567
///////////////////////////////////////////////////////////////////////////////////////////////////
507 568

  
508
  private boolean elementsFormSection(int e1, int e2, int ax)
569
  private float[] buildFaceVertices(float[][] vertices, int[] indices, float[] pos)
509 570
    {
510
    int[] r1 = mElements[e1].getRotRow();
511
    int[] r2 = mElements[e2].getRotRow();
571
    int num = indices.length;
572
    float[] ret = new float[3*num];
512 573

  
513
    if( r1[ax]==r2[ax] )
574
    for(int i=0; i<num; i++)
514 575
      {
515
      int dist=0;
576
      float[] v = vertices[indices[i]];
577
      ret[3*i  ] = v[0] + pos[0];
578
      ret[3*i+1] = v[1] + pos[1];
579
      ret[3*i+2] = v[2] + pos[2];
580
      }
581

  
582
    return ret;
583
    }
584

  
585
///////////////////////////////////////////////////////////////////////////////////////////////////
516 586

  
517
      for(int i=0; i<mNumAxis; i++)
587
  private void removeInternalWalls(ArrayList<BandagedCubitFace> list)
588
    {
589
    Collections.sort(list,new SortByCenterCast());
590

  
591
    int numElements = list.size();
592
    final float MAXDIFF = 0.01f;
593

  
594
    for(int e=0; e<numElements; e++)
595
      {
596
      int ne = e+1;
597
      BandagedCubitFace f1 = list.get(e);
598
      float[] center = f1.center;
599

  
600
      while( ne<numElements )
518 601
        {
519
        int d=r1[i]-r2[i];
520
        dist+=d*d;
521
        }
602
        BandagedCubitFace f2 = list.get(ne);
603
        float diff = f2.centerCast-f1.centerCast;
522 604

  
523
      return dist==1;
605
        if( diff>-MAXDIFF && diff<MAXDIFF )
606
          {
607
          float[] c = f2.center;
608
          float dx = c[0]-center[0];
609
          float dy = c[1]-center[1];
610
          float dz = c[2]-center[2];
611

  
612
          float d = dx*dx + dy*dy + dz*dz;
613

  
614
          if( d>-MAXDIFF && d<MAXDIFF )
615
            {
616
            list.remove(ne);
617
            list.remove(e);
618
            numElements -= 2;
619
            e--;
620
            break;
621
            }
622
          }
623
        else break;
624

  
625
        ne++;
626
        }
524 627
      }
525
    return false;
526 628
    }
527 629

  
528 630
///////////////////////////////////////////////////////////////////////////////////////////////////
529 631

  
530
  private int computeConnectedSection(int element, int ax, boolean[] walls, int[] output, int index)
632
  private float[][] getNextSection(ArrayList<BandagedCubitFace> list)
531 633
    {
532
    int found = index;
634
    int numElements = list.size();
635
    if( numElements==0 ) return null;
533 636

  
534
    for(int e=0; e<mNumElements; e++)
535
      if( walls[e] && elementsFormSection(element,e,ax) )
637
    final float MAXDIFF = 0.01f;
638
    float[][] ret = new float[numElements][];
639
    BandagedCubitFace bcf = list.remove(0);
640
    float[] normal = bcf.normal;
641
    int removed = 1;
642

  
643
    ret[0] = bcf.vertices;
644

  
645
    for(int e=0; e<numElements-1; e++)
646
      {
647
      BandagedCubitFace f = list.get(e);
648
      float[] n = f.normal;
649

  
650
      float dx = n[0]-normal[0];
651
      float dy = n[1]-normal[1];
652
      float dz = n[2]-normal[2];
653

  
654
      float diff = dx*dx + dy*dy + dz*dz;
655

  
656
      if( diff>-MAXDIFF && diff<MAXDIFF )
536 657
        {
537
        walls[e] = false;
538
        output[found++] = e;
539
        found = computeConnectedSection(e,ax,walls,output,found);
658
        list.remove(e);
659
        e--;
660
        numElements--;
661
        ret[removed++] = f.vertices;
540 662
        }
663
      }
541 664

  
542
    return found;
665
    float[][] ret2 = new float[removed][];
666
    for(int i=0; i<removed; i++) ret2[i] = ret[i];
667

  
668
    return ret2;
543 669
    }
544 670

  
545 671
///////////////////////////////////////////////////////////////////////////////////////////////////
546 672

  
547
  private void buildAllSections(int ax, boolean left, boolean[] walls, ArrayList<float[][]> list)
673
  private boolean isConnected(float[] face1, float[] face2)
548 674
    {
549
    int numElements = 0;
550
    for(int i=0; i<mNumElements; i++)
551
      if( walls[i] ) numElements++;
552

  
553
    int[] tmp = new int[numElements];
675
    float MAXDIFF = 0.01f;
676
    int l1 = face1.length/3;
677
    int l2 = face2.length/3;
554 678

  
555
    while( numElements>0 )
679
    for(int i=0; i<l1; i++)
556 680
      {
557
      int element = 0;
681
      float x = face1[3*i  ];
682
      float y = face1[3*i+1];
683
      float z = face1[3*i+2];
558 684

  
559
      for( ; element<mNumElements; element++)
560
        if( walls[element] )
685
      for(int j=0; j<l2; j++)
686
        {
687
        float dx = x-face2[3*j  ];
688
        float dy = y-face2[3*j+1];
689
        float dz = z-face2[3*j+2];
690

  
691
        if( dx*dx + dy*dy + dz*dz < MAXDIFF )
561 692
          {
562
          walls[element] = false;
563
          tmp[0] = element;
564
          break;
693
          int inext = i==l1-1 ? 0 : i+1;
694
          int jprev = j==0 ? l2-1 : j-1;
695

  
696
          dx = face1[3*inext  ] - face2[3*jprev  ];
697
          dy = face1[3*inext+1] - face2[3*jprev+1];
698
          dz = face1[3*inext+2] - face2[3*jprev+2];
699

  
700
          if( dx*dx + dy*dy + dz*dz < MAXDIFF ) return true;
701

  
702
          int iprev = i==0 ? l1-1 : i-1;
703
          int jnext = j==l2-1 ? 0 : j+1;
704

  
705
          dx = face1[3*iprev  ] - face2[3*jnext  ];
706
          dy = face1[3*iprev+1] - face2[3*jnext+1];
707
          dz = face1[3*iprev+2] - face2[3*jnext+2];
708

  
709
          return dx*dx + dy*dy + dz*dz < MAXDIFF;
565 710
          }
711
        }
712
      }
566 713

  
567
      int elementsInSection = computeConnectedSection(element, ax, walls, tmp, 1);
568
      float[][] newSection = new float[elementsInSection][];
714
    return false;
715
    }
569 716

  
570
      for(int i=0; i<elementsInSection; i++)
571
        newSection[i] = elementVertices(ax, left, tmp[i]);
717
///////////////////////////////////////////////////////////////////////////////////////////////////
572 718

  
573
      list.add(newSection);
719
  private float[][] getNextConnected(float[][] section, int nonNull)
720
    {
721
    float[][] ret = new float[nonNull][];
722
    int start,len = section.length;
723

  
724
    for(start=0; start<len; start++)
725
      if( section[start]!=null )
726
        {
727
        ret[0] = section[start];
728
        section[start] = null;
729
        break;
730
        }
731

  
732
    int current = 0;
733
    int last = start;
734

  
735
    do
736
      {
737
      start++;
574 738

  
575
      numElements -= elementsInSection;
739
      for(int i=start; i<len; i++)
740
        if( section[i]!=null && isConnected(ret[current],section[i]) )
741
          {
742
          last++;
743
          current++;
744
          ret[current] = section[i];
745
          section[i] = null;
746
          }
576 747
      }
748
    while(last>start);
749

  
750
    float[][] ret2 = new float[current+1][];
751
    for(int i=0; i<=current; i++) ret2[i] = ret[i];
752

  
753
    return ret2;
577 754
    }
578 755

  
579 756
///////////////////////////////////////////////////////////////////////////////////////////////////
580 757

  
581 758
  private void fillUpVertexArray()
582 759
    {
583
    boolean[][][] walls = new boolean[mNumAxis][2][mNumElements];
584

  
585
    int[] tmp = new int[mNumAxis];
760
    ArrayList<BandagedCubitFace> list = new ArrayList<>();
586 761

  
587 762
    for(int e=0; e<mNumElements; e++)
588 763
      {
589
      int[] row = mElements[e].getRotRow();
590
      for(int t=0; t<mNumAxis; t++) tmp[t]=row[t];
764
      int variant = mElements[e].getVariant();
765
      float[][] verts = getVertices(variant);
766
      int[][] inds = getIndices(variant);
767
      float[] pos = mElements[e].getPos();
591 768

  
592
      for(int a=0; a<mNumAxis; a++)
769
      for( int[] ind : inds)
593 770
        {
594
        tmp[a] = row[a]+1;
595
        walls[a][0][e] = (elementDoesntExist(tmp) && elementFaceNotNull(a,true ,e));
596
        tmp[a] = row[a]-1;
597
        walls[a][1][e] = (elementDoesntExist(tmp) && elementFaceNotNull(a,false,e));
598
        tmp[a] = row[a];
771
        float[] vertices = buildFaceVertices(verts,ind,pos);
772
        BandagedCubitFace face = new BandagedCubitFace(vertices);
773
        list.add(face);
599 774
        }
600 775
      }
601 776

  
602
    for(int a=0; a<mNumAxis; a++)
777
    removeInternalWalls(list);
778

  
779
    while(true)
603 780
      {
604
      buildAllSections(a, true,  walls[a][0], mVertexArray );
605
      buildAllSections(a, false, walls[a][1], mVertexArray );
781
      float[][] section = getNextSection(list);
782

  
783
      if( section!=null )
784
        {
785
        int nonNull = section.length;
786

  
787
        while(nonNull>0)
788
          {
789
          float[][] connected = getNextConnected(section,nonNull);
790
          nonNull -= connected.length;
791
          mVertexArray.add(connected);
792
          }
793
        }
794
      else break;
606 795
      }
607 796
    }
608 797

  
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedCuboid.java
35 35

  
36 36
///////////////////////////////////////////////////////////////////////////////////////////////////
37 37

  
38
  public float[] elementVertices(int ax, boolean left, int element)
38
  public float[][] getVertices(int variant)
39 39
    {
40
    float[] pos = mElements[element].getPos();
41
    float[] ret = new float[12];
42

  
43
    switch(ax)
40
    return new float[][]
44 41
      {
45
      case 0: if( left )
46
                {
47
                ret[ 0] = pos[0]-0.5f;
48
                ret[ 1] = pos[1]+0.5f;
49
                ret[ 2] = pos[2]-0.5f;
50
                ret[ 3] = pos[0]-0.5f;
51
                ret[ 4] = pos[1]-0.5f;
52
                ret[ 5] = pos[2]-0.5f;
53
                ret[ 6] = pos[0]-0.5f;
54
                ret[ 7] = pos[1]-0.5f;
55
                ret[ 8] = pos[2]+0.5f;
56
                ret[ 9] = pos[0]-0.5f;
57
                ret[10] = pos[1]+0.5f;
58
                ret[11] = pos[2]+0.5f;
59
                }
60
              else
61
                {
62
                ret[ 0] = pos[0]+0.5f;
63
                ret[ 1] = pos[1]+0.5f;
64
                ret[ 2] = pos[2]+0.5f;
65
                ret[ 3] = pos[0]+0.5f;
66
                ret[ 4] = pos[1]-0.5f;
67
                ret[ 5] = pos[2]+0.5f;
68
                ret[ 6] = pos[0]+0.5f;
69
                ret[ 7] = pos[1]-0.5f;
70
                ret[ 8] = pos[2]-0.5f;
71
                ret[ 9] = pos[0]+0.5f;
72
                ret[10] = pos[1]+0.5f;
73
                ret[11] = pos[2]-0.5f;
74
                }
75
              break;
76
      case 1: if( left )
77
                {
78
                ret[ 0] = pos[0]-0.5f;
79
                ret[ 1] = pos[1]-0.5f;
80
                ret[ 2] = pos[2]+0.5f;
81
                ret[ 3] = pos[0]-0.5f;
82
                ret[ 4] = pos[1]-0.5f;
83
                ret[ 5] = pos[2]-0.5f;
84
                ret[ 6] = pos[0]+0.5f;
85
                ret[ 7] = pos[1]-0.5f;
86
                ret[ 8] = pos[2]-0.5f;
87
                ret[ 9] = pos[0]+0.5f;
88
                ret[10] = pos[1]-0.5f;
89
                ret[11] = pos[2]+0.5f;
90
                }
91
              else
92
                {
93
                ret[ 0] = pos[0]-0.5f;
94
                ret[ 1] = pos[1]+0.5f;
95
                ret[ 2] = pos[2]-0.5f;
96
                ret[ 3] = pos[0]-0.5f;
97
                ret[ 4] = pos[1]+0.5f;
98
                ret[ 5] = pos[2]+0.5f;
99
                ret[ 6] = pos[0]+0.5f;
100
                ret[ 7] = pos[1]+0.5f;
101
                ret[ 8] = pos[2]+0.5f;
102
                ret[ 9] = pos[0]+0.5f;
103
                ret[10] = pos[1]+0.5f;
104
                ret[11] = pos[2]-0.5f;
105
                }
106
              break;
107
      case 2: if( left )
108
                {
109
                ret[ 0] = pos[0]+0.5f;
110
                ret[ 1] = pos[1]+0.5f;
111
                ret[ 2] = pos[2]-0.5f;
112
                ret[ 3] = pos[0]+0.5f;
113
                ret[ 4] = pos[1]-0.5f;
114
                ret[ 5] = pos[2]-0.5f;
115
                ret[ 6] = pos[0]-0.5f;
116
                ret[ 7] = pos[1]-0.5f;
117
                ret[ 8] = pos[2]-0.5f;
118
                ret[ 9] = pos[0]-0.5f;
119
                ret[10] = pos[1]+0.5f;
120
                ret[11] = pos[2]-0.5f;
121
                }
122
              else
123
                {
124
                ret[ 0] = pos[0]-0.5f;
125
                ret[ 1] = pos[1]+0.5f;
126
                ret[ 2] = pos[2]+0.5f;
127
                ret[ 3] = pos[0]-0.5f;
128
                ret[ 4] = pos[1]-0.5f;
129
                ret[ 5] = pos[2]+0.5f;
130
                ret[ 6] = pos[0]+0.5f;
131
                ret[ 7] = pos[1]-0.5f;
132
                ret[ 8] = pos[2]+0.5f;
133
                ret[ 9] = pos[0]+0.5f;
134
                ret[10] = pos[1]+0.5f;
135
                ret[11] = pos[2]+0.5f;
136
                }
137
              break;
138
      }
139

  
140
    return ret;
42
        { 0.5f, 0.5f, 0.5f },
43
        { 0.5f, 0.5f,-0.5f },
44
        { 0.5f,-0.5f, 0.5f },
45
        { 0.5f,-0.5f,-0.5f },
46
        {-0.5f, 0.5f, 0.5f },
47
        {-0.5f, 0.5f,-0.5f },
48
        {-0.5f,-0.5f, 0.5f },
49
        {-0.5f,-0.5f,-0.5f },
50
      };
141 51
    }
142 52

  
143 53
///////////////////////////////////////////////////////////////////////////////////////////////////
144 54

  
145
  public boolean elementFaceNotNull(int ax, boolean left, int element)
146
     {
147
     return true;
148
     }
55
  public int[][] getIndices(int variant)
56
    {
57
    return new int[][]
58
      {
59
        {2,3,1,0},
60
        {7,6,4,5},
61
        {4,0,1,5},
62
        {7,3,2,6},
63
        {6,2,0,4},
64
        {3,7,5,1}
65
      };
66
    }
149 67

  
150 68
///////////////////////////////////////////////////////////////////////////////////////////////////
151 69

  
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedMegaminx.java
80 80

  
81 81
///////////////////////////////////////////////////////////////////////////////////////////////////
82 82

  
83
  public float[] elementVertices(int ax, boolean left, int element)
83
  public float[][] getVertices(int variant)
84 84
    {
85
    int variant = mElements[element].getVariant();
86
    float[] pos = mElements[element].getPos();
87

  
88 85
    return null;
89 86
    }
90 87

  
91 88
///////////////////////////////////////////////////////////////////////////////////////////////////
92 89

  
93
  public boolean elementFaceNotNull(int ax, boolean left, int element)
90
  public int[][] getIndices(int variant)
94 91
    {
95
    int variant = mElements[element].getVariant();
96
    return ( variant==0 || !left );
92
    return null;
97 93
    }
98 94

  
99 95
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/objectlib/bandaged/FactoryBandagedPyraminx.java
14 14
import static org.distorted.objectlib.main.TwistyObject.SQ6;
15 15

  
16 16
import org.distorted.library.type.Static3D;
17
import org.distorted.objectlib.touchcontrol.TouchControlDodecahedron;
18 17
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
19 18

  
20 19
///////////////////////////////////////////////////////////////////////////////////////////////////
21 20

  
22 21
public class FactoryBandagedPyraminx extends FactoryBandaged
23 22
  {
24
  private static final float[][] TET_VER =
25
          {
26
                  {    0,-SQ2/4,-0.5f },
27
                  {    0,-SQ2/4, 0.5f },
28
                  { 0.5f, SQ2/4,    0 },
29
                  {-0.5f, SQ2/4,    0 }
30
          };
31
  private static final float[][] OCT_VER =
32
          {
33
                  {    0, SQ2/2,    0 },
34
                  {    0,-SQ2/2,    0 },
35
                  { 0.5f,     0, 0.5f },
36
                  { 0.5f,     0,-0.5f },
37
                  {-0.5f,     0,-0.5f },
38
                  {-0.5f,     0, 0.5f },
39
          };
40

  
41 23
  private static FactoryBandagedPyraminx mThis;
42 24

  
43 25
///////////////////////////////////////////////////////////////////////////////////////////////////
......
57 39

  
58 40
///////////////////////////////////////////////////////////////////////////////////////////////////
59 41

  
60
  private float[] tetVertices(int ax, boolean left, float[] pos)
42
  public float[][] getVertices(int variant)
61 43
    {
62
    if( !left )
44
    if( variant==0 )
63 45
      {
64
      int i1=-1,i2=-1,i3=-1;
65

  
66
      switch(ax)
67
        {
68
        case 0: i1=1; i2=2; i3=3; break;
69
        case 1: i1=0; i2=3; i3=2; break;
70
        case 2: i1=0; i2=1; i3=3; break;
71
        case 3: i1=0; i2=2; i3=1; break;
72
        }
73

  
74
      float[] T1 = TET_VER[i1];
75
      float[] T2 = TET_VER[i2];
76
      float[] T3 = TET_VER[i3];
77

  
78
      return new float[] { pos[0]+T1[0], pos[1]+T1[1], pos[2]+T1[2],
79
                           pos[0]+T2[0], pos[1]+T2[1], pos[2]+T2[2],
80
                           pos[0]+T3[0], pos[1]+T3[1], pos[2]+T3[2] };
46
      return new float[][] { { 0.5f,0.0f,0.5f},{ 0.5f,0.0f,-0.5f},{-0.5f,0.0f,-0.5f},{-0.5f,0.0f,0.5f},{ 0.0f,SQ2/2,0.0f},{ 0.0f,-SQ2/2,0.0f} };
47
      }
48
    else
49
      {
50
      return new float[][] { {-0.5f, SQ2/4, 0.0f},{ 0.5f, SQ2/4, 0.0f},{ 0.0f,-SQ2/4, 0.5f},{ 0.0f,-SQ2/4,-0.5f} };
81 51
      }
82

  
83
    return null;
84 52
    }
85 53

  
86 54
///////////////////////////////////////////////////////////////////////////////////////////////////
87 55

  
88
  private float[] octVertices(int ax, boolean left, float[] pos)
56
  public int[][] getIndices(int variant)
89 57
    {
90
    int i1=-1,i2=-1,i3=-1;
91

  
92
    if( left )
58
    if( variant==0 )
93 59
      {
94
      switch(ax)
95
        {
96
        case 0: i1=1; i2=4; i3=3; break;
97
        case 1: i1=1; i2=2; i3=5; break;
98
        case 2: i1=0; i2=2; i3=3; break;
99
        case 3: i1=0; i2=4; i3=5; break;
100
        }
60
      return new int[][] { {3,0,4},{0,1,4},{1,2,4},{2,3,4},{5,0,3},{5,1,0},{5,2,1},{5,3,2} };
101 61
      }
102 62
    else
103 63
      {
104
      switch(ax)
105
        {
106
        case 0: i1=0; i2=5; i3=2; break;
107
        case 1: i1=0; i2=3; i3=4; break;
108
        case 2: i1=1; i2=5; i3=4; break;
109
        case 3: i1=1; i2=3; i3=2; break;
110
        }
64
      return new int[][] { {2,1,0},{3,0,1},{3,2,0},{2,3,1} };
111 65
      }
112

  
113
    float[] T1 = OCT_VER[i1];
114
    float[] T2 = OCT_VER[i2];
115
    float[] T3 = OCT_VER[i3];
116

  
117
    return new float[] { pos[0]+T1[0], pos[1]+T1[1], pos[2]+T1[2],
118
                         pos[0]+T2[0], pos[1]+T2[1], pos[2]+T2[2],
119
                         pos[0]+T3[0], pos[1]+T3[1], pos[2]+T3[2] };
120
    }
121

  
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123

  
124
  public float[] elementVertices(int ax, boolean left, int element)
125
    {
126
    int variant = mElements[element].getVariant();
127
    float[] pos = mElements[element].getPos();
128

  
129
    if( variant==0 ) return octVertices(ax,left,pos);
130
    else             return tetVertices(ax,left,pos);
131
    }
132

  
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134

  
135
  public boolean elementFaceNotNull(int ax, boolean left, int element)
136
    {
137
    int variant = mElements[element].getVariant();
138
    return ( variant==0 || !left );
139 66
    }
140 67

  
141 68
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff