Project

General

Profile

« Previous | Next » 

Revision 15aa7d94

Added by Leszek Koltunski almost 7 years ago

Progress with support for Effect classes.

View differences:

src/main/java/org/distorted/library/main/EffectQueueMatrix.java
25 25
import org.distorted.library.effect.Effect;
26 26
import org.distorted.library.effect.MatrixEffect;
27 27
import org.distorted.library.message.EffectMessage;
28
import org.distorted.library.type.Dynamic3D;
29
import org.distorted.library.type.Static;
30
import org.distorted.library.type.Static1D;
31
import org.distorted.library.type.Static2D;
32
import org.distorted.library.type.Static3D;
33
import org.distorted.library.type.Static4D;
34
import org.distorted.library.type.Static5D;
35 28

  
36 29
///////////////////////////////////////////////////////////////////////////////////////////////////
37 30

  
38 31
class EffectQueueMatrix extends EffectQueue
39 32
  {   
40
  private static final int NUM_UNIFORMS = 7;
41
  private static final int NUM_CACHE    = 0;
33
  private static final int NUM_UNIFORMS = MatrixEffect.NUM_UNIFORMS;
42 34
  private static final int INDEX = Effect.MATRIX;
43 35

  
44 36
  private static float[] mMVPMatrix = new float[16];
......
53 45
   
54 46
  EffectQueueMatrix(long id)
55 47
    { 
56
    super(id,NUM_UNIFORMS,NUM_CACHE,INDEX );
48
    super(id,NUM_UNIFORMS,INDEX );
57 49
    }
58 50

  
59 51
///////////////////////////////////////////////////////////////////////////////////////////////////
......
216 208

  
217 209
    for(int i=0; i<mNumEffects; i++)
218 210
      {
219
      if (mName[i] == MatrixEffect.ROTATE )
211
      switch( mEffects[i].getName() )
220 212
        {
221
        x = mUniforms[NUM_UNIFORMS*i+4];
222
        y = mUniforms[NUM_UNIFORMS*i+5];
223
        z = mUniforms[NUM_UNIFORMS*i+6];
224

  
225
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
226
        Matrix.rotateM( mViewMatrix, 0, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
227
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
228
        }
229
      else if(mName[i] == MatrixEffect.QUATERNION )
230
        {
231
        x = mUniforms[NUM_UNIFORMS*i+4];
232
        y = mUniforms[NUM_UNIFORMS*i+5];
233
        z = mUniforms[NUM_UNIFORMS*i+6];
234

  
235
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
236
        multiplyByQuat(mViewMatrix, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
237
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
238
        }
239
      else if(mName[i] == MatrixEffect.MOVE )
240
        {
241
        sx = mUniforms[NUM_UNIFORMS*i  ];
242
        sy = mUniforms[NUM_UNIFORMS*i+1];
243
        sz = mUniforms[NUM_UNIFORMS*i+2];
244

  
245
        Matrix.translateM(mViewMatrix, 0, sx,-sy, sz);
246
        }
247
      else if(mName[i] == MatrixEffect.SCALE )
248
        {
249
        sx = mUniforms[NUM_UNIFORMS*i  ];
250
        sy = mUniforms[NUM_UNIFORMS*i+1];
251
        sz = mUniforms[NUM_UNIFORMS*i+2];
252

  
253
        Matrix.scaleM(mViewMatrix, 0, sx, sy, sz);
254
        }
255
      else if(mName[i] == MatrixEffect.SHEAR )
256
        {
257
        sx = mUniforms[NUM_UNIFORMS*i  ];
258
        sy = mUniforms[NUM_UNIFORMS*i+1];
259
        sz = mUniforms[NUM_UNIFORMS*i+2];
260

  
261
        x  = mUniforms[NUM_UNIFORMS*i+4];
262
        y  = mUniforms[NUM_UNIFORMS*i+5];
263
        z  = mUniforms[NUM_UNIFORMS*i+6];
264

  
265
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
266

  
267
        mViewMatrix[4] += sx*mViewMatrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
268
        mViewMatrix[5] += sx*mViewMatrix[1]; //                        0 1 0 0
269
        mViewMatrix[6] += sx*mViewMatrix[2]; //                        0 0 1 0
270
        mViewMatrix[7] += sx*mViewMatrix[3]; //                        0 0 0 1
271

  
272
        mViewMatrix[0] += sy*mViewMatrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
273
        mViewMatrix[1] += sy*mViewMatrix[5]; //                        y 1 0 0
274
        mViewMatrix[2] += sy*mViewMatrix[6]; //                        0 0 1 0
275
        mViewMatrix[3] += sy*mViewMatrix[7]; //                        0 0 0 1
276

  
277
        mViewMatrix[4] += sz*mViewMatrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
278
        mViewMatrix[5] += sz*mViewMatrix[9]; //                        0 1 0 0
279
        mViewMatrix[6] += sz*mViewMatrix[10];//                        0 z 1 0
280
        mViewMatrix[7] += sz*mViewMatrix[11];//                        0 0 0 1
281

  
282
        Matrix.translateM(mViewMatrix, 0,-x, y, -z);
213
        case MatrixEffect.ROTATE     : x = mUniforms[NUM_UNIFORMS*i+4];
214
                                       y = mUniforms[NUM_UNIFORMS*i+5];
215
                                       z = mUniforms[NUM_UNIFORMS*i+6];
216

  
217
                                       Matrix.translateM(mViewMatrix, 0, x,-y, z);
218
                                       Matrix.rotateM( mViewMatrix, 0, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
219
                                       Matrix.translateM(mViewMatrix, 0,-x, y,-z);
220
                                       break;
221
        case MatrixEffect.QUATERNION : x = mUniforms[NUM_UNIFORMS*i+4];
222
                                       y = mUniforms[NUM_UNIFORMS*i+5];
223
                                       z = mUniforms[NUM_UNIFORMS*i+6];
224

  
225
                                       Matrix.translateM(mViewMatrix, 0, x,-y, z);
226
                                       multiplyByQuat(mViewMatrix, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
227
                                       Matrix.translateM(mViewMatrix, 0,-x, y,-z);
228
                                       break;
229
        case MatrixEffect.MOVE       : sx = mUniforms[NUM_UNIFORMS*i  ];
230
                                       sy = mUniforms[NUM_UNIFORMS*i+1];
231
                                       sz = mUniforms[NUM_UNIFORMS*i+2];
232

  
233
                                       Matrix.translateM(mViewMatrix, 0, sx,-sy, sz);
234
                                       break;
235
        case MatrixEffect.SCALE      : sx = mUniforms[NUM_UNIFORMS*i  ];
236
                                       sy = mUniforms[NUM_UNIFORMS*i+1];
237
                                       sz = mUniforms[NUM_UNIFORMS*i+2];
238

  
239
                                       Matrix.scaleM(mViewMatrix, 0, sx, sy, sz);
240
                                       break;
241
        case MatrixEffect.SHEAR      : sx = mUniforms[NUM_UNIFORMS*i  ];
242
                                       sy = mUniforms[NUM_UNIFORMS*i+1];
243
                                       sz = mUniforms[NUM_UNIFORMS*i+2];
244

  
245
                                       x  = mUniforms[NUM_UNIFORMS*i+4];
246
                                       y  = mUniforms[NUM_UNIFORMS*i+5];
247
                                       z  = mUniforms[NUM_UNIFORMS*i+6];
248

  
249
                                       Matrix.translateM(mViewMatrix, 0, x,-y, z);
250

  
251
                                       mViewMatrix[4] += sx*mViewMatrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
252
                                       mViewMatrix[5] += sx*mViewMatrix[1]; //                        0 1 0 0
253
                                       mViewMatrix[6] += sx*mViewMatrix[2]; //                        0 0 1 0
254
                                       mViewMatrix[7] += sx*mViewMatrix[3]; //                        0 0 0 1
255

  
256
                                       mViewMatrix[0] += sy*mViewMatrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
257
                                       mViewMatrix[1] += sy*mViewMatrix[5]; //                        y 1 0 0
258
                                       mViewMatrix[2] += sy*mViewMatrix[6]; //                        0 0 1 0
259
                                       mViewMatrix[3] += sy*mViewMatrix[7]; //                        0 0 0 1
260

  
261
                                       mViewMatrix[4] += sz*mViewMatrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
262
                                       mViewMatrix[5] += sz*mViewMatrix[9]; //                        0 1 0 0
263
                                       mViewMatrix[6] += sz*mViewMatrix[10];//                        0 z 1 0
264
                                       mViewMatrix[7] += sz*mViewMatrix[11];//                        0 0 0 1
265

  
266
                                       Matrix.translateM(mViewMatrix, 0,-x, y, -z);
267
                                       break;
283 268
        }
284 269
      }
285 270

  
......
306 291
    if( currTime==mTime ) return;
307 292
    if( mTime==0 ) mTime = currTime;
308 293
    long step = (currTime-mTime);
309
   
294

  
310 295
    for(int i=0; i<mNumEffects; i++)
311 296
      {
312 297
      mCurrentDuration[i] += step;
313 298

  
314
      if( mInter[0][i]!=null && mInter[0][i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )
299
      if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i], step) )
315 300
        {
316 301
        for(int j=0; j<mNumListeners; j++)
317
          EffectMessageSender.newMessage( mListeners.elementAt(j),
318
                                          EffectMessage.EFFECT_FINISHED,
319
                                         (mID[i]<<Effect.LENGTH)+Effect.MATRIX,
320
                                          mName[i],
321
                                          mObjectID);
322

  
323
        if( MatrixEffect.isUnity(mName[i], mUniforms, NUM_UNIFORMS*i) )
324
          {
325
          remove(i);
326
          i--;
327
          continue;
328
          }
329
        else mInter[0][i] = null;
330
        }
302
          EffectMessageSender.newMessage( mListeners.elementAt(j), EffectMessage.EFFECT_FINISHED, mEffects[i].getID(), mID);
331 303

  
332
      if( mInter[2][i]!=null )
333
        {
334
        mInter[2][i].interpolateMain(mUniforms, NUM_UNIFORMS*i+4, mCurrentDuration[i], step);
304
        if( MatrixEffect.isUnity( mEffects[i].getName(), mUniforms, NUM_UNIFORMS*i) )
305
          remove(i--);
335 306
        }
336 307
      }
337 308
     
338 309
    mTime = currTime;  
339 310
    }  
340 311

  
341
///////////////////////////////////////////////////////////////////////////////////////////////////
342

  
343
  protected void moveEffect(int index)
344
    {
345
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
346
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
347
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
348
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
349
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
350
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
351
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
352
    }
353

  
354 312
///////////////////////////////////////////////////////////////////////////////////////////////////
355 313

  
356 314
  float[] getMVP()
......
368 326
    GLES30.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
369 327
    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
370 328
    }
371

  
372
///////////////////////////////////////////////////////////////////////////////////////////////////
373

  
374
  synchronized long add(MatrixEffect me)
375
    {
376
    if( mMax[INDEX]>mNumEffects )
377
      {
378
      int dim0 = 0;
379

  
380
      if( me.mDynamic0 != null )
381
        {
382
        mInter[0][mNumEffects] = me.mDynamic0;
383
        dim0 = me.mDynamic0.getDimension();
384
        }
385
      else
386
        {
387
        mInter[0][mNumEffects] = null;
388

  
389
        if( me.mStatic0 != null )
390
          {
391
          Static s = me.mStatic0;
392
          dim0 = s.getDimension();
393

  
394
          switch( dim0 )
395
            {
396
            case 5 : mUniforms[NUM_UNIFORMS*mNumEffects + 4] = ((Static5D)s).getV();
397
            case 4 : mUniforms[NUM_UNIFORMS*mNumEffects + 3] = ((Static4D)s).getW();
398
            case 3 : mUniforms[NUM_UNIFORMS*mNumEffects + 2] = ((Static3D)s).getZ();
399
            case 2 : mUniforms[NUM_UNIFORMS*mNumEffects + 1] = ((Static2D)s).getY();
400
            case 1 : mUniforms[NUM_UNIFORMS*mNumEffects    ] = ((Static1D)s).getX();
401
            }
402
          }
403
        }
404

  
405
      mInter[1][mNumEffects] = null;
406

  
407
      if( me.mStatic1 != null )
408
        {
409
        Static s = me.mStatic1;
410
        int dim1 = s.getDimension();
411

  
412
        switch( dim1 )
413
          {
414
          case 5 : mUniforms[NUM_UNIFORMS*mNumEffects + dim0 + 4] = ((Static5D)s).getV();
415
          case 4 : mUniforms[NUM_UNIFORMS*mNumEffects + dim0 + 3] = ((Static4D)s).getW();
416
          case 3 : mUniforms[NUM_UNIFORMS*mNumEffects + dim0 + 2] = ((Static3D)s).getZ();
417
          case 2 : mUniforms[NUM_UNIFORMS*mNumEffects + dim0 + 1] = ((Static2D)s).getY();
418
          case 1 : mUniforms[NUM_UNIFORMS*mNumEffects + dim0    ] = ((Static1D)s).getX();
419
          }
420
        }
421

  
422
      if( me.mCenter instanceof Dynamic3D)
423
        {
424
        mInter[2][mNumEffects] = (Dynamic3D)me.mCenter;
425
        }
426
      else if( me.mCenter instanceof Static3D )
427
        {
428
        mInter[2][mNumEffects] = null;
429

  
430
        Static3D s = (Static3D)me.mCenter;
431
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = s.getX();
432
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = s.getY();
433
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = s.getZ();
434
        }
435
      else return -1;
436

  
437
      return addBase(me);
438
      }
439
      
440
    return -1;
441
    }
442 329
  }

Also available in: Unified diff