Revision 6f2d931d
Added by Leszek Koltunski over 5 years ago
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 |
|
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.