| 41 |
41 |
private static final double[] mQuat1 = new double[4];
|
| 42 |
42 |
private static final double[] mQuat2 = new double[4];
|
| 43 |
43 |
private static final double[] mQuat3 = new double[4];
|
|
44 |
private static final double[] mQuat4 = new double[4];
|
| 44 |
45 |
|
| 45 |
46 |
private static final Static1D RADIUS = new Static1D(1);
|
| 46 |
47 |
|
| ... | ... | |
| 49 |
50 |
private static class StickerInfo
|
| 50 |
51 |
{
|
| 51 |
52 |
double[] vertices;
|
| 52 |
|
double dx,dy;
|
| 53 |
53 |
}
|
| 54 |
54 |
|
| 55 |
55 |
private static class FaceInfo
|
| ... | ... | |
| 308 |
308 |
if (y < minY) minY = y;
|
| 309 |
309 |
}
|
| 310 |
310 |
|
| 311 |
|
info.scale = Math.max(maxX-minX,maxY-minY);
|
|
311 |
minX = minX<0 ? -minX:minX;
|
|
312 |
maxX = maxX<0 ? -maxX:maxX;
|
|
313 |
minY = minY<0 ? -minY:minY;
|
|
314 |
maxY = maxY<0 ? -maxY:maxY;
|
|
315 |
|
|
316 |
double max1 = Math.max(minX,minY);
|
|
317 |
double max2 = Math.max(maxX,maxY);
|
|
318 |
double max3 = Math.max(max1,max2);
|
|
319 |
|
|
320 |
info.scale = max3/0.5;
|
| 312 |
321 |
|
| 313 |
322 |
int len = vert3D.length;
|
| 314 |
323 |
StickerInfo sInfo = new StickerInfo();
|
| ... | ... | |
| 431 |
440 |
|
| 432 |
441 |
private double computeCos(double oldX, double oldY, double newX, double newY, double len1, double len2)
|
| 433 |
442 |
{
|
| 434 |
|
return (oldX*newX+oldY*newY) / (len1*len2);
|
|
443 |
double ret= (oldX*newX+oldY*newY) / (len1*len2);
|
|
444 |
if( ret<-1.0 ) return -1.0;
|
|
445 |
if( ret> 1.0 ) return 1.0;
|
|
446 |
|
|
447 |
return ret;
|
| 435 |
448 |
}
|
| 436 |
449 |
|
| 437 |
450 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 439 |
452 |
|
| 440 |
453 |
private double computeSin(double oldX, double oldY, double newX, double newY, double len1, double len2)
|
| 441 |
454 |
{
|
| 442 |
|
return (newX*oldY-oldX*newY) / (len1*len2);
|
|
455 |
double ret= (newX*oldY-oldX*newY) / (len1*len2);
|
|
456 |
if( ret<-1.0 ) return -1.0;
|
|
457 |
if( ret> 1.0 ) return 1.0;
|
|
458 |
|
|
459 |
return ret;
|
| 443 |
460 |
}
|
| 444 |
461 |
|
| 445 |
462 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 480 |
497 |
|
| 481 |
498 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 482 |
499 |
|
| 483 |
|
private boolean isScaledVersionOf(double[] newVert, double[] oldVert, int len)
|
|
500 |
private int computeRotatedIndex(int oldVertex, int len, int rotatedVertex, boolean inverted)
|
|
501 |
{
|
|
502 |
int v = (rotatedVertex + (inverted? -oldVertex : oldVertex));
|
|
503 |
if( v>=len ) v-=len;
|
|
504 |
if( v< 0 ) v+=len;
|
|
505 |
|
|
506 |
return v;
|
|
507 |
}
|
|
508 |
|
|
509 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
510 |
|
|
511 |
private boolean isScaledVersionOf(double[] newVert, double[] oldVert, int len, int vertex, boolean inverted)
|
| 484 |
512 |
{
|
| 485 |
513 |
double EPSILON = 0.001;
|
| 486 |
514 |
double scale = computeScale(newVert,oldVert);
|
| 487 |
515 |
|
| 488 |
516 |
for(int i=1; i<len; i++)
|
| 489 |
517 |
{
|
| 490 |
|
double horz = oldVert[2*i ] - scale*newVert[2*i ];
|
| 491 |
|
double vert = oldVert[2*i+1] - scale*newVert[2*i+1];
|
|
518 |
int index = computeRotatedIndex(i,len,vertex,inverted);
|
|
519 |
|
|
520 |
double horz = oldVert[2*i ] - scale*newVert[2*index ];
|
|
521 |
double vert = oldVert[2*i+1] - scale*newVert[2*index+1];
|
| 492 |
522 |
|
| 493 |
523 |
if( horz>EPSILON || horz<-EPSILON || vert>EPSILON || vert<-EPSILON ) return false;
|
| 494 |
524 |
}
|
| ... | ... | |
| 525 |
555 |
double sinHalf = computeSinHalf(cos);
|
| 526 |
556 |
double cosHalf = computeCosHalf(sin,cos);
|
| 527 |
557 |
|
| 528 |
|
mQuat2[0] = 0.0f;
|
| 529 |
|
mQuat2[1] = 0.0f;
|
| 530 |
|
mQuat2[2] = sinHalf;
|
| 531 |
|
mQuat2[3] = cosHalf;
|
|
558 |
if( flip )
|
|
559 |
{
|
|
560 |
mQuat3[0] = 0.0f;
|
|
561 |
mQuat3[1] = 0.0f;
|
|
562 |
mQuat3[2] = sinHalf;
|
|
563 |
mQuat3[3] = cosHalf;
|
|
564 |
|
|
565 |
mQuat4[0] = 1.0;
|
|
566 |
mQuat4[1] = 0.0;
|
|
567 |
mQuat4[2] = 0.0;
|
|
568 |
mQuat4[3] = 0.0;
|
|
569 |
|
|
570 |
quatMultiply( mQuat3, mQuat4, mQuat2 );
|
|
571 |
}
|
|
572 |
else
|
|
573 |
{
|
|
574 |
mQuat2[0] = 0.0f;
|
|
575 |
mQuat2[1] = 0.0f;
|
|
576 |
mQuat2[2] = sinHalf;
|
|
577 |
mQuat2[3] = cosHalf;
|
|
578 |
}
|
| 532 |
579 |
|
| 533 |
580 |
quatMultiply( mQuat1, mQuat2, mQuat3 );
|
| 534 |
581 |
|
| ... | ... | |
| 538 |
585 |
info.qw = mQuat3[3];
|
| 539 |
586 |
}
|
| 540 |
587 |
|
|
588 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
589 |
|
|
590 |
private void printVert(double[] buffer)
|
|
591 |
{
|
|
592 |
int len = buffer.length/2;
|
|
593 |
String str = "";
|
|
594 |
|
|
595 |
for(int i=0; i<len; i++)
|
|
596 |
{
|
|
597 |
str += (" ("+buffer[2*i]+" , "+buffer[2*i+1]+" ) ");
|
|
598 |
}
|
|
599 |
|
|
600 |
android.util.Log.d("D", str);
|
|
601 |
}
|
|
602 |
|
| 541 |
603 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 542 |
604 |
|
| 543 |
605 |
private boolean foundVertex(FaceInfo info, double[] buffer, int len, double[] newVert,
|
| ... | ... | |
| 553 |
615 |
|
| 554 |
616 |
rotateAllVertices(buffer,len,newVert,sin,cos);
|
| 555 |
617 |
|
| 556 |
|
if( isScaledVersionOf(buffer,oldVert,len) )
|
|
618 |
if( isScaledVersionOf(buffer,oldVert,len,vertex,inverted) )
|
| 557 |
619 |
{
|
| 558 |
620 |
double scale = computeScale(oldVert,newVert);
|
| 559 |
621 |
correctInfo(info,scale,sin,cos,oldSticker,inverted);
|
| ... | ... | |
| 607 |
669 |
return ret;
|
| 608 |
670 |
}
|
| 609 |
671 |
|
| 610 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 611 |
|
|
| 612 |
|
private void centerTextures()
|
| 613 |
|
{
|
| 614 |
|
int numStickers = mStickerInfo.size();
|
| 615 |
|
StickerInfo info;
|
| 616 |
|
|
| 617 |
|
for(int sticker=0; sticker<numStickers; sticker++)
|
| 618 |
|
{
|
| 619 |
|
double minX = Double.MAX_VALUE;
|
| 620 |
|
double minY = Double.MAX_VALUE;
|
| 621 |
|
double maxX =-Double.MAX_VALUE;
|
| 622 |
|
double maxY =-Double.MAX_VALUE;
|
| 623 |
|
|
| 624 |
|
info = mStickerInfo.get(sticker);
|
| 625 |
|
double[] vert = info.vertices;
|
| 626 |
|
int numVert = vert.length/2;
|
| 627 |
|
|
| 628 |
|
for ( int v=0; v<numVert; v++)
|
| 629 |
|
{
|
| 630 |
|
double x = vert[2*v ];
|
| 631 |
|
double y = vert[2*v+1];
|
| 632 |
|
|
| 633 |
|
if (x < minX) minX = x;
|
| 634 |
|
if (y < minY) minY = y;
|
| 635 |
|
if (x > maxX) maxX = x;
|
| 636 |
|
if (y > maxY) maxY = y;
|
| 637 |
|
}
|
| 638 |
|
|
| 639 |
|
info.dx = info.dy = 0.0;
|
| 640 |
|
|
| 641 |
|
if( minX<-0.5 ) info.dx = minX + 0.5;
|
| 642 |
|
if( minY<-0.5 ) info.dy = minY + 0.5;
|
| 643 |
|
if( maxX> 0.5 ) info.dx = maxX - 0.5;
|
| 644 |
|
if( maxY> 0.5 ) info.dy = maxY - 0.5;
|
| 645 |
|
|
| 646 |
|
for ( int v=0; v<numVert; v++)
|
| 647 |
|
{
|
| 648 |
|
vert[2*v ] -= info.dx;
|
| 649 |
|
vert[2*v+1] -= info.dy;
|
| 650 |
|
}
|
| 651 |
|
}
|
| 652 |
|
}
|
| 653 |
|
|
| 654 |
672 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 655 |
673 |
|
| 656 |
674 |
private void prepareFaceInfo( final double[][] vertices, final int[][] indexes)
|
| ... | ... | |
| 676 |
694 |
|
| 677 |
695 |
mFaceInfo.add(newInfo);
|
| 678 |
696 |
}
|
| 679 |
|
|
| 680 |
|
centerTextures();
|
| 681 |
697 |
}
|
| 682 |
698 |
|
| 683 |
699 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 815 |
831 |
{
|
| 816 |
832 |
int assoc = (1<<face);
|
| 817 |
833 |
fInfo = mFaceInfo.get(face);
|
| 818 |
|
sInfo = mStickerInfo.get(fInfo.sticker);
|
| 819 |
834 |
|
| 820 |
|
float dx = (float)sInfo.dx;
|
| 821 |
|
float dy = (float)sInfo.dy;
|
| 822 |
835 |
float vx = (float)fInfo.vx;
|
| 823 |
836 |
float vy = (float)fInfo.vy;
|
| 824 |
837 |
float vz = (float)fInfo.vz;
|
| ... | ... | |
| 828 |
841 |
float qz = (float)fInfo.qz;
|
| 829 |
842 |
float qw = (float)fInfo.qw;
|
| 830 |
843 |
|
| 831 |
|
Static3D move2D= new Static3D(dx,dy,0.0f);
|
| 832 |
|
Static3D move3D= new Static3D(vx,vy,vz);
|
| 833 |
844 |
Static3D scale = new Static3D(sc,sc, fInfo.flip ? -sc : sc);
|
|
845 |
Static3D move3D= new Static3D(vx,vy,vz);
|
| 834 |
846 |
Static4D quat = new Static4D(qx,qy,qz,qw);
|
| 835 |
847 |
|
| 836 |
|
mesh.apply(new MatrixEffectMove(move2D) ,assoc,-1);
|
| 837 |
848 |
mesh.apply(new MatrixEffectScale(scale) ,assoc,-1);
|
| 838 |
849 |
mesh.apply(new MatrixEffectQuaternion(quat,center),assoc,-1);
|
| 839 |
850 |
mesh.apply(new MatrixEffectMove(move3D) ,assoc,-1);
|
Cubit creation: properly cener the textures. Add Kilominx edge.