Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectQueueMatrix.java @ 270c27bc

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.GLES30;
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 mMVPMatrixH; // pass in the transformation matrix
51
  private static int mMVMatrixH;  // pass in the modelview matrix.
52
  
53
///////////////////////////////////////////////////////////////////////////////////////////////////
54
   
55
  EffectQueueMatrix(long id)
56
    { 
57
    super(id,NUM_UNIFORMS,NUM_CACHE,INDEX );
58
    }
59

    
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61

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

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

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

    
106
///////////////////////////////////////////////////////////////////////////////////////////////////
107

    
108
  private void magnify(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
109
    {
110
    float scale, nx, ny;
111
    float[] result= new float[4];
112
    float[] point = new float[4];
113
    float[] matrix= new float[16];
114
    float minx = Integer.MAX_VALUE;
115
    float maxx = Integer.MIN_VALUE;
116
    float miny = Integer.MAX_VALUE;
117
    float maxy = Integer.MIN_VALUE;
118

    
119
    point[3] = 1.0f;
120

    
121
    Matrix.multiplyMM(matrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
122

    
123
    point[0] = +halfX; point[1] = +halfY; point[2] = +halfZ;
124
    Matrix.multiplyMV(result,0,matrix,0,point,0);
125
    nx = result[0]/result[3];
126
    ny = result[1]/result[3];
127
    if( nx<minx ) minx = nx;
128
    if( nx>maxx ) maxx = nx;
129
    if( ny<miny ) miny = ny;
130
    if( ny>maxy ) maxy = ny;
131

    
132
    point[0] = +halfX; point[1] = +halfY; point[2] = -halfZ;
133
    Matrix.multiplyMV(result,0,matrix,0,point,0);
134
    nx = result[0]/result[3];
135
    ny = result[1]/result[3];
136
    if( nx<minx ) minx = nx;
137
    if( nx>maxx ) maxx = nx;
138
    if( ny<miny ) miny = ny;
139
    if( ny>maxy ) maxy = ny;
140

    
141
    point[0] = +halfX; point[1] = -halfY; point[2] = +halfZ;
142
    Matrix.multiplyMV(result,0,matrix,0,point,0);
143
    nx = result[0]/result[3];
144
    ny = result[1]/result[3];
145
    if( nx<minx ) minx = nx;
146
    if( nx>maxx ) maxx = nx;
147
    if( ny<miny ) miny = ny;
148
    if( ny>maxy ) maxy = ny;
149

    
150
    point[0] = +halfX; point[1] = -halfY; point[2] = -halfZ;
151
    Matrix.multiplyMV(result,0,matrix,0,point,0);
152
    nx = result[0]/result[3];
153
    ny = result[1]/result[3];
154
    if( nx<minx ) minx = nx;
155
    if( nx>maxx ) maxx = nx;
156
    if( ny<miny ) miny = ny;
157
    if( ny>maxy ) maxy = ny;
158

    
159
    point[0] = -halfX; point[1] = +halfY; point[2] = +halfZ;
160
    Matrix.multiplyMV(result,0,matrix,0,point,0);
161
    nx = result[0]/result[3];
162
    ny = result[1]/result[3];
163
    if( nx<minx ) minx = nx;
164
    if( nx>maxx ) maxx = nx;
165
    if( ny<miny ) miny = ny;
166
    if( ny>maxy ) maxy = ny;
167

    
168
    point[0] = -halfX; point[1] = +halfY; point[2] = -halfZ;
169
    Matrix.multiplyMV(result,0,matrix,0,point,0);
170
    nx = result[0]/result[3];
171
    ny = result[1]/result[3];
172
    if( nx<minx ) minx = nx;
173
    if( nx>maxx ) maxx = nx;
174
    if( ny<miny ) miny = ny;
175
    if( ny>maxy ) maxy = ny;
176

    
177
    point[0] = -halfX; point[1] = -halfY; point[2] = +halfZ;
178
    Matrix.multiplyMV(result,0,matrix,0,point,0);
179
    nx = result[0]/result[3];
180
    ny = result[1]/result[3];
181
    if( nx<minx ) minx = nx;
182
    if( nx>maxx ) maxx = nx;
183
    if( ny<miny ) miny = ny;
184
    if( ny>maxy ) maxy = ny;
185

    
186
    point[0] = -halfX; point[1] = -halfY; point[2] = -halfZ;
187
    Matrix.multiplyMV(result,0,matrix,0,point,0);
188
    nx = result[0]/result[3];
189
    ny = result[1]/result[3];
190
    if( nx<minx ) minx = nx;
191
    if( nx>maxx ) maxx = nx;
192
    if( ny<miny ) miny = ny;
193
    if( ny>maxy ) maxy = ny;
194

    
195
    float xlen = projection.mWidth *(maxx-minx)/2;
196
    float ylen = projection.mHeight*(maxy-miny)/2;
197

    
198
    scale = 1.0f + marginInPixels/( xlen>ylen ? ylen:xlen );
199

    
200
   // android.util.Log.d("scale", "scale= "+scale+" xlen="+xlen+" ylen="+ylen);
201

    
202
    Matrix.scaleM(mViewMatrix, 0, scale, scale, scale);
203
    }
204

    
205
///////////////////////////////////////////////////////////////////////////////////////////////////
206
// here construct the ModelView and the ModelViewProjection Matrices
207

    
208
  private void constructMatrices(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
209
    {
210
    Matrix.setIdentityM(mViewMatrix, 0);
211
    Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
212

    
213
    float x,y,z, sx,sy,sz;
214
    float mipmap = projection.mMipmap;
215

    
216
    if( mipmap!=1 ) Matrix.scaleM(mViewMatrix, 0, mipmap, mipmap, mipmap);
217

    
218
    for(int i=0; i<mNumEffects; i++)
219
      {
220
      if (mName[i] == EffectNames.ROTATE.ordinal() )
221
        {
222
        x = mUniforms[NUM_UNIFORMS*i+4];
223
        y = mUniforms[NUM_UNIFORMS*i+5];
224
        z = mUniforms[NUM_UNIFORMS*i+6];
225

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

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

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

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

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

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

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

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

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

    
283
        Matrix.translateM(mViewMatrix, 0,-x, y, -z);
284
        }
285
      }
286

    
287
    Matrix.translateM(mViewMatrix, 0, halfX,-halfY,-halfZ);
288

    
289
    if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels);
290

    
291
    Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
292
    }
293

    
294
///////////////////////////////////////////////////////////////////////////////////////////////////
295

    
296
  static void getUniforms(int mProgramH)
297
    {
298
    mObjDH     = GLES30.glGetUniformLocation(mProgramH, "u_objD");
299
    mMVPMatrixH= GLES30.glGetUniformLocation(mProgramH, "u_MVPMatrix");
300
    mMVMatrixH = GLES30.glGetUniformLocation(mProgramH, "u_MVMatrix"); 
301
    }
302

    
303
///////////////////////////////////////////////////////////////////////////////////////////////////
304

    
305
  synchronized void compute(long currTime) 
306
    {
307
    if( currTime==mTime ) return;
308
    if( mTime==0 ) mTime = currTime;
309
    long step = (currTime-mTime);
310
   
311
    for(int i=0; i<mNumEffects; i++)
312
      {
313
      mCurrentDuration[i] += step;
314

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

    
324
        if( EffectNames.isUnity(mName[i], mUniforms, NUM_UNIFORMS*i) )
325
          {
326
          remove(i);
327
          i--;
328
          continue;
329
          }
330
        else mInter[0][i] = null;
331
        }
332

    
333
      if( mInter[1][i]!=null )
334
        {
335
        mInter[1][i].interpolateMain(mUniforms, NUM_UNIFORMS*i+4, mCurrentDuration[i], step);
336
        }
337
      }
338
     
339
    mTime = currTime;  
340
    }  
341

    
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343

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

    
355
///////////////////////////////////////////////////////////////////////////////////////////////////
356

    
357
  float[] getMVP()
358
    {
359
    return mMVPMatrix;
360
    }
361

    
362
///////////////////////////////////////////////////////////////////////////////////////////////////
363

    
364
  synchronized void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
365
    {
366
    constructMatrices(projection,halfX,halfY,halfZ, marginInPixels);
367

    
368
    GLES30.glUniform3f( mObjDH , halfX, halfY, halfZ);
369
    GLES30.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
370
    GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
371
    }
372

    
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374
// move, scale
375

    
376
  synchronized long add(EffectNames eln, Data3D vector)
377
    {
378
    if( mMax[INDEX]>mNumEffects )
379
      {
380
      mInter[1][mNumEffects] = null;
381

    
382
      if( vector instanceof Dynamic3D)
383
        {
384
        mInter[0][mNumEffects] = (Dynamic3D)vector;
385
        }
386
      else if( vector instanceof Static3D )
387
        {
388
        mInter[0][mNumEffects] = null;
389
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)vector).getX();
390
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)vector).getY();
391
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)vector).getZ();
392
        }
393
      else return -1;
394

    
395
      return addBase(eln);
396
      }
397

    
398
    return -1;
399
    }
400

    
401
///////////////////////////////////////////////////////////////////////////////////////////////////
402
// rotate - static axis
403

    
404
  synchronized long add(EffectNames eln, Data1D angle, Static3D axis, Data3D center)
405
    {
406
    if( mMax[INDEX]>mNumEffects )
407
      {
408
      if( angle instanceof Dynamic1D)
409
        {
410
        mInter[0][mNumEffects] = (Dynamic1D)angle;
411
        }
412
      else if( angle instanceof Static1D)
413
        {
414
        mInter[0][mNumEffects] = null;
415
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)angle).getX();
416
        }
417
      else return -1;
418

    
419
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = axis.getX();
420
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = axis.getY();
421
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = axis.getZ();
422

    
423
      if( center instanceof Dynamic3D)
424
        {
425
        mInter[1][mNumEffects] = (Dynamic3D)center;
426
        }
427
      else if( center instanceof Static3D )
428
        {
429
        mInter[1][mNumEffects] = null;
430
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
431
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
432
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
433
        }
434
      else return -1;
435

    
436
      return addBase(eln);
437
      }
438
      
439
    return -1;
440
    }
441

    
442
///////////////////////////////////////////////////////////////////////////////////////////////////
443
// quaternion or rotate - dynamic axis
444

    
445
  synchronized long add(EffectNames eln, Data4D data, Data3D center)
446
    {
447
    if( mMax[INDEX]>mNumEffects )
448
      {
449
      if( data instanceof Dynamic4D  )
450
        {
451
        mInter[0][mNumEffects] = (Dynamic4D)data;
452
        }
453
      else if( data instanceof DynamicQuat)
454
        {
455
        mInter[0][mNumEffects] = (DynamicQuat)data;
456
        }
457
      else if( data instanceof Static4D   )
458
        {
459
        mInter[0][mNumEffects] = null;
460
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static4D)data).getX();
461
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static4D)data).getY();
462
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static4D)data).getZ();
463
        mUniforms[NUM_UNIFORMS*mNumEffects+3] = ((Static4D)data).getW();
464
        }
465
      else return -1;
466

    
467
      if( center instanceof Dynamic3D)
468
        {
469
        mInter[1][mNumEffects] = (Dynamic3D)center;
470
        }
471
      else if( center instanceof Static3D )
472
        {
473
        mInter[1][mNumEffects] = null;
474
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
475
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
476
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
477
        }
478
      else return -1;
479

    
480
      return addBase(eln);
481
      }
482

    
483
    return -1;
484
    }
485

    
486
///////////////////////////////////////////////////////////////////////////////////////////////////
487
// shear
488

    
489
  synchronized long add(EffectNames eln, Data3D shear, Data3D center)
490
    {
491
    if( mMax[INDEX]>mNumEffects )
492
      {
493
      if( shear instanceof Dynamic3D)
494
        {
495
        mInter[0][mNumEffects] = (Dynamic3D)shear;
496
        }
497
      else if( shear instanceof Static3D )
498
        {
499
        mInter[0][mNumEffects] = null;
500
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)shear).getX();
501
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)shear).getY();
502
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)shear).getZ();
503
        }
504
      else return -1;
505

    
506
      if( center instanceof Dynamic3D)
507
        {
508
        mInter[1][mNumEffects] = (Dynamic3D)center;
509
        }
510
      else if( center instanceof Static3D )
511
        {
512
        mInter[1][mNumEffects] = null;
513
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
514
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
515
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
516
        }
517
      else return -1;
518

    
519
      return addBase(eln);
520
      }
521
      
522
    return -1;
523
    }
524
  }
(20-20/26)