Revision 846b69f3
Added by Leszek Koltunski over 2 years ago
src/main/java/org/distorted/objectlib/helpers/FactoryCubit.java | ||
---|---|---|
50 | 50 |
private static final float[] mQuat1 = new float[4]; |
51 | 51 |
private static final float[] mQuat2 = new float[4]; |
52 | 52 |
private static final float[] mQuat3 = new float[4]; |
53 |
private static final float[] mQuat4 = new float[4]; |
|
54 | 53 |
|
55 | 54 |
public static class StickerCoords |
56 | 55 |
{ |
... | ... | |
68 | 67 |
float vx,vy,vz; |
69 | 68 |
float scale; |
70 | 69 |
float qx,qy,qz,qw; |
71 |
boolean flip; |
|
72 | 70 |
} |
73 | 71 |
|
74 | 72 |
private static final ArrayList<FaceTransform> mNewFaceTransf = new ArrayList<>(); |
... | ... | |
243 | 241 |
mStickerCoords.add(sInfo); |
244 | 242 |
|
245 | 243 |
info.sticker = mStickerCoords.size() -1; |
246 |
info.flip = false; |
|
247 | 244 |
} |
248 | 245 |
|
249 | 246 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
398 | 395 |
|
399 | 396 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
400 | 397 |
|
401 |
private int computeRotatedIndex(int oldVertex, int len, int rotatedVertex, boolean inverted)
|
|
398 |
private int computeRotatedIndex(int oldVertex, int len, int rotatedVertex) |
|
402 | 399 |
{ |
403 |
int v = (rotatedVertex + (inverted? -oldVertex : oldVertex));
|
|
400 |
int v = (rotatedVertex + oldVertex);
|
|
404 | 401 |
if( v>=len ) v-=len; |
405 | 402 |
if( v< 0 ) v+=len; |
406 | 403 |
|
... | ... | |
409 | 406 |
|
410 | 407 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
411 | 408 |
|
412 |
private boolean isScaledVersionOf(float[] newVert, float[] oldVert, int len, int vertex, boolean inverted)
|
|
409 |
private boolean isScaledVersionOf(float[] newVert, float[] oldVert, int len, int vertex) |
|
413 | 410 |
{ |
414 |
int newZeroIndex = computeRotatedIndex(0,len,vertex,inverted);
|
|
411 |
int newZeroIndex = computeRotatedIndex(0,len,vertex); |
|
415 | 412 |
float EPSILON = 0.001f; |
416 | 413 |
float scale = computeScale(newVert,oldVert,newZeroIndex,0); |
417 | 414 |
|
418 | 415 |
for(int i=1; i<len; i++) |
419 | 416 |
{ |
420 |
int index = computeRotatedIndex(i,len,vertex,inverted);
|
|
417 |
int index = computeRotatedIndex(i,len,vertex); |
|
421 | 418 |
|
422 | 419 |
float horz = oldVert[2*i ] - scale*newVert[2*index ]; |
423 | 420 |
float vert = oldVert[2*i+1] - scale*newVert[2*index+1]; |
... | ... | |
441 | 438 |
|
442 | 439 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
443 | 440 |
|
444 |
private void correctInfo(FaceTransform info, float scale, float sin, float cos, int oldSticker, boolean flip)
|
|
441 |
private void correctInfo(FaceTransform info, float scale, float sin, float cos, int oldSticker) |
|
445 | 442 |
{ |
446 | 443 |
mStickerCoords.remove(info.sticker); |
447 | 444 |
|
448 |
info.flip = flip; |
|
449 | 445 |
info.sticker = oldSticker; |
450 | 446 |
info.scale *= scale; |
451 | 447 |
|
... | ... | |
457 | 453 |
float sinHalf = computeSinHalf(cos); |
458 | 454 |
float cosHalf = computeCosHalf(sin,cos); |
459 | 455 |
|
460 |
if( flip ) |
|
461 |
{ |
|
462 |
mQuat3[0] = 1.0f; |
|
463 |
mQuat3[1] = 0.0f; |
|
464 |
mQuat3[2] = 0.0f; |
|
465 |
mQuat3[3] = 0.0f; |
|
466 |
|
|
467 |
mQuat4[0] = 0.0f; |
|
468 |
mQuat4[1] = 0.0f; |
|
469 |
mQuat4[2] = sinHalf; |
|
470 |
mQuat4[3] = cosHalf; |
|
471 |
|
|
472 |
QuatHelper.quatMultiply( mQuat2, mQuat3, mQuat4 ); |
|
473 |
} |
|
474 |
else |
|
475 |
{ |
|
476 |
mQuat2[0] = 0.0f; |
|
477 |
mQuat2[1] = 0.0f; |
|
478 |
mQuat2[2] = sinHalf; |
|
479 |
mQuat2[3] = cosHalf; |
|
480 |
} |
|
456 |
mQuat2[0] = 0.0f; |
|
457 |
mQuat2[1] = 0.0f; |
|
458 |
mQuat2[2] = sinHalf; |
|
459 |
mQuat2[3] = cosHalf; |
|
481 | 460 |
|
482 | 461 |
QuatHelper.quatMultiply( mQuat3, mQuat1, mQuat2 ); |
483 | 462 |
|
... | ... | |
505 | 484 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
506 | 485 |
|
507 | 486 |
private boolean foundVertex(FaceTransform info, float[] buffer, int len, float[] newVert, |
508 |
float[] oldVert, float lenFirstOld, int oldSticker, boolean inverted)
|
|
487 |
float[] oldVert, float lenFirstOld, int oldSticker) |
|
509 | 488 |
{ |
510 | 489 |
for(int vertex=0; vertex<len; vertex++) |
511 | 490 |
{ |
... | ... | |
517 | 496 |
|
518 | 497 |
rotateAllVertices(buffer,len,newVert,sin,cos); |
519 | 498 |
|
520 |
if( isScaledVersionOf(buffer,oldVert,len,vertex,inverted) )
|
|
499 |
if( isScaledVersionOf(buffer,oldVert,len,vertex) ) |
|
521 | 500 |
{ |
522 |
int newZeroIndex = computeRotatedIndex(0,len,vertex,inverted);
|
|
501 |
int newZeroIndex = computeRotatedIndex(0,len,vertex); |
|
523 | 502 |
float scale = computeScale(oldVert,newVert,0,newZeroIndex); |
524 |
correctInfo(info,scale,sin,cos,oldSticker,inverted);
|
|
503 |
correctInfo(info,scale,sin,cos,oldSticker); |
|
525 | 504 |
return true; |
526 | 505 |
} |
527 | 506 |
} |
... | ... | |
578 | 557 |
int oldSticker = oldInfo.sticker; |
579 | 558 |
float[] buffer1 = new float[oldLen]; |
580 | 559 |
float lenFirstOld = (float)Math.sqrt(oldVert[0]*oldVert[0] + oldVert[1]*oldVert[1]); |
581 |
if( foundVertex(newInfo, buffer1, oldLen/2, newVert, oldVert, lenFirstOld, oldSticker, false) ) |
|
582 |
{ |
|
583 |
if( sNewInfo.outer ) sOldInfo.outer = true; |
|
584 |
return true; |
|
585 |
} |
|
586 |
float[] buffer2 = new float[oldLen]; |
|
587 |
mirrorAllVertices(buffer2, newLen/2, newVert); |
|
588 |
if( foundVertex(newInfo, buffer1, oldLen/2, buffer2, oldVert, lenFirstOld, oldSticker, true ) ) |
|
560 |
if( foundVertex(newInfo, buffer1, oldLen/2, newVert, oldVert, lenFirstOld, oldSticker) ) |
|
589 | 561 |
{ |
590 | 562 |
if( sNewInfo.outer ) sOldInfo.outer = true; |
591 | 563 |
return true; |
... | ... | |
661 | 633 |
private void printTransform(FaceTransform f) |
662 | 634 |
{ |
663 | 635 |
android.util.Log.e("D", "face="+f.face+" q=("+f.qx+", "+f.qy+", "+f.qz+", "+f.qw+") v=(" |
664 |
+f.vx+", "+f.vy+", "+f.vz+") scale="+f.scale+" sticker="+f.sticker+" flip="+f.flip);
|
|
636 |
+f.vx+", "+f.vy+", "+f.vz+") scale="+f.scale+" sticker="+f.sticker); |
|
665 | 637 |
} |
666 | 638 |
|
667 | 639 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
1096 | 1068 |
float qz = fInfo.qz; |
1097 | 1069 |
float qw = fInfo.qw; |
1098 | 1070 |
|
1099 |
Static3D scale = new Static3D(sc,sc, fInfo.flip ? -sc : sc);
|
|
1071 |
Static3D scale = new Static3D(sc,sc,sc); |
|
1100 | 1072 |
Static3D move3D= new Static3D(vx,vy,vz); |
1101 | 1073 |
Static4D quat = new Static4D(qx,qy,qz,qw); |
1102 | 1074 |
|
Also available in: Unified diff
Preparation for drawing only the FRONT side of the cubit walls.