Revision cab7c165
Added by Leszek Koltunski over 8 years ago
| src/main/java/org/distorted/library/DistortedEffects.java | ||
|---|---|---|
| 38 | 38 |
import org.distorted.library.type.Static3D; |
| 39 | 39 |
|
| 40 | 40 |
import java.io.InputStream; |
| 41 |
import java.nio.Buffer; |
|
| 41 | 42 |
import java.nio.ByteBuffer; |
| 42 | 43 |
import java.nio.ByteOrder; |
| 43 | 44 |
import java.nio.FloatBuffer; |
| ... | ... | |
| 103 | 104 |
static void createProgram(Resources resources) |
| 104 | 105 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException |
| 105 | 106 |
{
|
| 107 |
// MAIN PROGRAM //////////////////////////////////// |
|
| 106 | 108 |
final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader); |
| 107 | 109 |
final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader); |
| 108 | 110 |
|
| ... | ... | |
| 140 | 142 |
//android.util.Log.e("Effects", "vertHeader= "+mainVertHeader);
|
| 141 | 143 |
//android.util.Log.e("Effects", "fragHeader= "+mainFragHeader);
|
| 142 | 144 |
|
| 143 |
mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL); |
|
| 145 |
String[] feedback = { "v_Position","v_Normal","v_TexCoordinate" };
|
|
| 146 |
|
|
| 147 |
mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL, feedback); |
|
| 144 | 148 |
|
| 145 | 149 |
int mainProgramH = mMainProgram.getProgramHandle(); |
| 146 | 150 |
EffectQueueFragment.getUniforms(mainProgramH); |
| ... | ... | |
| 169 | 173 |
mBlitTextureH = GLES30.glGetUniformLocation( blitProgramH, "u_Texture"); |
| 170 | 174 |
mBlitDepthH = GLES30.glGetUniformLocation( blitProgramH, "u_Depth"); |
| 171 | 175 |
|
| 172 |
// DEBUG ONLY //////////////////////////////////////
|
|
| 176 |
// DEBUG PROGRAM //////////////////////////////////////
|
|
| 173 | 177 |
final InputStream debugVertexStream = resources.openRawResource(R.raw.test_vertex_shader); |
| 174 | 178 |
final InputStream debugFragmentStream = resources.openRawResource(R.raw.test_fragment_shader); |
| 175 | 179 |
|
| ... | ... | |
| 184 | 188 |
} |
| 185 | 189 |
|
| 186 | 190 |
int debugProgramH = mDebugProgram.getProgramHandle(); |
| 187 |
mDebugObjDH = GLES30.glGetUniformLocation( debugProgramH, "u_objD"); |
|
| 191 |
mDebugObjDH = GLES30.glGetUniformLocation( debugProgramH, "u_objD");
|
|
| 188 | 192 |
mDebugMVPMatrixH = GLES30.glGetUniformLocation( debugProgramH, "u_MVPMatrix"); |
| 189 |
// END DEBUG ////////////////////////////////////// |
|
| 190 | 193 |
} |
| 191 | 194 |
|
| 192 | 195 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 280 | 283 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
| 281 | 284 |
} |
| 282 | 285 |
|
| 286 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 287 |
|
|
| 288 |
private void displayTransformFeedback(MeshObject mesh) |
|
| 289 |
{
|
|
| 290 |
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mesh.mAttTFO[0]); |
|
| 291 |
GLES30.glBeginTransformFeedback( GLES30.GL_POINTS); |
|
| 292 |
|
|
| 293 |
DistortedRenderState.switchOffDrawing(); |
|
| 294 |
GLES30.glDrawArrays( GLES30.GL_POINTS, 0, mesh.numVertices); |
|
| 295 |
DistortedRenderState.restoreDrawing(); |
|
| 296 |
|
|
| 297 |
int error = GLES30.glGetError(); |
|
| 298 |
|
|
| 299 |
if( error != GLES30.GL_NO_ERROR ) |
|
| 300 |
{
|
|
| 301 |
throw new RuntimeException("DrawArrays: glError 0x" + Integer.toHexString(error));
|
|
| 302 |
} |
|
| 303 |
|
|
| 304 |
int size = (MeshObject.POS_DATA_SIZE+MeshObject.NOR_DATA_SIZE+MeshObject.TEX_DATA_SIZE)*mesh.numVertices; |
|
| 305 |
|
|
| 306 |
Buffer mappedBuffer = GLES30.glMapBufferRange(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 4*size, GLES30.GL_MAP_READ_BIT); |
|
| 307 |
FloatBuffer fb = ((ByteBuffer) mappedBuffer).order(ByteOrder.nativeOrder()).asFloatBuffer(); |
|
| 308 |
String msg = ""; |
|
| 309 |
|
|
| 310 |
for(int i=0; i<size; i++) msg += (" "+fb.get(i));
|
|
| 311 |
|
|
| 312 |
android.util.Log.d( "Feedback", msg); |
|
| 313 |
|
|
| 314 |
GLES30.glUnmapBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER); |
|
| 315 |
GLES30.glEndTransformFeedback(); |
|
| 316 |
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0); |
|
| 317 |
} |
|
| 318 |
|
|
| 283 | 319 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 284 | 320 |
|
| 285 | 321 |
void drawPriv(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime) |
| ... | ... | |
| 293 | 329 |
GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight ); |
| 294 | 330 |
|
| 295 | 331 |
mMainProgram.useProgram(); |
| 296 |
GLES30.glUniform1i(mMainTextureH, 0); |
|
| 297 | 332 |
surface.setAsOutput(currTime); |
| 333 |
GLES30.glUniform1i(mMainTextureH, 0); |
|
| 334 |
|
|
| 335 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mAttVBO[0]); |
|
| 336 |
GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0); |
|
| 337 |
GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1); |
|
| 338 |
GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
|
| 339 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0 ); |
|
| 340 |
|
|
| 298 | 341 |
mM.send(surface,halfW,halfH,halfZ); |
| 299 | 342 |
mV.send(halfW,halfH,halfZ); |
| 343 |
|
|
| 344 |
displayTransformFeedback(mesh); |
|
| 345 |
|
|
| 300 | 346 |
mF.send(halfW,halfH); |
| 301 | 347 |
|
| 302 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mAttVBO[0]); |
|
| 303 |
GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0); |
|
| 304 |
GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NORMAL_DATA_SIZE , GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1); |
|
| 305 |
GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE , GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
|
| 306 | 348 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.numVertices); |
| 307 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0 ); |
|
| 308 | 349 |
|
| 309 | 350 |
/// DEBUG ONLY ////// |
| 310 | 351 |
// displayBoundingRect(halfW, halfH, halfZ, surface, mM.getMVP(), mesh.getBoundingVertices() ); |
| src/main/java/org/distorted/library/DistortedRenderState.java | ||
|---|---|---|
| 124 | 124 |
} |
| 125 | 125 |
} |
| 126 | 126 |
|
| 127 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 128 |
|
|
| 129 |
static void switchOffDrawing() |
|
| 130 |
{
|
|
| 131 |
GLES30.glEnable(GLES30.GL_SCISSOR_TEST); |
|
| 132 |
GLES30.glScissor(0,0,0,0); |
|
| 133 |
} |
|
| 134 |
|
|
| 135 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 136 |
|
|
| 137 |
static void restoreDrawing() |
|
| 138 |
{
|
|
| 139 |
GLES30.glDisable(GLES30.GL_SCISSOR_TEST); |
|
| 140 |
} |
|
| 141 |
|
|
| 127 | 142 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 128 | 143 |
|
| 129 | 144 |
void apply() |
| src/main/java/org/distorted/library/MeshCubes.java | ||
|---|---|---|
| 891 | 891 |
private void build(boolean frontOnly) |
| 892 | 892 |
{
|
| 893 | 893 |
int vertSoFar=0; |
| 894 |
float[] attribs= new float[(POSITION_DATA_SIZE+NORMAL_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
|
|
| 894 |
float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
|
|
| 895 | 895 |
|
| 896 | 896 |
//android.util.Log.d("MeshCubes","building front grid...");
|
| 897 | 897 |
|
| src/main/java/org/distorted/library/MeshFlat.java | ||
|---|---|---|
| 188 | 188 |
super(0.0f); |
| 189 | 189 |
computeNumberOfVertices(cols,rows); |
| 190 | 190 |
|
| 191 |
float[] attribs= new float[(POSITION_DATA_SIZE+NORMAL_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
|
|
| 191 |
float[] attribs= new float[(POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*numVertices];
|
|
| 192 | 192 |
|
| 193 | 193 |
buildGrid(attribs); |
| 194 | 194 |
|
| src/main/java/org/distorted/library/MeshObject.java | ||
|---|---|---|
| 35 | 35 |
{
|
| 36 | 36 |
private static final int BYTES_PER_FLOAT = 4; |
| 37 | 37 |
|
| 38 |
static final int POSITION_DATA_SIZE= 3;
|
|
| 39 |
static final int NORMAL_DATA_SIZE = 3;
|
|
| 40 |
static final int TEX_DATA_SIZE = 2;
|
|
| 38 |
static final int POS_DATA_SIZE= 3; |
|
| 39 |
static final int NOR_DATA_SIZE= 3;
|
|
| 40 |
static final int TEX_DATA_SIZE= 2; |
|
| 41 | 41 |
|
| 42 |
static final int OFFSET0 = 0;
|
|
| 43 |
static final int OFFSET1 = (POSITION_DATA_SIZE )*BYTES_PER_FLOAT;
|
|
| 44 |
static final int OFFSET2 = (POSITION_DATA_SIZE+NORMAL_DATA_SIZE )*BYTES_PER_FLOAT;
|
|
| 45 |
static final int VERTSIZE= (POSITION_DATA_SIZE+NORMAL_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
|
|
| 42 |
static final int OFFSET0 = 0; |
|
| 43 |
static final int OFFSET1 = (POS_DATA_SIZE )*BYTES_PER_FLOAT;
|
|
| 44 |
static final int OFFSET2 = (POS_DATA_SIZE+NOR_DATA_SIZE )*BYTES_PER_FLOAT;
|
|
| 45 |
static final int VERTSIZE= (POS_DATA_SIZE+NOR_DATA_SIZE+TEX_DATA_SIZE)*BYTES_PER_FLOAT;
|
|
| 46 | 46 |
|
| 47 | 47 |
int numVertices; |
| 48 | 48 |
FloatBuffer mVertAttribs; // packed: PosX,PosY,PosZ, NorX, NorY,NorZ, TexS, TexT |
| 49 | 49 |
int[] mAttVBO = new int[1]; // server-side packed vertex attributes |
| 50 |
int[] mAttTFO = new int[1]; // transform feedback |
|
| 50 | 51 |
|
| 51 | 52 |
final float zFactor; // strange workaround for the fact that we need to somehow store the 'depth' |
| 52 | 53 |
// of the Mesh. Used in DistortedEffects. See DistortedTexture.getDepth(). |
| ... | ... | |
| 76 | 77 |
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, numVertices*VERTSIZE, mVertAttribs, GLES30.GL_STATIC_READ); |
| 77 | 78 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0); |
| 78 | 79 |
} |
| 80 |
if( mAttTFO[0]<0 ) |
|
| 81 |
{
|
|
| 82 |
GLES30.glGenBuffers(1, mAttTFO, 0); |
|
| 83 |
GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, mAttTFO[0]); |
|
| 84 |
GLES30.glBufferData(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, numVertices*VERTSIZE, null, GLES30.GL_STATIC_READ); |
|
| 85 |
GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0); |
|
| 86 |
} |
|
| 79 | 87 |
} |
| 80 | 88 |
|
| 81 | 89 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 88 | 96 |
GLES30.glDeleteBuffers(1, mAttVBO, 0); |
| 89 | 97 |
mAttVBO[0] = -1; |
| 90 | 98 |
} |
| 99 |
if( mAttTFO[0]>=0 ) |
|
| 100 |
{
|
|
| 101 |
GLES30.glDeleteBuffers(1, mAttTFO, 0); |
|
| 102 |
mAttTFO[0] = -1; |
|
| 103 |
} |
|
| 91 | 104 |
} |
| 92 | 105 |
|
| 93 | 106 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 95 | 108 |
void recreate() |
| 96 | 109 |
{
|
| 97 | 110 |
mAttVBO[0] = -1; |
| 111 |
mAttTFO[0] = -1; |
|
| 98 | 112 |
} |
| 99 | 113 |
|
| 100 | 114 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
Also available in: Unified diff
Beginning of support for actual Transform Feedback.