Revision da681e7e
Added by Leszek Koltunski about 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.