Project

General

Profile

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

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

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.message.EffectMessage;
26
import org.distorted.library.type.Float3D;
27
import org.distorted.library.type.Interpolator;
28
import org.distorted.library.type.Interpolator1D;
29
import org.distorted.library.type.Interpolator3D;
30

    
31
///////////////////////////////////////////////////////////////////////////////////////////////////
32

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

    
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53

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

    
66
    mTmpMatrix[0]  = 1 - 2 * ( yy + zz );
67
    mTmpMatrix[1]  =     2 * ( xy - zw );
68
    mTmpMatrix[2]  =     2 * ( xz + yw );
69
    mTmpMatrix[4]  =     2 * ( xy + zw );
70
    mTmpMatrix[5]  = 1 - 2 * ( xx + zz );
71
    mTmpMatrix[6]  =     2 * ( yz - xw );
72
    mTmpMatrix[8]  =     2 * ( xz - yw );
73
    mTmpMatrix[9]  =     2 * ( yz + xw );
74
    mTmpMatrix[10] = 1 - 2 * ( xx + yy );
75
    mTmpMatrix[3]  = mTmpMatrix[7] = mTmpMatrix[11] = mTmpMatrix[12] = mTmpMatrix[13] = mTmpMatrix[14] = 0;
76
    mTmpMatrix[15] = 1;
77
    
78
    Matrix.multiplyMM(mMVPMatrix, 0, matrix, 0, mTmpMatrix, 0);  
79
    for(int j=0; j<16; j++) matrix[j] = mMVPMatrix[j];   
80
    }
81

    
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83

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

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

    
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134

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

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

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

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

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

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

    
246
///////////////////////////////////////////////////////////////////////////////////////////////////
247

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

    
255
      return addBase(eln);
256
      }
257

    
258
    return -1;
259
    }
260

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

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

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

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

    
360
///////////////////////////////////////////////////////////////////////////////////////////////////
361
  }
(15-15/18)