Revision 6f2d931d
Added by Leszek Koltunski almost 7 years ago
| src/main/java/org/distorted/library/mesh/MeshBase.java | ||
|---|---|---|
| 39 | 39 | 
    */  | 
| 40 | 40 | 
    public abstract class MeshBase  | 
| 41 | 41 | 
       {
   | 
| 42 | 
    static final int POS_DATA_SIZE= 3;  | 
|
| 43 | 
    static final int NOR_DATA_SIZE= 3;  | 
|
| 44 | 
    static final int TEX_DATA_SIZE= 2;  | 
|
| 42 | 
    private static final int POS_DATA_SIZE= 3;  | 
|
| 43 | 
    private static final int NOR_DATA_SIZE= 3;  | 
|
| 44 | 
    private static final int INF_DATA_SIZE= 3;  | 
|
| 45 | 
    private static final int TEX_DATA_SIZE= 2;  | 
|
| 46 | 
     | 
|
| 47 | 
    static final int POS_ATTRIB = 0;  | 
|
| 48 | 
    static final int NOR_ATTRIB = POS_DATA_SIZE;  | 
|
| 49 | 
    static final int INF_ATTRIB = POS_DATA_SIZE + NOR_DATA_SIZE;  | 
|
| 50 | 
    static final int TEX_ATTRIB = POS_DATA_SIZE + NOR_DATA_SIZE + INF_DATA_SIZE;  | 
|
| 51 | 
    static final int VERT_ATTRIBS = POS_DATA_SIZE + NOR_DATA_SIZE + INF_DATA_SIZE + TEX_DATA_SIZE;  | 
|
| 45 | 52 | 
     | 
| 46 | 53 | 
    private static final int BYTES_PER_FLOAT = 4;  | 
| 47 | 54 | 
     | 
| 48 | 
    private static final int OFFSET_POS = 0;  | 
|
| 49 | 
    private static final int OFFSET_NOR = (POS_DATA_SIZE )*BYTES_PER_FLOAT;  | 
|
| 50 | 
    private static final int OFFSET_TEX = (POS_DATA_SIZE+NOR_DATA_SIZE )*BYTES_PER_FLOAT;  | 
|
| 55 | 
    private static final int OFFSET_POS = POS_ATTRIB*BYTES_PER_FLOAT;  | 
|
| 56 | 
    private static final int OFFSET_NOR = NOR_ATTRIB*BYTES_PER_FLOAT;  | 
|
| 57 | 
    private static final int OFFSET_INF = INF_ATTRIB*BYTES_PER_FLOAT;  | 
|
| 58 | 
    private static final int OFFSET_TEX = TEX_ATTRIB*BYTES_PER_FLOAT;  | 
|
| 51 | 59 | 
     | 
| 52 | 
    private static final int TFSIZE = (POS_DATA_SIZE+POS_DATA_SIZE )*BYTES_PER_FLOAT;  | 
|
| 53 | 
    private static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;  | 
|
| 60 | 
       private static final int TFSIZE  = (POS_DATA_SIZE+POS_DATA_SIZE                            )*BYTES_PER_FLOAT;
   | 
|
| 61 | 
       private static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+INF_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
   | 
|
| 54 | 62 | 
     | 
| 55 | 63 | 
    private boolean mShowNormals; // when rendering this mesh, draw normal vectors?  | 
| 56 | 64 | 
    private DistortedBuffer mVBO, mTFO; // main vertex buffer and transform feedback buffer  | 
| ... | ... | |
| 128 | 136 | 
    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mVBO.mIndex[0] );  | 
| 129 | 137 | 
    GLES31.glVertexAttribPointer(program.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_POS);  | 
| 130 | 138 | 
    GLES31.glVertexAttribPointer(program.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_NOR);  | 
| 131 | 
    GLES31.glVertexAttribPointer(program.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_TEX);  | 
|
| 139 | 
    GLES31.glVertexAttribPointer(program.mAttribute[2], MeshBase.INF_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_INF);  | 
|
| 140 | 
    GLES31.glVertexAttribPointer(program.mAttribute[3], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_TEX);  | 
|
| 132 | 141 | 
    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);  | 
| 133 | 142 | 
    }  | 
| 134 | 143 | 
     | 
| src/main/java/org/distorted/library/mesh/MeshCubes.java | ||
|---|---|---|
| 461 | 461 | 
    return vertex;  | 
| 462 | 462 | 
    }  | 
| 463 | 463 | 
     | 
| 464 | 
    ///////////////////////////////////////////////////////////////////////////////////////////////////  | 
|
| 465 | 
     | 
|
| 466 | 
    private int repeatLast(int vertex, float[] attribs)  | 
|
| 467 | 
         {
   | 
|
| 468 | 
         //android.util.Log.e("CUBES", "repeating last vertex!");
   | 
|
| 469 | 
     | 
|
| 470 | 
    if( vertex>0 )  | 
|
| 471 | 
           {
   | 
|
| 472 | 
    remainingVert--;  | 
|
| 473 | 
     | 
|
| 474 | 
    attribs[8*vertex ] = attribs[8*vertex-8];  | 
|
| 475 | 
    attribs[8*vertex+1] = attribs[8*vertex-7];  | 
|
| 476 | 
    attribs[8*vertex+2] = attribs[8*vertex-6];  | 
|
| 477 | 
    attribs[8*vertex+3] = attribs[8*vertex-5];  | 
|
| 478 | 
    attribs[8*vertex+4] = attribs[8*vertex-4];  | 
|
| 479 | 
    attribs[8*vertex+5] = attribs[8*vertex-3];  | 
|
| 480 | 
    attribs[8*vertex+6] = attribs[8*vertex-2];  | 
|
| 481 | 
    attribs[8*vertex+7] = attribs[8*vertex-1];  | 
|
| 482 | 
     | 
|
| 483 | 
    vertex++;  | 
|
| 484 | 
    }  | 
|
| 485 | 
     | 
|
| 486 | 
    return vertex;  | 
|
| 487 | 
    }  | 
|
| 488 | 
     | 
|
| 489 | 464 | 
    ///////////////////////////////////////////////////////////////////////////////////////////////////  | 
| 490 | 465 | 
     | 
| 491 | 466 | 
    private int buildSideGrid(int vertex, float[] attribs)  | 
| ... | ... | |
| 607 | 582 | 
    float x = (float)col/mCols;  | 
| 608 | 583 | 
    float y = (float)row/mRows;  | 
| 609 | 584 | 
     | 
| 610 | 
    attribs[8*vertex ] = x-0.5f;  | 
|
| 611 | 
    attribs[8*vertex+1] = 0.5f-y;  | 
|
| 612 | 
    attribs[8*vertex+2] = vectZ;  | 
|
| 613 | 
    attribs[8*vertex+3] = mNormalX[index];  | 
|
| 614 | 
    attribs[8*vertex+4] = mNormalY[index];  | 
|
| 615 | 
    attribs[8*vertex+5] = mNormalZ[index];  | 
|
| 616 | 
    attribs[8*vertex+6] = x;  | 
|
| 617 | 
    attribs[8*vertex+7] = 1.0f-y;  | 
|
| 585 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB ] = x-0.5f;  | 
|
| 586 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f-y;  | 
|
| 587 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = vectZ;  | 
|
| 588 | 
     | 
|
| 589 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB ] = mNormalX[index];  | 
|
| 590 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = mNormalY[index];  | 
|
| 591 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = mNormalZ[index];  | 
|
| 592 | 
     | 
|
| 593 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = 1.0f; //  | 
|
| 594 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f; // TODO  | 
|
| 595 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f; //  | 
|
| 596 | 
     | 
|
| 597 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = x;  | 
|
| 598 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f-y;  | 
|
| 618 | 599 | 
     | 
| 619 | 600 | 
    return vertex+1;  | 
| 620 | 601 | 
    }  | 
| ... | ... | |
| 633 | 614 | 
           {
   | 
| 634 | 615 | 
    case NORTH: x = (float)(back ? (curr.col ):(curr.col+1))/mCols;  | 
| 635 | 616 | 
     | 
| 636 | 
    attribs[8*vertex ] = x - 0.5f;  | 
|
| 637 | 
    attribs[8*vertex+1] = 0.5f - (float)curr.row/mRows;  | 
|
| 638 | 
    attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;  | 
|
| 639 | 
    attribs[8*vertex+3] = side==NORTH ? 0.0f : (side==WEST?-R:R);  | 
|
| 640 | 
    attribs[8*vertex+4] = 1.0f;  | 
|
| 641 | 
    attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 642 | 
    attribs[8*vertex+6] = x;  | 
|
| 643 | 
    attribs[8*vertex+7] = 1.0f-(float)(curr.row-slice)/mRows;  | 
|
| 617 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB ] = x - 0.5f;  | 
|
| 618 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - (float)curr.row/mRows;  | 
|
| 619 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;  | 
|
| 620 | 
     | 
|
| 621 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB ] = side==NORTH ? 0.0f : (side==WEST?-R:R);  | 
|
| 622 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = 1.0f;  | 
|
| 623 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 624 | 
     | 
|
| 625 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = 1.0f; //  | 
|
| 626 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f; // TODO  | 
|
| 627 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f; //  | 
|
| 628 | 
     | 
|
| 629 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = x;  | 
|
| 630 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f-(float)(curr.row-slice)/mRows;  | 
|
| 644 | 631 | 
    break;  | 
| 645 | 632 | 
    case SOUTH: x = (float)(back ? (curr.col+1):(curr.col ))/mCols;  | 
| 646 | 633 | 
     | 
| 647 | 
    attribs[8*vertex ] = x - 0.5f;  | 
|
| 648 | 
    attribs[8*vertex+1] = 0.5f - (float)(curr.row+1)/mRows;  | 
|
| 649 | 
    attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;  | 
|
| 650 | 
    attribs[8*vertex+3] = side==SOUTH ? 0.0f: (side==EAST?-R:R);  | 
|
| 651 | 
    attribs[8*vertex+4] =-1.0f;  | 
|
| 652 | 
    attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 653 | 
    attribs[8*vertex+6] = x;  | 
|
| 654 | 
    attribs[8*vertex+7] = 1.0f - (float)(curr.row+1+slice)/mRows;  | 
|
| 634 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB ] = x - 0.5f;  | 
|
| 635 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - (float)(curr.row+1)/mRows;  | 
|
| 636 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;  | 
|
| 637 | 
     | 
|
| 638 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB ] = side==SOUTH ? 0.0f: (side==EAST?-R:R);  | 
|
| 639 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] =-1.0f;  | 
|
| 640 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 641 | 
     | 
|
| 642 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = 1.0f; //  | 
|
| 643 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f; // TODO  | 
|
| 644 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f; //  | 
|
| 645 | 
     | 
|
| 646 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = x;  | 
|
| 647 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f - (float)(curr.row+1+slice)/mRows;  | 
|
| 655 | 648 | 
    break;  | 
| 656 | 649 | 
    case WEST : y = (float)(back ? (curr.row+1):(curr.row))/mRows;  | 
| 657 | 650 | 
     | 
| 658 | 
    attribs[8*vertex ] = (float)curr.col/mCols -0.5f;  | 
|
| 659 | 
    attribs[8*vertex+1] = 0.5f - y;  | 
|
| 660 | 
    attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;  | 
|
| 661 | 
    attribs[8*vertex+3] =-1.0f;  | 
|
| 662 | 
    attribs[8*vertex+4] = side==WEST ? 0.0f : (side==NORTH?-R:R);  | 
|
| 663 | 
    attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 664 | 
    attribs[8*vertex+6] = (float)(curr.col-slice)/mCols;  | 
|
| 665 | 
    attribs[8*vertex+7] = 1.0f - y;  | 
|
| 651 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB ] = (float)curr.col/mCols -0.5f;  | 
|
| 652 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - y;  | 
|
| 653 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;  | 
|
| 654 | 
     | 
|
| 655 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB ] =-1.0f;  | 
|
| 656 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = side==WEST ? 0.0f : (side==NORTH?-R:R);  | 
|
| 657 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 658 | 
     | 
|
| 659 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = 1.0f; //  | 
|
| 660 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f; // TODO  | 
|
| 661 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f; //  | 
|
| 662 | 
     | 
|
| 663 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = (float)(curr.col-slice)/mCols;  | 
|
| 664 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f - y;  | 
|
| 666 | 665 | 
    break;  | 
| 667 | 666 | 
    case EAST : y = (float)(back ? (curr.row):(curr.row+1))/mRows;  | 
| 668 | 667 | 
     | 
| 669 | 
    attribs[8*vertex ] = (float)(curr.col+1)/mCols -0.5f;  | 
|
| 670 | 
    attribs[8*vertex+1] = 0.5f - y;  | 
|
| 671 | 
    attribs[8*vertex+2] = 0.5f - (float)slice/mSlices;  | 
|
| 672 | 
    attribs[8*vertex+3] = 1.0f;  | 
|
| 673 | 
    attribs[8*vertex+4] = side==EAST ? 0.0f : (side==SOUTH?-R:R);  | 
|
| 674 | 
    attribs[8*vertex+5] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 675 | 
    attribs[8*vertex+6] = (float)(curr.col+1+slice)/mCols;  | 
|
| 676 | 
    attribs[8*vertex+7] = 1.0f - y;  | 
|
| 668 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB ] = (float)(curr.col+1)/mCols -0.5f;  | 
|
| 669 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f - y;  | 
|
| 670 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0.5f - (float)slice/mSlices;  | 
|
| 671 | 
     | 
|
| 672 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB ] = 1.0f;  | 
|
| 673 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = side==EAST ? 0.0f : (side==SOUTH?-R:R);  | 
|
| 674 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = (slice==0 ? R : (slice==mSlices ? -R:0) );  | 
|
| 675 | 
     | 
|
| 676 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = 1.0f; //  | 
|
| 677 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f; // TODO  | 
|
| 678 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f; //  | 
|
| 679 | 
     | 
|
| 680 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = (float)(curr.col+1+slice)/mCols;  | 
|
| 681 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f - y;  | 
|
| 677 | 682 | 
    break;  | 
| 678 | 683 | 
    }  | 
| 679 | 
     | 
|
| 680 | 
    if(attribs[8*vertex+6]>1.0f) attribs[8*vertex+6] = 2.0f-attribs[8*vertex+6];  | 
|
| 681 | 
    if(attribs[8*vertex+6]<0.0f) attribs[8*vertex+6] = -attribs[8*vertex+6];  | 
|
| 682 | 
    if(attribs[8*vertex+7]>1.0f) attribs[8*vertex+7] = 2.0f-attribs[8*vertex+7];  | 
|
| 683 | 
    if(attribs[8*vertex+7]<0.0f) attribs[8*vertex+7] = -attribs[8*vertex+7];  | 
|
| 684 | 
     | 
|
| 685 | 
    float tex0 = attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ];  | 
|
| 686 | 
    float tex1 = attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1];  | 
|
| 687 | 
     | 
|
| 688 | 
    if(tex0>1.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = 2.0f-tex0;  | 
|
| 689 | 
    if(tex0<0.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = -tex0;  | 
|
| 690 | 
    if(tex1>1.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 2.0f-tex1;  | 
|
| 691 | 
    if(tex1<0.0f) attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = -tex1;  | 
|
| 692 | 
    }  | 
|
| 693 | 
     | 
|
| 694 | 
    ///////////////////////////////////////////////////////////////////////////////////////////////////  | 
|
| 695 | 
     | 
|
| 696 | 
    private int repeatLast(int vertex, float[] attribs)  | 
|
| 697 | 
         {
   | 
|
| 698 | 
         //android.util.Log.e("CUBES", "repeating last vertex!");
   | 
|
| 699 | 
     | 
|
| 700 | 
    if( vertex>0 )  | 
|
| 701 | 
           {
   | 
|
| 702 | 
    remainingVert--;  | 
|
| 703 | 
     | 
|
| 704 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB ];  | 
|
| 705 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+1];  | 
|
| 706 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+2];  | 
|
| 707 | 
     | 
|
| 708 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB ];  | 
|
| 709 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+1];  | 
|
| 710 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+2];  | 
|
| 711 | 
     | 
|
| 712 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB ];  | 
|
| 713 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+1];  | 
|
| 714 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+2];  | 
|
| 715 | 
     | 
|
| 716 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB ];  | 
|
| 717 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB+1];  | 
|
| 718 | 
     | 
|
| 719 | 
     | 
|
| 720 | 
    vertex++;  | 
|
| 721 | 
    }  | 
|
| 722 | 
     | 
|
| 723 | 
    return vertex;  | 
|
| 684 | 724 | 
    }  | 
| 685 | 725 | 
     | 
| 686 | 726 | 
    ///////////////////////////////////////////////////////////////////////////////////////////////////  | 
| ... | ... | |
| 688 | 728 | 
    private void build()  | 
| 689 | 729 | 
         {
   | 
| 690 | 730 | 
    int vertSoFar=0;  | 
| 691 | 
         float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
   | 
|
| 731 | 
         float[] attribs= new float[VERT_ATTRIBS*numVertices];
   | 
|
| 692 | 732 | 
     | 
| 693 | 733 | 
    vertSoFar = buildFrontBackGrid(true, vertSoFar,attribs);  | 
| 694 | 734 | 
     | 
| src/main/java/org/distorted/library/mesh/MeshFlat.java | ||
|---|---|---|
| 62 | 62 | 
         {
   | 
| 63 | 63 | 
    remainingVert--;  | 
| 64 | 64 | 
     | 
| 65 | 
         attribs[8*vertex  ] = x-0.5f;
   | 
|
| 66 | 
         attribs[8*vertex+1] = 0.5f-y;
   | 
|
| 67 | 
         attribs[8*vertex+2] = 0;
   | 
|
| 65 | 
         attribs[VERT_ATTRIBS*vertex + POS_ATTRIB  ] = x-0.5f;
   | 
|
| 66 | 
         attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = 0.5f-y;
   | 
|
| 67 | 
         attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = 0;
   | 
|
| 68 | 68 | 
     | 
| 69 | 
         attribs[8*vertex+3] = 0.0f;
   | 
|
| 70 | 
         attribs[8*vertex+4] = 0.0f;
   | 
|
| 71 | 
         attribs[8*vertex+5] = 1.0f;
   | 
|
| 69 | 
         attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB  ] = 0.0f;
   | 
|
| 70 | 
         attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = 0.0f;
   | 
|
| 71 | 
         attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = 1.0f;
   | 
|
| 72 | 72 | 
     | 
| 73 | 
    attribs[8*vertex+6] = x;  | 
|
| 74 | 
    attribs[8*vertex+7] = 1.0f-y;  | 
|
| 73 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = 1.0f; //  | 
|
| 74 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = 0.0f; // TODO  | 
|
| 75 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = 0.0f; //  | 
|
| 76 | 
     | 
|
| 77 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = x;  | 
|
| 78 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = 1.0f-y;  | 
|
| 75 | 79 | 
     | 
| 76 | 80 | 
    return vertex+1;  | 
| 77 | 81 | 
    }  | 
| ... | ... | |
| 80 | 84 | 
     | 
| 81 | 85 | 
    private int repeatLast(int vertex, float[] attribs)  | 
| 82 | 86 | 
         {
   | 
| 83 | 
    remainingVert--;  | 
|
| 84 | 
     | 
|
| 85 | 87 | 
         //android.util.Log.e("MeshFlat", "repeating last vertex!");
   | 
| 86 | 88 | 
     | 
| 87 | 89 | 
    if( vertex>0 )  | 
| 88 | 90 | 
           {
   | 
| 89 | 
    attribs[8*vertex ] = attribs[8*vertex-8];  | 
|
| 90 | 
    attribs[8*vertex+1] = attribs[8*vertex-7];  | 
|
| 91 | 
    attribs[8*vertex+2] = attribs[8*vertex-6];  | 
|
| 92 | 
    attribs[8*vertex+3] = attribs[8*vertex-5];  | 
|
| 93 | 
    attribs[8*vertex+4] = attribs[8*vertex-4];  | 
|
| 94 | 
    attribs[8*vertex+5] = attribs[8*vertex-3];  | 
|
| 95 | 
    attribs[8*vertex+6] = attribs[8*vertex-2];  | 
|
| 96 | 
    attribs[8*vertex+7] = attribs[8*vertex-1];  | 
|
| 91 | 
    remainingVert--;  | 
|
| 92 | 
     | 
|
| 93 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB ];  | 
|
| 94 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+1];  | 
|
| 95 | 
    attribs[VERT_ATTRIBS*vertex + POS_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + POS_ATTRIB+2];  | 
|
| 96 | 
     | 
|
| 97 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB ];  | 
|
| 98 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+1];  | 
|
| 99 | 
    attribs[VERT_ATTRIBS*vertex + NOR_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + NOR_ATTRIB+2];  | 
|
| 100 | 
     | 
|
| 101 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB ];  | 
|
| 102 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+1];  | 
|
| 103 | 
    attribs[VERT_ATTRIBS*vertex + INF_ATTRIB+2] = attribs[VERT_ATTRIBS*(vertex-1) + INF_ATTRIB+2];  | 
|
| 104 | 
     | 
|
| 105 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB ] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB ];  | 
|
| 106 | 
    attribs[VERT_ATTRIBS*vertex + TEX_ATTRIB+1] = attribs[VERT_ATTRIBS*(vertex-1) + TEX_ATTRIB+1];  | 
|
| 97 | 107 | 
     | 
| 98 | 108 | 
    vertex++;  | 
| 99 | 109 | 
    }  | 
| ... | ... | |
| 176 | 186 | 
    super(0.0f);  | 
| 177 | 187 | 
    computeNumberOfVertices(cols,rows);  | 
| 178 | 188 | 
     | 
| 179 | 
        float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
   | 
|
| 189 | 
        float[] attribs= new float[VERT_ATTRIBS*numVertices];
   | 
|
| 180 | 190 | 
     | 
| 181 | 191 | 
    buildGrid(attribs);  | 
| 182 | 192 | 
     | 
| 183 | 193 | 
        //android.util.Log.e("MeshFlat", "dataLen="+numVertices);
   | 
| 184 | 
        //android.util.Log.d("MeshFlat", "attribs: "+debug(attribs,8) );
   | 
|
| 194 | 
        //android.util.Log.d("MeshFlat", "attribs: "+debug(attribs,VERT_ATTRIBS) );
   | 
|
| 185 | 195 | 
     | 
| 186 | 196 | 
    if( remainingVert!=0 )  | 
| 187 | 197 | 
          android.util.Log.d("MeshFlat", "remainingVert " +remainingVert );
   | 
| src/main/res/raw/main_vertex_shader.glsl | ||
|---|---|---|
| 22 | 22 | 
     | 
| 23 | 23 | 
    in vec3 a_Position; // Per-vertex position.  | 
| 24 | 24 | 
    in vec3 a_Normal; // Per-vertex normal vector.  | 
| 25 | 
    in vec3 a_Inflate; // This vector describes the direction this vertex needs to go when we 'inflate' the whole mesh.  | 
|
| 26 | 
    // If the mesh is locally smooth, this is equal to the normal vector. Otherwise (on sharp edges) - no.  | 
|
| 25 | 27 | 
    in vec2 a_TexCoordinate; // Per-vertex texture coordinate.  | 
| 28 | 
     | 
|
| 26 | 29 | 
    out vec3 v_Position; //  | 
| 27 | 30 | 
    out vec3 v_endPosition; // for Transform Feedback only  | 
| 28 | 31 | 
    out vec3 v_Normal; //  | 
Also available in: Unified diff
Added a new attribute to vertices of a MeshBase object: the vec3 'inflate' vector.
This vector describes the direction where the vertex needs to be moved when we 'inflate' the whole mesh.
If the mesh is locally smooth, this is simply the normal vector; otherwise (for example in the corners of the MeshCubes) - not.
Currently the new attribute is always set to (1,0,0) and not used yet.