Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectQueueMatrix.java @ 452f8632

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
    for(int j=0; j<16; j++) matrix[j] = mMVPMatrix[j];   
89
    }
90

    
91
///////////////////////////////////////////////////////////////////////////////////////////////////
92

    
93
  static void getUniforms(int mProgramH)
94
    {
95
    mObjDH     = GLES20.glGetUniformLocation(mProgramH, "u_objD");
96
    mDepthH    = GLES20.glGetUniformLocation(mProgramH, "u_Depth");
97
    mMVPMatrixH= GLES20.glGetUniformLocation(mProgramH, "u_MVPMatrix");
98
    mMVMatrixH = GLES20.glGetUniformLocation(mProgramH, "u_MVMatrix"); 
99
    }
100

    
101
///////////////////////////////////////////////////////////////////////////////////////////////////
102
  
103
  synchronized void compute(long currTime) 
104
    {
105
    if( currTime==mTime ) return;
106
    if( mTime==0 ) mTime = currTime;
107
    long step = (currTime-mTime);
108
   
109
    for(int i=0; i<mNumEffects; i++)
110
      {
111
      if( mInter[0][i]!=null && mInter[0][i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )
112
        {
113
        for(int j=0; j<mNumListeners; j++)
114
          EffectMessageSender.newMessage( mListeners.elementAt(j),
115
                                          EffectMessage.EFFECT_FINISHED,
116
                                         (mID[i]<<EffectTypes.LENGTH)+EffectTypes.MATRIX.type,
117
                                          mName[i],
118
                                          mObjectID,
119
                                          null);
120

    
121
        if( EffectNames.isUnity(mName[i], mUniforms, NUM_UNIFORMS*i) )
122
          {
123
          remove(i);
124
          i--;
125
          continue;
126
          }
127
        else mInter[0][i] = null;
128
        }
129

    
130
      if( mInter[1][i]!=null )
131
        {
132
        mInter[1][i].interpolateMain(mUniforms, NUM_UNIFORMS*i+4, mCurrentDuration[i], step);
133
        }
134

    
135
      mCurrentDuration[i] += step;
136
      }
137
     
138
    mTime = currTime;  
139
    }  
140

    
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142

    
143
  protected void moveEffect(int index)
144
    {
145
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
146
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
147
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
148
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
149
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
150
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
151
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
152
    }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155
// here construct the ModelView Matrix
156

    
157
  synchronized void send(DistortedFramebuffer df, float halfX, float halfY, float halfZ)
158
    {
159
    Matrix.setIdentityM(mViewMatrix, 0);
160
    Matrix.translateM(mViewMatrix, 0, -df.mWidth/2, df.mHeight/2, -df.mDistance);
161
    
162
    float x,y,z, sx,sy,sz;
163
   
164
    for(int i=0; i<mNumEffects; i++)
165
      {
166
      if (mName[i] == EffectNames.ROTATE.ordinal() )
167
        {
168
        x = mUniforms[NUM_UNIFORMS*i+4];
169
        y = mUniforms[NUM_UNIFORMS*i+5];
170
        z = mUniforms[NUM_UNIFORMS*i+6];
171

    
172
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
173
        Matrix.rotateM( mViewMatrix, 0, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
174
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
175
        }
176
      else if(mName[i] == EffectNames.QUATERNION.ordinal() )
177
        {
178
        x = mUniforms[NUM_UNIFORMS*i+4];
179
        y = mUniforms[NUM_UNIFORMS*i+5];
180
        z = mUniforms[NUM_UNIFORMS*i+6];
181
     	
182
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
183
        multiplyByQuat(mViewMatrix, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
184
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
185
        }
186
      else if(mName[i] == EffectNames.MOVE.ordinal() )
187
        {
188
        sx = mUniforms[NUM_UNIFORMS*i  ];
189
        sy = mUniforms[NUM_UNIFORMS*i+1];
190
        sz = mUniforms[NUM_UNIFORMS*i+2];
191
        
192
        Matrix.translateM(mViewMatrix, 0, sx,-sy, sz);
193
        }
194
      else if(mName[i] == EffectNames.SCALE.ordinal() )
195
        {
196
        sx = mUniforms[NUM_UNIFORMS*i  ];
197
        sy = mUniforms[NUM_UNIFORMS*i+1];
198
        sz = mUniforms[NUM_UNIFORMS*i+2];
199

    
200
        Matrix.scaleM(mViewMatrix, 0, sx, sy, sz);
201
        }
202
      else if(mName[i] == EffectNames.SHEAR.ordinal() )
203
        {
204
        sx = mUniforms[NUM_UNIFORMS*i  ];
205
        sy = mUniforms[NUM_UNIFORMS*i+1];
206
        sz = mUniforms[NUM_UNIFORMS*i+2];
207

    
208
        x  = mUniforms[NUM_UNIFORMS*i+4];
209
        y  = mUniforms[NUM_UNIFORMS*i+5];
210
        z  = mUniforms[NUM_UNIFORMS*i+6];
211

    
212
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
213
      
214
        mViewMatrix[4] += sx*mViewMatrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
215
        mViewMatrix[5] += sx*mViewMatrix[1]; //                        0 1 0 0
216
        mViewMatrix[6] += sx*mViewMatrix[2]; //                        0 0 1 0
217
        mViewMatrix[7] += sx*mViewMatrix[3]; //                        0 0 0 1
218
      
219
        mViewMatrix[0] += sy*mViewMatrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
220
        mViewMatrix[1] += sy*mViewMatrix[5]; //                        y 1 0 0
221
        mViewMatrix[2] += sy*mViewMatrix[6]; //                        0 0 1 0
222
        mViewMatrix[3] += sy*mViewMatrix[7]; //                        0 0 0 1
223
      
224
        mViewMatrix[4] += sz*mViewMatrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
225
        mViewMatrix[5] += sz*mViewMatrix[9]; //                        0 1 0 0
226
        mViewMatrix[6] += sz*mViewMatrix[10];//                        0 z 1 0
227
        mViewMatrix[7] += sz*mViewMatrix[11];//                        0 0 0 1
228

    
229
        Matrix.translateM(mViewMatrix, 0,-x, y, -z);
230
        }
231
      }
232
   
233
    Matrix.translateM(mViewMatrix, 0, halfX,-halfY, 0);
234
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mViewMatrix, 0);
235
    
236
    GLES20.glUniform3f( mObjDH , halfX, halfY, halfZ);
237
    GLES20.glUniform1f( mDepthH, df.mDepth);
238
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
239
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243
// here construct the ModelView Matrix, but without any effects
244

    
245
  synchronized void sendZero(DistortedFramebuffer df, float halfX, float halfY, float halfZ)
246
    {
247
    Matrix.setIdentityM(mTmpMatrix, 0);
248
    Matrix.translateM(mTmpMatrix, 0, halfX-df.mWidth/2, df.mHeight/2-halfY, -df.mDistance);
249
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0);
250
    
251
    GLES20.glUniform3f( mObjDH , halfX, halfY, halfZ);
252
    GLES20.glUniform1f( mDepthH, df.mDepth);
253
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mTmpMatrix, 0);
254
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
255
    }
256

    
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258
// move, scale
259

    
260
  synchronized long add(EffectNames eln, Data3D vector)
261
    {
262
    if( mMax[INDEX]>mNumEffects )
263
      {
264
      mInter[1][mNumEffects] = null;
265

    
266
      if( vector instanceof Dynamic3D)
267
        {
268
        mInter[0][mNumEffects] = (Dynamic3D)vector;
269
        }
270
      else if( vector instanceof Static3D )
271
        {
272
        mInter[0][mNumEffects] = null;
273
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)vector).getX();
274
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)vector).getY();
275
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)vector).getZ();
276
        }
277
      else return -1;
278

    
279
      return addBase(eln);
280
      }
281

    
282
    return -1;
283
    }
284

    
285
///////////////////////////////////////////////////////////////////////////////////////////////////
286
// rotate - static axis
287

    
288
  synchronized long add(EffectNames eln, Data1D angle, Static3D axis, Data3D center)
289
    {
290
    if( mMax[INDEX]>mNumEffects )
291
      {
292
      if( angle instanceof Dynamic1D)
293
        {
294
        mInter[0][mNumEffects] = (Dynamic1D)angle;
295
        }
296
      else if( angle instanceof Static1D)
297
        {
298
        mInter[0][mNumEffects] = null;
299
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)angle).getX();
300
        }
301
      else return -1;
302

    
303
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = axis.getX();
304
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = axis.getY();
305
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = axis.getZ();
306

    
307
      if( center instanceof Dynamic3D)
308
        {
309
        mInter[1][mNumEffects] = (Dynamic3D)center;
310
        }
311
      else if( center instanceof Static3D )
312
        {
313
        mInter[1][mNumEffects] = null;
314
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
315
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
316
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
317
        }
318
      else return -1;
319

    
320
      return addBase(eln);
321
      }
322
      
323
    return -1;
324
    }
325

    
326
///////////////////////////////////////////////////////////////////////////////////////////////////
327
// quaternion or rotate - dynamic axis
328

    
329
  synchronized long add(EffectNames eln, Data4D data, Data3D center)
330
    {
331
    if( mMax[INDEX]>mNumEffects )
332
      {
333
      if( data instanceof Dynamic4D  )
334
        {
335
        mInter[0][mNumEffects] = (Dynamic4D)data;
336
        }
337
      else if( data instanceof DynamicQuat)
338
        {
339
        mInter[0][mNumEffects] = (DynamicQuat)data;
340
        }
341
      else if( data instanceof Static4D   )
342
        {
343
        mInter[0][mNumEffects] = null;
344
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static4D)data).getX();
345
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static4D)data).getY();
346
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static4D)data).getZ();
347
        mUniforms[NUM_UNIFORMS*mNumEffects+3] = ((Static4D)data).getW();
348
        }
349
      else return -1;
350

    
351
      if( center instanceof Dynamic3D)
352
        {
353
        mInter[1][mNumEffects] = (Dynamic3D)center;
354
        }
355
      else if( center instanceof Static3D )
356
        {
357
        mInter[1][mNumEffects] = null;
358
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
359
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
360
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
361
        }
362
      else return -1;
363

    
364
      return addBase(eln);
365
      }
366

    
367
    return -1;
368
    }
369

    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371
// shear
372

    
373
  synchronized long add(EffectNames eln, Data3D shear, Data3D center)
374
    {
375
    if( mMax[INDEX]>mNumEffects )
376
      {
377
      if( shear instanceof Dynamic3D)
378
        {
379
        mInter[0][mNumEffects] = (Dynamic3D)shear;
380
        }
381
      else if( shear instanceof Static3D )
382
        {
383
        mInter[0][mNumEffects] = null;
384
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)shear).getX();
385
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)shear).getY();
386
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)shear).getZ();
387
        }
388
      else return -1;
389

    
390
      if( center instanceof Dynamic3D)
391
        {
392
        mInter[1][mNumEffects] = (Dynamic3D)center;
393
        }
394
      else if( center instanceof Static3D )
395
        {
396
        mInter[1][mNumEffects] = null;
397
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
398
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
399
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
400
        }
401
      else return -1;
402

    
403
      return addBase(eln);
404
      }
405
      
406
    return -1;
407
    }
408
  }
(10-10/15)