Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.library;
21

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

    
25
import org.distorted.library.type.Float3D;
26
import org.distorted.library.type.Interpolator;
27
import org.distorted.library.type.Interpolator1D;
28
import org.distorted.library.type.Interpolator3D;
29

    
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31

    
32
class EffectQueueMatrix extends EffectQueue
33
  {   
34
  private static final int NUM_UNIFORMS = 7;
35
  private static final int INDEX = EffectTypes.MATRIX.ordinal();
36
  private static float[] mMVPMatrix= new float[16];
37
  private static float[] mTmpMatrix= new float[16];
38
  
39
  private static int mBmpDH;      // This is a handle to half a bitmap dimensions
40
  private static int mDepthH;     // Handle to the max Depth, i.e (farplane-nearplane)/2
41
  private static int mMVPMatrixH; // pass in the transformation matrix
42
  private static int mMVMatrixH;  // pass in the modelview matrix.
43
  
44
///////////////////////////////////////////////////////////////////////////////////////////////////
45
   
46
  public EffectQueueMatrix(DistortedObject obj)
47
    { 
48
    super(obj,NUM_UNIFORMS, INDEX );
49
    }
50

    
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

    
53
  private static void multiplyByQuat(float[] matrix, float X, float Y, float Z, float W)
54
    {
55
    float xx= X * X;
56
    float xy= X * Y;
57
    float xz= X * Z;
58
    float xw= X * W;
59
    float yy= Y * Y;
60
    float yz= Y * Z;
61
    float yw= Y * W;
62
    float zz= Z * Z;
63
    float zw= Z * W;
64

    
65
    mTmpMatrix[0]  = 1 - 2 * ( yy + zz );
66
    mTmpMatrix[1]  =     2 * ( xy - zw );
67
    mTmpMatrix[2]  =     2 * ( xz + yw );
68
    mTmpMatrix[4]  =     2 * ( xy + zw );
69
    mTmpMatrix[5]  = 1 - 2 * ( xx + zz );
70
    mTmpMatrix[6]  =     2 * ( yz - xw );
71
    mTmpMatrix[8]  =     2 * ( xz - yw );
72
    mTmpMatrix[9]  =     2 * ( yz + xw );
73
    mTmpMatrix[10] = 1 - 2 * ( xx + yy );
74
    mTmpMatrix[3]  = mTmpMatrix[7] = mTmpMatrix[11] = mTmpMatrix[12] = mTmpMatrix[13] = mTmpMatrix[14] = 0;
75
    mTmpMatrix[15] = 1;
76
    
77
    Matrix.multiplyMM(mMVPMatrix, 0, matrix, 0, mTmpMatrix, 0);  
78
    for(int j=0; j<16; j++) matrix[j] = mMVPMatrix[j];   
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]<<EffectTypes.LENGTH)+EffectTypes.MATRIX.type,
114
                                          mType[i], 
115
                                          mBitmapID,
116
                                          null);
117
       
118
        if( EffectNames.isUnity(mType[i], mUniforms, NUM_UNIFORMS*i+3) )
119
          {  
120
          remove(i);
121
          i--;
122
          continue;
123
          }
124
        }
125
    
126
      mCurrentDuration[i] += step;
127
      }
128
     
129
    mTime = currTime;  
130
    }  
131

    
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133

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

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

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

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

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

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

    
245
///////////////////////////////////////////////////////////////////////////////////////////////////
246

    
247
  synchronized long add(EffectNames eln, Interpolator i)
248
    {
249
    if( mMax[INDEX]>mNumEffects )
250
      {
251
      mInterP[mNumEffects] = null;
252
      mInterI[mNumEffects] = i;
253

    
254
      return addBase(eln);
255
      }
256

    
257
    return -1;
258
    }
259

    
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
  
262
  synchronized long add(EffectNames eln, Interpolator3D p, Interpolator i)
263
    {
264
    if( mMax[INDEX]>mNumEffects )
265
      {
266
      mInterP[mNumEffects] = p;
267
      mInterI[mNumEffects] = i;
268
      
269
      return addBase(eln);
270
      }
271
      
272
    return -1;
273
    }
274

    
275
///////////////////////////////////////////////////////////////////////////////////////////////////
276
  
277
  synchronized long add(EffectNames eln, Float3D p, Interpolator i)
278
    {
279
    if( mMax[INDEX]>mNumEffects )
280
      {
281
      mInterP[mNumEffects] = null;
282
      mInterI[mNumEffects] = i;
283
      
284
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = p.getX();
285
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = p.getY();
286
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = p.getZ();
287
            
288
      return addBase(eln);
289
      }
290
      
291
    return -1;
292
    }
293

    
294
///////////////////////////////////////////////////////////////////////////////////////////////////
295
  
296
  synchronized long add(EffectNames eln, Float3D p, Interpolator1D i, float aX, float aY, float aZ)
297
    {
298
    if( mMax[INDEX]>mNumEffects )
299
      {
300
      mInterP[mNumEffects] = null;
301
      mInterI[mNumEffects] = i;
302
      
303
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = p.getX();
304
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = p.getY();
305
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = p.getZ();
306
      
307
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
308
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
309
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
310
      
311
      return addBase(eln);
312
      }
313
      
314
    return -1;
315
    }
316

    
317
///////////////////////////////////////////////////////////////////////////////////////////////////
318
  
319
  synchronized long add(EffectNames eln, Interpolator3D p, Interpolator1D i, float aX, float aY, float aZ)
320
    {
321
    if( mMax[INDEX]>mNumEffects )
322
      {
323
      mInterP[mNumEffects] = p;
324
      mInterI[mNumEffects] = i;
325
      
326
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
327
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
328
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
329
      
330
      return addBase(eln);
331
      }
332
      
333
    return -1;
334
    }
335
  
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337
  
338
  synchronized long add(EffectNames eln, Float3D p, float aA, float aX, float aY, float aZ)
339
    {
340
    if( mMax[INDEX]>mNumEffects )
341
      {
342
      mInterP[mNumEffects] = null; 
343
      mInterI[mNumEffects] = null;
344
      
345
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = p.getX();
346
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = p.getY();
347
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = p.getZ();
348
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = aA;  
349
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = aX;
350
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = aY;  
351
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = aZ;  
352
      
353
      return addBase(eln);   
354
      }
355
      
356
    return -1;
357
    }
358

    
359
///////////////////////////////////////////////////////////////////////////////////////////////////
360
  }
(14-14/20)