ganeswidgets/src/hgmediawallrenderer.cpp
branchGCC_SURGE
changeset 10 c348b9772569
parent 9 dde80bf4a8c7
child 11 42505cd701c6
child 13 8bf920201dea
equal deleted inserted replaced
4:463f1934e292 10:c348b9772569
    12 * Contributors:
    12 * Contributors:
    13 *
    13 *
    14 * Description:    
    14 * Description:    
    15 *
    15 *
    16 */
    16 */
    17 #include "HgMediaWallRenderer.h"
    17 #include "hgmediawallrenderer.h"
    18 #include "hgmediawalldataprovider.h"
    18 #include "hgmediawalldataprovider.h"
    19 #include "hgquadrenderer.h"
    19 #include "hgquadrenderer.h"
    20 #include "hgquad.h"
    20 #include "hgquad.h"
    21 #include "hgimage.h"
    21 #include "hgimage.h"
    22 #include "HgImageFader.h"
    22 #include "hgimagefader.h"
    23 #include "hgvgquadrenderer.h"
    23 #include "hgvgquadrenderer.h"
    24 #include "hgqtquadrenderer.h"
    24 #include "hgqtquadrenderer.h"
    25 #include <qvector3d>
    25 #include <QVector3D>
    26 #include <qtimer>
    26 #include <QTimer>
    27 #include <qpropertyanimation>
    27 #include <QPropertyAnimation>
    28 #include <qstate.h>
    28 #include <QState>
    29 #include <qabstracttransition>
    29 #include <QAbstractTransition>
    30 #include <qstatemachine>
    30 #include <QStateMachine>
    31 #include <qsignaltransition>
    31 #include <QSignalTransition>
    32 #include <qsequentialanimationgroup>
    32 #include <QSequentialAnimationGroup>
    33 #include <qparallelanimationgroup>
    33 #include <QParallelAnimationGroup>
    34 #include <qvariantanimation>
    34 #include <QVariantAnimation>
    35 #include <qpolygon>
    35 #include <QPolygon>
    36 #include <qpainter>
    36 #include <QPainter>
    37 #include <qpaintengine>
    37 #include <QPaintEngine>
    38 
    38 
    39 const qreal KPi = 3.1415926535897932384626433832795;
    39 const qreal KPi = 3.1415926535897932384626433832795;
    40 
    40 
    41 
    41 
    42 static qreal lerp(qreal start, qreal end, qreal t)
    42 static qreal lerp(qreal start, qreal end, qreal t)
   176         {
   176         {
   177             qreal stepY = spacing.height() + size.height();
   177             qreal stepY = spacing.height() + size.height();
   178             qreal posY = 0.5f - (rect.height() / rect.width() / 2.0 - stepY / 2.0);                
   178             qreal posY = 0.5f - (rect.height() / rect.width() / 2.0 - stepY / 2.0);                
   179             tm.translate(-posY,0);
   179             tm.translate(-posY,0);
   180             rm.rotate(-90, QVector3D(0,0,1));
   180             rm.rotate(-90, QVector3D(0,0,1));
   181             rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), -90);
   181             rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), 90);
   182         }
   182         }
   183         else if (mNextScrollDirection == Qt::Vertical)
   183         else if (mNextScrollDirection == Qt::Vertical)
   184         {
   184         {
   185             tm.translate(0,0.5f);
   185             tm.translate(0,0.5f);
   186             rm.rotate(90, QVector3D(0,0,1));
   186             rm.rotate(90, QVector3D(0,0,1));
   187             rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), -90);                
   187             rot = QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), -90);                
   188         }
   188         }
   189         
       
   190         
   189         
   191     }
   190     }
   192     
   191     
   193     HgAnimatedQuad* createQuad(HgQuad* qA, HgQuad* qB) const
   192     HgAnimatedQuad* createQuad(HgQuad* qA, HgQuad* qB) const
   194     {
   193     {
   245     mCameraRotationZ(0),
   244     mCameraRotationZ(0),
   246     mFrontCoverElevation(0.4),
   245     mFrontCoverElevation(0.4),
   247     mFrontItemPosition(0,0)
   246     mFrontItemPosition(0,0)
   248 {
   247 {
   249     createStateMachine();
   248     createStateMachine();
   250     mRenderer = new HgQtQuadRenderer(64);
   249     mRenderer = new HgQtQuadRenderer(128);
   251     mRenderer->enableReflections(true);
   250     mRenderer->enableReflections(true);
   252     mRendererInitialized = true;
   251     mRendererInitialized = true;
   253     if (mCoverflowMode) {
   252     if (mCoverflowMode) {
   254         mScrollDirection = Qt::Horizontal;
   253         mScrollDirection = Qt::Horizontal;
   255         mNextScrollDirection = mScrollDirection;
   254         mNextScrollDirection = mScrollDirection;
   441     if (mScrollDirection != scrollDirection)
   440     if (mScrollDirection != scrollDirection)
   442     {
   441     {
   443         mStateMachine->setAnimated(animate);
   442         mStateMachine->setAnimated(animate);
   444         mNextScrollDirection = scrollDirection;
   443         mNextScrollDirection = scrollDirection;
   445 
   444 
   446         if (!animate)
   445         if (!animate) {
   447             mScrollDirection = scrollDirection;
   446             mScrollDirection = scrollDirection;
       
   447         }
   448         else
   448         else
   449         {
   449         {
   450             //emit renderingNeeded();            
   450             //emit renderingNeeded();            
   451         }
   451         }
       
   452     } else if (!animate) {
       
   453         // reset next scrolldirection just to be sure. In some cases
       
   454         // when orientation changes couple of times and container visibility changes
       
   455         // we might otherwise end up in wrong state.
       
   456         mNextScrollDirection = scrollDirection;
   452     }
   457     }
   453 }
   458 }
   454 
   459 
   455 Qt::Orientation HgMediaWallRenderer::getScrollDirection() const
   460 Qt::Orientation HgMediaWallRenderer::getScrollDirection() const
   456 {
   461 {
   717     qreal springVelocity,
   722     qreal springVelocity,
   718     QPainter* painter, 
   723     QPainter* painter, 
   719     const QTransform& sceneTransform,
   724     const QTransform& sceneTransform,
   720     const QRectF& rect)
   725     const QRectF& rect)
   721 {
   726 {
       
   727     Q_UNUSED(sceneTransform)
       
   728     Q_UNUSED(rect)
   722 
   729 
   723     // save state for current orientation
   730     // save state for current orientation
   724     setupRows(startPosition, position, targetPosition, springVelocity, painter);
   731     setupRows(startPosition, position, targetPosition, springVelocity, painter);
   725     recordState(mOldState);
   732     recordState(mOldState);
   726     
   733     
   755     qreal springVelocity,
   762     qreal springVelocity,
   756     QPainter* painter, 
   763     QPainter* painter, 
   757     const QTransform& sceneTransform,
   764     const QTransform& sceneTransform,
   758     const QRectF& rect)
   765     const QRectF& rect)
   759 {
   766 {
       
   767     Q_UNUSED(sceneTransform)
       
   768     Q_UNUSED(rect)
       
   769 
   760     setupRows(startPosition, position, targetPosition, springVelocity, painter);
   770     setupRows(startPosition, position, targetPosition, springVelocity, painter);
   761     recordState(mOldState);
   771     recordState(mOldState);
   762     
   772     
   763     mRowCount = mNextRowCount;
   773     mRowCount = mNextRowCount;
   764     setImageSize(mNextImageSize);
   774     setImageSize(mNextImageSize);
   973 
   983 
   974 void HgMediaWallRenderer::setupDefaultQuad(const QVector3D& pos, int itemIndex, bool reflectionsEnabled, int& quadIndex)
   984 void HgMediaWallRenderer::setupDefaultQuad(const QVector3D& pos, int itemIndex, bool reflectionsEnabled, int& quadIndex)
   975 {
   985 {
   976     HgQuad* quad = mRenderer->quad(quadIndex++);
   986     HgQuad* quad = mRenderer->quad(quadIndex++);
   977     quad->setPosition(pos);
   987     quad->setPosition(pos);
   978     quad->setImage(mDataProvider->image(itemIndex));
   988     const HgImage* image = mDataProvider->image(itemIndex);
   979     quad->setVisible(true);
   989     quad->setImage(image);
       
   990     quad->setVisible(image && image->alpha() != 0);
   980     quad->setScale(QVector2D(mImageSize3D.width(),mImageSize3D.height()));
   991     quad->setScale(QVector2D(mImageSize3D.width(),mImageSize3D.height()));
   981     quad->setPivot(QVector2D(0,0));
   992     quad->setPivot(QVector2D(0,0));
   982     quad->setUserData(QVariant(itemIndex));
   993     quad->setUserData(QVariant(itemIndex));
   983     quad->setRotation(QQuaternion(1,0,0,0));
   994     quad->setRotation(QQuaternion(1,0,0,0));
   984     quad->setOuterRotation(QQuaternion(1,0,0,0));
   995     quad->setOuterRotation(QQuaternion(1,0,0,0));
   990     const HgImage* indicatorImage = mDataProvider->indicator(flags);
  1001     const HgImage* indicatorImage = mDataProvider->indicator(flags);
   991     if (flags != 0 && indicatorImage && quadIndex < mRenderer->quadCount())
  1002     if (flags != 0 && indicatorImage && quadIndex < mRenderer->quadCount())
   992     {
  1003     {
   993         HgQuad* indicator = mRenderer->quad(quadIndex++);
  1004         HgQuad* indicator = mRenderer->quad(quadIndex++);
   994         setupIndicator(quad, indicator, indicatorImage, 
  1005         setupIndicator(quad, indicator, indicatorImage, 
   995             itemIndex);
  1006             itemIndex+1000);
   996         indicator->enableMirrorImage(reflectionsEnabled);
  1007         indicator->enableMirrorImage(reflectionsEnabled);
   997     }
  1008     }
   998 
  1009 
   999 
  1010 
  1000 }
  1011 }