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/EffectQueuePostprocess.java
20 20
package org.distorted.library;
21 21

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

  
25 24
import org.distorted.library.message.EffectMessage;
25
import org.distorted.library.program.DistortedProgram;
26 26
import org.distorted.library.type.Data1D;
27 27
import org.distorted.library.type.Data2D;
28 28
import org.distorted.library.type.Dynamic1D;
......
30 30
import org.distorted.library.type.Static1D;
31 31
import org.distorted.library.type.Static2D;
32 32

  
33
import java.nio.ByteBuffer;
34
import java.nio.ByteOrder;
35
import java.nio.FloatBuffer;
36

  
33 37
///////////////////////////////////////////////////////////////////////////////////////////////////
34 38

  
35 39
class EffectQueuePostprocess extends EffectQueue
36 40
  {
41
  private static final int BYTES_PER_FLOAT   = 4;
42
  private static final int POSITION_DATA_SIZE= 2; // Post Program: size of the position data in elements
43
  private static final int TEX_DATA_SIZE     = 2; // Post Program: size of the texture coordinate data in elements.
44

  
37 45
  private static final int NUM_UNIFORMS = 3;
38 46
  private static final int NUM_CACHE    = 0;
39 47
  private static final int INDEX = EffectTypes.POSTPROCESS.ordinal();
......
44 52
  private static int mObjDH;
45 53
  private static int mMVPMatrixH;
46 54

  
47
  private static float[] mMVPMatrix = new float[16];
48
  private static float[] mTmpMatrix = new float[16];
55
  private static final FloatBuffer mQuadPositions, mQuadTexture;
56
  private static DistortedProgram mProgram;
57

  
58
  static
59
    {
60
    int dataLength = 4;
61

  
62
    float[] positionData= { -0.5f, -0.5f,  -0.5f, 0.5f,  0.5f,-0.5f,  0.5f, 0.5f };
63
    float[] textureData = {  0.0f,  0.0f,   0.0f, 1.0f,  1.0f, 0.0f,  1.0f, 1.0f };
64

  
65
    mQuadPositions = ByteBuffer.allocateDirect(POSITION_DATA_SIZE*dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
66
    mQuadPositions.put(positionData).position(0);
67
    mQuadTexture   = ByteBuffer.allocateDirect(TEX_DATA_SIZE     *dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
68
    mQuadTexture.put(textureData).position(0);
69
    }
49 70

  
50 71
///////////////////////////////////////////////////////////////////////////////////////////////////
51 72

  
......
65 86
    mMVPMatrixH = GLES20.glGetUniformLocation(mProgramH, "u_MVPMatrix");
66 87
    }
67 88

  
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90

  
91
  static void setProgram(DistortedProgram p)
92
    {
93
    mProgram = p;
94
    }
95

  
68 96
///////////////////////////////////////////////////////////////////////////////////////////////////
69 97
  
70 98
  synchronized void compute(long currTime) 
......
115 143

  
116 144
///////////////////////////////////////////////////////////////////////////////////////////////////
117 145

  
118
  synchronized void send(float w, float h, float[] mvp)
146
  synchronized static void sendZero(float w, float h, float[] mvp)
119 147
    {
120
    GLES20.glUniform1i( mNumEffectsH, mNumEffects);
121
    GLES20.glUniform2f( mObjDH , w, h );
148
    GLES20.glUniform1i( mNumEffectsH, 0);
149
    GLES20.glUniform2f( mObjDH , w, h);
122 150
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0);
123

  
124
    if( mNumEffects>0 )
125
      {
126
      GLES20.glUniform1iv( mTypeH    ,  mNumEffects, mName    ,0);
127
      GLES20.glUniform4fv( mUniformsH,2*mNumEffects, mUniforms,0);
128
      }
129 151
    }
130 152

  
131 153
///////////////////////////////////////////////////////////////////////////////////////////////////
132 154

  
133
  synchronized void send(DistortedFramebuffer df)
155
  synchronized void render(float w, float h, float[] mvp, DistortedFramebuffer df)
134 156
    {
135
    Matrix.setIdentityM(mTmpMatrix, 0);
136
    Matrix.translateM(mTmpMatrix, 0, 0, 0, -df.mDistance);
137
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0);
157
    mProgram.useProgram();
158
    df.setAsOutput();
138 159

  
139 160
    GLES20.glUniform1i( mNumEffectsH, mNumEffects);
140
    GLES20.glUniform2f( mObjDH , df.mWidth, df.mHeight);
141
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
161
    GLES20.glUniform2f( mObjDH , w, h );
162
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0);
142 163

  
143 164
    if( mNumEffects>0 )
144 165
      {
145 166
      GLES20.glUniform1iv( mTypeH    ,  mNumEffects, mName    ,0);
146 167
      GLES20.glUniform4fv( mUniformsH,2*mNumEffects, mUniforms,0);
147 168
      }
148
    }
149

  
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151 169

  
152
  synchronized static void sendZero(DistortedFramebuffer df)
153
    {
154
    Matrix.setIdentityM(mTmpMatrix, 0);
155
    Matrix.translateM(mTmpMatrix, 0, 0, 0, -df.mDistance);
156
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0);
157

  
158
    GLES20.glUniform1i( mNumEffectsH, 0);
159
    GLES20.glUniform2f( mObjDH , df.mWidth, df.mHeight);
160
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
170
    GLES20.glVertexAttribPointer(mProgram.mAttribute[0], POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, 0, mQuadPositions);
171
    GLES20.glVertexAttribPointer(mProgram.mAttribute[1], TEX_DATA_SIZE     , GLES20.GL_FLOAT, false, 0, mQuadTexture);
172
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
161 173
    }
162 174

  
163 175
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff