/******************************************************************************** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).** All rights reserved.** Contact: Nokia Corporation (qt-info@nokia.com)**** This file is part of the examples of the Qt Toolkit.**** $QT_BEGIN_LICENSE:LGPL$** No Commercial Usage** This file contains pre-release code and may not be distributed.** You may use this file in accordance with the terms and conditions** contained in the Technology Preview License Agreement accompanying** this package.**** GNU Lesser General Public License Usage** Alternatively, this file may be used under the terms of the GNU Lesser** General Public License version 2.1 as published by the Free Software** Foundation and appearing in the file LICENSE.LGPL included in the** packaging of this file. Please review the following information to** ensure the GNU Lesser General Public License version 2.1 requirements** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.**** In addition, as a special exception, Nokia gives you certain additional** rights. These rights are described in the Nokia Qt LGPL Exception** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.**** If you have questions regarding the use of this file, please contact** Nokia at qt-info@nokia.com.****************** $QT_END_LICENSE$******************************************************************************/#include <QtGui>#include <QtOpenGL>#include <math.h>#include "glwidget.h"#include "qtlogo.h"#ifndef GL_MULTISAMPLE#define GL_MULTISAMPLE 0x809D#endif//! [0]GLWidget::GLWidget(QWidget *parent) : QGLWidget(QGLFormat(QGL::SampleBuffers), parent){ logo = 0; xRot = 0; yRot = 0; zRot = 0; qtGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0); qtPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0);}//! [0]//! [1]GLWidget::~GLWidget(){}//! [1]//! [2]QSize GLWidget::minimumSizeHint() const{ return QSize(50, 50);}//! [2]//! [3]QSize GLWidget::sizeHint() const//! [3] //! [4]{ return QSize(400, 400);}//! [4]static void qNormalizeAngle(int &angle){ while (angle < 0) angle += 360 * 16; while (angle > 360 * 16) angle -= 360 * 16;}//! [5]void GLWidget::setXRotation(int angle){ qNormalizeAngle(angle); if (angle != xRot) { xRot = angle; emit xRotationChanged(angle); updateGL(); }}//! [5]void GLWidget::setYRotation(int angle){ qNormalizeAngle(angle); if (angle != yRot) { yRot = angle; emit yRotationChanged(angle); updateGL(); }}void GLWidget::setZRotation(int angle){ qNormalizeAngle(angle); if (angle != zRot) { zRot = angle; emit zRotationChanged(angle); updateGL(); }}//! [6]void GLWidget::initializeGL(){ qglClearColor(qtPurple.dark()); logo = new QtLogo(this, 64); logo->setColor(qtGreen.dark()); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_MULTISAMPLE); static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 }; glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);}//! [6]//! [7]void GLWidget::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0, 0.0, -10.0); glRotatef(xRot / 16.0, 1.0, 0.0, 0.0); glRotatef(yRot / 16.0, 0.0, 1.0, 0.0); glRotatef(zRot / 16.0, 0.0, 0.0, 1.0); logo->draw();}//! [7]//! [8]void GLWidget::resizeGL(int width, int height){ int side = qMin(width, height); glViewport((width - side) / 2, (height - side) / 2, side, side); glMatrixMode(GL_PROJECTION); glLoadIdentity();#ifdef QT_OPENGL_ES_1 glOrthof(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0);#else glOrtho(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0);#endif glMatrixMode(GL_MODELVIEW);}//! [8]//! [9]void GLWidget::mousePressEvent(QMouseEvent *event){ lastPos = event->pos();}//! [9]//! [10]void GLWidget::mouseMoveEvent(QMouseEvent *event){ int dx = event->x() - lastPos.x(); int dy = event->y() - lastPos.y(); if (event->buttons() & Qt::LeftButton) { setXRotation(xRot + 8 * dy); setYRotation(yRot + 8 * dx); } else if (event->buttons() & Qt::RightButton) { setXRotation(xRot + 8 * dy); setZRotation(zRot + 8 * dx); } lastPos = event->pos();}//! [10]