Revision cab7c165
Added by Leszek Koltunski over 7 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.