Project

General

Profile

« Previous | Next » 

Revision 9dacabea

Added by Leszek Koltunski about 5 years ago

library: Fix DynamicQuat
cube app: progress with ScrambleEffects

View differences:

src/main/java/org/distorted/library/effectqueue/EffectQueue.java
333 333
    return mNumEffects;
334 334
    }
335 335

  
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337

  
338
  public Effect getEffect(int position)
339
    {
340
    if( position>=0 && position< mNumEffects )
341
      {
342
      return mEffects[position];
343
      }
344
    else
345
      {
346
      android.util.Log.e("queue", "getEffect: out of range "+position);
347
      return null;
348
      }
349
    }
350

  
336 351
///////////////////////////////////////////////////////////////////////////////////////////////////
337 352

  
338 353
  public void doWork()
src/main/java/org/distorted/library/type/Dynamic.java
301 301
    if( error ) printBase("");
302 302
    }
303 303

  
304
///////////////////////////////////////////////////////////////////////////////////////////////////
305

  
306
  int getNext(int curr, float time)
307
    {
308
    switch(mMode)
309
      {
310
      case MODE_LOOP: return curr==numPoints-1 ? 0:curr+1;
311
      case MODE_PATH: return time<0.5f ? (curr+1) : (curr==0 ? 1 : curr-1);
312
      case MODE_JUMP: return curr==numPoints-1 ? 1:curr+1;
313
      default       : return 0;
314
      }
315
    }
316

  
304 317
///////////////////////////////////////////////////////////////////////////////////////////////////
305 318

  
306 319
  private void checkAngle(int index)
src/main/java/org/distorted/library/type/Dynamic1D.java
440 440
                if( cacheDirty ) recomputeCache();  // recompute cache if we have added or remove vectors since last computation
441 441
                else if( mSegment!= segment )       // ...or if we have just passed a vector and the vector we are currently flying to has changed
442 442
                  {
443
                  int vecNext;
444

  
445
                  switch(mMode)
446
                    {
447
                    case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
448
                                    break;
449
                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
450
                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
451
                                    break;
452
                    case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
453
                                    break;
454
                    default       : vecNext = 0;
455
                    }
456
              
443
                  int vecNext = getNext(vecCurr,t);
457 444
                  next = vv.elementAt(vecNext);
458 445
                  tmp2 = vc.elementAt(vecNext);
459 446
              
src/main/java/org/distorted/library/type/Dynamic2D.java
473 473
                if( cacheDirty ) recomputeCache();  // recompute cache if we have added or remove vectors since last computation
474 474
                else if( mSegment!= segment )       // ...or if we have just passed a vector and the vector we are currently flying to has changed
475 475
                  {
476
                  int vecNext;
477

  
478
                  switch(mMode)
479
                    {
480
                    case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
481
                                    break;
482
                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
483
                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
484
                                    break;
485
                    case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
486
                                    break;
487
                    default       : vecNext = 0;
488
                    }
489

  
476
                  int vecNext = getNext(vecCurr,t);
490 477
                  next = vv.elementAt(vecNext);
491 478
                  tmp2 = vc.elementAt(vecNext);
492 479

  
src/main/java/org/distorted/library/type/Dynamic3D.java
497 497
                if( cacheDirty ) recomputeCache();  // recompute cache if we have added or remove vectors since last computation
498 498
                else if( mSegment!= segment )       // ...or if we have just passed a vector and the vector we are currently flying to has changed
499 499
                  {
500
                  int vecNext;
501

  
502
                  switch(mMode)
503
                    {
504
                    case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
505
                                    break;
506
                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
507
                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
508
                                    break;
509
                    case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
510
                                    break;
511
                    default       : vecNext = 0;
512
                    }
513

  
500
                  int vecNext = getNext(vecCurr,t);
514 501
                  next = vv.elementAt(vecNext);
515 502
                  tmp2 = vc.elementAt(vecNext);
516 503

  
src/main/java/org/distorted/library/type/Dynamic4D.java
520 520
                if( cacheDirty ) recomputeCache();  // recompute cache if we have added or remove vectors since last computation
521 521
                else if( mSegment!= segment )       // ...or if we have just passed a vector and the vector we are currently flying to has changed
522 522
                  {
523
                  int vecNext;
524

  
525
                  switch(mMode)
526
                    {
527
                    case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
528
                                    break;
529
                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
530
                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
531
                                    break;
532
                    case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
533
                                    break;
534
                    default       : vecNext = 0;
535
                    }
536

  
523
                  int vecNext = getNext(vecCurr,t);
537 524
                  next = vv.elementAt(vecNext);
538 525
                  tmp2 = vc.elementAt(vecNext);
539 526

  
......
566 553
                  buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2];
567 554
                  buffer[offset+3]= ((tmp1.a[3]*time+tmp1.b[3])*time+tmp1.c[3])*time+tmp1.d[3];
568 555
                  }
569
 
556

  
570 557
                break;
571 558
                }
572 559
      }
src/main/java/org/distorted/library/type/Dynamic5D.java
543 543
                if( cacheDirty ) recomputeCache();  // recompute cache if we have added or remove vectors since last computation
544 544
                else if( mSegment!= segment )       // ...or if we have just passed a vector and the vector we are currently flying to has changed
545 545
                  {
546
                  int vecNext;
547

  
548
                  switch(mMode)
549
                    {
550
                    case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1;
551
                                    break;
552
                    case MODE_PATH: if( t<=0.5f ) vecNext = vecCurr==numPoints-1 ? numPoints-2: vecCurr+1;
553
                                    else          vecNext = vecCurr==0 ? 1 : vecCurr-1;
554
                                    break;
555
                    case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
556
                                    break;
557
                    default       : vecNext = 0;
558
                    }
559

  
546
                  int vecNext= getNext(vecCurr,t);
560 547
                  next = vv.elementAt(vecNext);
561 548
                  tmp2 = vc.elementAt(vecNext);
562 549

  
src/main/java/org/distorted/library/type/DynamicQuat.java
63 63
    }
64 64

  
65 65
///////////////////////////////////////////////////////////////////////////////////////////////////
66
  
66

  
67 67
  private void recomputeCache()
68 68
    {  
69 69
    if( numPoints>=2 )
70 70
      {
71 71
      int i, n;  
72
     
72
      Static4D cu,ne;
73
      VectorCacheQuat vq;
74

  
73 75
      for(i=0; i<numPoints; i++)
74 76
        {
75 77
        n = i<numPoints-1 ? i+1:0;  
76 78
      
77
        tmp1= vc.elementAt(i);
78
        tmp2= vc.elementAt(n);
79
        curr= vv.elementAt(i);
80
        next= vv.elementAt(n);
79
        vq= vc.elementAt(i);
80
        cu= vv.elementAt(i);
81
        ne= vv.elementAt(n);
81 82
      
82
        tmp1.vx = curr.x;
83
        tmp1.vy = curr.y;
84
        tmp1.vz = curr.z;
85
        tmp1.vw = curr.w;
83
        vq.vx = cu.x;
84
        vq.vy = cu.y;
85
        vq.vz = cu.z;
86
        vq.vw = cu.w;
86 87
    	
87
        tmp1.cosOmega = curr.x*next.x + curr.y*next.y + curr.z*next.z + curr.w*next.w;
88
        vq.cosOmega = cu.x*ne.x + cu.y*ne.y + cu.z*ne.z + cu.w*ne.w;
88 89
      	
89
        if( tmp1.cosOmega<0 && n!=0 )  // do not invert the last quaternion even if we'd have to go the long way around!
90
        if( vq.cosOmega<0 && n!=0 )  // do not invert the last quaternion even if we'd have to go the long way around!
90 91
          {
91
          tmp1.cosOmega = -tmp1.cosOmega;
92
          next.x = -next.x;
93
          next.y = -next.y;
94
          next.z = -next.z;
95
          next.w = -next.w;
92
          vq.cosOmega = -vq.cosOmega;
93
          ne.x = -ne.x;
94
          ne.y = -ne.y;
95
          ne.z = -ne.z;
96
          ne.w = -ne.w;
96 97
          }
97 98
      	
98
        tmp1.sinOmega = (float)Math.sqrt(1-tmp1.cosOmega*tmp1.cosOmega);
99
        tmp1.omega = arcCos(tmp1.cosOmega);
99
        vq.sinOmega = (float)Math.sqrt(1-vq.cosOmega*vq.cosOmega);
100
        vq.omega = arcCos(vq.cosOmega);
100 101
        }
101 102
      }
102 103
   
......
341 342
              buffer[offset+3] = curr.w;
342 343
              break;
343 344
      default:float t = time;
345
              int vecCurr, segment;
344 346
              float scale0, scale1;
345
  
346
              if( mMode==MODE_JUMP ) time = time*(numPoints-1);
347
              else if( mMode==MODE_PATH || numPoints==2 ) time = (time<=0.5f) ? 2*time*(numPoints-1) : 2*(1-time)*(numPoints-1);
348
              else time = time*numPoints;
349
              
350
              int vecNext, vecCurr = (int)time;
351
              time = time-vecCurr;
352
      
347

  
348
              switch(mMode)
349
                {
350
                case MODE_LOOP: time = time*numPoints;
351
                                segment = (int)time;
352
                                vecCurr = segment;
353
                                break;
354
                case MODE_PATH: if( t>0.5f ) t = 1.0f-t;
355
                                time = 2*t*(numPoints-1);
356
                                segment = (int)(2*t*(numPoints-1));
357
                                vecCurr = segment;
358
                                break;
359
                case MODE_JUMP: time = time*(numPoints-1);
360
                                segment = (int)time;
361
                                vecCurr = segment;
362
                                break;
363
                default       : vecCurr = 0;
364
                                segment = 0;
365
                }
366

  
353 367
              if( vecCurr>=0 && vecCurr<numPoints )
354 368
                {
355
                if( cacheDirty ) recomputeCache();    // recompute cache if we have added or remove vectors since last computation
356
                   
357
                switch(mMode)
358
                  {
359
                  case MODE_LOOP: vecNext = vecCurr==numPoints-1 ? 0:vecCurr+1; 
360
                                  break;
361
                  case MODE_PATH: if( t<0.5f ) vecNext = vecCurr+1;  
362
                                  else         vecNext = vecCurr==0 ? 1 : vecCurr-1;  
363
                                  break;
364
                  case MODE_JUMP: vecNext = vecCurr==numPoints-1 ? 1:vecCurr+1;
365
                                  break;
366
                  default       : vecNext = 0;                
367
                  }
368
     
369
                int vecNext = getNext(vecCurr,t);
370

  
369 371
                curr = vv.elementAt(vecCurr);
370
                next = vv.elementAt(vecNext);
371 372
                tmp1 = vc.elementAt(vecCurr);
372
                tmp2 = vc.elementAt(vecNext);
373
              
374
                if( tmp2.vx!=next.x || tmp2.vy!=next.y || tmp2.vz!=next.z || tmp2.vw!=next.w ) recomputeCache();
375
               
373
                next = vv.elementAt(vecNext);
374

  
375
                if( cacheDirty ) recomputeCache();  // recompute cache if we have added or remove vectors since last computation
376
                else if( mSegment!= segment )       // ...or if we have just passed a vector and the vector we are currently flying to has changed
377
                  {
378
                  tmp2 = vc.elementAt(vecNext);
379

  
380
                  if( tmp2.vx!=next.x || tmp2.vy!=next.y || tmp2.vz!=next.z || tmp2.vw!=next.w ) recomputeCache();
381
                  }
382

  
383
                mSegment = segment;
384

  
385
                time = time-vecCurr;
386

  
376 387
                if( tmp1.sinOmega==0 )
377 388
                  {
378
                  scale0 = 0f;
379
                  scale1 = 1f;
389
                  scale0 = 1f;
390
                  scale1 = 0f;
380 391
                  }
381
                else if( tmp1.cosOmega < 0.99 ) 
392
                else if( tmp1.cosOmega < 0.99 )
382 393
                  {
383 394
                  scale0 = (float)Math.sin( (1f-time)*tmp1.omega ) / tmp1.sinOmega;
384 395
                  scale1 = (float)Math.sin(     time *tmp1.omega ) / tmp1.sinOmega;
385 396
                  }
386
                else 
397
                else
387 398
                  {
388 399
                  scale0 = 1f-time;
389 400
                  scale1 = time;
390 401
                  }
391 402

  
392 403
                buffer[offset  ] = scale0*curr.x + scale1*next.x;
393
                buffer[offset+1] = scale0*curr.y + scale1*next.y; 
394
                buffer[offset+2] = scale0*curr.z + scale1*next.z; 
395
                buffer[offset+3] = scale0*curr.w + scale1*next.w; 
396
                
404
                buffer[offset+1] = scale0*curr.y + scale1*next.y;
405
                buffer[offset+2] = scale0*curr.z + scale1*next.z;
406
                buffer[offset+3] = scale0*curr.w + scale1*next.w;
407

  
397 408
                break;
398 409
                }
399 410
      }

Also available in: Unified diff