62 1.0f, 1.0f, 0.0f, |
62 1.0f, 1.0f, 0.0f, |
63 -1.0f, 1.0f, 0.0f |
63 -1.0f, 1.0f, 0.0f |
64 }; |
64 }; |
65 |
65 |
66 |
66 |
|
67 VGfloat EaseOutQuad(VGfloat start, VGfloat end, VGfloat t) |
|
68 { |
|
69 VGfloat s = t - 1.0f; |
|
70 VGfloat f = -(s*s*s*s) + 1.0f; |
|
71 return start * (1.0f - f) + end * f; |
|
72 } |
|
73 |
|
74 VGfloat EaseInQuad(VGfloat start, VGfloat end, VGfloat t) |
|
75 { |
|
76 VGfloat s = t; |
|
77 VGfloat f = (s*s*s*s); |
|
78 return start * (1.0f - f) + end * f; |
|
79 } |
|
80 |
|
81 |
|
82 VGfloat BoundValue(VGfloat value, VGfloat min, VGfloat max) |
|
83 { |
|
84 if (value > max) return max; |
|
85 if (value < min) return min; |
|
86 |
|
87 return value; |
|
88 } |
|
89 |
67 // ============================ MEMBER FUNCTIONS =============================== |
90 // ============================ MEMBER FUNCTIONS =============================== |
68 |
91 |
69 // ----------------------------------------------------------------------------- |
92 // ----------------------------------------------------------------------------- |
70 // CHgVgCoverflowRenderer::NewL() |
93 // CHgVgCoverflowRenderer::NewL() |
71 // ----------------------------------------------------------------------------- |
94 // ----------------------------------------------------------------------------- |
434 // CHgVgMediaWallRenderer::DrawQuad |
457 // CHgVgMediaWallRenderer::DrawQuad |
435 // ----------------------------------------------------------------------------- |
458 // ----------------------------------------------------------------------------- |
436 // |
459 // |
437 void CHgVgMediaWallRenderer::DrawQuad(CHgVgMediaWallRenderer::TQuad* q, TBool aDrawMirrored) |
460 void CHgVgMediaWallRenderer::DrawQuad(CHgVgMediaWallRenderer::TQuad* q, TBool aDrawMirrored) |
438 { |
461 { |
439 vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE); |
462 vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE); |
440 vgLoadIdentity(); |
463 vgLoadIdentity(); |
441 |
464 |
442 //vgTranslate(iOffset.iX, iOffset.iY); |
465 if (iLandscape) |
443 |
466 { |
|
467 vgTranslate(0.0f, 640.0f); |
|
468 vgRotate(-90.0f); |
|
469 } |
|
470 |
|
471 vgTranslate(iOffset.iX, iOffset.iY); |
|
472 |
|
473 |
444 VGImage image = q->iImage; |
474 VGImage image = q->iImage; |
445 if (q->iNoImage) |
475 if (q->iNoImage) |
446 { |
476 { |
447 image = iDefaultImage; |
477 image = iDefaultImage; |
448 } |
478 } |
476 TReal aViewPosition, |
506 TReal aViewPosition, |
477 TReal aAnimationAlpha, |
507 TReal aAnimationAlpha, |
478 CHgVgMediaWall::THgVgAnimationState aState, |
508 CHgVgMediaWall::THgVgAnimationState aState, |
479 CHgVgMediaWall::THgVgOpeningAnimationType aSelectionAnimationType, |
509 CHgVgMediaWall::THgVgOpeningAnimationType aSelectionAnimationType, |
480 CHgVgMediaWall::THgVgMediaWallStyle /*aStyle*/, |
510 CHgVgMediaWall::THgVgMediaWallStyle /*aStyle*/, |
481 TReal aStartIndex) |
511 TReal aStartIndex, |
|
512 TReal aSpringVelocity) |
482 { |
513 { |
483 |
514 |
484 TInt itemsOnScreen = 0; |
515 TInt itemsOnScreen = 0; |
485 itemsOnScreen = SetupQuads(aItems, |
516 itemsOnScreen = SetupQuads(aItems, |
486 aSelectedIndex, aNextIndex, |
517 aSelectedIndex, aNextIndex, |
487 aViewPosition, |
518 aViewPosition, |
488 aAnimationAlpha, |
519 aAnimationAlpha, |
489 aState, aSelectionAnimationType, aStartIndex); |
520 aState, aSelectionAnimationType, aStartIndex, aSpringVelocity); |
|
521 |
|
522 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); |
|
523 vgLoadIdentity(); |
|
524 vgRotate(-90.0f); |
|
525 vgTranslate(0.0f, -640.0f); |
|
526 |
|
527 vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE); |
|
528 vgLoadIdentity(); |
|
529 vgRotate(-90.0f); |
|
530 vgTranslate(0.0f, -640.0f); |
|
531 |
490 |
532 |
491 TransformAndDraw(itemsOnScreen, aSelectionAnimationType); |
533 TransformAndDraw(itemsOnScreen, aSelectionAnimationType); |
492 } |
534 } |
493 |
535 |
494 |
536 |
584 // |
626 // |
585 void CHgVgMediaWallRenderer::DrawGround(TInt aWidth, TInt aHeight) |
627 void CHgVgMediaWallRenderer::DrawGround(TInt aWidth, TInt aHeight) |
586 { |
628 { |
587 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); |
629 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); |
588 vgLoadIdentity(); |
630 vgLoadIdentity(); |
|
631 if (iLandscape) |
|
632 { |
|
633 vgTranslate(0.0f, 640.0f); |
|
634 vgRotate(-90.0f); |
|
635 } |
|
636 |
589 //vgTranslate(iOffset.iX, iOffset.iY); |
637 //vgTranslate(iOffset.iX, iOffset.iY); |
590 vgScale(aWidth, aHeight); |
638 vgScale(aWidth, aHeight); |
591 vgSetPaint(iGroundPaint, VG_FILL_PATH); |
639 vgSetPaint(iGroundPaint, VG_FILL_PATH); |
592 vgDrawPath(iGroundPath, VG_FILL_PATH); |
640 vgDrawPath(iGroundPath, VG_FILL_PATH); |
593 } |
641 } |
751 // --------------------------------------------------------------------------- |
799 // --------------------------------------------------------------------------- |
752 // CHgVgMediaWallRenderer::SetupQuads() |
800 // CHgVgMediaWallRenderer::SetupQuads() |
753 // --------------------------------------------------------------------------- |
801 // --------------------------------------------------------------------------- |
754 // |
802 // |
755 TInt CHgVgMediaWallRenderer::SetupQuads(RPointerArray<CHgVgItem>& aItems, |
803 TInt CHgVgMediaWallRenderer::SetupQuads(RPointerArray<CHgVgItem>& aItems, |
756 TInt aSelectedIndex, TReal aNextIndex, |
804 TInt aSelectedIndex, TReal /*aNextIndex*/, |
757 VGfloat aViewPosition, |
805 VGfloat aViewPosition, |
758 VGfloat aAnimationAlpha, |
806 VGfloat aAnimationAlpha, |
759 CHgVgMediaWall::THgVgAnimationState aState, |
807 CHgVgMediaWall::THgVgAnimationState aState, |
760 CHgVgMediaWall::THgVgOpeningAnimationType aOpeningAnimationType, |
808 CHgVgMediaWall::THgVgOpeningAnimationType aOpeningAnimationType, |
761 TReal aStartIndex) |
809 TReal /*aStartIndex*/, |
|
810 TReal aSpringVelocity) |
762 { |
811 { |
763 |
812 |
764 |
813 |
765 if (aItems.Count() <= 0) |
814 if (aItems.Count() <= 0) |
766 return 0; |
815 return 0; |
794 |
843 |
795 TInt i = 0; |
844 TInt i = 0; |
796 TInt itemsOnScreen = 0; |
845 TInt itemsOnScreen = 0; |
797 TInt currentRow = (TInt)aViewPosition - KSelectedItemIndex; |
846 TInt currentRow = (TInt)aViewPosition - KSelectedItemIndex; |
798 |
847 |
|
848 TReal zAlpha = Abs(aSpringVelocity / KSpringVelocityToZAlpha); |
|
849 VGfloat zNear = HgVgHelper::Lerp(iZFar, iZNear, 1.0f - BoundValue(zAlpha, 0, 1)); |
|
850 |
799 while (itemsOnScreen < iQuads.Count()) |
851 while (itemsOnScreen < iQuads.Count()) |
800 { |
852 { |
801 TInt itemIndex = currentRow + i; |
853 TInt itemIndex = currentRow + i; |
802 |
854 |
803 // not really an item |
855 // not really an item |
825 VGfloat fi = (VGfloat)i - fDiff; |
877 VGfloat fi = (VGfloat)i - fDiff; |
826 |
878 |
827 q->iX = leftX - step * (leftIndex - fi); |
879 q->iX = leftX - step * (leftIndex - fi); |
828 |
880 |
829 |
881 |
830 if (aStartIndex != aNextIndex) |
882 /*if (aStartIndex != aNextIndex) |
831 { |
883 { |
832 // if start and next index are not same, we can just interpolate |
884 // if start and next index are not same, we can just interpolate |
833 // items at these indices. |
885 // items at these indices. |
834 if (itemIndex == (TInt)aStartIndex || |
886 if (itemIndex == (TInt)aStartIndex || |
835 itemIndex == (TInt)aNextIndex) |
887 itemIndex == (TInt)aNextIndex) |
836 { |
888 { |
837 q->iZ = HgVgHelper::Lerp((VGfloat)iZNear, (VGfloat)iZFar, Abs(q->iX / leftX)); |
889 q->iZ = EaseInQuad((VGfloat)zNear, (VGfloat)iZFar, BoundValue(Abs(q->iX / leftX), 0, 1)); |
838 q->iZ = Min(q->iZ, (VGfloat)iZFar); |
890 q->iZ = Min(q->iZ, (VGfloat)iZFar); |
839 } |
891 } |
840 } |
892 } |
841 else |
893 else*/ |
842 { |
894 { |
843 // in this case we are just dragging and startindex and left index are |
895 // in this case we are just dragging and startindex and left index are |
844 // same so we need to interpolate z for all items coming/leaving center |
896 // same so we need to interpolate z for all items coming/leaving center |
845 // of the screen. |
897 // of the screen. |
846 q->iZ = HgVgHelper::Lerp((VGfloat)iZNear, (VGfloat)iZFar, Abs(q->iX / leftX)); |
898 |
|
899 q->iZ = EaseInQuad((VGfloat)zNear, (VGfloat)iZFar, BoundValue(Abs(q->iX / leftX), 0, 1)); |
847 q->iZ = Min(q->iZ, (VGfloat)iZFar); |
900 q->iZ = Min(q->iZ, (VGfloat)iZFar); |
848 } |
901 } |
849 |
902 |
850 // calculate alpha so that items further are more transparent. |
903 // calculate alpha so that items further are more transparent. |
851 q->iAlpha = HgVgHelper::Lerp(1, 0, Max(0.0, (Abs(q->iX)-2.0) / (TReal)(iQuads.Count()/2-2))); |
904 q->iAlpha = HgVgHelper::Lerp(1, 0, Max(0.0, (Abs(q->iX)-2.0) / (TReal)(iQuads.Count()/2-2))); |