Revision 9d0df4c6
Added by Leszek Koltunski almost 7 years ago
| src/main/java/org/distorted/library/mesh/MeshCubes.java | ||
|---|---|---|
| 56 | 56 |
|
| 57 | 57 |
private int mCols, mRows, mSlices; |
| 58 | 58 |
private int[][] mCubes; |
| 59 |
private byte[][] mInflateX, mInflateY; |
|
| 59 | 60 |
private ArrayList<Edge> mEdges = new ArrayList<>(); |
| 60 | 61 |
|
| 61 | 62 |
private int currVert; |
| ... | ... | |
| 189 | 190 |
mCols = cols; |
| 190 | 191 |
mRows = desc.length()/cols; |
| 191 | 192 |
|
| 192 |
mCubes = new int[mRows][mCols]; |
|
| 193 |
|
|
| 193 |
mCubes = new int[mRows][mCols]; |
|
| 194 |
mInflateX = new byte[mRows+1][mCols+1]; |
|
| 195 |
mInflateY = new byte[mRows+1][mCols+1]; |
|
| 196 |
|
|
| 194 | 197 |
for(int j=0; j<mCols; j++) |
| 195 | 198 |
for(int i=0; i<mRows; i++) |
| 196 |
mCubes[i][j] = (desc.charAt(i*mCols+j) == '1' ? 1:0); |
|
| 199 |
mCubes[i][j] = (desc.charAt(i * mCols + j) == '1' ? 1 : 0); |
|
| 200 |
|
|
| 201 |
for(int j=0; j<mCols+1; j++) |
|
| 202 |
for(int i=0; i<mRows+1; i++) |
|
| 203 |
{
|
|
| 204 |
fillInflate(j,i); |
|
| 205 |
} |
|
| 197 | 206 |
|
| 198 | 207 |
markRegions(); |
| 199 | 208 |
numVertices = computeDataLength(); |
| ... | ... | |
| 213 | 222 |
|
| 214 | 223 |
if( cols>0 && rows>0 ) |
| 215 | 224 |
{
|
| 216 |
mCubes = new int[mRows][mCols]; |
|
| 225 |
mCubes = new int[mRows][mCols]; |
|
| 226 |
mInflateX = new byte[mRows+1][mCols+1]; |
|
| 227 |
mInflateY = new byte[mRows+1][mCols+1]; |
|
| 217 | 228 |
|
| 218 | 229 |
for(int j=0; j<mCols; j++) |
| 219 | 230 |
for(int i=0; i<mRows; i++) |
| 220 | 231 |
mCubes[i][j] = 1; |
| 221 | 232 |
|
| 233 |
for(int j=0; j<mCols+1; j++) |
|
| 234 |
for(int i=0; i<mRows+1; i++) |
|
| 235 |
{
|
|
| 236 |
fillInflate(j,i); |
|
| 237 |
} |
|
| 238 |
|
|
| 222 | 239 |
markRegions(); |
| 223 | 240 |
numVertices = computeDataLength(); |
| 224 | 241 |
currVert = 0; |
| ... | ... | |
| 488 | 505 |
curr = new Edge(EAST,curr.row+1,curr.col-1); |
| 489 | 506 |
} |
| 490 | 507 |
|
| 491 |
for(int i=0; i<mSlices; i++)
|
|
| 508 |
for(int slice=0; slice<mSlices; slice++)
|
|
| 492 | 509 |
{
|
| 493 | 510 |
col = curr.col; |
| 494 | 511 |
row = curr.row; |
| 495 | 512 |
side= curr.side; |
| 496 | 513 |
next = getNextEdge(curr); |
| 497 | 514 |
|
| 498 |
addSideVertex(curr,true,i+1,prev.side,attribs);
|
|
| 515 |
addSideVertex(curr,true,slice+1,prev.side,attribs);
|
|
| 499 | 516 |
|
| 500 | 517 |
do |
| 501 | 518 |
{
|
| 502 | 519 |
if( prev.side!=curr.side ) |
| 503 | 520 |
{
|
| 504 |
addSideVertex(curr,true,i+1,prev.side,attribs);
|
|
| 505 |
addSideVertex(curr,true,i ,prev.side,attribs);
|
|
| 521 |
addSideVertex(curr,true,slice+1,prev.side,attribs);
|
|
| 522 |
addSideVertex(curr,true,slice ,prev.side,attribs);
|
|
| 506 | 523 |
} |
| 507 | 524 |
|
| 508 |
addSideVertex(curr,false,i+1,next.side,attribs);
|
|
| 509 |
addSideVertex(curr,false,i ,next.side,attribs);
|
|
| 525 |
addSideVertex(curr,false,slice+1,next.side,attribs);
|
|
| 526 |
addSideVertex(curr,false,slice ,next.side,attribs);
|
|
| 510 | 527 |
|
| 511 | 528 |
prev = curr; |
| 512 | 529 |
curr = next; |
| ... | ... | |
| 567 | 584 |
} |
| 568 | 585 |
} |
| 569 | 586 |
|
| 587 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 588 |
|
|
| 589 |
private void fillInflate(int col, int row) |
|
| 590 |
{
|
|
| 591 |
int diff; |
|
| 592 |
|
|
| 593 |
if( col==0 ) mInflateX[col][row] = -1; |
|
| 594 |
else if( col==mCols ) mInflateX[col][row] = +1; |
|
| 595 |
else |
|
| 596 |
{
|
|
| 597 |
if( row==0 ) |
|
| 598 |
{
|
|
| 599 |
diff = mCubes[0][col-1]-mCubes[0][col]; |
|
| 600 |
} |
|
| 601 |
else if( row==mRows ) |
|
| 602 |
{
|
|
| 603 |
diff = mCubes[mRows-1][col-1]-mCubes[mRows-1][col]; |
|
| 604 |
} |
|
| 605 |
else |
|
| 606 |
{
|
|
| 607 |
diff = (mCubes[row ][col-1]-mCubes[row ][col]) + |
|
| 608 |
(mCubes[row-1][col-1]-mCubes[row-1][col]) ; |
|
| 609 |
|
|
| 610 |
if( diff==-2 ) diff=-1; |
|
| 611 |
if( diff== 2 ) diff= 1; |
|
| 612 |
} |
|
| 613 |
|
|
| 614 |
mInflateX[col][row] = (byte)diff; |
|
| 615 |
} |
|
| 616 |
|
|
| 617 |
if( row==0 ) mInflateY[col][row] = +1; |
|
| 618 |
else if(row==mRows ) mInflateY[col][row] = -1; |
|
| 619 |
else |
|
| 620 |
{
|
|
| 621 |
if( col==0 ) |
|
| 622 |
{
|
|
| 623 |
diff = mCubes[row][0]-mCubes[row-1][0]; |
|
| 624 |
} |
|
| 625 |
else if( col==mCols ) |
|
| 626 |
{
|
|
| 627 |
diff = mCubes[row][mCols-1]-mCubes[row-1][mCols-1]; |
|
| 628 |
} |
|
| 629 |
else |
|
| 630 |
{
|
|
| 631 |
diff = (mCubes[row ][col-1]+mCubes[row ][col]) - |
|
| 632 |
(mCubes[row-1][col-1]+mCubes[row-1][col]) ; |
|
| 633 |
|
|
| 634 |
if( diff==-2 ) diff=-1; |
|
| 635 |
if( diff== 2 ) diff= 1; |
|
| 636 |
} |
|
| 637 |
|
|
| 638 |
mInflateY[col][row] = (byte)diff; |
|
| 639 |
} |
|
| 640 |
|
|
| 641 |
//android.util.Log.e("mesh","col="+col+" row="+row+" inflateX="+mInflateX[col][row]+" InflateY="+mInflateY[col][row]);
|
|
| 642 |
} |
|
| 643 |
|
|
| 570 | 644 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 571 | 645 |
|
| 572 | 646 |
private void addFrontVertex(int index, float vectZ, int col, int row, float[] attribs) |
| ... | ... | |
| 582 | 656 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = mNormalY[index]; |
| 583 | 657 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = mNormalZ[index]; |
| 584 | 658 |
|
| 585 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = 0.0f; // TODO
|
|
| 586 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = 0.0f; // TODO
|
|
| 659 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = mInflateX[col][row]/2.0f;
|
|
| 660 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInflateY[col][row]/2.0f;
|
|
| 587 | 661 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = vectZ; |
| 588 | 662 |
|
| 589 | 663 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB ] = x; |
| ... | ... | |
| 597 | 671 |
private void addSideVertex(Edge curr, boolean back, int slice, int side, float[] attribs) |
| 598 | 672 |
{
|
| 599 | 673 |
//android.util.Log.e("CUBES", "adding Side vertex!");
|
| 600 |
float x, y; |
|
| 674 |
float x, y, z; |
|
| 675 |
int row, col; |
|
| 601 | 676 |
|
| 602 | 677 |
switch(curr.side) |
| 603 | 678 |
{
|
| 604 |
case NORTH: x = (float)(back ? (curr.col ):(curr.col+1))/mCols; |
|
| 679 |
case NORTH: row = curr.row; |
|
| 680 |
col = (back ? (curr.col ):(curr.col+1)); |
|
| 681 |
x = (float)col/mCols; |
|
| 682 |
y = 0.5f - (float)row/mRows; |
|
| 683 |
z = 0.5f - (float)slice/mSlices; |
|
| 605 | 684 |
|
| 606 | 685 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB ] = x - 0.5f; |
| 607 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+1] = 0.5f - (float)curr.row/mRows;
|
|
| 608 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 686 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+1] = y;
|
|
| 687 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = z;
|
|
| 609 | 688 |
|
| 610 | 689 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB ] = side==NORTH ? 0.0f : (side==WEST?-R:R); |
| 611 | 690 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = 1.0f; |
| 612 | 691 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) ); |
| 613 | 692 |
|
| 614 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = 0.0f; //
|
|
| 615 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = 0.0f; // TODO
|
|
| 616 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 693 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = mInflateX[col][row]/2.0f;
|
|
| 694 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInflateY[col][row]/2.0f;
|
|
| 695 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = z;
|
|
| 617 | 696 |
|
| 618 | 697 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB ] = x; |
| 619 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f-(float)(curr.row-slice)/mRows;
|
|
| 698 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f-(float)(row-slice)/mRows; |
|
| 620 | 699 |
break; |
| 621 |
case SOUTH: x = (float)(back ? (curr.col+1):(curr.col ))/mCols; |
|
| 700 |
case SOUTH: row = curr.row+1; |
|
| 701 |
col = (back ? (curr.col+1):(curr.col)); |
|
| 702 |
x = (float)col/mCols; |
|
| 703 |
y = 0.5f - (float)row/mRows; |
|
| 704 |
z = 0.5f - (float)slice/mSlices; |
|
| 622 | 705 |
|
| 623 | 706 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB ] = x - 0.5f; |
| 624 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+1] = 0.5f - (float)(curr.row+1)/mRows;
|
|
| 625 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 707 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+1] = y;
|
|
| 708 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = z;
|
|
| 626 | 709 |
|
| 627 | 710 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB ] = side==SOUTH ? 0.0f: (side==EAST?-R:R); |
| 628 | 711 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] =-1.0f; |
| 629 | 712 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) ); |
| 630 | 713 |
|
| 631 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = 0.0f; //
|
|
| 632 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = 0.0f; // TODO
|
|
| 633 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 714 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = mInflateX[col][row]/2.0f;
|
|
| 715 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInflateY[col][row]/2.0f;
|
|
| 716 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = z;
|
|
| 634 | 717 |
|
| 635 | 718 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB ] = x; |
| 636 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f - (float)(curr.row+1+slice)/mRows;
|
|
| 719 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f - (float)(row+slice)/mRows;
|
|
| 637 | 720 |
break; |
| 638 |
case WEST : y = (float)(back ? (curr.row+1):(curr.row))/mRows; |
|
| 721 |
case WEST : row = (back ? (curr.row+1):(curr.row)); |
|
| 722 |
col = curr.col; |
|
| 723 |
x = (float)col/mCols -0.5f; |
|
| 724 |
y = (float)row/mRows; |
|
| 725 |
z = 0.5f - (float)slice/mSlices; |
|
| 639 | 726 |
|
| 640 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB ] = (float)curr.col/mCols -0.5f;
|
|
| 727 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB ] = x;
|
|
| 641 | 728 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+1] = 0.5f - y; |
| 642 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 729 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = z;
|
|
| 643 | 730 |
|
| 644 | 731 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB ] =-1.0f; |
| 645 | 732 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = side==WEST ? 0.0f : (side==NORTH?-R:R); |
| 646 | 733 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) ); |
| 647 | 734 |
|
| 648 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = 0.0f; //
|
|
| 649 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = 0.0f; // TODO
|
|
| 650 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 735 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = mInflateX[col][row]/2.0f;
|
|
| 736 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInflateY[col][row]/2.0f;
|
|
| 737 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = z;
|
|
| 651 | 738 |
|
| 652 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB ] = (float)(curr.col-slice)/mCols;
|
|
| 739 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB ] = (float)(col-slice)/mCols; |
|
| 653 | 740 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f - y; |
| 654 | 741 |
break; |
| 655 |
case EAST : y = (float)(back ? (curr.row):(curr.row+1))/mRows; |
|
| 742 |
case EAST : row = (back ? (curr.row):(curr.row+1)); |
|
| 743 |
col = (curr.col+1); |
|
| 744 |
x = (float)col/mCols -0.5f; |
|
| 745 |
y = (float)row/mRows; |
|
| 746 |
z = 0.5f - (float)slice/mSlices; |
|
| 656 | 747 |
|
| 657 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB ] = (float)(curr.col+1)/mCols -0.5f;
|
|
| 748 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB ] = x;
|
|
| 658 | 749 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+1] = 0.5f - y; |
| 659 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 750 |
attribs[VERT_ATTRIBS*currVert + POS_ATTRIB+2] = z;
|
|
| 660 | 751 |
|
| 661 | 752 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB ] = 1.0f; |
| 662 | 753 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+1] = side==EAST ? 0.0f : (side==SOUTH?-R:R); |
| 663 | 754 |
attribs[VERT_ATTRIBS*currVert + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) ); |
| 664 | 755 |
|
| 665 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = 0.0f; //
|
|
| 666 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = 0.0f; // TODO
|
|
| 667 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = 0.5f - (float)slice/mSlices;
|
|
| 756 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB ] = mInflateX[col][row]/2.0f;
|
|
| 757 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+1] = mInflateY[col][row]/2.0f;
|
|
| 758 |
attribs[VERT_ATTRIBS*currVert + INF_ATTRIB+2] = z;
|
|
| 668 | 759 |
|
| 669 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB ] = (float)(curr.col+1+slice)/mCols;
|
|
| 760 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB ] = (float)(col+slice)/mCols;
|
|
| 670 | 761 |
attribs[VERT_ATTRIBS*currVert + TEX_ATTRIB+1] = 1.0f - y; |
| 671 | 762 |
break; |
| 672 | 763 |
} |
| ... | ... | |
| 725 | 816 |
mEdges.clear(); |
| 726 | 817 |
mEdges = null; |
| 727 | 818 |
mCubes = null; |
| 819 |
mInflateX = null; |
|
| 820 |
mInflateY = null; |
|
| 728 | 821 |
|
| 729 | 822 |
if( currVert!=numVertices ) |
| 730 | 823 |
android.util.Log.e("MeshCubes", "currVert " +currVert+" numVertices="+numVertices );
|
Also available in: Unified diff
Progress with the Inflate vector in MeshCubes.
Pretty much works now - what remains is calibration.