Project

General

Profile

Download (8.47 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / mesh / MeshPolygon.java @ ac6a08e7

1 808ef3aa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.library.mesh;
21
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23
/**
24
 * Create a polygon of any shape and varying elevations from the edges towards the center.
25
 * <p>
26
 * Specify a list of vertices. Any two adjacent vertices + the center (0,0,0) form a triangle. The
27
 * polygon is going to be split into such triangles, and each triange is split into adjustable number
28
 * of 'bands' form the outer edge towards the center. Edges of each band can can at any elevation.
29
 */
30
public class MeshPolygon extends MeshBase
31
  {
32
  private float[] mPolygonVertices;
33
  private int mNumPolygonVertices;
34
  private float[] mPolygonBands;
35
  private int mNumPolygonBands;
36
37
  private int remainingVert;
38
  private int numVertices;
39
40
///////////////////////////////////////////////////////////////////////////////////////////////////
41
// polygonVertices>=3 , polygonBands>=2
42
43
  private void computeNumberOfVertices(int numPolygonVertices, int numPolygonBands)
44
     {
45
     numVertices = (numPolygonVertices*numPolygonBands+2)*(numPolygonBands-1) - 1;
46 ac6a08e7 Leszek Koltunski
     remainingVert = numVertices;
47 808ef3aa Leszek Koltunski
     }
48
49
///////////////////////////////////////////////////////////////////////////////////////////////////
50
51
  private int addVertex(int vertex, int polyBand, int polyVertex, int index, float[] attribs1, float[] attribs2)
52
    {
53
    remainingVert--;
54
55 ac6a08e7 Leszek Koltunski
    if( polyBand<mNumPolygonBands-1 )
56
      {
57
      float band = mPolygonBands[2*polyBand  ];
58
      float elev = mPolygonBands[2*polyBand+1];
59
60
      float Xfirst  = mPolygonVertices[2*polyVertex  ];
61
      float Yfirst  = mPolygonVertices[2*polyVertex+1];
62
63
      int polyEndVer = polyVertex==mNumPolygonVertices-1 ? 0 : polyVertex+1;
64
65
      float Xlast   = mPolygonVertices[2*polyEndVer  ];
66
      float Ylast   = mPolygonVertices[2*polyEndVer+1];
67
68
      float quot = (float)index / (mNumPolygonBands-1-polyBand);
69 808ef3aa Leszek Koltunski
70 ac6a08e7 Leszek Koltunski
      float xEdge = Xfirst + quot*(Xlast-Xfirst);
71
      float yEdge = Yfirst + quot*(Ylast-Yfirst);
72 808ef3aa Leszek Koltunski
73 ac6a08e7 Leszek Koltunski
      float x = band*xEdge;
74
      float y = band*yEdge;
75 808ef3aa Leszek Koltunski
76 ac6a08e7 Leszek Koltunski
      int nextPolyBand = polyBand+1;
77
      int prevPolyBand = (polyBand==0 ? polyBand : polyBand-1);
78 808ef3aa Leszek Koltunski
79 ac6a08e7 Leszek Koltunski
      float concentricStep = mPolygonBands[2*nextPolyBand]-mPolygonBands[2*prevPolyBand];
80
      float nx = concentricStep*xEdge;
81
      float ny = concentricStep*yEdge;
82 808ef3aa Leszek Koltunski
83 ac6a08e7 Leszek Koltunski
      float nz = mPolygonBands[2*prevPolyBand+1]-mPolygonBands[2*nextPolyBand+1];
84
      float lenXYZ = (float)Math.sqrt(nx*nx + ny*ny + nz*nz);
85
      float lenXY  = (float)Math.sqrt(nx*nx + ny*ny);
86 808ef3aa Leszek Koltunski
87 ac6a08e7 Leszek Koltunski
      attribs1[VERT1_ATTRIBS*vertex + POS_ATTRIB  ] =    x;
88
      attribs1[VERT1_ATTRIBS*vertex + POS_ATTRIB+1] =    y;
89
      attribs1[VERT1_ATTRIBS*vertex + POS_ATTRIB+2] = elev;
90 808ef3aa Leszek Koltunski
91 ac6a08e7 Leszek Koltunski
      attribs1[VERT1_ATTRIBS*vertex + NOR_ATTRIB  ] = (nz*nx) / (lenXY*lenXYZ);
92
      attribs1[VERT1_ATTRIBS*vertex + NOR_ATTRIB+1] = (nz*ny) / (lenXY*lenXYZ);
93
      attribs1[VERT1_ATTRIBS*vertex + NOR_ATTRIB+2] = lenXY / lenXYZ;
94 808ef3aa Leszek Koltunski
95 ac6a08e7 Leszek Koltunski
      attribs2[VERT2_ATTRIBS*vertex + TEX_ATTRIB  ] = x+0.5f;
96
      attribs2[VERT2_ATTRIBS*vertex + TEX_ATTRIB+1] = y+0.5f;
97
      }
98
    else
99
      {
100
      attribs1[VERT1_ATTRIBS*vertex + POS_ATTRIB  ] = 0.0f;
101
      attribs1[VERT1_ATTRIBS*vertex + POS_ATTRIB+1] = 0.0f;
102
      attribs1[VERT1_ATTRIBS*vertex + POS_ATTRIB+2] = mPolygonBands[2*polyBand+1];
103
104
      attribs1[VERT1_ATTRIBS*vertex + NOR_ATTRIB  ] = 0.0f;
105
      attribs1[VERT1_ATTRIBS*vertex + NOR_ATTRIB+1] = 0.0f;
106
      attribs1[VERT1_ATTRIBS*vertex + NOR_ATTRIB+2] = 1.0f;
107
108
      attribs2[VERT2_ATTRIBS*vertex + TEX_ATTRIB  ] = 0.5f;
109
      attribs2[VERT2_ATTRIBS*vertex + TEX_ATTRIB+1] = 0.5f;
110
      }
111 808ef3aa Leszek Koltunski
112
    return vertex+1;
113
    }
114
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116
117
  private int createBandStrip(int vertex, int polyBand, int polyVertex, float[] attribs1, float[] attribs2)
118
    {
119
    if( polyVertex==0 )
120
      {
121
      vertex = addVertex(vertex,polyBand,polyVertex,0,attribs1,attribs2);
122
123
      if( polyBand>0 )
124
        {
125
        vertex = addVertex(vertex,polyBand,polyVertex,0,attribs1,attribs2);
126
        }
127
      }
128
129
    int numPairs = mNumPolygonBands-1-polyBand;
130
131
    for(int pair=0; pair<numPairs; pair++)
132
      {
133
      vertex = addVertex(vertex,polyBand+1,polyVertex,pair  ,attribs1,attribs2);
134
      vertex = addVertex(vertex,polyBand  ,polyVertex,pair+1,attribs1,attribs2);
135
      }
136
137
    return vertex;
138
    }
139
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141
142
  private void buildGrid(float[] attribs1, float[] attribs2)
143
    {
144
    int vertex=0;
145
146 ac6a08e7 Leszek Koltunski
    for(int polyBand=0; polyBand<mNumPolygonBands-1; polyBand++)
147 808ef3aa Leszek Koltunski
      for(int polyVertex=0; polyVertex<mNumPolygonVertices; polyVertex++)
148
        {
149 ac6a08e7 Leszek Koltunski
        vertex = createBandStrip(vertex,polyBand,polyVertex,attribs1,attribs2);
150 808ef3aa Leszek Koltunski
        }
151
    }
152
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
// PUBLIC API
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156
/**
157
 * Create a polygon of any shape and varying elevations from the edges towards the center.
158
 *
159
 * @param verticesXY 2N floats - packed description of polygon vertices. N pairs (x,y).
160
 * @param bands      2K floats; K pairs of two floats each describing a single band.
161
 *                   From (1.0,Z[0]) (outer edge, its Z elevation) to (0.0,Z[K]) (the center,
162
 *                   its elevation). The polygon is split into such concentric bands.
163 ac6a08e7 Leszek Koltunski
 *                   Must be band[2*i] > band[2*(i+1)] !
164 808ef3aa Leszek Koltunski
 */
165
  public MeshPolygon(float[] verticesXY, float[] bands)
166
    {
167
    super();
168
169
    mPolygonVertices      = verticesXY;
170
    mPolygonBands         = bands;
171
    mNumPolygonVertices   = mPolygonVertices.length /2;
172 ac6a08e7 Leszek Koltunski
    mNumPolygonBands      = mPolygonBands.length /2;
173 808ef3aa Leszek Koltunski
174
    computeNumberOfVertices(mNumPolygonVertices,mNumPolygonBands);
175
176
    float[] attribs1= new float[VERT1_ATTRIBS*numVertices];
177
    float[] attribs2= new float[VERT2_ATTRIBS*numVertices];
178
179
    buildGrid(attribs1,attribs2);
180
181
    if( remainingVert!=0 )
182
      android.util.Log.d("MeshPolygon", "remainingVert " +remainingVert );
183
184
    setAttribs(attribs1,attribs2);
185
    }
186
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188
/**
189
 * Copy constructor.
190
 */
191
  public MeshPolygon(MeshPolygon mesh, boolean deep)
192
    {
193
    super(mesh,deep);
194
    }
195
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197
/**
198
 * Copy the Mesh.
199
 *
200
 * @param deep If to be a deep or shallow copy of mVertAttribs1, i.e. the array holding vertices,
201
 *             normals and inflates (the rest, in particular the mVertAttribs2 containing texture
202
 *             coordinates and effect associations, is always deep copied)
203
 */
204
  public MeshPolygon copy(boolean deep)
205
    {
206
    return new MeshPolygon(this,deep);
207
    }
208
 }