Revision e54bfada
Added by Leszek Koltunski almost 4 years ago
src/main/java/org/distorted/library/mesh/MeshSphere.java | ||
---|---|---|
77 | 77 |
|
78 | 78 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
79 | 79 |
|
80 |
private void repeatVertex(float[] attribs) |
|
80 |
private void repeatVertex(float[] attribs1, float[] attribs2)
|
|
81 | 81 |
{ |
82 | 82 |
if( currentVert>0 ) |
83 | 83 |
{ |
84 |
attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB ] = attribs[VERT_ATTRIBS*(currentVert-1) + POS_ATTRIB ];
|
|
85 |
attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + POS_ATTRIB+1];
|
|
86 |
attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+2] = attribs[VERT_ATTRIBS*(currentVert-1) + POS_ATTRIB+2];
|
|
84 |
attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB ] = attribs1[VERT1_ATTRIBS*(currentVert-1) + POS_ATTRIB ];
|
|
85 |
attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+1] = attribs1[VERT1_ATTRIBS*(currentVert-1) + POS_ATTRIB+1];
|
|
86 |
attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+2] = attribs1[VERT1_ATTRIBS*(currentVert-1) + POS_ATTRIB+2];
|
|
87 | 87 |
|
88 |
attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB ] = attribs[VERT_ATTRIBS*(currentVert-1) + NOR_ATTRIB ];
|
|
89 |
attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + NOR_ATTRIB+1];
|
|
90 |
attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+2] = attribs[VERT_ATTRIBS*(currentVert-1) + NOR_ATTRIB+2];
|
|
88 |
attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB ] = attribs1[VERT1_ATTRIBS*(currentVert-1) + NOR_ATTRIB ];
|
|
89 |
attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+1] = attribs1[VERT1_ATTRIBS*(currentVert-1) + NOR_ATTRIB+1];
|
|
90 |
attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+2] = attribs1[VERT1_ATTRIBS*(currentVert-1) + NOR_ATTRIB+2];
|
|
91 | 91 |
|
92 |
attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB ] = attribs[VERT_ATTRIBS*(currentVert-1) + INF_ATTRIB ];
|
|
93 |
attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + INF_ATTRIB+1];
|
|
94 |
attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+2] = attribs[VERT_ATTRIBS*(currentVert-1) + INF_ATTRIB+2];
|
|
92 |
attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB ] = attribs1[VERT1_ATTRIBS*(currentVert-1) + INF_ATTRIB ];
|
|
93 |
attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+1] = attribs1[VERT1_ATTRIBS*(currentVert-1) + INF_ATTRIB+1];
|
|
94 |
attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+2] = attribs1[VERT1_ATTRIBS*(currentVert-1) + INF_ATTRIB+2];
|
|
95 | 95 |
|
96 |
attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB ] = attribs[VERT_ATTRIBS*(currentVert-1) + TEX_ATTRIB ];
|
|
97 |
attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + TEX_ATTRIB+1];
|
|
96 |
attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB ] = attribs2[VERT2_ATTRIBS*(currentVert-1) + TEX_ATTRIB ];
|
|
97 |
attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB+1] = attribs2[VERT2_ATTRIBS*(currentVert-1) + TEX_ATTRIB+1];
|
|
98 | 98 |
|
99 | 99 |
currentVert++; |
100 | 100 |
} |
... | ... | |
151 | 151 |
// ( 0, level-1, level) -> (lonV3,latV3 ) |
152 | 152 |
// (level-1, 0, level) -> (lonV2,latV12) |
153 | 153 |
|
154 |
private void addVertex(float[] attribs, int column, int row, int level, |
|
154 |
private void addVertex(float[] attribs1, float[] attribs2, int column, int row, int level,
|
|
155 | 155 |
double lonV1, double lonV2, double latV12, double latV3) |
156 | 156 |
{ |
157 | 157 |
double quotX = (double)column/level; |
... | ... | |
184 | 184 |
|
185 | 185 |
double texY = 0.5 + latitude/P; |
186 | 186 |
|
187 |
attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB ] = x; //
|
|
188 |
attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+1] = y; //
|
|
189 |
attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+2] = z; //
|
|
190 |
// In case of this Mesh so it happens that |
|
191 |
attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB ] = 2*x;// the vertex coords, normal vector, and
|
|
192 |
attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+1] = 2*y;// inflate vector have identical (x,y,z).
|
|
193 |
attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+2] = 2*z;//
|
|
194 |
// TODO: think about some more efficient |
|
195 |
attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB ] = x; // representation.
|
|
196 |
attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+1] = y; //
|
|
197 |
attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+2] = z; //
|
|
198 |
|
|
199 |
attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB ] = (float)texX;
|
|
200 |
attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB+1] = (float)texY;
|
|
187 |
attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB ] = x; //
|
|
188 |
attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+1] = y; //
|
|
189 |
attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+2] = z; //
|
|
190 |
// In case of this Mesh so it happens that
|
|
191 |
attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB ] = 2*x;// the vertex coords, normal vector, and
|
|
192 |
attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+1] = 2*y;// inflate vector have identical (x,y,z).
|
|
193 |
attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+2] = 2*z;//
|
|
194 |
// TODO: think about some more efficient
|
|
195 |
attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB ] = x; // representation.
|
|
196 |
attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+1] = y; //
|
|
197 |
attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+2] = z; //
|
|
198 |
|
|
199 |
attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB ] = (float)texX;
|
|
200 |
attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB+1] = (float)texY;
|
|
201 | 201 |
|
202 | 202 |
currentVert++; |
203 | 203 |
|
... | ... | |
209 | 209 |
|
210 | 210 |
if( currentVert>=3 && texX==0.0 ) |
211 | 211 |
{ |
212 |
double tex1 = attribs[VERT_ATTRIBS*(currentVert-2) + TEX_ATTRIB];
|
|
213 |
double tex2 = attribs[VERT_ATTRIBS*(currentVert-3) + TEX_ATTRIB];
|
|
212 |
double tex1 = attribs2[VERT2_ATTRIBS*(currentVert-2) + TEX_ATTRIB];
|
|
213 |
double tex2 = attribs2[VERT2_ATTRIBS*(currentVert-3) + TEX_ATTRIB];
|
|
214 | 214 |
|
215 | 215 |
// if the triangle is not degenerate and last vertex was on the western hemisphere |
216 | 216 |
if( tex1!=tex2 && tex1>0.5 ) |
217 | 217 |
{ |
218 |
attribs[VERT_ATTRIBS*(currentVert-1) + TEX_ATTRIB] = 1.0f;
|
|
218 |
attribs2[VERT2_ATTRIBS*(currentVert-1) + TEX_ATTRIB] = 1.0f;
|
|
219 | 219 |
} |
220 | 220 |
} |
221 | 221 |
} |
222 | 222 |
|
223 | 223 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
224 | 224 |
|
225 |
private void buildFace(float[] attribs, int level, int face, double lonV1, double lonV2, double latV12, double latV3) |
|
225 |
private void buildFace(float[] attribs1, float[] attribs2, int level, int face, double lonV1, double lonV2, double latV12, double latV3)
|
|
226 | 226 |
{ |
227 | 227 |
for(int row=0; row<level; row++) |
228 | 228 |
{ |
229 | 229 |
for (int column=0; column<level-row; column++) |
230 | 230 |
{ |
231 |
addVertex(attribs, column, row , level, lonV1, lonV2, latV12, latV3); |
|
232 |
if (column==0 && !(face==0 && row==0 ) ) repeatVertex(attribs); |
|
233 |
addVertex(attribs, column, row+1, level, lonV1, lonV2, latV12, latV3); |
|
231 |
addVertex(attribs1, attribs2, column, row , level, lonV1, lonV2, latV12, latV3);
|
|
232 |
if (column==0 && !(face==0 && row==0 ) ) repeatVertex(attribs1, attribs2);
|
|
233 |
addVertex(attribs1, attribs2, column, row+1, level, lonV1, lonV2, latV12, latV3);
|
|
234 | 234 |
} |
235 | 235 |
|
236 |
addVertex(attribs, level-row, row , level, lonV1, lonV2, latV12, latV3); |
|
237 |
if( row!=level-1 || face!=NUMFACES-1 ) repeatVertex(attribs); |
|
236 |
addVertex(attribs1, attribs2, level-row, row , level, lonV1, lonV2, latV12, latV3);
|
|
237 |
if( row!=level-1 || face!=NUMFACES-1 ) repeatVertex(attribs1, attribs2);
|
|
238 | 238 |
} |
239 | 239 |
} |
240 | 240 |
|
... | ... | |
254 | 254 |
public MeshSphere(int level) |
255 | 255 |
{ |
256 | 256 |
super(); |
257 |
|
|
257 | 258 |
computeNumberOfVertices(level); |
258 |
float[] attribs= new float[VERT_ATTRIBS*numVertices]; |
|
259 |
float[] attribs1= new float[VERT1_ATTRIBS*numVertices]; |
|
260 |
float[] attribs2= new float[VERT2_ATTRIBS*numVertices]; |
|
259 | 261 |
|
260 | 262 |
for(int face=0; face<NUMFACES; face++ ) |
261 | 263 |
{ |
262 |
buildFace(attribs, level, face, FACES[face][0], FACES[face][1], FACES[face][2], FACES[face][3]); |
|
264 |
buildFace(attribs1, attribs2, level, face, FACES[face][0], FACES[face][1], FACES[face][2], FACES[face][3]);
|
|
263 | 265 |
} |
264 | 266 |
|
265 | 267 |
if( currentVert!=numVertices ) |
266 | 268 |
android.util.Log.d("MeshSphere", "currentVert= " +currentVert+" numVertices="+numVertices ); |
267 | 269 |
|
268 |
setAttribs(attribs); |
|
270 |
setAttribs(attribs1, attribs2);
|
|
269 | 271 |
} |
270 | 272 |
|
271 | 273 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
Also available in: Unified diff
Have VERTEX_QUATERNION, VERTEX_ROTATE and VERTEX_SHEAR modify inflate vectors.
Split Vertex attribute array into two (the one modified by preapply effects and the one not)