Project

General

Profile

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

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

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.Data1D;
27
import org.distorted.library.type.Data3D;
28
import org.distorted.library.type.Data4D;
29
import org.distorted.library.type.Dynamic1D;
30
import org.distorted.library.type.Dynamic3D;
31
import org.distorted.library.type.Dynamic4D;
32
import org.distorted.library.type.DynamicQuat;
33
import org.distorted.library.type.Static1D;
34
import org.distorted.library.type.Static3D;
35
import org.distorted.library.type.Static4D;
36

    
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38

    
39
class EffectQueueMatrix extends EffectQueue
40
  {   
41
  private static final int NUM_UNIFORMS = 7;
42
  private static final int NUM_CACHE    = 0;
43
  private static final int INDEX = EffectTypes.MATRIX.ordinal();
44

    
45
  private static float[] mMVPMatrix = new float[16];
46
  private static float[] mTmpMatrix = new float[16];
47
  private static float[] mViewMatrix= new float[16];
48

    
49
  private static int mObjDH;      // This is a handle to half a Object dimensions
50
  private static int mDepthH;     // Handle to the max Depth, i.e (farplane-nearplane)/2
51
  private static int mMVPMatrixH; // pass in the transformation matrix
52
  private static int mMVMatrixH;  // pass in the modelview matrix.
53
  
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55
   
56
  EffectQueueMatrix(long id)
57
    { 
58
    super(id,NUM_UNIFORMS,NUM_CACHE,INDEX );
59
    }
60

    
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62

    
63
  private static void multiplyByQuat(float[] matrix, float X, float Y, float Z, float W)
64
    {
65
    float xx= X * X;
66
    float xy= X * Y;
67
    float xz= X * Z;
68
    float xw= X * W;
69
    float yy= Y * Y;
70
    float yz= Y * Z;
71
    float yw= Y * W;
72
    float zz= Z * Z;
73
    float zw= Z * W;
74

    
75
    mTmpMatrix[0]  = 1 - 2 * ( yy + zz );
76
    mTmpMatrix[1]  =     2 * ( xy - zw );
77
    mTmpMatrix[2]  =     2 * ( xz + yw );
78
    mTmpMatrix[4]  =     2 * ( xy + zw );
79
    mTmpMatrix[5]  = 1 - 2 * ( xx + zz );
80
    mTmpMatrix[6]  =     2 * ( yz - xw );
81
    mTmpMatrix[8]  =     2 * ( xz - yw );
82
    mTmpMatrix[9]  =     2 * ( yz + xw );
83
    mTmpMatrix[10] = 1 - 2 * ( xx + yy );
84
    mTmpMatrix[3]  = mTmpMatrix[7] = mTmpMatrix[11] = mTmpMatrix[12] = mTmpMatrix[13] = mTmpMatrix[14] = 0;
85
    mTmpMatrix[15] = 1;
86
    
87
    Matrix.multiplyMM(mMVPMatrix, 0, matrix, 0, mTmpMatrix, 0);  
88

    
89
    matrix[ 0] = mMVPMatrix[ 0];
90
    matrix[ 1] = mMVPMatrix[ 1];
91
    matrix[ 2] = mMVPMatrix[ 2];
92
    matrix[ 3] = mMVPMatrix[ 3];
93
    matrix[ 4] = mMVPMatrix[ 4];
94
    matrix[ 5] = mMVPMatrix[ 5];
95
    matrix[ 6] = mMVPMatrix[ 6];
96
    matrix[ 7] = mMVPMatrix[ 7];
97
    matrix[ 8] = mMVPMatrix[ 8];
98
    matrix[ 9] = mMVPMatrix[ 9];
99
    matrix[10] = mMVPMatrix[10];
100
    matrix[11] = mMVPMatrix[11];
101
    matrix[12] = mMVPMatrix[12];
102
    matrix[13] = mMVPMatrix[13];
103
    matrix[14] = mMVPMatrix[14];
104
    matrix[15] = mMVPMatrix[15];
105
    }
106

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

    
109
  static void getUniforms(int mProgramH)
110
    {
111
    mObjDH     = GLES20.glGetUniformLocation(mProgramH, "u_objD");
112
    mDepthH    = GLES20.glGetUniformLocation(mProgramH, "u_Depth");
113
    mMVPMatrixH= GLES20.glGetUniformLocation(mProgramH, "u_MVPMatrix");
114
    mMVMatrixH = GLES20.glGetUniformLocation(mProgramH, "u_MVMatrix"); 
115
    }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118
  
119
  synchronized void compute(long currTime) 
120
    {
121
    if( currTime==mTime ) return;
122
    if( mTime==0 ) mTime = currTime;
123
    long step = (currTime-mTime);
124
   
125
    for(int i=0; i<mNumEffects; i++)
126
      {
127
      if( mInter[0][i]!=null && mInter[0][i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )
128
        {
129
        for(int j=0; j<mNumListeners; j++)
130
          EffectMessageSender.newMessage( mListeners.elementAt(j),
131
                                          EffectMessage.EFFECT_FINISHED,
132
                                         (mID[i]<<EffectTypes.LENGTH)+EffectTypes.MATRIX.type,
133
                                          mName[i],
134
                                          mObjectID);
135

    
136
        if( EffectNames.isUnity(mName[i], mUniforms, NUM_UNIFORMS*i) )
137
          {
138
          remove(i);
139
          i--;
140
          continue;
141
          }
142
        else mInter[0][i] = null;
143
        }
144

    
145
      if( mInter[1][i]!=null )
146
        {
147
        mInter[1][i].interpolateMain(mUniforms, NUM_UNIFORMS*i+4, mCurrentDuration[i], step);
148
        }
149

    
150
      mCurrentDuration[i] += step;
151
      }
152
     
153
    mTime = currTime;  
154
    }  
155

    
156
///////////////////////////////////////////////////////////////////////////////////////////////////
157

    
158
  protected void moveEffect(int index)
159
    {
160
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
161
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
162
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
163
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
164
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
165
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
166
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
167
    }
168

    
169
///////////////////////////////////////////////////////////////////////////////////////////////////
170
// here construct the ModelView Matrix
171

    
172
  synchronized void send(DistortedFramebuffer df, float halfX, float halfY, float halfZ)
173
    {
174
    Matrix.setIdentityM(mViewMatrix, 0);
175
    Matrix.translateM(mViewMatrix, 0, -df.mWidth/2, df.mHeight/2, -df.mDistance);
176
    
177
    float x,y,z, sx,sy,sz;
178
   
179
    for(int i=0; i<mNumEffects; i++)
180
      {
181
      if (mName[i] == EffectNames.ROTATE.ordinal() )
182
        {
183
        x = mUniforms[NUM_UNIFORMS*i+4];
184
        y = mUniforms[NUM_UNIFORMS*i+5];
185
        z = mUniforms[NUM_UNIFORMS*i+6];
186

    
187
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
188
        Matrix.rotateM( mViewMatrix, 0, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
189
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
190
        }
191
      else if(mName[i] == EffectNames.QUATERNION.ordinal() )
192
        {
193
        x = mUniforms[NUM_UNIFORMS*i+4];
194
        y = mUniforms[NUM_UNIFORMS*i+5];
195
        z = mUniforms[NUM_UNIFORMS*i+6];
196
     	
197
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
198
        multiplyByQuat(mViewMatrix, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
199
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
200
        }
201
      else if(mName[i] == EffectNames.MOVE.ordinal() )
202
        {
203
        sx = mUniforms[NUM_UNIFORMS*i  ];
204
        sy = mUniforms[NUM_UNIFORMS*i+1];
205
        sz = mUniforms[NUM_UNIFORMS*i+2];
206
        
207
        Matrix.translateM(mViewMatrix, 0, sx,-sy, sz);
208
        }
209
      else if(mName[i] == EffectNames.SCALE.ordinal() )
210
        {
211
        sx = mUniforms[NUM_UNIFORMS*i  ];
212
        sy = mUniforms[NUM_UNIFORMS*i+1];
213
        sz = mUniforms[NUM_UNIFORMS*i+2];
214

    
215
        Matrix.scaleM(mViewMatrix, 0, sx, sy, sz);
216
        }
217
      else if(mName[i] == EffectNames.SHEAR.ordinal() )
218
        {
219
        sx = mUniforms[NUM_UNIFORMS*i  ];
220
        sy = mUniforms[NUM_UNIFORMS*i+1];
221
        sz = mUniforms[NUM_UNIFORMS*i+2];
222

    
223
        x  = mUniforms[NUM_UNIFORMS*i+4];
224
        y  = mUniforms[NUM_UNIFORMS*i+5];
225
        z  = mUniforms[NUM_UNIFORMS*i+6];
226

    
227
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
228
      
229
        mViewMatrix[4] += sx*mViewMatrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
230
        mViewMatrix[5] += sx*mViewMatrix[1]; //                        0 1 0 0
231
        mViewMatrix[6] += sx*mViewMatrix[2]; //                        0 0 1 0
232
        mViewMatrix[7] += sx*mViewMatrix[3]; //                        0 0 0 1
233
      
234
        mViewMatrix[0] += sy*mViewMatrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
235
        mViewMatrix[1] += sy*mViewMatrix[5]; //                        y 1 0 0
236
        mViewMatrix[2] += sy*mViewMatrix[6]; //                        0 0 1 0
237
        mViewMatrix[3] += sy*mViewMatrix[7]; //                        0 0 0 1
238
      
239
        mViewMatrix[4] += sz*mViewMatrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
240
        mViewMatrix[5] += sz*mViewMatrix[9]; //                        0 1 0 0
241
        mViewMatrix[6] += sz*mViewMatrix[10];//                        0 z 1 0
242
        mViewMatrix[7] += sz*mViewMatrix[11];//                        0 0 0 1
243

    
244
        Matrix.translateM(mViewMatrix, 0,-x, y, -z);
245
        }
246
      }
247
   
248
    Matrix.translateM(mViewMatrix, 0, halfX,-halfY, 0);
249
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mViewMatrix, 0);
250
    
251
    GLES20.glUniform3f( mObjDH , halfX, halfY, halfZ);
252
    GLES20.glUniform1f( mDepthH, df.mDepth);
253
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
254
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
255
    }
256

    
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258
// here construct the ModelView Matrix, but without any effects
259

    
260
  synchronized void sendZero(DistortedFramebuffer df, float halfX, float halfY, float halfZ)
261
    {
262
    Matrix.setIdentityM(mTmpMatrix, 0);
263
    Matrix.translateM(mTmpMatrix, 0, halfX-df.mWidth/2, df.mHeight/2-halfY, -df.mDistance);
264
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0);
265
    
266
    GLES20.glUniform3f( mObjDH , halfX, halfY, halfZ);
267
    GLES20.glUniform1f( mDepthH, df.mDepth);
268
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mTmpMatrix, 0);
269
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
270
    }
271

    
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273
// move, scale
274

    
275
  synchronized long add(EffectNames eln, Data3D vector)
276
    {
277
    if( mMax[INDEX]>mNumEffects )
278
      {
279
      mInter[1][mNumEffects] = null;
280

    
281
      if( vector instanceof Dynamic3D)
282
        {
283
        mInter[0][mNumEffects] = (Dynamic3D)vector;
284
        }
285
      else if( vector instanceof Static3D )
286
        {
287
        mInter[0][mNumEffects] = null;
288
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)vector).getX();
289
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)vector).getY();
290
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)vector).getZ();
291
        }
292
      else return -1;
293

    
294
      return addBase(eln);
295
      }
296

    
297
    return -1;
298
    }
299

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301
// rotate - static axis
302

    
303
  synchronized long add(EffectNames eln, Data1D angle, Static3D axis, Data3D center)
304
    {
305
    if( mMax[INDEX]>mNumEffects )
306
      {
307
      if( angle instanceof Dynamic1D)
308
        {
309
        mInter[0][mNumEffects] = (Dynamic1D)angle;
310
        }
311
      else if( angle instanceof Static1D)
312
        {
313
        mInter[0][mNumEffects] = null;
314
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)angle).getX();
315
        }
316
      else return -1;
317

    
318
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = axis.getX();
319
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = axis.getY();
320
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = axis.getZ();
321

    
322
      if( center instanceof Dynamic3D)
323
        {
324
        mInter[1][mNumEffects] = (Dynamic3D)center;
325
        }
326
      else if( center instanceof Static3D )
327
        {
328
        mInter[1][mNumEffects] = null;
329
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
330
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
331
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
332
        }
333
      else return -1;
334

    
335
      return addBase(eln);
336
      }
337
      
338
    return -1;
339
    }
340

    
341
///////////////////////////////////////////////////////////////////////////////////////////////////
342
// quaternion or rotate - dynamic axis
343

    
344
  synchronized long add(EffectNames eln, Data4D data, Data3D center)
345
    {
346
    if( mMax[INDEX]>mNumEffects )
347
      {
348
      if( data instanceof Dynamic4D  )
349
        {
350
        mInter[0][mNumEffects] = (Dynamic4D)data;
351
        }
352
      else if( data instanceof DynamicQuat)
353
        {
354
        mInter[0][mNumEffects] = (DynamicQuat)data;
355
        }
356
      else if( data instanceof Static4D   )
357
        {
358
        mInter[0][mNumEffects] = null;
359
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static4D)data).getX();
360
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static4D)data).getY();
361
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static4D)data).getZ();
362
        mUniforms[NUM_UNIFORMS*mNumEffects+3] = ((Static4D)data).getW();
363
        }
364
      else return -1;
365

    
366
      if( center instanceof Dynamic3D)
367
        {
368
        mInter[1][mNumEffects] = (Dynamic3D)center;
369
        }
370
      else if( center instanceof Static3D )
371
        {
372
        mInter[1][mNumEffects] = null;
373
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
374
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
375
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
376
        }
377
      else return -1;
378

    
379
      return addBase(eln);
380
      }
381

    
382
    return -1;
383
    }
384

    
385
///////////////////////////////////////////////////////////////////////////////////////////////////
386
// shear
387

    
388
  synchronized long add(EffectNames eln, Data3D shear, Data3D center)
389
    {
390
    if( mMax[INDEX]>mNumEffects )
391
      {
392
      if( shear instanceof Dynamic3D)
393
        {
394
        mInter[0][mNumEffects] = (Dynamic3D)shear;
395
        }
396
      else if( shear instanceof Static3D )
397
        {
398
        mInter[0][mNumEffects] = null;
399
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)shear).getX();
400
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)shear).getY();
401
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)shear).getZ();
402
        }
403
      else return -1;
404

    
405
      if( center instanceof Dynamic3D)
406
        {
407
        mInter[1][mNumEffects] = (Dynamic3D)center;
408
        }
409
      else if( center instanceof Static3D )
410
        {
411
        mInter[1][mNumEffects] = null;
412
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
413
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
414
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
415
        }
416
      else return -1;
417

    
418
      return addBase(eln);
419
      }
420
      
421
    return -1;
422
    }
423
  }
(10-10/15)