Project

General

Profile

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

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

1 d333eb6b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 6a06a912 Leszek Koltunski
package org.distorted.library;
21
22
import android.opengl.GLES20;
23
import android.opengl.Matrix;
24
25 e458a4ba Leszek Koltunski
import org.distorted.library.message.EffectMessage;
26 568b29d8 Leszek Koltunski
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 a4835695 Leszek Koltunski
37 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
38
39 d07f2950 Leszek Koltunski
class EffectQueueMatrix extends EffectQueue
40 6a06a912 Leszek Koltunski
  {   
41 1e438fc7 Leszek Koltunski
  private static final int NUM_UNIFORMS = 7;
42 0a046359 Leszek Koltunski
  private static final int NUM_CACHE    = 0;
43 1e438fc7 Leszek Koltunski
  private static final int INDEX = EffectTypes.MATRIX.ordinal();
44 1a940548 Leszek Koltunski
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 8aac2acc Leszek Koltunski
  private static int mObjDH;      // This is a handle to half a Object dimensions
50 6a06a912 Leszek Koltunski
  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 0a046359 Leszek Koltunski
  EffectQueueMatrix(long id)
57 6a06a912 Leszek Koltunski
    { 
58 0a046359 Leszek Koltunski
    super(id,NUM_UNIFORMS,NUM_CACHE,INDEX );
59 6a06a912 Leszek Koltunski
    }
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 8aac2acc Leszek Koltunski
    mObjDH     = GLES20.glGetUniformLocation(mProgramH, "u_objD");
96 6a06a912 Leszek Koltunski
    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 0df17fad Leszek Koltunski
      if( mInter[0][i]!=null && mInter[0][i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )
112 6a06a912 Leszek Koltunski
        {
113 a595ee16 Leszek Koltunski
        for(int j=0; j<mNumListeners; j++)
114 6a06a912 Leszek Koltunski
          EffectMessageSender.newMessage( mListeners.elementAt(j),
115 e458a4ba Leszek Koltunski
                                          EffectMessage.EFFECT_FINISHED,
116 1e438fc7 Leszek Koltunski
                                         (mID[i]<<EffectTypes.LENGTH)+EffectTypes.MATRIX.type,
117 e8c81a8e Leszek Koltunski
                                          mName[i],
118 cacc63de Leszek Koltunski
                                          mObjectID);
119 a595ee16 Leszek Koltunski
120 e8c81a8e Leszek Koltunski
        if( EffectNames.isUnity(mName[i], mUniforms, NUM_UNIFORMS*i) )
121 a595ee16 Leszek Koltunski
          {
122 6a06a912 Leszek Koltunski
          remove(i);
123
          i--;
124
          continue;
125
          }
126 e8c81a8e Leszek Koltunski
        else mInter[0][i] = null;
127 6a06a912 Leszek Koltunski
        }
128 a595ee16 Leszek Koltunski
129
      if( mInter[1][i]!=null )
130
        {
131 bdb341bc Leszek Koltunski
        mInter[1][i].interpolateMain(mUniforms, NUM_UNIFORMS*i+4, mCurrentDuration[i], step);
132 a595ee16 Leszek Koltunski
        }
133
134 6a06a912 Leszek Koltunski
      mCurrentDuration[i] += step;
135
      }
136
     
137
    mTime = currTime;  
138
    }  
139
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141
142
  protected void moveEffect(int index)
143
    {
144
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
145
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
146
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
147
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
148
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
149
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
150
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
151
    }
152
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
// here construct the ModelView Matrix
155
156 881652a7 Leszek Koltunski
  synchronized void send(DistortedFramebuffer df, float halfX, float halfY, float halfZ)
157 6a06a912 Leszek Koltunski
    {
158 1a940548 Leszek Koltunski
    Matrix.setIdentityM(mViewMatrix, 0);
159 ed13a5de Leszek Koltunski
    Matrix.translateM(mViewMatrix, 0, -df.mWidth/2, df.mHeight/2, -df.mDistance);
160 6a06a912 Leszek Koltunski
    
161 a595ee16 Leszek Koltunski
    float x,y,z, sx,sy,sz;
162 6a06a912 Leszek Koltunski
   
163
    for(int i=0; i<mNumEffects; i++)
164
      {
165 e8c81a8e Leszek Koltunski
      if (mName[i] == EffectNames.ROTATE.ordinal() )
166 6a06a912 Leszek Koltunski
        {
167 0df17fad Leszek Koltunski
        x = mUniforms[NUM_UNIFORMS*i+4];
168
        y = mUniforms[NUM_UNIFORMS*i+5];
169
        z = mUniforms[NUM_UNIFORMS*i+6];
170 568b29d8 Leszek Koltunski
171 1a940548 Leszek Koltunski
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
172
        Matrix.rotateM( mViewMatrix, 0, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
173
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
174 6a06a912 Leszek Koltunski
        }
175 e8c81a8e Leszek Koltunski
      else if(mName[i] == EffectNames.QUATERNION.ordinal() )
176 6a06a912 Leszek Koltunski
        {
177 0df17fad Leszek Koltunski
        x = mUniforms[NUM_UNIFORMS*i+4];
178
        y = mUniforms[NUM_UNIFORMS*i+5];
179
        z = mUniforms[NUM_UNIFORMS*i+6];
180 6a06a912 Leszek Koltunski
     	
181 1a940548 Leszek Koltunski
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
182
        multiplyByQuat(mViewMatrix, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
183
        Matrix.translateM(mViewMatrix, 0,-x, y,-z);
184 6a06a912 Leszek Koltunski
        }
185 e8c81a8e Leszek Koltunski
      else if(mName[i] == EffectNames.MOVE.ordinal() )
186 6a06a912 Leszek Koltunski
        {
187 0df17fad Leszek Koltunski
        sx = mUniforms[NUM_UNIFORMS*i  ];
188
        sy = mUniforms[NUM_UNIFORMS*i+1];
189
        sz = mUniforms[NUM_UNIFORMS*i+2];
190 6a06a912 Leszek Koltunski
        
191 1a940548 Leszek Koltunski
        Matrix.translateM(mViewMatrix, 0, sx,-sy, sz);
192 6a06a912 Leszek Koltunski
        }
193 e8c81a8e Leszek Koltunski
      else if(mName[i] == EffectNames.SCALE.ordinal() )
194 6a06a912 Leszek Koltunski
        {
195 0df17fad Leszek Koltunski
        sx = mUniforms[NUM_UNIFORMS*i  ];
196
        sy = mUniforms[NUM_UNIFORMS*i+1];
197
        sz = mUniforms[NUM_UNIFORMS*i+2];
198 6a06a912 Leszek Koltunski
199 1a940548 Leszek Koltunski
        Matrix.scaleM(mViewMatrix, 0, sx, sy, sz);
200 6a06a912 Leszek Koltunski
        }
201 e8c81a8e Leszek Koltunski
      else if(mName[i] == EffectNames.SHEAR.ordinal() )
202 6a06a912 Leszek Koltunski
        {
203 0df17fad Leszek Koltunski
        sx = mUniforms[NUM_UNIFORMS*i  ];
204
        sy = mUniforms[NUM_UNIFORMS*i+1];
205
        sz = mUniforms[NUM_UNIFORMS*i+2];
206
207
        x  = mUniforms[NUM_UNIFORMS*i+4];
208
        y  = mUniforms[NUM_UNIFORMS*i+5];
209
        z  = mUniforms[NUM_UNIFORMS*i+6];
210
211 1a940548 Leszek Koltunski
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
212 6a06a912 Leszek Koltunski
      
213 1a940548 Leszek Koltunski
        mViewMatrix[4] += sx*mViewMatrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
214
        mViewMatrix[5] += sx*mViewMatrix[1]; //                        0 1 0 0
215
        mViewMatrix[6] += sx*mViewMatrix[2]; //                        0 0 1 0
216
        mViewMatrix[7] += sx*mViewMatrix[3]; //                        0 0 0 1
217 6a06a912 Leszek Koltunski
      
218 1a940548 Leszek Koltunski
        mViewMatrix[0] += sy*mViewMatrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
219
        mViewMatrix[1] += sy*mViewMatrix[5]; //                        y 1 0 0
220
        mViewMatrix[2] += sy*mViewMatrix[6]; //                        0 0 1 0
221
        mViewMatrix[3] += sy*mViewMatrix[7]; //                        0 0 0 1
222 6a06a912 Leszek Koltunski
      
223 1a940548 Leszek Koltunski
        mViewMatrix[4] += sz*mViewMatrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
224
        mViewMatrix[5] += sz*mViewMatrix[9]; //                        0 1 0 0
225
        mViewMatrix[6] += sz*mViewMatrix[10];//                        0 z 1 0
226
        mViewMatrix[7] += sz*mViewMatrix[11];//                        0 0 0 1
227 beb70e07 Leszek Koltunski
228 1a940548 Leszek Koltunski
        Matrix.translateM(mViewMatrix, 0,-x, y, -z);
229 6a06a912 Leszek Koltunski
        }
230
      }
231
   
232 0a046359 Leszek Koltunski
    Matrix.translateM(mViewMatrix, 0, halfX,-halfY, 0);
233 ed13a5de Leszek Koltunski
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mViewMatrix, 0);
234 6a06a912 Leszek Koltunski
    
235 0a046359 Leszek Koltunski
    GLES20.glUniform3f( mObjDH , halfX, halfY, halfZ);
236 ed13a5de Leszek Koltunski
    GLES20.glUniform1f( mDepthH, df.mDepth);
237 1a940548 Leszek Koltunski
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
238
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
239 6a06a912 Leszek Koltunski
    }
240
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242
// here construct the ModelView Matrix, but without any effects
243
244 881652a7 Leszek Koltunski
  synchronized void sendZero(DistortedFramebuffer df, float halfX, float halfY, float halfZ)
245 6a06a912 Leszek Koltunski
    {
246
    Matrix.setIdentityM(mTmpMatrix, 0);
247 0a046359 Leszek Koltunski
    Matrix.translateM(mTmpMatrix, 0, halfX-df.mWidth/2, df.mHeight/2-halfY, -df.mDistance);
248 ed13a5de Leszek Koltunski
    Matrix.multiplyMM(mMVPMatrix, 0, df.mProjectionMatrix, 0, mTmpMatrix, 0);
249 6a06a912 Leszek Koltunski
    
250 0a046359 Leszek Koltunski
    GLES20.glUniform3f( mObjDH , halfX, halfY, halfZ);
251 ed13a5de Leszek Koltunski
    GLES20.glUniform1f( mDepthH, df.mDepth);
252 6a06a912 Leszek Koltunski
    GLES20.glUniformMatrix4fv(mMVMatrixH , 1, false, mTmpMatrix, 0);
253
    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
254
    }
255
256 e0a16874 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
257 568b29d8 Leszek Koltunski
// move, scale
258 e0a16874 Leszek Koltunski
259 568b29d8 Leszek Koltunski
  synchronized long add(EffectNames eln, Data3D vector)
260 e0a16874 Leszek Koltunski
    {
261
    if( mMax[INDEX]>mNumEffects )
262
      {
263 d425545a Leszek Koltunski
      mInter[1][mNumEffects] = null;
264 568b29d8 Leszek Koltunski
265 bdb341bc Leszek Koltunski
      if( vector instanceof Dynamic3D)
266
        {
267
        mInter[0][mNumEffects] = (Dynamic3D)vector;
268
        }
269 568b29d8 Leszek Koltunski
      else if( vector instanceof Static3D )
270
        {
271 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = null;
272 0df17fad Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)vector).getX();
273
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)vector).getY();
274
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)vector).getZ();
275 568b29d8 Leszek Koltunski
        }
276
      else return -1;
277 e0a16874 Leszek Koltunski
278
      return addBase(eln);
279
      }
280
281
    return -1;
282
    }
283
284 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
285 568b29d8 Leszek Koltunski
// rotate - static axis
286 6a06a912 Leszek Koltunski
287 0df17fad Leszek Koltunski
  synchronized long add(EffectNames eln, Data1D angle, Static3D axis, Data3D center)
288 6a06a912 Leszek Koltunski
    {
289 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
290 6a06a912 Leszek Koltunski
      {
291 bdb341bc Leszek Koltunski
      if( angle instanceof Dynamic1D)
292
        {
293
        mInter[0][mNumEffects] = (Dynamic1D)angle;
294
        }
295 568b29d8 Leszek Koltunski
      else if( angle instanceof Static1D)
296
        {
297 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = null;
298 0df17fad Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)angle).getX();
299 568b29d8 Leszek Koltunski
        }
300
      else return -1;
301
302 0df17fad Leszek Koltunski
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = axis.getX();
303
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = axis.getY();
304
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = axis.getZ();
305
306 bdb341bc Leszek Koltunski
      if( center instanceof Dynamic3D)
307
        {
308
        mInter[1][mNumEffects] = (Dynamic3D)center;
309
        }
310 0df17fad Leszek Koltunski
      else if( center instanceof Static3D )
311
        {
312
        mInter[1][mNumEffects] = null;
313
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
314
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
315
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
316
        }
317
      else return -1;
318 568b29d8 Leszek Koltunski
319 6a06a912 Leszek Koltunski
      return addBase(eln);
320
      }
321
      
322
    return -1;
323
    }
324
325
///////////////////////////////////////////////////////////////////////////////////////////////////
326 568b29d8 Leszek Koltunski
// quaternion or rotate - dynamic axis
327
328 0df17fad Leszek Koltunski
  synchronized long add(EffectNames eln, Data4D data, Data3D center)
329 6a06a912 Leszek Koltunski
    {
330 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
331 6a06a912 Leszek Koltunski
      {
332 bdb341bc Leszek Koltunski
      if( data instanceof Dynamic4D  )
333
        {
334
        mInter[0][mNumEffects] = (Dynamic4D)data;
335
        }
336
      else if( data instanceof DynamicQuat)
337
        {
338
        mInter[0][mNumEffects] = (DynamicQuat)data;
339
        }
340 568b29d8 Leszek Koltunski
      else if( data instanceof Static4D   )
341
        {
342 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = null;
343 0df17fad Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static4D)data).getX();
344
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static4D)data).getY();
345
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static4D)data).getZ();
346
        mUniforms[NUM_UNIFORMS*mNumEffects+3] = ((Static4D)data).getW();
347
        }
348
      else return -1;
349
350 bdb341bc Leszek Koltunski
      if( center instanceof Dynamic3D)
351
        {
352
        mInter[1][mNumEffects] = (Dynamic3D)center;
353
        }
354 0df17fad Leszek Koltunski
      else if( center instanceof Static3D )
355
        {
356
        mInter[1][mNumEffects] = null;
357
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
358
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
359
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
360 568b29d8 Leszek Koltunski
        }
361
      else return -1;
362
363 6a06a912 Leszek Koltunski
      return addBase(eln);
364
      }
365 568b29d8 Leszek Koltunski
366 6a06a912 Leszek Koltunski
    return -1;
367
    }
368
369
///////////////////////////////////////////////////////////////////////////////////////////////////
370 568b29d8 Leszek Koltunski
// shear
371
372 0df17fad Leszek Koltunski
  synchronized long add(EffectNames eln, Data3D shear, Data3D center)
373 6a06a912 Leszek Koltunski
    {
374 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
375 6a06a912 Leszek Koltunski
      {
376 bdb341bc Leszek Koltunski
      if( shear instanceof Dynamic3D)
377
        {
378
        mInter[0][mNumEffects] = (Dynamic3D)shear;
379
        }
380 0df17fad Leszek Koltunski
      else if( shear instanceof Static3D )
381 568b29d8 Leszek Koltunski
        {
382 0df17fad Leszek Koltunski
        mInter[0][mNumEffects] = null;
383
        mUniforms[NUM_UNIFORMS*mNumEffects  ] = ((Static3D)shear).getX();
384
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)shear).getY();
385
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)shear).getZ();
386 568b29d8 Leszek Koltunski
        }
387
      else return -1;
388
389 bdb341bc Leszek Koltunski
      if( center instanceof Dynamic3D)
390
        {
391
        mInter[1][mNumEffects] = (Dynamic3D)center;
392
        }
393 0df17fad Leszek Koltunski
      else if( center instanceof Static3D )
394 568b29d8 Leszek Koltunski
        {
395 0df17fad Leszek Koltunski
        mInter[1][mNumEffects] = null;
396
        mUniforms[NUM_UNIFORMS*mNumEffects+4] = ((Static3D)center).getX();
397
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = ((Static3D)center).getY();
398
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = ((Static3D)center).getZ();
399 568b29d8 Leszek Koltunski
        }
400
      else return -1;
401
402 6a06a912 Leszek Koltunski
      return addBase(eln);
403
      }
404
      
405
    return -1;
406
    }
407
  }