Project

General

Profile

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

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

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
       
93
        if( EffectNames.isUnity(mType[i], mUniforms, NUM_UNIFORMS*i+3) )
94
          {  
95
          remove(i);
96
          i--;
97
          continue;
98
          }
99
        }
100
    
101
      mCurrentDuration[i] += step;
102
      }
103
     
104
    mTime = currTime;  
105
    }  
106

    
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108

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

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

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

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

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

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

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

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

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

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

    
319
///////////////////////////////////////////////////////////////////////////////////////////////////
320
  }
(14-14/30)