Project

General

Profile

« Previous | Next » 

Revision 8fa96e69

Added by Leszek Koltunski over 7 years ago

Move more intelligence to EffectQueuePostprocess.

View differences:

src/main/java/org/distorted/library/DistortedEffects.java
20 20
package org.distorted.library;
21 21

  
22 22
import android.opengl.GLES20;
23
import android.opengl.Matrix;
23 24

  
24 25
import org.distorted.library.message.EffectListener;
25 26
import org.distorted.library.program.DistortedProgram;
......
42 43
 */
43 44
public class DistortedEffects
44 45
  {
45
  private static final int BYTES_PER_FLOAT   = 4; //
46
  private static final int MAIN_POSITION_DATA_SIZE= 3; // Size of the position data in elements
47
  private static final int MAIN_NORMAL_DATA_SIZE  = 3; // Size of the position data in elements
48
  private static final int MAIN_TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements.
49
  private static final int POST_POSITION_DATA_SIZE= 2; // Size of the position data in elements
50
  private static final int POST_TEX_DATA_SIZE     = 2; // Size of the texture coordinate data in elements.
46
  private static final int POSITION_DATA_SIZE= 3; // Main Program: size of the position data in elements
47
  private static final int NORMAL_DATA_SIZE  = 3; // Main Program: size of the normal data in elements
48
  private static final int TEX_DATA_SIZE     = 2; // Main Program: size of the texture coordinate data in elements.
51 49

  
52
  private static final FloatBuffer mQuadPositions, mQuadTexture;
53
  private static DistortedProgram mMainProgram, mPostProgram;
50
  private static DistortedProgram mProgram;
51

  
52
  private static float[] mMVPMatrix = new float[16];
53
  private static float[] mTmpMatrix = new float[16];
54 54

  
55 55
  private static long mNextID =0;
56 56
  private long mID;
57 57

  
58
  private static DistortedFramebuffer mBufferFBO;
58
  private static DistortedFramebuffer mBufferFBO = new DistortedFramebuffer(1,1);
59 59

  
60 60
  private EffectQueueMatrix      mM;
61 61
  private EffectQueueFragment    mF;
......
64 64

  
65 65
  private boolean matrixCloned, vertexCloned, fragmentCloned, postprocessCloned;
66 66

  
67
  static
68
    {
69
    int dataLength = 4;
70

  
71
    float[] positionData= { -0.5f, -0.5f,  -0.5f, 0.5f,  0.5f,-0.5f,  0.5f, 0.5f };
72
    float[] textureData = {  0.0f,  0.0f,   0.0f, 1.0f,  1.0f, 0.0f,  1.0f, 1.0f };
73

  
74
    mQuadPositions = ByteBuffer.allocateDirect(POST_POSITION_DATA_SIZE*dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
75
    mQuadPositions.put(positionData).position(0);
76
    mQuadTexture   = ByteBuffer.allocateDirect(POST_TEX_DATA_SIZE     *dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
77
    mQuadTexture.put(textureData).position(0);
78

  
79
    mBufferFBO = new DistortedFramebuffer(1,1);
80
    }
81

  
82 67
///////////////////////////////////////////////////////////////////////////////////////////////////
83 68

  
84
  static void setPrograms(DistortedProgram main, DistortedProgram post)
69
  static void setProgram(DistortedProgram p)
85 70
    {
86
    mMainProgram = main;
87
    mPostProgram = post;
71
    mProgram = p;
88 72
    }
89 73

  
90 74
///////////////////////////////////////////////////////////////////////////////////////////////////
......
150 134

  
151 135
    if( mP.mNumEffects==0 )
152 136
      {
153
      mMainProgram.useProgram();
137
      mProgram.useProgram();
138
      df.setAsOutput();
154 139
      mM.send(df,halfInputW,halfInputH,halfZ);
155 140
      mV.send(halfInputW,halfInputH,halfZ);
156 141
      mF.send(halfInputW,halfInputH);
157
      GLES20.glVertexAttribPointer(mMainProgram.mAttribute[0], MAIN_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
158
      GLES20.glVertexAttribPointer(mMainProgram.mAttribute[1], MAIN_NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
159
      GLES20.glVertexAttribPointer(mMainProgram.mAttribute[2], MAIN_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
142
      GLES20.glVertexAttribPointer(mProgram.mAttribute[0], POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
143
      GLES20.glVertexAttribPointer(mProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
144
      GLES20.glVertexAttribPointer(mProgram.mAttribute[2], TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
160 145
      GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
161 146
      }
162 147
    else
163 148
      {
164 149
      if( mV.mNumEffects>0 || mF.mNumEffects>0 )
165 150
        {
166
        mMainProgram.useProgram();
151
        mProgram.useProgram();
167 152
        mBufferFBO.resizeFast(df.mWidth, df.mHeight);
168 153
        mBufferFBO.setAsOutput();
154
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
155
        GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
169 156
        mM.send(mBufferFBO,halfInputW,halfInputH,halfZ);
170 157
        mV.send(halfInputW,halfInputH,halfZ);
171 158
        mF.send(halfInputW,halfInputH);
172
        GLES20.glVertexAttribPointer(mMainProgram.mAttribute[0], MAIN_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
173
        GLES20.glVertexAttribPointer(mMainProgram.mAttribute[1], MAIN_NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
174
        GLES20.glVertexAttribPointer(mMainProgram.mAttribute[2], MAIN_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
159
        GLES20.glVertexAttribPointer(mProgram.mAttribute[0], POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
160
        GLES20.glVertexAttribPointer(mProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
161
        GLES20.glVertexAttribPointer(mProgram.mAttribute[2], TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
175 162
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
176 163

  
177
        mPostProgram.useProgram();
164
        Matrix.setIdentityM(mTmpMatrix, 0);
165
        Matrix.translateM(mTmpMatrix, 0, 0, 0, -df.mDistance);
166
        Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0);
167

  
178 168
        mBufferFBO.setAsInput();
179
        df.setAsOutput();
180
        mP.send(df);
181
        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[0], POST_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mQuadPositions);
182
        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[1], POST_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mQuadTexture);
183
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
169
        mP.render(df.mWidth, df.mHeight, mMVPMatrix, df);
184 170
        }
185 171
      else
186 172
        {
187
        mPostProgram.useProgram();
188 173
        mM.constructMatrices(df,halfInputW,halfInputH);
189
        mP.send(2*halfInputW,2*halfInputH, mM.getMVP() );
190
        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[0], POST_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mQuadPositions);
191
        GLES20.glVertexAttribPointer(mPostProgram.mAttribute[1], POST_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mQuadTexture);
192
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
174
        mP.render(2*halfInputW, 2*halfInputH, mM.getMVP(), df);
193 175
        }
194 176
      }
195 177
    }
......
200 182
    {
201 183
    GLES20.glViewport(0, 0, df.mWidth, df.mHeight);
202 184

  
185
    Matrix.setIdentityM(mTmpMatrix, 0);
186
    Matrix.translateM(mTmpMatrix, 0, 0, 0, -df.mDistance);
187
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0);
188

  
203 189
    EffectQueueMatrix.sendZero(df,halfInputW,halfInputH,halfInputW*mesh.zFactor);
204 190
    EffectQueueVertex.sendZero();
205 191
    EffectQueueFragment.sendZero();
206
    EffectQueuePostprocess.sendZero(df);
192
    EffectQueuePostprocess.sendZero(df.mWidth, df.mHeight, mMVPMatrix);
207 193

  
208
    GLES20.glVertexAttribPointer(mMainProgram.mAttribute[0], MAIN_POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
209
    GLES20.glVertexAttribPointer(mMainProgram.mAttribute[1], MAIN_NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
210
    GLES20.glVertexAttribPointer(mMainProgram.mAttribute[2], MAIN_TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
194
    GLES20.glVertexAttribPointer(mProgram.mAttribute[0], POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mesh.mMeshPositions);
195
    GLES20.glVertexAttribPointer(mProgram.mAttribute[1], NORMAL_DATA_SIZE  , GLES20.GL_FLOAT, false, 0, mesh.mMeshNormals);
196
    GLES20.glVertexAttribPointer(mProgram.mAttribute[2], TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mesh.mMeshTexture);
211 197
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, mesh.dataLength);
212 198
    }
213 199
    

Also available in: Unified diff