Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectQueueMatrix.java @ c6e1c219

1
package org.distorted.library;
2

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

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

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

    
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28

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

    
41
    mTmpMatrix[0]  = 1 - 2 * ( yy + zz );
42
    mTmpMatrix[1]  =     2 * ( xy - zw );
43
    mTmpMatrix[2]  =     2 * ( xz + yw );
44
    mTmpMatrix[4]  =     2 * ( xy + zw );
45
    mTmpMatrix[5]  = 1 - 2 * ( xx + zz );
46
    mTmpMatrix[6]  =     2 * ( yz - xw );
47
    mTmpMatrix[8]  =     2 * ( xz - yw );
48
    mTmpMatrix[9]  =     2 * ( yz + xw );
49
    mTmpMatrix[10] = 1 - 2 * ( xx + yy );
50
    mTmpMatrix[3]  = mTmpMatrix[7] = mTmpMatrix[11] = mTmpMatrix[12] = mTmpMatrix[13] = mTmpMatrix[14] = 0;
51
    mTmpMatrix[15] = 1;
52
    
53
    Matrix.multiplyMM(mMVPMatrix, 0, matrix, 0, mTmpMatrix, 0);  
54
    for(int j=0; j<16; j++) matrix[j] = mMVPMatrix[j];   
55
    }
56

    
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58

    
59
  static void getUniforms(int mProgramH)
60
    {
61
    mBmpDH     = GLES20.glGetUniformLocation(mProgramH, "u_bmpD");
62
    mDepthH    = GLES20.glGetUniformLocation(mProgramH, "u_Depth");
63
    mMVPMatrixH= GLES20.glGetUniformLocation(mProgramH, "u_MVPMatrix");
64
    mMVMatrixH = GLES20.glGetUniformLocation(mProgramH, "u_MVMatrix"); 
65
    }
66

    
67
///////////////////////////////////////////////////////////////////////////////////////////////////
68
  
69
  synchronized void compute(long currTime) 
70
    {
71
    if( currTime==mTime ) return;
72
    if( mTime==0 ) mTime = currTime;
73
    long step = (currTime-mTime);
74
   
75
    for(int i=0; i<mNumEffects; i++)
76
      {
77
      if( mInterI[i]==null ) continue;    
78
           
79
      if( mInterP[i]!=null ) 
80
        {
81
        mInterP[i].interpolateMain(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i]);
82
        }
83
        
84
      if( mInterI[i].interpolateMain(mUniforms ,NUM_UNIFORMS*i+3, mCurrentDuration[i], step) )      
85
        {   
86
        for(int j=0; j<mNumListeners; j++)   
87
          EffectMessageSender.newMessage( mListeners.elementAt(j),
88
                                          EffectMessage.EFFECT_FINISHED, 
89
                                         (mID[i]<<EffectTypes.LENGTH)+EffectTypes.MATRIX.type,
90
                                          mType[i], 
91
                                          mBitmapID,
92
                                          null);
93
       
94
        if( EffectNames.isUnity(mType[i], mUniforms, NUM_UNIFORMS*i+3) )
95
          {  
96
          remove(i);
97
          i--;
98
          continue;
99
          }
100
        }
101
    
102
      mCurrentDuration[i] += step;
103
      }
104
     
105
    mTime = currTime;  
106
    }  
107

    
108
///////////////////////////////////////////////////////////////////////////////////////////////////
109

    
110
  protected void moveEffect(int index)
111
    {
112
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
113
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
114
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
115
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
116
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
117
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
118
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
119
    }
120

    
121
///////////////////////////////////////////////////////////////////////////////////////////////////
122
// here construct the ModelView Matrix
123

    
124
  synchronized void send(float[] viewMatrix, DistortedProjection dp) 
125
    {
126
    Matrix.setIdentityM(viewMatrix, 0);
127
    Matrix.translateM(viewMatrix, 0, -dp.width/2, dp.height/2, -dp.distance);
128
    
129
    float x,y,z, sx,sy,sz=1.0f;
130
   
131
    for(int i=0; i<mNumEffects; i++)
132
      {
133
      if (mType[i] == EffectNames.ROTATE.ordinal() )
134
        {
135
        x = mUniforms[NUM_UNIFORMS*i  ];
136
        y = mUniforms[NUM_UNIFORMS*i+1];
137
        z = mUniforms[NUM_UNIFORMS*i+2];
138
     
139
        Matrix.translateM(viewMatrix, 0, x,-y, z); 
140
        Matrix.rotateM( viewMatrix, 0, mUniforms[NUM_UNIFORMS*i+3], mUniforms[NUM_UNIFORMS*i+4], mUniforms[NUM_UNIFORMS*i+5], mUniforms[NUM_UNIFORMS*i+6]);  
141
        Matrix.translateM(viewMatrix, 0,-x, y,-z);  
142
        }
143
      else if(mType[i] == EffectNames.QUATERNION.ordinal() )
144
        {
145
        x = mUniforms[NUM_UNIFORMS*i  ];
146
        y = mUniforms[NUM_UNIFORMS*i+1];
147
        z = mUniforms[NUM_UNIFORMS*i+2];
148
     	
149
        Matrix.translateM(viewMatrix, 0, x,-y, z); 
150
        multiplyByQuat(viewMatrix, mUniforms[NUM_UNIFORMS*i+3], mUniforms[NUM_UNIFORMS*i+4], mUniforms[NUM_UNIFORMS*i+5], mUniforms[NUM_UNIFORMS*i+6]);
151
        Matrix.translateM(viewMatrix, 0,-x, y,-z);  
152
        }
153
      else if(mType[i] == EffectNames.MOVE.ordinal() )
154
        {
155
        sx = mUniforms[NUM_UNIFORMS*i+3];   
156
        sy = mUniforms[NUM_UNIFORMS*i+4];   
157
        sz = mUniforms[NUM_UNIFORMS*i+5];   
158
        
159
        Matrix.translateM(viewMatrix, 0, sx,-sy, sz);   
160
        }
161
      else if(mType[i] == EffectNames.SCALE.ordinal() )
162
        {
163
        sx = mUniforms[NUM_UNIFORMS*i+3];   
164
        sy = mUniforms[NUM_UNIFORMS*i+4];   
165
        sz = mUniforms[NUM_UNIFORMS*i+5];   
166

    
167
        Matrix.scaleM(viewMatrix, 0, sx, sy, sz);  
168
        }
169
      else if(mType[i] == EffectNames.SHEAR.ordinal() )
170
        {
171
        x  = mUniforms[NUM_UNIFORMS*i  ];
172
        y  = mUniforms[NUM_UNIFORMS*i+1];
173
        z  = mUniforms[NUM_UNIFORMS*i+2];
174
        
175
        sx = mUniforms[NUM_UNIFORMS*i+3];   
176
        sy = mUniforms[NUM_UNIFORMS*i+4];   
177
        sz = mUniforms[NUM_UNIFORMS*i+5];   
178
        
179
        Matrix.translateM(viewMatrix, 0, x,-y, z); 
180
      
181
        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.
182
        viewMatrix[5] += sx*viewMatrix[1]; //                        0 1 0 0 
183
        viewMatrix[6] += sx*viewMatrix[2]; //                        0 0 1 0
184
        viewMatrix[7] += sx*viewMatrix[3]; //                        0 0 0 1
185
      
186
        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.
187
        viewMatrix[1] += sy*viewMatrix[5]; //                        y 1 0 0
188
        viewMatrix[2] += sy*viewMatrix[6]; //                        0 0 1 0
189
        viewMatrix[3] += sy*viewMatrix[7]; //                        0 0 0 1      
190
      
191
        // TODO: implement Z-shear.
192
        
193
        Matrix.translateM(viewMatrix, 0,-x, y, -z);
194
        }
195
      }
196
   
197
    Matrix.translateM(viewMatrix, 0, mObjHalfX,-mObjHalfY, -mObjHalfZ);
198
    Matrix.multiplyMM(mMVPMatrix, 0, dp.projectionMatrix, 0, viewMatrix, 0);
199
    
200
    GLES20.glUniform3f( mBmpDH , mObjHalfX, mObjHalfY, mObjHalfZ);
201
    GLES20.glUniform1f( mDepthH, dp.depth);   
202
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, viewMatrix, 0);
203
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
204
    }
205

    
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207
// here construct the ModelView Matrix, but without any effects
208

    
209
  synchronized void sendNoEffects(DistortedProjection dp) 
210
    {
211
    Matrix.setIdentityM(mTmpMatrix, 0);
212
    Matrix.translateM(mTmpMatrix, 0, mObjHalfX-dp.width/2, dp.height/2-mObjHalfY, mObjHalfZ-dp.distance);
213
    Matrix.multiplyMM(mMVPMatrix, 0, dp.projectionMatrix, 0, mTmpMatrix, 0);
214
    
215
    GLES20.glUniform3f( mBmpDH , mObjHalfX, mObjHalfY, mObjHalfZ);
216
    GLES20.glUniform1f( mDepthH, dp.depth);  
217
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mTmpMatrix, 0);
218
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
219
    }
220

    
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222
  
223
  synchronized long add(EffectNames eln, Interpolator3D p, Interpolator i)
224
    {
225
    if( mMax[INDEX]>mNumEffects )
226
      {
227
      mInterP[mNumEffects] = p;
228
      mInterI[mNumEffects] = i;
229
      
230
      return addBase(eln);
231
      }
232
      
233
    return -1;
234
    }
235

    
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237
  
238
  synchronized long add(EffectNames eln, float x, float y, float z, Interpolator i)
239
    {
240
    if( mMax[INDEX]>mNumEffects )
241
      {
242
      mInterP[mNumEffects] = null;
243
      mInterI[mNumEffects] = i;
244
      
245
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = x;
246
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = y;
247
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = z;
248
            
249
      return addBase(eln);
250
      }
251
      
252
    return -1;
253
    }
254

    
255
///////////////////////////////////////////////////////////////////////////////////////////////////
256
  
257
  synchronized long add(EffectNames eln, float x, float y, float z, Interpolator1D i, float aX, float aY, float aZ)
258
    {
259
    if( mMax[INDEX]>mNumEffects )
260
      {
261
      mInterP[mNumEffects] = null;
262
      mInterI[mNumEffects] = i;
263
      
264
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = x;
265
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = y;
266
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = z;
267
      
268
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
269
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
270
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
271
      
272
      return addBase(eln);
273
      }
274
      
275
    return -1;
276
    }
277

    
278
///////////////////////////////////////////////////////////////////////////////////////////////////
279
  
280
  synchronized long add(EffectNames eln, Interpolator3D p, Interpolator1D i, float aX, float aY, float aZ)
281
    {
282
    if( mMax[INDEX]>mNumEffects )
283
      {
284
      mInterP[mNumEffects] = p;
285
      mInterI[mNumEffects] = i;
286
      
287
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
288
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
289
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
290
      
291
      return addBase(eln);
292
      }
293
      
294
    return -1;
295
    }
296
  
297
///////////////////////////////////////////////////////////////////////////////////////////////////
298
  
299
  synchronized long add(EffectNames eln, float x, float y, float z, float aA, float aX, float aY, float aZ)
300
    {
301
    if( mMax[INDEX]>mNumEffects )
302
      {
303
      mInterP[mNumEffects] = null; 
304
      mInterI[mNumEffects] = null;
305
      
306
      mUniforms[NUM_UNIFORMS*mNumEffects  ] =  x;
307
      mUniforms[NUM_UNIFORMS*mNumEffects+1] =  y;  
308
      mUniforms[NUM_UNIFORMS*mNumEffects+2] =  z;  
309
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = aA;  
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
  }
(14-14/30)