Project

General

Profile

« Previous | Next » 

Revision 28f4aba0

Added by Leszek Koltunski over 3 years ago

Face cubit creation: progress: cube & tetrahedron work; dino cubit does not.
Also, the texture is not yet moved inside the (0,1)x(0,1) square.

View differences:

src/main/java/org/distorted/examples/meshfile/FactoryCubit.java
313 313
    int len = vert3D.length;
314 314
    StickerInfo sInfo = new StickerInfo();
315 315
    sInfo.vertices = new float[2*len];
316
    mStickerInfo.add(sInfo);
317 316

  
318 317
    for( int vertex=0; vertex<len; vertex++ )
319 318
      {
......
321 320
      sInfo.vertices[2*vertex+1] = vert3D[vertex][1] / info.scale;
322 321
      }
323 322

  
323
    mStickerInfo.add(sInfo);
324

  
325
    info.sticker = mStickerInfo.size() -1;
324 326
    info.flip = false;
325 327
    }
326 328

  
......
382 384
      axisY =  mBuffer[0];
383 385
      axisZ = 0.0f;
384 386

  
385
      float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ;
387
      float axiLen = axisX*axisX + axisY*axisY;
386 388
      axiLen = (float)Math.sqrt(axiLen);
387 389
      axisX /= axiLen;
388 390
      axisY /= axiLen;
......
403 405
    mQuat1[1] = axisY*sinHalfTheta;
404 406
    mQuat1[2] = axisZ*sinHalfTheta;
405 407
    mQuat1[3] = cosHalfTheta;
406
    mQuat2[0] = axisX*sinHalfTheta;
407
    mQuat2[1] = axisY*sinHalfTheta;
408
    mQuat2[2] = axisZ*sinHalfTheta;
409
    mQuat2[3] = -cosHalfTheta;
408
    mQuat2[0] =-axisX*sinHalfTheta;
409
    mQuat2[1] =-axisY*sinHalfTheta;
410
    mQuat2[2] =-axisZ*sinHalfTheta;
411
    mQuat2[3] = cosHalfTheta;
410 412

  
411 413
    for (float[] vert : vert3D)
412 414
      {
413
      quatMultiply(mQuat1, vert, mQuat3);
414
      quatMultiply(mQuat3, mQuat2, vert);
415
      quatMultiply(mQuat1, vert  , mQuat3);
416
      quatMultiply(mQuat3, mQuat2, vert  );
415 417
      }
416 418

  
417 419
    // fit the whole thing in a square and remember the scale & 2D vertices
418 420
    fitInSquare(info, vert3D);
419 421

  
420 422
    // remember the rotation
421
    info.qx = mQuat1[0];
422
    info.qy = mQuat1[1];
423
    info.qz = mQuat1[2];
424
    info.qw =-mQuat1[3];
423
    info.qx =-mQuat1[0];
424
    info.qy =-mQuat1[1];
425
    info.qz =-mQuat1[2];
426
    info.qw = mQuat1[3];
425 427
    }
426 428

  
427 429
///////////////////////////////////////////////////////////////////////////////////////////////////
428 430

  
429 431
  private float computeCos(float x1, float y1, float x2, float y2, float len1, float len2)
430 432
    {
431
    return (x1*x2+y1*y2) / (len1*len2);
433
    float ret =  (x1*x2+y1*y2) / (len1*len2);
434

  
435
    if( ret> 1.0f ) return  1.0f;
436
    if( ret<-1.0f ) return -1.0f;
437

  
438
    return ret;
432 439
    }
433 440

  
434 441
///////////////////////////////////////////////////////////////////////////////////////////////////
......
436 443

  
437 444
  private float computeSin(float x1, float y1, float x2, float y2, float len1, float len2)
438 445
    {
439
    return (x2*y1-x1*y2) / (len1*len2);
446
    float ret = (x2*y1-x1*y2) / (len1*len2);
447

  
448
    if( ret> 1.0f ) return  1.0f;
449
    if( ret<-1.0f ) return -1.0f;
450

  
451
    return ret;
440 452
    }
441 453

  
442 454
///////////////////////////////////////////////////////////////////////////////////////////////////
......
481 493

  
482 494
///////////////////////////////////////////////////////////////////////////////////////////////////
483 495

  
484
  private void correctInfo(FaceInfo info, float scale, float sin, float cos, int oldSticker, boolean flip)
496
  private void correctInfo(FaceInfo info, float scale, float cos, int oldSticker, boolean flip)
485 497
    {
486 498
    mStickerInfo.remove(info.sticker);
487 499

  
488
    info.flip = flip;
500
    info.flip    = flip;
489 501
    info.sticker = oldSticker;
490
    info.scale *= scale;
502
    info.scale  *= scale;
503

  
504
    mQuat1[0] = info.qx;
505
    mQuat1[1] = info.qy;
506
    mQuat1[2] = info.qz;
507
    mQuat1[3] = info.qw;
491 508

  
492
    mQuat1[0] = 0.0f;
493
    mQuat1[1] = 0.0f;
494
    mQuat1[2] = sin;
495
    mQuat1[3] = cos;
509
    float sinHalf = (float)Math.sqrt(0.5f*(1-cos));
510
    float cosHalf = (float)Math.sqrt(0.5f*(1+cos));
496 511

  
497
    mQuat2[0] = info.qx;
498
    mQuat2[1] = info.qy;
499
    mQuat2[2] = info.qz;
500
    mQuat2[3] = info.qw;
512
    mQuat2[0] = 0.0f;
513
    mQuat2[1] = 0.0f;
514
    mQuat2[2] = sinHalf;
515
    mQuat2[3] = cosHalf;
501 516

  
502 517
    quatMultiply( mQuat1, mQuat2, mQuat3 );
503 518

  
......
514 529
    {
515 530
    for(int vertex=0; vertex<len; vertex++)
516 531
      {
517
      float xR = newVert[2*vertex  ];
518
      float yR = newVert[2*vertex+1];
532
      float xR = preVert[2*vertex  ];
533
      float yR = preVert[2*vertex+1];
519 534
      float lenRotV = (float)Math.sqrt(xR*xR+yR*yR);
520
      float cos = computeCos(xR,yR,preVert[0],preVert[1], lenRotV, lenVert);
521
      float sin = computeSin(xR,yR,preVert[0],preVert[1], lenRotV, lenVert);
535
      float cos = computeCos(xR,yR,newVert[0],newVert[1], lenRotV, lenVert);
536
      float sin = computeSin(xR,yR,newVert[0],newVert[1], lenRotV, lenVert);
522 537

  
523 538
      rotateAllVertices(buffer,len,newVert,sin,cos);
524 539

  
525 540
      if( isScaledVersionOf(buffer,preVert,len) )
526 541
        {
527 542
        float scale = preVert[0]!=0.0f ? buffer[0]/preVert[0] : buffer[1]/preVert[1];
528
        correctInfo(info,scale,sin,cos,oldSticker,inverted);
543
        correctInfo(info,scale,cos,oldSticker,inverted);
529 544
        return true;
530 545
        }
531 546
      }
......
660 675

  
661 676
///////////////////////////////////////////////////////////////////////////////////////////////////
662 677

  
663
  private void printStickerInfo()
678
  private void printInfo()
664 679
    {
665
    String ver="";
666 680
    int stickers = mStickerInfo.size();
667 681

  
682
    android.util.Log.d("D", "-------------------------");
683

  
668 684
    for(int s=0; s<stickers; s++)
669 685
      {
670
      ver = "";
686
      String ver = "";
671 687
      StickerInfo info = mStickerInfo.get(s);
672 688
      int len = info.vertices.length/2;
673 689

  
......
675 691
        {
676 692
        ver += ("("+info.vertices[2*i]+","+info.vertices[2*i+1]+") ");
677 693
        }
694

  
695
      android.util.Log.e("D", "sticker "+s+" "+ver);
678 696
      }
679 697

  
680
    android.util.Log.e("D", "vertices= "+ver);
681
    }
698
    android.util.Log.d("D", "-------------------------");
682 699

  
683
///////////////////////////////////////////////////////////////////////////////////////////////////
700
    int faces = mFaceInfo.size();
684 701

  
685
  private void printFaceInfo(FaceInfo info)
686
    {
687
    android.util.Log.e("D", "q=("+info.qx+", "+info.qy+", "+info.qz+", "+info.qw+") v=("
702
    for(int f=0; f<faces; f++)
703
      {
704
      FaceInfo info = mFaceInfo.get(f);
705

  
706
      android.util.Log.e("D", "q=("+info.qx+", "+info.qy+", "+info.qz+", "+info.qw+") v=("
688 707
                       +info.vx+", "+info.vy+", "+info.vz+") scale="+info.scale+" sticker="+info.sticker);
708
      }
709

  
710
    android.util.Log.d("D", "-------------------------");
689 711
    }
690 712

  
691 713
///////////////////////////////////////////////////////////////////////////////////////////////////
......
704 726
    FaceInfo fInfo;
705 727
    StickerInfo sInfo;
706 728

  
707
    //printStickerInfo();
729
    printInfo();
708 730

  
709 731
    for(int face=0; face<numFaces; face++)
710 732
      {
711 733
      fInfo = mFaceInfo.get(face);
712 734
      sInfo = mStickerInfo.get(fInfo.sticker);
713 735

  
714
      //printFaceInfo(fInfo);
715

  
716 736
      band = bands[bandIndexes[face]];
717 737
      bandsComputed = computeBands( band[0], (int)band[1], band[2], band[3], (int)band[4]);
718 738
      meshes[face] = new MeshPolygon(sInfo.vertices,bandsComputed,(int)band[5],(int)band[6]);
src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java
291 291

  
292 292
    private void createMesh()
293 293
      {
294
      final float[][] vertices = new float[][]
294
      int mode = 2;
295
      float[][] vertices  = null;
296
      int[][] vertIndexes = null;
297
      float[][] bands     = null;
298
      int[] bandIndexes   = null;
299
      float[][] corners   = null;
300
      int[] cornerIndexes = null;
301

  
302
      if( mode==0 ) // CUBE
303
        {
304
        vertices = new float[][]
295 305
          {
296 306
              { 0.5f, 0.5f, 0.5f },
297 307
              { 0.5f, 0.5f,-0.5f },
......
303 313
              {-0.5f,-0.5f,-0.5f },
304 314
          };
305 315

  
306
      final int[][] vertIndexes = new int[][]
316
        vertIndexes = new int[][]
307 317
          {
308 318
              {2,3,1,0},   // counterclockwise!
309 319
              {7,6,4,5},
......
313 323
              {3,7,5,1}
314 324
          };
315 325

  
316
      final float[][] bands = new float[][]
326
        bands = new float[][]
317 327
          {
318 328
              {0.05f,45,0.6f,0.5f,5,  2,2}
319 329
          };
320 330

  
321
      final int[] bandIndexes = new int[] { 0,0,0,0,0,0 };
331
        bandIndexes = new int[] { 0,0,0,0,0,0 };
322 332

  
323
      final float[][] corners = new float[][]
333
        corners = new float[][]
324 334
          {
325 335
              { 0.01f, 0.10f }
326 336
          };
327 337

  
328
      final int[] cornerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
338
        cornerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
339
        }
340
      else if( mode==1 ) // TETRAHEDRON
341
        {
342
        vertices = new float[][]
343
          {
344
              {-0.5f, SQ2/4, 0.0f},
345
              { 0.5f, SQ2/4, 0.0f},
346
              { 0.0f,-SQ2/4, 0.5f},
347
              { 0.0f,-SQ2/4,-0.5f}
348
          };
349

  
350
        vertIndexes = new int[][]
351
          {
352
              {2,1,0},   // counterclockwise!
353
              {2,3,1},
354
              {3,2,0},
355
              {3,0,1}
356
          };
357

  
358
        bands = new float[][]
359
          {
360
              {0.05f,30,0.6f,0.5f,5,  2,2}
361
          };
362

  
363
        bandIndexes = new int[] { 0,0,0,0 };
364

  
365
        corners = new float[][]
366
          {
367
              { 0.02f, 0.10f }
368
          };
369

  
370
        cornerIndexes = new int[] { 0,0,0,0 };
371
        }
372
      else if( mode==2 )  // DINO
373
        {
374
        vertices = new float[][]
375
          {
376
              {-0.5f, 0.0f, 0.0f},
377
              { 0.5f, 0.0f, 0.0f},
378
              { 0.0f,-0.5f, 0.0f},
379
              { 0.0f, 0.0f,-0.5f}
380
          };
381

  
382
        vertIndexes = new int[][]
383
          {
384
              {2,1,0},   // counterclockwise!
385
              {2,3,1},
386
              {3,2,0},
387
              {3,0,1}
388
          };
389

  
390
        bands = new float[][]
391
          {
392
              {0.028f,30,0.166f,0.8f,7,  2,5},
393
              {0.028f,30,0.166f,0.8f,7,  1,2}
394
          };
395

  
396
        bandIndexes = new int[] { 0,1,1,0 };
397

  
398
        corners = new float[][]
399
          {
400
              { 0.01f, 0.04f }
401
          };
402

  
403
        cornerIndexes = new int[] { 0,0,0,0 };
404
        }
329 405

  
330 406
      FactoryCubit factory = FactoryCubit.getInstance();
331 407
      mMesh = factory.createRoundedSolid(vertices, vertIndexes, bands, bandIndexes, corners, cornerIndexes);

Also available in: Unified diff