Revision c90b9e01
Added by Leszek Koltunski almost 9 years ago
| src/main/java/org/distorted/library/Distorted.java | ||
|---|---|---|
| 113 | 113 |
{
|
| 114 | 114 |
final Resources resources = context.getResources(); |
| 115 | 115 |
|
| 116 |
final InputStream mainVertexStream = resources.openRawResource(R.raw.main_vertex_shader); |
|
| 117 |
final InputStream mainFragmentStream = resources.openRawResource(R.raw.main_fragment_shader); |
|
| 118 |
|
|
| 119 |
String mainVertexHeader= ("#version 100\n#define NUM_VERTEX " + DistortedEffects.getMaxVertex()+"\n");
|
|
| 120 |
|
|
| 121 |
for(EffectNames name: EffectNames.values() ) |
|
| 122 |
{
|
|
| 123 |
if( name.getType()== EffectTypes.VERTEX) |
|
| 124 |
mainVertexHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
|
|
| 125 |
} |
|
| 126 |
|
|
| 127 |
String mainFragmentHeader= ("#version 100\n#define NUM_FRAGMENT " + DistortedEffects.getMaxFragment()+"\n");
|
|
| 128 |
|
|
| 129 |
for(EffectNames name: EffectNames.values() ) |
|
| 130 |
{
|
|
| 131 |
if( name.getType()== EffectTypes.FRAGMENT) |
|
| 132 |
mainFragmentHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
|
|
| 133 |
} |
|
| 134 |
|
|
| 135 |
DistortedProgram mainProgram = new DistortedProgram(mainVertexStream,mainFragmentStream, mainVertexHeader, mainFragmentHeader); |
|
| 136 |
int mainProgramH = mainProgram.getProgramHandle(); |
|
| 137 |
|
|
| 138 | 116 |
GLES20.glDepthFunc(GLES20.GL_LEQUAL); |
| 139 | 117 |
GLES20.glEnable(GLES20.GL_BLEND); |
| 140 | 118 |
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); |
| ... | ... | |
| 142 | 120 |
GLES20.glCullFace(GLES20.GL_BACK); |
| 143 | 121 |
GLES20.glFrontFace(GLES20.GL_CW); |
| 144 | 122 |
|
| 145 |
EffectQueueFragment.getUniforms(mainProgramH); |
|
| 146 |
EffectQueueVertex.getUniforms(mainProgramH); |
|
| 147 |
EffectQueueMatrix.getUniforms(mainProgramH); |
|
| 148 |
DistortedTexture.getUniforms(mainProgramH); |
|
| 123 |
DistortedEffects.createProgram(resources); |
|
| 124 |
EffectQueuePostprocess.createProgram(resources); |
|
| 149 | 125 |
|
| 150 |
final InputStream postVertexStream = resources.openRawResource(R.raw.post_vertex_shader); |
|
| 151 |
final InputStream postFragmentStream = resources.openRawResource(R.raw.post_fragment_shader); |
|
| 152 |
|
|
| 153 |
String postFragmentHeader= ("#version 100\n#define NUM_POSTPROCESS " + DistortedEffects.getMaxPostprocess()+"\n");
|
|
| 154 |
|
|
| 155 |
for(EffectNames name: EffectNames.values() ) |
|
| 156 |
{
|
|
| 157 |
if( name.getType()== EffectTypes.POSTPROCESS) |
|
| 158 |
postFragmentHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
|
|
| 159 |
} |
|
| 160 |
|
|
| 161 |
DistortedProgram postProgram = new DistortedProgram(postVertexStream,postFragmentStream, "", postFragmentHeader); |
|
| 162 |
int postProgramH = postProgram.getProgramHandle(); |
|
| 163 |
|
|
| 164 |
EffectQueuePostprocess.getUniforms(postProgramH); |
|
| 165 |
|
|
| 166 |
DistortedEffects.setProgram(mainProgram); |
|
| 167 |
EffectQueuePostprocess.setProgram(postProgram); |
|
| 168 | 126 |
DistortedTree.reset(); |
| 169 | 127 |
EffectMessageSender.startSending(); |
| 128 |
|
|
| 129 |
mInitialized = true; |
|
| 170 | 130 |
} |
| 171 | 131 |
|
| 172 | 132 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/library/DistortedEffects.java | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
package org.distorted.library; |
| 21 | 21 |
|
| 22 |
import android.content.res.Resources; |
|
| 22 | 23 |
import android.opengl.GLES20; |
| 23 | 24 |
import android.opengl.Matrix; |
| 24 | 25 |
|
| 25 | 26 |
import org.distorted.library.message.EffectListener; |
| 26 | 27 |
import org.distorted.library.program.DistortedProgram; |
| 28 |
import org.distorted.library.program.FragmentCompilationException; |
|
| 29 |
import org.distorted.library.program.FragmentUniformsException; |
|
| 30 |
import org.distorted.library.program.LinkingException; |
|
| 31 |
import org.distorted.library.program.VertexCompilationException; |
|
| 32 |
import org.distorted.library.program.VertexUniformsException; |
|
| 27 | 33 |
import org.distorted.library.type.Data1D; |
| 28 | 34 |
import org.distorted.library.type.Data2D; |
| 29 | 35 |
import org.distorted.library.type.Data3D; |
| ... | ... | |
| 31 | 37 |
import org.distorted.library.type.Data5D; |
| 32 | 38 |
import org.distorted.library.type.Static3D; |
| 33 | 39 |
|
| 40 |
import java.io.InputStream; |
|
| 34 | 41 |
import java.nio.ByteBuffer; |
| 35 | 42 |
import java.nio.ByteOrder; |
| 36 | 43 |
import java.nio.FloatBuffer; |
| ... | ... | |
| 49 | 56 |
|
| 50 | 57 |
private static DistortedProgram mProgram; |
| 51 | 58 |
|
| 59 |
/// DEBUG ONLY ///// |
|
| 60 |
private static DistortedProgram mDebugProgram; |
|
| 61 |
private static final FloatBuffer mQuadPositions; |
|
| 62 |
|
|
| 63 |
static |
|
| 64 |
{
|
|
| 65 |
float[] positionData= { -0.5f, -0.5f, -0.5f, 0.5f, 0.5f,-0.5f, 0.5f, 0.5f };
|
|
| 66 |
mQuadPositions = ByteBuffer.allocateDirect(32).order(ByteOrder.nativeOrder()).asFloatBuffer(); |
|
| 67 |
mQuadPositions.put(positionData).position(0); |
|
| 68 |
} |
|
| 69 |
|
|
| 70 |
private static int mObjDH; |
|
| 71 |
private static int mMVPMatrixH; |
|
| 72 |
/// END DEBUG ////// |
|
| 73 |
|
|
| 52 | 74 |
private static float[] mMVPMatrix = new float[16]; |
| 53 | 75 |
private static float[] mTmpMatrix = new float[16]; |
| 54 | 76 |
|
| ... | ... | |
| 66 | 88 |
|
| 67 | 89 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 68 | 90 |
|
| 69 |
static void setProgram(DistortedProgram p) |
|
| 91 |
static void createProgram(Resources resources) |
|
| 92 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException |
|
| 70 | 93 |
{
|
| 71 |
mProgram = p; |
|
| 94 |
final InputStream mainVertexStream = resources.openRawResource(R.raw.main_vertex_shader); |
|
| 95 |
final InputStream mainFragmentStream = resources.openRawResource(R.raw.main_fragment_shader); |
|
| 96 |
|
|
| 97 |
String mainVertexHeader= ("#version 100\n#define NUM_VERTEX " + getMaxVertex()+"\n");
|
|
| 98 |
|
|
| 99 |
for(EffectNames name: EffectNames.values() ) |
|
| 100 |
{
|
|
| 101 |
if( name.getType()== EffectTypes.VERTEX) |
|
| 102 |
mainVertexHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
|
|
| 103 |
} |
|
| 104 |
|
|
| 105 |
String mainFragmentHeader= ("#version 100\n#define NUM_FRAGMENT " + getMaxFragment()+"\n");
|
|
| 106 |
|
|
| 107 |
for(EffectNames name: EffectNames.values() ) |
|
| 108 |
{
|
|
| 109 |
if( name.getType()== EffectTypes.FRAGMENT) |
|
| 110 |
mainFragmentHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
|
|
| 111 |
} |
|
| 112 |
|
|
| 113 |
mProgram = new DistortedProgram(mainVertexStream,mainFragmentStream, mainVertexHeader, mainFragmentHeader); |
|
| 114 |
|
|
| 115 |
int mainProgramH = mProgram.getProgramHandle(); |
|
| 116 |
EffectQueueFragment.getUniforms(mainProgramH); |
|
| 117 |
EffectQueueVertex.getUniforms(mainProgramH); |
|
| 118 |
EffectQueueMatrix.getUniforms(mainProgramH); |
|
| 119 |
DistortedTexture.getUniforms(mainProgramH); |
|
| 120 |
|
|
| 121 |
// DEBUG ONLY ////////////////////////////////////// |
|
| 122 |
final InputStream debugVertexStream = resources.openRawResource(R.raw.test_vertex_shader); |
|
| 123 |
final InputStream debugFragmentStream = resources.openRawResource(R.raw.test_fragment_shader); |
|
| 124 |
|
|
| 125 |
mDebugProgram = new DistortedProgram(debugVertexStream,debugFragmentStream, "#version 100\n", "#version 100\n"); |
|
| 126 |
|
|
| 127 |
int debugProgramH = mDebugProgram.getProgramHandle(); |
|
| 128 |
mObjDH = GLES20.glGetUniformLocation( debugProgramH, "u_objD"); |
|
| 129 |
mMVPMatrixH = GLES20.glGetUniformLocation( debugProgramH, "u_MVPMatrix"); |
|
| 130 |
// END DEBUG ////////////////////////////////////// |
|
| 72 | 131 |
} |
| 73 | 132 |
|
| 74 | 133 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 121 | 180 |
} |
| 122 | 181 |
|
| 123 | 182 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 124 |
|
|
| 183 |
// DEBUG ONLY |
|
| 184 |
|
|
| 185 |
private void displayBoundingRect(float halfX, float halfY, float halfZ, DistortedFramebuffer df, float[] mvp, float[] vertices) |
|
| 186 |
{
|
|
| 187 |
int len = vertices.length/3; |
|
| 188 |
int minx = Integer.MAX_VALUE; |
|
| 189 |
int maxx = Integer.MIN_VALUE; |
|
| 190 |
int miny = Integer.MAX_VALUE; |
|
| 191 |
int maxy = Integer.MIN_VALUE; |
|
| 192 |
int wx,wy; |
|
| 193 |
|
|
| 194 |
float x,y,z, X,Y,W, ndcX,ndcY; |
|
| 195 |
|
|
| 196 |
for(int i=0; i<len; i++) |
|
| 197 |
{
|
|
| 198 |
x = 2*halfX*vertices[3*i ]; |
|
| 199 |
y = 2*halfY*vertices[3*i+1]; |
|
| 200 |
z = 2*halfZ*vertices[3*i+2]; |
|
| 201 |
|
|
| 202 |
X = mvp[ 0]*x + mvp[ 4]*y + mvp[ 8]*z + mvp[12]; |
|
| 203 |
Y = mvp[ 1]*x + mvp[ 5]*y + mvp[ 9]*z + mvp[13]; |
|
| 204 |
W = mvp[ 3]*x + mvp[ 7]*y + mvp[11]*z + mvp[15]; |
|
| 205 |
|
|
| 206 |
ndcX = X/W; |
|
| 207 |
ndcY = Y/W; |
|
| 208 |
|
|
| 209 |
wx = (int)(df.mWidth *(ndcX+1)/2); |
|
| 210 |
wy = (int)(df.mHeight*(ndcY+1)/2); |
|
| 211 |
|
|
| 212 |
if( wx<minx ) minx = wx; |
|
| 213 |
if( wx>maxx ) maxx = wx; |
|
| 214 |
if( wy<miny ) miny = wy; |
|
| 215 |
if( wy>maxy ) maxy = wy; |
|
| 216 |
} |
|
| 217 |
|
|
| 218 |
mDebugProgram.useProgram(); |
|
| 219 |
df.setAsOutput(); |
|
| 220 |
|
|
| 221 |
Matrix.setIdentityM(mTmpMatrix, 0); |
|
| 222 |
Matrix.translateM(mTmpMatrix, 0, -df.mWidth/2, df.mHeight/2, -df.mDistance); |
|
| 223 |
|
|
| 224 |
Matrix.translateM(mTmpMatrix, 0, minx, -df.mHeight+maxy, 0.0f); |
|
| 225 |
Matrix.scaleM(mTmpMatrix, 0, (float)(maxx-minx)/(2*halfX), (float)(maxy-miny)/(2*halfY), 1.0f); |
|
| 226 |
|
|
| 227 |
Matrix.translateM(mTmpMatrix, 0, halfX,-halfY, 0); |
|
| 228 |
Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0); |
|
| 229 |
|
|
| 230 |
GLES20.glUniform2f( mObjDH , 2*halfX, 2*halfY); |
|
| 231 |
GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0); |
|
| 232 |
|
|
| 233 |
GLES20.glVertexAttribPointer(mDebugProgram.mAttribute[0], 2, GLES20.GL_FLOAT, false, 0, mQuadPositions); |
|
| 234 |
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); |
|
| 235 |
} |
|
| 236 |
|
|
| 237 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 238 |
|
|
| 125 | 239 |
void drawPriv(float halfInputW, float halfInputH, MeshObject mesh, DistortedFramebuffer df, long currTime) |
| 126 | 240 |
{
|
| 127 | 241 |
mM.compute(currTime); |
| ... | ... | |
| 174 | 288 |
mP.render(df.mWidth, df.mHeight, mMVPMatrix, df); |
| 175 | 289 |
} |
| 176 | 290 |
} |
| 291 |
|
|
| 292 |
/// DEBUG ONLY ////// |
|
| 293 |
displayBoundingRect(halfInputH, halfInputW, halfZ, df, mM.getMVP(), mesh.getBoundingVertices() ); |
|
| 294 |
/// END DEBUG /////// |
|
| 177 | 295 |
} |
| 178 | 296 |
|
| 179 | 297 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/library/EffectQueuePostprocess.java | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
package org.distorted.library; |
| 21 | 21 |
|
| 22 |
import android.content.res.Resources; |
|
| 22 | 23 |
import android.opengl.GLES20; |
| 23 | 24 |
|
| 24 | 25 |
import org.distorted.library.message.EffectMessage; |
| 25 | 26 |
import org.distorted.library.program.DistortedProgram; |
| 27 |
import org.distorted.library.program.FragmentCompilationException; |
|
| 28 |
import org.distorted.library.program.FragmentUniformsException; |
|
| 29 |
import org.distorted.library.program.LinkingException; |
|
| 30 |
import org.distorted.library.program.VertexCompilationException; |
|
| 31 |
import org.distorted.library.program.VertexUniformsException; |
|
| 26 | 32 |
import org.distorted.library.type.Data1D; |
| 27 | 33 |
import org.distorted.library.type.Data2D; |
| 28 | 34 |
import org.distorted.library.type.Dynamic1D; |
| ... | ... | |
| 30 | 36 |
import org.distorted.library.type.Static1D; |
| 31 | 37 |
import org.distorted.library.type.Static2D; |
| 32 | 38 |
|
| 39 |
import java.io.InputStream; |
|
| 33 | 40 |
import java.nio.ByteBuffer; |
| 34 | 41 |
import java.nio.ByteOrder; |
| 35 | 42 |
import java.nio.FloatBuffer; |
| ... | ... | |
| 75 | 82 |
super(id,NUM_UNIFORMS,NUM_CACHE,INDEX ); |
| 76 | 83 |
} |
| 77 | 84 |
|
| 85 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 86 |
|
|
| 87 |
static void createProgram(Resources resources) |
|
| 88 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException |
|
| 89 |
{
|
|
| 90 |
final InputStream postVertexStream = resources.openRawResource(R.raw.post_vertex_shader); |
|
| 91 |
final InputStream postFragmentStream = resources.openRawResource(R.raw.post_fragment_shader); |
|
| 92 |
|
|
| 93 |
String postFragmentHeader= ("#version 100\n#define NUM_POSTPROCESS " + DistortedEffects.getMaxPostprocess()+"\n");
|
|
| 94 |
|
|
| 95 |
for(EffectNames name: EffectNames.values() ) |
|
| 96 |
{
|
|
| 97 |
if( name.getType()== EffectTypes.POSTPROCESS) |
|
| 98 |
postFragmentHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
|
|
| 99 |
} |
|
| 100 |
|
|
| 101 |
mProgram = new DistortedProgram(postVertexStream,postFragmentStream, "", postFragmentHeader); |
|
| 102 |
|
|
| 103 |
int postProgramH = mProgram.getProgramHandle(); |
|
| 104 |
getUniforms(postProgramH); |
|
| 105 |
} |
|
| 106 |
|
|
| 78 | 107 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 79 | 108 |
|
| 80 | 109 |
static void getUniforms(int mProgramH) |
| ... | ... | |
| 86 | 115 |
mMVPMatrixH = GLES20.glGetUniformLocation(mProgramH, "u_MVPMatrix"); |
| 87 | 116 |
} |
| 88 | 117 |
|
| 89 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 90 |
|
|
| 91 |
static void setProgram(DistortedProgram p) |
|
| 92 |
{
|
|
| 93 |
mProgram = p; |
|
| 94 |
} |
|
| 95 |
|
|
| 96 | 118 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 97 | 119 |
|
| 98 | 120 |
synchronized void compute(long currTime) |
| src/main/res/raw/main_fragment_shader.glsl | ||
|---|---|---|
| 105 | 105 |
} |
| 106 | 106 |
#endif |
| 107 | 107 |
|
| 108 |
gl_FragColor = vec4(pixel.rgb * v_Normal.z, pixel.a);
|
|
| 108 |
gl_FragColor = vec4(pixel.rgb * (1.0 + 7.0*v_Normal.z) * 0.125, pixel.a);
|
|
| 109 | 109 |
} |
| src/main/res/raw/test_fragment_shader.glsl | ||
|---|---|---|
| 1 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 2 |
// Copyright 2016 Leszek Koltunski // |
|
| 3 |
// // |
|
| 4 |
// This file is part of Distorted. // |
|
| 5 |
// // |
|
| 6 |
// Distorted is free software: you can redistribute it and/or modify // |
|
| 7 |
// it under the terms of the GNU General Public License as published by // |
|
| 8 |
// the Free Software Foundation, either version 2 of the License, or // |
|
| 9 |
// (at your option) any later version. // |
|
| 10 |
// // |
|
| 11 |
// Distorted is distributed in the hope that it will be useful, // |
|
| 12 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|
| 13 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|
| 14 |
// GNU General Public License for more details. // |
|
| 15 |
// // |
|
| 16 |
// You should have received a copy of the GNU General Public License // |
|
| 17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
|
| 18 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 19 |
|
|
| 20 |
precision lowp float; |
|
| 21 |
|
|
| 22 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 23 |
|
|
| 24 |
void main() |
|
| 25 |
{
|
|
| 26 |
gl_FragColor = vec4(1.0,0.0,0.0,0.2); |
|
| 27 |
} |
|
| src/main/res/raw/test_vertex_shader.glsl | ||
|---|---|---|
| 1 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 2 |
// Copyright 2016 Leszek Koltunski // |
|
| 3 |
// // |
|
| 4 |
// This file is part of Distorted. // |
|
| 5 |
// // |
|
| 6 |
// Distorted is free software: you can redistribute it and/or modify // |
|
| 7 |
// it under the terms of the GNU General Public License as published by // |
|
| 8 |
// the Free Software Foundation, either version 2 of the License, or // |
|
| 9 |
// (at your option) any later version. // |
|
| 10 |
// // |
|
| 11 |
// Distorted is distributed in the hope that it will be useful, // |
|
| 12 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|
| 13 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|
| 14 |
// GNU General Public License for more details. // |
|
| 15 |
// // |
|
| 16 |
// You should have received a copy of the GNU General Public License // |
|
| 17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
|
| 18 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 19 |
|
|
| 20 |
uniform vec2 u_objD; // object width X object height. |
|
| 21 |
// point (0,0) is the center of the object |
|
| 22 |
uniform mat4 u_MVPMatrix; // the combined model/view/projection matrix. |
|
| 23 |
|
|
| 24 |
attribute vec2 a_Position; // Per-vertex position information we will pass in. |
|
| 25 |
|
|
| 26 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 27 |
|
|
| 28 |
void main() |
|
| 29 |
{
|
|
| 30 |
gl_Position = u_MVPMatrix*vec4( u_objD*a_Position, 0.0, 1.0); |
|
| 31 |
} |
|
Also available in: Unified diff
Progress with getting Mesh'es bounding rectangle. Still doesn't quite work yet (visible : 'Cubes' app with a 0111 Mesh)