View Javadoc
1   package org.newdawn.slick.geom;
2   
3   import javax.annotation.Nonnull;
4   
5   /**
6    * A triangulator implementation that splits the triangules of another, subdividing
7    * to give a higher tesselation - and hence smoother transitions.
8    * 
9    * @author kevin
10   */
11  public class OverTriangulator implements Triangulator {
12      /**
13       * 
14       */
15      private static final long serialVersionUID = 1L;
16      /** The triangles data */
17      private final float[][] triangles;
18  
19      /**
20       * Create a new triangulator
21       *
22       * @param tris The original set of triangles to be sub-dividied
23       */
24      public OverTriangulator(@Nonnull Triangulator tris) {
25          triangles = new float[tris.getTriangleCount()*6*3][2];
26  
27          int tcount = 0;
28          for (int i=0;i<tris.getTriangleCount();i++) {
29              float cx = 0;
30              float cy = 0;
31              for (int p = 0;p < 3;p++) {
32                  float[] pt = tris.getTrianglePoint(i, p);
33                  cx += pt[0];
34                  cy += pt[1];
35              }
36  
37              cx /= 3;
38              cy /= 3;
39  
40              for (int p = 0;p < 3;p++) {
41                  int n = p +1;
42                  if (n > 2) {
43                      n = 0;
44                  }
45  
46                  float[] pt1 = tris.getTrianglePoint(i, p);
47                  float[] pt2 = tris.getTrianglePoint(i, n);
48  
49                  pt1[0] = (pt1[0] + pt2[0]) / 2;
50                  pt1[1] = (pt1[1] + pt2[1]) / 2;
51  
52                  triangles[(tcount * 3)][0] = cx;
53                  triangles[(tcount * 3)][1] = cy;
54                  triangles[(tcount *3) + 1][0] = pt1[0];
55                  triangles[(tcount *3) + 1][1] = pt1[1];
56                  triangles[(tcount *3) + 2][0] = pt2[0];
57                  triangles[(tcount *3) + 2][1] = pt2[1];
58                  tcount++;
59              }
60  
61              for (int p = 0;p < 3;p++) {
62                  int n = p +1;
63                  if (n > 2) {
64                      n = 0;
65                  }
66  
67                  float[] pt1 = tris.getTrianglePoint(i, p);
68                  float[] pt2 = tris.getTrianglePoint(i, n);
69  
70                  pt2[0] = (pt1[0] + pt2[0]) / 2;
71                  pt2[1] = (pt1[1] + pt2[1]) / 2;
72  
73                  triangles[(tcount * 3)][0] = cx;
74                  triangles[(tcount * 3)][1] = cy;
75                  triangles[(tcount *3) + 1][0] = pt1[0];
76                  triangles[(tcount *3) + 1][1] = pt1[1];
77                  triangles[(tcount *3) + 2][0] = pt2[0];
78                  triangles[(tcount *3) + 2][1] = pt2[1];
79                  tcount++;
80              }
81          }
82      }
83  
84      /**
85       * @see org.newdawn.slick.geom.Triangulator#addPolyPoint(float, float)
86       */
87      public void addPolyPoint(float x, float y) {
88      }
89  
90      /**
91       * @see org.newdawn.slick.geom.Triangulator#getTriangleCount()
92       */
93      public int getTriangleCount() {
94          return triangles.length / 3;
95      }
96  
97      /**
98       * @see org.newdawn.slick.geom.Triangulator#getTrianglePoint(int, int)
99       */
100     @Nonnull
101     public float[] getTrianglePoint(int tri, int i) {
102         float[] pt = triangles[(tri * 3)+i];
103 
104         return new float[] {pt[0],pt[1]};
105     }
106 
107     /**
108      * @see org.newdawn.slick.geom.Triangulator#startHole()
109      */
110     public void startHole() {
111     }
112 
113     /**
114      * @see org.newdawn.slick.geom.Triangulator#triangulate()
115      */
116     public boolean triangulate() {
117         return true;
118     }
119 
120 }