Revision 28f4aba0
Added by Leszek Koltunski over 4 years ago
| src/main/java/org/distorted/examples/meshfile/FactoryCubit.java | ||
|---|---|---|
| 313 | 313 |
int len = vert3D.length; |
| 314 | 314 |
StickerInfo sInfo = new StickerInfo(); |
| 315 | 315 |
sInfo.vertices = new float[2*len]; |
| 316 |
mStickerInfo.add(sInfo); |
|
| 317 | 316 |
|
| 318 | 317 |
for( int vertex=0; vertex<len; vertex++ ) |
| 319 | 318 |
{
|
| ... | ... | |
| 321 | 320 |
sInfo.vertices[2*vertex+1] = vert3D[vertex][1] / info.scale; |
| 322 | 321 |
} |
| 323 | 322 |
|
| 323 |
mStickerInfo.add(sInfo); |
|
| 324 |
|
|
| 325 |
info.sticker = mStickerInfo.size() -1; |
|
| 324 | 326 |
info.flip = false; |
| 325 | 327 |
} |
| 326 | 328 |
|
| ... | ... | |
| 382 | 384 |
axisY = mBuffer[0]; |
| 383 | 385 |
axisZ = 0.0f; |
| 384 | 386 |
|
| 385 |
float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ;
|
|
| 387 |
float axiLen = axisX*axisX + axisY*axisY; |
|
| 386 | 388 |
axiLen = (float)Math.sqrt(axiLen); |
| 387 | 389 |
axisX /= axiLen; |
| 388 | 390 |
axisY /= axiLen; |
| ... | ... | |
| 403 | 405 |
mQuat1[1] = axisY*sinHalfTheta; |
| 404 | 406 |
mQuat1[2] = axisZ*sinHalfTheta; |
| 405 | 407 |
mQuat1[3] = cosHalfTheta; |
| 406 |
mQuat2[0] = axisX*sinHalfTheta;
|
|
| 407 |
mQuat2[1] = axisY*sinHalfTheta;
|
|
| 408 |
mQuat2[2] = axisZ*sinHalfTheta;
|
|
| 409 |
mQuat2[3] = -cosHalfTheta;
|
|
| 408 |
mQuat2[0] =-axisX*sinHalfTheta;
|
|
| 409 |
mQuat2[1] =-axisY*sinHalfTheta;
|
|
| 410 |
mQuat2[2] =-axisZ*sinHalfTheta;
|
|
| 411 |
mQuat2[3] = cosHalfTheta; |
|
| 410 | 412 |
|
| 411 | 413 |
for (float[] vert : vert3D) |
| 412 | 414 |
{
|
| 413 |
quatMultiply(mQuat1, vert, mQuat3); |
|
| 414 |
quatMultiply(mQuat3, mQuat2, vert); |
|
| 415 |
quatMultiply(mQuat1, vert , mQuat3);
|
|
| 416 |
quatMultiply(mQuat3, mQuat2, vert );
|
|
| 415 | 417 |
} |
| 416 | 418 |
|
| 417 | 419 |
// fit the whole thing in a square and remember the scale & 2D vertices |
| 418 | 420 |
fitInSquare(info, vert3D); |
| 419 | 421 |
|
| 420 | 422 |
// remember the rotation |
| 421 |
info.qx = mQuat1[0];
|
|
| 422 |
info.qy = mQuat1[1];
|
|
| 423 |
info.qz = mQuat1[2];
|
|
| 424 |
info.qw =-mQuat1[3];
|
|
| 423 |
info.qx =-mQuat1[0];
|
|
| 424 |
info.qy =-mQuat1[1];
|
|
| 425 |
info.qz =-mQuat1[2];
|
|
| 426 |
info.qw = mQuat1[3];
|
|
| 425 | 427 |
} |
| 426 | 428 |
|
| 427 | 429 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 428 | 430 |
|
| 429 | 431 |
private float computeCos(float x1, float y1, float x2, float y2, float len1, float len2) |
| 430 | 432 |
{
|
| 431 |
return (x1*x2+y1*y2) / (len1*len2); |
|
| 433 |
float ret = (x1*x2+y1*y2) / (len1*len2); |
|
| 434 |
|
|
| 435 |
if( ret> 1.0f ) return 1.0f; |
|
| 436 |
if( ret<-1.0f ) return -1.0f; |
|
| 437 |
|
|
| 438 |
return ret; |
|
| 432 | 439 |
} |
| 433 | 440 |
|
| 434 | 441 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 436 | 443 |
|
| 437 | 444 |
private float computeSin(float x1, float y1, float x2, float y2, float len1, float len2) |
| 438 | 445 |
{
|
| 439 |
return (x2*y1-x1*y2) / (len1*len2); |
|
| 446 |
float ret = (x2*y1-x1*y2) / (len1*len2); |
|
| 447 |
|
|
| 448 |
if( ret> 1.0f ) return 1.0f; |
|
| 449 |
if( ret<-1.0f ) return -1.0f; |
|
| 450 |
|
|
| 451 |
return ret; |
|
| 440 | 452 |
} |
| 441 | 453 |
|
| 442 | 454 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 481 | 493 |
|
| 482 | 494 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 483 | 495 |
|
| 484 |
private void correctInfo(FaceInfo info, float scale, float sin, float cos, int oldSticker, boolean flip)
|
|
| 496 |
private void correctInfo(FaceInfo info, float scale, float cos, int oldSticker, boolean flip) |
|
| 485 | 497 |
{
|
| 486 | 498 |
mStickerInfo.remove(info.sticker); |
| 487 | 499 |
|
| 488 |
info.flip = flip; |
|
| 500 |
info.flip = flip;
|
|
| 489 | 501 |
info.sticker = oldSticker; |
| 490 |
info.scale *= scale; |
|
| 502 |
info.scale *= scale; |
|
| 503 |
|
|
| 504 |
mQuat1[0] = info.qx; |
|
| 505 |
mQuat1[1] = info.qy; |
|
| 506 |
mQuat1[2] = info.qz; |
|
| 507 |
mQuat1[3] = info.qw; |
|
| 491 | 508 |
|
| 492 |
mQuat1[0] = 0.0f; |
|
| 493 |
mQuat1[1] = 0.0f; |
|
| 494 |
mQuat1[2] = sin; |
|
| 495 |
mQuat1[3] = cos; |
|
| 509 |
float sinHalf = (float)Math.sqrt(0.5f*(1-cos)); |
|
| 510 |
float cosHalf = (float)Math.sqrt(0.5f*(1+cos)); |
|
| 496 | 511 |
|
| 497 |
mQuat2[0] = info.qx;
|
|
| 498 |
mQuat2[1] = info.qy;
|
|
| 499 |
mQuat2[2] = info.qz;
|
|
| 500 |
mQuat2[3] = info.qw;
|
|
| 512 |
mQuat2[0] = 0.0f;
|
|
| 513 |
mQuat2[1] = 0.0f;
|
|
| 514 |
mQuat2[2] = sinHalf;
|
|
| 515 |
mQuat2[3] = cosHalf;
|
|
| 501 | 516 |
|
| 502 | 517 |
quatMultiply( mQuat1, mQuat2, mQuat3 ); |
| 503 | 518 |
|
| ... | ... | |
| 514 | 529 |
{
|
| 515 | 530 |
for(int vertex=0; vertex<len; vertex++) |
| 516 | 531 |
{
|
| 517 |
float xR = newVert[2*vertex ];
|
|
| 518 |
float yR = newVert[2*vertex+1];
|
|
| 532 |
float xR = preVert[2*vertex ];
|
|
| 533 |
float yR = preVert[2*vertex+1];
|
|
| 519 | 534 |
float lenRotV = (float)Math.sqrt(xR*xR+yR*yR); |
| 520 |
float cos = computeCos(xR,yR,preVert[0],preVert[1], lenRotV, lenVert);
|
|
| 521 |
float sin = computeSin(xR,yR,preVert[0],preVert[1], lenRotV, lenVert);
|
|
| 535 |
float cos = computeCos(xR,yR,newVert[0],newVert[1], lenRotV, lenVert);
|
|
| 536 |
float sin = computeSin(xR,yR,newVert[0],newVert[1], lenRotV, lenVert);
|
|
| 522 | 537 |
|
| 523 | 538 |
rotateAllVertices(buffer,len,newVert,sin,cos); |
| 524 | 539 |
|
| 525 | 540 |
if( isScaledVersionOf(buffer,preVert,len) ) |
| 526 | 541 |
{
|
| 527 | 542 |
float scale = preVert[0]!=0.0f ? buffer[0]/preVert[0] : buffer[1]/preVert[1]; |
| 528 |
correctInfo(info,scale,sin,cos,oldSticker,inverted);
|
|
| 543 |
correctInfo(info,scale,cos,oldSticker,inverted); |
|
| 529 | 544 |
return true; |
| 530 | 545 |
} |
| 531 | 546 |
} |
| ... | ... | |
| 660 | 675 |
|
| 661 | 676 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 662 | 677 |
|
| 663 |
private void printStickerInfo()
|
|
| 678 |
private void printInfo() |
|
| 664 | 679 |
{
|
| 665 |
String ver=""; |
|
| 666 | 680 |
int stickers = mStickerInfo.size(); |
| 667 | 681 |
|
| 682 |
android.util.Log.d("D", "-------------------------");
|
|
| 683 |
|
|
| 668 | 684 |
for(int s=0; s<stickers; s++) |
| 669 | 685 |
{
|
| 670 |
ver = ""; |
|
| 686 |
String ver = "";
|
|
| 671 | 687 |
StickerInfo info = mStickerInfo.get(s); |
| 672 | 688 |
int len = info.vertices.length/2; |
| 673 | 689 |
|
| ... | ... | |
| 675 | 691 |
{
|
| 676 | 692 |
ver += ("("+info.vertices[2*i]+","+info.vertices[2*i+1]+") ");
|
| 677 | 693 |
} |
| 694 |
|
|
| 695 |
android.util.Log.e("D", "sticker "+s+" "+ver);
|
|
| 678 | 696 |
} |
| 679 | 697 |
|
| 680 |
android.util.Log.e("D", "vertices= "+ver);
|
|
| 681 |
} |
|
| 698 |
android.util.Log.d("D", "-------------------------");
|
|
| 682 | 699 |
|
| 683 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
| 700 |
int faces = mFaceInfo.size();
|
|
| 684 | 701 |
|
| 685 |
private void printFaceInfo(FaceInfo info) |
|
| 686 |
{
|
|
| 687 |
android.util.Log.e("D", "q=("+info.qx+", "+info.qy+", "+info.qz+", "+info.qw+") v=("
|
|
| 702 |
for(int f=0; f<faces; f++) |
|
| 703 |
{
|
|
| 704 |
FaceInfo info = mFaceInfo.get(f); |
|
| 705 |
|
|
| 706 |
android.util.Log.e("D", "q=("+info.qx+", "+info.qy+", "+info.qz+", "+info.qw+") v=("
|
|
| 688 | 707 |
+info.vx+", "+info.vy+", "+info.vz+") scale="+info.scale+" sticker="+info.sticker); |
| 708 |
} |
|
| 709 |
|
|
| 710 |
android.util.Log.d("D", "-------------------------");
|
|
| 689 | 711 |
} |
| 690 | 712 |
|
| 691 | 713 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 704 | 726 |
FaceInfo fInfo; |
| 705 | 727 |
StickerInfo sInfo; |
| 706 | 728 |
|
| 707 |
//printStickerInfo();
|
|
| 729 |
printInfo();
|
|
| 708 | 730 |
|
| 709 | 731 |
for(int face=0; face<numFaces; face++) |
| 710 | 732 |
{
|
| 711 | 733 |
fInfo = mFaceInfo.get(face); |
| 712 | 734 |
sInfo = mStickerInfo.get(fInfo.sticker); |
| 713 | 735 |
|
| 714 |
//printFaceInfo(fInfo); |
|
| 715 |
|
|
| 716 | 736 |
band = bands[bandIndexes[face]]; |
| 717 | 737 |
bandsComputed = computeBands( band[0], (int)band[1], band[2], band[3], (int)band[4]); |
| 718 | 738 |
meshes[face] = new MeshPolygon(sInfo.vertices,bandsComputed,(int)band[5],(int)band[6]); |
| src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java | ||
|---|---|---|
| 291 | 291 |
|
| 292 | 292 |
private void createMesh() |
| 293 | 293 |
{
|
| 294 |
final float[][] vertices = new float[][] |
|
| 294 |
int mode = 2; |
|
| 295 |
float[][] vertices = null; |
|
| 296 |
int[][] vertIndexes = null; |
|
| 297 |
float[][] bands = null; |
|
| 298 |
int[] bandIndexes = null; |
|
| 299 |
float[][] corners = null; |
|
| 300 |
int[] cornerIndexes = null; |
|
| 301 |
|
|
| 302 |
if( mode==0 ) // CUBE |
|
| 303 |
{
|
|
| 304 |
vertices = new float[][] |
|
| 295 | 305 |
{
|
| 296 | 306 |
{ 0.5f, 0.5f, 0.5f },
|
| 297 | 307 |
{ 0.5f, 0.5f,-0.5f },
|
| ... | ... | |
| 303 | 313 |
{-0.5f,-0.5f,-0.5f },
|
| 304 | 314 |
}; |
| 305 | 315 |
|
| 306 |
final int[][] vertIndexes = new int[][]
|
|
| 316 |
vertIndexes = new int[][]
|
|
| 307 | 317 |
{
|
| 308 | 318 |
{2,3,1,0}, // counterclockwise!
|
| 309 | 319 |
{7,6,4,5},
|
| ... | ... | |
| 313 | 323 |
{3,7,5,1}
|
| 314 | 324 |
}; |
| 315 | 325 |
|
| 316 |
final float[][] bands = new float[][]
|
|
| 326 |
bands = new float[][]
|
|
| 317 | 327 |
{
|
| 318 | 328 |
{0.05f,45,0.6f,0.5f,5, 2,2}
|
| 319 | 329 |
}; |
| 320 | 330 |
|
| 321 |
final int[] bandIndexes = new int[] { 0,0,0,0,0,0 };
|
|
| 331 |
bandIndexes = new int[] { 0,0,0,0,0,0 };
|
|
| 322 | 332 |
|
| 323 |
final float[][] corners = new float[][]
|
|
| 333 |
corners = new float[][]
|
|
| 324 | 334 |
{
|
| 325 | 335 |
{ 0.01f, 0.10f }
|
| 326 | 336 |
}; |
| 327 | 337 |
|
| 328 |
final int[] cornerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
|
|
| 338 |
cornerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
|
|
| 339 |
} |
|
| 340 |
else if( mode==1 ) // TETRAHEDRON |
|
| 341 |
{
|
|
| 342 |
vertices = new float[][] |
|
| 343 |
{
|
|
| 344 |
{-0.5f, SQ2/4, 0.0f},
|
|
| 345 |
{ 0.5f, SQ2/4, 0.0f},
|
|
| 346 |
{ 0.0f,-SQ2/4, 0.5f},
|
|
| 347 |
{ 0.0f,-SQ2/4,-0.5f}
|
|
| 348 |
}; |
|
| 349 |
|
|
| 350 |
vertIndexes = new int[][] |
|
| 351 |
{
|
|
| 352 |
{2,1,0}, // counterclockwise!
|
|
| 353 |
{2,3,1},
|
|
| 354 |
{3,2,0},
|
|
| 355 |
{3,0,1}
|
|
| 356 |
}; |
|
| 357 |
|
|
| 358 |
bands = new float[][] |
|
| 359 |
{
|
|
| 360 |
{0.05f,30,0.6f,0.5f,5, 2,2}
|
|
| 361 |
}; |
|
| 362 |
|
|
| 363 |
bandIndexes = new int[] { 0,0,0,0 };
|
|
| 364 |
|
|
| 365 |
corners = new float[][] |
|
| 366 |
{
|
|
| 367 |
{ 0.02f, 0.10f }
|
|
| 368 |
}; |
|
| 369 |
|
|
| 370 |
cornerIndexes = new int[] { 0,0,0,0 };
|
|
| 371 |
} |
|
| 372 |
else if( mode==2 ) // DINO |
|
| 373 |
{
|
|
| 374 |
vertices = new float[][] |
|
| 375 |
{
|
|
| 376 |
{-0.5f, 0.0f, 0.0f},
|
|
| 377 |
{ 0.5f, 0.0f, 0.0f},
|
|
| 378 |
{ 0.0f,-0.5f, 0.0f},
|
|
| 379 |
{ 0.0f, 0.0f,-0.5f}
|
|
| 380 |
}; |
|
| 381 |
|
|
| 382 |
vertIndexes = new int[][] |
|
| 383 |
{
|
|
| 384 |
{2,1,0}, // counterclockwise!
|
|
| 385 |
{2,3,1},
|
|
| 386 |
{3,2,0},
|
|
| 387 |
{3,0,1}
|
|
| 388 |
}; |
|
| 389 |
|
|
| 390 |
bands = new float[][] |
|
| 391 |
{
|
|
| 392 |
{0.028f,30,0.166f,0.8f,7, 2,5},
|
|
| 393 |
{0.028f,30,0.166f,0.8f,7, 1,2}
|
|
| 394 |
}; |
|
| 395 |
|
|
| 396 |
bandIndexes = new int[] { 0,1,1,0 };
|
|
| 397 |
|
|
| 398 |
corners = new float[][] |
|
| 399 |
{
|
|
| 400 |
{ 0.01f, 0.04f }
|
|
| 401 |
}; |
|
| 402 |
|
|
| 403 |
cornerIndexes = new int[] { 0,0,0,0 };
|
|
| 404 |
} |
|
| 329 | 405 |
|
| 330 | 406 |
FactoryCubit factory = FactoryCubit.getInstance(); |
| 331 | 407 |
mMesh = factory.createRoundedSolid(vertices, vertIndexes, bands, bandIndexes, corners, cornerIndexes); |
Also available in: Unified diff
Face cubit creation: progress: cube & tetrahedron work; dino cubit does not.
Also, the texture is not yet moved inside the (0,1)x(0,1) square.