Revision 15aa7d94
Added by Leszek Koltunski almost 7 years ago
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
Progress with support for Effect classes.