ganeswidgets/src/hgtransformedquad.cpp
changeset 2 49c70dcc3f17
child 5 4fa04caf0f43
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ganeswidgets/src/hgtransformedquad.cpp	Fri May 14 16:57:01 2010 +0300
@@ -0,0 +1,149 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    
+*
+*/
+
+#include "hgtransformedquad.h"
+#include "hgquad.h"
+#include "trace.h"
+#include <qvector2d>
+#include <qpolygon>
+#include <qmatrix4x4>
+#include <qpainter>
+
+    HgTransformedQuad::HgTransformedQuad(qreal yDir) : mYDir(yDir)
+    {
+        
+    }
+
+    HgTransformedQuad::~HgTransformedQuad()
+    {
+        
+    }
+
+    int HgTransformedQuad::index() const
+        {
+        return mIndex;
+        }
+
+    bool HgTransformedQuad::isPointInside(const QPointF& point) const
+    {    
+        QPolygonF poly;
+        getTransformedPoints(poly);
+        QRectF rect = poly.boundingRect();
+        if (rect.contains(point))
+        {
+            return true;
+        }
+        return false;
+    }
+
+    void HgTransformedQuad::transformQuad(int index, const QMatrix4x4& projView, HgQuad* quad, 
+        qreal mirroringPlaneY, const QVector2D& translate, const QPointF& center, 
+        const QSizeF& windowSize)
+    {
+        mIndex = index;
+        mQuad = quad;
+            
+        QMatrix4x4 tm;
+        tm.setToIdentity();
+        tm.rotate(quad->outerRotation());
+
+        if (mQuad->mirrorImageEnabled())
+        {
+            computeMirroredPoints(tm, projView, mirroringPlaneY, translate, center, windowSize);
+        }
+        
+        tm.translate(quad->position());    
+        tm.rotate(quad->rotation());    
+        tm.scale(quad->scale().x(), quad->scale().y());
+
+        tm = projView * tm;         
+        
+        perspectiveTransformPoints(mTransformedPoints, tm, center, windowSize);
+        
+        for (int i = 0; i < 4; i++)
+            mTransformedPoints[i] += translate;
+        
+    }
+    
+    void HgTransformedQuad::getTransformedPoints(QPolygonF& poly) const
+    {
+        poly.clear();
+        poly.append(mTransformedPoints[0].toPointF());
+        poly.append(mTransformedPoints[1].toPointF());
+        poly.append(mTransformedPoints[2].toPointF());
+        poly.append(mTransformedPoints[3].toPointF());    
+    }
+
+    bool HgTransformedQuad::quadSorter(HgTransformedQuad* a, HgTransformedQuad* b)
+    {
+        return a->mQuad->position().z() < b->mQuad->position().z();
+    }
+
+    HgQuad* HgTransformedQuad::quad() const
+    {
+        return mQuad;
+    }
+    
+    void HgTransformedQuad::computeMirroredPoints(const QMatrix4x4& trans, const QMatrix4x4& projView, 
+        qreal mirroringPlaneY, const QVector2D& translate, const QPointF& center, 
+        const QSizeF& windowSize)
+    {
+        HgQuad* quad = mQuad;
+
+        QMatrix4x4 mirror = trans;
+
+        qreal distToPlane = qAbs(quad->position().y() - mirroringPlaneY);
+        
+        mirror.translate(quad->position().x(), mirroringPlaneY - distToPlane/1, quad->position().z());
+        mirror.scale(quad->scale().x(), -quad->scale().y()/1);
+        mirror.rotate(quad->rotation());
+            
+        QMatrix4x4 modelViewProjMatrix = projView * mirror;
+        
+        perspectiveTransformPoints(mMirroredPoints, modelViewProjMatrix, center, windowSize);    
+        
+        for (int i = 0; i < 4; i++)
+            mMirroredPoints[i] += translate;
+
+    }
+
+    void HgTransformedQuad::perspectiveTransformPoints(QVector2D* outPoints, const QMatrix4x4& matrix, 
+        const QPointF& center, const QSizeF& windowSize)
+    {
+        const QVector4D points[] = 
+        {
+            QVector4D(-0.5f, -0.5f, 0.0f, 1.0f),
+            QVector4D( 0.5f, -0.5f, 0.0f, 1.0f),
+            QVector4D( 0.5f,  0.5f, 0.0f, 1.0f),
+            QVector4D(-0.5f,  0.5f, 0.0f, 1.0f)
+        };
+
+        qreal hw = windowSize.width() * 0.5f;
+        qreal hh = windowSize.height() * 0.5f;
+        
+        for (int i = 0; i < 4; i++)
+        {
+            QVector4D temp = matrix * points[i];
+                                
+            outPoints[i] = QVector2D(
+                center.x() + temp.x() / temp.w() * hw, 
+                center.y() + (temp.y() / temp.w() * hh) * mYDir);
+
+        }
+        
+    }
+