Project

General

Profile

Download (12.2 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / EffectListPreShader.java @ b3618cb5

1
package org.distorted.library;
2

    
3
import android.opengl.GLES20;
4
import android.opengl.Matrix;
5

    
6
///////////////////////////////////////////////////////////////////////////////////////////////////
7

    
8
class EffectListPreShader extends EffectList
9
  {   
10
  private static final int NUM_UNIFORMS = 7; 
11
  private static float[] mMVPMatrix= new float[16];
12
  private static float[] mTmpMatrix= new float[16];
13
  
14
  private static int mBmpDH;      // This is a handle to half a bitmap dimensions
15
  private static int mDepthH;     // Handle to the max Depth, i.e (farplane-nearplane)/2
16
  private static int mMVPMatrixH; // pass in the transformation matrix
17
  private static int mMVMatrixH;  // pass in the modelview matrix.
18
  
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20
   
21
  public EffectListPreShader(DistortedObject obj)
22
    { 
23
    super(obj,NUM_UNIFORMS, PRESHADER);
24
    }
25

    
26
///////////////////////////////////////////////////////////////////////////////////////////////////
27

    
28
  private static void multiplyByQuat(float[] matrix, float X, float Y, float Z, float W)
29
    {
30
    float xx= X * X;
31
    float xy= X * Y;
32
    float xz= X * Z;
33
    float xw= X * W;
34
    float yy= Y * Y;
35
    float yz= Y * Z;
36
    float yw= Y * W;
37
    float zz= Z * Z;
38
    float zw= Z * W;
39

    
40
    mTmpMatrix[0]  = 1 - 2 * ( yy + zz );
41
    mTmpMatrix[1]  =     2 * ( xy - zw );
42
    mTmpMatrix[2]  =     2 * ( xz + yw );
43
    mTmpMatrix[4]  =     2 * ( xy + zw );
44
    mTmpMatrix[5]  = 1 - 2 * ( xx + zz );
45
    mTmpMatrix[6]  =     2 * ( yz - xw );
46
    mTmpMatrix[8]  =     2 * ( xz - yw );
47
    mTmpMatrix[9]  =     2 * ( yz + xw );
48
    mTmpMatrix[10] = 1 - 2 * ( xx + yy );
49
    mTmpMatrix[3]  = mTmpMatrix[7] = mTmpMatrix[11] = mTmpMatrix[12] = mTmpMatrix[13] = mTmpMatrix[14] = 0;
50
    mTmpMatrix[15] = 1;
51
    
52
    Matrix.multiplyMM(mMVPMatrix, 0, matrix, 0, mTmpMatrix, 0);  
53
    for(int j=0; j<16; j++) matrix[j] = mMVPMatrix[j];   
54
    }
55
  
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57
// Only max Byte.MAX_VALUE concurrent effects per bitmap.
58
// If you want more, change type of the mNumEffects, mIDIndex and mFreeIndexes variables to shorts.
59
  
60
  static boolean setMax(int m)
61
    {
62
    if( (mCreated==false && !Distorted.isInitialized()) || m<=mMax[PRESHADER] )
63
      {
64
           if( m<0              ) m = 0;
65
      else if( m>Byte.MAX_VALUE ) m = Byte.MAX_VALUE;
66
      
67
      mMax[PRESHADER] = m;
68
      return true;
69
      }
70
   
71
    return false;
72
    }
73
 
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75

    
76
  static int getMax()
77
    {
78
    return mMax[PRESHADER];
79
    }
80

    
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82

    
83
  static void getUniforms(int mProgramH)
84
    {
85
    mBmpDH     = GLES20.glGetUniformLocation(mProgramH, "u_bmpD");
86
    mDepthH    = GLES20.glGetUniformLocation(mProgramH, "u_Depth");
87
    mMVPMatrixH= GLES20.glGetUniformLocation(mProgramH, "u_MVPMatrix");
88
    mMVMatrixH = GLES20.glGetUniformLocation(mProgramH, "u_MVMatrix"); 
89
    }
90

    
91
///////////////////////////////////////////////////////////////////////////////////////////////////
92
  
93
  synchronized void compute(long currTime) 
94
    {
95
    if( currTime==mTime ) return;
96
    if( mTime==0 ) mTime = currTime;
97
    long step = (currTime-mTime);
98
   
99
    for(int i=0; i<mNumEffects; i++)
100
      {
101
      if( mInterI[i]==null ) continue;    
102
           
103
      if( mInterP[i]!=null ) 
104
        {
105
        mInterP[i].interpolateMain(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i]);
106
        }
107
        
108
      if( mInterI[i].interpolateMain(mUniforms ,NUM_UNIFORMS*i+3, mCurrentDuration[i], step) )      
109
        {   
110
        for(int j=0; j<mNumListeners; j++)   
111
          EffectMessageSender.newMessage( mListeners.elementAt(j),
112
                                          EffectMessage.EFFECT_FINISHED, 
113
                                         (mID[i]<<DistortedObject.TYPE_NUM)+Distorted.TYPE_PRE,
114
                                          mType[i], 
115
                                          mBitmapID); 
116
       
117
        if( EffectNames.isUnity(mType[i], mUniforms, NUM_UNIFORMS*i+3) )
118
          {  
119
          remove(i);
120
          i--;
121
          continue;
122
          }
123
        }
124
    
125
      mCurrentDuration[i] += step;
126
      }
127
     
128
    mTime = currTime;  
129
    }  
130

    
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

    
133
  protected void moveEffect(int index)
134
    {
135
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
136
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
137
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
138
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
139
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
140
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
141
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
142
    }
143

    
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145
// here construct the ModelView Matrix
146

    
147
  synchronized void send(float[] viewMatrix, DistortedProjection dp) 
148
    {
149
    Matrix.setIdentityM(viewMatrix, 0);
150
    Matrix.translateM(viewMatrix, 0, -dp.width/2, dp.height/2, -dp.distance);
151
    
152
    float x,y,z, sx,sy,sz=1.0f;
153
   
154
    for(int i=0; i<mNumEffects; i++)
155
      {
156
      if (mType[i] == EffectNames.ROTATE.ordinal() )
157
        {
158
        x = mUniforms[NUM_UNIFORMS*i  ];
159
        y = mUniforms[NUM_UNIFORMS*i+1];
160
        z = mUniforms[NUM_UNIFORMS*i+2];
161
     
162
        Matrix.translateM(viewMatrix, 0, x,-y, z); 
163
        Matrix.rotateM( viewMatrix, 0, mUniforms[NUM_UNIFORMS*i+3], mUniforms[NUM_UNIFORMS*i+4], mUniforms[NUM_UNIFORMS*i+5], mUniforms[NUM_UNIFORMS*i+6]);  
164
        Matrix.translateM(viewMatrix, 0,-x, y,-z);  
165
        }
166
      else if(mType[i] == EffectNames.QUATERNION.ordinal() )
167
        {
168
        x = mUniforms[NUM_UNIFORMS*i  ];
169
        y = mUniforms[NUM_UNIFORMS*i+1];
170
        z = mUniforms[NUM_UNIFORMS*i+2];
171
     	
172
        Matrix.translateM(viewMatrix, 0, x,-y, z); 
173
        multiplyByQuat(viewMatrix, mUniforms[NUM_UNIFORMS*i+3], mUniforms[NUM_UNIFORMS*i+4], mUniforms[NUM_UNIFORMS*i+5], mUniforms[NUM_UNIFORMS*i+6]);
174
        Matrix.translateM(viewMatrix, 0,-x, y,-z);  
175
        }
176
      else if(mType[i] == EffectNames.MOVE.ordinal() )
177
        {
178
        sx = mUniforms[NUM_UNIFORMS*i+3];   
179
        sy = mUniforms[NUM_UNIFORMS*i+4];   
180
        sz = mUniforms[NUM_UNIFORMS*i+5];   
181
        
182
        Matrix.translateM(viewMatrix, 0, sx,-sy, sz);   
183
        }
184
      else if(mType[i] == EffectNames.SCALE.ordinal() )
185
        {
186
        sx = mUniforms[NUM_UNIFORMS*i+3];   
187
        sy = mUniforms[NUM_UNIFORMS*i+4];   
188
        sz = mUniforms[NUM_UNIFORMS*i+5];   
189

    
190
        Matrix.scaleM(viewMatrix, 0, sx, sy, sz);  
191
        }
192
      else if(mType[i] == EffectNames.SHEAR.ordinal() )
193
        {
194
        x  = mUniforms[NUM_UNIFORMS*i  ];
195
        y  = mUniforms[NUM_UNIFORMS*i+1];
196
        z  = mUniforms[NUM_UNIFORMS*i+2];
197
        
198
        sx = mUniforms[NUM_UNIFORMS*i+3];   
199
        sy = mUniforms[NUM_UNIFORMS*i+4];   
200
        sz = mUniforms[NUM_UNIFORMS*i+5];   
201
        
202
        Matrix.translateM(viewMatrix, 0, x,-y, z); 
203
      
204
        viewMatrix[4] += sx*viewMatrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear. TODO: change this so it is symmetric w respect to all the axis.
205
        viewMatrix[5] += sx*viewMatrix[1]; //                        0 1 0 0 
206
        viewMatrix[6] += sx*viewMatrix[2]; //                        0 0 1 0
207
        viewMatrix[7] += sx*viewMatrix[3]; //                        0 0 0 1
208
      
209
        viewMatrix[0] += sy*viewMatrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear. TODO: change this so it is symmetric w respect to all the axis.
210
        viewMatrix[1] += sy*viewMatrix[5]; //                        y 1 0 0
211
        viewMatrix[2] += sy*viewMatrix[6]; //                        0 0 1 0
212
        viewMatrix[3] += sy*viewMatrix[7]; //                        0 0 0 1      
213
      
214
        // TODO: implement Z-shear.
215
        
216
        Matrix.translateM(viewMatrix, 0,-x, y, -z);
217
        }
218
      }
219
   
220
    Matrix.translateM(viewMatrix, 0, mObjHalfX,-mObjHalfY, -mObjHalfZ);
221
    Matrix.multiplyMM(mMVPMatrix, 0, dp.projectionMatrix, 0, viewMatrix, 0);
222
    
223
    GLES20.glUniform3f( mBmpDH , mObjHalfX, mObjHalfY, mObjHalfZ);
224
    GLES20.glUniform1f( mDepthH, dp.depth);   
225
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, viewMatrix, 0);
226
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
227
    }
228

    
229
///////////////////////////////////////////////////////////////////////////////////////////////////
230
// here construct the ModelView Matrix, but without any effects
231

    
232
  synchronized void sendNoEffects(DistortedProjection dp) 
233
    {
234
    Matrix.setIdentityM(mTmpMatrix, 0);
235
    Matrix.translateM(mTmpMatrix, 0, mObjHalfX-dp.width/2, dp.height/2-mObjHalfY, mObjHalfZ-dp.distance);
236
    Matrix.multiplyMM(mMVPMatrix, 0, dp.projectionMatrix, 0, mTmpMatrix, 0);
237
    
238
    GLES20.glUniform3f( mBmpDH , mObjHalfX, mObjHalfY, mObjHalfZ);
239
    GLES20.glUniform1f( mDepthH, dp.depth);  
240
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mTmpMatrix, 0);
241
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
242
    }
243

    
244
///////////////////////////////////////////////////////////////////////////////////////////////////
245
  
246
  synchronized long add(EffectNames eln, Interpolator3D p, Interpolator i)
247
    {
248
    if( mMax[PRESHADER]>mNumEffects )
249
      {
250
      mInterP[mNumEffects] = p;
251
      mInterI[mNumEffects] = i;
252
      
253
      return addBase(eln);
254
      }
255
      
256
    return -1;
257
    }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260
  
261
  synchronized long add(EffectNames eln, float x, float y, float z, Interpolator i)
262
    {
263
    if( mMax[PRESHADER]>mNumEffects )
264
      {
265
      mInterP[mNumEffects] = null;
266
      mInterI[mNumEffects] = i;
267
      
268
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = x;
269
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = y;
270
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = z;
271
            
272
      return addBase(eln);
273
      }
274
      
275
    return -1;
276
    }
277

    
278
///////////////////////////////////////////////////////////////////////////////////////////////////
279
  
280
  synchronized long add(EffectNames eln, float x, float y, float z, Interpolator1D i, float aX, float aY, float aZ)
281
    {
282
    if( mMax[PRESHADER]>mNumEffects )
283
      {
284
      mInterP[mNumEffects] = null;
285
      mInterI[mNumEffects] = i;
286
      
287
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = x;
288
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = y;
289
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = z;
290
      
291
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
292
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
293
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
294
      
295
      return addBase(eln);
296
      }
297
      
298
    return -1;
299
    }
300

    
301
///////////////////////////////////////////////////////////////////////////////////////////////////
302
  
303
  synchronized long add(EffectNames eln, Interpolator3D p, Interpolator1D i, float aX, float aY, float aZ)
304
    {
305
    if( mMax[PRESHADER]>mNumEffects )
306
      {
307
      mInterP[mNumEffects] = p;
308
      mInterI[mNumEffects] = i;
309
      
310
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
311
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
312
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
313
      
314
      return addBase(eln);
315
      }
316
      
317
    return -1;
318
    }
319
  
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321
  
322
  synchronized long add(EffectNames eln, float x, float y, float z, float aA, float aX, float aY, float aZ)
323
    {
324
    if( mMax[PRESHADER]>mNumEffects )
325
      {
326
      mInterP[mNumEffects] = null; 
327
      mInterI[mNumEffects] = null;
328
      
329
      mUniforms[NUM_UNIFORMS*mNumEffects  ] =  x;
330
      mUniforms[NUM_UNIFORMS*mNumEffects+1] =  y;  
331
      mUniforms[NUM_UNIFORMS*mNumEffects+2] =  z;  
332
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = aA;  
333
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
334
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
335
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
336
      
337
      return addBase(eln);   
338
      }
339
      
340
    return -1;
341
    }
342

    
343
///////////////////////////////////////////////////////////////////////////////////////////////////
344
  }
(11-11/29)