Revision 46ef24e5
Added by Leszek Koltunski over 2 years ago
| src/main/java/org/distorted/library/mesh/MeshMultigon.java | ||
|---|---|---|
| 46 | 46 |
|
| 47 | 47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 48 | 48 |
|
| 49 |
private boolean isUp(float[][] vertices, int polygon, int edge)
|
|
| 49 |
private int isUp(float[][] vertices, int polygon, int edge)
|
|
| 50 | 50 |
{
|
| 51 | 51 |
//android.util.Log.e("D", "checking polygon "+polygon+" edge "+edge);
|
| 52 | 52 |
|
| ... | ... | |
| 79 | 79 |
//android.util.Log.e("D", "comparing v2 to "+x1+" "+y1);
|
| 80 | 80 |
//android.util.Log.e("D", "comparing v1 to "+x2+" "+y2);
|
| 81 | 81 |
|
| 82 |
if( isSame(v2x-x1,v2y-y1) && isSame(v1x-x2,v1y-y2) ) return true;
|
|
| 82 |
if( isSame(v2x-x1,v2y-y1) && isSame(v1x-x2,v1y-y2) ) return i;
|
|
| 83 | 83 |
} |
| 84 | 84 |
} |
| 85 | 85 |
|
| 86 | 86 |
//android.util.Log.e("D", "FALSE");
|
| 87 | 87 |
|
| 88 |
return false;
|
|
| 88 |
return -1;
|
|
| 89 | 89 |
} |
| 90 | 90 |
|
| 91 | 91 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 92 | 92 |
|
| 93 |
private boolean[][] computeEdgesUp(float[][] vertices)
|
|
| 93 |
private int[][] computeEdgesUp(float[][] vertices)
|
|
| 94 | 94 |
{
|
| 95 | 95 |
int num = vertices.length; |
| 96 |
boolean[][] up = new boolean[num][];
|
|
| 96 |
int[][] up = new int[num][];
|
|
| 97 | 97 |
|
| 98 | 98 |
for(int i=0; i<num; i++) |
| 99 | 99 |
{
|
| 100 | 100 |
int len = vertices[i].length/2; |
| 101 |
up[i] = new boolean[len];
|
|
| 101 |
up[i] = new int[len];
|
|
| 102 | 102 |
for(int j=0; j<len; j++) |
| 103 | 103 |
{
|
| 104 | 104 |
up[i][j] = isUp(vertices,i,j); |
| ... | ... | |
| 236 | 236 |
return up; |
| 237 | 237 |
} |
| 238 | 238 |
|
| 239 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 240 |
|
|
| 241 |
private float[] computeCenter(float[] vertices) |
|
| 242 |
{
|
|
| 243 |
int num = vertices.length/2; |
|
| 244 |
float[] ret = new float[2]; |
|
| 245 |
|
|
| 246 |
for(int i=0; i<num; i++) |
|
| 247 |
{
|
|
| 248 |
ret[0] += vertices[2*i]; |
|
| 249 |
ret[1] += vertices[2*i+1]; |
|
| 250 |
} |
|
| 251 |
|
|
| 252 |
ret[0] /= num; |
|
| 253 |
ret[1] /= num; |
|
| 254 |
|
|
| 255 |
return ret; |
|
| 256 |
} |
|
| 257 |
|
|
| 258 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 259 |
|
|
| 260 |
private float[][] computeCenters(float[][] vertices) |
|
| 261 |
{
|
|
| 262 |
int num = vertices.length; |
|
| 263 |
float[][] ret = new float[num][]; |
|
| 264 |
for(int i=0; i<num; i++) ret[i] = computeCenter(vertices[i]); |
|
| 265 |
return ret; |
|
| 266 |
} |
|
| 267 |
|
|
| 268 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 269 |
|
|
| 270 |
private int computeMode(float[] vL, float[] vR, float[] vT, float[] normL, float[] normR, |
|
| 271 |
int[][] edgesUp, boolean[][] vertsUp, float[][] vertices, float[][] centers, int component, int curr) |
|
| 272 |
{
|
|
| 273 |
float[] v = vertices[component]; |
|
| 274 |
int[] edges = edgesUp[component]; |
|
| 275 |
int len = v.length /2; |
|
| 276 |
int next= curr==len-1 ? 0 : curr+1; |
|
| 277 |
int prev= curr==0 ? len-1 : curr-1; |
|
| 278 |
int eupc = edges[curr]; |
|
| 279 |
|
|
| 280 |
if( eupc<0 ) |
|
| 281 |
{
|
|
| 282 |
int eupp = edges[prev]; |
|
| 283 |
int eupn = edges[next]; |
|
| 284 |
|
|
| 285 |
vL[0] = v[2*curr]; |
|
| 286 |
vL[1] = v[2*curr+1]; |
|
| 287 |
vR[0] = v[2*next]; |
|
| 288 |
vR[1] = v[2*next+1]; |
|
| 289 |
vT[0] = centers[component][0]; |
|
| 290 |
vT[1] = centers[component][1]; |
|
| 291 |
|
|
| 292 |
if( eupp<0 ) |
|
| 293 |
{
|
|
| 294 |
normL[0]=vT[0]-vL[0]; |
|
| 295 |
normL[1]=vT[1]-vL[1]; |
|
| 296 |
} |
|
| 297 |
else |
|
| 298 |
{
|
|
| 299 |
normL[0]= v[2*prev ] - v[2*curr ]; |
|
| 300 |
normL[1]= v[2*prev+1] - v[2*curr+1]; |
|
| 301 |
} |
|
| 302 |
|
|
| 303 |
if( eupn<0 ) |
|
| 304 |
{
|
|
| 305 |
normR[0]=vT[0]-vR[0]; |
|
| 306 |
normR[1]=vT[1]-vR[1]; |
|
| 307 |
} |
|
| 308 |
else |
|
| 309 |
{
|
|
| 310 |
int nnxt= next==len-1 ? 0 : next+1; |
|
| 311 |
normL[0]= v[2*nnxt ] - v[2*next ]; |
|
| 312 |
normL[1]= v[2*nnxt+1] - v[2*next+1]; |
|
| 313 |
} |
|
| 314 |
|
|
| 315 |
return MeshBandedTriangle.MODE_NORMAL; |
|
| 316 |
} |
|
| 317 |
else |
|
| 318 |
{
|
|
| 319 |
vL[0] = centers[eupc][0]; |
|
| 320 |
vL[1] = centers[eupc][1]; |
|
| 321 |
vR[0] = centers[component][0]; |
|
| 322 |
vR[1] = centers[component][1]; |
|
| 323 |
vT[0] = v[2*curr]; |
|
| 324 |
vT[1] = v[2*curr+1]; |
|
| 325 |
|
|
| 326 |
boolean vup = vertsUp[component][curr]; |
|
| 327 |
|
|
| 328 |
if( vup ) |
|
| 329 |
{
|
|
| 330 |
return MeshBandedTriangle.MODE_FLAT; |
|
| 331 |
} |
|
| 332 |
else |
|
| 333 |
{
|
|
| 334 |
float dx=v[2*curr]-v[2*next]; |
|
| 335 |
float dy=v[2*curr+1]-v[2*next+1]; |
|
| 336 |
|
|
| 337 |
normL[0]=dx; |
|
| 338 |
normL[1]=dy; |
|
| 339 |
normR[0]=dx; |
|
| 340 |
normR[1]=dy; |
|
| 341 |
|
|
| 342 |
return MeshBandedTriangle.MODE_INVERTED; |
|
| 343 |
} |
|
| 344 |
} |
|
| 345 |
} |
|
| 346 |
|
|
| 239 | 347 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 240 | 348 |
// PUBLIC API |
| 241 | 349 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 246 | 354 |
* |
| 247 | 355 |
* @param vertices an array of arrays, each specifying vertices of a single polygon. |
| 248 | 356 |
* @param band see MeshPolygon. Shared among all polygons. |
| 249 |
* @param exIndex see MeshPolygon. Shared among all polygons.
|
|
| 357 |
* @param exBands see MeshPolygon. Shared among all polygons.
|
|
| 250 | 358 |
* @param exVertices see MeshPolygon. Shared among all polygons. |
| 251 |
* @param centers for each polygon, coordinates of its center. |
|
| 252 | 359 |
*/ |
| 253 |
public MeshMultigon(float[][] vertices, float[] band, int exIndex, int exVertices, float[][] centers)
|
|
| 360 |
public MeshMultigon(float[][] vertices, float[] band, int exBands, int exVertices)
|
|
| 254 | 361 |
{
|
| 255 | 362 |
super(); |
| 256 | 363 |
|
| 257 |
int numPolygons = vertices.length; |
|
| 258 |
MeshPolygon[] meshes = new MeshPolygon[numPolygons]; |
|
| 259 |
boolean[][] edgesUp = computeEdgesUp(vertices); |
|
| 260 |
boolean[][] vertsUp = computeVertsUp(vertices); |
|
| 261 |
|
|
| 262 |
for(int i=0; i<numPolygons; i++) |
|
| 263 |
meshes[i] = new MeshPolygon(vertices[i],band,edgesUp[i],vertsUp[i],exIndex,exVertices,centers[i][0],centers[i][1]); |
|
| 264 |
|
|
| 265 |
join(meshes); |
|
| 266 |
mergeEffComponents(); |
|
| 267 |
mergeTexComponents(); |
|
| 268 |
} |
|
| 364 |
int numTriangles=0; |
|
| 365 |
for(float[] vertex : vertices) numTriangles+=vertex.length/2; |
|
| 366 |
MeshBandedTriangle[] triangles = new MeshBandedTriangle[numTriangles]; |
|
| 269 | 367 |
|
| 270 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 271 |
/** |
|
| 272 |
* Auto-create the centers to be the centers of gravity of each polygon. |
|
| 273 |
*/ |
|
| 368 |
int[][] edgesUp = computeEdgesUp(vertices); |
|
| 369 |
boolean[][] vertsUp = computeVertsUp(vertices); |
|
| 370 |
float[][] centers = computeCenters(vertices); |
|
| 274 | 371 |
|
| 275 |
public MeshMultigon(float[][] vertices, float[] band, int exIndex, int exVertices) |
|
| 276 |
{
|
|
| 277 |
super(); |
|
| 372 |
float[] vL = new float[2]; |
|
| 373 |
float[] vR = new float[2]; |
|
| 374 |
float[] vT = new float[2]; |
|
| 375 |
float[] normL = new float[2]; |
|
| 376 |
float[] normR = new float[2]; |
|
| 278 | 377 |
|
| 279 |
int numPolygons = vertices.length; |
|
| 280 |
MeshPolygon[] meshes = new MeshPolygon[numPolygons]; |
|
| 281 |
boolean[][] edgesUp = computeEdgesUp(vertices); |
|
| 282 |
boolean[][] vertsUp = computeVertsUp(vertices); |
|
| 378 |
int index=0,len = vertices.length; |
|
| 283 | 379 |
|
| 284 |
for(int i=0; i<numPolygons; i++)
|
|
| 380 |
for(int i=0; i<len; i++)
|
|
| 285 | 381 |
{
|
| 286 |
float[] v = vertices[i]; |
|
| 287 |
int num = v.length/2; |
|
| 288 |
float xsum=0, ysum = 0; |
|
| 382 |
int num=vertices[i].length/2; |
|
| 289 | 383 |
|
| 290 | 384 |
for(int j=0; j<num; j++) |
| 291 | 385 |
{
|
| 292 |
xsum += v[2*j];
|
|
| 293 |
ysum += v[2*j+1];
|
|
| 386 |
int mode=computeMode(vL, vR, vT, normL, normL, edgesUp, vertsUp,vertices,centers, i,j);
|
|
| 387 |
triangles[index++] = new MeshBandedTriangle(vL, vR, vT, band, normL, normR, mode, exBands, exVertices);
|
|
| 294 | 388 |
} |
| 295 |
|
|
| 296 |
meshes[i] = new MeshPolygon(v,band,edgesUp[i],vertsUp[i],exIndex,exVertices,xsum/num,ysum/num); |
|
| 297 | 389 |
} |
| 298 | 390 |
|
| 299 |
join(meshes);
|
|
| 391 |
join(triangles);
|
|
| 300 | 392 |
mergeEffComponents(); |
| 301 | 393 |
mergeTexComponents(); |
| 302 | 394 |
} |
Also available in: Unified diff
Implement MeshMultigon out of BandedTriangles (doesn't work yet)