Revision da681e7e
Added by Leszek Koltunski almost 7 years ago
| src/main/java/org/distorted/library/main/DistortedEffects.java | ||
|---|---|---|
| 426 | 426 | private void displayNormals(MeshBase mesh) | 
| 427 | 427 |     {
 | 
| 428 | 428 | int num = mesh.getNumVertices(); | 
| 429 | int tfo = mesh.getTFO(); | |
| 429 | 430 |  | 
| 430 |     GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mesh.getTFO() );
 | |
| 431 |     GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
 | |
| 431 | 432 | GLES31.glBeginTransformFeedback( GLES31.GL_POINTS); | 
| 432 | 433 | DistortedRenderState.switchOffDrawing(); | 
| 433 | 434 | GLES31.glDrawArrays( GLES31.GL_POINTS, 0, num ); | 
| ... | ... | |
| 437 | 438 |  | 
| 438 | 439 | mNormalProgram.useProgram(); | 
| 439 | 440 | GLES31.glUniformMatrix4fv(mNormalMVPMatrixH, 1, false, mM.getMVP() , 0); | 
| 440 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getTFO() ); | |
| 441 | GLES31.glVertexAttribPointer(mNormalProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, 0); | |
| 442 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); | |
| 441 | mesh.bindTransformAttribs(mNormalProgram); | |
| 443 | 442 | GLES31.glLineWidth(8.0f); | 
| 444 | 443 | GLES31.glDrawArrays(GLES31.GL_LINES, 0, 2*num); | 
| 445 | 444 | } | 
| ... | ... | |
| 470 | 469 | GLES31.glUniform2ui(mMainOITSizeH, surface.mWidth, surface.mHeight); | 
| 471 | 470 | GLES31.glUniform1ui(mMainOITNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) ); | 
| 472 | 471 |  | 
| 473 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() ); | |
| 474 | GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0); | |
| 475 | GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1); | |
| 476 | GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2); | |
| 477 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); | |
| 472 | mesh.bindVertexAttribs(mMainOITProgram); | |
| 478 | 473 |  | 
| 479 | 474 | mM.send(surface,halfW,halfH,halfZ,0,1); | 
| 480 | 475 | mV.send(1); | 
| ... | ... | |
| 508 | 503 | mMainProgram.useProgram(); | 
| 509 | 504 | GLES31.glUniform1i(mMainTextureH, 0); | 
| 510 | 505 |  | 
| 511 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() ); | |
| 512 | GLES31.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0); | |
| 513 | GLES31.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1); | |
| 514 | GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2); | |
| 515 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); | |
| 506 | mesh.bindVertexAttribs(mMainProgram); | |
| 516 | 507 |  | 
| 517 | 508 | mM.send(surface,halfW,halfH,halfZ,0,0); | 
| 518 | 509 | mV.send(0); | 
| src/main/java/org/distorted/library/main/EffectQueuePostprocess.java | ||
|---|---|---|
| 171 | 171 |  | 
| 172 | 172 | mPreProgram.useProgram(); | 
| 173 | 173 |  | 
| 174 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.getVBO() ); | |
| 175 | GLES31.glVertexAttribPointer(mPreProgram.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET0); | |
| 176 | GLES31.glVertexAttribPointer(mPreProgram.mAttribute[1], MeshBase.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET1); | |
| 177 | GLES31.glVertexAttribPointer(mPreProgram.mAttribute[2], MeshBase.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET2); | |
| 178 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); | |
| 174 | mesh.bindVertexAttribs(mPreProgram); | |
| 179 | 175 |  | 
| 180 | 176 | node.getEffects().send(halfW, halfH, halfZ, margin, buffer, 2); | 
| 181 | 177 |  | 
| src/main/java/org/distorted/library/mesh/MeshBase.java | ||
|---|---|---|
| 23 | 23 |  | 
| 24 | 24 | import org.distorted.library.main.Distorted; | 
| 25 | 25 | import org.distorted.library.main.DistortedBuffer; | 
| 26 | import org.distorted.library.program.DistortedProgram; | |
| 26 | 27 |  | 
| 28 | import java.nio.ByteBuffer; | |
| 29 | import java.nio.ByteOrder; | |
| 27 | 30 | import java.nio.FloatBuffer; | 
| 28 | 31 |  | 
| 29 | 32 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 31 | 34 | * Abstract class which represents a Mesh, ie 3 arrays of Vertex attributes: 1) positions | 
| 32 | 35 | * 2) normals 3) texture coordinates. | 
| 33 | 36 | * <p> | 
| 34 |  * If you want to render to a particular shape, extend from here, construct the attrib FloatBuffer
 | |
| 35 |  * and provide correct numVertices.
 | |
| 37 |  * If you want to render to a particular shape, extend from here, construct a float array
 | |
| 38 |  * containing per-vertex attributes, and call back setData().
 | |
| 36 | 39 | */ | 
| 37 | 40 | public abstract class MeshBase | 
| 38 | 41 |    {
 | 
| 39 | private static final int BYTES_PER_FLOAT = 4; | |
| 42 | static final int POS_DATA_SIZE= 3; | |
| 43 | static final int NOR_DATA_SIZE= 3; | |
| 44 | static final int TEX_DATA_SIZE= 2; | |
| 40 | 45 |  | 
| 41 | public static final int POS_DATA_SIZE= 3; | |
| 42 | public static final int NOR_DATA_SIZE= 3; | |
| 43 | public static final int TEX_DATA_SIZE= 2; | |
| 46 | private static final int BYTES_PER_FLOAT = 4; | |
| 44 | 47 |  | 
| 45 |    public static final int OFFSET0 =                                                           0;
 | |
| 46 |    public static final int OFFSET1 = (POS_DATA_SIZE                            )*BYTES_PER_FLOAT;
 | |
| 47 |    public static final int OFFSET2 = (POS_DATA_SIZE+NOR_DATA_SIZE              )*BYTES_PER_FLOAT;
 | |
| 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;
 | |
| 48 | 51 |  | 
| 49 |    public static final int TFSIZE  = (POS_DATA_SIZE+POS_DATA_SIZE              )*BYTES_PER_FLOAT;
 | |
| 50 |    public static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
 | |
| 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;
 | |
| 51 | 54 |  | 
| 52 | 55 | private boolean mShowNormals; // when rendering this mesh, draw normal vectors? | 
| 53 | 56 | private DistortedBuffer mVBO, mTFO; // main vertex buffer and transform feedback buffer | 
| 54 | 57 | private final float zFactor; // strange workaround for the fact that we need to somehow store the 'depth' | 
| 55 | 58 | // of the Mesh. Used in DistortedEffects. See DistortedTexture.getDepth(). | 
| 56 |  | |
| 57 | //////////////////////////////////////////////////////////////////////////////// | |
| 58 | // derived classes need to compute and fill up those 2 variables with data | |
| 59 | // describing a particular shape. Having done so, call setData() | |
| 60 | int mNumVertices; | |
| 61 | FloatBuffer mVertAttribs; // packed: PosX,PosY,PosZ, NorX,NorY,NorZ, TexS,TexT | |
| 62 | //////////////////////////////////////////////////////////////////////////////// | |
| 59 | private int mNumVertices; | |
| 60 | private FloatBuffer mVertAttribs; // packed: PosX,PosY,PosZ, NorX,NorY,NorZ, TexS,TexT | |
| 63 | 61 |  | 
| 64 | 62 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 65 | 63 |  | 
| ... | ... | |
| 75 | 73 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 76 | 74 | // when a derived class is done computing its mesh, it has to call this method. | 
| 77 | 75 |  | 
| 78 |    void setData(int numVertices, FloatBuffer vertAttribs)
 | |
| 76 |    void setData(int numVertices, float[] vertexAttribs)
 | |
| 79 | 77 |      {
 | 
| 80 | mVBO.setData(numVertices*VERTSIZE, vertAttribs); | |
| 81 | mTFO.setData(numVertices*TFSIZE , null ); | |
| 78 | mNumVertices = numVertices; | |
| 79 |  | |
| 80 | mVertAttribs = ByteBuffer.allocateDirect(mNumVertices*VERTSIZE).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
| 81 | mVertAttribs.put(vertexAttribs).position(0); | |
| 82 |  | |
| 83 | mVBO.setData(numVertices*VERTSIZE, mVertAttribs); | |
| 84 | mTFO.setData(numVertices*TFSIZE , null ); | |
| 82 | 85 | } | 
| 83 | 86 |  | 
| 84 | 87 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 87 | 90 | * | 
| 88 | 91 | * @y.exclude | 
| 89 | 92 | */ | 
| 90 |    public int getVBO()
 | |
| 93 |    public int getTFO()
 | |
| 91 | 94 |      {
 | 
| 92 |      return mVBO.mIndex[0];
 | |
| 95 |      return mTFO.mIndex[0];
 | |
| 93 | 96 | } | 
| 94 | 97 |  | 
| 95 | 98 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 98 | 101 | * | 
| 99 | 102 | * @y.exclude | 
| 100 | 103 | */ | 
| 101 |    public int getTFO()
 | |
| 104 |    public int getNumVertices()
 | |
| 102 | 105 |      {
 | 
| 103 |      return mTFO.mIndex[0];
 | |
| 106 |      return mNumVertices;
 | |
| 104 | 107 | } | 
| 105 | 108 |  | 
| 106 | 109 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 109 | 112 | * | 
| 110 | 113 | * @y.exclude | 
| 111 | 114 | */ | 
| 112 |    public int getNumVertices()
 | |
| 115 |    public float getZFactor()
 | |
| 113 | 116 |      {
 | 
| 114 |      return mNumVertices;
 | |
| 117 |      return zFactor;
 | |
| 115 | 118 | } | 
| 116 | 119 |  | 
| 117 | 120 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 120 | 123 | * | 
| 121 | 124 | * @y.exclude | 
| 122 | 125 | */ | 
| 123 |    public float getZFactor()
 | |
| 126 |    public void bindVertexAttribs(DistortedProgram program)
 | |
| 124 | 127 |      {
 | 
| 125 | return zFactor; | |
| 128 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mVBO.mIndex[0] ); | |
| 129 | GLES31.glVertexAttribPointer(program.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshBase.VERTSIZE, MeshBase.OFFSET_POS); | |
| 130 | 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); | |
| 132 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); | |
| 133 | } | |
| 134 |  | |
| 135 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 136 | /** | |
| 137 | * Not part of public API, do not document (public only because has to be used from the main package) | |
| 138 | * | |
| 139 | * @y.exclude | |
| 140 | */ | |
| 141 | public void bindTransformAttribs(DistortedProgram program) | |
| 142 |      {
 | |
| 143 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mTFO.mIndex[0] ); | |
| 144 | GLES31.glVertexAttribPointer(program.mAttribute[0], MeshBase.POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, 0); | |
| 145 | GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); | |
| 126 | 146 | } | 
| 127 | 147 |  | 
| 128 | 148 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| src/main/java/org/distorted/library/mesh/MeshCubes.java | ||
|---|---|---|
| 19 | 19 |  | 
| 20 | 20 | package org.distorted.library.mesh; | 
| 21 | 21 |  | 
| 22 | import java.nio.ByteBuffer; | |
| 23 | import java.nio.ByteOrder; | |
| 24 | 22 | import java.util.ArrayList; | 
| 25 | 23 |  | 
| 26 | 24 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 61 | 59 | private ArrayList<Edge> mEdges = new ArrayList<>(); | 
| 62 | 60 |  | 
| 63 | 61 | private int remainingVert; | 
| 62 | private int numVertices; | |
| 64 | 63 | private int mSideBends; | 
| 65 | 64 | private int mEdgeNum; | 
| 66 | 65 | private int mSideWalls; | 
| ... | ... | |
| 183 | 182 | mRows =0; | 
| 184 | 183 | mCols =0; | 
| 185 | 184 | mSlices =slices; | 
| 186 |      mNumVertices=0;
 | |
| 185 |      numVertices =0;
 | |
| 187 | 186 |  | 
| 188 | 187 |      if( cols>0 && desc.contains("1") )
 | 
| 189 | 188 |        {
 | 
| ... | ... | |
| 197 | 196 | mCubes[i][j] = (desc.charAt(i*mCols+j) == '1' ? 1:0); | 
| 198 | 197 |  | 
| 199 | 198 | markRegions(); | 
| 200 | mNumVertices = computeDataLength(); | |
| 201 |  | |
| 202 | remainingVert = mNumVertices; | |
| 199 | numVertices = computeDataLength(); | |
| 200 | remainingVert = numVertices; | |
| 203 | 201 | } | 
| 204 | 202 | } | 
| 205 | 203 |  | 
| ... | ... | |
| 211 | 209 | mRows =rows; | 
| 212 | 210 | mCols =cols; | 
| 213 | 211 | mSlices =slices; | 
| 214 |      mNumVertices =   0;
 | |
| 212 |      numVertices  =0;
 | |
| 215 | 213 |  | 
| 216 | 214 | if( cols>0 && rows>0 ) | 
| 217 | 215 |        {
 | 
| ... | ... | |
| 222 | 220 | mCubes[i][j] = 1; | 
| 223 | 221 |  | 
| 224 | 222 | markRegions(); | 
| 225 | mNumVertices = computeDataLength(); | |
| 226 |  | |
| 227 | remainingVert = mNumVertices; | |
| 223 | numVertices = computeDataLength(); | |
| 224 | remainingVert = numVertices; | |
| 228 | 225 | } | 
| 229 | 226 | } | 
| 230 | 227 |  | 
| ... | ... | |
| 691 | 688 | private void build() | 
| 692 | 689 |      {
 | 
| 693 | 690 | int vertSoFar=0; | 
| 694 |      float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*mNumVertices];
 | |
| 691 |      float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
 | |
| 695 | 692 |  | 
| 696 | 693 | vertSoFar = buildFrontBackGrid(true, vertSoFar,attribs); | 
| 697 | 694 |  | 
| ... | ... | |
| 713 | 710 | if( remainingVert!=0 ) | 
| 714 | 711 |        android.util.Log.e("MeshCubes", "remainingVert " +remainingVert );
 | 
| 715 | 712 |  | 
| 716 | mVertAttribs = ByteBuffer.allocateDirect(mNumVertices*VERTSIZE).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
| 717 | mVertAttribs.put(attribs).position(0); | |
| 718 |  | |
| 719 | setData(mNumVertices, mVertAttribs); | |
| 713 | setData(numVertices, attribs); | |
| 720 | 714 | } | 
| 721 | 715 |  | 
| 722 | 716 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| src/main/java/org/distorted/library/mesh/MeshFlat.java | ||
|---|---|---|
| 19 | 19 |  | 
| 20 | 20 | package org.distorted.library.mesh; | 
| 21 | 21 |  | 
| 22 | import java.nio.ByteBuffer; | |
| 23 | import java.nio.ByteOrder; | |
| 24 |  | |
| 25 | 22 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 26 | 23 | /** | 
| 27 | 24 | * Create a flat, rectangular grid. | 
| ... | ... | |
| 33 | 30 |   {
 | 
| 34 | 31 | private int mCols, mRows; | 
| 35 | 32 | private int remainingVert; | 
| 33 | private int numVertices; | |
| 36 | 34 |  | 
| 37 | 35 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 38 | 36 | // Create a flat, full grid. | 
| ... | ... | |
| 44 | 42 |  | 
| 45 | 43 | if( cols==1 && rows==1 ) | 
| 46 | 44 |        {
 | 
| 47 |        mNumVertices = 4;
 | |
| 45 |        numVertices = 4;
 | |
| 48 | 46 | } | 
| 49 | 47 | else | 
| 50 | 48 |        {
 | 
| 51 |        mNumVertices = 2*( mRows*mCols +2*mRows - 1) +2*(mCols>=2 ? mRows:0) +
 | |
| 49 |        numVertices = 2*( mRows*mCols +2*mRows - 1) +2*(mCols>=2 ? mRows:0) +
 | |
| 52 | 50 | (mCols>=2 && mRows>=2 ? 2*mRows-2 : 1); | 
| 53 | 51 | } | 
| 54 | 52 |  | 
| 55 | 53 |      //android.util.Log.e("MeshFlat","vertices="+numVertices+" rows="+mRows+" cols="+mCols);
 | 
| 56 | 54 |  | 
| 57 |      remainingVert = mNumVertices;
 | |
| 55 |      remainingVert = numVertices;
 | |
| 58 | 56 | } | 
| 59 | 57 |  | 
| 60 | 58 |  | 
| ... | ... | |
| 178 | 176 | super(0.0f); | 
| 179 | 177 | computeNumberOfVertices(cols,rows); | 
| 180 | 178 |  | 
| 181 |     float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*mNumVertices];
 | |
| 179 |     float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
 | |
| 182 | 180 |  | 
| 183 | 181 | buildGrid(attribs); | 
| 184 | 182 |  | 
| ... | ... | |
| 188 | 186 | if( remainingVert!=0 ) | 
| 189 | 187 |       android.util.Log.d("MeshFlat", "remainingVert " +remainingVert );
 | 
| 190 | 188 |  | 
| 191 | mVertAttribs = ByteBuffer.allocateDirect(mNumVertices*VERTSIZE).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
| 192 | mVertAttribs.put(attribs).position(0); | |
| 193 |  | |
| 194 | setData(mNumVertices, mVertAttribs); | |
| 189 | setData(numVertices, attribs); | |
| 195 | 190 | } | 
| 196 | 191 | } | 
Also available in: Unified diff
Some simplifications in Meshes. Hide stuff inside MeshBase.